USE [master]਀䜀伀 
/****** Object:  Database [Elyse_DB]    Script Date: Tue 12-05-2026 5:43:18 PM ******/਀䌀刀䔀䄀吀䔀 䐀䄀吀䄀䈀䄀匀䔀 嬀䔀氀礀猀攀开䐀䈀崀 
 CONTAINMENT = NONE਀ 伀一  倀刀䤀䴀䄀刀夀  
( NAME = N'Elyse_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.SQLEXPRESS\MSSQL\DATA\Elyse_DB.mdf' , SIZE = 103168KB , 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀愀甀琀栀漀爀椀猀椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀戀愀猀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [base]਀䜀伀 
/****** Object:  Schema [com_obj]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀挀漀洀开漀戀樀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀挀漀渀昀椀最甀爀椀渀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [configuring]਀䜀伀 
/****** Object:  Schema [controlling]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀挀漀渀琀爀漀氀氀椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀搀漀挀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [doc_attr]਀䜀伀 
/****** Object:  Schema [editing]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀攀搀椀琀椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀昀椀氀攀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [file_attr]਀䜀伀 
/****** Object:  Schema [forms]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀昀漀爀洀猀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀椀渀琀攀爀渀愀氀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [internal]਀䜀伀 
/****** Object:  Schema [messaging]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀洀攀猀猀愀最椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀瀀攀漀瀀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [people]਀䜀伀 
/****** Object:  Schema [reading]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀爀攀愀搀椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀爀攀瘀椀攀眀椀渀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [reviewing]਀䜀伀 
/****** Object:  Schema [tagging]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀琀愀最最椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀甀猀攀爀开爀攀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [user_restr]਀䜀伀 
/****** Object:  Schema [workflow_instances]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [workflow_models]਀䜀伀 
/****** Object:  Schema [xref]    Script Date: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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,਀ऀ嬀渀攀瘀攀爀开搀攀氀攀琀攀开昀椀氀攀猀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_global_setting_group] PRIMARY KEY CLUSTERED ਀⠀ 
	[setting_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_function_list_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_function_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_free_text_values](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_free_text_name_id] [bigint] NOT NULL,਀ऀ嬀琀攀砀琀开瘀愀氀甀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_free_text_field] 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 [doc_attr].[doc_multi_select_attributes](਀ऀ嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_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_radio_button_attributes](਀ऀ嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[file_radiob_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 [forms].[form_doc_people_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_date_field_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀⠀ 
	[doc_date_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_date_name] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_date_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_function_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_function_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_radio_button_attributes](਀ऀ嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_radiob_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 [forms].[form_doc_com_obj_ms_lst_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_list_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_function_list_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_function_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_status_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 [forms].[form_doc_multi_sel_list_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[doc_ms_list_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_ms_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[doc_to_user_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀搀崀 䄀匀䌀Ⰰ 
	[sid_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_people_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_id_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_booking_id_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_multi_select_attributes]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀⠀ 
	[file_ms_attr_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_sm_attribute] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_ms_attr_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_multi_select_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_ms_attr_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开猀洀开愀猀猀椀最渀洀攀渀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[file_ms_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].[form_doc_date_field_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[doc_date_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开搀愀琀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_date_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[units_of_measure]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀⠀ 
	[unit_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀甀渀椀琀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](250) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_Unit_ID] PRIMARY KEY CLUSTERED ਀⠀ 
	[unit_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[file_to_user_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[sid_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_integer_field_names](਀ऀ嬀搀漀挀开椀渀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀甀渀椀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_int_name] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_int_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_free_text_field_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_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 [file_attr].[file_multi_select_list_names](਀ऀ嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_select_many_list] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_ms_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_integer_field_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀搀漀挀开椀渀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_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_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 [doc_attr].[doc_real_number_field_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀⠀ 
	[doc_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_doc_radio_button_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[doc_radiob_list_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ऀ嬀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_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 [file_attr].[file_radio_button_list_names](਀ऀ嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
	[restricted] [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 [forms].[form_file_com_obj_rb_lst_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_list_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ऀ嬀搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_com_obj_rb_lst_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 [file_attr].[file_integer_field_names](਀ऀ嬀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀甀渀椀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_int_name] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_int_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_user_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_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 [people].[function_list_names](਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[description] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_function_list_names] PRIMARY KEY CLUSTERED ਀⠀ 
	[function_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_real_number_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_real] 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_com_obj_rb_lst_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_list_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ऀ嬀搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_com_obj_rb_lst_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 [file_attr].[file_real_number_field_names](਀ऀ嬀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀甀渀椀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_real_name] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_real_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_date_field_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_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 [forms].[form_doc_booking_user_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 date: 25-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀琀爀椀攀瘀攀猀 琀栀攀 搀攀ⴀ渀漀爀洀愀氀椀猀攀搀 搀愀琀愀 昀漀爀 愀 搀漀挀甀洀攀渀琀 愀渀搀 氀椀渀欀攀搀 昀椀氀攀 漀爀 昀椀氀攀猀Ⰰ 漀爀 昀椀氀攀Ⰰ 昀漀爀 愀 最椀瘀攀渀 昀漀爀洀⸀  
-- 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.  ਀ⴀⴀ 吀栀椀猀 昀甀渀挀琀椀漀渀 搀椀昀昀攀爀猀 昀爀漀洀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀崀 椀渀 琀栀愀琀 椀琀 椀渀挀氀甀搀攀猀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 昀椀攀氀搀猀⸀   
-- It is used for generating a form rather than a two-dimensional table.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and contained code, including this function are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE FUNCTION [internal].[ufn_SEL_data_for_edit_form_ITVF] ਀⠀ 
    @documentid nvarchar(50),਀    䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
    @formid bigint਀⤀ 
RETURNS TABLE਀䄀匀 
RETURN਀⠀ 
    WITH DocData AS (਀        ⴀⴀ 䐀漀挀甀洀攀渀琀 爀攀氀愀琀攀搀 焀甀攀爀椀攀猀 
        SELECT @documentid				AS doc_id, ਀ऀऀऀ   一唀䰀䰀ऀऀऀऀऀ    䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Free Text'	    AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.doc_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 doc_attr.doc_free_text_field_names AS fieldname ਀ऀऀ       伀一        昀漀爀洀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
			      = fieldname.doc_free_text_name_id਀        䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		       ON fieldname.doc_free_text_name_id ਀ऀऀऀ      㴀     瘀愀氀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
				  AND val.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        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਀       圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䐀愀琀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.doc_date_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瘀愀氀⸀搀愀琀攀开瘀愀氀甀攀Ⰰ  
                    (SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER')਀               ⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_date_field_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON form.doc_date_name_id = fieldname.doc_date_name_id਀        䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		       ON fieldname.doc_date_name_id = val.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 = fieldname.doc_radiob_list_id਀        䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		  ON fieldname.doc_radiob_list_id = links.doc_radiob_list_id AND links.doc_id = @documentid਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀  
		  ON links.doc_radiob_attr_id = attr.doc_radiob_attr_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.doc_ms_list_id AS field_name_id, ਀ऀऀऀ   氀椀渀欀猀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   attr.doc_ms_attr_id AS attr_id, ਀ऀऀऀ   愀琀琀爀⸀愀琀琀爀开渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_multi_sel_list_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON        form.doc_ms_list_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
        INNER JOIN doc_attr.doc_multi_select_links AS links ਀ऀऀऀ   伀一   昀椀攀氀搀渀愀洀攀⸀搀漀挀开洀猀开氀椀猀琀开椀搀  
			       =    links.doc_ms_list_id ਀ऀऀऀ  䄀一䐀  氀椀渀欀猀⸀搀漀挀开椀搀  
			      = @documentid਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀  
		       ON  links.doc_ms_attr_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.mandatory, form.length,਀ऀऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
		 FROM forms.form_doc_com_obj_ms_lst_links AS form਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
			    ON        form.common_object_list_id਀ऀऀऀऀ   㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		 INNER JOIN com_obj.doc_to_com_obj_ms_list_links AS links਀ऀऀऀ    伀一 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
				   =   links.common_object_list_id਀ऀऀऀ   䄀一䐀  氀椀渀欀猀⸀搀漀挀开椀搀  
			       = @documentid਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 氀椀猀琀 
			    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, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Doc 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.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_com_obj_rb_lst_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON        form.common_object_list_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
        INNER JOIN com_obj.doc_to_com_obj_radiob_links AS links ਀ऀऀ       伀一 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			      =   links.common_object_list_id਀ऀऀऀ   䄀一䐀  氀椀渀欀猀⸀搀漀挀开椀搀  
			       = @documentid਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 氀椀猀琀  
		       ON form.common_object_list_id ਀ऀऀऀ      㴀    氀椀猀琀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
        LEFT JOIN com_obj.common_objects AS attr ਀ऀऀ       伀一   氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			      = attr.common_object_id਀            圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀  
			      =   @formid ਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   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 ਀ऀऀ  伀一 昀漀爀洀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 
        INNER JOIN doc_attr.doc_integer_values AS val ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 瘀愀氀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 䄀一䐀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        LEFT JOIN base.units_of_measure AS uom ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀 㴀 甀漀洀⸀甀渀椀琀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document 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.doc_id =  @documentid਀ऀऀऀ  䄀一䐀     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = links.general_field_name_id਀        䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON       links.function_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀昀甀渀挀琀椀漀渀开椀搀 
਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䐀甀琀礀 䘀甀渀挀琀椀漀渀 䰀椀猀琀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               gfn.general_field_name_id AS field_name_id,  ਀ऀऀऀ   氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   gfn.name AS field_name,਀               最昀渀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ   
			   fieldname.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 ਀ऀऀ       伀一 氀椀渀欀猀⸀搀漀挀开椀搀 㴀  䀀搀漀挀甀洀攀渀琀椀搀 
			  AND     gfn.general_field_name_id਀ऀऀऀ      㴀 氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        LEFT JOIN people.function_list_names AS fieldname ਀ऀऀ       伀一       氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
			      = fieldname.function_list_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 倀攀漀瀀氀攀 䰀椀猀琀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               gfn.general_field_name_id AS field_name_id,  ਀ऀऀऀ   氀椀渀欀猀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   gfn.name AS field_name,਀               最昀渀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   fieldname.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 ਀ऀऀ       伀一 氀椀渀欀猀⸀搀漀挀开椀搀 㴀  䀀搀漀挀甀洀攀渀琀椀搀 
			  AND     gfn.general_field_name_id਀ऀऀऀ      㴀 氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        LEFT JOIN people.people_list_names AS fieldname ਀ऀऀ       伀一       氀椀渀欀猀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
			      = fieldname.people_list_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL 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_doc_user_links AS form   ਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀  
		       ON  form.general_field_name_id਀ऀऀऀ      㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        INNER JOIN people.doc_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,਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   '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 ਀ऀऀ  伀一 昀漀爀洀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
        INNER JOIN doc_attr.doc_real_number_values AS val ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 瘀愀氀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 䄀一䐀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        LEFT JOIN base.units_of_measure AS uom ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀 㴀 甀漀洀⸀甀渀椀琀开椀搀 
        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਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER 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਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 伀一 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Created' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DC' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
               CONVERT(NVARCHAR(30), dil.created, 120) 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਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        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਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.document_id_list AS dil ON dil.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Created By User ID' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DCBSIDID' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), dil.created_by_sid_id) 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਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Comments' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䌀漀洀洀攀渀琀猀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBC' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   bl.comments AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀渀琀猀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Date' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䐀愀琀攀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBD' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
               CONVERT(NVARCHAR(30), bl.booking_date, ਀                    ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀ 
               ) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀崀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking ID' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䤀䐀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBUID' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), bl.booking_id) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Release Number' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 刀攀氀攀愀猀攀 一甀洀戀攀爀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBRN' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   bl.release_number AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Status' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 匀琀愀琀甀猀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBS' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   bl.booking_status AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking User ID' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBUID' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), bl.user_id) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Username' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBUN' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   bl.system_username AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
਀ 
਀    ⤀Ⰰ 
	--================================================਀    䘀椀氀攀䐀愀琀愀 䄀匀 ⠀ 
        -- 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 = fieldname.file_free_text_name_id਀        䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		  ON fieldname.file_free_text_name_id = val.file_free_text_name_id AND val.file_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, ਀ऀऀऀ   ✀䘀椀氀攀 䐀愀琀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.file_date_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瘀愀氀⸀搀愀琀攀开瘀愀氀甀攀Ⰰ  
                    (SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER')਀               ⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_date_field_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		  ON form.file_date_name_id = fieldname.file_date_name_id਀        䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		  ON fieldname.file_date_name_id = val.file_date_name_id AND val.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.file_radiob_list_id AS field_name_id, ਀ऀऀऀ   氀椀渀欀猀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   attr.file_radiob_attr_id AS attr_id, ਀ऀऀऀ   愀琀琀爀⸀愀琀琀爀开渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN file_attr.file_radio_button_list_names AS fieldname ਀ऀऀ  伀一 昀漀爀洀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
        INNER JOIN file_attr.file_radio_button_links AS links ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 氀椀渀欀猀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀一䐀 氀椀渀欀猀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        LEFT JOIN file_attr.file_radio_button_attributes AS attr ਀ऀऀ  伀一 氀椀渀欀猀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Multi-Select Attributes' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   links.file_ms_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_multi_sel_list_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON        form.file_ms_list_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
        INNER JOIN file_attr.file_multi_select_links AS links ਀ऀऀ       伀一  昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀  
			      =    links.file_ms_list_id ਀ऀऀऀ  䄀一䐀 氀椀渀欀猀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        LEFT JOIN file_attr.file_multi_select_attributes AS attr ਀ऀऀ       伀一  氀椀渀欀猀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀  
			      = attr.file_ms_attr_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ 
					@fileid 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.mandatory, form.length,਀ऀऀऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
			 FROM forms.form_file_com_obj_ms_lst_links AS form਀ऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
				    ON        form.common_object_list_id ਀ऀऀऀऀऀ   㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			 INNER JOIN com_obj.file_to_com_obj_ms_list_links AS links਀ऀऀऀऀ    伀一 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
					   =   links.common_object_list_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਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid 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.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_com_obj_rb_lst_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		        ON        form.common_object_list_id ਀ऀऀऀऀ   㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
         INNER JOIN com_obj.file_to_com_obj_radiob_links AS links ਀ऀऀ        伀一 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
				   =   links.common_object_list_id਀ऀऀऀ   䄀一䐀 氀椀渀欀猀⸀昀椀氀攀开椀搀 
			       = @fileid਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 氀椀猀琀  
		        ON   form.common_object_list_id ਀ऀऀऀऀ   㴀 氀椀猀琀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
        LEFT JOIN com_obj.common_objects AS attr ਀ऀऀ        伀一  氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
				   = attr.common_object_id਀             圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀  
			       = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䤀渀琀攀最攀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.file_int_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_integer_field_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		  ON form.file_int_name_id = fieldname.file_int_name_id਀        䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		  ON fieldname.file_int_name_id = val.file_int_name_id AND val.file_id = @fileid਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
		  ON fieldname.unit_id = uom.unit_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid 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_file_function_links AS form਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀  
		       ON  form.general_field_name_id਀ऀऀऀ      㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        INNER JOIN people.file_to_function_links AS links ਀ऀऀ       伀一 氀椀渀欀猀⸀昀椀氀攀开椀搀 㴀  䀀昀椀氀攀椀搀 
			  AND     gfn.general_field_name_id਀ऀऀऀ      㴀 氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        LEFT JOIN people.duty_functions AS fieldname ਀ऀऀ       伀一       氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开椀搀  
			      = fieldname.function_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䐀甀琀礀 䘀甀渀挀琀椀漀渀 䰀椀猀琀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               gfn.general_field_name_id AS field_name_id, ਀ऀऀऀ   氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   gfn.name AS field_name,਀               最昀渀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			   fieldname.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 ਀ऀऀ       伀一 氀椀渀欀猀⸀昀椀氀攀开椀搀 㴀  䀀昀椀氀攀椀搀 
			  AND     gfn.general_field_name_id਀ऀऀऀ      㴀 氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        LEFT JOIN people.function_list_names AS fieldname ਀ऀऀ       伀一       氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
			      = fieldname.function_list_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 倀攀漀瀀氀攀 䰀椀猀琀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               gfn.general_field_name_id AS field_name_id,਀ऀऀऀ   氀椀渀欀猀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   gfn.name AS field_name,਀               最昀渀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			   fieldname.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 ਀ऀऀ       伀一 氀椀渀欀猀⸀昀椀氀攀开椀搀 㴀  䀀昀椀氀攀椀搀 
			  AND     gfn.general_field_name_id਀ऀऀऀ      㴀 氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        LEFT JOIN people.people_list_names AS fieldname ਀ऀऀ       伀一       氀椀渀欀猀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
			      = fieldname.people_list_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @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 Real Number' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.file_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 file_attr.file_real_number_field_names AS fieldname ਀ऀऀ  伀一 昀漀爀洀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
        INNER JOIN file_attr.file_real_number_values AS val ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 瘀愀氀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        LEFT JOIN base.units_of_measure AS uom ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀 㴀 甀漀洀⸀甀渀椀琀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Filename' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'Filename' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fm.filename AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.file_metadata AS fm ਀ऀऀ       伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Content Hash' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀 䌀漀渀琀攀渀琀 䠀愀猀栀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'FCH' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   sys.fn_varbintohexstr(fm.content_hash) 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, ਀ऀऀऀ   ✀䘀椀氀攀 吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fm.transaction_group_id AS field_name_id, ਀ऀऀऀ   昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Transaction Group' AS field_name,਀               ✀䘀吀䜀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   fm.transaction_group_id AS attr_id, ਀ऀऀऀ   ⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀⤀ ⬀ ✀ ⴀ ✀ ⬀ 䰀䔀䘀吀⠀琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀Ⰰ ㈀㔀⤀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_transactn_grp_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		LEFT JOIN base.transaction_groups AS tg਀ऀऀ       伀一  昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
			      = tg.transaction_group_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 匀椀稀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Size' AS field_name,਀               ✀匀椀稀攀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 昀洀⸀昀椀氀攀开猀椀稀攀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               'B' AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_size_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        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਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.file_metadata AS fm ON fm.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Created By' AS field_name,਀               ✀䘀䌀䈀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀ       昀洀⸀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_created_by_nm_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        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਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.file_metadata AS fm ON fm.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀    ⤀ 
    SELECT * FROM DocData਀    唀一䤀伀一 䄀䰀䰀 
    SELECT * FROM FileData਀ 
਀⤀ 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀䐀攀昀椀渀攀搀䘀甀渀挀琀椀漀渀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-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_document_details] and [internal].[ufn_SEL_one_dc_data_by_frm_ITVF]਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and contained code, including this function are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE FUNCTION [internal].[ufn_SEL_one_dc_data_by_frm_ITVF] ਀⠀ 
    @documentid nvarchar(50),਀    䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
    @formid bigint਀⤀ 
RETURNS TABLE਀䄀匀 
RETURN਀⠀ 
    WITH DocData AS (਀        ⴀⴀ 䐀漀挀甀洀攀渀琀 爀攀氀愀琀攀搀 焀甀攀爀椀攀猀 
        SELECT @documentid				AS doc_id, ਀ऀऀऀ   一唀䰀䰀ऀऀऀऀऀ    䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Free Text'	    AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.doc_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 doc_attr.doc_free_text_field_names AS fieldname ਀ऀऀ       伀一        昀漀爀洀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
			      = fieldname.doc_free_text_name_id਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		       ON fieldname.doc_free_text_name_id ਀ऀऀऀ      㴀     瘀愀氀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
				  AND val.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
        ਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀ䄀匀 搀漀挀开椀搀Ⰰ  
			   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਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL 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_doc_user_links AS form   ਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀  
		       ON  form.general_field_name_id਀ऀऀऀ      㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        INNER JOIN people.doc_to_user_links AS links ਀ऀऀ       伀一 氀椀渀欀猀⸀搀漀挀开椀搀 㴀  䀀搀漀挀甀洀攀渀琀椀搀 
			  AND     gfn.general_field_name_id਀ऀऀऀ      㴀 氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        LEFT JOIN user_restr.sid_list AS fieldname ਀ऀऀ       伀一       氀椀渀欀猀⸀猀椀搀开椀搀  
			      = fieldname.sid_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䐀愀琀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.doc_date_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瘀愀氀⸀搀愀琀攀开瘀愀氀甀攀Ⰰ  
                    (SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER')਀               ⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_date_field_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON        form.doc_date_name_id ਀                  㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
        LEFT JOIN doc_attr.doc_date_values AS val ਀ऀऀ       伀一  昀椀攀氀搀渀愀洀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
                  =      val.doc_date_name_id ਀              䄀一䐀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        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 ਀          伀一        昀漀爀洀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
             = fieldname.doc_radiob_list_id਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
          ON fieldname.doc_radiob_list_id ਀             㴀 氀椀渀欀猀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
         AND links.doc_id = @documentid਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀  
          ON  links.doc_radiob_attr_id  ਀             㴀 愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
        WHERE form.form_id = @formid਀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Doc 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.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_com_obj_rb_lst_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON        form.common_object_list_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
        LEFT JOIN com_obj.common_object_lists AS list ਀ऀऀ       伀一 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			      =    list.common_object_list_id਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 愀琀琀爀  
		       ON   list.common_object_id ਀ऀऀऀ      㴀 愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
        LEFT JOIN com_obj.doc_to_com_obj_radiob_links AS links ਀ऀऀ       伀一 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			      =   links.common_object_list_id਀            圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀  
			      =   @formid ਀ऀऀ      䄀一䐀 氀椀渀欀猀⸀搀漀挀开椀搀  
			      =    @documentid਀ 
        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 ਀             㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 
        LEFT JOIN doc_attr.doc_integer_values AS val ਀          伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀  
             =     val.doc_int_name_id ਀         䄀一䐀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        LEFT JOIN base.units_of_measure AS uom ਀          伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀  
             =     uom.unit_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ 
			   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 ਀             㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
        LEFT JOIN doc_attr.doc_real_number_values AS val ਀          伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
             =     val.doc_real_name_id ਀         䄀一䐀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        LEFT JOIN base.units_of_measure AS uom ਀          伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀  
             =     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਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN base.document_id_list AS dil ਀               伀一 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Created' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DC' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
               CONVERT(NVARCHAR(30), dil.created, 120) 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' AS field_name,਀               ✀䐀䌀䈀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               搀椀氀⸀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_created_by_nm_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀  
               ON dil.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Created By User ID' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DCBUID' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), dil.created_by_sid_id) 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਀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Comments' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䌀漀洀洀攀渀琀猀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBC' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   bl.comments AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀渀琀猀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Date' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䐀愀琀攀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBD' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
               CONVERT(NVARCHAR(30), bl.booking_date, ਀                    ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀ 
               ) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀崀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking ID' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䤀䐀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBUID' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), bl.booking_id) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Release Number' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 刀攀氀攀愀猀攀 一甀洀戀攀爀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBRN' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   bl.release_number AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Status' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 匀琀愀琀甀猀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBS' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   bl.booking_status AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking User ID' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBUID' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), bl.user_id) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Booking Username' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DBUN' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   bl.system_username AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.booking_log AS bl ON bl.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		  AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
਀ 
਀ 
਀    ⤀Ⰰ 
਀    ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
    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 ਀               伀一        昀漀爀洀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
                  = fieldname.file_free_text_name_id਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
               ON fieldname.file_free_text_name_id ਀                  㴀     瘀愀氀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
              AND val.file_id ਀                  㴀  䀀昀椀氀攀椀搀 
        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 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_date_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瘀愀氀⸀搀愀琀攀开瘀愀氀甀攀Ⰰ  
                    (SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER')਀               ⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        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 ਀              䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀  
                  =  @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.file_radiob_list_id AS field_name_id, ਀ऀऀऀ   氀椀渀欀猀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   attr.file_radiob_attr_id AS attr_id, ਀ऀऀऀ   愀琀琀爀⸀愀琀琀爀开渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        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਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid 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.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_com_obj_rb_lst_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		        ON        form.common_object_list_id ਀ऀऀऀऀ   㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
        LEFT 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 AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䤀渀琀攀最攀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.file_int_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_integer_field_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
               ON        form.file_int_name_id ਀                  㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
        LEFT JOIN file_attr.file_integer_values AS val ਀               伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
                  =     val.file_int_name_id ਀              䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        LEFT JOIN base.units_of_measure AS uom ਀               伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀  
                  =     uom.unit_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Real Number' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.file_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 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਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Filename' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'Filename' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fm.filename 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 Content Hash' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀 䌀漀渀琀攀渀琀 䠀愀猀栀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'FCH' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   sys.fn_varbintohexstr(fm.content_hash) 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 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਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN base.file_metadata AS fm ਀               伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		LEFT JOIN base.transaction_groups AS tg਀ऀऀ       伀一   昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
			      = tg.transaction_group_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 匀椀稀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Size' AS field_name,਀               ✀匀椀稀攀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 昀洀⸀昀椀氀攀开猀椀稀攀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               'B' AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_size_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀  
               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਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀  
               ON fm.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Created By' AS field_name,਀               ✀䘀䌀䈀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀ       昀洀⸀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_created_by_nm_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀  
               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਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀  
               ON fm.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀    ⤀ 
    SELECT * FROM DocData਀    圀䠀䔀刀䔀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
    UNION ALL਀    匀䔀䰀䔀䌀吀 ⨀ 䘀刀伀䴀 䘀椀氀攀䐀愀琀愀 
    WHERE @fileid IS NOT NULL਀⤀ 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [xref].[file_to_document_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_doc_link] 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].[doc_group_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 [xref].[doc_group_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_group_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_group_link] 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 [user_restr].[doc_group_view_permissions](਀ऀ嬀搀漀挀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_group_view_permission] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_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 date: 05-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䘀椀氀琀攀爀猀 昀椀氀攀猀 琀漀 攀渀猀甀爀攀 琀栀愀琀 漀渀氀礀 琀栀漀猀攀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 愀爀攀 瀀爀攀猀攀渀琀攀搀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE FUNCTION [internal].[ufn_SEL_files_permission_filtr_ITVF] ਀⠀ऀ 
	@connectedusersid VARBINARY(100)਀⤀ 
RETURNS TABLE਀䄀匀 
RETURN਀匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 昀椀氀攀开椀搀 
         FROM base.file_metadata AS fm਀ऀऀ圀䠀䔀刀䔀  
			-- Include if there are no permissions defined for any linked document਀ऀऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
				SELECT fm2.file_id਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀㈀ 
				LEFT JOIN xref.file_to_document_links AS ftdl਀ऀऀऀऀऀ   伀一 昀洀㈀⸀昀椀氀攀开椀搀 㴀 昀琀搀氀⸀昀椀氀攀开椀搀 
				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 fm2.file_id = fm.file_id਀ऀऀऀऀ  䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
			)਀ 
			OR਀ 
			-- Include if the connected user is explicitly permitted on any linked document਀ऀऀऀ䔀堀䤀匀吀匀 ⠀ 
				SELECT fm3.file_id਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀㌀ 
				LEFT JOIN xref.file_to_document_links AS ftdl਀ऀऀऀऀऀ   伀一 昀洀㌀⸀昀椀氀攀开椀搀 㴀 昀琀搀氀⸀昀椀氀攀开椀搀 
				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 fm3.file_id = fm.file_id਀ऀऀऀऀ  䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
			);਀䜀伀 
/****** Object:  UserDefinedFunction [internal].[ufn_SEL_docs_permission_filtr_ITVF]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	A permission filter for documents to ensure that only documents the user has viewing rights to are presented. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀崀  
(	਀    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 嘀䄀刀䈀䤀一䄀刀夀⠀㄀　　⤀ 
)਀刀䔀吀唀刀一匀 吀䄀䈀䰀䔀 
AS਀刀䔀吀唀刀一   
    SELECT DISTINCT dil.doc_id AS doc_id਀    䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
    WHERE ਀        ⴀⴀ 䤀渀挀氀甀搀攀 椀昀 琀栀攀爀攀 愀爀攀 渀漀 最爀漀甀瀀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀 愀琀 愀氀氀 
        NOT EXISTS (਀            匀䔀䰀䔀䌀吀 搀椀氀㈀⸀搀漀挀开椀搀 
            FROM base.document_id_list AS dil2਀            䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
                   ON dil2.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.document_id_list AS dil3਀            䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
                   ON dil3.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 TABLE [base].[booked_in_files](਀ऀ嬀戀漀漀欀椀渀最开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀戀漀漀欀攀搀开搀愀琀攀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_booked_in_files] PRIMARY KEY CLUSTERED ਀⠀ 
	[booking_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].[culture_codes](਀ऀ嬀挀甀氀琀甀爀攀开挀漀搀攀崀 嬀渀挀栀愀爀崀⠀㄀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[name] [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 [base].[datetime_styles](਀ऀ嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀 嬀椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[datetime_style_name] [nvarchar](50) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_datetime_styles] PRIMARY KEY CLUSTERED ਀⠀ 
	[datetime_style] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[eula]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀攀甀氀愀崀⠀ 
	[eula_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀搀漀挀甀洀攀渀琀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　　⤀ 一唀䰀䰀Ⰰ 
	[release_number] [nvarchar](20) NULL,਀ऀ嬀氀愀渀最甀愀最攀开挀漀搀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[title] [nvarchar](200) NULL,਀ऀ嬀搀漀挀开挀漀渀琀攀渀琀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[effective_from] [date] NULL,਀ऀ嬀猀琀愀琀甀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　⤀ 一唀䰀䰀Ⰰ 
	[created_at] [datetime2](7) NULL,਀ऀ嬀挀栀愀渀最攀开渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_eula] PRIMARY KEY CLUSTERED ਀⠀ 
	[eula_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[file_delete_log]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开搀攀氀攀琀攀开氀漀最崀⠀ 
	[pimary_key] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀搀愀琀攀开琀椀洀攀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀㔀㔀⤀ 一唀䰀䰀Ⰰ 
	[created_by_username] [nvarchar](255) NULL,਀ऀ嬀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[created_when] [datetime2](7) NULL,਀ऀ嬀搀攀氀攀琀攀搀开戀礀开甀猀攀爀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀㔀㔀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[deleted_by_sid_id] [bigint] 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 [base].[file_plain_text_content](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[plain_text_content] [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_read_log](਀ऀ嬀瀀爀椀洀愀爀礀开欀攀礀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[date_time] [datetime2](7) NOT NULL,਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[filename] [nvarchar](255) NULL,਀ऀ嬀爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀㔀㔀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[read_by_sid_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 [base].[file_storage](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[file_guid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,਀ऀ嬀昀椀氀攀开挀漀渀琀攀渀琀崀 嬀瘀愀爀戀椀渀愀爀礀崀⠀洀愀砀⤀ 䘀䤀䰀䔀匀吀刀䔀䄀䴀  一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_storage] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 䘀䤀䰀䔀匀吀刀䔀䄀䴀开伀一 嬀昀椀氀攀猀琀爀攀愀洀开昀椀氀攀最爀漀甀瀀崀Ⰰ 
 CONSTRAINT [UQ__file_sto__4CE242759DDA71A3] UNIQUE NONCLUSTERED ਀⠀ 
	[file_guid] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] FILESTREAM_ON [filestream_filegroup]਀䜀伀 
/****** Object:  Table [base].[file_thumbnails]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开琀栀甀洀戀渀愀椀氀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀琀栀甀洀戀渀愀椀氀崀 嬀瘀愀爀戀椀渀愀爀礀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_thumbnails] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [com_obj].[common_object_attributes]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀⠀ 
	[common_object_attribute_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_common_object_attribute] PRIMARY KEY CLUSTERED ਀⠀ 
	[common_object_attribute_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_ms_attr_fgroup_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀⠀ 
	[doc_ms_attr_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_ms_attr_group_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_ms_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 [doc_attr].[doc_radiob_attr_fgroup_links](਀ऀ嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[filter_group_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 䄀匀䌀Ⰰ 
	[filter_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_ms_attr_fgroup_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀⠀ 
	[file_ms_attr_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_ms_attr_fgroup_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_ms_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_radiob_attr_fgroup_links](਀ऀ嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[filter_group_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 䄀匀䌀Ⰰ 
	[filter_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[filter_groups]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀⠀ 
	[filter_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_doc_booking_usernm_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 [forms].[form_doc_com_obj_ms_defaults](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_list_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_com_obj_ms_default] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_multi_sel_defaults]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[doc_ms_attr_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_ms_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_com_obj_ms_defaults](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_list_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_com_obj_ms_defaults] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_multi_sel_defaults]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_ms_attr_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[file_ms_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_retention_date_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 [forms].[form_group_names](਀ऀ嬀昀漀爀洀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_group] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_identifier_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀⠀ 
	[form_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀昀漀爀洀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀昀漀爀洀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_identifier] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_tag_defaults]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀琀愀最开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_tag_defaults] 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_tag_fields](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_tag_fields] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_tag_group_defaults]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开最爀漀甀瀀开搀攀昀愀甀氀琀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀琀愀最开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_tag_group_defaults] 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_tag_group_fields](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_group_fields] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [messaging].[language_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀洀攀猀猀愀最椀渀最崀⸀嬀氀愀渀最甀愀最攀开氀椀猀琀崀⠀ 
	[language_id] [nchar](2) NOT NULL,਀ऀ嬀氀愀渀最甀愀最攀开渀愀洀攀开攀渀最氀椀猀栀崀 嬀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[language_name_language] [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].[message_details](਀ऀ嬀洀攀猀猀愀最攀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[language_id] [nchar](2) NOT NULL,਀ऀ嬀洀攀猀猀愀最攀开琀攀砀琀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[message_long_description] [nvarchar](max) NULL,਀ऀ嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [messaging].[message_id_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀⠀ 
	[message_id] [nvarchar](20) NOT NULL,਀ऀ嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[message_category] [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].[duty_function_sid_links](਀ऀ嬀昀甀渀挀琀椀漀渀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_user_function_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[function_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].[function_lists](਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[function_id] [bigint] NOT NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_function_lists] PRIMARY KEY CLUSTERED ਀⠀ 
	[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 [people].[people_lists](਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_people_lists_1] PRIMARY KEY CLUSTERED ਀⠀ 
	[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 [tagging].[doc_tags](਀ऀ嬀琀愀最开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[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 [tagging].[tag_browsing_tree_names](਀ऀ嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
	[sid_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 [tagging].[tag_browsing_tree_nodes](਀ऀ嬀戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[tag_browsing_tree_id] [bigint] NOT NULL,਀ऀ嬀琀愀最开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[browsing_tree_hierarchyid] [hierarchyid] NULL,਀ऀ嬀椀渀瘀攀爀琀开琀愀最崀 嬀戀椀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_browsing_tree_nodes] PRIMARY KEY CLUSTERED ਀⠀ 
	[browsing_tree_node_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [tagging].[tag_group_identifier_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀⠀ 
	[tag_group_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[tag_group_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_to_document_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[tag_id] [bigint] NOT NULL,਀ऀ嬀琀愀最开搀漀挀开氀椀渀欀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_doc_link] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_doc_link_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [tagging].[tag_to_tag_group_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀崀⠀ 
	[tag_id] [bigint] NOT NULL,਀ऀ嬀琀愀最开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_to_taggroup_link] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_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 [tagging].[tag_tree_names](਀ऀ嬀琀愀最开琀爀攀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_trees] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_tree_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [tagging].[tag_tree_nodes]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀⠀ 
	[tag_tree_node_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀琀愀最开琀爀攀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[tag_id] [bigint] NOT NULL,਀ऀ嬀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀崀 嬀栀椀攀爀愀爀挀栀礀椀搀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_tree_nodes] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_tree_node_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[authoriser_privilege_requests]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀崀⠀ 
	[request_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[username] [nvarchar](128) NULL,਀ऀ嬀琀礀瀀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[approved_by_sid_id_1] [bigint] NULL,਀ऀ嬀愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
	[approved_on_1] [datetime2](7) NULL,਀ऀ嬀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[approved_by_username_2] [nvarchar](128) NULL,਀ऀ嬀愀瀀瀀爀漀瘀攀搀开漀渀开㈀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[status] [nvarchar](20) 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 [user_restr].[authorisers](਀ऀ嬀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [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 [user_restr].[controller_doc_group_sid_links](਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_controller_doc_group_sid_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[controller_doc_group_name_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].[controller_file_grp_sid_links](਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_controller_file_grp_sid_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[controller_file_group_name_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].[doc_group_edit_perm_funct_lst](਀ऀ嬀搀漀挀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[function_list_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_group_edit_perm_function_lst] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_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].[doc_group_edit_perm_people_lst](਀ऀ嬀搀漀挀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[people_list_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_group_edit_perm_people_list] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_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].[file_group_edit_perm_funct_lst](਀ऀ嬀昀椀氀攀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[function_list_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_group_edit_perm_funct_lst] 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 [user_restr].[file_group_edit_perm_ppl_lst](਀ऀ嬀昀椀氀攀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[people_list_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_group_edit_perm_ppl_lst] 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 [user_restr].[form_group_owners](਀ऀ嬀昀漀爀洀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_owners] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_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].[role_list](਀ऀ嬀爀漀氀攀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[role_description] [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 [user_restr].[tag_br_tree_permissions_flist](਀ऀ嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[function_list_id] [bigint] NOT NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀 䄀匀䌀Ⰰ 
	[function_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[tag_br_tree_permissions_plist]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀⠀ 
	[tag_browsing_tree_id] [bigint] NOT NULL,਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_br_tree_permissions_plist] 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_group_permissions_flist](਀ऀ嬀琀愀最开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[function_list_id] [bigint] NOT NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开最爀漀甀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[function_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[tag_group_permissions_plist]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀⠀ 
	[tag_group_id] [bigint] NOT NULL,਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_group_permissions_plist] 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_tree_permissions_flist](਀ऀ嬀琀愀最开琀爀攀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[function_list_id] [bigint] NOT NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开琀爀攀攀开椀搀崀 䄀匀䌀Ⰰ 
	[function_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[tag_tree_permissions_plist]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀⠀ 
	[tag_tree_id] [bigint] NOT NULL,਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_tree_permissions_plist] 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].[user_privilege_revoke_log](਀ऀ嬀瀀爀椀洀愀爀礀开欀攀礀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[privilege] [nvarchar](50) NULL,਀ऀ嬀瀀爀椀瘀椀氀攀最攀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NULL,਀ऀ嬀甀猀攀爀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
	[granted_on] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
	[revoked_on] [datetime2](7) NULL,਀ऀ嬀爀攀瘀漀欀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_user_privilege_revoke_log] PRIMARY KEY CLUSTERED ਀⠀ 
	[primary_key] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[user_role_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开爀漀氀攀开氀椀渀欀崀⠀ 
	[role_name] [nvarchar](50) NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开甀猀攀爀开爀漀氀攀开氀椀渀欀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀爀漀氀攀开渀愀洀攀崀 䄀匀䌀Ⰰ 
	[sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [workflow_instances].[workflow_instance_definitions]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀崀⠀ 
	[workflow_instance_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[workflow_model_id] [bigint] NOT NULL,਀ऀ嬀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[create_date] [datetime2](7) NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_instance_definitions] PRIMARY KEY CLUSTERED ਀⠀ 
	[workflow_instance_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [workflow_instances].[workflow_track_log]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最崀⠀ 
	[wf_log_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀眀昀开氀漀最开椀渀搀攀砀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[record_id] [bigint] NULL,਀ऀ嬀昀椀攀氀搀开琀礀瀀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[field_id] [bigint] NULL,਀ऀ嬀昀椀攀氀搀开洀渀攀洀漀渀椀挀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[field_name] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[attr_mnemonic] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[long_text_val] [nvarchar](max) NULL,਀ऀ嬀猀琀攀瀀开漀爀搀攀爀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
	[edge_id] [bigint] NULL,਀ऀ嬀琀漀开渀漀搀攀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[rule_val] [int] NULL,਀ऀ嬀搀愀琀攀开瘀愀氀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_track_log] PRIMARY KEY CLUSTERED ਀⠀ 
	[wf_log_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [workflow_instances].[workflow_track_log_index]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开椀渀搀攀砀崀⠀ 
	[wf_log_index_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀挀爀攀愀琀攀开搀愀琀攀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀琀爀椀最最攀爀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[workflow_model_id] [bigint] NOT NULL,਀ऀ嬀洀漀搀攀氀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[present_step_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 [workflow_models].[workflow_model_names](਀ऀ嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_model_definitions] PRIMARY KEY CLUSTERED ਀⠀ 
	[workflow_model_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[controller_doc_group_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[created_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀搀崀 䄀匀䌀Ⰰ 
	[controller_doc_group_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[controller_doc_group_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀⠀ 
	[controller_doc_group_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀挀爀攀愀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_controller_doc_group_names] PRIMARY KEY CLUSTERED ਀⠀ 
	[controller_doc_group_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[controller_file_group_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[created_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[controller_file_group_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[controller_file_group_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀⠀ 
	[controller_file_group_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀挀爀攀愀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_controller_file_group_names] PRIMARY KEY CLUSTERED ਀⠀ 
	[controller_file_group_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[cross_reference_types]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀⠀ 
	[xref_type_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].[doc_cross_references](਀ऀ嬀猀漀甀爀挀攀开搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[xref_doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀砀爀攀昀开琀礀瀀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开砀爀攀昀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀猀漀甀爀挀攀开搀漀挀开椀搀崀 䄀匀䌀Ⰰ 
	[xref_doc_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[file_group_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀⠀ 
	[file_group_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开最爀漀甀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[file_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[file_group_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀⠀ 
	[file_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਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀挀甀氀琀甀爀攀开挀漀搀攀猀崀 ⠀嬀挀甀氀琀甀爀攀开挀漀搀攀崀Ⰰ 嬀渀愀洀攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀搀攀ⴀ䐀䔀     ✀Ⰰ 一✀䜀攀爀洀愀渀✀⤀ 
INSERT [base].[culture_codes] ([culture_code], [name]) VALUES (N'en-GB     ', N'British English')਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀挀甀氀琀甀爀攀开挀漀搀攀猀崀 ⠀嬀挀甀氀琀甀爀攀开挀漀搀攀崀Ⰰ 嬀渀愀洀攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀攀渀ⴀ唀匀     ✀Ⰰ 一✀唀匀 䔀渀最氀椀猀栀✀⤀ 
INSERT [base].[culture_codes] ([culture_code], [name]) VALUES (N'fr-FR     ', N'French')਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀挀甀氀琀甀爀攀开挀漀搀攀猀崀 ⠀嬀挀甀氀琀甀爀攀开挀漀搀攀崀Ⰰ 嬀渀愀洀攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀稀栀ⴀ䌀一     ✀Ⰰ 一✀䌀栀椀渀攀猀攀 匀椀洀瀀氀椀昀椀攀搀✀⤀ 
GO਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㌀Ⰰ 一✀礀礀礀礀ⴀ洀洀ⴀ搀搀✀Ⰰ ㄀㄀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (100, N'mon dd yyyy hh:miAM', 12)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　㄀Ⰰ 一✀洀洀⼀搀搀⼀礀礀礀礀✀Ⰰ 㔀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (102, N'yyyy.mm.dd', 4)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　㌀Ⰰ 一✀搀搀⼀洀洀⼀礀礀礀礀✀Ⰰ ㌀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (104, N'dd.mm.yyyy', 11)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　㔀Ⰰ 一✀搀搀ⴀ洀洀ⴀ礀礀礀礀✀Ⰰ ㄀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (106, N'dd mon yy', 6)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　㜀Ⰰ 一✀䴀漀渀 搀搀Ⰰ 礀礀礀礀✀Ⰰ 㜀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (108, N'hh:mi:ss', 13)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　㤀Ⰰ 一✀洀漀渀 搀搀 礀礀礀礀✀Ⰰ 㠀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (110, N'mm-dd-yyyy', 2)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㄀㄀Ⰰ 一✀礀礀礀礀⼀洀洀⼀搀搀✀Ⰰ 㤀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (112, N'yyyymmdd', 10)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㄀㌀Ⰰ 一✀搀搀 洀漀渀 礀礀礀礀 栀栀㨀洀椀㨀猀猀㨀洀洀洀 ⠀㈀㐀 栀漀甀爀⤀✀Ⰰ ㄀㐀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (114, N'hh:mi:ss:mmm (24-hour)', 15)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㈀　Ⰰ 一✀礀礀礀礀ⴀ洀洀ⴀ搀搀 栀栀㨀洀椀㨀猀猀 ⠀㈀㐀ⴀ栀漀甀爀⤀✀Ⰰ ㄀㘀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (121, N'yyyy-mm-dd hh:mi:ss.mmm (24-hour)', 17)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㈀㘀Ⰰ 一✀礀礀ⴀ洀洀ⴀ搀搀吀栀栀㨀洀椀㨀猀猀⸀洀洀洀 ⠀渀漀 猀瀀愀挀攀猀⤀✀Ⰰ ㄀㠀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀攀甀氀愀崀 伀一  
਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀攀甀氀愀崀 ⠀嬀攀甀氀愀开椀搀崀Ⰰ 嬀搀漀挀甀洀攀渀琀开渀愀洀攀崀Ⰰ 嬀爀攀氀攀愀猀攀开渀甀洀戀攀爀崀Ⰰ 嬀氀愀渀最甀愀最攀开挀漀搀攀崀Ⰰ 嬀琀椀琀氀攀崀Ⰰ 嬀搀漀挀开挀漀渀琀攀渀琀崀Ⰰ 嬀攀昀昀攀挀琀椀瘀攀开昀爀漀洀崀Ⰰ 嬀猀琀愀琀甀猀崀Ⰰ 嬀挀爀攀愀琀攀搀开愀琀崀Ⰰ 嬀挀栀愀渀最攀开渀漀琀攀猀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀䔀唀䰀䄀✀Ⰰ 一✀㄀⸀　✀Ⰰ 一✀䔀一✀Ⰰ 一✀䔀渀搀 唀猀攀爀 䰀椀挀攀渀猀攀 䄀最爀攀攀洀攀渀琀✀Ⰰ 一✀ 
਀䔀一䐀 唀匀䔀刀 䰀䤀䌀䔀一匀䔀 䄀䜀刀䔀䔀䴀䔀一吀 ⠀䔀唀䰀䄀⤀ 
This End User License Agreement (the "Agreement") is a legal agreement between you (either an individual or a single entity) and Silkwood Software Pty. Ltd. ("Licensor") regarding the use of the Elyse database (the "Software"). By accessing or using the Software you agree to be bound by the terms of this Agreement.਀㄀⸀ 䐀攀昀椀渀椀琀椀漀渀猀 
•	"Software" refers to the Elyse database, including all schema definitions, stored procedures and functions, and any updates or upgrades provided by the Licensor.  "Software" does not include any application software that may be used in association with this database.  ਀∀ठ∀唀猀攀爀∀ 洀攀愀渀猀 愀 猀椀渀最氀攀 栀甀洀愀渀 椀渀搀椀瘀椀搀甀愀氀 眀栀漀 愀挀挀攀猀猀攀猀 漀爀 甀猀攀猀 琀栀攀 匀漀昀琀眀愀爀攀⸀   
•	"Database Instance" means a single, functionally independent installation of the Software’s schema or data model within a database management system, regardless of the database engine used, the server or hardware it is installed on, or the environment (e.g., production, staging, testing, or development), where the schema is instantiated and accessible for use.  A new Database Instance is deemed created whenever the schema or data model of the Software is installed or instantiated separately from any other instance, even if within the same database server or system.  A Database Instance shall not include inactive backup copies or instances used solely for disaster recovery purposes, provided they are not accessed concurrently with an active licensed instance.਀∀ठ∀匀椀渀最氀攀 唀猀攀爀 䌀漀渀琀攀砀琀∀ 爀攀昀攀爀猀 琀漀 琀栀攀 匀漀昀琀眀愀爀攀 戀攀椀渀最 甀猀攀搀 戀礀 漀渀攀 唀猀攀爀 愀琀 愀 琀椀洀攀 漀渀 愀 猀椀渀最氀攀 挀漀洀瀀甀琀攀爀 漀爀 搀攀瘀椀挀攀⸀ 吀栀椀猀 椀渀挀氀甀搀攀猀 猀椀琀甀愀琀椀漀渀猀 眀栀攀爀攀 愀 挀漀洀瀀甀琀攀爀 洀愀礀 栀愀瘀攀 洀甀氀琀椀瀀氀攀 甀猀攀爀 愀挀挀漀甀渀琀猀Ⰰ 戀甀琀 漀渀氀礀 漀渀攀 唀猀攀爀 椀猀 愀挀琀椀瘀攀氀礀 愀挀挀攀猀猀椀渀最 琀栀攀 匀漀昀琀眀愀爀攀 愀琀 愀渀礀 最椀瘀攀渀 洀漀洀攀渀琀⸀ 
•	"Concurrent Use" means the Software being actively used by, or accessible to, more than one User at the same time, regardless of the number of Software installations or physical devices. This includes, but is not limited to, situations where:਀ⴀ  䴀甀氀琀椀瀀氀攀 椀渀搀椀瘀椀搀甀愀氀猀 愀爀攀 氀漀最最攀搀 椀渀琀漀 愀渀搀 椀渀琀攀爀愀挀琀椀渀最 眀椀琀栀 琀栀攀 匀漀昀琀眀愀爀攀 昀爀漀洀 搀椀昀昀攀爀攀渀琀 挀漀洀瀀甀琀攀爀猀 猀椀洀甀氀琀愀渀攀漀甀猀氀礀⸀ 
-  Multiple individuals are accessing or interacting with the Software via a shared server, virtual desktop infrastructure (VDI), or cloud environment concurrently.਀ⴀ  吀栀攀 匀漀昀琀眀愀爀攀 椀猀 椀渀猀琀愀氀氀攀搀 漀渀 愀 猀攀爀瘀攀爀 愀渀搀 愀挀挀攀猀猀攀搀 戀礀 洀甀氀琀椀瀀氀攀 挀氀椀攀渀琀猀 漀爀 甀猀攀爀猀 愀琀 琀栀攀 猀愀洀攀 琀椀洀攀⸀ 
•	"Multi-User Environment" refers to any setup where the Software is deployed or configured to enable, facilitate, or support access or use by more than one User, whether simultaneously or sequentially, for shared or collaborative purposes, or in a manner that allows for the pooling or sharing of Software functionality among multiple Users. This includes, but is not limited to, network installations, terminal server deployments, or cloud-based shared instances.਀∀ठ∀倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀∀ 洀攀愀渀猀 愀渀礀 猀礀猀琀攀洀Ⰰ 猀攀爀瘀攀爀Ⰰ 漀爀 挀漀渀昀椀最甀爀愀琀椀漀渀 眀栀攀爀攀 琀栀攀 匀漀昀琀眀愀爀攀 椀猀 甀猀攀搀 琀漀 瀀爀漀挀攀猀猀 氀椀瘀攀 搀愀琀愀Ⰰ 猀甀瀀瀀漀爀琀 爀攀愀氀ⴀ眀漀爀氀搀 漀瀀攀爀愀琀椀漀渀猀Ⰰ 漀爀 瀀爀漀瘀椀搀攀 猀攀爀瘀椀挀攀猀 琀漀 攀渀搀ⴀ甀猀攀爀猀 ⠀椀渀琀攀爀渀愀氀 漀爀 攀砀琀攀爀渀愀氀⤀ 眀栀漀 愀爀攀 渀漀琀 搀椀爀攀挀琀氀礀 椀渀瘀漀氀瘀攀搀 椀渀 琀栀攀 搀攀瘀攀氀漀瀀洀攀渀琀Ⰰ 琀攀猀琀椀渀最Ⰰ 漀爀 攀瘀愀氀甀愀琀椀漀渀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀⸀ 
•	"Non-Production Environment" means any system, server, or configuration where the Software is used solely for development, testing, quality assurance, staging, demonstration, or training purposes, and does not process live data or provide services to production end-users.਀㈀⸀ 䰀椀挀攀渀猀攀 䜀爀愀渀琀猀 
•	2.1 Evaluation & Development Use License (Free): The Licensor grants you a non-exclusive, non-transferable, limited license to use the Software free of charge for evaluation, development, testing, quality assurance, staging, and demonstration purposes only. This license is perpetual and not time-bound. Use under this license is restricted to a Non-Production Environment and may not be used for any commercial purpose or in a Production Environment. Any number of Users may access the Software within a Non-Production Environment for these defined purposes. This license does not require a per-Database Instance fee for Non-Production Environments.਀∀ठ㈀⸀㈀ 匀椀渀最氀攀ⴀ唀猀攀爀 䔀渀瘀椀爀漀渀洀攀渀琀 䰀椀挀攀渀猀攀 ⠀䘀爀攀攀⤀㨀 匀甀戀樀攀挀琀 琀漀 琀栀攀 琀攀爀洀猀 愀渀搀 挀漀渀搀椀琀椀漀渀猀 漀昀 琀栀椀猀 䄀最爀攀攀洀攀渀琀Ⰰ 琀栀攀 䰀椀挀攀渀猀漀爀 最爀愀渀琀猀 礀漀甀 愀 渀漀渀ⴀ攀砀挀氀甀猀椀瘀攀Ⰰ 渀漀渀ⴀ琀爀愀渀猀昀攀爀愀戀氀攀Ⰰ 氀椀洀椀琀攀搀 氀椀挀攀渀猀攀 琀漀 甀猀攀 琀栀攀 匀漀昀琀眀愀爀攀 猀漀氀攀氀礀 昀漀爀 甀猀攀 漀渀 愀 猀椀渀最氀攀 挀漀洀瀀甀琀攀爀 眀椀琀栀椀渀 愀 匀椀渀最氀攀 唀猀攀爀 䌀漀渀琀攀砀琀Ⰰ 眀栀攀琀栀攀爀 昀漀爀 瀀攀爀猀漀渀愀氀 漀爀 挀漀洀洀攀爀挀椀愀氀 甀猀攀⸀  吀栀椀猀 氀椀挀攀渀猀攀 愀瀀瀀氀椀攀猀 漀渀氀礀 眀栀攀渀 琀栀攀 匀漀昀琀眀愀爀攀 椀猀 挀漀渀渀攀挀琀攀搀 琀漀 漀渀攀 ⠀㄀⤀ 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀⸀ 䘀漀爀 琀栀攀 愀瘀漀椀搀愀渀挀攀 漀昀 搀漀甀戀琀Ⰰ ✀✀猀椀渀最氀攀 挀漀洀瀀甀琀攀爀✀✀ 洀攀愀渀猀 愀 搀攀瘀椀挀攀 漀渀 眀栀椀挀栀 琀栀攀 匀漀昀琀眀愀爀攀 椀猀 椀渀猀琀愀氀氀攀搀 愀渀搀 愀挀挀攀猀猀攀搀 戀礀 漀渀攀 栀甀洀愀渀 甀猀攀爀 愀琀 愀 琀椀洀攀Ⰰ 攀瘀攀渀 椀昀 琀栀愀琀 搀攀瘀椀挀攀 猀甀瀀瀀漀爀琀猀 洀甀氀琀椀瀀氀攀 甀猀攀爀 愀挀挀漀甀渀琀猀 漀爀 瀀爀漀昀椀氀攀猀⸀ 吀栀椀猀 氀椀挀攀渀猀攀 攀砀瀀爀攀猀猀氀礀 攀砀挀氀甀搀攀猀 愀渀礀 昀漀爀洀 漀昀 䌀漀渀挀甀爀爀攀渀琀 唀猀攀 漀爀 甀猀攀 椀渀 愀 䴀甀氀琀椀ⴀ唀猀攀爀 䔀渀瘀椀爀漀渀洀攀渀琀⸀ 
•	2.3 Commercial / Production Use License (Paid - Per Database Instance): A separate paid license is required for any use of the Software in a Production Environment. For each Database Instance connected to and utilized by the Software in a Production Environment, a distinct Commercial / Production Use License must be purchased.  For virtualized or containerized deployments, each distinct logical database instance constitutes a separate Database Instance and requires a separate license.  Once a Commercial / Production Use License is acquired for a specific Database Instance, there are no restrictions on the number of Users who may concurrently or sequentially access and use the Software in conjunction with that licensed Database Instance. This license permits Concurrent Use and use in a Multi-User Environment for the specified Database Instance. The terms and conditions for such licenses, including pricing and activation, are available at silkwoodsoftware.com.਀㌀⸀ 䰀椀挀攀渀猀攀 刀攀猀琀爀椀挀琀椀漀渀猀 
•	You may not use the Software in a Concurrent Use Production Environment or Multi-User Production Environment without a valid Commercial / Production Use License (paid license) for each Database Instance connected.਀∀ठ夀漀甀 洀愀礀 渀漀琀 爀攀渀琀Ⰰ 氀攀愀猀攀Ⰰ 氀攀渀搀Ⰰ 猀攀氀氀Ⰰ 爀攀搀椀猀琀爀椀戀甀琀攀Ⰰ 漀爀 猀甀戀氀椀挀攀渀猀攀 琀栀攀 匀漀昀琀眀愀爀攀Ⰰ 攀砀挀攀瀀琀 愀猀 攀砀瀀爀攀猀猀氀礀 瀀攀爀洀椀琀琀攀搀 戀礀 琀栀椀猀 䄀最爀攀攀洀攀渀琀⸀ 
•	You may not modify or add to or delete the schema definitions, stored procedures,  functions, schema elements, constraints, triggers, or table definitions that constitute the Software, except as follows:਀   ⴀ 夀漀甀 洀愀礀 挀漀渀昀椀最甀爀攀 匀儀䰀 匀攀爀瘀攀爀 愀甀搀椀琀 氀漀最最椀渀最 甀猀椀渀最 渀愀琀椀瘀攀 昀攀愀琀甀爀攀猀Ⰰ 瀀爀漀瘀椀搀攀搀 琀栀愀琀 渀漀 猀挀栀攀洀愀 挀栀愀渀最攀猀 愀爀攀 洀愀搀攀 琀漀 琀栀攀 氀椀挀攀渀猀攀搀 搀愀琀愀戀愀猀攀 漀戀樀攀挀琀猀⸀ 
   - You may add or modify indexes solely for performance optimization purposes.਀∀ठ夀漀甀 洀愀礀 渀漀琀 洀漀搀椀昀礀 漀爀 搀攀氀攀琀攀 琀栀攀 挀漀渀琀攀渀琀猀 漀爀 搀攀昀椀渀椀琀椀漀渀猀 漀昀 䔀砀琀攀渀搀攀搀 倀爀漀瀀攀爀琀椀攀猀 漀爀 琀栀攀 怀攀甀氀愀怀 琀愀戀氀攀⸀ 
•	You may not grant any application or service direct permissions on the underlying database schema objects (including tables, views, or internal functions). ਀∀ठ夀漀甀 洀愀礀 渀漀琀 戀礀瀀愀猀猀Ⰰ 搀椀猀愀戀氀攀Ⰰ 漀爀 漀琀栀攀爀眀椀猀攀 挀椀爀挀甀洀瘀攀渀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 爀漀氀攀ⴀ戀愀猀攀搀 愀挀挀攀猀猀 挀漀渀琀爀漀氀 洀漀搀攀氀Ⰰ 甀渀搀攀爀 眀栀椀挀栀 愀瀀瀀氀椀挀愀琀椀漀渀 愀挀挀攀猀猀 琀漀 搀愀琀愀 椀猀 瀀攀爀洀椀琀琀攀搀 漀渀氀礀 琀栀爀漀甀最栀 琀栀攀 攀砀攀挀甀琀椀漀渀 漀昀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 瘀椀愀 瀀攀爀洀椀猀猀椀漀渀猀 最爀愀渀琀攀搀 琀漀 愀瀀瀀氀椀挀愀琀椀漀渀 爀漀氀攀猀⸀ 
•	Administrative users may retain sufficient privileges for system configuration and maintenance purposes (such as setup, data configuration, backups or performance tuning), but they must not configure any user, application, or service to bypass the application role enforcement model described herein.  Any deviation from this model constitutes a breach of this Agreement and may compromise the security framework upon which the Software relies.਀∀ठ夀漀甀 洀愀礀 渀漀琀 爀攀洀漀瘀攀 漀爀 愀氀琀攀爀 愀渀礀 挀漀瀀礀爀椀最栀琀Ⰰ 琀爀愀搀攀洀愀爀欀Ⰰ 漀爀 漀琀栀攀爀 瀀爀漀瀀爀椀攀琀愀爀礀 渀漀琀椀挀攀猀 昀爀漀洀 琀栀攀 匀漀昀琀眀愀爀攀 漀爀 椀琀猀 搀漀挀甀洀攀渀琀愀琀椀漀渀⸀ 
•	The free Evaluation & Development Use License (Section 2.1) explicitly prohibits use in a Production Environment for any purpose.਀∀ठ夀漀甀 猀栀愀氀氀 洀愀椀渀琀愀椀渀 愀渀 愀挀挀甀爀愀琀攀Ⰰ 挀漀洀瀀氀攀琀攀 愀渀搀 甀瀀ⴀ琀漀ⴀ搀愀琀攀 氀椀猀琀 漀昀 愀氀氀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀猀 琀漀 眀栀椀挀栀 愀 瀀愀椀搀 氀椀挀攀渀猀攀 椀猀 愀瀀瀀氀椀挀愀戀氀攀⸀  匀甀挀栀 爀攀挀漀爀搀猀 猀栀愀氀氀 椀渀挀氀甀搀攀 琀栀攀 攀渀瘀椀爀漀渀洀攀渀琀 琀礀瀀攀Ⰰ 搀愀琀愀戀愀猀攀 栀漀猀琀 氀漀挀愀琀椀漀渀Ⰰ 愀渀搀 搀愀琀攀 漀昀 椀渀猀琀愀氀氀愀琀椀漀渀 昀漀爀 攀愀挀栀 椀渀猀琀愀渀挀攀⸀ 夀漀甀 猀栀愀氀氀 爀攀琀愀椀渀 琀栀攀猀攀 爀攀挀漀爀搀猀 昀漀爀 琀栀攀 搀甀爀愀琀椀漀渀 漀昀 琀栀攀 氀椀挀攀渀猀攀 琀攀爀洀 愀渀搀 昀漀爀 愀 瀀攀爀椀漀搀 漀昀 漀渀攀 ⠀㄀⤀ 礀攀愀爀 琀栀攀爀攀愀昀琀攀爀⸀  匀甀挀栀 爀攀挀漀爀搀猀 猀栀愀氀氀 戀攀 洀愀搀攀 愀瘀愀椀氀愀戀氀攀 琀漀 琀栀攀 䰀椀挀攀渀猀漀爀 漀爀 愀甀琀栀漀爀椀猀攀搀 爀攀瀀爀攀猀攀渀琀愀琀椀瘀攀 昀漀爀 愀甀搀椀琀椀渀最 瀀甀爀瀀漀猀攀猀⸀   
4. Ownership਀吀栀攀 匀漀昀琀眀愀爀攀 椀猀 氀椀挀攀渀猀攀搀Ⰰ 渀漀琀 猀漀氀搀⸀ 䄀氀氀 椀渀琀攀氀氀攀挀琀甀愀氀 瀀爀漀瀀攀爀琀礀 爀椀最栀琀猀 椀渀 愀渀搀 琀漀 琀栀攀 匀漀昀琀眀愀爀攀Ⰰ 椀渀挀氀甀搀椀渀最 挀漀瀀礀爀椀最栀琀猀Ⰰ 琀爀愀搀攀洀愀爀欀猀Ⰰ 愀渀搀 琀爀愀搀攀 猀攀挀爀攀琀猀Ⰰ 爀攀洀愀椀渀 眀椀琀栀 琀栀攀 䰀椀挀攀渀猀漀爀⸀ 夀漀甀 愀挀欀渀漀眀氀攀搀最攀 琀栀愀琀 礀漀甀 搀漀 渀漀琀 愀挀焀甀椀爀攀 愀渀礀 漀眀渀攀爀猀栀椀瀀 爀椀最栀琀猀 戀礀 搀漀眀渀氀漀愀搀椀渀最Ⰰ 椀渀猀琀愀氀氀椀渀最Ⰰ 漀爀 甀猀椀渀最 琀栀攀 匀漀昀琀眀愀爀攀⸀ 
5. Disclaimer of Warranty਀吀䠀䔀 匀伀䘀吀圀䄀刀䔀 䤀匀 倀刀伀嘀䤀䐀䔀䐀 ∀䄀匀 䤀匀Ⰰ∀ 圀䤀吀䠀伀唀吀 圀䄀刀刀䄀一吀夀 伀䘀 䄀一夀 䬀䤀一䐀Ⰰ 䔀堀倀刀䔀匀匀 伀刀 䤀䴀倀䰀䤀䔀䐀Ⰰ 䤀一䌀䰀唀䐀䤀一䜀 䈀唀吀 一伀吀 䰀䤀䴀䤀吀䔀䐀 吀伀 吀䠀䔀 圀䄀刀刀䄀一吀䤀䔀匀 伀䘀 䴀䔀刀䌀䠀䄀一吀䄀䈀䤀䰀䤀吀夀Ⰰ 䘀䤀吀一䔀匀匀 䘀伀刀 䄀 倀䄀刀吀䤀䌀唀䰀䄀刀 倀唀刀倀伀匀䔀Ⰰ 䄀一䐀 一伀一䤀一䘀刀䤀一䜀䔀䴀䔀一吀⸀ 䤀一 一伀 䔀嘀䔀一吀 匀䠀䄀䰀䰀 吀䠀䔀 䰀䤀䌀䔀一匀伀刀 䈀䔀 䰀䤀䄀䈀䰀䔀 䘀伀刀 䄀一夀 䌀䰀䄀䤀䴀Ⰰ 䐀䄀䴀䄀䜀䔀匀Ⰰ 伀刀 伀吀䠀䔀刀 䰀䤀䄀䈀䤀䰀䤀吀夀Ⰰ 圀䠀䔀吀䠀䔀刀 䤀一 䄀一 䄀䌀吀䤀伀一 伀䘀 䌀伀一吀刀䄀䌀吀Ⰰ 吀伀刀吀Ⰰ 伀刀 伀吀䠀䔀刀圀䤀匀䔀Ⰰ 䄀刀䤀匀䤀一䜀 䘀刀伀䴀Ⰰ 伀唀吀 伀䘀Ⰰ 伀刀 䤀一 䌀伀一一䔀䌀吀䤀伀一 圀䤀吀䠀 吀䠀䔀 匀伀䘀吀圀䄀刀䔀 伀刀 吀䠀䔀 唀匀䔀 伀刀 伀吀䠀䔀刀 䐀䔀䄀䰀䤀一䜀匀 䤀一 吀䠀䔀 匀伀䘀吀圀䄀刀䔀⸀ 
6. Limitation of Liability਀吀伀 吀䠀䔀 䴀䄀堀䤀䴀唀䴀 䔀堀吀䔀一吀 倀䔀刀䴀䤀吀吀䔀䐀 䈀夀 䄀倀倀䰀䤀䌀䄀䈀䰀䔀 䰀䄀圀Ⰰ 䤀一 一伀 䔀嘀䔀一吀 匀䠀䄀䰀䰀 吀䠀䔀 䰀䤀䌀䔀一匀伀刀 䈀䔀 䰀䤀䄀䈀䰀䔀 䘀伀刀 䄀一夀 䤀一䐀䤀刀䔀䌀吀Ⰰ 䤀一䌀䤀䐀䔀一吀䄀䰀Ⰰ 匀倀䔀䌀䤀䄀䰀Ⰰ 䌀伀一匀䔀儀唀䔀一吀䤀䄀䰀Ⰰ 伀刀 倀唀一䤀吀䤀嘀䔀 䐀䄀䴀䄀䜀䔀匀Ⰰ 伀刀 䄀一夀 䰀伀匀匀 伀䘀 倀刀伀䘀䤀吀匀 伀刀 刀䔀嘀䔀一唀䔀匀Ⰰ 圀䠀䔀吀䠀䔀刀 䤀一䌀唀刀刀䔀䐀 䐀䤀刀䔀䌀吀䰀夀 伀刀 䤀一䐀䤀刀䔀䌀吀䰀夀Ⰰ 伀刀 䄀一夀 䰀伀匀匀 伀䘀 䐀䄀吀䄀Ⰰ 唀匀䔀Ⰰ 䜀伀伀䐀圀䤀䰀䰀Ⰰ 伀刀 伀吀䠀䔀刀 䤀一吀䄀一䜀䤀䈀䰀䔀 䰀伀匀匀䔀匀Ⰰ 刀䔀匀唀䰀吀䤀一䜀 䘀刀伀䴀 ⠀䄀⤀ 夀伀唀刀 䄀䌀䌀䔀匀匀 吀伀 伀刀 唀匀䔀 伀䘀 伀刀 䤀一䄀䈀䤀䰀䤀吀夀 吀伀 䄀䌀䌀䔀匀匀 伀刀 唀匀䔀 吀䠀䔀 匀伀䘀吀圀䄀刀䔀㬀 ⠀䈀⤀ 䄀一夀 䌀伀一䐀唀䌀吀 伀刀 䌀伀一吀䔀一吀 伀䘀 䄀一夀 吀䠀䤀刀䐀 倀䄀刀吀夀 伀一 吀䠀䔀 匀伀䘀吀圀䄀刀䔀㬀 ⠀䌀⤀ 䄀一夀 䌀伀一吀䔀一吀 伀䈀吀䄀䤀一䔀䐀 䘀刀伀䴀 吀䠀䔀 匀伀䘀吀圀䄀刀䔀㬀 䄀一䐀 ⠀䐀⤀ 唀一䄀唀吀䠀伀刀䤀娀䔀䐀 䄀䌀䌀䔀匀匀Ⰰ 唀匀䔀Ⰰ 伀刀 䄀䰀吀䔀刀䄀吀䤀伀一 伀䘀 夀伀唀刀 吀刀䄀一匀䴀䤀匀匀䤀伀一匀 伀刀 䌀伀一吀䔀一吀Ⰰ 圀䠀䔀吀䠀䔀刀 䈀䄀匀䔀䐀 伀一 圀䄀刀刀䄀一吀夀Ⰰ 䌀伀一吀刀䄀䌀吀Ⰰ 吀伀刀吀 ⠀䤀一䌀䰀唀䐀䤀一䜀 一䔀䜀䰀䤀䜀䔀一䌀䔀⤀Ⰰ 伀刀 䄀一夀 伀吀䠀䔀刀 䰀䔀䜀䄀䰀 吀䠀䔀伀刀夀Ⰰ 圀䠀䔀吀䠀䔀刀 伀刀 一伀吀 圀䔀 䠀䄀嘀䔀 䈀䔀䔀一 䤀一䘀伀刀䴀䔀䐀 伀䘀 吀䠀䔀 倀伀匀匀䤀䈀䤀䰀䤀吀夀 伀䘀 匀唀䌀䠀 䐀䄀䴀䄀䜀䔀Ⰰ 䄀一䐀 䔀嘀䔀一 䤀䘀 䄀 刀䔀䴀䔀䐀夀 匀䔀吀 䘀伀刀吀䠀 䠀䔀刀䔀䤀一 䤀匀 䘀伀唀一䐀 吀伀 䠀䄀嘀䔀 䘀䄀䤀䰀䔀䐀 伀䘀 䤀吀匀 䔀匀匀䔀一吀䤀䄀䰀 倀唀刀倀伀匀䔀⸀ 
7. Termination਀吀栀椀猀 䄀最爀攀攀洀攀渀琀 椀猀 攀昀昀攀挀琀椀瘀攀 甀渀琀椀氀 琀攀爀洀椀渀愀琀攀搀⸀ 夀漀甀爀 爀椀最栀琀猀 甀渀搀攀爀 琀栀椀猀 䄀最爀攀攀洀攀渀琀 眀椀氀氀 琀攀爀洀椀渀愀琀攀 愀甀琀漀洀愀琀椀挀愀氀氀礀 眀椀琀栀漀甀琀 渀漀琀椀挀攀 昀爀漀洀 琀栀攀 䰀椀挀攀渀猀漀爀 椀昀 礀漀甀 昀愀椀氀 琀漀 挀漀洀瀀氀礀 眀椀琀栀 愀渀礀 漀昀 椀琀猀 琀攀爀洀猀⸀ 唀瀀漀渀 琀攀爀洀椀渀愀琀椀漀渀Ⰰ 礀漀甀 洀甀猀琀 挀攀愀猀攀 愀氀氀 甀猀攀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀⸀ 
8. Governing Law਀吀栀椀猀 䄀最爀攀攀洀攀渀琀 猀栀愀氀氀 戀攀 最漀瘀攀爀渀攀搀 戀礀 愀渀搀 挀漀渀猀琀爀甀攀搀 椀渀 愀挀挀漀爀搀愀渀挀攀 眀椀琀栀 琀栀攀 氀愀眀猀 漀昀 儀甀攀攀渀猀氀愀渀搀 䄀甀猀琀爀愀氀椀愀⸀ 
9. Entire Agreement਀吀栀椀猀 䄀最爀攀攀洀攀渀琀 挀漀渀猀琀椀琀甀琀攀猀 琀栀攀 攀渀琀椀爀攀 愀最爀攀攀洀攀渀琀 戀攀琀眀攀攀渀 礀漀甀 愀渀搀 琀栀攀 䰀椀挀攀渀猀漀爀 爀攀最愀爀搀椀渀最 琀栀攀 匀漀昀琀眀愀爀攀 愀渀搀 猀甀瀀攀爀猀攀搀攀猀 愀氀氀 瀀爀椀漀爀 愀渀搀 挀漀渀琀攀洀瀀漀爀愀渀攀漀甀猀 甀渀搀攀爀猀琀愀渀搀椀渀最猀Ⰰ 愀最爀攀攀洀攀渀琀猀Ⰰ 爀攀瀀爀攀猀攀渀琀愀琀椀漀渀猀Ⰰ 愀渀搀 眀愀爀爀愀渀琀椀攀猀Ⰰ 戀漀琀栀 眀爀椀琀琀攀渀 愀渀搀 漀爀愀氀Ⰰ 爀攀最愀爀搀椀渀最 猀甀挀栀 猀甀戀樀攀挀琀 洀愀琀琀攀爀⸀ 
਀ 
', CAST(N'2026-02-23' AS Date), N'Superseded', CAST(N'2025-09-21T16:45:39.2683758' AS DateTime2), N'Initial release')਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀攀甀氀愀崀 ⠀嬀攀甀氀愀开椀搀崀Ⰰ 嬀搀漀挀甀洀攀渀琀开渀愀洀攀崀Ⰰ 嬀爀攀氀攀愀猀攀开渀甀洀戀攀爀崀Ⰰ 嬀氀愀渀最甀愀最攀开挀漀搀攀崀Ⰰ 嬀琀椀琀氀攀崀Ⰰ 嬀搀漀挀开挀漀渀琀攀渀琀崀Ⰰ 嬀攀昀昀攀挀琀椀瘀攀开昀爀漀洀崀Ⰰ 嬀猀琀愀琀甀猀崀Ⰰ 嬀挀爀攀愀琀攀搀开愀琀崀Ⰰ 嬀挀栀愀渀最攀开渀漀琀攀猀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀Ⰰ 一✀䔀唀䰀䄀✀Ⰰ 一✀㄀⸀㄀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䔀渀搀 唀猀攀爀 䰀椀挀攀渀猀攀 䄀最爀攀攀洀攀渀琀✀Ⰰ 一✀䔀一䐀 唀匀䔀刀 䰀䤀䌀䔀一匀䔀 䄀䜀刀䔀䔀䴀䔀一吀 ⠀䔀唀䰀䄀⤀ 
This End User License Agreement (the "Agreement") is a legal agreement between you (either an individual or a single entity) and Silkwood Software Pty. Ltd. ("Licensor") regarding the use of the Elyse database (the "Software"). By accessing or using the Software you agree to be bound by the terms of this Agreement.਀㄀⸀ 䐀攀昀椀渀椀琀椀漀渀猀 
•	"Software" refers to the Elyse database, including all schema definitions, stored procedures and functions, and any updates or upgrades provided by the Licensor.  "Software" does not include any application software that may be used in association with this database.  ਀∀ठ∀唀猀攀爀∀ 洀攀愀渀猀 愀 猀椀渀最氀攀 栀甀洀愀渀 椀渀搀椀瘀椀搀甀愀氀 眀栀漀 愀挀挀攀猀猀攀猀 漀爀 甀猀攀猀 琀栀攀 匀漀昀琀眀愀爀攀⸀   
•	"Database Instance" means a single, functionally independent installation of the Software’s schema or data model within a database management system, regardless of the database engine used, the server or hardware it is installed on, or the environment (e.g., production, staging, testing, or development), where the schema is instantiated and accessible for use.  A new Database Instance is deemed created whenever the schema or data model of the Software is installed or instantiated separately from any other instance, even if within the same database server or system.  A Database Instance shall not include inactive backup copies or instances used solely for disaster recovery purposes, provided they are not accessed concurrently with an active licensed instance.਀∀ठ∀匀椀渀最氀攀 唀猀攀爀 䌀漀渀琀攀砀琀∀ 爀攀昀攀爀猀 琀漀 琀栀攀 匀漀昀琀眀愀爀攀 戀攀椀渀最 甀猀攀搀 戀礀 漀渀攀 唀猀攀爀 愀琀 愀 琀椀洀攀 漀渀 愀 猀椀渀最氀攀 挀漀洀瀀甀琀攀爀 漀爀 搀攀瘀椀挀攀⸀ 吀栀椀猀 椀渀挀氀甀搀攀猀 猀椀琀甀愀琀椀漀渀猀 眀栀攀爀攀 愀 挀漀洀瀀甀琀攀爀 洀愀礀 栀愀瘀攀 洀甀氀琀椀瀀氀攀 甀猀攀爀 愀挀挀漀甀渀琀猀Ⰰ 戀甀琀 漀渀氀礀 漀渀攀 唀猀攀爀 椀猀 愀挀琀椀瘀攀氀礀 愀挀挀攀猀猀椀渀最 琀栀攀 匀漀昀琀眀愀爀攀 愀琀 愀渀礀 最椀瘀攀渀 洀漀洀攀渀琀⸀ 
•	"Concurrent Use" means the Software being actively used by, or accessible to, more than one User at the same time, regardless of the number of Software installations or physical devices. This includes, but is not limited to, situations where:਀ⴀ  䴀甀氀琀椀瀀氀攀 椀渀搀椀瘀椀搀甀愀氀猀 愀爀攀 氀漀最最攀搀 椀渀琀漀 愀渀搀 椀渀琀攀爀愀挀琀椀渀最 眀椀琀栀 琀栀攀 匀漀昀琀眀愀爀攀 昀爀漀洀 搀椀昀昀攀爀攀渀琀 挀漀洀瀀甀琀攀爀猀 猀椀洀甀氀琀愀渀攀漀甀猀氀礀⸀ 
-  Multiple individuals are accessing or interacting with the Software via a shared server, virtual desktop infrastructure (VDI), or cloud environment concurrently.਀ⴀ  吀栀攀 匀漀昀琀眀愀爀攀 椀猀 椀渀猀琀愀氀氀攀搀 漀渀 愀 猀攀爀瘀攀爀 愀渀搀 愀挀挀攀猀猀攀搀 戀礀 洀甀氀琀椀瀀氀攀 挀氀椀攀渀琀猀 漀爀 甀猀攀爀猀 愀琀 琀栀攀 猀愀洀攀 琀椀洀攀⸀ 
•	"Multi-User Environment" refers to any setup where the Software is deployed or configured to enable, facilitate, or support access or use by more than one User, whether simultaneously or sequentially, for shared or collaborative purposes, or in a manner that allows for the pooling or sharing of Software functionality among multiple Users. This includes, but is not limited to, network installations, terminal server deployments, or cloud-based shared instances.਀∀ठ∀倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀∀ 洀攀愀渀猀 愀渀礀 猀礀猀琀攀洀Ⰰ 猀攀爀瘀攀爀Ⰰ 漀爀 挀漀渀昀椀最甀爀愀琀椀漀渀 眀栀攀爀攀 琀栀攀 匀漀昀琀眀愀爀攀 椀猀 甀猀攀搀 琀漀 瀀爀漀挀攀猀猀 氀椀瘀攀 搀愀琀愀Ⰰ 猀甀瀀瀀漀爀琀 爀攀愀氀ⴀ眀漀爀氀搀 漀瀀攀爀愀琀椀漀渀猀Ⰰ 漀爀 瀀爀漀瘀椀搀攀 猀攀爀瘀椀挀攀猀 琀漀 攀渀搀ⴀ甀猀攀爀猀 ⠀椀渀琀攀爀渀愀氀 漀爀 攀砀琀攀爀渀愀氀⤀ 眀栀漀 愀爀攀 渀漀琀 搀椀爀攀挀琀氀礀 椀渀瘀漀氀瘀攀搀 椀渀 琀栀攀 搀攀瘀攀氀漀瀀洀攀渀琀Ⰰ 琀攀猀琀椀渀最Ⰰ 漀爀 攀瘀愀氀甀愀琀椀漀渀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀⸀ 
•	"Non-Production Environment" means any system, server, or configuration where the Software is used solely for development, testing, quality assurance, staging, demonstration, or training purposes, and does not process live data or provide services to production end-users.਀㈀⸀ 䰀椀挀攀渀猀攀 䜀爀愀渀琀猀 
•	2.1 Evaluation & Development Use License (Free): The Licensor grants you a non-exclusive, non-transferable, limited license to use the Software free of charge for evaluation, development, testing, quality assurance, staging, and demonstration purposes only. This license is perpetual and not time-bound. Use under this license is restricted to a Non-Production Environment and may not be used for any commercial purpose or in a Production Environment. Any number of Users may access the Software within a Non-Production Environment for these defined purposes. This license does not require a per-Database Instance fee for Non-Production Environments.਀∀ठ㈀⸀㈀ 匀椀渀最氀攀ⴀ唀猀攀爀 䔀渀瘀椀爀漀渀洀攀渀琀 䰀椀挀攀渀猀攀 ⠀䘀爀攀攀⤀㨀 匀甀戀樀攀挀琀 琀漀 琀栀攀 琀攀爀洀猀 愀渀搀 挀漀渀搀椀琀椀漀渀猀 漀昀 琀栀椀猀 䄀最爀攀攀洀攀渀琀Ⰰ 琀栀攀 䰀椀挀攀渀猀漀爀 最爀愀渀琀猀 礀漀甀 愀 渀漀渀ⴀ攀砀挀氀甀猀椀瘀攀Ⰰ 渀漀渀ⴀ琀爀愀渀猀昀攀爀愀戀氀攀Ⰰ 氀椀洀椀琀攀搀 氀椀挀攀渀猀攀 琀漀 甀猀攀 琀栀攀 匀漀昀琀眀愀爀攀 猀漀氀攀氀礀 昀漀爀 甀猀攀 漀渀 愀 猀椀渀最氀攀 挀漀洀瀀甀琀攀爀 眀椀琀栀椀渀 愀 匀椀渀最氀攀 唀猀攀爀 䌀漀渀琀攀砀琀Ⰰ 眀栀攀琀栀攀爀 昀漀爀 瀀攀爀猀漀渀愀氀 漀爀 挀漀洀洀攀爀挀椀愀氀 甀猀攀⸀  吀栀椀猀 氀椀挀攀渀猀攀 愀瀀瀀氀椀攀猀 漀渀氀礀 眀栀攀渀 琀栀攀 匀漀昀琀眀愀爀攀 椀猀 挀漀渀渀攀挀琀攀搀 琀漀 漀渀攀 ⠀㄀⤀ 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀⸀ 䘀漀爀 琀栀攀 愀瘀漀椀搀愀渀挀攀 漀昀 搀漀甀戀琀Ⰰ ✀✀猀椀渀最氀攀 挀漀洀瀀甀琀攀爀✀✀ 洀攀愀渀猀 愀 搀攀瘀椀挀攀 漀渀 眀栀椀挀栀 琀栀攀 匀漀昀琀眀愀爀攀 椀猀 椀渀猀琀愀氀氀攀搀 愀渀搀 愀挀挀攀猀猀攀搀 戀礀 漀渀攀 栀甀洀愀渀 甀猀攀爀 愀琀 愀 琀椀洀攀Ⰰ 攀瘀攀渀 椀昀 琀栀愀琀 搀攀瘀椀挀攀 猀甀瀀瀀漀爀琀猀 洀甀氀琀椀瀀氀攀 甀猀攀爀 愀挀挀漀甀渀琀猀 漀爀 瀀爀漀昀椀氀攀猀⸀ 吀栀椀猀 氀椀挀攀渀猀攀 攀砀瀀爀攀猀猀氀礀 攀砀挀氀甀搀攀猀 愀渀礀 昀漀爀洀 漀昀 䌀漀渀挀甀爀爀攀渀琀 唀猀攀 漀爀 甀猀攀 椀渀 愀 䴀甀氀琀椀ⴀ唀猀攀爀 䔀渀瘀椀爀漀渀洀攀渀琀⸀ 
•	2.3 Commercial / Production Use License (Paid - Per Database Instance): A separate paid license is required for any use of the Software in a Production Environment. For each Database Instance connected to and utilised by the Software in a Production Environment, a distinct Commercial / Production Use License must be purchased.  For virtualised or containerised deployments, each distinct logical database instance constitutes a separate Database Instance and requires a separate license.  Once a Commercial / Production Use License is acquired for a specific Database Instance, there are no restrictions on the number of Users who may concurrently or sequentially access and use the Software in conjunction with that licensed Database Instance. This license permits Concurrent Use and use in a Multi-User Environment for the specified Database Instance. The terms and conditions for such licenses, including pricing and purchase, are available at silkwoodsoftware.com.਀∀ठ㈀⸀㐀 唀瀀最爀愀搀攀猀㨀 䄀 瀀愀椀搀 氀椀挀攀渀猀攀 最爀愀渀琀猀 琀栀攀 甀猀攀爀 琀栀攀 爀椀最栀琀 琀漀 愀氀氀 昀甀琀甀爀攀 爀攀氀攀愀猀攀猀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀 ⠀椀渀挀氀甀搀椀渀最 洀愀樀漀爀 爀攀氀攀愀猀攀猀Ⰰ 洀椀渀漀爀 甀瀀搀愀琀攀猀Ⰰ 愀渀搀 瀀愀琀挀栀攀猀⤀⸀  吀栀椀猀 爀椀最栀琀 愀瀀瀀氀椀攀猀 攀砀挀氀甀猀椀瘀攀氀礀 琀漀 琀栀攀 䴀椀挀爀漀猀漀昀琀 匀儀䰀 匀攀爀瘀攀爀 瘀攀爀猀椀漀渀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀 爀甀渀渀椀渀最 漀渀 琀栀攀 䴀椀挀爀漀猀漀昀琀 圀椀渀搀漀眀猀 漀瀀攀爀愀琀椀渀最 猀礀猀琀攀洀⸀  吀栀椀猀 氀椀挀攀渀猀攀 搀漀攀猀 渀漀琀 最爀愀渀琀 爀椀最栀琀猀 琀漀 瘀攀爀猀椀漀渀猀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀 搀攀瘀攀氀漀瀀攀搀 昀漀爀 搀椀昀昀攀爀攀渀琀 搀愀琀愀戀愀猀攀 攀渀最椀渀攀猀Ⰰ 搀椀昀昀攀爀攀渀琀 漀瀀攀爀愀琀椀渀最 猀礀猀琀攀洀猀 漀爀 昀甀渀搀愀洀攀渀琀愀氀氀礀 搀椀昀昀攀爀攀渀琀 搀攀氀椀瘀攀爀礀 漀爀 瀀氀愀琀昀漀爀洀 洀漀搀攀氀猀 ⠀猀甀挀栀 愀猀 猀漀昀琀眀愀爀攀ⴀ愀猀ⴀ愀ⴀ猀攀爀瘀椀挀攀⤀⸀ 圀栀椀氀攀 琀栀椀猀 氀椀挀攀渀猀攀 椀渀挀氀甀搀攀猀 爀椀最栀琀猀 琀漀 愀氀氀 昀甀琀甀爀攀 猀漀昀琀眀愀爀攀 甀瀀搀愀琀攀猀Ⰰ 椀琀 搀漀攀猀 渀漀琀 椀渀挀氀甀搀攀 琀攀挀栀渀椀挀愀氀 猀甀瀀瀀漀爀琀 漀爀 挀漀渀猀甀氀琀椀渀最 猀攀爀瘀椀挀攀猀 椀渀 愀渀礀 昀漀爀洀⸀ 
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 add any number of FILESTREAM folders.਀   ⴀ 夀漀甀 洀愀礀 洀漀搀椀昀礀 琀栀攀 匀漀昀琀眀愀爀攀 猀漀氀攀氀礀 琀漀㨀 
(a) Maintain operational compatibility with changes to Microsoft SQL Server, including but not limited to deprecated functions, syntax changes, or feature removals introduced in newer versions of SQL Server; or ਀⠀戀⤀ 䄀搀搀爀攀猀猀 愀 匀攀挀甀爀椀琀礀 嘀甀氀渀攀爀愀戀椀氀椀琀礀 琀栀愀琀 瀀漀猀攀猀 愀渀 椀洀洀攀搀椀愀琀攀 愀渀搀 洀愀琀攀爀椀愀氀 爀椀猀欀 琀漀 琀栀攀 挀漀渀昀椀搀攀渀琀椀愀氀椀琀礀Ⰰ 椀渀琀攀最爀椀琀礀Ⰰ 漀爀 愀瘀愀椀氀愀戀椀氀椀琀礀 漀昀 礀漀甀爀 搀愀琀愀 漀爀 猀礀猀琀攀洀猀⸀ 
"Security Vulnerability" means a defect in the Software that, if exploited, would allow unauthorised access to data, unauthorised modification of data, denial of service, execution of arbitrary code, or exploitation of functionality in a manner not intended by the documented business rules (such as bypassing access controls, manipulating data validation logic or permission filtering). It does not include performance issues, usability concerns, or theoretical vulnerabilities that require physical access to the database server or pre-existing administrative credentials, or perceived vulnerabilities that are inherent to documented intended functionality of the Software.਀䄀渀礀 洀漀搀椀昀椀挀愀琀椀漀渀猀 洀甀猀琀 戀攀 氀椀洀椀琀攀搀 琀漀 琀栀漀猀攀 猀琀爀椀挀琀氀礀 渀攀挀攀猀猀愀爀礀 琀漀 瀀爀攀猀攀爀瘀攀 琀栀攀 匀漀昀琀眀愀爀攀✀✀猀 攀砀椀猀琀椀渀最 昀甀渀挀琀椀漀渀愀氀椀琀礀 漀爀 洀椀琀椀最愀琀攀 琀栀攀 椀搀攀渀琀椀昀椀攀搀 瘀甀氀渀攀爀愀戀椀氀椀琀礀⸀ 夀漀甀 洀愀礀 渀漀琀 愀搀搀 昀攀愀琀甀爀攀猀Ⰰ 愀氀琀攀爀 戀甀猀椀渀攀猀猀 氀漀最椀挀 甀渀爀攀氀愀琀攀搀 琀漀 琀栀攀 瘀甀氀渀攀爀愀戀椀氀椀琀礀Ⰰ 漀爀 挀栀愀渀最攀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀⸀ 
You retain ownership of any modifications created under this section.  By creating such modifications, you grant the Licensor a perpetual, irrevocable, royalty-free, worldwide license to use, modify, and distribute your modifications in connection with the Software.਀䤀昀 礀漀甀 洀漀搀椀昀礀 琀栀攀 匀漀昀琀眀愀爀攀 琀漀 愀搀搀爀攀猀猀 愀 匀攀挀甀爀椀琀礀 嘀甀氀渀攀爀愀戀椀氀椀琀礀Ⰰ 礀漀甀 愀爀攀 攀渀挀漀甀爀愀最攀搀 戀甀琀 渀漀琀 爀攀焀甀椀爀攀搀 琀漀 渀漀琀椀昀礀 琀栀攀 䰀椀挀攀渀猀漀爀 漀昀 琀栀攀 瘀甀氀渀攀爀愀戀椀氀椀琀礀 愀渀搀 瀀爀漀瘀椀搀攀 搀攀琀愀椀氀猀 漀昀 礀漀甀爀 昀椀砀⸀ 吀栀攀 䰀椀挀攀渀猀漀爀 眀椀氀氀 洀愀欀攀 爀攀愀猀漀渀愀戀氀攀 攀昀昀漀爀琀猀 琀漀 瀀爀漀瘀椀搀攀 愀渀 漀昀昀椀挀椀愀氀 瀀愀琀挀栀 昀漀爀 爀攀瀀漀爀琀攀搀 瘀甀氀渀攀爀愀戀椀氀椀琀椀攀猀 戀甀琀 椀猀 甀渀搀攀爀 渀漀 漀戀氀椀最愀琀椀漀渀 琀漀 搀漀 猀漀 眀椀琀栀椀渀 愀渀礀 猀瀀攀挀椀昀椀挀 琀椀洀攀昀爀愀洀攀⸀ 
Any modified version of the Software is used entirely at your own risk. The Licensor''s warranty and support obligations under this Agreement do not extend to any Software instance that has been modified by you or any third party on your behalf.਀∀ठ夀漀甀 洀愀礀 渀漀琀 洀漀搀椀昀礀 漀爀 搀攀氀攀琀攀 琀栀攀 挀漀渀琀攀渀琀猀 漀爀 搀攀昀椀渀椀琀椀漀渀猀 漀昀 䔀砀琀攀渀搀攀搀 倀爀漀瀀攀爀琀椀攀猀 漀爀 琀栀攀 怀攀甀氀愀怀 琀愀戀氀攀⸀ 
•	You may not grant any application or service direct permissions on the underlying database schema objects (including tables, views, or internal functions). ਀∀ठ夀漀甀 洀愀礀 渀漀琀 戀礀瀀愀猀猀Ⰰ 搀椀猀愀戀氀攀Ⰰ 漀爀 漀琀栀攀爀眀椀猀攀 挀椀爀挀甀洀瘀攀渀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 爀漀氀攀ⴀ戀愀猀攀搀 愀挀挀攀猀猀 挀漀渀琀爀漀氀 洀漀搀攀氀Ⰰ 甀渀搀攀爀 眀栀椀挀栀 愀瀀瀀氀椀挀愀琀椀漀渀 愀挀挀攀猀猀 琀漀 搀愀琀愀 椀猀 瀀攀爀洀椀琀琀攀搀 漀渀氀礀 琀栀爀漀甀最栀 琀栀攀 攀砀攀挀甀琀椀漀渀 漀昀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 瘀椀愀 瀀攀爀洀椀猀猀椀漀渀猀 最爀愀渀琀攀搀 琀漀 愀瀀瀀氀椀挀愀琀椀漀渀 爀漀氀攀猀⸀ 
•	Administrative users may retain sufficient privileges for system configuration and maintenance purposes (such as setup, data configuration, backups or performance tuning), but they must not configure any user, application, or service to bypass the application role enforcement model described herein.  Any deviation from this model constitutes a breach of this Agreement and may compromise the security framework upon which the Software relies.਀∀ठ夀漀甀 洀愀礀 渀漀琀 爀攀洀漀瘀攀 漀爀 愀氀琀攀爀 愀渀礀 挀漀瀀礀爀椀最栀琀Ⰰ 琀爀愀搀攀洀愀爀欀Ⰰ 漀爀 漀琀栀攀爀 瀀爀漀瀀爀椀攀琀愀爀礀 渀漀琀椀挀攀猀 昀爀漀洀 琀栀攀 匀漀昀琀眀愀爀攀 漀爀 椀琀猀 搀漀挀甀洀攀渀琀愀琀椀漀渀⸀ 
•	The free Evaluation & Development Use License (Section 2.1) explicitly prohibits use in a Production Environment for any purpose.਀∀ठ夀漀甀 猀栀愀氀氀 洀愀椀渀琀愀椀渀 愀渀 愀挀挀甀爀愀琀攀Ⰰ 挀漀洀瀀氀攀琀攀 愀渀搀 甀瀀ⴀ琀漀ⴀ搀愀琀攀 氀椀猀琀 漀昀 愀氀氀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀猀 琀漀 眀栀椀挀栀 愀 瀀愀椀搀 氀椀挀攀渀猀攀 椀猀 愀瀀瀀氀椀挀愀戀氀攀⸀  匀甀挀栀 爀攀挀漀爀搀猀 猀栀愀氀氀 椀渀挀氀甀搀攀 琀栀攀 攀渀瘀椀爀漀渀洀攀渀琀 琀礀瀀攀Ⰰ 搀愀琀愀戀愀猀攀 栀漀猀琀 氀漀挀愀琀椀漀渀Ⰰ 愀渀搀 搀愀琀攀 漀昀 椀渀猀琀愀氀氀愀琀椀漀渀 昀漀爀 攀愀挀栀 椀渀猀琀愀渀挀攀⸀ 夀漀甀 猀栀愀氀氀 爀攀琀愀椀渀 琀栀攀猀攀 爀攀挀漀爀搀猀 昀漀爀 琀栀攀 搀甀爀愀琀椀漀渀 漀昀 琀栀攀 氀椀挀攀渀猀攀 琀攀爀洀 愀渀搀 昀漀爀 愀 瀀攀爀椀漀搀 漀昀 漀渀攀 ⠀㄀⤀ 礀攀愀爀 琀栀攀爀攀愀昀琀攀爀⸀  匀甀挀栀 爀攀挀漀爀搀猀 猀栀愀氀氀 戀攀 洀愀搀攀 愀瘀愀椀氀愀戀氀攀 琀漀 琀栀攀 䰀椀挀攀渀猀漀爀 漀爀 愀甀琀栀漀爀椀猀攀搀 爀攀瀀爀攀猀攀渀琀愀琀椀瘀攀 昀漀爀 愀甀搀椀琀椀渀最 瀀甀爀瀀漀猀攀猀⸀   
4. Ownership਀吀栀攀 匀漀昀琀眀愀爀攀 椀猀 氀椀挀攀渀猀攀搀Ⰰ 渀漀琀 猀漀氀搀⸀ 䄀氀氀 椀渀琀攀氀氀攀挀琀甀愀氀 瀀爀漀瀀攀爀琀礀 爀椀最栀琀猀 椀渀 愀渀搀 琀漀 琀栀攀 匀漀昀琀眀愀爀攀Ⰰ 椀渀挀氀甀搀椀渀最 挀漀瀀礀爀椀最栀琀猀Ⰰ 琀爀愀搀攀洀愀爀欀猀Ⰰ 愀渀搀 琀爀愀搀攀 猀攀挀爀攀琀猀Ⰰ 爀攀洀愀椀渀 眀椀琀栀 琀栀攀 䰀椀挀攀渀猀漀爀⸀ 夀漀甀 愀挀欀渀漀眀氀攀搀最攀 琀栀愀琀 礀漀甀 搀漀 渀漀琀 愀挀焀甀椀爀攀 愀渀礀 漀眀渀攀爀猀栀椀瀀 爀椀最栀琀猀 戀礀 搀漀眀渀氀漀愀搀椀渀最Ⰰ 椀渀猀琀愀氀氀椀渀最Ⰰ 漀爀 甀猀椀渀最 琀栀攀 匀漀昀琀眀愀爀攀⸀ 
5. Disclaimer of Warranty਀吀䠀䔀 匀伀䘀吀圀䄀刀䔀 䤀匀 倀刀伀嘀䤀䐀䔀䐀 ∀䄀匀 䤀匀Ⰰ∀ 圀䤀吀䠀伀唀吀 圀䄀刀刀䄀一吀夀 伀䘀 䄀一夀 䬀䤀一䐀Ⰰ 䔀堀倀刀䔀匀匀 伀刀 䤀䴀倀䰀䤀䔀䐀Ⰰ 䤀一䌀䰀唀䐀䤀一䜀 䈀唀吀 一伀吀 䰀䤀䴀䤀吀䔀䐀 吀伀 吀䠀䔀 圀䄀刀刀䄀一吀䤀䔀匀 伀䘀 䴀䔀刀䌀䠀䄀一吀䄀䈀䤀䰀䤀吀夀Ⰰ 䘀䤀吀一䔀匀匀 䘀伀刀 䄀 倀䄀刀吀䤀䌀唀䰀䄀刀 倀唀刀倀伀匀䔀Ⰰ 䄀一䐀 一伀一䤀一䘀刀䤀一䜀䔀䴀䔀一吀⸀ 䤀一 一伀 䔀嘀䔀一吀 匀䠀䄀䰀䰀 吀䠀䔀 䰀䤀䌀䔀一匀伀刀 䈀䔀 䰀䤀䄀䈀䰀䔀 䘀伀刀 䄀一夀 䌀䰀䄀䤀䴀Ⰰ 䐀䄀䴀䄀䜀䔀匀Ⰰ 伀刀 伀吀䠀䔀刀 䰀䤀䄀䈀䤀䰀䤀吀夀Ⰰ 圀䠀䔀吀䠀䔀刀 䤀一 䄀一 䄀䌀吀䤀伀一 伀䘀 䌀伀一吀刀䄀䌀吀Ⰰ 吀伀刀吀Ⰰ 伀刀 伀吀䠀䔀刀圀䤀匀䔀Ⰰ 䄀刀䤀匀䤀一䜀 䘀刀伀䴀Ⰰ 伀唀吀 伀䘀Ⰰ 伀刀 䤀一 䌀伀一一䔀䌀吀䤀伀一 圀䤀吀䠀 吀䠀䔀 匀伀䘀吀圀䄀刀䔀 伀刀 吀䠀䔀 唀匀䔀 伀刀 伀吀䠀䔀刀 䐀䔀䄀䰀䤀一䜀匀 䤀一 吀䠀䔀 匀伀䘀吀圀䄀刀䔀⸀ 
6. Limitation of Liability਀吀伀 吀䠀䔀 䴀䄀堀䤀䴀唀䴀 䔀堀吀䔀一吀 倀䔀刀䴀䤀吀吀䔀䐀 䈀夀 䄀倀倀䰀䤀䌀䄀䈀䰀䔀 䰀䄀圀Ⰰ 䤀一 一伀 䔀嘀䔀一吀 匀䠀䄀䰀䰀 吀䠀䔀 䰀䤀䌀䔀一匀伀刀 䈀䔀 䰀䤀䄀䈀䰀䔀 䘀伀刀 䄀一夀 䤀一䐀䤀刀䔀䌀吀Ⰰ 䤀一䌀䤀䐀䔀一吀䄀䰀Ⰰ 匀倀䔀䌀䤀䄀䰀Ⰰ 䌀伀一匀䔀儀唀䔀一吀䤀䄀䰀Ⰰ 伀刀 倀唀一䤀吀䤀嘀䔀 䐀䄀䴀䄀䜀䔀匀Ⰰ 伀刀 䄀一夀 䰀伀匀匀 伀䘀 倀刀伀䘀䤀吀匀 伀刀 刀䔀嘀䔀一唀䔀匀Ⰰ 圀䠀䔀吀䠀䔀刀 䤀一䌀唀刀刀䔀䐀 䐀䤀刀䔀䌀吀䰀夀 伀刀 䤀一䐀䤀刀䔀䌀吀䰀夀Ⰰ 伀刀 䄀一夀 䰀伀匀匀 伀䘀 䐀䄀吀䄀Ⰰ 唀匀䔀Ⰰ 䜀伀伀䐀圀䤀䰀䰀Ⰰ 伀刀 伀吀䠀䔀刀 䤀一吀䄀一䜀䤀䈀䰀䔀 䰀伀匀匀䔀匀Ⰰ 刀䔀匀唀䰀吀䤀一䜀 䘀刀伀䴀 ⠀䄀⤀ 夀伀唀刀 䄀䌀䌀䔀匀匀 吀伀 伀刀 唀匀䔀 伀䘀 伀刀 䤀一䄀䈀䤀䰀䤀吀夀 吀伀 䄀䌀䌀䔀匀匀 伀刀 唀匀䔀 吀䠀䔀 匀伀䘀吀圀䄀刀䔀㬀 ⠀䈀⤀ 䄀一夀 䌀伀一䐀唀䌀吀 伀刀 䌀伀一吀䔀一吀 伀䘀 䄀一夀 吀䠀䤀刀䐀 倀䄀刀吀夀 伀一 吀䠀䔀 匀伀䘀吀圀䄀刀䔀㬀 ⠀䌀⤀ 䄀一夀 䌀伀一吀䔀一吀 伀䈀吀䄀䤀一䔀䐀 䘀刀伀䴀 吀䠀䔀 匀伀䘀吀圀䄀刀䔀㬀 䄀一䐀 ⠀䐀⤀ 唀一䄀唀吀䠀伀刀䤀匀䔀䐀 䄀䌀䌀䔀匀匀Ⰰ 唀匀䔀Ⰰ 伀刀 䄀䰀吀䔀刀䄀吀䤀伀一 伀䘀 夀伀唀刀 吀刀䄀一匀䴀䤀匀匀䤀伀一匀 伀刀 䌀伀一吀䔀一吀Ⰰ 圀䠀䔀吀䠀䔀刀 䈀䄀匀䔀䐀 伀一 圀䄀刀刀䄀一吀夀Ⰰ 䌀伀一吀刀䄀䌀吀Ⰰ 吀伀刀吀 ⠀䤀一䌀䰀唀䐀䤀一䜀 一䔀䜀䰀䤀䜀䔀一䌀䔀⤀Ⰰ 伀刀 䄀一夀 伀吀䠀䔀刀 䰀䔀䜀䄀䰀 吀䠀䔀伀刀夀Ⰰ 圀䠀䔀吀䠀䔀刀 伀刀 一伀吀 圀䔀 䠀䄀嘀䔀 䈀䔀䔀一 䤀一䘀伀刀䴀䔀䐀 伀䘀 吀䠀䔀 倀伀匀匀䤀䈀䤀䰀䤀吀夀 伀䘀 匀唀䌀䠀 䐀䄀䴀䄀䜀䔀Ⰰ 䄀一䐀 䔀嘀䔀一 䤀䘀 䄀 刀䔀䴀䔀䐀夀 匀䔀吀 䘀伀刀吀䠀 䠀䔀刀䔀䤀一 䤀匀 䘀伀唀一䐀 吀伀 䠀䄀嘀䔀 䘀䄀䤀䰀䔀䐀 伀䘀 䤀吀匀 䔀匀匀䔀一吀䤀䄀䰀 倀唀刀倀伀匀䔀⸀ 
7. Termination਀吀栀椀猀 䄀最爀攀攀洀攀渀琀 椀猀 攀昀昀攀挀琀椀瘀攀 甀渀琀椀氀 琀攀爀洀椀渀愀琀攀搀⸀ 夀漀甀爀 爀椀最栀琀猀 甀渀搀攀爀 琀栀椀猀 䄀最爀攀攀洀攀渀琀 眀椀氀氀 琀攀爀洀椀渀愀琀攀 愀甀琀漀洀愀琀椀挀愀氀氀礀 眀椀琀栀漀甀琀 渀漀琀椀挀攀 昀爀漀洀 琀栀攀 䰀椀挀攀渀猀漀爀 椀昀 礀漀甀 昀愀椀氀 琀漀 挀漀洀瀀氀礀 眀椀琀栀 愀渀礀 漀昀 椀琀猀 琀攀爀洀猀⸀ 唀瀀漀渀 琀攀爀洀椀渀愀琀椀漀渀Ⰰ 礀漀甀 洀甀猀琀 挀攀愀猀攀 愀氀氀 甀猀攀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀⸀ 
8. Governing Law਀吀栀椀猀 䄀最爀攀攀洀攀渀琀 猀栀愀氀氀 戀攀 最漀瘀攀爀渀攀搀 戀礀 愀渀搀 挀漀渀猀琀爀甀攀搀 椀渀 愀挀挀漀爀搀愀渀挀攀 眀椀琀栀 琀栀攀 氀愀眀猀 漀昀 儀甀攀攀渀猀氀愀渀搀 䄀甀猀琀爀愀氀椀愀⸀ 
9. Entire Agreement਀吀栀椀猀 䄀最爀攀攀洀攀渀琀 挀漀渀猀琀椀琀甀琀攀猀 琀栀攀 攀渀琀椀爀攀 愀最爀攀攀洀攀渀琀 戀攀琀眀攀攀渀 礀漀甀 愀渀搀 琀栀攀 䰀椀挀攀渀猀漀爀 爀攀最愀爀搀椀渀最 琀栀攀 匀漀昀琀眀愀爀攀 愀渀搀 猀甀瀀攀爀猀攀搀攀猀 愀氀氀 瀀爀椀漀爀 愀渀搀 挀漀渀琀攀洀瀀漀爀愀渀攀漀甀猀 甀渀搀攀爀猀琀愀渀搀椀渀最猀Ⰰ 愀最爀攀攀洀攀渀琀猀Ⰰ 爀攀瀀爀攀猀攀渀琀愀琀椀漀渀猀Ⰰ 愀渀搀 眀愀爀爀愀渀琀椀攀猀Ⰰ 戀漀琀栀 眀爀椀琀琀攀渀 愀渀搀 漀爀愀氀Ⰰ 爀攀最愀爀搀椀渀最 猀甀挀栀 猀甀戀樀攀挀琀 洀愀琀琀攀爀⸀ 
', CAST(N'2026-05-09' AS Date), N'Current', CAST(N'2026-05-09T14:01:22.4410424' AS DateTime2), N'Right to modify clause added.  Upgrades clause 2.4 added.')਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀攀甀氀愀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀Ⰰ 嬀昀椀氀攀渀愀洀攀崀Ⰰ 嬀挀漀渀琀攀渀琀开栀愀猀栀崀Ⰰ 嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀崀Ⰰ 嬀昀椀氀攀开猀椀稀攀崀Ⰰ 嬀挀爀攀愀琀攀搀崀Ⰰ 嬀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀崀Ⰰ 嬀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀崀Ⰰ 嬀爀攀琀攀渀琀椀漀渀开搀愀琀攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　Ⰰ 一✀圀栀愀琀 椀猀 愀 䌀漀渀琀爀漀氀氀攀搀 䐀漀挀甀洀攀渀琀⸀瀀搀昀✀Ⰰ 　砀　䈀㤀㄀㠀䘀㐀䌀㐀䔀㄀㄀䌀㔀㐀㜀㌀㄀㜀䐀䘀䐀䄀䐀㐀　䌀㘀㠀　䔀㤀䄀㘀䄀䘀䄀䐀䄀㄀　䄀　䔀䄀㘀㘀䈀䈀䐀㔀䔀㠀㌀䄀䔀䘀㘀㜀㌀㈀䄀䌀㜀Ⰰ 一唀䰀䰀Ⰰ ㈀　㄀㔀㐀㄀Ⰰ 䌀䄀匀吀⠀一✀㈀　㈀㘀ⴀ　㌀ⴀ　㠀吀㄀㜀㨀㌀　㨀㈀㈀⸀㘀㐀㠀㘀㄀㘀㔀✀ 䄀匀 䐀愀琀攀吀椀洀攀㈀⤀Ⰰ 一✀✀Ⰰ 　Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀崀 ⠀嬀昀椀氀攀开椀搀崀Ⰰ 嬀瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　Ⰰ 一✀㄀਀䘀唀一䐀䄀䴀䔀一吀䄀䰀匀 伀䘀 䌀伀一吀刀伀䰀䰀䔀䐀 䐀伀䌀唀䴀䔀一吀 ਀䴀䄀一䄀䜀䔀䴀䔀一吀਀圀䠀䄀吀 䤀匀 䄀 䌀伀一吀刀伀䰀䰀䔀䐀 䐀伀䌀唀䴀䔀一吀਀䌀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 栀愀瘀攀 挀栀愀爀愀挀琀攀爀椀猀琀椀挀猀 琀栀愀琀 搀椀昀昀攀爀攀渀琀椀愀琀攀 琀栀攀洀 昀爀漀洀 漀琀栀攀爀 琀礀瀀攀猀 漀昀 ਀搀漀挀甀洀攀渀琀猀⸀ 吀栀攀 洀愀渀愀最攀洀攀渀琀 漀昀 琀栀攀猀攀 琀礀瀀攀猀 漀昀 搀漀挀甀洀攀渀琀猀 愀爀攀 最漀瘀攀爀渀攀搀 戀礀 猀琀爀椀挀琀 爀甀氀攀猀Ⰰ ਀漀昀琀攀渀 搀椀挀琀愀琀攀搀 戀礀 爀攀最甀氀愀琀漀爀礀 漀爀 挀漀洀瀀氀椀愀渀挀攀 漀戀氀椀最愀琀椀漀渀猀⸀ 䔀砀愀洀瀀氀攀猀 漀昀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 ਀椀渀挀氀甀搀攀 猀琀愀渀搀愀爀搀猀Ⰰ 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 瀀漀氀椀挀椀攀猀⸀਀吀栀攀 昀漀氀氀漀眀椀渀最 愀爀攀 琀礀瀀椀挀愀氀 欀攀礀 挀栀愀爀愀挀琀攀爀椀猀琀椀挀猀 漀昀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀⸀਀㄀⸀ 刀攀瘀椀攀眀 愀渀搀 愀瀀瀀爀漀瘀愀氀⸀ 䄀氀氀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 愀爀攀 猀甀戀樀攀挀琀攀搀 琀漀 爀攀瘀椀攀眀 愀渀搀 ਀愀瀀瀀爀漀瘀愀氀⸀ 䄀 搀漀挀甀洀攀渀琀 洀甀猀琀 戀攀 昀漀爀洀愀氀氀礀 愀瀀瀀爀漀瘀攀搀 戀攀昀漀爀攀 椀琀 挀愀渀 戀攀 爀攀氀攀愀猀攀搀 愀渀搀 ਀甀猀攀搀⸀਀㈀⸀ 䘀漀爀洀愀氀 椀猀猀甀愀渀挀攀 愀渀搀 眀椀琀栀搀爀愀眀愀氀⸀ 䌀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 愀爀攀 昀漀爀洀愀氀氀礀 椀猀猀甀攀搀 昀漀爀 ਀甀猀攀Ⰰ 愀渀搀 眀椀琀栀搀爀愀眀渀 昀爀漀洀 甀猀攀 眀栀攀渀 渀漀 氀漀渀最攀爀 瘀愀氀椀搀⸀ ਀㌀⸀ 䌀甀爀爀攀渀挀礀 猀琀愀琀甀猀 愀渀搀 搀椀猀琀爀椀戀甀琀椀漀渀 挀漀渀琀爀漀氀⸀ 䄀氀氀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 洀甀猀琀 栀愀瘀攀 愀 ਀挀甀爀爀攀渀挀礀 猀琀愀琀甀猀⸀ 吀栀愀琀 椀猀Ⰰ 愀 搀漀挀甀洀攀渀琀 洀愀礀 栀愀瘀攀 愀 猀琀愀琀甀猀 漀昀 挀甀爀爀攀渀琀Ⰰ 猀甀瀀攀爀猀攀搀攀搀Ⰰ ਀漀戀猀漀氀攀琀攀 漀爀 挀愀渀挀攀氀氀攀搀 昀漀爀 攀砀愀洀瀀氀攀⸀ 䌀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 琀栀愀琀 愀爀攀 渀漀 氀漀渀最攀爀 挀甀爀爀攀渀琀 ਀洀甀猀琀 戀攀 眀椀琀栀搀爀愀眀渀 昀爀漀洀 甀猀攀 猀漀 琀栀愀琀 琀栀攀礀 愀爀攀 渀漀琀 椀渀愀搀瘀攀爀琀攀渀琀氀礀 甀猀攀搀⸀਀㐀⸀ 䤀猀猀甀攀 栀椀猀琀漀爀礀⸀ 䐀椀昀昀攀爀攀渀琀 椀猀猀甀攀猀 漀爀 爀攀氀攀愀猀攀猀 漀昀 愀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀 洀甀猀琀 戀攀 ਀甀渀椀焀甀攀氀礀 椀搀攀渀琀椀昀椀攀搀 ⠀攀⸀最⸀ 眀椀琀栀 愀 爀攀瘀椀猀椀漀渀 漀爀 瘀攀爀猀椀漀渀 渀甀洀戀攀爀⤀⸀ ਀㔀⸀ 䐀椀爀攀挀琀椀瘀攀 愀甀琀栀漀爀椀琀礀⸀ 䌀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀Ⰰ 猀甀挀栀 愀猀 猀琀愀渀搀愀爀搀 漀瀀攀爀愀琀椀渀最 ਀瀀爀漀挀攀搀甀爀攀猀 昀漀爀 攀砀愀洀瀀氀攀Ⰰ 琀礀瀀椀挀愀氀氀礀 挀愀爀爀礀 搀椀爀攀挀琀椀瘀攀 愀甀琀栀漀爀椀琀礀⸀ 吀栀愀琀 椀猀Ⰰ 琀栀攀 搀漀挀甀洀攀渀琀 ਀最椀瘀攀猀 椀渀猀琀爀甀挀琀椀漀渀猀 琀栀愀琀 洀甀猀琀 戀攀 昀漀氀氀漀眀攀搀⸀਀㘀⸀ 倀攀爀椀漀搀椀挀 爀攀瘀椀攀眀⸀ 䐀椀爀攀挀琀椀瘀攀 愀甀琀栀漀爀椀琀礀 琀礀瀀攀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀Ⰰ 猀甀挀栀 愀猀 ਀猀琀愀渀搀愀爀搀猀Ⰰ 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 瀀漀氀椀挀椀攀猀Ⰰ 洀甀猀琀 戀攀 爀攀瘀椀攀眀攀搀 漀渀 愀 瀀攀爀椀漀搀椀挀 猀挀栀攀搀甀氀攀 愀渀搀 ਀爀攀瘀椀猀攀搀 愀渀搀 爀攀ⴀ椀猀猀甀攀搀 愀猀 愀瀀瀀爀漀瀀爀椀愀琀攀⸀ 䔀渀最椀渀攀攀爀椀渀最 搀爀愀眀椀渀最猀 愀爀攀 愀 挀氀愀猀猀 漀昀 ਀挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀 戀甀琀 愀爀攀 最攀渀攀爀愀氀氀礀 渀漀琀 猀甀戀樀攀挀琀攀搀 琀漀 爀攀瘀椀攀眀 漀渀 愀 琀椀洀攀ⴀ戀愀猀攀搀 ਀猀挀栀攀搀甀氀攀 戀甀琀 愀爀攀 爀攀瘀椀猀攀搀 戀愀猀攀搀 漀渀 漀琀栀攀爀 琀爀椀最最攀爀猀⸀ ਀㜀⸀ 唀渀椀焀甀攀 椀搀攀渀琀椀昀椀挀愀琀椀漀渀⸀ 䌀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 洀甀猀琀 戀攀 甀渀椀焀甀攀氀礀 椀搀攀渀琀椀昀椀愀戀氀攀⸀ ਀䜀攀渀攀爀愀氀氀礀 琀栀椀猀 椀猀 瘀椀愀 愀 搀漀挀甀洀攀渀琀 䤀䐀Ⰰ 戀攀椀渀最 愀 猀琀爀椀渀最 漀昀 挀栀愀爀愀挀琀攀爀猀Ⰰ 愀 猀攀焀甀攀渀挀攀 ਀渀甀洀戀攀爀 漀爀 愀 挀漀洀戀椀渀愀琀椀漀渀 琀栀攀爀攀漀昀⸀਀䔀昀昀攀挀琀椀瘀攀氀礀 洀愀渀愀最椀渀最 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 爀攀焀甀椀爀攀猀 愀 猀礀猀琀攀洀 猀瀀攀挀椀昀椀挀愀氀氀礀 搀攀猀椀最渀攀搀 琀漀 栀愀渀搀氀攀 ਀琀栀攀猀攀 甀渀椀焀甀攀 挀栀愀爀愀挀琀攀爀椀猀琀椀挀猀⸀਀䔀匀匀䔀一吀䤀䄀䰀 刀䔀儀唀䤀刀䔀䴀䔀一吀匀 伀䘀 䄀 䌀伀一吀刀伀䰀䰀䔀䐀 䐀伀䌀唀䴀䔀一吀 ਀䴀䄀一䄀䜀䔀䴀䔀一吀 匀夀匀吀䔀䴀਀匀琀爀甀挀琀甀爀攀 愀渀搀 刀攀氀愀琀椀漀渀猀栀椀瀀猀਀吀栀攀 挀栀愀爀愀挀琀攀爀椀猀琀椀挀猀 漀昀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 搀椀挀琀愀琀攀 琀栀愀琀 琀栀攀礀 洀甀猀琀 戀攀 洀愀渀愀最攀搀 椀渀 愀 猀礀猀琀攀洀 ਀眀栀椀挀栀 栀愀猀 猀琀爀甀挀琀甀爀攀⸀ 䘀甀爀琀栀攀爀洀漀爀攀Ⰰ 琀栀攀 洀愀渀愀最攀洀攀渀琀 漀昀 爀攀氀愀琀椀漀渀猀栀椀瀀猀 戀攀琀眀攀攀渀 搀椀昀昀攀爀攀渀琀 ਀攀渀琀椀琀椀攀猀 洀甀猀琀 戀攀 攀洀戀漀搀椀攀搀 眀椀琀栀椀渀 琀栀攀 猀琀爀甀挀琀甀爀攀⸀ 䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 琀栀攀 搀椀昀昀攀爀攀渀琀 爀攀氀攀愀猀攀猀 漀昀 愀 ਀瀀愀爀琀椀挀甀氀愀爀 搀漀挀甀洀攀渀琀 愀爀攀 愀氀氀 爀攀氀愀琀攀搀 琀漀 琀栀攀 猀愀洀攀 搀漀挀甀洀攀渀琀 䤀䐀⸀ 䄀琀 琀栀攀 猀愀洀攀 琀椀洀攀Ⰰ 琀栀攀 ਀搀漀挀甀洀攀渀琀 䤀䐀 洀甀猀琀 戀攀 甀渀椀焀甀攀⸀ ਀㈀਀吀漀 攀昀昀攀挀琀椀瘀攀氀礀 洀愀渀愀最攀 琀栀攀猀攀 爀攀氀愀琀椀漀渀猀栀椀瀀猀 愀 爀漀戀甀猀琀 搀愀琀愀 洀愀渀愀最攀洀攀渀琀 瀀氀愀琀昀漀爀洀 椀猀 攀猀猀攀渀琀椀愀氀⸀ ਀刀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀猀 愀爀攀 琀栀攀 洀漀猀琀 愀瀀瀀爀漀瀀爀椀愀琀攀 瀀氀愀琀昀漀爀洀 昀漀爀 琀栀椀猀 瀀甀爀瀀漀猀攀⸀ 䄀 爀攀氀愀琀椀漀渀愀氀 ਀搀愀琀愀戀愀猀攀 渀愀琀椀瘀攀氀礀 攀渀昀漀爀挀攀猀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 愀渀搀 洀愀渀愀最攀猀 爀攀氀愀琀椀漀渀猀栀椀瀀猀⸀ 吀漀 攀昀昀攀挀琀椀瘀攀氀礀 ਀洀愀渀愀最攀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 椀渀 愀 爀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀 琀栀攀 搀愀琀愀戀愀猀攀 猀琀爀甀挀琀甀爀攀 洀甀猀琀 戀攀 ਀搀攀猀椀最渀攀搀 琀漀 洀椀爀爀漀爀 琀栀攀 爀攀愀氀ⴀ眀漀爀氀搀 猀琀爀甀挀琀甀爀攀 漀昀 栀漀眀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀猀 洀甀猀琀 戀攀 洀愀渀愀最攀搀⸀਀䐀漀挀甀洀攀渀琀 䤀搀攀渀琀椀昀椀挀愀琀椀漀渀਀䄀 昀甀渀搀愀洀攀渀琀愀氀 爀甀氀攀 漀昀 挀漀渀琀爀漀氀氀攀搀 搀漀挀甀洀攀渀琀 洀愀渀愀最攀洀攀渀琀 猀礀猀琀攀洀猀 ⠀䌀䐀䴀匀⤀ 椀猀 琀栀愀琀 攀愀挀栀 ਀搀漀挀甀洀攀渀琀 洀甀猀琀 戀攀 甀渀椀焀甀攀氀礀 椀搀攀渀琀椀昀椀攀搀⸀ 吀栀攀 䌀䐀䴀匀 洀甀猀琀 攀渀昀漀爀挀攀 琀栀攀 甀渀椀焀甀攀渀攀猀猀 漀昀 攀愀挀栀 ਀搀漀挀甀洀攀渀琀 䤀䐀⸀ 吀栀攀 洀漀猀琀 攀昀昀攀挀琀椀瘀攀 眀愀礀 琀漀 椀洀瀀氀攀洀攀渀琀 琀栀椀猀 爀攀焀甀椀爀攀洀攀渀琀 椀猀 瘀椀愀 愀 猀椀渀最氀攀 爀攀最椀猀琀攀爀 ਀漀昀 搀漀挀甀洀攀渀琀 䤀䐀猀⸀ 䠀攀渀挀攀 琀栀攀 昀椀爀猀琀 爀攀焀甀椀爀攀洀攀渀琀 漀昀 愀 䌀䐀䴀匀 椀猀 琀栀愀琀 椀琀 洀甀猀琀 挀漀渀琀愀椀渀 愀 猀椀渀最氀攀 ਀爀攀最椀猀琀攀爀 漀昀 搀漀挀甀洀攀渀琀 䤀䐀猀Ⰰ 眀椀琀栀 愀渀 愀猀猀漀挀椀愀琀攀搀 挀漀渀猀琀爀愀椀渀琀 琀栀愀琀 愀氀氀 攀渀琀爀椀攀猀 洀甀猀琀 戀攀 甀渀椀焀甀攀⸀ ਀吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 眀栀椀挀栀 洀甀猀琀 戀攀 甀渀椀焀甀攀 椀猀 琀栀愀琀 眀栀椀挀栀 椀猀 搀椀猀瀀氀愀礀攀搀 漀渀 琀栀攀 瀀甀戀氀椀猀栀攀搀 ਀搀漀挀甀洀攀渀琀⸀ 䐀漀挀甀洀攀渀琀 䤀䐀猀 愀爀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀搀 椀渀 琀栀攀 琀攀砀琀 漀昀 搀漀挀甀洀攀渀琀猀Ⰰ 愀渀搀 琀栀攀礀 洀甀猀琀 戀攀 ਀愀戀氀攀 琀漀 戀攀 爀攀愀搀椀氀礀 瘀攀爀戀愀氀氀礀 挀漀洀洀甀渀椀挀愀琀攀搀 愀渀搀 琀爀愀渀猀挀爀椀戀攀搀Ⰰ 椀⸀攀⸀ 琀栀攀礀 洀甀猀琀 戀攀 栀甀洀愀渀ⴀ昀爀椀攀渀搀氀礀⸀ ਀䘀漀爀 琀栀椀猀 爀攀愀猀漀渀 䜀唀䤀䐀猀 ⠀最氀漀戀愀氀氀礀 甀渀椀焀甀攀 椀搀攀渀琀椀昀椀攀爀猀⤀ 愀爀攀 甀渀猀甀椀琀愀戀氀攀 昀漀爀 甀猀攀 愀猀 搀漀挀甀洀攀渀琀 䤀䐀猀Ⰰ ਀攀瘀攀渀 琀栀漀甀最栀 琀栀攀礀 挀愀渀 戀攀 最甀愀爀愀渀琀攀攀搀 琀漀 戀攀 甀渀椀焀甀攀 眀椀琀栀漀甀琀 渀攀攀搀椀渀最 琀漀 戀攀 洀愀渀愀最攀搀 椀渀 愀 ਀猀椀渀最氀攀 爀攀最椀猀琀攀爀⸀ 吀栀攀 椀搀攀渀琀椀昀椀攀爀猀 漀昀 渀愀琀椀漀渀愀氀 愀渀搀 椀渀琀攀爀渀愀琀椀漀渀愀氀 猀琀愀渀搀愀爀搀猀 ⠀攀⸀最⸀ 䤀匀伀 㤀　　㄀Ⰰ 䤀䔀䌀 ਀㘀　㄀㘀㜀Ⰰ 䤀䔀䔀䔀 ㄀㔀㠀㐀Ⰰ 䄀一匀䤀 娀㔀㌀㔀⸀㄀⤀ 愀爀攀 最漀漀搀 攀砀愀洀瀀氀攀猀 漀昀 搀漀挀甀洀攀渀琀 䤀䐀猀⸀਀䌀漀渀挀攀瀀琀甀愀氀氀礀 愀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 愀渀 愀戀猀琀爀愀挀琀 攀渀琀椀琀礀 猀攀瀀愀爀愀琀攀 昀爀漀洀 琀栀攀 昀椀氀攀猀 眀栀椀挀栀 爀攀瀀爀攀猀攀渀琀 琀栀攀 ਀愀挀琀甀愀氀 搀漀挀甀洀攀渀琀 漀戀樀攀挀琀⸀ 圀椀琀栀 愀 搀攀搀椀挀愀琀攀搀 搀漀挀甀洀攀渀琀 䤀䐀 爀攀最椀猀琀攀爀 琀栀攀 昀甀渀挀琀椀漀渀 漀昀 爀攀猀攀爀瘀椀渀最 ਀搀漀挀甀洀攀渀琀 䤀䐀猀Ⰰ 昀漀爀 攀砀愀洀瀀氀攀Ⰰ 椀猀 猀琀爀愀椀最栀琀昀漀爀眀愀爀搀⸀ 吀栀攀爀攀 椀猀 渀漀 渀攀攀搀 琀漀 猀甀瀀瀀氀礀 漀爀 挀爀攀愀琀攀 搀甀洀洀礀 ਀昀椀氀攀猀 椀渀 漀爀搀攀爀 琀漀 爀攀猀攀爀瘀攀 搀漀挀甀洀攀渀琀 䤀䐀猀⸀਀䘀漀爀 瘀愀爀椀漀甀猀 爀攀愀猀漀渀猀 ⠀猀甀挀栀 愀猀 椀渀昀氀攀砀椀戀椀氀椀琀礀Ⰰ 攀砀瀀氀愀椀渀攀搀 椀渀 洀漀爀攀 搀攀琀愀椀氀 攀氀猀攀眀栀攀爀攀⤀ 攀洀戀攀搀搀椀渀最 ਀洀攀琀愀搀愀琀愀 椀渀琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 椀猀 瀀漀漀爀 瀀爀愀挀琀椀挀攀⸀ 吀栀攀 愀搀瘀攀渀琀 漀昀 爀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀猀 洀愀渀礀 ਀搀攀挀愀搀攀猀 愀最漀 漀戀瘀椀愀琀攀搀 琀栀攀 渀攀攀搀 琀漀 甀猀攀 愀 猀琀爀甀挀琀甀爀攀搀 搀漀挀甀洀攀渀琀 䤀䐀 愀猀 琀栀攀 瀀爀椀洀愀爀礀 洀攀愀渀猀 漀昀 ਀猀攀愀爀挀栀椀渀最Ⰰ 猀漀爀琀椀渀最 愀渀搀 最爀漀甀瀀椀渀最 搀漀挀甀洀攀渀琀猀⸀ 吀栀攀 漀渀氀礀 猀琀爀甀挀琀甀爀攀 眀栀椀挀栀 洀愀礀 戀攀 愀瀀瀀氀椀挀愀戀氀攀 椀猀 ਀漀渀攀 眀栀椀挀栀 椀渀搀椀挀愀琀攀猀 琀栀攀 渀愀洀攀猀瀀愀挀攀 漀爀 漀爀椀最椀渀愀琀椀渀最 爀攀最椀猀琀攀爀 ⠀攀⸀最⸀ 䤀匀伀Ⰰ 䤀䔀䌀Ⰰ 䤀䔀䔀䔀Ⰰ 䄀一匀䤀⤀Ⰰ ਀攀渀猀甀爀椀渀最 椀琀猀 甀渀椀焀甀攀 挀漀渀琀攀砀琀⸀ ਀䐀攀猀瀀椀琀攀 琀栀攀 昀愀挀琀 琀栀愀琀 洀攀琀愀搀愀琀愀 猀栀漀甀氀搀 渀漀琀 戀攀 攀洀戀攀搀搀攀搀 眀椀琀栀椀渀 愀 搀漀挀甀洀攀渀琀 䤀䐀Ⰰ 愀瀀愀爀琀 昀爀漀洀 ਀攀渀昀漀爀挀椀渀最 甀渀椀焀甀攀渀攀猀猀 愀 䌀䐀䴀匀 猀栀漀甀氀搀 渀漀琀 椀洀瀀漀猀攀 挀漀渀猀琀爀愀椀渀琀猀 漀渀 琀栀攀 昀漀爀洀愀琀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 ਀䤀䐀⸀ 䴀漀猀琀 漀爀最愀渀椀猀愀琀椀漀渀猀 眀椀氀氀 甀猀攀 猀漀洀攀 琀礀瀀攀 漀昀 搀漀挀甀洀攀渀琀 䤀䐀 昀漀爀洀愀琀⸀ 吀栀攀 漀爀最愀渀椀猀愀琀椀漀渀 猀栀漀甀氀搀 ਀戀攀 愀戀氀攀 琀漀 搀攀挀椀搀攀 漀渀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 昀漀爀洀愀琀 椀渀搀攀瀀攀渀搀攀渀琀氀礀 漀昀 琀栀攀 䌀䐀䴀匀⸀ 吀栀攀 䌀䐀䴀匀 ਀猀栀漀甀氀搀 愀氀猀漀 洀愀椀渀琀愀椀渀 漀渀氀礀 愀 猀椀渀最氀攀 搀漀挀甀洀攀渀琀 䤀䐀 爀攀最椀猀琀攀爀 愀渀搀 渀漀琀 洀愀椀渀琀愀椀渀 愀 瀀愀爀愀氀氀攀氀 漀爀 瀀爀漀砀礀 ਀搀漀挀甀洀攀渀琀 䤀䐀 爀攀最椀猀琀攀爀⸀ 吀漀 最甀愀爀愀渀琀攀攀 琀栀愀琀 渀漀 搀甀瀀氀椀挀愀琀攀 搀漀挀甀洀攀渀琀 椀搀攀渀琀椀昀椀攀爀猀 挀愀渀 戀攀 挀爀攀愀琀攀搀Ⰰ ਀琀栀攀 䌀䐀䴀匀 洀甀猀琀 渀漀琀 洀愀椀渀琀愀椀渀 搀椀昀昀攀爀攀渀琀 爀攀最椀猀琀攀爀猀 昀漀爀 搀椀昀昀攀爀攀渀琀 搀漀挀甀洀攀渀琀 琀礀瀀攀猀 愀渀搀 栀攀渀挀攀 愀氀氀漀眀 ਀琀栀攀 挀漀渀昀椀最甀爀愀琀椀漀渀 漀昀 搀甀瀀氀椀挀愀琀攀 椀搀攀渀琀椀昀椀攀爀猀 愀挀爀漀猀猀 搀椀昀昀攀爀攀渀琀 爀攀最椀猀琀攀爀猀⸀ ਀刀攀氀愀琀椀漀渀猀栀椀瀀 䈀攀琀眀攀攀渀 䐀漀挀甀洀攀渀琀猀 愀渀搀 䘀椀氀攀猀਀圀栀椀氀攀 攀渀昀漀爀挀椀渀最 琀栀攀 甀渀椀焀甀攀渀攀猀猀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀Ⰰ 琀栀攀 䌀䐀䴀匀 洀甀猀琀 愀氀猀漀 挀愀琀攀爀 昀漀爀 琀栀攀 ਀爀攀氀愀琀椀漀渀猀栀椀瀀 猀琀爀甀挀琀甀爀攀 琀栀愀琀 愀 猀椀渀最氀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 爀攀氀愀琀攀搀 琀漀 愀 猀攀爀椀攀猀 漀昀 爀攀氀攀愀猀攀猀⸀ 圀椀琀栀椀渀 ਀攀愀挀栀 爀攀氀攀愀猀攀 琀栀攀爀攀 眀椀氀氀 琀礀瀀椀挀愀氀氀礀 戀攀 琀眀漀 爀攀渀搀椀琀椀漀渀猀⸀ 䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 琀栀攀爀攀 眀椀氀氀 戀攀 愀 猀漀甀爀挀攀 昀椀氀攀 ਀⠀攀⸀最⸀ ⸀搀漀挀砀 漀爀 ⸀搀眀最⤀ 愀渀搀 愀 瀀甀戀氀椀猀栀攀搀 昀椀氀攀 ⠀⸀瀀搀昀⤀⸀ 吀栀攀漀爀攀琀椀挀愀氀氀礀Ⰰ 琀栀攀 瀀甀戀氀椀猀栀攀搀 爀攀渀搀椀琀椀漀渀 漀昀 愀 ਀猀椀渀最氀攀 爀攀氀攀愀猀攀 洀愀礀 挀漀洀瀀爀椀猀攀 洀甀氀琀椀瀀氀攀 昀椀氀攀猀Ⰰ 猀甀挀栀 愀猀 愀 洀愀椀渀 搀漀挀甀洀攀渀琀 愀渀搀 愀 猀攀瀀愀爀愀琀攀 ਀愀瀀瀀攀渀搀椀砀 昀椀氀攀 椀渀 愀 搀椀昀昀攀爀攀渀琀 昀漀爀洀愀琀⸀ 吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 渀漀琀 愀 洀攀琀愀搀愀琀愀 愀琀琀爀椀戀甀琀攀 漀昀 琀栀攀 昀椀氀攀⸀ ਀吀栀攀 昀椀氀攀 椀猀 爀攀氀愀琀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀⸀ 吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 琀栀攀 瀀愀爀攀渀琀 愀渀搀 琀栀攀 昀椀氀攀 椀猀 琀栀攀 ਀挀栀椀氀搀⸀ 吀栀椀猀 氀漀最椀挀愀氀 猀攀瀀愀爀愀琀椀漀渀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 昀爀漀洀 琀栀攀 瀀栀礀猀椀挀愀氀 昀椀氀攀猀 椀猀 挀爀椀琀椀挀愀氀Ⰰ 愀氀氀漀眀椀渀最 ਀昀漀爀 昀氀攀砀椀戀氀攀 洀愀渀愀最攀洀攀渀琀 漀昀 瘀愀爀椀漀甀猀 爀攀渀搀椀琀椀漀渀猀 愀渀搀 昀漀爀洀愀琀猀 漀瘀攀爀 琀椀洀攀⸀ 吀栀攀 䌀䐀䴀匀 洀甀猀琀 戀攀 ਀㌀਀昀氀攀砀椀戀氀攀 攀渀漀甀最栀 琀漀 栀愀渀搀氀攀 琀栀攀猀攀 爀攀焀甀椀爀攀洀攀渀琀猀 愀渀搀 洀椀爀爀漀爀 琀栀攀 爀攀愀氀ⴀ眀漀爀氀搀 渀愀琀甀爀攀 漀昀 琀栀攀 搀愀琀愀⸀ ਀刀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀猀 愀爀攀 猀瀀攀挀椀昀椀挀愀氀氀礀 搀攀猀椀最渀攀搀 琀漀 攀昀昀椀挀椀攀渀琀氀礀 洀愀渀愀最攀 琀栀攀猀攀 琀礀瀀攀猀 漀昀 ਀爀攀氀愀琀椀漀渀猀栀椀瀀猀⸀ ਀唀猀攀爀 䤀渀琀攀爀昀愀挀攀 愀渀搀 䌀漀渀琀爀漀氀਀䐀漀挀甀洀攀渀琀 猀攀愀爀挀栀 爀攀猀甀氀琀猀 洀甀猀琀 戀攀 瀀爀攀猀攀渀琀攀搀 琀漀 攀渀搀 甀猀攀爀猀 椀渀 猀甀挀栀 愀 洀愀渀渀攀爀 琀栀愀琀 甀猀攀爀猀 愀爀攀 ਀渀漀琀 氀椀欀攀氀礀 琀漀 椀渀愀搀瘀攀爀琀攀渀琀氀礀 甀猀攀 愀 搀漀挀甀洀攀渀琀 眀栀椀挀栀 椀猀 渀漀琀 琀栀攀 氀愀琀攀猀琀 爀攀氀攀愀猀攀 漀昀 愀 挀甀爀爀攀渀琀 ਀搀漀挀甀洀攀渀琀⸀ 䐀漀挀甀洀攀渀琀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 挀愀渀挀攀氀氀攀搀Ⰰ 漀爀 爀攀氀攀愀猀攀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 ਀猀甀瀀攀爀猀攀搀攀搀Ⰰ 猀栀漀甀氀搀 渀漀琀 戀攀 瀀爀攀猀攀渀琀攀搀 眀椀琀栀漀甀琀 愀搀搀椀琀椀漀渀愀氀 搀攀氀椀戀攀爀愀琀攀 愀挀琀椀漀渀猀 戀礀 琀栀攀 甀猀攀爀 漀爀 ਀瀀攀爀栀愀瀀猀 猀瀀攀挀椀昀椀挀 愀甀琀栀漀爀椀猀愀琀椀漀渀⸀ 吀栀攀 洀漀猀琀 攀昀昀椀挀椀攀渀琀 眀愀礀 琀漀 栀愀渀搀氀攀 琀栀攀猀攀 爀攀焀甀椀爀攀洀攀渀琀猀 椀猀 瘀椀愀 ਀洀攀琀愀搀愀琀愀⸀਀䜀椀瘀攀渀 琀栀愀琀 甀猀攀爀猀 洀甀猀琀 戀攀 愀戀氀攀 琀漀 搀漀眀渀氀漀愀搀 搀漀挀甀洀攀渀琀 昀椀氀攀猀 昀漀爀 瘀愀爀椀漀甀猀 爀攀愀猀漀渀猀Ⰰ 愀 猀琀爀愀琀攀最礀 ਀洀甀猀琀 戀攀 愀瀀瀀氀椀攀搀 琀漀 爀攀搀甀挀攀 琀栀攀 爀椀猀欀 漀昀 渀漀渀ⴀ挀甀爀爀攀渀琀 搀漀挀甀洀攀渀琀猀 戀攀椀渀最 甀猀攀搀⸀ 吀栀攀 猀椀洀瀀氀攀猀琀 愀渀搀 ਀洀漀猀琀 攀昀昀椀挀椀攀渀琀 猀琀爀愀琀攀最礀 昀漀爀 攀渀猀甀爀椀渀最 琀栀愀琀 甀猀攀爀猀 愀爀攀 漀渀氀礀 爀攀昀攀爀爀椀渀最 琀漀 琀栀攀 挀甀爀爀攀渀琀 爀攀氀攀愀猀攀 漀昀 愀 ਀搀漀挀甀洀攀渀琀 椀猀 琀漀 攀砀瀀氀椀挀椀琀氀礀 挀漀洀洀甀渀椀挀愀琀攀 漀渀 攀愀挀栀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 洀愀猀琀攀爀 挀漀瀀礀 爀攀猀椀搀攀猀 椀渀 愀 ਀最椀瘀攀渀 渀漀洀椀渀愀琀攀搀 猀椀渀最氀攀 爀攀瀀漀猀椀琀漀爀礀⸀ 䐀漀挀甀洀攀渀琀猀 瘀椀攀眀攀搀 琀栀爀漀甀最栀 挀栀愀渀渀攀氀猀 漀甀琀猀椀搀攀 漀昀 琀栀愀琀 ਀爀攀瀀漀猀椀琀漀爀礀 愀爀攀 搀攀昀椀渀攀搀 愀猀 甀渀挀漀渀琀爀漀氀氀攀搀 戀礀 搀攀昀愀甀氀琀⸀ 吀栀甀猀Ⰰ 琀栀攀 搀攀猀椀最渀愀琀椀漀渀 漀昀 眀栀愀琀 挀漀渀猀琀椀琀甀琀攀猀 ਀愀 ✀✀挀漀渀琀爀漀氀氀攀搀 挀漀瀀礀✀✀ 椀猀 渀漀琀 戀礀 眀栀愀琀 椀猀 搀椀猀瀀氀愀礀攀搀 漀渀 琀栀攀 搀漀挀甀洀攀渀琀Ⰰ 漀爀 眀栀攀琀栀攀爀 漀爀 渀漀琀 椀琀 椀猀 ਀瀀爀椀渀琀攀搀Ⰰ 戀甀琀 戀礀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀 挀栀愀渀渀攀氀 琀栀爀漀甀最栀 眀栀椀挀栀 椀琀 椀猀 戀攀椀渀最 瘀椀攀眀攀搀⸀ ਀䴀攀琀愀搀愀琀愀਀䴀攀琀愀搀愀琀愀 椀猀 甀猀攀搀 椀渀 愀 䌀䐀䴀匀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀椀渀最 搀漀挀甀洀攀渀琀猀 愀渀搀 愀氀猀漀 昀漀爀 猀攀愀爀挀栀椀渀最Ⰰ 猀漀爀琀椀渀最 ਀愀渀搀 最爀漀甀瀀椀渀最 搀漀挀甀洀攀渀琀猀 愀渀搀 挀漀洀洀甀渀椀挀愀琀椀渀最 椀渀昀漀爀洀愀琀椀漀渀⸀ ਀匀漀洀攀 洀攀琀愀搀愀琀愀 椀猀 爀攀氀愀琀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 愀渀搀 猀漀洀攀 椀猀 爀攀氀愀琀攀搀 琀漀 琀栀攀 昀椀氀攀⸀ 吀栀攀 洀攀琀愀搀愀琀愀 ਀眀栀椀挀栀 椀猀 爀攀氀愀琀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 猀栀漀甀氀搀 漀渀氀礀 戀攀 琀栀愀琀 眀栀椀挀栀 搀漀攀猀 渀漀琀 挀栀愀渀最攀 昀爀漀洀 漀渀攀 ਀爀攀氀攀愀猀攀 琀漀 琀栀攀 渀攀砀琀⸀ 䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 琀栀攀 琀椀琀氀攀 愀渀搀 猀甀戀樀攀挀琀 洀愀琀琀攀爀 眀漀甀氀搀 最攀渀攀爀愀氀氀礀 戀攀 爀攀氀愀琀攀搀 琀漀 ਀琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀Ⰰ 爀攀洀愀椀渀椀渀最 挀漀渀猀琀愀渀琀 愀挀爀漀猀猀 爀攀氀攀愀猀攀猀Ⰰ 眀栀椀氀攀 琀栀攀 猀瀀攀挀椀昀椀挀 爀攀氀攀愀猀攀 渀甀洀戀攀爀Ⰰ ਀愀甀琀栀漀爀 愀渀搀 爀攀氀攀愀猀攀 搀愀琀攀 眀漀甀氀搀 戀攀 爀攀氀愀琀攀搀 琀漀 琀栀攀 昀椀氀攀 椀猀猀甀攀搀 昀漀爀 愀 瀀愀爀琀椀挀甀氀愀爀 爀攀氀攀愀猀攀⸀ 吀栀攀猀攀 ਀爀攀氀愀琀椀漀渀猀栀椀瀀猀 爀攀昀氀攀挀琀 琀栀攀 氀漀最椀挀愀氀 猀琀爀甀挀琀甀爀攀 漀昀 琀栀攀 爀攀愀氀ⴀ眀漀爀氀搀 搀愀琀愀⸀ 吀栀攀 琀眀漀 愀爀攀 挀漀洀戀椀渀攀搀 椀渀 ਀猀攀愀爀挀栀 爀攀猀甀氀琀猀 搀愀琀愀 愀渀搀 琀栀攀 昀愀挀琀 琀栀愀琀 琀栀攀礀 愀爀攀 猀琀漀爀攀搀 猀攀瀀愀爀愀琀攀氀礀 猀栀漀甀氀搀 戀攀 椀渀瘀椀猀椀戀氀攀 琀漀 琀栀攀 攀渀搀 ਀甀猀攀爀⸀ ਀刀攀氀攀愀猀攀 椀搀攀渀琀椀昀椀攀爀猀 愀爀攀 瘀愀爀椀漀甀猀氀礀 爀攀昀攀爀爀攀搀 琀漀 愀猀 瘀攀爀猀椀漀渀 漀爀 爀攀瘀椀猀椀漀渀 渀甀洀戀攀爀⸀ ⠀䔀渀最椀渀攀攀爀椀渀最 ਀搀爀愀眀椀渀最 爀攀氀攀愀猀攀猀 愀爀攀 最攀渀攀爀愀氀氀礀 爀攀昀攀爀爀攀搀 琀漀 愀猀 爀攀瘀椀猀椀漀渀猀Ⰰ 愀渀搀 瀀爀攀ⴀ爀攀氀攀愀猀攀 挀漀瀀椀攀猀 愀猀 瘀攀爀猀椀漀渀猀Ⰰ ਀戀甀琀 琀栀攀 琀攀爀洀椀渀漀氀漀最礀 椀猀 漀昀琀攀渀 爀攀瘀攀爀猀攀搀 椀渀 漀琀栀攀爀 挀漀渀琀攀砀琀猀⸀⤀ 伀爀最愀渀椀猀愀琀椀漀渀猀 眀椀氀氀 栀愀瘀攀 搀椀昀昀攀爀攀渀琀 ਀瀀漀氀椀挀椀攀猀 愀猀 琀漀 栀漀眀 爀攀氀攀愀猀攀猀 愀爀攀 椀搀攀渀琀椀昀椀攀搀⸀ 圀栀椀氀攀 琀礀瀀椀挀愀氀氀礀 爀攀昀攀爀爀攀搀 琀漀 愀猀 ✀✀渀甀洀戀攀爀猀✀✀Ⰰ 爀攀氀攀愀猀攀 ਀椀搀攀渀琀椀昀椀攀爀猀 挀愀渀 猀漀洀攀琀椀洀攀猀 戀攀 氀攀琀琀攀爀猀Ⰰ 漀爀 攀瘀攀渀 搀愀琀攀猀⸀ 吀栀攀 䌀䐀䴀匀 猀栀漀甀氀搀 渀漀琀 挀漀渀猀琀爀愀椀渀 栀漀眀 ਀爀攀氀攀愀猀攀 椀搀攀渀琀椀昀椀攀爀猀 愀爀攀 昀漀爀洀愀琀琀攀搀⸀ 吀栀攀 猀攀琀 漀昀 爀攀氀攀愀猀攀 渀甀洀戀攀爀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 䤀䐀 洀甀猀琀 ਀愀氀猀漀 爀攀洀愀椀渀 愀猀 愀 猀椀渀最氀攀 甀渀椀昀椀攀搀 猀攀琀Ⰰ 昀漀爀 攀砀愀洀瀀氀攀 愀挀爀漀猀猀 挀栀愀渀最攀猀 椀渀 昀椀氀攀 琀礀瀀攀 漀昀 琀栀攀 甀渀搀攀爀氀礀椀渀最 ਀猀漀甀爀挀攀 昀椀氀攀猀⸀ ਀䈀愀猀椀挀 瀀爀椀渀挀椀瀀氀攀猀 漀昀 洀攀琀愀搀愀琀愀 洀愀渀愀最攀洀攀渀琀 搀椀挀琀愀琀攀 琀栀愀琀 搀漀挀甀洀攀渀琀 挀漀渀琀爀漀氀 洀攀琀愀搀愀琀愀 洀甀猀琀 戀攀 ਀爀攀氀愀琀攀搀 琀漀 昀椀氀攀猀Ⰰ 渀漀琀 攀洀戀攀搀搀攀搀 眀椀琀栀椀渀 琀栀攀 昀椀氀攀⸀ 䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 琀栀攀 猀琀愀琀甀猀 漀昀 愀 昀椀氀攀 愀猀 挀甀爀爀攀渀琀 ਀氀愀琀攀猀琀 爀攀氀攀愀猀攀 漀爀 猀甀瀀攀爀猀攀搀攀搀 猀栀漀甀氀搀 戀攀 戀礀 氀椀渀欀椀渀最 愀 爀攀昀攀爀攀渀挀攀 琀漀 琀栀攀 昀椀氀攀 琀漀 愀渀 攀氀攀洀攀渀琀 椀渀 愀 ਀氀漀漀欀甀瀀 琀愀戀氀攀⸀ 吀栀攀 猀琀愀琀甀猀 椀猀 挀栀愀渀最攀搀 戀礀 挀栀愀渀最椀渀最 琀栀攀 氀椀渀欀 琀愀戀氀攀 眀椀琀栀漀甀琀 愀挀挀攀猀猀椀渀最 漀爀 ਀洀漀搀椀昀礀椀渀最 琀栀攀 昀椀氀攀Ⰰ 愀渀搀 琀栀攀 猀琀愀琀甀猀 椀猀 爀攀愀搀 眀椀琀栀漀甀琀 渀攀攀搀椀渀最 琀漀 爀攀愀搀 琀栀攀 昀椀氀攀⸀ ਀䤀渀 欀攀攀瀀椀渀最 眀椀琀栀 戀愀猀椀挀 搀愀琀愀 猀琀爀甀挀琀甀爀攀 瀀爀椀渀挀椀瀀氀攀猀Ⰰ 琀栀攀 洀攀琀愀搀愀琀愀 猀栀漀甀氀搀 戀攀 椀渀 愀 渀漀爀洀愀氀椀猀攀搀 ਀猀琀爀甀挀琀甀爀攀⸀ 吀栀椀猀 攀渀猀甀爀攀猀 搀愀琀愀 椀渀琀攀最爀椀琀礀 愀渀搀 攀昀昀椀挀椀攀渀挀礀 戀礀 猀琀漀爀椀渀最 攀愀挀栀 瀀椀攀挀攀 漀昀 搀愀琀愀 漀渀氀礀 漀渀挀攀Ⰰ ਀爀攀昀攀爀攀渀挀椀渀最 椀琀 瘀椀愀 欀攀礀猀 愀挀爀漀猀猀 爀攀氀愀琀攀搀 琀愀戀氀攀猀⸀ ਀㐀਀匀琀漀爀椀渀最 䘀椀氀攀猀਀吀栀攀 瀀爀椀渀挀椀瀀氀攀 漀昀 攀渀猀甀爀椀渀最 琀栀愀琀 搀愀琀愀 爀攀洀愀椀渀猀 挀漀渀猀椀猀琀攀渀琀 眀椀琀栀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 椀猀 琀栀愀琀 漀昀 ਀琀爀愀渀猀愀挀琀椀漀渀愀氀 椀渀琀攀最爀椀琀礀⸀ 匀瀀攀挀椀昀椀挀愀氀氀礀Ⰰ 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀猀 洀甀猀琀 戀攀 䄀䌀䤀䐀ⴀ挀漀洀瀀氀椀愀渀琀⸀ 伀琀栀攀爀眀椀猀攀 琀栀攀 ਀搀愀琀愀 挀愀渀 爀攀愀搀椀氀礀 戀攀挀漀洀攀 挀漀爀爀甀瀀琀攀搀⸀ 䄀 爀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀 攀渀最椀渀攀 挀愀渀 最甀愀爀愀渀琀攀攀 ਀琀爀愀渀猀愀挀琀椀漀渀愀氀 椀渀琀攀最爀椀琀礀Ⰰ 戀甀琀 漀渀氀礀 椀昀 琀栀攀 戀椀渀愀爀礀 挀漀渀琀攀渀琀 漀昀 琀栀攀 昀椀氀攀 椀猀 甀渀搀攀爀 琀栀攀 昀甀氀氀 挀漀渀琀爀漀氀 漀昀 琀栀攀 ਀搀愀琀愀戀愀猀攀⸀ ਀吀栀攀 愀瀀瀀爀漀愀挀栀攀猀 琀漀 猀琀漀爀椀渀最 昀椀氀攀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 洀攀琀愀搀愀琀愀 栀愀瘀攀 攀瘀漀氀瘀攀搀 漀瘀攀爀 琀椀洀攀⸀ 吀栀攀 洀漀猀琀 ਀爀攀挀攀渀琀 搀攀瘀攀氀漀瀀洀攀渀琀 椀猀 挀氀漀甀搀 漀戀樀攀挀琀 猀琀漀爀愀最攀⸀ 䌀氀漀甀搀 漀戀樀攀挀琀 猀琀漀爀愀最攀 漀昀昀攀爀猀 攀砀琀爀攀洀攀 氀攀瘀攀氀猀 漀昀 ਀猀挀愀氀愀戀椀氀椀琀礀 愀渀搀 漀琀栀攀爀 戀攀渀攀昀椀琀猀Ⰰ 戀甀琀 栀愀猀 琀栀攀 搀爀愀眀戀愀挀欀 漀昀 挀漀洀瀀爀漀洀椀猀椀渀最 琀爀愀渀猀愀挀琀椀漀渀愀氀 椀渀琀攀最爀椀琀礀 ਀挀漀洀瀀愀爀攀搀 眀椀琀栀 昀爀愀洀攀眀漀爀欀猀 眀栀攀爀攀 琀栀攀 昀椀氀攀 戀椀渀愀爀礀 挀漀渀琀攀渀琀 椀猀 甀渀搀攀爀 琀栀攀 昀甀氀氀 挀漀渀琀爀漀氀 漀昀 琀栀攀 ਀搀愀琀愀戀愀猀攀⸀ 䘀漀爀 猀漀洀攀 猀漀氀甀琀椀漀渀 渀攀攀搀猀 琀爀愀渀猀愀挀琀椀漀渀愀氀 椀渀琀攀最爀椀琀礀 椀猀 氀攀猀猀 椀洀瀀漀爀琀愀渀琀⸀ 䘀漀爀 愀 䌀䐀䴀匀 ਀猀漀氀甀琀椀漀渀 栀漀眀攀瘀攀爀 琀栀攀 椀渀琀攀最爀椀琀礀 漀昀 琀栀攀 搀愀琀愀 椀猀 挀爀椀琀椀挀愀氀⸀ 吀栀攀 瀀爀漀猀瀀攀挀琀 漀昀 甀猀攀爀猀 戀攀椀渀最 瀀爀攀猀攀渀琀攀搀 ਀眀椀琀栀 愀渀 漀戀猀漀氀攀琀攀 搀漀挀甀洀攀渀琀Ⰰ 漀爀 愀 猀攀渀猀椀琀椀瘀攀 愀渀搀 爀攀猀琀爀椀挀琀攀搀 搀漀挀甀洀攀渀琀Ⰰ 搀甀攀 琀漀 搀愀琀愀 挀漀爀爀甀瀀琀椀漀渀 ਀挀愀甀猀攀搀 戀礀 愀 昀愀椀氀攀搀 琀爀愀渀猀愀挀琀椀漀渀 昀漀爀 攀砀愀洀瀀氀攀Ⰰ 眀漀甀氀搀 渀漀琀 戀攀 愀挀挀攀瀀琀愀戀氀攀⸀ 吀爀愀渀猀愀挀琀椀漀渀愀氀 椀渀琀攀最爀椀琀礀 ਀眀椀琀栀 挀氀漀甀搀 漀戀樀攀挀琀 猀琀漀爀愀最攀 挀愀渀 戀攀 洀愀渀愀最攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀Ⰰ 戀甀琀 椀琀 椀渀栀攀爀攀渀琀氀礀 挀愀渀 ਀渀攀瘀攀爀 戀攀 愀猀 爀漀戀甀猀琀 愀猀 眀栀攀爀攀 椀琀 椀猀 攀渀琀椀爀攀氀礀 洀愀渀愀最攀搀 眀椀琀栀椀渀 琀栀攀 爀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀 攀渀最椀渀攀⸀ ਀唀氀琀椀洀愀琀攀氀礀 愀 䌀䐀䴀匀 甀猀攀爀 洀甀猀琀 戀攀 愀戀氀攀 琀漀 攀砀琀爀愀挀琀 愀 搀漀挀甀洀攀渀琀 昀椀氀攀 昀爀漀洀 琀栀攀 猀礀猀琀攀洀⸀ 䄀猀 眀椀琀栀 ਀搀漀挀甀洀攀渀琀 䤀䐀猀Ⰰ 琀栀攀 䌀䐀䴀匀 猀栀漀甀氀搀 渀漀琀 挀漀渀猀琀爀愀椀渀 琀栀攀 甀猀攀爀 漀爀 漀爀最愀渀椀猀愀琀椀漀渀 眀椀琀栀 爀攀最愀爀搀猀 琀漀 栀漀眀 ਀攀砀琀爀愀挀琀攀搀 昀椀氀攀猀 愀爀攀 渀愀洀攀搀⸀ 吀栀攀 昀椀氀攀渀愀洀攀 猀栀漀甀氀搀 最攀渀攀爀愀氀氀礀 猀椀洀瀀氀礀 洀愀琀挀栀 琀栀愀琀 最椀瘀攀渀 眀栀攀渀 琀栀攀 ਀昀椀氀攀 眀愀猀 甀瀀氀漀愀搀攀搀⸀਀䄀 匀䠀伀刀吀 䠀䤀匀吀伀刀夀 伀䘀 䘀䤀䰀䔀 匀吀伀刀䄀䜀䔀 䄀一䐀 刀䔀䰀䄀吀䤀伀一䄀䰀 ਀䐀䄀吀䄀䈀䄀匀䔀匀਀吀栀攀 戀椀渀愀爀礀 挀漀渀琀攀渀琀 漀昀 昀椀氀攀猀 挀愀渀 戀攀 猀琀漀爀攀搀 搀椀爀攀挀琀氀礀 眀椀琀栀椀渀 愀 戀椀渀愀爀礀 挀漀氀甀洀渀 眀椀琀栀椀渀 愀 搀愀琀愀戀愀猀攀 ਀琀愀戀氀攀 ⠀爀攀昀攀爀爀攀搀 琀漀 愀猀 愀 䈀椀渀愀爀礀 䰀愀爀最攀 伀戀樀攀挀琀 ጀ†䈀䰀伀䈀⤀⸀ 吀栀椀猀 愀瀀瀀爀漀愀挀栀 琀攀渀搀猀 琀漀 挀爀攀愀琀攀 ਀猀挀愀氀愀戀椀氀椀琀礀 愀渀搀 洀愀椀渀琀愀椀渀愀戀椀氀椀琀礀 椀猀猀甀攀猀 栀漀眀攀瘀攀爀⸀ 䌀漀渀瘀攀爀猀攀氀礀Ⰰ 眀栀攀渀 昀椀氀攀 戀椀渀愀爀礀 搀愀琀愀 椀猀 猀琀漀爀攀搀 ਀攀砀琀攀爀渀愀氀 琀漀 琀栀攀 搀愀琀愀戀愀猀攀 琀栀攀 搀愀琀愀戀愀猀攀 氀漀猀攀猀 椀琀猀 椀渀栀攀爀攀渀琀 愀戀椀氀椀琀礀 琀漀 最甀愀爀愀渀琀攀攀 琀爀愀渀猀愀挀琀椀漀渀愀氀 ਀椀渀琀攀最爀椀琀礀⸀ 䤀昀 琀栀攀 搀愀琀愀 椀猀 猀琀漀爀攀搀 攀砀琀攀爀渀愀氀 琀漀 琀栀攀 搀愀琀愀戀愀猀攀 琀栀攀渀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀 洀甀猀琀 ਀愀猀猀甀洀攀 爀攀猀瀀漀渀猀椀戀椀氀椀琀礀 昀漀爀 洀愀渀愀最椀渀最 琀爀愀渀猀愀挀琀椀漀渀愀氀 椀渀琀攀最爀椀琀礀⸀ 䤀渀 ㈀　　㜀⼀㠀 伀爀愀挀氀攀 愀渀搀 䴀椀挀爀漀猀漀昀琀 ਀椀渀琀爀漀搀甀挀攀搀 猀漀氀甀琀椀漀渀猀 琀漀 琀栀椀猀 瀀爀漀戀氀攀洀 眀椀琀栀 匀攀挀甀爀攀䘀椀氀攀猀 愀渀搀 䘀䤀䰀䔀匀吀刀䔀䄀䴀 爀攀猀瀀攀挀琀椀瘀攀氀礀⸀ ਀䠀漀眀攀瘀攀爀 匀攀挀甀爀攀䘀椀氀攀猀 愀渀搀 䘀䤀䰀䔀匀吀刀䔀䄀䴀 猀琀椀氀氀 瀀爀攀猀攀渀琀 氀椀洀椀琀愀琀椀漀渀猀 椀渀 琀栀攀 挀漀渀琀攀砀琀 漀昀 攀砀琀爀攀洀攀氀礀 ਀氀愀爀最攀 愀渀搀 搀椀猀琀爀椀戀甀琀攀搀 愀爀挀栀椀琀攀挀琀甀爀攀猀⸀ 䠀攀渀挀攀 昀漀爀 瘀攀爀礀 氀愀爀最攀 猀挀愀氀攀 愀渀搀 搀椀猀琀爀椀戀甀琀攀搀 爀攀焀甀椀爀攀洀攀渀琀猀਀⠀攀⸀最⸀ 瀀攀琀愀戀礀琀攀 猀挀愀氀攀 瘀漀氀甀洀攀猀⤀Ⰰ 挀氀漀甀搀 漀戀樀攀挀琀 猀琀漀爀愀最攀 ⠀猀甀挀栀 愀猀 䄀稀甀爀攀 䈀氀漀戀 匀琀漀爀愀最攀Ⰰ 䄀洀愀稀漀渀 ਀匀㌀ 愀渀搀 䜀漀漀最氀攀 䌀氀漀甀搀 匀琀漀爀愀最攀⤀ 栀愀瘀攀 戀攀攀渀 搀攀瘀攀氀漀瀀攀搀 愀猀 愀 洀漀爀攀 挀漀猀琀ⴀ攀昀昀攀挀琀椀瘀攀 猀漀氀甀琀椀漀渀⸀ ਀吀栀攀猀攀 猀漀氀甀琀椀漀渀猀 愀氀氀漀眀 洀甀氀琀椀ⴀ琀攀渀愀渀琀攀搀Ⰰ 挀攀渀琀爀愀氀氀礀 洀愀渀愀最攀搀 猀琀漀爀愀最攀 昀漀爀 愀渀礀 猀挀愀氀攀Ⰰ 猀洀愀氀氀 漀爀 ਀氀愀爀最攀⸀ ਀吀栀攀 搀爀愀眀戀愀挀欀 漀昀 挀氀漀甀搀 漀戀樀攀挀琀 猀琀漀爀愀最攀 椀猀 琀栀愀琀 琀爀愀渀猀愀挀琀椀漀渀愀氀 椀渀琀攀最爀椀琀礀 眀椀琀栀 愀渀 愀猀猀漀挀椀愀琀攀搀 ਀爀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀 洀甀猀琀 戀攀 洀攀搀椀愀琀攀搀 戀礀 愀渀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀ 䘀漀爀 猀漀氀甀琀椀漀渀猀 眀栀攀爀攀 ਀琀爀愀渀猀愀挀琀椀漀渀愀氀 椀渀琀攀最爀椀琀礀 椀猀 椀洀瀀漀爀琀愀渀琀Ⰰ 挀氀漀甀搀 漀戀樀攀挀琀 猀琀漀爀愀最攀 椀猀 椀渀栀攀爀攀渀琀氀礀 氀攀猀猀 爀漀戀甀猀琀 椀渀 椀琀猀 ਀椀渀琀攀最爀椀琀礀 最甀愀爀愀渀琀攀攀猀 琀栀愀渀 漀瀀琀椀漀渀猀 眀栀攀爀攀 琀栀攀 昀椀氀攀 戀椀渀愀爀礀 搀愀琀愀 椀猀 甀渀搀攀爀 琀栀攀 昀甀氀氀 挀漀渀琀爀漀氀 漀昀 琀栀攀 ਀爀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀 攀渀最椀渀攀⸀ 䌀氀漀甀搀 漀戀樀攀挀琀 猀琀漀爀愀最攀 愀氀猀漀 椀渀琀爀漀搀甀挀攀猀 愀 猀攀挀甀爀椀琀礀 昀爀愀洀攀眀漀爀欀 ਀眀栀椀挀栀 椀猀 猀攀瀀愀爀愀琀攀 昀爀漀洀 愀渀搀 椀渀 愀搀搀椀琀椀漀渀 琀漀 琀栀愀琀 漀昀 琀栀攀 爀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀⸀ 䄀氀氀 琀栀攀猀攀 ਀挀栀愀氀氀攀渀最攀猀 愀爀攀 洀愀渀愀最攀愀戀氀攀Ⰰ 戀甀琀 琀栀攀 猀漀氀甀琀椀漀渀猀 攀渀琀愀椀氀 挀漀洀瀀爀漀洀椀猀攀猀⸀ 䄀 猀攀挀甀爀椀琀礀 愀渀搀 椀渀琀攀最爀椀琀礀 ਀昀爀愀洀攀眀漀爀欀 挀漀洀瀀爀椀猀椀渀最 愀渀 攀渀挀愀瀀猀甀氀愀琀攀搀 猀椀渀最氀攀 猀攀挀甀爀椀琀礀 洀漀搀攀氀 眀椀琀栀 琀爀愀渀猀愀挀琀椀漀渀愀氀 椀渀琀攀最爀椀琀礀 昀甀氀氀礀 ਀愀猀猀甀爀攀搀Ⰰ 愀氀氀 眀椀琀栀椀渀 愀 猀椀渀最氀攀 猀礀猀琀攀洀 眀椀琀栀漀甀琀 椀渀瘀漀氀瘀攀洀攀渀琀 漀昀 愀渀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀Ⰰ 椀猀 渀漀琀 ਀瀀漀猀猀椀戀氀攀 眀椀琀栀 挀氀漀甀搀 漀戀樀攀挀琀 猀琀漀爀愀最攀⸀ 䠀漀眀攀瘀攀爀 琀栀椀猀 昀爀愀洀攀眀漀爀欀 椀猀 瀀漀猀猀椀戀氀攀 眀椀琀栀 愀 猀漀氀甀琀椀漀渀 ਀戀愀猀攀搀 漀渀 愀 爀攀氀愀琀椀漀渀愀氀 搀愀琀愀戀愀猀攀 眀栀椀挀栀 爀攀琀愀椀渀猀 昀甀氀氀 挀漀渀琀爀漀氀 漀昀 琀栀攀 昀椀氀攀 戀椀渀愀爀礀 搀愀琀愀 挀漀渀琀攀渀琀⸀ ਀㔀਀匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀਀䴀愀爀挀栀 ㈀　㈀㘀✀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开猀琀漀爀愀最攀崀 伀一  
਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开猀琀漀爀愀最攀崀 ⠀嬀昀椀氀攀开椀搀崀Ⰰ 嬀昀椀氀攀开最甀椀搀崀Ⰰ 嬀昀椀氀攀开挀漀渀琀攀渀琀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　Ⰰ 一✀㐀㌀搀㔀㘀挀愀㐀ⴀ㈀㤀昀攀ⴀ㐀攀㤀㜀ⴀ㠀　㐀㐀ⴀ昀㐀戀㠀㔀㘀㐀　昀㤀㠀㐀✀Ⰰ 　砀㈀㔀㔀　㐀㐀㐀㘀㈀䐀㌀㄀㈀䔀㌀㜀　䐀　䄀㈀㔀䈀㔀䈀㔀䈀㔀䈀㔀　䐀　䄀㌀㄀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㌀㘀㄀㜀㐀㘀㄀㘀䌀㘀䘀㘀㜀㈀䘀㔀　㘀㄀㘀㜀㘀㔀㜀㌀㈀　㌀㈀㈀　㌀　㈀　㔀㈀㈀䘀㐀䌀㘀㄀㘀䔀㘀㜀㈀㠀㘀㔀㘀䔀㈀㤀㈀　㈀䘀㔀㌀㜀㐀㜀㈀㜀㔀㘀㌀㜀㐀㔀㐀㜀㈀㘀㔀㘀㔀㔀㈀㘀䘀㘀䘀㜀㐀㈀　㌀㈀㌀㤀㈀　㌀　㈀　㔀㈀㈀䘀㐀䐀㘀㄀㜀㈀㘀䈀㐀㤀㘀䔀㘀㘀㘀䘀㌀䌀㌀䌀㈀䘀㐀䐀㘀㄀㜀㈀㘀䈀㘀㔀㘀㐀㈀　㜀㐀㜀㈀㜀㔀㘀㔀㌀䔀㌀䔀㈀䘀㐀䐀㘀㔀㜀㐀㘀㄀㘀㐀㘀㄀㜀㐀㘀㄀㈀　㌀㄀㌀㄀㌀㈀㈀　㌀　㈀　㔀㈀㈀䘀㔀㘀㘀㤀㘀㔀㜀㜀㘀㔀㜀㈀㔀　㜀㈀㘀㔀㘀㘀㘀㔀㜀㈀㘀㔀㘀䔀㘀㌀㘀㔀㜀㌀㈀　㌀㄀㌀㄀㌀㌀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㔀　㘀㄀㘀㜀㘀㔀㜀㌀㈀䘀㐀㌀㘀䘀㜀㔀㘀䔀㜀㐀㈀　㌀㔀㈀䘀㐀䈀㘀㤀㘀㐀㜀㌀㔀䈀㈀　㌀㌀㈀　㌀　㈀　㔀㈀㈀　㌀㄀㌀㔀㈀　㌀　㈀　㔀㈀㈀　㌀㄀㌀㜀㈀　㌀　㈀　㔀㈀㈀　㌀㄀㌀㤀㈀　㌀　㈀　㔀㈀㈀　㌀㈀㌀㘀㈀　㌀　㈀　㔀㈀㔀䐀㈀　㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㌀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㔀　㘀㄀㘀㜀㘀㔀㈀䘀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㈀　㌀㈀㈀　㌀　㈀　㔀㈀㈀䘀㔀㈀㘀㔀㜀㌀㘀䘀㜀㔀㜀㈀㘀㌀㘀㔀㜀㌀㌀䌀㌀䌀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㌀䌀㌀䌀㈀䘀㐀㘀㌀㄀㈀　㌀㔀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㈀㈀　㌀㤀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㌀㈀　㌀㄀㌀㄀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㐀㈀　㌀㄀㌀㌀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㐀㔀㜀㠀㜀㐀㐀㜀㔀㌀㜀㐀㘀㄀㜀㐀㘀㔀㌀䌀㌀䌀㈀䘀㐀㜀㔀㌀㌀㜀㈀　㌀㜀㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㔀㌀㌀㠀㈀　㌀㠀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㔀　㜀㈀㘀䘀㘀㌀㔀㌀㘀㔀㜀㐀㔀䈀㈀䘀㔀　㐀㐀㐀㘀㈀䘀㔀㐀㘀㔀㜀㠀㜀㐀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㈀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㌀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㤀㔀䐀㈀　㌀䔀㌀䔀㈀䘀㐀䐀㘀㔀㘀㐀㘀㤀㘀㄀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㤀㌀㔀㈀䔀㌀㌀㌀㈀㈀　㌀㠀㌀㐀㌀㄀㈀䔀㌀㤀㌀㈀㔀䐀㈀　㈀䘀㐀㌀㘀䘀㘀䔀㜀㐀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀㐀㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㈀䘀㔀㌀㈀䘀㔀㐀㜀㈀㘀㄀㘀䔀㜀㌀㜀　㘀㄀㜀㈀㘀㔀㘀䔀㘀㌀㜀㤀㈀䘀㐀㌀㔀㌀㈀䘀㐀㐀㘀㔀㜀㘀㘀㤀㘀㌀㘀㔀㔀㈀㐀㜀㐀㈀㌀䔀㌀䔀㈀䘀㔀㐀㘀㄀㘀㈀㜀㌀㈀䘀㔀㌀㈀䘀㔀㌀㜀㐀㜀㈀㜀㔀㘀㌀㜀㐀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀　㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㐀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㐀㌀㐀㌀㐀㌀㐀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䈀䐀㄀䐀㔀䐀㘀䘀䐀䈀㐀㘀䘀㈀䐀䐀㠀　䘀䘀　㌀㄀䘀䄀㔀㈀㈀䄀㘀䈀㤀㔀䌀㜀㈀㐀㤀　㈀㐀㔀　㄀㈀㜀㜀㘀㜀㈀㌀䐀䔀㐀䄀㌀㠀䐀㄀䐀㄀㐀㠀㜀䈀㐀　䘀㌀㐀㐀㔀䌀䈀䈀䄀䈀㌀㐀㔀㐀㜀䄀㐀㤀䌀䘀䄀䐀䘀䐀䘀䌀䌀㈀䌀䈀㤀㐀䈀㠀䄀䈀䈀㠀䄀㄀䄀㜀㌀㔀㌀㈀　㈀䔀㈀㔀㔀㄀㤀䌀䐀㤀䐀㤀䐀㤀䘀㤀㤀䔀䐀㄀䔀㤀䐀㤀䄀㘀㔀㤀䐀䐀䔀㐀㐀㔀䔀㌀䘀䐀䘀䌀䘀㌀䔀㤀㔀㤀䐀㌀䔀㐀䌀㔀㘀䐀䈀㤀䘀　㌀䔀㤀䘀㔀䔀㔀㔀　䘀㜀䘀㤀䐀㔀䔀㌀䐀㌀䐀㤀㐀䄀㜀䈀䘀䔀㔀䌀䈀䐀㔀㌀䄀㘀䘀㔀㘀䐀㔀䘀䄀䘀㐀㜀㈀㜀䈀䐀䐀䔀　㔀䈀䘀䘀㈀䄀䘀㌀㐀㔀䈀㤀䘀㤀䔀㔀㄀㜀䔀䘀䔀㔀䘀㤀㈀䈀䔀䘀䌀䈀䘀㄀㔀㄀䔀　　㜀䘀㠀㔀䘀㤀䄀㈀㘀䌀䌀　䈀䈀䌀㌀㠀㠀䈀㜀䐀㄀䔀㜀䄀㘀㤀䌀㐀䘀䌀㈀䌀䘀㐀㌀㘀䔀㔀䘀㄀䐀㄀㄀䘀㌀䘀㜀㤀䔀䈀䔀㌀䄀㌀㤀㜀㔀㜀䌀㜀㐀㜀䄀㜀䄀䘀㤀㤀䌀㜀㤀㠀㄀䘀㐀㐀䐀䔀䐀㔀䌀䐀䘀㄀㄀㄀䐀䔀㄀䐀㜀㠀䌀䌀㐀䈀㐀㈀㌀䘀　㠀㈀㌀㈀䘀䌀㤀㠀㐀㄀䘀㜀䄀㔀㜀䘀㜀㜀　䐀䈀㤀䈀䌀䈀䌀㐀㔀䈀䐀㘀䘀　㘀㐀㘀䘀㐀㤀䄀䘀䐀㈀䘀㘀䐀㔀㤀䈀䔀㌀䄀㌀䌀䘀㌀㌀㘀䘀䘀䔀㤀㜀㜀㜀䘀㔀䔀䘀䔀㌀䄀㌀　䈀㜀㠀䔀　䔀䘀䌀㜀㐀㜀　㜀㈀㌀㜀　䄀䄀䐀㘀䘀䄀䘀㈀㤀䐀䌀㐀㄀䈀㤀䘀㤀䔀　㐀㜀䔀㤀䌀㈀㈀䘀　䐀　㠀䘀㔀㈀㈀䘀㠀䄀㈀㌀㌀䘀㐀䌀䈀䌀　　䄀䘀䘀㄀㤀䈀㌀㜀㌀䘀㄀䐀㄀䘀㜀㤀㄀㜀㜀　䘀䈀䔀䘀　㐀㠀䈀㈀䔀㐀䘀㈀䐀㌀㐀㜀䈀㔀㤀㌀㔀㐀䐀㜀㔀㘀䘀㈀㜀䐀䈀䔀䈀䄀䄀㘀䄀䄀㘀㈀㐀㔀䈀䌀䌀㌀㈀㐀　䐀䐀䔀㌀䄀㄀㤀䘀䄀㘀㐀㐀㌀㘀㔀䄀㐀䘀㐀䈀㈀㐀䘀㘀㤀䐀㐀㐀䐀䄀　㌀㈀䔀㠀䌀䘀䐀䌀㐀　㈀䌀䐀䌀㤀㤀㘀㐀㐀㤀㄀䌀䘀　㐀䔀䌀㠀㠀䘀　䔀㌀㄀㠀㜀㜀㈀㐀䌀㤀㌀㈀䘀䈀䄀㘀㜀㠀䄀㜀㤀㜀　䘀䘀㤀㄀䄀㜀㜀䔀㐀䐀䐀䄀䈀㔀䘀䌀䘀䈀䐀䔀　䘀㐀㘀䐀䈀䔀㔀䔀㜀䄀䈀㌀㜀㈀㜀䐀㜀㈀䘀㘀㘀㤀䘀䔀㜀䐀㌀㐀　䘀䈀䐀㌀　䐀㠀㈀㔀　㈀　䈀㌀㠀䐀㈀㌀䌀㠀㤀䈀㌀㄀㄀　䐀㔀䔀㜀䘀㜀䄀㜀䘀㜀䔀䘀㘀㘀䔀㤀䔀䌀䌀㈀䔀䔀㘀㈀㜀䔀㄀䔀䌀䘀䐀㔀䌀䌀䌀䄀䔀䌀䔀䔀㘀䘀㄀䔀䌀䔀䐀䄀㔀㌀㜀㌀䘀䔀㄀䈀㌀　䘀㜀　䘀㤀㤀䄀䄀䔀㔀䔀㜀䐀㜀㠀㌀䘀㐀䘀㘀㜀㔀㜀㄀䘀㌀䘀䌀䌀䘀㤀䔀䌀䔀䐀䐀䈀㠀䈀㜀㌀䔀䘀䘀䌀䌀㌀䄀䈀㐀䘀䘀㐀䈀䐀䘀㜀䘀　䌀䔀䐀㔀䘀㜀㤀㈀䐀㈀㠀䔀㜀㌀䌀㠀䈀㤀㤀䘀䌀㈀㈀㤀㠀㌀䄀䐀㐀䈀㐀㘀㔀㠀䈀䘀㌀䈀㜀䈀㜀䘀䘀㘀　㘀㜀　㈀㌀䄀㐀䐀䘀　㄀䐀㈀㄀䄀䘀䈀䌀㤀㄀㄀䔀㄀㠀㈀䘀㤀㠀㈀㔀䈀㄀　䐀㤀㔀㤀䈀㜀㘀㤀㔀㌀䐀㤀　㐀㤀䈀　䄀㔀䈀㄀㠀㔀㤀䔀㐀㠀䘀　　䘀㤀䌀㌀䄀㌀䔀䘀㐀㄀㈀䌀㤀䌀　　㌀㄀䈀䔀　㜀㌀㄀㄀㄀䘀䄀䐀㤀䘀㠀䐀　䘀䐀㌀㄀㠀䘀㘀㘀䘀䘀㐀㈀㠀䔀㌀䄀㠀㌀㠀䈀㈀䈀䘀㠀㐀㜀䔀䌀䘀㔀㈀䈀䘀䔀䈀㤀㤀䌀㘀㜀䘀㈀䐀㔀㄀㤀䈀䐀㄀䐀䌀䐀㔀䔀㐀㤀㄀䔀䌀䌀㘀　㘀㜀䔀㔀䈀䐀㄀䘀䈀䈀㌀㜀䐀䔀䔀㈀䌀㔀㔀䈀㜀㠀䔀㜀䔀㈀䈀䌀䈀䐀䘀㜀䈀䌀䘀䈀㠀㠀䈀䔀䘀㐀　㤀䐀䔀㜀㤀㠀㜀㄀䘀䌀䈀㘀䘀㌀䔀㠀㜀㈀㜀㐀䌀㐀䈀䔀㐀㄀䌀　㐀　䐀䈀㜀㈀䐀䘀㄀　　䐀䄀䘀㌀㘀㤀㤀㠀䌀㈀䄀㘀㤀㐀㐀㐀㄀㐀䘀䈀㘀㄀㌀㠀㐀㈀䔀䌀㄀㔀㄀䌀㤀㤀㘀䄀　䐀䔀㜀䈀㔀㤀㤀㤀䘀㐀㐀䈀㌀　䐀㄀㈀䄀䄀䈀䄀㠀㌀㐀㌀㜀㌀　㜀䔀䘀㤀㜀　䈀㜀㠀䐀䘀䌀㌀䘀㜀㄀㜀㄀㔀㔀䌀㄀㔀䐀䈀㌀㤀䔀㌀䈀㌀㜀䈀䈀䌀䄀㔀㔀㐀䐀䘀䄀㠀䔀㜀㠀䌀䌀㤀㜀䈀㘀䔀䘀㌀㌀㤀㠀䈀㘀㘀㠀䘀䄀㔀㔀㜀䐀䌀䔀㘀䘀㐀㤀䌀㄀䌀㘀䘀㈀䘀䔀㠀䄀䔀㄀㈀㈀䘀䔀㤀䌀䐀㄀㔀㌀䌀䈀㜀䄀㘀䘀㜀䘀　䄀䄀䄀㠀㌀䐀㠀　䐀㔀䈀㐀㔀䘀䌀㜀㐀㜀㠀䄀㄀㘀䔀　　䄀䄀䔀㘀䔀䔀㠀㄀䘀㜀䔀㜀䐀　㌀　　㔀㤀㌀㠀㔀㌀䐀䘀䌀䈀㤀䈀䐀㈀㠀㌀䘀䘀䌀㤀㈀䘀㤀㘀㜀㌀䌀㐀㈀䄀㤀㤀㜀㤀䐀䐀䔀䐀㜀㈀㄀㔀　䄀㔀㤀㜀䄀㈀　䈀䐀㤀㐀䘀㜀䔀㌀㔀㔀䈀㤀㐀㄀　㘀䄀㄀䐀㜀䄀　䐀㄀䔀　　㄀䈀㔀䈀䔀䔀䈀㠀㘀㤀　㤀㠀㔀䄀䔀䈀㜀㐀䐀䈀　　㘀䌀㄀㈀㠀䘀䌀䘀㘀㘀㐀䈀䔀　䘀䈀㜀㈀䐀䐀䌀　㐀䄀㘀䄀䈀䘀䄀㌀　㌀䘀䐀䈀㤀䈀䄀㤀䐀䈀㜀㈀㐀䄀㐀㤀㜀䈀㐀䄀㠀㄀䌀㜀㜀㈀　㔀䘀㈀㈀䌀㤀䌀䈀䘀㘀㔀䈀㜀㈀　㔀㌀㜀㈀　㤀㌀䔀㤀䄀䄀㈀㌀　䔀䐀䌀㔀㄀　㌀䈀㔀䐀㈀䌀㄀㘀䄀䐀㔀䄀䔀䈀㔀䘀㜀㠀䈀㔀䐀　䌀䔀㠀䌀㌀㔀䌀㘀䐀㔀䈀䔀㤀㈀䐀䄀䈀㐀㜀䈀䐀㠀䈀㘀䈀㜀䌀䌀㠀㐀㈀㘀㄀㜀㐀䘀䐀㌀㐀㌀䐀䈀䐀䄀㈀㈀㠀　㄀䔀㄀㘀䄀㈀㄀㄀㜀䔀㄀䄀䘀㌀㤀㤀㘀㔀㠀㐀㤀䈀䔀㌀㔀㌀㤀㄀䄀䄀　䌀㌀㔀㌀㘀㄀䌀㌀䌀㌀䌀㄀䈀㈀㄀㌀䈀䔀　㜀㄀䔀䄀䐀㜀㘀㠀䈀䔀㜀䈀㌀䄀䌀䄀㜀　㜀㤀䐀　㄀䌀㔀㈀䐀㄀䌀䔀䄀㤀䐀䌀　䐀㌀㐀㔀䌀㘀䈀䌀䄀䈀䔀㈀䘀㌀䔀䌀㠀㔀䈀䈀䐀㌀䌀㄀㄀㈀㔀䌀䘀䐀䔀䔀䈀㈀䄀䈀㄀䈀䐀㠀䔀䈀　㐀䄀㔀䌀䔀䐀㐀㜀　㐀㄀㔀㌀䌀㘀㠀㄀㄀㔀䔀䔀䘀㐀䔀䈀䌀䌀㌀㈀㔀䘀䐀㠀䐀㜀㐀㤀㔀㈀㐀䘀㐀䄀䌀䌀㔀䌀䌀㤀㈀䈀㈀䐀㠀㔀䄀䘀㤀䘀䐀㐀㠀㤀㤀㌀㠀㜀㜀㈀㌀㤀㘀䘀䈀㤀㈀㄀㘀䘀䔀　㄀㐀㔀㜀㄀䈀㌀㠀㠀㘀㈀㜀㐀㈀　䄀䈀㄀㠀䐀㤀㈀㜀䌀㠀㔀㤀㘀㠀㐀　䘀㜀㠀㈀䘀䌀㤀㐀䘀㤀㐀㄀䔀㐀㔀䔀㤀㔀㔀䐀㜀㈀㠀䔀㜀䘀㄀㤀䐀㘀㔀㈀㜀㜀䔀㔀㜀㤀䐀㐀㈀㤀㠀㤀䔀䌀㄀㔀　㐀㔀㘀㘀㤀㤀㜀㤀䘀㄀㘀　㄀㜀　㜀㜀㄀㤀　㄀㄀㜀䘀䘀㤀䐀䔀䘀㐀㠀㐀䔀㜀㜀　㈀䈀㠀䘀㘀䐀㠀㐀䈀䘀㜀　　　㈀䘀䘀㔀㐀㔀㘀㈀㠀㌀䘀㜀㜀㜀㌀䔀䐀䌀㤀㌀䈀㈀㜀㘀䈀　㘀㈀㜀　　㐀䔀㄀䄀䈀䈀㘀㈀㌀䄀㔀㌀㔀㄀䐀䘀㄀䌀㠀䈀䄀䐀䐀䘀䔀　䐀　㠀㜀䘀䈀䈀　㄀㐀　䐀䄀䔀㄀㐀㐀䔀㤀　䘀㔀㜀㔀㈀㈀　㠀㠀䘀䌀㘀㠀㘀䌀䄀䄀㈀　㘀㜀䄀䔀　䈀䌀㐀㘀䐀㠀䈀㜀㠀㤀㔀㔀䔀㐀䐀㔀㈀㠀㄀㜀㠀㜀㤀㠀㄀䔀䌀㐀䈀㌀䌀䈀䘀䄀㠀㜀㄀㘀㔀㈀䘀䄀㐀䘀㈀㄀㐀䈀㌀㠀㜀㐀䐀㔀㔀㤀㐀㘀㠀㌀䈀㈀䌀䈀㘀䐀䐀㄀䐀㐀　䔀䌀㜀䌀䄀䐀㤀㔀䐀㜀　㌀㈀䔀䄀䐀㌀䈀　㘀　㔀䘀䔀㈀㤀㐀㄀䘀䘀㐀䔀䈀䐀䈀㐀㌀　䔀㔀䈀䔀㘀　䈀㘀䄀㔀㄀䐀㘀　㄀䔀㐀㘀㘀䔀䌀䐀䌀㌀㌀㠀㌀㔀䘀㤀㌀㈀䐀㈀䘀㈀䘀　㘀䔀㤀　䌀䔀㠀䄀㈀䈀䄀䄀䄀䘀䄀䐀㤀㠀㔀㠀㈀䘀㌀䈀䘀㘀䌀㠀㌀㜀䄀㔀㌀㈀䔀㐀㤀䔀㄀䔀㐀㠀㠀䄀䔀㔀㜀㜀䌀㐀㔀䌀㘀㈀䘀㘀䈀䘀䘀㈀　㤀㐀䐀㐀㈀䔀㐀㄀㠀㘀㤀㄀㘀㄀㘀　䐀㘀䌀㐀㠀㘀　㌀㘀　㜀㜀㜀䔀䐀㄀㈀㈀㔀䈀䘀䐀㘀䌀䐀㠀㘀㘀㐀䐀䈀㌀䘀䈀㘀㐀䐀䄀㜀䐀䘀䌀䄀㈀㠀　　䄀㔀䌀㄀㈀䌀㄀㐀㌀䈀㘀　㈀㜀㘀㌀㐀㜀㌀䈀　㤀䔀䄀㄀䈀䄀㌀　䐀䈀㄀　㠀䘀䌀㈀䌀㌀㘀䔀㤀㘀䘀㤀㘀㠀㘀㈀㐀㔀䘀㤀㤀䘀䘀㘀䐀㈀㐀㠀㔀㈀㌀㈀㐀㄀㤀㄀　㈀䘀㌀㄀䔀㌀䘀㠀㔀䌀㜀䐀䌀䈀㐀䐀䔀　㔀㠀㠀䌀㘀㄀　䔀　䈀䈀䌀㠀䘀䌀㠀㐀㠀㠀䘀㜀㌀㘀㐀㐀㌀㔀㐀䈀㐀㔀䘀㌀䈀㤀㘀　㌀㤀㄀　㈀㜀䌀䔀㔀䔀㔀　䘀　䘀䘀　䘀䘀㐀䐀㠀㔀㘀䌀䘀㐀㤀㠀㤀㌀㤀㐀㄀　　䔀䘀㠀㈀㤀　䌀㔀㌀㤀䘀㔀㤀㘀㠀㌀㈀䈀　䈀䈀㄀䌀䄀㠀䌀㔀㤀　㐀㜀㔀㘀䐀㠀㤀䘀䌀㤀䔀㤀䌀㘀䌀㌀㠀㘀䘀䘀　㘀㜀䄀䔀㈀㤀㤀䄀䔀㈀㈀㠀㠀　䈀㤀㐀　　㜀㐀㔀䐀㘀䘀䄀䘀䔀㄀㠀㘀䘀䘀䌀䔀㐀䘀㘀㈀䔀㤀䔀㈀㄀㐀㤀䐀䐀㄀䌀㌀䄀㈀㤀䔀㄀䘀㔀㌀䔀䐀㔀㠀㌀䔀㠀䘀㈀㠀㘀㌀䌀䄀䄀䘀䄀䐀㠀㠀㤀㄀㈀䄀㘀　㜀䄀䔀䄀㜀㐀䐀䌀　㌀䄀䔀㐀㠀㌀㠀㌀䔀䔀䄀䘀㤀　㌀㐀　　㔀䘀䐀䘀㈀㤀㠀㐀䈀䈀䔀㘀㠀㌀㔀㠀䔀　㌀㌀㐀㐀㐀　㈀㐀䌀㘀　㐀㌀㐀㌀㐀㘀㐀㘀㈀㐀䔀㔀㠀㄀㘀㘀䄀㐀䄀㐀㤀㔀䈀㌀䔀䌀㠀　㘀㌀㠀　㔀䈀㤀㌀䌀㐀㠀㘀　䌀䘀䄀䔀㄀䐀䈀䈀䄀䘀㄀㔀　㘀㄀㔀䌀㤀㜀㘀䄀　䘀㘀䘀䐀㐀㄀䔀䐀㈀䘀㘀㐀㤀　䘀䈀㘀䔀㌀㤀䐀㈀㜀䌀㤀㄀㌀㐀㐀㐀䐀㜀㔀　䈀㜀䄀㤀䈀　㌀㄀㜀㄀㌀㔀䘀䔀䔀㌀䌀䄀㘀䘀㐀㔀㘀㠀䐀䐀㈀㄀㈀䌀　　㌀㄀䐀㌀㐀䈀䄀䐀㜀㈀㌀㘀㌀　㘀䔀䘀㈀㈀　㌀　䈀㠀䘀㘀䘀䄀䐀䈀㤀䐀㐀㌀㔀䌀㜀㜀　䔀䔀㄀䈀㈀㈀䄀䈀䐀䈀㔀䄀㈀䔀㘀䄀㜀㈀䄀㠀㌀䌀䘀㌀㈀㌀㘀㄀㠀㌀㌀䄀䈀䐀䌀㐀㘀㈀㔀㄀䈀㠀　㜀䐀䔀　㄀㈀䄀㌀　㜀㄀䄀䌀　㈀㌀㄀㘀㐀䌀䈀䘀㜀䄀㤀䌀　䘀　　　㄀㔀㤀㠀䈀䄀㔀㔀㠀㄀㈀㘀㄀䌀㔀䐀䄀䄀㐀　㌀㌀䈀䌀䐀㜀㄀㔀㤀䌀䌀　䌀䐀㌀䐀㤀䐀㠀㤀䈀䈀䔀䔀㌀　㤀㄀㌀䄀䄀䌀㘀䈀䘀㐀㈀䔀㜀㌀㤀　㈀䔀䔀䈀㘀㈀䌀䔀㐀　㌀䄀㐀䈀䄀䈀䈀㤀㌀䐀㘀㌀䐀㈀　㘀㤀㐀䔀㈀㤀㤀䌀䘀㘀䔀㄀㜀䘀㠀㤀㐀㄀䌀㠀㔀䘀䄀㔀㜀䔀㔀䈀䐀䐀䔀㐀䐀䈀䔀㤀㐀㌀　㠀䐀䌀㄀㐀䈀䈀㐀㈀䐀䌀㔀㠀㔀䐀㄀㤀䔀㔀䄀䔀㄀䘀㔀㄀䐀㔀㘀㄀㜀㠀䄀㌀㤀㠀䈀䘀䌀㌀　䈀㌀㈀䐀䈀㔀㠀䐀䐀䄀䈀㈀䔀㠀㄀䈀䈀䄀㄀㠀䈀㜀䄀㄀㈀䄀䈀㘀䘀㌀䄀㄀㈀䔀㄀㘀㠀㘀䘀　㄀䔀㘀䌀䈀䐀㤀㐀䄀䔀㤀䈀㜀㤀㘀㘀㤀㐀䌀䘀㘀㐀䄀㤀䄀㌀　㘀䄀䘀䈀㜀㈀㐀䌀㐀㔀䄀䄀㜀䄀　㄀㜀㘀䈀㜀　㈀㔀㐀䈀䔀㄀䈀㠀䘀　䈀㄀㘀䐀㠀㈀䈀㈀㜀㐀㜀䄀㌀㤀䌀䄀㌀㄀㜀㄀㘀㈀㠀㄀䘀㠀㐀㈀　㔀㘀㐀䄀㔀䘀㘀㤀　䈀䄀㘀㤀㜀䄀㘀㔀　䘀䄀㘀㤀㠀㄀㔀㠀㜀䄀䘀䄀䐀㤀䘀㈀䄀㠀㌀䈀䈀㠀䈀䌀䔀䄀㔀䌀䐀䘀㄀㌀㠀䄀䔀㤀㔀䈀㈀䈀䌀䔀㤀㜀㐀㔀䘀㜀㔀㈀䘀䘀㌀㈀㜀㔀㄀䄀䈀㜀䄀䐀䄀䄀㌀㄀䈀䌀䈀䄀　䈀㤀䘀䔀䌀㈀䈀䄀䔀䄀㌀䔀䈀䌀䔀䈀䌀㈀㌀䘀䌀䈀㤀㈀㄀䔀䐀䔀㠀㘀㤀㔀䄀㔀㠀䐀㠀㌀㤀　䄀㜀䐀㜀㔀䔀㄀䌀㔀㘀䌀䌀㤀㤀㘀䐀䌀㔀　䔀䔀䐀㈀䄀㈀䔀㐀　㘀䐀㜀㈀㄀䈀䔀　　㌀䐀㐀㔀㠀䔀㘀㔀㘀㠀䐀㐀㔀㔀㤀㠀㠀㌀㄀䄀㐀㌀䐀㘀䄀㠀䌀㄀䘀䄀　䌀㘀䐀㠀㄀㐀㈀㤀㘀㐀䈀䈀㄀䔀㌀㌀㈀㈀䔀㤀㔀　㠀䘀㔀㤀䔀　䄀㄀㐀㐀䐀䌀㘀䔀㌀㘀㈀㔀䔀㠀㈀䄀　䔀㄀㈀䄀䈀㐀㘀㔀㔀㐀㐀䄀䄀㈀㤀㘀䘀䈀㘀䌀䘀㠀䈀㘀㐀㄀䄀㜀㄀䌀㤀㌀㈀㤀䘀䘀䘀䌀　䈀㔀㠀㜀　㄀㄀㠀㔀䌀㤀㤀　䐀㔀䔀䔀䈀䄀䔀㈀䔀㔀　㌀䄀䄀㌀㔀䘀㔀㐀㘀㌀䄀䌀䄀㐀䐀㔀䔀㈀䐀㜀㔀䈀䐀㐀䐀䐀㠀䐀㠀䌀䈀㔀䄀　㜀䌀㔀䘀䔀㌀䔀䈀㈀䔀䈀　　㈀㈀㜀䈀䘀　㄀　㤀䈀㄀䄀㤀䄀㘀䐀㜀䐀㔀㌀䌀㠀䌀䘀䐀䐀㐀㐀䄀䄀㈀䔀㤀㜀㔀㌀㔀　㜀䈀䘀㈀㐀䈀㌀㤀　䌀㠀䈀㔀㄀㜀䌀䐀㜀㤀䔀䌀㌀㌀㘀㘀㔀䈀䔀䈀䐀㠀㠀䈀䌀㘀㠀䐀㤀䄀䌀　㤀㌀㄀㘀䘀㈀㜀䐀䈀䄀䄀㌀㘀䔀㤀㐀㜀㘀䄀㈀㐀䌀䔀䄀䄀㌀䌀䔀㄀㜀䔀㘀㠀䔀㄀㐀㔀㔀㜀䈀㄀䔀㄀㌀䄀㈀䘀䈀䔀䔀䄀㈀　䈀㌀㠀㠀䌀䔀㐀䐀㌀㔀㌀䄀㘀䔀㄀㐀㤀䈀㤀䘀䔀㌀䄀㜀㌀㐀㜀　㜀㄀㌀㐀䔀䄀㤀㐀䈀䌀㜀㄀㤀㠀䔀㈀㤀㄀䔀㄀䈀㌀㌀㠀䄀㄀㐀䐀䌀䐀㐀㜀㤀㄀㘀㘀䐀䔀㔀䈀䌀䔀㠀䌀㈀䔀㈀䈀㤀䈀㜀䄀㠀䌀㘀㄀䈀㈀　㌀㐀䔀㤀䘀㌀㈀㜀㐀䘀㐀㘀㌀㘀㄀䘀䌀㄀㌀䄀䐀㘀㈀㄀㠀䐀㤀䐀　䌀䌀䔀䈀㘀䘀㘀㈀䄀䘀䌀㔀　㠀㜀䐀䈀䈀㜀㘀㠀㘀㔀㘀䐀　㘀䌀䘀䐀㐀䐀㘀㐀㔀䈀䐀㜀䐀䄀　䈀㐀䔀䔀䄀㘀㠀㘀㤀䈀㠀㠀㄀䐀䌀䄀䔀㤀㤀㔀㘀䔀㄀䌀㌀　䔀䈀䔀䔀䘀㔀㐀䐀㔀䈀　㜀䈀㤀䈀䔀㠀䔀㜀㄀㐀㐀㠀䌀䐀䄀㜀㜀㤀㐀㤀㠀䌀　㜀　㔀　㐀䐀䌀㜀䄀㄀㘀䌀㄀䌀㤀㠀㜀㠀㜀㄀㠀㈀㘀㔀㄀　㄀㘀䔀　㘀䔀䌀䌀㌀㤀㌀　㈀㤀㘀䐀㠀䈀䐀䐀㜀㐀䘀㘀㔀㤀䐀㄀䄀㘀䔀㐀㜀㘀䌀㐀㠀　䔀㠀㔀㤀䔀㔀㜀㐀㔀䘀䘀㤀㜀㜀㌀䔀㄀䘀㘀㐀㠀䔀㤀　䌀䈀䐀䌀䄀㐀㈀䈀䌀㈀䐀㠀㠀䌀䈀㘀䘀㌀㤀㠀㘀㐀㈀䄀㤀㔀䄀䈀㤀㤀㘀㐀䄀䘀㄀䌀䈀㠀㔀䄀　㤀䈀䄀㔀䄀䈀㘀㈀䐀㌀䄀㐀㐀㐀䔀㜀㜀㜀㄀䈀㜀䔀㤀䔀䈀　䘀㜀㠀　㘀䔀䔀　　䈀㌀㈀㄀䔀㜀㈀　㐀㜀㤀䈀　㤀　㐀䘀㐀䌀㌀䌀䔀　㜀䌀䘀䈀㈀㌀䐀䘀　㜀㘀㈀䈀㠀㌀㈀㘀㐀䘀䔀㔀㠀㐀䘀䈀䄀㠀㠀䈀㘀㄀䔀䄀䌀㤀㈀㄀㜀㈀㌀　㤀䄀㈀䐀　㜀䌀䈀㐀㤀㌀䐀　㤀䌀䘀㜀䌀㈀䈀㘀䘀㤀䈀䐀䌀䈀䔀䄀䔀㌀䄀䔀䄀㐀㐀䈀㐀䈀㘀　㜀䈀㄀㜀䐀䄀㜀䄀䈀䈀䄀㠀㠀㠀㌀㌀䈀䄀䐀㄀　㌀㌀䄀㐀䌀䘀㌀㠀䄀䔀㠀䌀㠀㘀㐀䔀䄀䐀䌀㈀䈀䐀䐀㜀　㌀㘀䘀䈀㘀䔀䘀㄀㄀䈀㌀䄀㠀䔀䘀㄀㈀䄀䈀䈀㠀䌀㘀䄀㠀㈀㘀㐀䌀㌀㠀㠀㤀㈀　㠀㐀䈀㄀㤀㐀㤀䈀䔀㘀㔀㔀㌀㠀㤀　㤀㔀䈀㄀㈀　㔀㤀㘀㤀㠀㘀㔀㜀㔀㜀䄀䄀䔀䔀㐀䈀㔀㘀䔀㜀䈀㤀䌀䄀　㤀㠀　䔀㄀㘀䈀䌀㜀㐀㈀㔀㜀䔀㤀㌀㤀㈀㠀㄀㌀䔀㌀　䌀　㠀㤀　䐀㤀㐀　䘀㜀㈀㌀㔀䌀䔀䈀㐀䄀㤀㤀㤀䔀䄀䐀䄀㤀　㜀㠀䔀䐀　㄀䄀㘀㔀䌀䈀䔀㈀䈀㄀䔀䌀　㈀㈀㤀㌀㈀䘀㤀䄀㐀䘀㤀㔀䌀䌀㜀䈀䘀㔀䌀䌀㔀䔀䔀䄀㌀㈀㠀䘀㐀䄀䐀䘀㠀㌀䈀㐀㠀㔀䔀㐀㜀䈀㄀㄀䐀䐀䌀㈀㄀䄀㔀䌀䈀㄀㌀䐀㔀㈀䔀㔀䈀㘀㌀㄀䔀㌀䌀䘀㔀㠀㌀䈀䐀㌀㄀㠀䘀䔀㠀㤀　㤀㠀䌀㜀㄀㐀㠀㔀䌀䌀㜀䈀㘀㈀㄀䔀㈀㘀㈀㐀㔀䐀䌀㘀㌀䌀䌀䌀䘀　㜀䔀䐀㔀㘀㄀䘀䄀䔀㜀㐀㤀㌀㈀㈀㌀䔀㠀㠀㠀䘀䈀㠀㤀㄀㔀䈀㐀㠀㌀䄀㔀㐀㘀　㈀㄀㤀䐀㌀　䌀㠀䔀㘀䄀㜀㘀㘀㔀㔀㘀䄀㈀䄀㤀㌀㘀㐀䘀䐀㈀㘀䐀㤀䌀㔀䌀　㌀䄀㔀䌀㈀㠀䘀䈀㤀㠀㔀　㌀䐀䐀㐀㘀䘀䈀㄀㤀䐀㘀㘀䄀㔀㤀䘀㤀䔀䄀䈀䌀㔀㔀㜀㄀䔀㘀㜀䄀㘀㠀㄀㜀㐀㔀　㄀䐀㈀㈀　㌀㘀㘀㌀㐀㌀㈀䔀䈀㈀㐀䌀　㈀䈀㐀㐀㔀䐀㌀䐀㈀㌀㤀㤀㤀䐀䔀　䐀㠀㠀䘀䌀㈀㠀䈀㘀㘀㄀㌀㄀㐀䄀䔀䐀䐀㘀㈀䄀䐀䔀䄀㄀㐀䈀㠀㜀㜀㈀㔀㐀㜀䘀䌀䘀㠀䈀䈀㘀㠀㠀㔀䔀䌀䐀㜀㔀㄀㜀㘀㠀㄀㄀　㌀㄀䈀䌀㐀㤀㔀㈀㄀㄀㐀㐀㘀䄀㠀䐀㠀㐀㘀㘀㤀㠀䘀䘀㔀㔀䌀㔀㘀㐀䐀㜀䐀䌀㄀䄀䌀　䔀㄀㄀䔀　䌀㤀㠀㄀㤀㌀　䌀㈀㜀䌀㄀㠀㘀㠀㄀㠀㌀㄀㔀䌀㜀㔀㠀㄀㔀㘀䈀㠀㌀㐀㜀㐀㤀　㜀㐀䄀㔀㜀㌀㐀䄀䈀㤀䈀㤀㔀䌀䌀㌀䐀䘀䐀㌀㤀㤀䈀㤀䔀䐀䐀㔀㠀㐀　䄀㜀䐀䘀㠀䌀㐀㐀䔀䈀㘀㘀䌀㌀䄀䔀㈀䘀䘀䐀䈀㘀㘀　㜀䔀㘀㠀㜀㠀㌀䄀䈀　䔀䌀㤀㠀䌀䘀䄀䐀䘀㠀䈀㠀䈀　㈀㐀䔀㔀㜀㄀㌀㌀䌀㄀㄀䈀䔀㠀䐀䘀䐀䌀　㄀㘀䌀䌀㄀䘀䐀㌀㠀䈀㄀䄀䐀䈀㔀㔀㜀䘀㄀㔀㌀䄀䈀䔀䄀㘀㐀㘀䘀㄀㠀㄀㘀㜀㤀㈀䌀䘀㄀㜀㈀䔀㜀䔀㌀䈀㔀㐀䄀㜀䌀䌀䄀㔀㈀㄀㐀㜀䄀䐀　㤀䘀䘀㌀㜀㤀䐀㈀䌀㔀㄀䌀䄀㜀䄀䘀　䌀䔀㐀㤀㠀䄀䐀㌀䐀㘀䌀䌀䘀㠀䌀㜀㘀㠀䈀䄀䈀㈀㘀䄀　䌀䔀䈀䄀　㈀㈀㘀㐀䘀䘀㜀㄀㘀㐀㘀䌀㐀㠀㜀㔀㠀㔀㜀䄀䔀㘀䄀㔀㄀㔀䈀䔀䈀䌀䄀㠀㐀䄀㐀㐀䈀䔀䈀䌀䄀　䌀㐀䘀㘀䄀㔀䐀䐀㐀㄀㠀㘀㔀㠀㄀㜀䔀䔀㜀㐀䄀䘀㈀㤀㤀䄀䄀㈀　䐀㈀㠀㤀㤀㔀㔀䈀䄀䄀䄀㄀　　䘀䔀䐀㌀　㔀㄀㄀㐀䘀㠀䔀䌀㈀㜀㈀㠀　㌀㄀　䄀　㔀䔀䈀㌀㘀䈀䄀　䌀䌀䈀㠀㔀㠀䌀　㐀㠀㐀㤀㤀㔀䄀䌀䘀䔀䘀㈀㌀㜀㌀㤀㄀㄀　㠀䄀㤀㤀㠀㔀㔀㘀㘀䔀㈀㌀䐀䌀㤀䌀㐀㜀䐀㠀㄀䘀㘀䄀㈀㄀㔀㔀䈀䐀㈀䐀㘀䔀㔀㔀㄀䐀㐀䐀㔀䔀㜀䈀㜀㔀䔀㜀䄀㌀䔀䘀㔀㘀䈀㈀㘀䈀㠀䈀　㘀㘀䈀䔀㌀㜀㐀䘀㜀㔀㔀䐀䔀䄀䌀㈀㠀㔀㐀䔀㌀䌀䌀䘀㘀䔀　㈀　㈀䔀䐀㠀㄀㠀㜀㄀䄀䄀䄀㔀㔀䘀㘀䌀䔀㜀㔀䐀㄀㄀䔀㘀䘀㐀㜀䈀䌀㘀㤀㈀䌀　㄀㜀䌀㈀　㘀䐀䘀䌀㄀㜀䄀㄀㌀㜀㈀㜀㈀㈀䌀䘀　㜀㘀䌀䄀　䐀㘀㔀䘀䌀㄀䐀㔀䘀䘀䔀㤀䐀䐀䘀㌀䘀䐀䌀㔀㄀㐀䘀䐀䔀䘀㐀䄀㘀㌀㜀㐀㌀䐀㌀䐀䈀㠀㈀䐀　　䈀㈀㜀䘀㔀䈀䘀㜀㘀㜀㠀䌀䔀㔀䌀　䈀　䈀䈀䌀㔀㄀䘀䘀㠀　　䔀䈀䘀㄀㐀䈀㤀㐀䄀㤀㤀㌀䐀䔀㤀　䔀㔀㄀䌀㤀㠀㜀䈀䄀㘀䌀㄀㠀䘀㔀㜀䘀㤀㜀㠀䄀䐀䈀㌀㘀䈀㜀㤀㔀䔀䄀㌀㄀㤀　㐀䘀㤀㘀䘀䐀　　䌀䔀䐀㈀㠀䐀㔀㄀㄀　㘀㈀㠀㜀䈀䘀㘀㔀㜀㄀䐀䘀㐀䔀㌀㜀䘀㘀㌀䄀㌀㘀㜀䈀䐀㈀㄀㈀㤀㄀䐀䔀䄀䄀㄀㘀㐀䘀㔀㜀㈀㜀㌀䔀䔀㔀㈀㠀䐀䌀㜀㜀㜀㄀㔀䔀㈀㈀㤀㄀㄀䘀䌀䈀䐀䄀㈀㌀㠀㄀㔀㌀㘀䈀䐀㤀䈀䔀㄀䐀䐀㈀㔀䌀㌀㘀㠀䌀㤀㤀㜀䄀㜀㤀䌀㔀䘀䔀㤀㈀䔀　㐀㄀㐀䘀　㤀䔀㤀　㤀　㜀㤀㔀　㄀　䌀䔀䐀㄀䈀䐀䈀㄀㈀　䘀䈀㄀䌀䄀㄀䌀㜀㜀㘀䌀㘀　㄀䐀㔀㈀䈀㈀㌀㜀䔀㘀㈀㔀　䔀䈀㄀䌀䄀䐀䌀䈀㘀㘀䌀㄀㠀㤀㄀㜀㐀㘀㠀㤀㔀㔀㤀䔀　䘀䐀㠀㘀㘀㈀㜀㜀㈀㌀㐀䈀㔀㤀㄀㘀㤀䐀㠀㔀㔀㘀䔀㠀䔀䔀㠀　䘀㈀㄀㄀　㌀㈀㌀㔀䐀㌀䘀䌀㜀䘀㐀㜀㔀㌀䘀㄀㐀㘀䔀㌀㜀㘀䘀䐀㠀䄀　㠀㌀㜀㄀㜀䄀䌀㤀㈀㤀㐀䈀㠀　㤀䌀㘀䌀㠀㌀㄀㤀㔀䔀㠀䌀　䐀㘀䈀㄀㘀㜀㠀㔀䐀㐀㠀㐀䄀　䄀䔀　㐀㈀㐀㤀䈀㔀㐀䔀　　㘀䘀㌀䈀䌀㌀㤀㠀䘀㔀㔀䄀䈀㐀䈀㔀㄀　䐀㘀䔀㈀　䔀䘀䈀䐀㄀㌀䈀㤀㄀㔀　㄀䌀㔀㈀䐀㈀䄀䄀㄀䄀㄀㄀㔀㔀　　䌀䌀㐀㄀㈀㜀㜀㐀㐀㠀䘀㔀㌀䌀㤀㘀䈀㔀㐀䘀䄀䘀㠀㔀㈀㌀㌀　㔀㔀㐀㌀䘀䔀䔀㌀䘀㘀㌀㘀䔀㈀䐀㐀　䌀㘀䈀㠀㄀㔀㜀㐀䈀䔀㄀㜀䔀䔀䈀䔀㔀䈀㔀㈀䌀㘀㤀㜀㄀䄀㔀㜀㌀㘀㈀䔀㄀㠀㜀㘀䌀　䌀䐀䔀㘀㠀　䈀䘀㜀䈀䈀㌀䄀䔀㄀㐀䘀䄀䘀㔀㄀䄀㐀䄀　㤀　䐀　㔀㘀㜀㄀㄀䄀䈀㘀㜀㜀㈀㈀䐀䔀㘀䈀䌀㔀㌀㌀䄀㘀　䔀㐀䘀　㜀䔀㄀㐀䄀㠀㄀㤀㤀㌀䘀䌀䈀䄀㈀㄀䌀㔀㠀㘀䔀䈀㈀㐀䄀䌀㈀　㈀䌀䘀㔀㤀㠀䔀䌀䘀　㈀䌀䘀㤀㈀㤀䘀㄀㔀㌀䄀㜀㠀䌀㌀㄀㈀䐀㤀䄀䘀䄀㔀㠀䘀䈀㈀　䔀䐀㐀䔀㐀䐀䔀　㌀䔀䔀㄀㠀䌀㠀㜀㔀㈀䌀㐀㤀㤀㐀㔀䐀䘀　䈀㈀㄀㐀䄀䄀㤀　䔀㘀㄀　㌀㔀䔀䘀㤀㈀㈀　㜀　㌀　䘀㔀㠀　䔀㄀䐀㐀㠀㌀㄀䘀㐀㘀䌀㜀㈀㠀㠀䈀䈀　㄀䘀䐀䈀　㠀㘀䘀㄀㠀㘀㜀㔀䈀䈀䈀䔀䈀㐀䘀䔀㈀㔀㄀㠀㠀䌀㄀䌀䔀㜀䐀㤀㄀䈀㘀䐀䐀㔀䔀䄀㤀㤀䐀　㘀㌀䌀　㜀䐀㤀㄀㜀　䄀㘀䐀㔀㠀㌀　㌀䈀㜀㄀　　㈀䘀䌀㌀䐀䔀　䔀　䈀䈀䌀㔀䔀㤀㈀㘀㌀䄀㄀䔀㐀䔀　㐀㤀䄀㐀㜀䄀䘀䔀㄀䔀㔀　䘀䈀㈀㠀䌀㔀㤀㘀㌀䈀㈀㠀㔀㐀㘀䈀㄀䈀㐀　㈀䌀䘀㠀䘀㔀　㘀䌀㐀㐀䌀㘀䔀㈀䔀䔀㌀㘀㐀㌀　䔀䈀㐀㘀㔀䌀㘀　䌀䐀䘀　䈀㈀䌀䐀㐀㄀䐀　㄀㠀㄀㠀㌀㠀䈀㔀㔀㐀㔀㌀䈀䌀䘀㐀㄀㘀㔀㐀㜀㘀㤀䌀　䘀䐀䄀䌀㌀䌀㜀㤀䐀㈀㘀䈀䄀㐀䔀䈀㈀䌀　㄀㌀㤀䐀䐀㜀㠀㌀䔀䄀㐀㠀㔀㜀　䌀　䘀㄀䄀㌀㘀㄀䐀㄀䈀䘀䘀䐀䘀䐀䘀䌀䘀䐀䄀䔀㔀㠀　䈀㘀䐀㈀㘀㈀㤀㤀䐀䔀㐀䘀䔀㘀㌀䔀䐀㠀㤀㈀㄀㘀䈀㐀㔀䐀䘀㠀䔀㔀㘀㈀　䘀㌀䌀㘀䄀䔀䘀㤀䘀㌀䔀䔀㄀㄀　㘀㌀䔀䈀䈀㄀　㔀㈀㐀䈀㔀㤀䘀䄀䌀㜀㔀䐀㠀㜀䔀㈀㜀㄀䌀㐀　㤀㔀㐀䈀㘀䄀㄀㜀　䌀㌀䐀䌀㐀㜀䐀㐀㔀䘀㌀䌀䐀　䔀䔀㈀䈀㘀㈀䔀䈀䔀　䈀䌀㤀䄀㤀䄀㈀㄀㤀䔀㐀䔀㈀㜀䈀㌀㜀䔀㈀㈀䔀㄀㈀㤀䌀㈀㈀㔀䐀䔀㘀䐀㔀㐀䘀㈀䘀䔀䔀㈀㈀㤀㄀䘀㠀䐀䌀㜀䄀　䔀䄀䔀㤀㄀㌀㠀䈀㤀䄀䌀㜀　㜀㄀㜀㜀　㘀㄀㤀㘀䐀䘀㠀䌀㠀䐀䔀㈀䈀㘀䔀㔀䈀　䈀䌀䔀㤀㔀㠀䄀㘀䘀䘀㌀㠀䈀㄀㘀䘀㠀㈀䔀㘀䄀㜀䔀㐀㌀㌀㈀㈀㤀䌀䌀䘀　䄀䔀䈀㜀㜀䐀䐀㘀䔀䐀䈀㜀䌀㈀䔀䘀䄀㠀㔀䘀䐀㔀䌀䔀䈀䌀䐀㌀䈀䈀䐀䌀㘀㌀䐀㔀䄀䄀㐀㄀䘀䈀㠀㠀㜀㔀䘀㄀㐀㤀䈀㄀㌀㌀㄀㌀㘀䈀䈀㤀㄀䌀䌀㐀㠀䐀㄀䐀䌀㐀䐀㠀䈀㄀㠀䔀㈀㠀㌀㌀䄀䘀㜀㐀㤀　㠀䘀㜀　㌀㈀䐀㈀㐀㜀　㐀㔀㘀䔀　㠀㜀䌀㔀㜀㔀㄀䌀䈀㜀㈀㄀䘀㌀㠀　䄀㄀　䈀䈀䐀䌀㜀䌀㘀㐀䈀　䔀㠀㤀䔀䈀䈀㠀䔀䐀㐀㌀㌀㘀㈀㈀䔀㤀㌀㈀䄀䔀㘀㌀㠀㘀䘀㜀　㤀　䐀㠀㘀䐀㔀㄀㜀䈀　䈀㠀㔀㐀㘀㠀㄀㐀㤀㔀㈀䘀䈀䔀㔀䌀䈀㜀䐀㄀　㔀㌀䔀㤀㌀㐀㌀　㄀䈀䈀㔀㘀䄀㘀䄀㈀㈀䈀㘀㤀㄀䌀䈀㐀㌀㘀䈀㤀㤀㠀䌀䘀㤀㄀㘀　䔀　䐀　䈀䌀㤀䈀㠀䔀䈀䈀㠀　㌀㤀㈀㔀䌀㘀㈀䐀㌀㐀㤀䈀㘀䔀㜀㘀䄀㌀㈀㔀㐀㘀㘀䈀㈀䄀㌀㘀㔀㄀㜀㄀㘀䈀㔀䐀㤀㌀㠀㄀䘀㈀䔀㤀㔀䄀㜀㘀㜀䌀　㌀㘀　㤀䘀㤀䔀䔀㈀㐀䌀㠀䈀㠀㐀㘀㤀䔀㈀㘀㜀㘀㌀䈀䈀䘀㐀㐀䐀㔀䈀䈀㠀㠀㤀䘀㘀㘀㠀㜀䔀㌀㜀㔀㜀㤀㔀㤀䈀㔀䐀㐀㐀㜀䄀䄀㔀䈀䄀㤀䔀䌀㤀䈀㐀䌀㜀　䘀㄀䔀䌀㤀㜀㐀䘀㜀㐀　䐀䐀㠀㌀䐀䐀㌀　㈀㠀䔀㈀㘀䘀㤀䈀㔀䔀䄀㤀䈀䔀䔀䔀㄀䌀㤀㤀㐀䄀　㜀㄀䔀䌀㠀䈀㄀㘀䐀䄀䐀㔀䈀㘀䐀㌀　䄀㠀㄀㐀㤀䔀㄀㈀䈀䐀䈀䐀㠀䘀㜀䈀䄀㌀㠀䌀㘀䔀㔀㔀㐀　㈀㌀䐀㜀㌀㄀㌀㌀㔀㤀䈀䄀䔀　㈀　䄀㠀㄀㐀㘀㄀䘀䔀䐀㌀㐀㈀㈀䘀㄀㜀㐀㄀䄀䌀㘀㐀　䘀㌀䌀㄀㜀㐀㄀䄀䌀　　㤀㌀䄀䌀㄀㘀㜀㠀䈀　㈀㜀䄀㔀㤀㐀㈀㘀㈀㐀㌀䔀　䄀　㜀　㘀㘀䌀䌀㜀㤀　㐀㤀㠀㐀㠀㄀㤀㄀㔀㄀㘀䐀㜀䐀䈀䘀䘀㠀　㐀㌀㜀㜀䐀㜀䄀䄀䈀　㘀　䈀㠀㜀㈀䐀䐀　㔀䐀㄀㐀㘀㤀㠀㄀㠀㜀㄀　䐀䄀䔀　䔀㤀㐀䄀㤀䌀䐀䌀㈀䈀䌀㠀㤀䐀㤀㌀㐀䈀䌀㜀㘀㌀䈀㜀䌀䔀䔀㜀䈀䐀䔀㠀㜀　㘀㜀䈀䐀㐀䌀㈀䔀㈀䄀䄀㌀䌀　㠀䘀㤀㠀　䐀䈀䘀㔀䔀㘀䄀㐀䐀㔀䄀㔀㤀㄀㔀㠀䐀㤀㌀㤀㤀㄀䌀　㤀㠀　㈀䔀䄀䌀㐀㠀㌀㠀㔀　㐀䐀㐀㤀䈀㈀　㜀䐀䔀㈀㄀㈀㘀㤀　䄀䈀㄀㘀䘀㘀㜀㘀䄀䌀㔀䌀　㠀㐀䌀㈀䄀䌀㘀䘀䔀　㘀㐀㘀㄀㄀㘀䔀㔀㐀㄀㘀㜀　㤀㐀㌀䘀䐀　㠀䄀㘀㘀㌀　䔀䈀㜀㘀㈀㐀㔀㤀䘀䘀㐀㄀䌀㈀㘀　䄀䘀䘀䄀㤀㌀㈀䌀䘀㄀　㔀　䈀䄀㤀㈀㤀㔀　㠀㤀㘀㌀　䘀㌀　㠀䌀㐀䌀㤀䄀㠀㄀㘀䔀㜀䈀䄀䄀䘀㔀㄀䌀㘀㌀䐀㔀㐀　㔀㈀䐀㌀㈀䌀䐀䐀㐀㈀㤀㘀䔀㘀䈀㘀䌀㠀　䘀䘀㈀䐀㘀㐀㈀㈀䄀㐀㤀㈀䄀㐀䈀㔀䈀䄀䔀㘀㔀㈀㌀䔀㜀䌀　㈀㜀㐀㔀㐀䘀㤀㌀㜀㐀　㈀　㔀䄀䈀　㤀㜀㄀㘀㜀㔀㌀㄀㔀㐀㌀㤀䔀䄀㄀㠀䈀㘀䘀䔀䘀䌀䔀䄀㠀㐀䈀㘀䘀䈀䈀䐀㘀䐀䄀㔀䔀䘀㤀䌀䈀㌀㘀䄀䐀䈀㔀䄀䄀　㜀䐀䈀㔀㘀䈀㠀㤀㠀㤀䄀　㠀㘀䘀㐀㔀㤀㤀　䐀䘀㔀㐀㌀　㘀㤀䄀㐀䘀㌀㄀䘀䌀㘀　䌀䘀㐀㐀䘀㌀㄀　㘀㜀　㄀㐀㘀㘀㌀䘀䔀䈀䔀䈀䌀䈀䌀㜀㠀　䘀㌀㐀䌀㄀　㄀䔀㔀䈀䘀㜀㘀䔀㌀䌀䈀䐀䘀䌀䔀㤀䘀㈀䈀䘀㜀㐀䌀㠀㠀㌀　䄀䌀䐀䈀㄀㐀㌀㘀㐀㐀㘀㠀㌀䄀䘀䄀䌀㔀䔀䘀㈀　㤀䌀㌀䘀䌀㤀㤀㤀䔀䄀䔀䐀䌀　䘀㐀　䈀㜀㠀䔀㜀㄀䐀䔀䔀䐀䌀㠀㔀㄀䄀䄀㔀㐀䔀䐀㌀䐀㘀䄀㜀䌀㘀㈀䔀㄀㐀　㤀㐀㤀㘀㔀㌀㌀㜀㘀䐀㌀㔀㌀㈀㌀㐀䌀㄀㠀㘀㘀㘀㄀㈀䌀䘀　㌀䔀䈀䌀䔀䔀㠀㘀䌀䈀㤀䘀䈀㔀䐀䌀䌀䐀䌀㄀㠀㠀㠀䔀㘀㘀㄀䘀　䔀㄀䄀㈀㘀　䘀䘀㜀䔀㄀䌀䐀㜀㈀㠀䔀䘀䌀㠀㤀㄀䄀㈀㐀䔀䘀㘀㈀㔀㌀㔀䈀䔀䔀䌀㈀㄀㠀㜀㔀㌀㠀㤀䔀䐀䐀㐀䄀䐀　㤀㄀䄀㌀䐀䔀㜀㜀䄀䌀䘀㔀䌀㘀䈀䌀㤀䘀㠀㠀㌀㜀㐀䔀䐀　䘀䘀䌀䘀䔀㔀㤀㔀䐀䔀䘀㐀䌀㤀㐀㤀䌀䔀㘀㌀㔀㐀㌀䔀㄀㘀㔀䌀　䘀㌀㤀䄀㌀㔀㌀䈀㐀㄀㐀　㄀㘀㘀㘀　　䔀　㤀㈀㌀㄀㔀㌀㄀㐀䔀㘀　䘀㈀䌀㈀㠀㌀㠀㠀㐀䈀㌀㜀䘀䌀䈀㈀䐀㤀㘀䌀㠀䈀㘀㘀　䈀㈀㈀　䔀㐀㐀䘀䐀䈀㌀㔀䈀㘀㤀㐀㘀㜀㠀䈀　㌀　䌀㌀㜀㠀㤀　　㤀㠀䘀　㤀䌀䔀䌀　㄀㠀㤀䌀㤀䌀㘀㈀㘀㐀　㘀㐀㜀㔀㤀䄀㔀㤀㌀㜀㐀䘀㘀䈀㄀䈀䌀䌀䈀㄀䈀䈀䌀㔀㠀㔀㔀䔀䈀䘀䄀㜀㘀䘀㔀䘀　㘀䌀䘀䘀㘀㌀㠀㐀㐀㘀㄀㠀㔀㄀㐀㈀䔀㜀䄀　㔀㔀㄀䈀䐀㤀䌀㈀㔀㔀　䘀㔀㜀䌀㜀㄀㘀㘀㠀㌀　㠀䔀㐀㜀䘀㄀䈀㘀㈀㌀㘀䘀䐀㔀㠀䘀㄀㠀䔀䌀䐀㔀㜀㠀㤀䔀㠀䄀㈀䌀䐀䘀㈀㠀　䘀䘀㄀㤀㤀䘀㌀㘀䄀㜀㔀㜀㄀䐀䈀㘀　㄀　䈀㠀　　㤀䌀㘀㠀䐀䌀䘀㄀䄀　㤀㄀㔀㌀䘀㐀䐀㐀䘀㜀㤀㌀㄀䔀　㠀㔀㈀　䘀䄀䈀䌀䌀㜀䄀㄀䔀㌀䐀㌀䄀䘀䄀㜀㈀㔀㈀㈀㈀䐀㤀㔀㌀㄀䄀㈀䈀䈀㈀䄀䌀䔀䌀㄀㘀㠀䘀　䈀㠀㜀䈀䔀䐀䈀㠀㜀㔀　䔀　䔀㤀㌀　㐀䐀䈀䄀㈀㈀䄀䘀䈀䐀㤀㠀䈀䔀䈀㜀㠀㈀　㔀㠀㄀䌀䘀㘀䌀㠀　㄀䐀䈀㠀㐀䔀　㄀䌀㜀㤀㤀㄀㌀㄀㘀㜀㠀㘀㐀㔀䐀㌀䐀㜀㌀䘀䔀㜀㜀㘀㐀㠀㈀　䄀䘀䔀䈀䘀㜀㔀㤀㄀㌀䈀㌀䘀䄀　䈀　䐀㔀㔀䌀䈀䔀㜀㔀䐀　䘀㐀䌀䔀㠀㐀䘀　㔀㌀㈀䈀　㄀㜀䄀㄀㔀㤀㤀㜀　䘀㄀㔀䄀䐀㘀㄀㜀㈀㜀㌀䐀䌀䔀䌀㘀㔀㜀䌀㐀䐀㠀㤀㔀　㌀䐀䌀㌀　䘀㌀㄀㔀㈀㜀㌀㘀䐀䌀㔀䌀㔀㐀䐀䌀㘀㘀䈀䔀䌀㠀㜀䔀㄀䌀䘀㌀㠀㔀㔀㄀䈀㠀　㜀㤀䔀㈀㘀䈀㈀㤀䔀㘀㤀䄀㌀䈀䌀㈀䐀㜀㔀䘀㘀䈀㔀㠀㠀㄀䄀　㤀䈀䌀䘀䔀㤀　㔀㔀䘀䌀㤀㔀㌀　䘀㐀㘀㔀䔀䄀䐀䈀䐀㘀㔀㔀㜀䈀䄀㠀䈀䐀䔀䈀㔀㈀㜀㄀㄀䄀㤀䔀䔀㠀㤀㈀㠀㈀㠀㘀㄀䔀䌀㠀㌀㜀䐀䔀㜀㜀　　㜀㔀㜀䄀㔀㠀㘀㜀㔀㜀㔀䐀㠀㤀㄀䈀䌀㘀㜀㄀㤀㠀䔀䔀䄀㠀䌀㄀㐀䈀㈀䐀㔀㄀㔀㔀䄀䄀㌀㤀㈀䄀㄀㐀䌀㈀䈀　㜀䈀㘀㘀䌀㔀䌀㌀㠀㔀䘀㐀䌀㤀䘀㘀䌀　䈀㌀㄀㘀䔀䔀㤀㐀䘀㜀䐀㜀㄀㔀㘀䌀㔀㌀㈀㈀㌀㜀䌀㜀㐀㄀㔀㘀㌀　　䌀㈀㠀䈀㘀㘀䐀䌀㄀䌀䈀㜀㔀㜀㜀㔀䐀䌀㠀䈀㄀㐀㘀䐀䈀　㈀㔀䌀㈀䄀㐀㌀䄀㤀㘀䔀䈀㔀䔀䔀䄀䌀㤀䈀㠀䔀䐀䈀㄀䐀㠀䈀䌀䈀㄀　䈀䔀㤀㄀䌀㘀㌀㘀䔀㐀㜀㘀䌀㐀㈀㔀㠀䐀䘀㠀㤀㐀䘀㌀㌀䄀㜀　㌀㘀㄀　㠀䈀䘀䄀䌀㌀㠀㄀㔀䔀㄀㠀㜀䔀　䌀㐀㠀㄀䈀㄀㠀䐀䘀㌀㠀㠀　㠀㘀䘀㤀䌀㤀䄀䄀㔀㐀䄀㌀㄀㌀　㔀㠀䔀㘀㘀㠀䈀䈀㔀㘀㜀㌀㔀䌀䈀䔀㠀䐀㜀㔀㤀㐀㘀㜀䐀㈀㠀㈀䄀㄀䔀䄀㄀㐀䐀㌀㄀䘀㤀㌀㌀㈀㠀䘀㐀䄀䈀㐀䔀㠀㘀㄀㈀㔀㄀䐀㌀䈀㠀㔀㌀㄀㔀䄀㠀䔀㤀㠀㔀㠀　䄀㐀㄀㐀㈀䈀㠀㄀䐀䈀㤀㌀㔀䔀㠀㐀䄀㘀㈀䘀㈀㐀㤀㄀　䘀䘀㐀㠀䘀㜀㜀䔀㠀㈀　㠀㤀㜀㔀䐀㐀䔀䄀㐀䔀㈀㘀㘀㄀䈀㠀㜀䈀㘀㜀䘀㐀㈀㌀㔀㐀㤀㘀䘀㈀䘀䘀　䔀㐀䔀䐀㈀㤀㤀㜀䔀㈀䔀䌀䈀㄀㄀㘀㈀䔀㄀㌀㌀㄀䈀䈀䐀㄀䐀䔀㐀　䄀䔀㈀　䌀㈀䐀㈀㈀　䈀㌀䌀　㜀䈀㤀　㈀㄀㄀䔀䔀㠀㄀㌀㜀㈀　䈀䌀㈀㌀㔀㘀㐀䔀㘀㌀㄀　䌀㈀㘀㌀䐀　䌀㌀㔀䘀䐀䐀䐀䄀䔀㄀㤀㔀㘀䘀㜀㔀㤀䔀䔀䈀　䌀㄀䐀㔀㌀㐀㄀䈀䈀䔀㤀㈀㌀㜀　㘀㐀㌀䔀㔀㠀䐀　㜀㜀䐀㠀㐀䌀㠀㌀䔀䐀㠀㘀㈀㤀䈀㌀　㄀㌀㘀䘀㤀㠀䘀䘀䘀　㜀䐀㐀㌀㄀䈀　㐀䘀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㔀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㔀㌀㜀㔀㘀㈀㜀㐀㜀㤀㜀　㘀㔀㈀䘀㔀㐀㜀㈀㜀㔀㘀㔀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀䔀㘀㄀㘀䐀㘀㔀㈀䘀㐀㘀㌀㄀㈀䘀㐀㈀㘀㄀㜀㌀㘀㔀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㐀㈀㐀㌀㐀㐀㐀㔀㐀㔀㐀㔀㈀䈀㐀㄀㜀㈀㘀㤀㘀㄀㘀䌀㐀䐀㔀㐀㈀䘀㐀㔀㘀䔀㘀㌀㘀䘀㘀㐀㘀㤀㘀䔀㘀㜀㈀䘀㔀㜀㘀㤀㘀䔀㐀㄀㘀䔀㜀㌀㘀㤀㐀㔀㘀䔀㘀㌀㘀䘀㘀㐀㘀㤀㘀䔀㘀㜀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀　㌀㘀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㘀㤀㜀㈀㜀㌀㜀㐀㐀㌀㘀㠀㘀㄀㜀㈀㈀　㌀㌀㌀㈀㈀䘀㐀䌀㘀㄀㜀㌀㜀㐀㐀㌀㘀㠀㘀㄀㜀㈀㈀　㌀㄀㌀㈀㌀㈀㈀䘀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㜀㌀㈀　㌀㄀㌀　㌀㔀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㘀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀䔀㘀㄀㘀䐀㘀㔀㈀䘀㐀㈀㐀㌀㐀㐀㐀㔀㐀㔀㐀㔀㈀䈀㐀㄀㜀㈀㘀㤀㘀㄀㘀䌀㐀䐀㔀㐀㈀䘀㐀㘀㘀䌀㘀㄀㘀㜀㜀㌀㈀　㌀㌀㌀㈀㈀䘀㐀㤀㜀㐀㘀㄀㘀䌀㘀㤀㘀㌀㐀㄀㘀䔀㘀㜀㘀䌀㘀㔀㈀　㌀　㈀䘀㐀㄀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㌀㤀㌀　㌀㔀㈀䘀㐀㐀㘀㔀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㈀䐀㌀㈀㌀㄀㌀　㈀䘀㐀㌀㘀㄀㜀　㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㜀㌀㈀㌀㠀㈀䘀㐀㄀㜀㘀㘀㜀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㐀㌀㐀㌀㄀㈀䘀㐀䐀㘀㄀㜀㠀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㈀㌀㘀㌀㘀㌀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㔀㜀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㐀㌀　㌀　㈀䘀㔀㠀㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㈀㌀㔀㌀　㈀䘀㐀䌀㘀㔀㘀㄀㘀㐀㘀㤀㘀䔀㘀㜀㈀　㌀㌀㌀㌀㈀䘀㔀㌀㜀㐀㘀㔀㘀䐀㔀㘀㈀　㌀㐀㌀㐀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㈀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㈀䐀㌀㘀㌀㘀㌀㔀㈀　㈀䐀㌀㈀㌀㄀㌀　㈀　㌀㈀㌀　㌀　㌀　㈀　㌀㜀㌀㈀㌀㠀㔀䐀㈀　㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㘀㘀㤀㘀䌀㘀㔀㌀㈀㈀　㌀㄀㌀　㌀㌀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㜀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㔀㜀㠀㜀㐀㐀㜀㔀㌀㜀㐀㘀㄀㜀㐀㘀㔀㈀䘀㐀㈀㐀䐀㈀䘀㐀䔀㘀䘀㜀㈀㘀䐀㘀㄀㘀䌀㈀䘀㘀㌀㘀㄀㈀　㌀㄀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㠀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㔀㜀㠀㜀㐀㐀㜀㔀㌀㜀㐀㘀㄀㜀㐀㘀㔀㈀䘀㐀㈀㐀䐀㈀䘀㐀䔀㘀䘀㜀㈀㘀䐀㘀㄀㘀䌀㈀䘀㐀㌀㐀㄀㈀　㌀㄀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㤀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㔀㌀㜀㔀㘀㈀㜀㐀㜀㤀㜀　㘀㔀㈀䘀㔀㐀㜀㈀㜀㔀㘀㔀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀䔀㘀㄀㘀䐀㘀㔀㈀䘀㐀㘀㌀㈀㈀䘀㐀㈀㘀㄀㜀㌀㘀㔀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㐀㈀㐀㌀㐀㐀㐀㘀㐀㔀㐀㔀㈀䈀㐀㌀㘀㄀㘀䌀㘀㤀㘀㈀㜀㈀㘀㤀㈀䐀㐀㈀㘀䘀㘀䌀㘀㐀㈀䘀㐀㔀㘀䔀㘀㌀㘀䘀㘀㐀㘀㤀㘀䔀㘀㜀㈀䘀㔀㜀㘀㤀㘀䔀㐀㄀㘀䔀㜀㌀㘀㤀㐀㔀㘀䔀㘀㌀㘀䘀㘀㐀㘀㤀㘀䔀㘀㜀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀　㌀㄀㌀　㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㘀㤀㜀㈀㜀㌀㜀㐀㐀㌀㘀㠀㘀㄀㜀㈀㈀　㌀㌀㌀㈀㈀䘀㐀䌀㘀㄀㜀㌀㜀㐀㐀㌀㘀㠀㘀㄀㜀㈀㈀　㌀㠀㌀㔀㈀䘀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㜀㌀㈀　㌀㄀㌀　㌀㘀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀　㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀䔀㘀㄀㘀䐀㘀㔀㈀䘀㐀㈀㐀㌀㐀㐀㐀㘀㐀㔀㐀㔀㈀䈀㐀㌀㘀㄀㘀䌀㘀㤀㘀㈀㜀㈀㘀㤀㈀䐀㐀㈀㘀䘀㘀䌀㘀㐀㈀䘀㐀㘀㘀䌀㘀㄀㘀㜀㜀㌀㈀　㌀㌀㌀㈀㈀䘀㐀㤀㜀㐀㘀㄀㘀䌀㘀㤀㘀㌀㐀㄀㘀䔀㘀㜀㘀䌀㘀㔀㈀　㌀　㈀䘀㐀㄀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㌀㜀㌀㔀㌀　㈀䘀㐀㐀㘀㔀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㈀䐀㌀㈀㌀㔀㌀　㈀䘀㐀㌀㘀㄀㜀　㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㜀㌀㔀㌀　㈀䘀㐀㄀㜀㘀㘀㜀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㔀㌀㌀㌀㘀㈀䘀㐀䐀㘀㄀㜀㠀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㄀㌀㜀㌀㠀㌀㄀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㔀㜀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㜀㌀　㌀　㈀䘀㔀㠀㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㈀㌀㔀㌀　㈀䘀㔀㌀㜀㐀㘀㔀㘀䐀㔀㘀㈀　㌀㔀㌀㌀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㈀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㈀䐀㌀㔀㌀㄀㌀㤀㈀　㈀䐀㌀㈀㌀㔀㌀　㈀　㌀㄀㌀㈀㌀㘀㌀㌀㈀　㌀㜀㌀㔀㌀　㔀䐀㈀　㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㘀㘀㤀㘀䌀㘀㔀㌀㈀㈀　㌀㄀㌀　㌀㜀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㄀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㔀㌀㜀㔀㘀㈀㜀㐀㜀㤀㜀　㘀㔀㈀䘀㔀㐀㜀㈀㜀㔀㘀㔀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀䔀㘀㄀㘀䐀㘀㔀㈀䘀㐀㘀㌀㌀㈀䘀㐀㈀㘀㄀㜀㌀㘀㔀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㐀㈀㐀㌀㐀㐀㐀㜀㐀㔀㐀㔀㈀䈀㐀㄀㜀㈀㘀㤀㘀㄀㘀䌀㈀䐀㐀㈀㘀䘀㘀䌀㘀㐀㐀䐀㔀㐀㈀䘀㐀㔀㘀䔀㘀㌀㘀䘀㘀㐀㘀㤀㘀䔀㘀㜀㈀䘀㔀㜀㘀㤀㘀䔀㐀㄀㘀䔀㜀㌀㘀㤀㐀㔀㘀䔀㘀㌀㘀䘀㘀㐀㘀㤀㘀䔀㘀㜀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀　㌀㄀㌀㈀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㘀㤀㜀㈀㜀㌀㜀㐀㐀㌀㘀㠀㘀㄀㜀㈀㈀　㌀㌀㌀㈀㈀䘀㐀䌀㘀㄀㜀㌀㜀㐀㐀㌀㘀㠀㘀㄀㜀㈀㈀　㌀㄀㌀㈀㌀㄀㈀䘀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㜀㌀㈀　㌀㄀㌀　㌀㠀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㈀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀䔀㘀㄀㘀䐀㘀㔀㈀䘀㐀㈀㐀㌀㐀㐀㐀㜀㐀㔀㐀㔀㈀䈀㐀㄀㜀㈀㘀㤀㘀㄀㘀䌀㈀䐀㐀㈀㘀䘀㘀䌀㘀㐀㐀䐀㔀㐀㈀䘀㐀㘀㘀䌀㘀㄀㘀㜀㜀㌀㈀　㌀㌀㌀㈀㈀䘀㐀㤀㜀㐀㘀㄀㘀䌀㘀㤀㘀㌀㐀㄀㘀䔀㘀㜀㘀䌀㘀㔀㈀　㌀　㈀䘀㐀㄀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㌀㤀㌀　㌀㔀㈀䘀㐀㐀㘀㔀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㈀䐀㌀㈀㌀㄀㌀　㈀䘀㐀㌀㘀㄀㜀　㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㜀㌀㈀㌀㠀㈀䘀㐀㄀㜀㘀㘀㜀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㐀㌀㜀㌀㤀㈀䘀㐀䐀㘀㄀㜀㠀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㈀㌀㘀㌀㈀㌀㠀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㔀㜀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㜀㌀　㌀　㈀䘀㔀㠀㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㈀㌀㔀㌀　㈀䘀㐀䌀㘀㔀㘀㄀㘀㐀㘀㤀㘀䔀㘀㜀㈀　㌀㌀㌀㌀㈀䘀㔀㌀㜀㐀㘀㔀㘀䐀㔀㘀㈀　㌀㐀㌀㜀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㈀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㈀䐀㌀㘀㌀㈀㌀㠀㈀　㈀䐀㌀㈀㌀㄀㌀　㈀　㌀㈀㌀　㌀　㌀　㈀　㌀㜀㌀㈀㌀㠀㔀䐀㈀　㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㘀㘀㤀㘀䌀㘀㔀㌀㈀㈀　㌀㄀㌀　㌀㤀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㌀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㔀㌀㜀㔀㘀㈀㜀㐀㜀㤀㜀　㘀㔀㈀䘀㔀㐀㜀㈀㜀㔀㘀㔀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀䔀㘀㄀㘀䐀㘀㔀㈀䘀㐀㘀㌀㐀㈀䘀㐀㈀㘀㄀㜀㌀㘀㔀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㐀㈀㐀㌀㐀㐀㐀㠀㐀㔀㐀㔀㈀䈀㐀㄀㜀㈀㘀㤀㘀㄀㘀䌀㈀䐀㐀㤀㜀㐀㘀㄀㘀䌀㘀㤀㘀㌀㐀䐀㔀㐀㈀䘀㐀㔀㘀䔀㘀㌀㘀䘀㘀㐀㘀㤀㘀䔀㘀㜀㈀䘀㔀㜀㘀㤀㘀䔀㐀㄀㘀䔀㜀㌀㘀㤀㐀㔀㘀䔀㘀㌀㘀䘀㘀㐀㘀㤀㘀䔀㘀㜀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀　㌀㄀㌀㐀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㘀㤀㜀㈀㜀㌀㜀㐀㐀㌀㘀㠀㘀㄀㜀㈀㈀　㌀㌀㌀㈀㈀䘀㐀䌀㘀㄀㜀㌀㜀㐀㐀㌀㘀㠀㘀㄀㜀㈀㈀　㌀㄀㌀㈀㌀㄀㈀䘀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㜀㌀㈀　㌀㄀㌀㄀㌀　㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㐀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀䔀㘀㄀㘀䐀㘀㔀㈀䘀㐀㈀㐀㌀㐀㐀㐀㠀㐀㔀㐀㔀㈀䈀㐀㄀㜀㈀㘀㤀㘀㄀㘀䌀㈀䐀㐀㤀㜀㐀㘀㄀㘀䌀㘀㤀㘀㌀㐀䐀㔀㐀㈀䘀㐀㘀㘀䌀㘀㄀㘀㜀㜀㌀㈀　㌀㌀㌀㈀㈀䘀㐀㤀㜀㐀㘀㄀㘀䌀㘀㤀㘀㌀㐀㄀㘀䔀㘀㜀㘀䌀㘀㔀㈀　㈀䐀㌀㄀㌀㈀㈀䘀㐀㄀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㌀㤀㌀　㌀㔀㈀䘀㐀㐀㘀㔀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㈀䐀㌀㈀㌀　㌀㠀㈀䘀㐀㌀㘀㄀㜀　㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㜀㌀㈀㌀㠀㈀䘀㐀㄀㜀㘀㘀㜀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㐀㌀㐀㌀㄀㈀䘀㐀䐀㘀㄀㜀㠀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㄀㌀㠀㌀㜀㌀㘀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㔀㜀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㐀㌀　㌀　㈀䘀㔀㠀㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㈀㌀㔀㌀　㈀䘀㐀䌀㘀㔀㘀㄀㘀㐀㘀㤀㘀䔀㘀㜀㈀　㌀㌀㌀㌀㈀䘀㔀㌀㜀㐀㘀㔀㘀䐀㔀㘀㈀　㌀㐀㌀㐀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㈀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㈀䐀㌀㔀㌀㄀㌀㜀㈀　㈀䐀㌀㈀㌀　㌀㠀㈀　㌀㄀㌀㌀㌀㔀㌀㤀㈀　㌀㜀㌀㈀㌀㠀㔀䐀㈀　㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㘀㘀㤀㘀䌀㘀㔀㌀㈀㈀　㌀㄀㌀㄀㌀㄀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㔀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㔀　㘀㄀㘀㜀㘀㔀㈀䘀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㈀　㌀㈀㈀　㌀　㈀　㔀㈀㈀䘀㔀㈀㘀㔀㜀㌀㘀䘀㜀㔀㜀㈀㘀㌀㘀㔀㜀㌀㌀䌀㌀䌀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㌀䌀㌀䌀㈀䘀㐀㘀㌀㄀㈀　㌀㔀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㌀㈀　㌀㄀㌀㄀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㐀㈀　㌀㄀㌀㌀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㐀㔀㜀㠀㜀㐀㐀㜀㔀㌀㜀㐀㘀㄀㜀㐀㘀㔀㌀䌀㌀䌀㈀䘀㐀㜀㔀㌀㌀㜀㈀　㌀㜀㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㔀㌀㌀㠀㈀　㌀㠀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㔀　㜀㈀㘀䘀㘀㌀㔀㌀㘀㔀㜀㐀㔀䈀㈀䘀㔀　㐀㐀㐀㘀㈀䘀㔀㐀㘀㔀㜀㠀㜀㐀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㈀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㌀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㤀㔀䐀㈀　㌀䔀㌀䔀㈀䘀㐀䐀㘀㔀㘀㐀㘀㤀㘀㄀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㤀㌀㔀㈀䔀㌀㌀㌀㈀㈀　㌀㠀㌀㐀㌀㄀㈀䔀㌀㤀㌀㈀㔀䐀㈀　㈀䘀㐀㌀㘀䘀㘀䔀㜀㐀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀㄀㌀㘀㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㈀䘀㔀㌀㈀䘀㔀㐀㜀㈀㘀㄀㘀䔀㜀㌀㜀　㘀㄀㜀㈀㘀㔀㘀䔀㘀㌀㜀㤀㈀䘀㐀㌀㔀㌀㈀䘀㐀㐀㘀㔀㜀㘀㘀㤀㘀㌀㘀㔀㔀㈀㐀㜀㐀㈀㌀䔀㌀䔀㈀䘀㔀㐀㘀㄀㘀㈀㜀㌀㈀䘀㔀㌀㈀䘀㔀㌀㜀㐀㜀㈀㜀㔀㘀㌀㜀㐀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀㄀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㘀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㔀㌀㄀㌀　㌀㐀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䈀䐀㔀䐀㘀䐀㘀䘀䔀㌀㌀㘀㄀㈀䘀䔀㄀䔀㈀　䘀䘀㠀㄀㄀䘀䔀㌀㈀㈀㔀㄀㐀㐀䈀䐀　䈀㈀㠀　䄀㜀㐀䈀䈀䐀䐀㔀䔀　䘀䐀㜀䔀䈀䈀㔀㤀䈀䄀㈀䌀　䈀㔀䘀䐀䄀　䌀㠀䘀㈀䌀䈀㈀㄀䈀㘀㔀䌀䌀䈀㐀䔀䔀㈀㜀䘀㜀䘀㤀䌀䔀㄀䄀䈀㈀㐀䐀㈀䔀䈀㜀㘀䌀㔀㄀㐀䐀㠀䐀㐀䈀㄀㘀㔀㤀㄀㄀䄀　䔀㘀㜀㤀䔀㜀㤀㘀㘀㌀㠀䈀㤀䘀䘀㜀䄀㜀䘀㔀㠀㈀䘀䄀䄀䘀䄀㐀　䈀䔀䘀䌀䘀㈀䘀䔀䔀䈀䌀㌀䄀㄀䄀䄀㔀㜀䌀䐀㤀䌀䘀䌀㜀㘀䘀䘀䐀　䔀䔀䘀䔀䈀㠀㜀䘀㌀㠀䔀䐀㤀䄀䘀䈀䘀䘀㔀㐀䌀䈀䘀㔀䈀㘀㌀䄀䄀䌀䐀䈀䔀䐀䘀䐀䌀㜀䔀㌀䔀㌀　㄀䐀䔀䘀䄀㐀㜀㔀㌀䌀䐀㤀䈀䘀䐀㔀㜀㔀䘀㤀㄀㜀㜀䔀䘀䈀䘀㈀㄀㜀䘀㔀䔀㔀䘀㠀㔀㐀㄀　㠀䘀䘀㄀㔀㐀㔀㐀䔀㐀㤀㐀㠀䐀㈀㌀㈀　䐀䔀㈀㠀㠀㄀㐀　㤀　䐀䌀䄀㠀㠀䔀䌀㤀䈀䔀䈀䄀䈀㔀䘀䈀䘀㈀　䐀䈀䔀䈀䄀䈀㜀㜀　䘀䐀㜀㔀㜀䘀㜀㄀䘀㈀㠀䄀㄀㌀㐀　㠀㄀㌀䘀㈀䈀　䈀㠀䈀䔀㠀㈀䄀䈀㐀㌀㐀㈀㐀㤀㄀䔀　㔀㘀㄀㤀㐀㤀　䈀䌀䌀䌀㠀㈀㠀㠀㌀䌀㘀䌀䐀㠀㘀㔀䐀䘀㜀䐀䌀䌀䌀㤀䈀㈀㘀㌀㜀㜀㈀㘀㐀䈀䘀䌀䄀䐀㄀　䈀䘀㜀䐀㜀㜀㜀䐀䘀㔀䐀䈀　䐀㤀㤀䘀䐀㐀㄀㄀䔀䘀䔀㜀㤀㜀䐀䘀㔀㈀䐀䈀䈀䔀㄀㐀䘀䐀㜀㔀㜀㄀㜀㐀䘀䔀　㔀䔀㌀䐀䔀䈀䈀䈀㄀䘀䘀㠀䈀䌀䔀㄀䔀䔀㜀㤀㄀㠀䄀㐀　㔀　䌀㄀䔀　㔀㐀㤀㐀㄀㤀㈀㌀㐀　㤀䄀㈀㤀䌀㠀㐀䘀　㄀䄀䈀䔀䈀㤀䘀㠀䔀㈀䘀䄀㠀䄀㜀䌀䌀䈀㈀䔀䘀䘀　㤀䌀㜀䌀㈀㤀㜀䘀㜀　䔀㤀㤀䈀䐀㘀䈀　䘀㠀㜀㜀㘀䔀㌀㄀㘀䐀䈀㠀㜀䈀㘀㌀䐀㐀䌀㈀㤀䈀㘀㤀㐀㤀㘀㘀䌀䔀䄀㈀㐀㠀䔀㠀㈀䄀㈀㐀　䈀㄀䔀㄀䘀㌀　㠀㈀㄀㐀㔀㜀䘀㔀㌀㐀㠀㘀㜀㠀㘀㠀䈀䐀㈀㈀　㜀㜀㠀䌀䔀㘀㘀㔀㐀㤀㤀㈀㈀㐀䄀　㄀㤀㔀䈀㤀㄀㈀䌀㐀㠀㔀㌀㔀㠀㤀㄀䈀䌀㈀䌀䐀䐀㠀䈀㐀㈀䔀䔀㌀䘀䔀䔀䄀䄀㈀䐀䄀䌀䌀㠀　䘀䐀䘀㜀䌀䘀䘀㤀䔀㠀㐀䘀㜀䘀䘀䄀䄀䈀㘀㐀䈀㜀㈀䐀㌀㘀䌀䔀䘀䈀䔀䘀䔀㘀㔀㌀㘀䈀䐀䄀䄀㘀㘀㜀㤀㤀　㈀㔀㈀㌀㌀㄀㌀䌀䈀㐀䈀㌀㠀㐀䌀㤀䔀㈀㈀䔀䈀㤀㘀㤀㄀㘀䈀㌀䔀㈀㘀㘀㠀㄀䄀䘀䔀䄀䌀㌀䘀䄀䈀㤀㤀㤀䌀㔀㌀㜀㐀䘀䈀㌀䘀㐀䔀㘀㐀㐀㘀㘀䐀㤀䌀䐀㘀㘀㜀㘀㄀㜀䐀䘀㔀㐀㔀䈀䘀㘀㔀㘀䈀㔀㘀㐀㌀䘀㤀䄀㄀㤀㠀䐀䘀㤀㤀㜀　䔀䘀　㘀㌀　㔀䈀䘀㌀㘀㄀䐀㜀䌀　㌀䐀䘀䐀䌀䌀㌀䐀㔀䌀䐀㄀㌀䘀䈀㄀䔀㘀㠀㄀㌀㜀䈀㜀㜀䐀䈀䄀䐀䐀㠀䌀䘀㌀㔀䈀䈀䐀䈀䄀䔀㔀㌀㔀䘀䄀䐀　㠀㄀䈀　䘀㈀䘀㘀䐀㄀䘀䐀㤀䄀㜀㐀㜀䘀䌀　㐀䔀䘀㠀㜀㄀䘀䌀䘀䄀䈀㄀㤀㄀㔀䘀㜀䌀㜀㈀䈀㘀䐀㔀㌀䌀　䘀㜀㄀䄀㜀㠀䔀䘀䌀　　㘀䌀㌀䄀䘀䔀䐀䘀㠀䈀　　䈀䘀㘀㔀䔀䈀䈀䐀䘀䈀　㄀㄀䘀㄀㔀䐀㄀㠀䈀䄀䔀㌀㐀䘀䐀㤀䔀㄀㌀䌀䈀㜀㘀䄀㌀　䘀㠀䄀㠀㜀䄀㤀䄀㔀䔀䘀㔀䌀㈀㌀㈀㠀㠀　䈀㤀㜀䐀㐀　㌀䘀䔀㤀㠀䐀㤀䐀䘀䐀㘀䌀㈀㐀䘀㈀䘀㌀㜀䈀㌀　䄀㘀㄀㌀㘀㄀䄀䘀㠀䔀㜀䔀㤀䌀㜀㈀䈀㠀㌀㌀㈀㜀㄀㠀䔀䐀㜀䐀㌀㠀㈀㐀䄀䄀㠀㤀㐀㔀䌀㔀䘀䈀㄀　㈀㄀㔀㈀䌀㜀䘀㠀㔀䌀䈀䐀㈀㐀䐀㈀䘀　䘀㤀䄀䔀㜀　㄀䐀䈀㠀㐀㠀䔀䘀㤀㔀㔀䄀　　㜀㔀䌀㔀䘀䄀㜀㄀䘀䈀㤀㠀䌀㠀㌀㌀䌀㜀㘀㠀䐀䔀䌀䔀㄀㐀㤀㤀㤀㌀㌀㈀䄀㔀㈀䐀㜀㜀㠀㜀䌀䄀㜀㌀㘀䈀　䄀㤀㔀　䘀䔀䈀㠀㜀㜀㔀䄀㜀㌀䐀㌀䈀㄀㠀㔀䐀䄀䈀㄀㌀㔀䐀㠀䔀䐀䐀䈀䐀䐀㠀䌀㐀㘀㔀䌀㈀䄀䈀㠀㌀䈀　䔀䐀㌀䌀䈀㈀㘀㈀䄀䘀㌀㈀　䌀䘀䐀䘀㐀䔀㌀㘀㜀㄀㄀㠀　㘀㐀㔀䔀㤀㄀䄀㠀䘀㄀䈀　䐀㈀㔀　䄀㌀㐀㠀㈀䄀䐀䐀㈀㠀䌀䌀䐀㈀䌀䔀㜀㈀㈀㄀䈀䈀䌀　䘀㄀㈀䔀㌀㔀㈀㔀䐀䈀㌀㔀㜀䐀䌀䈀䌀䔀䌀㠀䔀㈀　㘀　䘀䌀㜀㠀　㜀㌀䄀䐀䘀㐀䐀㈀䘀䈀䄀㠀㐀䘀㤀䐀　䌀㐀㈀㤀䈀䄀㐀　㄀䄀䌀㈀䔀㤀㘀㔀㤀㠀㐀㐀㐀㔀㤀　㌀䄀㘀㔀䔀㠀㘀㄀䈀䌀㤀㠀㤀䔀㄀㤀䔀䘀㘀䈀䔀㤀䈀㜀䌀㘀䐀䔀㐀㘀䐀䈀㄀㤀㔀䘀䌀㘀㌀㔀　㤀䌀㄀䈀㠀　䘀䄀㜀㘀㐀㌀㔀㘀㤀㌀㠀䌀㜀䄀䐀㜀㘀㘀㘀䈀　䄀㌀㤀䔀㜀㄀䈀䄀㈀㜀䔀䔀㤀　䈀㘀䘀　㄀㄀㔀㜀䄀䐀㜀䐀㌀䐀㈀䈀㤀㤀㠀㜀㈀㈀䔀䌀㤀㄀㌀㈀䔀䔀䔀㄀䈀㠀㌀䘀䐀䔀䌀㌀㐀㔀㔀㄀䌀䘀㔀䘀㘀㔀䐀䄀䈀㄀㘀䐀　䘀䌀䐀㔀㈀㘀䐀䐀㘀㠀㌀䈀䄀㜀㄀㠀㔀㌀㜀㤀䔀㤀㌀　䐀䐀䌀䌀䌀㜀　㤀䌀䐀䄀　㌀㄀䈀㤀㈀䔀䈀䈀㤀䌀㌀㄀㘀㈀䔀䔀䔀㔀　䄀䈀㜀㜀㔀䐀䌀　㜀䌀䄀䘀㈀䘀㠀㔀㘀㈀㘀㈀㠀䌀㌀㈀㤀㜀㌀㐀㜀䐀㠀䌀㄀㜀䄀㌀㐀䘀䈀㘀㠀䘀㘀㜀㈀　㈀㄀㈀㔀㜀㤀　㄀㠀㜀㜀䄀䐀㈀㔀㄀㠀䈀䔀㜀㐀䈀䈀㤀䄀㈀㠀䌀㠀㄀䐀㘀䔀㄀䔀䌀㠀㘀䘀　㠀㜀䐀㐀㘀䌀㤀㔀㈀㠀䔀㔀䐀㌀䔀㈀㈀㠀　䄀䄀㘀　㔀㘀䄀䐀䘀䌀䌀䄀㔀䐀䄀䌀䐀㘀㄀㌀䈀䐀㐀䌀㜀㈀㄀㔀㐀㘀㈀㤀䘀㜀㐀䘀　㔀䐀䄀䐀㐀㄀㠀㐀㈀㤀㐀　䘀㠀䔀㤀䔀䐀㘀㐀䌀　䈀㈀㘀䌀䄀㐀䔀㌀㐀㌀　㜀㌀㌀䐀䌀　䐀㌀　㠀䈀䄀䔀㈀㄀㄀䐀䐀㌀㈀㜀㌀䐀㘀㤀㤀䌀㔀䈀㠀䐀䈀䘀㄀䘀䘀㜀㠀䐀㤀䄀䌀㐀㐀㘀㜀䐀䐀㘀㈀㤀㘀㐀䘀㜀䌀㠀㐀㜀䘀㈀㈀㔀㜀㔀㄀䄀　㜀㜀㐀　䌀䐀㐀䔀㘀㠀㠀㐀䄀㐀　㐀㘀㐀䈀㤀　㤀䐀㄀㘀㈀䐀㐀䔀䈀㤀㔀㔀䌀　㄀㐀䄀䔀䐀㠀㌀㌀㌀䘀䌀㄀㔀㜀㘀㈀䌀䘀䈀㘀䈀㄀㔀㔀㈀㘀　㈀㘀㤀䈀　䔀㜀䘀㈀　　㌀㤀㈀㌀䔀㘀䔀㌀㤀㈀䐀㐀䘀㔀㈀㐀㜀㜀㄀䔀䌀㘀㘀㌀䐀㄀㐀䔀䔀䔀㄀䄀䔀䘀　㔀　䌀䌀㤀䘀䔀㘀㤀㈀䔀㌀㜀㄀㔀㈀䔀㈀㐀㔀䘀䘀㌀䘀䄀㜀　㠀㐀㤀㔀䔀㘀䌀㈀　　㄀㄀䈀㘀　䈀㌀㐀㌀㈀䐀㌀㠀㌀　䌀㄀䄀㘀㐀㐀䔀㠀㄀䄀䌀㐀　䈀㤀㔀䘀䈀䌀䈀㠀㠀㤀㤀㠀㈀㘀㐀㄀䔀㤀㄀䌀䈀㠀㘀䔀㘀㔀䌀㐀䘀㈀㠀㤀㜀䐀䈀䈀㌀㄀䌀䌀㜀䔀䔀㜀　䐀㐀㜀䐀㠀㈀㜀䔀㤀　㌀㌀䔀㐀㐀䔀㠀䌀䔀䔀䐀䔀㌀　㄀䌀㠀㌀䄀㜀㘀　㜀䘀㘀䘀㠀㌀㤀䔀䌀䘀㐀㄀䔀㐀䄀㤀㔀㘀㘀㠀䘀䈀䐀䌀㤀㘀㐀㌀㐀㜀㤀䄀㐀㐀㘀䌀㌀䌀　㈀㤀㠀㘀䌀　䌀㌀㜀　䈀㄀㜀䈀䈀㠀㠀㄀䐀㐀㘀䐀㌀㐀　㄀㤀䐀㠀　㈀㘀㠀㠀　㤀㠀䐀㠀㈀㌀㈀䈀㌀䐀㤀䌀㄀䄀䌀㐀㠀㠀㌀㘀䌀㠀䌀䈀㘀䐀䔀䈀㜀䄀　㠀䔀䈀㌀䈀䈀㠀㈀䄀㄀　䐀䘀㈀䘀䐀㔀䌀䈀䌀㔀䄀㈀䘀䐀㘀㌀㔀䈀䌀㐀㈀䐀㈀䔀㠀㜀㌀㈀㔀㌀㔀㤀䄀㔀㄀㄀㐀㠀㔀　㄀㠀䐀㔀䐀㌀㌀䈀䄀㐀　㔀㐀㤀㄀㔀䘀㐀㘀㈀㔀䌀䈀㔀㈀㠀　㈀䘀㐀䔀㘀　㠀䄀䔀　䔀㄀　㠀䈀䄀䌀䈀㤀䐀䔀㘀䌀　　㔀　䈀㄀　㈀㜀㠀䐀㈀㈀䘀䌀䐀㘀㤀　㄀㘀　䌀䔀㌀㐀㈀㤀㄀㈀　㌀㔀㐀㘀㄀䈀䐀䈀　㌀　㈀䌀㈀䌀䈀㄀䐀㜀䌀㌀㘀䐀䄀㌀䌀㜀　䌀㔀㄀㈀㜀䌀㤀㤀䔀㔀䈀㈀䔀䔀䐀㐀㈀㤀㈀㐀䐀㄀㘀䌀㤀㠀䔀䈀䘀㈀㄀　㠀㔀䌀㜀㈀㔀㘀䔀㜀䔀㠀㜀䌀㠀㜀䔀䈀䘀㠀㄀㔀㤀㜀䐀䌀㌀㄀䔀䔀䐀㌀䐀䘀䈀䘀㜀　㌀䘀䌀䘀㈀㜀㄀㐀㘀䐀㌀㤀䈀䐀䘀㘀㜀㌀䌀䌀䔀㤀䄀㌀䔀䈀㈀㐀㠀㠀㌀㈀㐀㜀㘀䌀䐀㐀㘀㤀　㐀㔀㌀㈀䈀㠀䄀䈀㐀䌀㔀㤀㌀㔀䘀　㔀䈀䈀䐀䔀㈀㄀　䐀䄀㄀㌀㄀㐀䌀㤀㔀㈀　䄀㈀㐀䔀㤀　㠀㠀䄀㈀㠀䄀㜀㜀　䌀　㠀　㔀㐀䈀　㜀㈀䌀䌀㘀㠀㐀䄀㠀㐀䘀䔀䄀㠀䈀　㄀㠀㘀䄀㄀䐀㌀䌀䌀㜀㤀䘀㄀㠀㠀䘀㄀䄀䔀㄀　㘀䈀䌀㠀㤀䄀　　㘀㜀㜀㈀䘀䈀䌀㤀㠀　㜀䌀㐀　䈀䈀　㠀䄀㌀㈀䈀㘀䄀㌀㜀㌀䐀㜀䐀㌀㌀䌀㜀㠀㄀㠀䄀䘀　䌀䈀㈀䐀㈀㌀㔀㤀䔀　㐀㘀㄀㤀㌀㠀䘀㔀䄀㌀　㔀㜀㄀䘀䈀䈀㐀㘀䐀㔀㈀䄀㤀䐀㌀㌀㠀䐀㤀䔀㄀䔀㘀㘀䔀㐀㐀㄀䔀㐀㄀䌀䐀䈀䌀㌀㈀㘀㘀㘀　㘀㌀㤀㐀䔀㔀䐀䔀㌀　㤀㘀䐀䔀䌀䈀㌀䈀㠀䘀䐀䔀㠀㔀㘀　　䘀䌀㐀䌀䔀㄀㘀㈀㠀㜀䈀䄀㈀㈀䐀㐀䔀䔀㌀䄀䌀㈀㜀　㘀㄀䘀䄀㠀㘀䘀䈀㈀䔀㈀䔀䐀㠀䘀䘀㌀䘀䈀㤀䔀䘀䐀㠀㘀䌀䈀䔀㠀㜀㄀䘀䔀䘀䌀㄀㐀㈀㄀㤀㐀㐀㈀䔀㜀䈀䘀㄀䈀　㘀㈀䈀㘀䈀䘀㔀㄀㐀㄀䌀㄀㠀　㔀䐀㘀䈀㄀㘀　䈀㐀　㌀㜀䄀㌀㜀　㤀㈀䈀䌀䌀　䌀㌀㤀䐀㔀㐀㐀㐀㜀㘀㔀　㌀㐀㤀㌀　㜀㜀㔀䌀䐀㘀㤀㤀　㤀㐀䄀䔀㐀㜀㠀㔀䘀㤀䔀　䌀䌀㤀㄀㄀　㘀䈀㌀㘀䈀㠀㔀䔀䌀䌀䔀㄀㐀䈀㤀㜀㘀㔀㄀　㔀䐀㄀䌀䈀䌀䘀䘀　㤀䌀㐀䘀䐀㜀䄀㐀㘀㐀㔀䔀　䐀㌀㈀㠀䌀㐀㌀䄀䈀㤀䌀㔀㘀㘀䈀㄀　㘀䄀㠀䈀䄀㜀䐀䐀䔀㄀䔀㌀䌀㐀㐀㤀㠀䄀㌀䄀䄀䈀䈀䔀㔀㈀㐀㈀㈀䔀㠀䔀㤀㔀㄀㜀㤀　㄀䐀㤀㌀䌀䌀㜀䌀　䌀䘀䌀㠀䘀䔀㜀㠀䘀　㠀㜀㔀㄀㄀　䐀㌀㌀㜀㤀㐀㈀䔀䘀㌀䈀䘀䔀䔀䘀㄀㈀䄀䐀㈀䄀䐀䌀㄀　㈀㈀䌀㌀㤀㈀㐀䔀㈀㘀㐀䐀㠀㔀㈀㔀㠀㠀㠀䔀䔀䄀　㄀㠀㤀䄀䈀䐀㄀䘀㜀　㈀　䄀䐀㐀㄀㤀㐀　㐀䘀㄀㄀㠀䄀㄀䈀㜀　䈀　䌀㔀㄀䌀䔀　　䄀䘀㐀䌀㤀䄀　㜀㌀㘀㔀㤀㠀䘀㘀䌀㈀䌀䌀䐀䐀㠀㐀䔀㠀䔀㔀䌀䐀㌀䘀䌀　㜀䌀　㐀㐀㤀㠀㔀㌀㌀䐀䌀䌀䐀㔀䔀㤀䐀㠀㘀䄀㈀㄀㐀䐀㄀　　䄀㔀㈀㘀㌀㐀　㠀㔀㐀㤀䔀㔀䘀㘀䌀䔀　䌀䐀䔀䌀㈀㠀㈀㄀䘀㐀㔀䘀㐀　䔀㤀　㔀㘀㠀䐀㌀㔀䌀　㜀㈀㐀㤀㈀䘀　䐀䄀㜀㤀㄀㤀㔀㈀㐀㐀㔀䐀㔀䄀㜀㜀䐀䔀䌀㌀䄀㘀　㠀　㈀㐀㄀䄀䄀䔀䐀㘀㠀　㔀䘀㐀㠀䌀㔀䐀䔀㐀䌀㌀㤀㌀㤀䈀㌀㔀䐀　䄀㠀䔀䄀䄀䘀㄀䄀㜀　䘀㄀　㈀㘀㠀䔀䈀䐀㄀䔀㤀㜀䌀䌀㐀　㌀䈀㄀㔀䘀䘀䄀㌀㐀㔀㜀㌀㄀䔀䄀㤀㘀䈀㠀䐀䘀㄀㤀　㄀㔀䄀㈀　㠀㔀　䔀䌀䐀㌀䈀䘀㔀㔀䐀㈀　㜀㈀㘀㠀㐀䄀䘀㠀　䌀䌀䔀㠀㐀䄀㄀㘀㔀㤀䈀䔀䔀䄀䈀䄀㄀㘀㄀㘀䄀䌀㄀㘀㌀㤀䄀㄀㌀㤀㘀㄀䔀䔀㄀　㔀㤀䌀㠀㐀㐀㌀䌀㌀㜀䌀䄀䄀㈀　㈀㜀䐀䐀㤀㈀䄀㐀䌀䐀䄀㔀䈀㘀㤀䘀㄀䈀㐀㤀㔀　䌀㘀㐀㈀㐀㐀㐀㠀㠀　䐀㐀㘀㄀　䔀䔀㘀䔀㜀　䐀㐀㌀䐀㌀䐀㤀　㜀㌀㌀㔀　㠀　㈀㄀㌀㌀䄀䘀㠀㐀㠀䔀㈀㈀㔀㐀㔀㄀㤀㐀㐀㤀㄀㐀䈀㜀䌀㌀䔀䈀㌀㈀䐀㘀㔀　㄀㄀䈀䐀䈀㌀㄀䘀　　㔀䐀㄀㘀䘀䔀䌀㌀㜀䘀䄀㐀䐀㤀㤀㘀　㈀䌀㘀㤀㄀㤀　㄀㠀㄀䔀㘀㘀䐀㤀䘀䈀䔀䔀䄀㤀㤀㐀㔀䄀㔀㘀䘀㠀㠀㈀㜀㈀㐀䄀䄀䈀䈀㌀㐀㤀䔀㌀㄀䌀䈀　䘀䌀䔀㠀㔀㘀䄀䌀㘀　　㘀㐀䐀䐀㤀㄀㌀㤀㄀㠀㠀䐀㠀䔀㘀㜀䘀䄀㐀䔀㄀㠀䘀㜀㤀　㜀㘀　䈀㈀䄀䐀䌀㌀㌀㠀䈀㄀㤀㘀㐀䘀　䔀㈀㤀䈀㐀㜀䈀㠀　䌀㘀䘀䈀䔀䔀㈀㤀㜀䘀䄀䈀㈀㈀䄀㘀㤀㤀䔀　㈀䌀䔀㌀㠀㠀䘀㌀㤀　䐀㤀　䄀㤀䐀㐀㐀䐀㠀㠀䈀㈀䄀䐀㠀䘀㐀㌀㘀䄀㐀㄀㤀㤀㤀㐀㠀䌀㔀䈀㄀㐀䈀䔀䔀㔀　䌀㜀㈀䈀䐀䔀㘀䈀㐀㘀㌀㌀㜀䈀䐀䄀䐀㠀㤀㔀㈀䌀䌀㜀㠀㌀䈀㄀䔀䌀䄀　㌀　㌀㤀䐀䔀㘀䌀　㜀㠀㌀䈀䌀㘀䐀㌀㐀䔀㐀䈀㘀㘀䐀㄀㄀　䌀䔀䐀㘀㘀㈀㐀㔀　䈀㤀㄀䘀䄀㌀㠀㠀　㌀䘀㄀㜀䈀㄀㠀㠀㔀　䄀㐀䔀㘀䈀㔀㄀䘀䌀㔀䈀㐀䔀䄀㈀㘀㈀䔀㔀䈀㈀䔀㄀䐀㔀㤀㜀㜀䄀䈀㠀䌀䐀䌀㔀㘀　䔀䄀㌀㠀㌀㤀䐀㤀㌀䄀㄀䔀㔀䘀䐀㄀㄀㄀䔀㌀䐀㠀㔀䄀㜀㔀㈀䌀䐀㄀㠀㔀㠀䌀㠀䌀㘀㐀㤀㈀㔀㐀䌀䌀䌀㜀　䈀㜀㠀㤀㔀㈀㘀㠀　㤀䌀䌀㠀㌀㤀䄀䈀㤀　䄀䐀㠀㔀㈀䘀㌀䈀㔀䈀　䐀㜀㤀䌀㐀㈀㜀㠀㠀㘀㐀䈀㤀䄀䘀䐀䄀㌀㌀㈀䔀㌀㈀㜀䌀㌀㌀䈀㘀䘀㜀㠀䌀㘀㄀䌀㄀䔀㔀㄀䔀䔀䐀㤀㔀䄀㘀㜀㄀㜀㌀㔀㜀㌀䌀㔀䌀㔀㘀㌀㘀　㄀㌀　㄀㌀㈀䘀　䐀䄀㘀䐀㔀㜀䔀䘀䐀㜀㠀䘀㌀㌀㈀䘀㜀㐀㘀䘀㤀䌀㘀㈀㄀　䔀䈀㤀　䌀㠀䄀䐀㠀㜀䘀㄀䔀㈀㌀㌀䔀㌀㜀㤀　㠀䐀㈀䐀㌀　䌀㘀㠀㜀䐀䌀㜀㜀㠀䈀　㄀䔀㘀㠀㐀䔀㤀䄀䔀㤀㤀㤀䔀䐀㤀㠀䌀㔀㤀㘀㤀㐀䈀䔀䔀㄀㤀㌀䔀㘀㄀㠀㄀㌀㌀䄀䌀㘀㌀㌀䌀䌀䘀䄀䌀㤀䔀䄀㔀䌀䈀　㘀㠀㠀䐀䄀䌀㠀䔀㤀㈀㈀㔀㤀䐀䐀䌀㠀㄀䔀㜀㜀㄀㔀　㘀㐀䄀䔀䔀㤀㐀䐀㘀䘀　䌀㤀㌀㌀䌀　㜀㔀䄀䌀㘀㌀㄀䐀䔀㐀㈀㘀䔀䈀　䈀㔀㠀䌀　䌀䔀㘀㐀㠀　䄀㜀䄀䌀㠀㘀䘀㐀㐀㔀　㘀䘀䔀㔀㤀㠀㠀㘀䘀䘀䌀㈀䈀㜀㌀㐀䌀㤀㠀㌀䈀㈀㄀䌀　䐀䘀䌀　㄀䈀㈀䘀䈀䌀䔀䈀㈀㄀䐀㘀㤀䔀䈀　　䌀䄀䈀㘀㔀䈀䔀㄀　䄀䈀䔀㠀㌀㐀䘀㜀䔀㘀㄀䔀㈀㌀㈀䐀　䈀㤀㌀㐀㠀䔀㤀䌀䈀㄀㔀䔀㠀㈀　䔀㠀㄀　㔀䌀㐀　䄀䌀㘀㠀㄀㌀䐀㄀䌀㘀　㄀㘀䈀㈀　㘀䐀䈀䄀㜀䌀㄀㈀䔀㜀䌀䄀㈀㈀㈀䈀　㘀㘀䐀䘀䘀䐀㌀䔀㤀㌀䌀㠀䌀㠀䘀㐀䐀㔀㜀㠀㤀㌀　䔀㘀㌀㌀　㤀䐀㐀䄀㄀㜀㠀㄀㐀䔀㈀㄀㜀㤀㌀㔀㄀㤀㘀䐀㄀䌀㜀㔀㌀㈀㤀䔀㘀㜀䐀䈀䘀䘀㔀䄀䔀㐀䌀㄀㤀䔀䔀䐀䐀㘀　䘀㤀㘀㤀㔀㐀䈀㄀㌀㈀㜀㐀　䈀䈀㠀䘀㘀䄀　㐀䈀㄀䐀㘀㔀㐀㌀䄀㘀㈀㤀㠀䔀䐀㄀㄀䔀㈀䄀㤀㤀㔀㈀䐀㜀　㄀㔀䄀䔀㠀㘀䐀㜀䈀㘀　䌀㘀㌀㠀㄀㈀㔀　㠀䈀䄀䐀䄀㔀㜀㄀䄀㜀㘀㌀㘀㐀䐀䌀䘀　㤀䘀㜀䘀䌀㤀䈀　䈀㔀㌀䘀㘀　㌀㈀㄀㤀䌀㠀䔀㌀㈀㄀䄀䐀䈀㐀㘀㄀㘀　㄀䄀㠀䄀㠀㜀㌀㐀㐀䐀㤀㘀㤀䔀　㤀䄀㘀㄀㔀㘀䐀㌀㈀㠀䐀䄀㔀　䐀䔀㐀䘀㄀㐀㔀䐀䘀㠀㤀㌀㜀㐀䌀㐀䄀㈀㠀㘀㌀㄀㈀㈀㄀䄀䌀㘀䌀䄀㔀㘀㘀䄀　㔀䐀㐀䌀㤀䔀㌀㌀㘀䄀㔀㐀㤀　㤀　㄀㠀䐀㘀㌀㠀㘀㈀㈀㜀䌀㤀　㜀䈀䌀㔀㈀䌀㤀䄀㌀㈀㌀㜀䌀䈀㌀㠀䈀䔀䐀䔀㔀㘀䈀㌀㘀㄀　㔀㤀㌀䄀䔀㤀㈀㄀䄀㠀　　䐀㔀㄀㌀㐀䄀㔀㘀䄀㄀　䌀䔀㜀䔀㔀㜀䘀㌀㈀㈀㤀㔀㐀㠀䔀㔀　㤀䔀㘀㘀㤀䔀䔀㈀㄀㈀㔀㄀䘀㄀㘀䈀　㐀㄀㄀䌀䈀㈀䘀㄀㐀㄀㌀㘀㔀㈀㈀㠀㔀㐀㜀㜀㠀䌀䌀㜀㘀䐀㄀䌀㘀䔀　䌀䐀㐀㠀㜀㈀㔀㈀䘀　㔀㄀㌀㠀㄀㄀䌀㤀　㌀䄀㌀䘀㐀䄀㈀㄀㤀㔀㈀㄀㤀㌀㐀䄀㐀㠀䐀㤀㠀䘀䐀䈀㤀䔀㘀㄀䘀㤀㜀㘀䌀㘀䄀㤀㈀　㜀䘀㠀䄀㄀䔀䔀㘀　㄀㄀䐀㔀䈀䘀䈀　䌀䔀㘀㐀㌀㌀㌀䘀㘀㈀㌀䈀䘀　㔀䘀㘀㔀䄀㐀䐀㐀㘀䘀䔀䌀㌀㈀㤀䐀㈀㤀㐀㜀䐀㔀㐀㈀㐀䈀䔀䄀㠀㌀㤀䌀㜀䐀䌀㤀㐀㠀㐀㈀　㔀㄀䘀䌀㘀䘀㈀㘀㄀䌀㤀　䔀㐀䘀㜀䘀㈀䌀䐀䘀䘀䄀㘀䔀䌀䈀㜀㌀㠀㤀䐀㌀䔀㔀㐀㠀䄀㘀㠀㄀　䌀㜀䘀㘀㌀㤀㄀㄀㜀㘀䘀㌀㌀㐀㘀㐀䔀䘀䐀㘀䌀䌀㐀㄀䐀㌀䔀㤀㠀㜀㠀䔀䈀㄀㈀䔀䌀㤀㈀㄀　䔀㤀㤀䔀㌀㤀㔀㐀䔀㐀䈀㔀㐀　㔀㈀䐀䐀䈀㜀㘀　䔀　㤀㄀㘀㐀䔀㄀㄀䈀䐀㠀䄀　㐀㜀䄀㈀䔀㌀㈀㄀㌀㤀㠀㄀䄀䈀䄀㤀㌀㈀㔀㘀㤀㤀䌀㤀㘀㜀㈀䘀㌀　䐀䐀䐀䘀㐀㔀㠀㌀㜀䄀㄀㄀㤀㔀㐀䘀㠀㌀㠀㤀䔀䔀㤀　㈀㜀㘀㈀㘀䘀㄀䌀䈀䌀䔀㈀㐀㐀㔀　䄀㔀㄀㠀　㈀䐀㄀䘀䐀㤀㜀㈀㔀䄀㜀㠀㈀㜀㘀䐀䐀䔀㔀㄀䐀㘀䘀㜀㘀㤀䔀㠀㔀㈀㈀㄀㜀䘀㘀㌀㠀䈀㘀䘀䌀㜀㌀䌀㠀䔀㌀䔀㔀䄀㘀㄀㌀㠀㘀㔀㠀㐀㈀㤀㔀䐀䈀䘀㌀䔀䈀㄀䄀䄀䘀䈀㈀㄀䔀䘀䌀　䈀䌀䔀㌀　䈀㤀㄀　㐀㘀㌀䈀　　䌀䔀㜀䌀㜀㜀䌀䈀㤀䄀㘀䘀䈀　㔀㘀㜀㈀䐀䄀䈀䄀㘀㌀㘀䘀䐀㄀䄀㌀䈀㠀䔀䔀㘀㈀㔀㈀㘀㔀䄀㠀䈀䌀㜀㘀㄀㠀䄀䘀㈀㈀㈀㠀䘀㤀䔀䐀㐀㈀䈀䔀㄀䔀䘀㜀㘀䈀㌀䐀㠀䔀　　㘀䈀䄀㌀䔀㄀䔀䔀䄀䈀㄀㐀㄀㤀䔀㠀䌀㔀㘀䌀㈀　㈀䄀㔀㜀䌀䄀䌀㌀㔀㔀㔀㜀䐀㌀㠀㔀㘀䈀䄀䐀　䘀㈀㈀䌀㘀䌀㘀㌀㠀　㤀㌀䌀䐀䘀　㜀䘀䈀　　㜀㤀䄀㄀䄀䔀　䌀㤀䘀㐀㈀䄀㐀䔀㠀䈀　㈀㈀䌀㠀㘀㜀㔀䈀㈀䔀㐀㠀䔀䐀䐀㌀䐀㈀䈀㈀㤀㤀䄀　䌀䔀㈀䔀㌀㈀㠀㐀㌀䔀㈀㄀䌀䘀䈀䈀㜀㤀䈀㔀䘀䐀㜀㠀㜀䐀㔀㈀　䐀䘀㠀　㈀㔀　䐀䌀㠀㔀㌀䐀㐀㐀　㐀䐀㈀䈀㤀　䐀㜀㤀㌀㘀㈀㘀䔀䌀　䔀䘀䈀㄀㈀㈀　䘀㤀㠀㜀䌀㔀䐀㄀㈀䔀㌀䄀䌀䔀㘀㤀㐀　㔀㌀䔀㘀　㜀䐀㠀㐀㄀䔀㔀㌀䈀㄀䈀䘀　㘀䔀㠀㠀㐀䐀䘀䈀䈀㘀䈀䐀㐀䔀㄀㠀　㘀㜀　㌀㌀䘀䘀䄀䐀㈀䈀㈀䈀㐀㠀　㜀　䘀䌀䘀㈀㜀㐀䈀㘀㤀㜀䔀䌀㐀㌀　䌀䌀㜀㠀㌀㔀䌀㜀㌀㤀㤀㤀䔀㘀䐀䄀㄀㐀㤀　䌀䄀䌀䈀㐀㘀㌀㌀䌀㄀䘀㘀㠀㌀㘀㌀䈀㌀㌀䐀䔀䔀㠀䌀　㠀㠀䌀䐀㤀㜀㜀㤀䄀㠀䌀䈀㠀䐀䌀㄀䐀䘀䈀䔀㤀㤀䌀䌀䄀㌀㌀　　䈀䐀㈀䘀䌀䔀䐀㘀㐀㄀䔀㠀㔀㔀㠀䔀㠀䔀㌀㄀㠀㐀䘀䘀䈀䄀㌀䄀㄀䘀䘀　㄀䔀䈀䈀　㔀䌀　㤀㈀䈀㈀䄀㐀㈀䔀㜀㤀㜀　䄀䈀㘀㈀䌀䌀㜀䘀㌀䌀㘀㐀㤀　㜀䘀㘀䔀㌀　㄀㤀㘀　䐀㔀㤀㔀䈀㠀㄀㐀㠀䐀㘀㄀䐀䐀㤀䈀㘀䌀䄀䈀　䌀㠀㐀㠀㔀　䐀䄀㠀㈀㐀㄀　㐀䐀㠀㄀䐀䘀㄀㈀㠀㤀㔀䄀䔀䈀䈀䐀㈀㔀㄀㜀䄀㘀䐀㤀　　䐀䐀䌀䌀　㤀　䘀㤀㄀㄀䔀䔀　䈀㈀䄀㠀㄀䄀㘀䐀䔀䐀䘀䐀㤀㠀㈀㈀㐀㐀㤀䔀䌀䔀㐀㔀　䐀䘀㘀㜀䄀䔀䈀㔀　㤀䐀䈀㌀㌀䌀䈀㈀䄀　䘀㠀㌀㈀㤀䔀㘀䄀㐀㔀㔀㐀㜀㌀㜀䘀㤀䄀㤀㐀䘀䄀㠀㜀䌀㜀䘀㘀㘀㠀䘀　㄀㄀㄀㄀㔀　　㠀㜀　䈀㤀㠀㠀㘀䔀㤀䘀䐀㔀㔀䌀㐀䘀㐀㈀㄀㐀䌀㔀䐀㠀䘀䔀㠀䄀㌀䈀䔀㠀䐀㔀䔀㌀䔀㤀䔀　䐀　㈀䄀㘀㤀䔀㈀㄀㘀　㄀㐀　㔀䌀㔀㤀㠀㘀䐀㌀㄀㠀㤀㌀　㈀　䘀㌀㌀㔀䔀㠀䌀㘀䔀　㄀㜀㄀㘀㐀䘀㜀㈀㘀㈀㌀㤀䄀㜀䘀䘀㌀㤀㈀㌀㠀㘀㘀㤀㌀㘀㄀㘀㄀㈀㐀䔀㜀䘀㌀䔀㤀㌀㔀䈀㔀　䘀䈀㘀䌀䈀䈀㈀㌀䄀㈀䌀㘀㄀㔀䄀㤀㌀䄀䌀䌀䘀㘀䄀㌀䐀䈀㔀䌀㌀䌀㠀㄀䐀㈀䈀䐀䌀㈀䔀䈀㐀㜀㤀㤀㤀䄀䐀　㄀　䘀㈀䐀㘀　䈀㘀䐀㄀㄀䔀㔀㜀㄀㄀　㤀㔀䄀䔀㘀㤀㌀㘀䄀䘀㌀䈀　㄀䄀㈀㜀㤀䘀䄀䐀䈀㔀㌀䐀㈀㌀　㠀䔀㘀㈀㐀　䘀㔀㠀䔀㐀㤀㜀　㔀㈀　㤀㠀䘀㜀䈀䈀㔀㐀㘀㈀㐀㌀㔀㘀䘀㌀㐀㠀㌀㈀㄀䄀㔀䔀㔀䄀䐀䌀　䐀㜀㈀㔀㤀䘀㈀㜀䌀㐀䘀㐀㈀䘀䔀䌀䔀㜀㐀䄀㄀䄀　䌀　䘀䈀㤀䘀䄀㈀㐀㠀㈀㐀䄀㜀㄀䌀㜀㄀䌀㠀䌀㐀　㔀㌀㔀㜀䈀㈀㈀　㔀㌀㌀㜀㄀䘀㄀　㜀䄀䈀䔀㠀䌀㈀䘀䘀㌀㔀䈀㜀㐀㐀䌀䈀㌀㜀　㔀㌀㜀㤀䄀㠀䔀㘀㌀䄀㐀䐀㔀㘀㜀㄀　䈀㌀䌀䘀　㈀㤀㄀㜀䐀㘀㄀䌀　䐀䄀㈀㌀㈀㌀䌀㠀㘀㌀䄀䌀　㈀　㌀䈀䘀㔀㘀䈀䐀㔀㈀䘀㐀㘀䄀䌀㄀䈀㔀㄀　䌀㜀䌀㈀㜀㠀䈀㄀㤀㜀㔀㈀㄀　㠀　㠀䔀㤀䐀㤀㔀㔀䘀㤀㜀㌀䘀㘀㈀㠀䄀㄀㈀㘀䐀㌀㠀䌀㌀㌀㘀㄀㜀　䐀㤀㈀㌀㤀䄀㄀㜀䔀㘀㜀　㜀䄀䔀㜀䘀䈀䘀䐀䈀㤀䈀䘀㤀㠀㜀䐀㌀㄀㄀䐀䐀䈀㘀䄀　䌀㄀䔀㘀䄀㜀䌀㐀　㌀㘀㤀㜀㘀䄀䄀㤀㐀㔀㠀䔀䈀䌀䘀䔀䈀㌀㔀㤀䘀　㘀㈀㐀㘀㤀䈀䐀䈀䄀㘀䔀㄀䌀㜀㤀䈀㤀㐀㔀䈀　㐀　㘀㔀䔀㈀㈀　㐀䔀䌀㔀䄀䔀　㌀䄀䘀㔀　㐀㌀㜀㤀㠀㔀䘀㔀　㈀㔀㈀㄀㜀㤀䘀䌀㔀㄀䌀㤀䔀䌀䄀䔀㘀㜀䈀㘀䈀㤀䘀　䘀㘀㈀㜀㠀㤀㌀㄀㌀㘀㈀䄀㜀㜀䈀䈀䐀㔀㠀㤀　　㌀㌀㠀䈀䔀䐀㐀䈀䌀　　㔀㠀㔀㘀㌀䐀㘀㈀㌀㈀䈀䐀䔀㈀㠀䐀㘀䈀㐀䌀㘀䄀䌀　䈀㘀䔀㌀㐀㐀㔀㠀㐀㜀㔀　㠀㠀䔀㤀㐀䌀䔀㘀㠀㔀䄀㜀䐀䌀　䐀䈀㈀䔀䔀㄀㌀㈀䘀㐀㔀　㌀䈀㜀㔀㄀㌀㜀㌀㘀㜀䘀㐀䌀䔀㐀䈀㜀㤀　　㄀㠀㐀㔀　㘀䔀㜀㔀㄀䄀䌀䌀䘀㘀㠀㔀㈀㘀㠀㄀䔀䔀㈀䔀㄀㠀㠀㔀㤀䐀㜀㌀㠀㜀㜀㠀㤀䐀㜀䐀䌀䄀㤀㄀㤀䐀䘀㜀㈀㤀䄀䌀䈀㜀㄀㤀䔀䈀䈀㌀㌀㠀㤀㄀㄀䈀㔀䘀䘀㐀䔀䌀㌀㄀䌀　㘀䄀䌀㠀㈀㠀㈀䈀㈀㌀䌀㤀䈀䄀䘀㔀㌀㔀　㘀䈀　䘀㈀㜀㐀㔀䄀㐀㈀㘀㘀㔀㐀㔀㄀　㠀䐀䐀㄀㌀䐀㌀䔀䐀䌀㘀　䔀䔀㤀㌀㈀㌀㤀㈀㈀㠀㠀㄀䄀䔀㌀㄀䘀㘀　㤀䄀　㠀㈀㐀䄀㜀䘀　㄀㔀䌀㠀㌀㠀㜀㤀㠀㤀㤀㠀䐀㐀䌀㤀䐀㄀㈀䘀　䐀㄀㈀㄀㠀㌀㤀䔀㄀㤀㘀䘀㔀　㄀䔀㠀㔀䈀㤀㄀㈀㘀䔀㔀䔀㌀䄀䄀㐀䔀㠀㘀䄀　䘀　㄀㈀䌀　䈀䄀䄀㄀㤀䐀㘀㜀䄀㌀㌀　㄀㐀㐀㐀㤀㄀㤀㈀㐀䐀㐀䄀㤀㜀㈀䈀䄀㤀䄀㜀㌀䈀䘀㔀䔀䌀䔀㠀㐀㠀䐀䔀䄀䄀㔀㠀䌀䐀　䌀㠀㈀䔀䌀䘀㔀㔀㈀䄀㐀䘀㔀䘀䔀㔀㄀㄀㐀㄀䌀䄀䔀㘀䌀䐀㐀㐀㄀㐀䄀㜀䔀㤀㤀㤀䘀㄀㐀㐀䄀㘀㈀㠀㔀㠀㠀㈀㜀㤀　㤀㜀䄀㤀䔀　䌀䌀䘀㜀㄀䘀䐀　㠀䄀䘀䔀䌀㤀㤀䄀㄀䘀㄀䈀䈀䘀䌀䐀䘀䔀㐀䐀㠀㤀　㌀䐀㠀　㜀㌀䘀䔀㠀䔀㤀㐀䌀䌀䘀㐀䈀㔀䄀㐀㜀㤀㄀　㌀䈀㘀㔀㌀㠀䘀㌀㔀　㐀㈀㄀䄀　㘀㠀䔀㘀䐀㘀㐀䘀䄀䄀䈀㔀䈀㜀䘀㐀㘀㌀䌀㐀䐀䔀　　　䘀㘀㈀㠀㄀䄀䔀　㐀㔀　䐀㜀䈀　㘀㜀㈀㤀㤀㔀㌀㈀㜀䔀䈀㐀㌀㈀㜀㘀㄀䔀㐀䈀　㘀㘀䌀㈀㘀䌀㜀㈀㠀　㌀䈀䔀㤀㜀㔀䘀䄀䄀㌀㈀㔀㔀㄀㠀㠀䔀㜀䐀㐀㄀䌀㜀㌀䘀㔀　　㈀㌀䌀㈀䐀㐀㌀㤀㤀䔀㘀䘀㄀㠀㐀㄀䐀㤀䈀䄀㤀㐀䄀䔀㐀㜀䈀䐀㠀　䈀㈀䌀㠀䘀䌀㔀㈀㄀㘀㜀㄀㄀䌀㐀㄀䄀䐀䘀䄀䔀㠀䘀　㌀㄀䈀㈀㔀㈀䈀䈀㔀㤀䄀䌀䄀㌀䘀䌀㐀㘀㤀㔀㘀䐀䘀㘀䌀㠀㜀㠀㄀㤀䌀䔀䘀㐀㤀㈀㌀㤀㔀㔀㈀䘀㜀䈀㈀㔀䌀㈀㈀䐀䄀㘀㜀㄀　㠀䘀㠀䄀䈀㠀㌀㌀㠀㐀㘀䌀　㈀䈀㌀䐀　　䔀㔀㘀㠀䌀　䈀㤀㘀䐀䌀䐀㘀㠀㐀㜀㈀㌀㈀㈀㈀㌀㜀䔀䌀㐀㐀㠀　　㘀䔀䌀㐀㌀㌀㄀　䔀㐀㐀㔀㤀㔀䔀䄀㜀　䄀　㈀䈀㐀䔀㈀㤀㜀　㠀㐀　䄀䈀䄀䄀䌀㔀㄀䔀䄀㤀　㄀㜀䐀㌀䄀㔀䄀㌀㌀䌀䘀㜀㈀㔀㌀㄀㌀㄀㤀㄀㜀㐀㈀㔀㐀㐀䌀䐀㈀㈀䔀䘀䔀㔀㘀䈀䌀㌀䐀㈀㌀㈀㠀㠀㄀䌀㄀䈀㔀㘀㄀䔀䔀㈀㄀㌀䈀䈀䘀㘀䈀㠀䐀㔀䘀䈀㔀㐀㤀䌀䐀㜀䐀㌀䈀㄀䄀㈀䌀㐀䄀㈀䘀㘀㘀㌀㈀　䄀㘀䄀䌀　㔀䄀㜀䐀䄀㌀䘀　㔀䈀㈀㄀㄀䘀䐀㤀㌀䄀㠀㈀　㜀㄀䐀㄀㄀　㜀㐀　㜀䐀㤀㔀䘀㐀㌀㄀䌀㌀㄀㔀　㔀㘀㐀㌀㔀㔀㘀䌀㤀㤀㌀㄀㔀㈀㘀㘀㔀㐀㐀㜀㘀㄀㄀㤀　䔀䔀䘀㈀䐀㘀　　㘀㐀㄀䄀㌀䄀　䔀䄀㐀䌀㘀㄀䄀䘀㌀䘀㤀㄀㠀㜀䐀㘀㤀㠀㔀㐀㘀㤀㐀㔀䄀䘀䘀㠀䘀䈀　㜀㔀䔀䈀㤀䄀䐀䔀䄀㤀㄀䐀䄀䘀䐀䈀㈀㘀㈀䔀䈀㤀　䐀䘀㜀㐀䈀㘀　䔀㌀䔀䘀　　䐀㔀㤀䌀䐀㈀㐀㄀㌀䈀䌀䌀㌀㐀㈀䈀㄀䄀䔀䐀䐀㌀㐀㐀䄀㄀㈀䄀㜀㤀䐀䐀䔀㐀䘀䐀䔀㜀䄀㜀㈀㐀㐀䐀　䄀㐀䌀䌀䘀㄀䐀㐀㐀㘀㈀䄀䐀䘀㜀㈀䐀㠀䐀㈀　㜀䄀䌀䌀㄀䐀㌀㜀㘀㠀䔀䐀㤀㠀䌀䘀䄀㠀　䌀㤀䘀䄀㘀㐀㄀㐀㔀㘀㘀　㄀㘀䔀㐀㠀䈀䈀䄀䄀㔀㔀㘀䌀㔀㔀㜀㐀䈀　䌀䈀䔀䈀㄀䌀㈀㔀　䘀㘀䐀㄀㈀㄀㐀䌀䔀䘀㤀㤀䐀㈀䔀㜀㄀䔀㠀䘀㄀㌀㠀　㜀㐀䌀㌀㌀㄀䈀㘀㌀　㘀㈀䈀㤀㘀㄀䌀㔀㜀㜀㌀䘀㠀㌀㔀䄀䄀䈀䔀㌀䔀㄀㜀㈀㘀㌀䘀㔀䘀㈀㄀䈀㌀䄀　䌀㌀㠀㜀䈀㈀㠀㔀㘀䐀䈀㘀㌀䈀䈀䘀　䌀䌀䐀䔀㔀㔀㐀㠀䈀䄀䔀䌀䄀㐀㄀㄀㄀㄀㈀㜀䐀㌀㤀䘀㐀䔀䘀㈀䔀㠀䔀䘀㘀㠀㠀䈀　䔀㈀䌀䌀䄀䘀㐀㐀䐀㐀䄀㌀㈀䌀㠀㌀㠀㌀䈀䔀㐀䔀㠀䈀㄀㈀䌀㈀䔀㠀㤀䈀㌀㈀　㠀䌀㔀䐀　㌀　䈀䘀㔀䘀䄀䔀㘀䈀䐀䈀㐀　㄀㄀䘀䘀䐀䔀䌀　㜀䄀㤀㐀㘀㌀㤀䄀㘀䘀䔀㐀㜀㌀㐀㠀䔀㘀㤀䈀㜀䄀䈀㈀㜀㐀䌀　䐀㠀㠀䘀㘀㘀㈀㘀㠀㤀㄀㌀㔀㜀䘀䌀㤀㔀䐀㔀䘀䈀䈀㌀㔀㐀䈀㐀䄀㜀䄀㠀㜀㌀䄀㈀䘀䄀䌀㈀䘀䌀㤀㌀㠀㔀㌀㌀䌀䄀䌀㔀　㈀㐀䄀䄀䄀㔀㔀㤀䌀䘀㔀㜀㠀䘀䐀䌀䈀䌀㜀　㄀㐀䔀㈀䈀䌀㈀　䈀㠀㜀䌀䈀㈀䄀䈀䈀㠀　䈀㔀㄀䈀䐀㌀㐀㄀㐀㌀㜀䄀㤀䔀㌀䈀䌀䐀䐀䈀䔀㜀䐀㌀䐀䘀㄀㄀㈀㔀䌀㔀䘀　㈀䌀䔀䄀䌀　㠀䔀䌀䐀㌀䈀䈀䔀䄀㐀䌀㤀㄀䌀㈀䘀㐀䈀㐀㐀　　㈀䈀㐀㠀　㘀㌀䄀䄀㌀䔀㈀䈀㐀㐀　䈀㘀䌀䐀㌀䔀㘀㄀㠀㄀㠀䘀㌀䈀㈀㈀䐀㔀㤀㄀䔀䌀㜀㠀㔀䈀䔀㠀䔀㠀㌀㘀　㠀㠀䔀㈀䈀㠀㠀䐀㌀䈀㘀䄀㈀㘀㠀䈀㜀㈀䘀䄀䌀㘀㐀　㘀㜀　䔀㠀㔀䈀䌀䔀䈀㌀㜀䌀䐀㔀　䘀㠀　㄀㐀䈀㔀㄀㌀䐀㄀㠀䄀　㈀㐀㈀㠀㜀㈀䐀㜀䌀㌀䔀䈀㤀㌀䈀䄀䄀䄀　䔀㔀䄀䐀㌀㜀㔀䐀㈀㔀㐀㠀䘀㄀㌀䌀䌀㤀㠀䄀㘀䘀㘀㔀䈀䐀䈀㄀䐀䄀㔀㈀㄀㐀㐀㌀㔀㈀䔀䘀㘀䌀㠀㘀䔀䈀䐀䄀㔀㔀㘀䘀㜀　䔀㜀㤀䘀䄀㈀㠀㌀㠀䌀䔀㌀㈀䐀㜀　㐀㌀䐀䄀㠀㈀䘀㔀　㌀㌀㠀㔀㘀䈀䈀䌀㜀䔀㐀㠀㈀㄀䄀䐀㄀㐀䌀䐀　䐀㌀㌀㌀㔀㜀䐀䐀㐀㤀㜀　㘀　㔀㜀㔀㐀䐀　㠀㠀䈀䄀㘀㠀䌀㘀㘀㠀㜀㌀䄀㜀㌀䐀㠀㐀䈀䘀㔀㔀㠀䔀䐀㌀　䔀䘀㄀㔀㤀㐀㘀㄀㔀㔀㔀䔀䈀䈀䘀㜀䐀㄀㐀㜀䄀䐀　㐀䐀㘀䔀㤀䘀䌀䌀䌀䈀㌀㘀㄀㤀㌀䌀䌀䔀㤀㐀㄀㈀㈀㌀㘀㐀䄀㜀䈀㌀㌀　㔀㠀䄀㌀㌀㐀䌀䄀㔀䈀䄀㤀䔀䐀䄀㄀㈀㐀㤀㤀䄀䐀㄀䌀䌀㘀㤀䌀㜀䈀䈀㜀㄀㜀䈀䔀㤀䐀㘀㐀㤀㤀䐀㄀䈀䐀䐀㐀䘀䈀㜀䌀䔀䌀㠀䈀㤀㘀䘀䌀㔀䘀㄀䌀䄀㔀㔀䈀㌀䄀䐀㜀㤀㌀㈀　䔀䘀㄀　㠀㤀䔀䌀㔀㜀㤀䘀㄀㜀㤀䈀䌀㈀㠀㠀䄀䘀㌀㈀　㄀䐀㐀㌀䄀㌀㠀㄀㤀䐀㄀㌀䌀㜀䔀㈀㤀㔀㤀䘀䌀　㤀㌀㈀㤀㄀䌀㜀㠀㠀㠀㘀　㐀　䄀㜀㄀㠀㜀㔀㠀䈀　　䌀㌀㌀䈀㄀㤀䌀䔀䌀㤀䔀䐀㜀䌀䘀㘀㄀䐀　㜀㐀㈀䐀㠀㐀㌀㔀㌀㄀䐀䔀䄀㔀㔀㠀　䐀䔀䈀㄀㌀䐀䔀䔀䌀䌀　䔀　䘀䈀㘀㄀䐀㌀䐀䈀䐀㐀㈀㄀㜀㜀㠀㈀㐀䐀㄀㈀㄀㌀䄀㠀䘀㘀㜀䔀㠀㌀㄀䐀䘀㔀䈀䈀䄀　㘀䈀䔀㠀　䔀䘀䌀䄀䘀䐀㌀㘀䐀䈀㠀㌀㐀䄀㌀㘀㔀䈀㈀㘀㌀㄀㠀䌀䔀　　䘀㄀㘀䐀㐀䈀䘀䐀䐀䘀䌀䐀䌀㌀䌀䘀㄀䐀䔀㜀䄀㘀䌀㤀㤀䈀䈀䐀㔀㜀䄀㐀㜀䐀䔀㘀㄀㠀䄀䔀㄀䘀　䐀㈀㘀　㈀㜀䄀㄀䌀䘀㜀㐀㄀㘀䈀㘀㤀㤀㐀㔀㌀㐀　㐀䔀　㘀㄀㤀䈀㄀㤀䔀䘀　㈀　㠀䘀䐀䘀䔀　　䄀　㜀䔀㤀䔀㤀䄀㔀㠀㠀㜀㈀䔀㈀㠀䐀㐀㈀䐀䐀䄀㠀㜀䘀㘀䘀　䄀㐀㐀㔀　䄀䘀㔀㔀䈀䘀㘀䔀㄀䄀䄀㈀䐀　䈀䐀㈀䐀㤀㤀㌀㜀䔀㔀㠀㌀䘀㜀䐀䈀䔀㈀㤀㄀䐀　䐀㄀䐀䈀㌀㐀䈀㘀㄀㐀㌀㔀䌀䘀㈀䄀㐀㌀㘀䈀㔀㈀䌀䘀䌀䐀㈀䈀　䈀㐀㈀㠀㠀㌀㌀㄀䘀㘀䘀䌀㜀㔀䄀㔀㈀䄀　㐀㐀㤀䈀㌀㔀䐀䄀㠀㐀㘀䈀㜀䈀㔀䔀㔀㈀㠀㤀䌀䌀㄀䌀䈀　䔀㈀㠀䘀䐀㐀㄀㘀䈀䄀䘀㐀䈀㈀㠀㌀㠀㐀䈀㤀㄀䌀䈀䄀䐀㠀㌀䌀　䔀㌀䘀㠀㤀㈀䘀㘀　㠀䌀㜀䘀㄀䐀㄀㔀䘀　䌀䘀䔀㌀䄀㈀䌀㘀㈀　㐀㈀䈀䈀䈀㤀㜀　㘀䌀㠀䐀㤀䐀䘀䐀䐀㘀䈀䔀㜀㘀㄀㤀䄀䄀㜀㔀　㈀㈀㘀䐀䔀䘀㔀䔀㘀　䘀䘀㈀㌀㄀䄀㠀㐀㌀䐀㐀䈀㈀䌀㤀㌀䘀䄀㈀䄀䔀䄀㌀㘀㄀䈀㈀㠀㔀䈀㄀䈀䔀䌀䔀㠀㜀㈀䘀㤀䔀㄀㐀㄀䌀　㔀䔀㈀㄀䌀䄀㤀　㤀㜀䐀㘀　㔀㐀㔀㠀㌀䐀䔀　　㜀䌀㜀㈀㐀㘀䈀㔀䘀䐀䄀　㘀　㠀㤀㔀㜀䌀　㌀㐀䘀䈀㜀㔀䌀㌀㄀㘀㘀㈀㔀䌀㠀㌀㤀㈀䄀㤀䐀䈀㔀　㔀㤀㘀㤀䐀㠀㜀㐀䈀䄀䘀䔀䔀㠀䐀㜀䈀㔀㤀䄀䈀䐀䄀　䐀㈀䈀䐀䄀䐀　　　㌀㔀䌀㤀㘀㌀䔀㤀　䄀㈀䔀㜀㤀䌀㐀㠀䔀䈀㈀㈀㘀䘀䌀㄀㈀㜀㘀㤀㌀䈀㤀㠀㈀䄀㠀䈀㈀䄀㘀㐀㠀㔀㤀䐀䔀㈀㔀䄀䘀㔀䈀㤀㤀㘀㄀䐀㌀䘀㤀䔀䐀　㌀䘀㈀㔀䔀䌀䄀㤀䄀䈀㜀㔀㤀㐀㘀　䄀㘀䌀㜀䘀㄀㘀㐀㌀㠀㈀㜀㘀䌀䐀　䔀䌀䄀㄀　䄀㄀㜀㌀㌀　㠀㠀䔀㠀㄀䘀䐀㜀㐀㤀㤀㜀㐀㠀䘀䄀㜀　㌀㤀㤀䈀㤀䌀䄀䌀䈀㘀㠀㜀䔀䐀䌀㐀　㄀䔀䔀䌀䌀㜀㠀㜀㔀㘀㤀㔀㠀㈀䘀㜀　䈀䘀㔀㔀㔀㌀䘀㌀䌀　䘀䌀　　㠀㜀䈀㔀㄀㌀㠀㈀㘀䔀䘀䄀㄀㄀㜀㐀㔀㄀㄀㤀䘀㄀㤀䌀䘀　㌀䘀䔀䔀㈀䌀　䔀䘀㤀䌀㄀㘀㜀䔀㘀㈀䘀㜀㄀㠀䌀䌀㌀㔀䔀㤀㔀䄀㈀䌀㤀㌀䔀㜀㘀㔀㘀㐀㤀㘀䈀㌀㔀䔀䘀䔀䔀䌀㐀㌀㔀㈀䐀㠀㄀䄀㔀䔀䐀䄀䄀䈀㄀䔀　㈀䔀䐀䌀㔀㔀䔀㌀䐀㤀㐀㈀㘀㈀㄀㌀㔀䔀㘀㤀㠀㤀　㠀䘀㔀㈀䄀㠀㠀䌀㈀㄀　㄀䌀㜀㜀　㤀䄀㌀　䔀㔀䌀䘀　䌀㜀㄀䐀㜀䐀㈀㐀㌀㌀㔀㔀㐀㄀㐀㘀㐀㤀㄀㜀㌀　䐀㘀㘀㤀㈀㈀㠀䐀㔀䘀䐀㜀㘀㈀䄀䈀㈀㌀䈀㌀䔀㐀㈀㤀䔀䌀㔀㘀䌀䔀　㠀㐀䄀䐀㌀㜀䈀㔀䄀䄀䈀　䈀㔀㄀㌀䐀㌀䐀䔀䌀䐀㔀㔀䄀㐀㠀㘀㌀㜀㄀䈀㜀㐀䘀㐀㔀㐀䄀㜀㐀　䐀䄀㜀䐀䄀㌀䌀䈀㘀㐀䈀㔀㄀㄀㜀㜀㈀㄀㄀㄀䘀䔀㠀㜀㘀　㐀㘀㜀䐀䄀㐀䈀㠀㈀䘀㜀㄀㄀㠀㈀㐀㠀䈀㠀㜀䘀㐀䐀㜀㈀㈀㠀　䌀㘀㠀㤀　㔀㜀䌀䐀䄀㌀䈀　㐀㄀㠀䈀䔀㠀䘀㘀䌀㤀㠀䔀　䄀䄀㄀㌀䄀㤀㌀㄀䐀㔀䌀㔀㠀䐀㘀㌀䄀䘀㄀㐀㄀㔀㈀䘀㘀㄀㔀䘀㌀䄀䄀㈀㔀䈀㔀㜀　䘀䌀㠀㈀䐀䔀㠀㘀　㄀㤀㌀䄀㌀䌀㤀䌀䐀䐀㄀䐀䔀䈀䐀㔀䌀䌀䌀䌀㄀䌀㜀㜀㄀䄀㌀䐀㄀㠀㌀㐀䘀䔀㈀㠀㘀㜀㘀　䈀　㔀㌀㘀㘀㈀䔀　　㠀㐀䐀㘀㌀㔀䈀䈀㘀䄀㔀䘀㘀㤀㜀㘀䐀䌀㤀䘀㄀㐀䔀㄀㔀㠀䘀㔀㄀㠀䈀䌀䘀㄀㤀㈀㐀㤀　䌀䐀䄀㘀㔀䄀䐀䔀　䄀䈀㠀㘀㤀㠀㔀䄀　䐀䘀㔀㐀㄀㤀䈀　䄀㄀䄀㤀㐀㐀㤀㐀㔀㄀䌀㌀㌀㜀㄀㘀㘀㘀䄀䌀㌀䌀䌀㘀䈀㈀㌀䄀㌀䔀　䔀㔀䘀㠀㘀㜀䌀㐀䘀㐀㈀㌀䌀䘀䔀䐀　䘀䔀㠀䘀䈀䘀㠀㘀㜀㤀㐀䔀　㔀䘀㘀䈀㜀㈀　㠀㔀㜀䈀㔀㤀㠀㠀㌀䘀㔀䘀䐀㔀㐀　㄀䈀㔀㈀䔀㠀㐀䔀䘀㈀㔀㠀㠀㔀　䐀㔀䄀㘀㈀㜀䔀䔀㘀㈀㐀㠀㄀䔀㌀䄀䄀㘀䔀䐀㠀㌀㈀㠀䌀䌀㠀㈀㤀㈀䈀䄀䌀㘀䐀䈀䄀㠀㐀㈀㜀㌀㤀䔀㤀㌀䌀㌀㘀䄀㄀㜀䔀㌀㠀㠀　㄀䘀䔀䌀㤀㤀㜀　㌀㠀㜀䄀㠀㐀㘀㘀䘀䄀　䌀㜀䄀㌀䄀䌀㘀䌀䔀䌀㜀㜀䄀㌀䈀㜀㔀㘀㔀㜀㈀㠀㐀䐀䘀㘀䐀㐀㐀㌀㔀䌀䔀䔀䈀㈀㌀　䈀㜀䘀䐀　㤀　　䄀㄀　㠀　㌀䐀㌀䘀䔀䈀㤀㐀㔀䌀㤀㠀㤀䐀㔀　䘀㐀㘀　㄀㈀䐀㔀䌀䘀㌀㄀㠀㐀㐀㐀㌀䐀㌀㈀㜀㄀㐀㔀㠀㠀　䔀㠀㄀䄀䐀䈀㐀㜀䘀䔀䄀㈀㜀　　䘀㌀㜀㠀㠀䘀　䘀䔀㐀䄀㔀㔀㠀　䈀㔀㔀㔀䈀㘀䐀䌀䌀㐀䔀㜀䈀䈀㄀㌀䐀㄀䐀㄀㘀㘀㄀䔀䈀㈀　䌀䈀䈀㐀䄀䌀㌀䌀㠀䄀㄀㘀㜀䌀　䈀䘀㠀㈀㘀㔀㈀䐀㄀㜀䔀䈀㈀䈀㐀䐀䘀㄀㄀㘀䐀㄀㜀䔀㄀㤀　㜀㘀㔀㌀㄀䐀䔀䄀䌀䘀䌀㔀㠀　㐀䌀䌀　㔀䐀䄀䘀㄀䐀䘀䔀㔀㌀䔀䐀㘀㌀㔀㠀䌀㠀㄀㘀㜀㜀　㐀䌀　　䐀㜀㐀㌀䌀䈀㄀㜀㠀㤀㜀㐀㐀㤀　䔀䐀㜀㐀㘀㌀㜀㄀䌀䐀䔀㤀㜀㠀㄀䈀䈀䄀㘀㔀䌀㔀㄀㄀㌀㐀㘀䄀㜀䘀㘀䔀㄀䌀䄀㔀䌀䐀㐀㜀䔀㐀䄀㄀㜀㠀䐀㌀㠀䐀䄀㌀䈀㄀㠀㈀䈀　䐀㔀㠀䔀㄀䐀㐀㤀㤀䘀㌀㄀䄀㄀䄀䄀㌀　䔀㤀㘀䈀㌀㐀㘀䔀㠀䄀㈀　䄀　㘀䘀㔀䘀㔀䈀䄀䌀䌀㐀䔀㠀㈀㌀㠀䌀䌀㄀㠀䘀㠀㌀䘀䘀䘀　㔀䌀㄀㔀䔀㌀㠀㤀㘀䘀䌀䄀　㠀㤀䐀㜀㐀㈀㠀䄀䈀䘀㜀㤀　㔀㤀㔀㜀㠀䔀㐀䈀㠀㘀㤀䘀㠀㐀㜀䐀䌀㔀䌀䈀㔀㄀㌀䄀㈀㌀䐀䈀㔀䔀㌀㔀㐀㘀㜀䘀㘀㠀㤀㠀　䐀㠀㜀㘀䔀㠀䔀㘀㜀䌀㄀㄀㤀㐀䌀㄀䔀䄀㌀䌀　䘀㄀䄀㈀㔀䄀㠀㐀㈀㌀䔀䐀䐀㐀㄀䌀㠀㔀㌀䔀㤀㐀䌀㠀㠀㔀㤀㐀㈀㠀㜀㜀㠀䘀䈀㠀㜀㘀㌀䔀䌀　㔀㠀㤀䔀㌀㤀㘀㤀䌀㤀㤀㤀㔀㤀㠀㐀㄀㈀䔀䘀㘀䘀䘀㐀䈀䄀䄀㄀䌀㈀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㜀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㔀　㘀㄀㘀㜀㘀㔀㈀䘀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㈀　㌀㈀㈀　㌀　㈀　㔀㈀㈀䘀㔀㈀㘀㔀㜀㌀㘀䘀㜀㔀㜀㈀㘀㌀㘀㔀㜀㌀㌀䌀㌀䌀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㌀䌀㌀䌀㈀䘀㐀㘀㌀㄀㈀　㌀㔀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㌀㈀　㌀㄀㌀㄀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㐀㈀　㌀㄀㌀㌀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㐀㔀㜀㠀㜀㐀㐀㜀㔀㌀㜀㐀㘀㄀㜀㐀㘀㔀㌀䌀㌀䌀㈀䘀㐀㜀㔀㌀㌀㜀㈀　㌀㜀㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㔀㌀㌀㠀㈀　㌀㠀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㔀　㜀㈀㘀䘀㘀㌀㔀㌀㘀㔀㜀㐀㔀䈀㈀䘀㔀　㐀㐀㐀㘀㈀䘀㔀㐀㘀㔀㜀㠀㜀㐀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㈀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㌀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㤀㔀䐀㈀　㌀䔀㌀䔀㈀䘀㐀䐀㘀㔀㘀㐀㘀㤀㘀㄀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㤀㌀㔀㈀䔀㌀㌀㌀㈀㈀　㌀㠀㌀㐀㌀㄀㈀䔀㌀㤀㌀㈀㔀䐀㈀　㈀䘀㐀㌀㘀䘀㘀䔀㜀㐀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀㄀㌀㠀㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㈀䘀㔀㌀㈀䘀㔀㐀㜀㈀㘀㄀㘀䔀㜀㌀㜀　㘀㄀㜀㈀㘀㔀㘀䔀㘀㌀㜀㤀㈀䘀㐀㌀㔀㌀㈀䘀㐀㐀㘀㔀㜀㘀㘀㤀㘀㌀㘀㔀㔀㈀㐀㜀㐀㈀㌀䔀㌀䔀㈀䘀㔀㐀㘀㄀㘀㈀㜀㌀㈀䘀㔀㌀㈀䘀㔀㌀㜀㐀㜀㈀㜀㔀㘀㌀㜀㐀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㠀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㐀㌀㜀㌀㐀㌀㠀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䈀䐀㔀䐀㔀㤀㘀䘀䔀㌀䌀㠀㄀㄀㜀䔀㌀㜀䔀　䘀䘀䐀　㘀䘀㘀䈀　㔀㔀㘀㔀䈀䈀䌀㐀㤀㈀　　㠀䈀　㌀㌀㜀䈀㘀㐀㠀㌀㈀䌀㜀㈀䄀䌀㠀㌀㌀䌀㘀䌀䘀㈀㐀　㠀㤀㈀䐀㔀㤀㤀㤀㌀㄀䄀㤀㠀㠀㤀㐀㘀㜀䘀䌀䔀䘀䐀㌀㔀㔀㜀䐀㤀㈀䔀䌀䐀㘀㄀㠀㄀㤀䘀㘀㈀䔀䈀　㄀䔀㠀䐀㈀㔀䈀㄀䈀䄀䄀䈀䄀䈀䔀䈀䘀㠀䔀䄀㤀㠀㠀㜀㘀䘀䌀䘀䌀㌀㜀㄀㔀䘀䔀䘀　㘀䘀㈀䘀䈀䐀䘀㌀䘀㜀䌀㌀䈀　䌀䘀㔀䔀䔀㠀㤀㌀㔀䔀㐀䐀㜀㠀㜀䌀㜀䔀䔀䘀㐀䔀䘀㠀㜀䌀㜀䐀㜀㄀㌀㜀䈀䘀㠀㘀䈀㜀䐀㌀㠀䈀㘀䘀㔀㜀　䔀䌀䐀䄀㠀㜀㔀䘀㈀䔀䐀䈀　㄀㜀䔀䘀㔀㐀㜀㔀㘀㌀㜀䔀䌀䘀䌀㠀㜀㌀䘀㤀　㜀㜀䐀䘀䈀䐀㈀㜀䘀䘀䈀䐀䈀䐀䐀㤀䐀　　䐀䘀䌀㔀㜀㤀㘀㐀㔀㐀㐀㌀㘀㈀㐀䄀䈀㌀㈀㤀䄀䌀㐀䄀㐀㐀䌀㈀㌀㔀䄀䌀㔀䔀㐀䌀䌀㘀䔀㘀䘀䘀䔀䘀㤀㌀䈀䐀㈀䐀䔀䐀䔀䈀䌀㜀䈀䈀䌀䈀䐀㜀㤀䘀㠀㈀㄀㈀㈀㔀㄀㐀㐀㌀㜀㈀㤀㜀㤀䐀䌀䐀䘀䐀䔀䌀　䄀㜀㌀㜀㈀㐀㈀㈀㐀㔀㐀䌀㌀㜀㜀㄀㐀䄀㠀䄀㈀䄀䄀㜀㌀㄀㜀㤀㜀䌀䔀㘀㄀䘀䘀䈀䘀㄀㤀㜀㠀㈀㄀䌀㜀䄀䘀䔀㘀㐀㜀㈀䌀　䈀䘀㤀㔀䘀㈀㘀䘀㌀䘀䐀䔀䐀䔀䘀䌀㜀䄀㐀㜀㔀㘀䘀䘀㈀㘀㠀䘀㜀䘀䈀䄀䈀䐀䘀㤀㤀䔀㌀䘀䘀　㘀䘀䈀㜀㌀㜀㘀䘀㔀䔀䌀　㠀㌀䐀䔀䔀䈀䈀䈀㤀䘀䌀㔀䈀䄀䔀㄀䔀㤀䌀㔀㠀㘀㘀㘀㈀㔀㄀　㠀䘀㘀㤀㔀䄀㤀㈀㌀㐀㐀䈀㘀㤀㔀䌀㤀　　䐀䈀䌀㠀㘀㘀䘀䔀䔀㜀䘀㜀㜀㜀䈀㐀㌀䈀䔀䔀㜀㄀䘀䘀䘀㄀䈀䐀㈀䌀㈀㤀㜀　䘀㄀䔀㤀䔀䈀䐀䔀䈀㠀㘀䄀㄀㜀䈀䘀㘀䈀㌀䔀䐀㠀㜀䄀䔀㄀䈀㤀㘀㘀㐀㔀䈀㄀㘀㔀㔀㜀䌀䔀㤀㈀㐀㠀㤀㘀㤀㔀㤀㈀㈀䐀䈀㜀　㌀䘀㤀㈀㐀㤀䌀㤀䘀䘀䌀㤀䄀㐀㈀䈀䔀㐀䔀㈀㠀䌀㄀㘀㄀䔀㘀䄀㐀㄀㠀䔀㈀㐀㐀䐀㘀㤀㤀㐀䘀㌀㄀㌀䌀㤀㘀㤀㤀㘀䌀㄀㠀㤀㄀㐀㔀㔀䔀㔀㌀䘀㄀㐀䘀㈀䘀　䌀䈀䄀㤀㘀䔀䔀㄀㐀㐀㜀䔀㜀䔀䘀䘀䐀㌀㜀㜀㘀㐀䘀㌀䘀　䔀㜀䈀䄀㌀䐀㤀　㌀䈀䐀㘀䄀䔀䈀䘀䘀䐀䌀㜀㘀䄀㜀㤀㔀㄀䌀䐀　䈀㤀䄀䄀㜀㌀㌀㌀㘀䔀䌀㔀㜀䔀䈀䘀㐀䔀䔀䔀㌀㈀䄀䈀䈀㘀㌀㤀䘀㠀䘀䄀䈀䘀䌀㘀䔀䘀䈀㤀㄀䘀䘀㘀　㠀㐀䈀㔀䐀䐀㘀㔀㤀㔀䐀䔀㄀䐀㤀䔀㔀㘀　㤀㘀㜀㄀㐀䘀䘀䌀㐀　　㌀䘀䈀䄀㔀㔀㈀㐀䘀䘀䘀䄀㔀㐀䘀㌀㌀㜀䐀䄀㠀㘀䘀䘀䌀　䄀䘀䔀䄀䐀䘀䔀㌀䌀㜀㤀䔀㄀㠀䘀䘀㜀䐀㘀䘀㜀䔀㜀㤀㔀䔀䄀䐀㤀㌀㌀䈀䘀㘀㔀䘀䘀䔀䌀䈀　䈀㤀　㄀　㜀䘀㠀㔀㜀㜀㤀䘀䘀㄀㔀㔀䈀䈀㠀䄀䔀㐀㄀㜀䘀䈀䌀㔀　㔀㈀　䄀䔀㈀㈀㤀䄀㘀㜀䈀䔀䈀䐀䘀䘀䈀䘀㈀㈀㜀　㠀䐀㔀䔀㐀䄀㠀䈀䌀㈀㐀㜀䄀䘀㘀䔀㌀㤀　䘀㄀䄀䌀㄀㤀㜀㔀䌀䔀䌀䘀䔀䌀㠀䐀㤀㠀㜀　䌀䌀㄀㄀䘀䌀㠀㘀　㜀䌀　㔀㄀䘀㌀　䌀䌀㈀㐀㤀䄀㘀䐀㌀㔀䈀㈀㜀䌀䔀㤀㘀㔀㈀㜀㘀㔀　䄀　㈀䔀䈀㔀㤀䘀㘀㌀䄀　　䈀䐀㄀㈀㔀㐀㤀㘀㠀㜀䐀䔀㈀㜀䌀䔀㤀㌀䔀䔀䘀䌀䈀㄀䔀㄀　㈀㠀㠀䘀㈀䐀㌀䐀㘀㐀㈀㐀㈀䘀㈀䈀䈀䌀䈀㤀㤀㄀㄀㈀䐀㠀㠀㈀㠀䈀㤀㔀㌀㌀䔀䘀㄀㔀㜀㐀䐀䄀䐀　㔀䄀䄀㔀䔀㔀䔀䄀㌀㘀䌀㄀㈀㔀䄀䔀㘀䈀䔀㤀㔀㔀㌀䈀䔀㄀䄀㈀㈀㤀㘀䈀㔀㌀㐀㘀㄀㜀㔀㠀䈀䈀㤀䈀㈀䐀䘀䔀㐀㌀㌀䌀㈀㜀䘀㔀䘀㤀䔀㔀䔀㐀㔀䄀䈀䐀㐀㐀䈀㠀䘀㠀㄀㤀䄀　　㔀㌀　㄀㘀䄀䄀　㤀㘀㘀䄀㐀　㜀㄀㌀䘀㤀㄀䌀䌀䐀䘀䘀㈀㔀㜀㜀㔀㠀䘀䌀䄀㠀　㠀㠀䐀㌀㔀　䐀㈀㘀䐀㜀㐀㐀㌀㜀䘀㠀㈀䘀㜀㜀㜀㜀　　䐀䘀　㌀䌀䔀㄀䌀㔀䄀䔀㠀㘀䄀㜀䌀㌀㄀㌀㔀䘀䌀㔀㈀㌀䘀㄀㄀㄀䘀　䌀䔀　㄀㈀䔀㄀　㘀䈀㔀㘀䐀㘀䘀䐀䔀㠀䌀㠀䄀䄀䈀䌀㘀㌀㜀䈀䘀䔀䔀㔀㐀㈀㜀䌀㄀㤀㜀䔀䈀　㔀㘀㈀䐀㐀㈀㌀䔀㐀㔀䐀䔀㌀㘀䈀䌀㠀　䘀㔀㘀㄀㤀㔀㔀䌀㔀㔀㔀㤀䘀㈀䌀㤀䄀䘀㈀㜀䈀㌀㜀㐀㔀䈀䔀　㐀㈀㤀䐀㘀䌀䌀䄀㐀䐀䌀㠀㠀䌀䐀㄀㠀㈀㔀䐀㌀㘀䈀㜀㜀䈀䐀　䌀㤀䈀　䌀㤀㔀㌀㐀䘀　㤀㜀㈀㘀㈀䔀㤀　㔀㐀㔀㘀㤀䌀䌀䌀䘀䐀䔀䈀㌀䄀　　㤀㌀㤀㤀㜀㈀㄀㠀䈀㄀㘀㌀　㘀㐀　㤀㠀㤀䘀㠀㈀㈀㜀㈀㈀㜀䄀㌀䔀　㤀䐀䌀㤀䈀䄀　㠀㌀䌀㌀䈀　㘀㈀䈀䈀䘀䘀䈀䘀㔀䔀䔀㄀䘀㌀䐀㌀䈀㤀㌀㤀䘀㔀䄀㜀䔀㠀㠀䐀䌀㤀㐀㤀䐀䈀㤀䄀㤀䌀㘀㄀㜀䄀㐀㘀䔀㄀䈀　㈀䄀䘀䐀䔀㜀㜀䔀䐀㜀　䔀䔀䈀䔀㔀䄀㠀㤀䌀䔀㤀㘀㄀㜀㈀㜀㄀㤀㠀䐀㌀㌀䔀㜀䘀㈀䐀䔀䌀㐀䈀㘀㌀㠀䄀䌀䘀䐀䌀䘀䈀㤀䈀㜀㤀㠀䌀㜀䈀㌀㠀㔀㜀䐀　㜀䌀䄀㜀㘀㜀㜀㔀㤀㄀㤀㘀䈀㤀䌀䄀　䄀䄀㄀㔀䈀㜀㄀㌀䔀䐀䌀䐀㜀㤀㔀㔀䐀䌀䔀䐀㤀䔀䔀　㤀䔀　㤀㘀㤀䔀䌀㈀䘀䘀㈀䌀㈀㐀䈀䄀㌀㄀䐀㐀㔀䔀㈀䐀㌀䘀㠀㠀　㐀䈀　䘀㔀㜀㘀㔀㄀　㔀㜀㠀㔀䘀䘀䐀㠀㌀㈀䐀　䌀㘀䘀㠀䘀㈀㜀㐀䔀㘀䄀䘀㌀㜀䘀䌀䄀㄀䘀䄀㜀㘀䘀㈀䄀䈀䄀䌀䐀䔀㤀䌀㌀㠀㄀㠀䌀㈀㈀䈀㘀㠀䌀㠀㠀㔀㤀䘀㈀㔀㌀䌀䐀㘀㔀　　㄀䐀㄀㘀䘀㐀㤀㜀䘀䐀㤀㌀䐀䔀㤀㔀䘀䐀㔀䘀䄀㘀䈀䔀㘀㤀㘀䈀㜀㐀㠀㜀㜀㘀㈀㐀䈀㘀䈀㜀䈀㜀㌀㄀㜀㔀㐀㐀䐀㤀㌀䄀㜀䐀㜀㘀㈀㠀䐀䌀㄀㘀䔀㜀㤀㔀䔀㤀㐀㜀　䈀㜀䄀㘀䄀㜀䐀　㜀㘀㈀䈀㤀䈀㘀㤀䌀　㔀䌀䐀㠀䔀㜀　㜀䈀䌀䘀㤀䄀䘀㈀䔀　㘀㈀㄀㄀䈀㘀　㌀䘀䌀䐀　䈀㤀㌀㘀㜀㌀㐀㐀㠀䌀㘀䐀㤀䄀䄀㐀䘀㘀䘀㐀䌀䔀䌀㜀㘀䌀㈀䄀䔀　㘀䌀㠀䘀㈀䌀㌀㠀䘀㤀䌀䄀㜀　䘀㜀㘀䘀㠀　㤀㌀䌀㌀㘀㜀䔀䘀㠀㐀㜀䘀㠀㠀䌀䐀　㠀㔀㜀㈀䄀䐀䘀㤀㔀㠀㜀䐀㐀㘀䐀㘀䐀㈀䔀䈀㠀㄀䘀㔀䌀　䌀㔀㐀㄀㔀㤀㘀㠀䄀㌀䌀㔀㔀　䄀　㜀䄀㐀㘀㌀䄀㜀㠀㜀䘀䄀䘀㌀㜀㘀䌀㤀㘀䈀㐀䈀䈀㤀䌀㔀㜀㤀㔀䘀䌀㠀㈀㔀㤀㐀䐀䄀㠀䐀㌀䌀㠀䘀㤀㤀㔀㤀䐀㔀䈀㌀㜀䌀㤀㤀㘀㘀㜀䌀㘀㜀㔀㐀㠀䌀㄀㠀䐀䈀䄀䐀䌀　㔀䄀䔀㐀䘀䐀䐀㤀㜀㈀㠀㄀䐀䈀㄀䌀䌀㔀䌀㠀㐀㜀䌀䌀㐀䈀㜀䄀㜀䘀䄀㠀㔀㤀㄀㈀䐀䔀㌀㤀䘀㄀㈀䌀䘀䐀㠀䄀㄀㜀　䔀䔀㤀㠀䈀㈀㜀　㘀㠀䌀䌀䔀䔀㌀㔀㄀䘀䌀㘀　䔀䔀　㠀䌀㘀䐀㌀䐀䘀㤀䄀㐀䈀㐀㌀䘀㌀䔀㄀䈀㈀㠀䐀䄀䌀䘀　䘀䌀㔀䄀㘀㈀䌀㠀㈀䄀㠀㘀䐀䌀䄀䄀㘀䘀䔀㜀㈀　㈀㐀䈀㜀䄀㔀䔀㤀䌀㘀䌀㔀㔀㜀㄀㐀䐀䔀㔀㈀㜀㠀䈀㌀䌀㤀㌀㠀䌀㔀㌀㠀䄀䔀䄀　㤀㠀䔀䔀䌀　㈀䄀䌀㘀䄀　㠀㄀㜀㔀　䌀䔀㄀㜀㈀䐀㜀䌀㔀䈀㈀䐀䘀㠀㔀䌀　㄀䘀㔀㔀㘀䈀㠀㈀㄀㄀䐀　㤀㈀㤀䔀㤀㐀㜀䄀㔀䐀　䌀㐀䄀㌀䌀㘀㔀䄀䄀䌀㐀㘀㐀㔀䐀㔀㄀䌀㤀㔀㈀㘀㠀㄀　䘀㜀㜀䔀㠀㐀䌀㜀䌀㔀㐀㐀䈀㐀　㈀䘀㐀㔀㔀䐀䐀䌀䄀䐀㔀㘀㈀䐀䘀䌀㈀䔀䘀　䈀㜀䘀㤀㤀䐀䐀㠀䔀㤀㈀㜀䔀䄀㈀䘀㠀䈀䘀䈀䈀㐀㜀䐀　㔀䐀㔀㌀䄀㜀㘀䘀㘀㤀㔀㘀䔀㈀䄀䄀㐀㔀㠀䌀　㤀䐀　㠀㜀㜀䈀䌀㐀㤀䌀㤀䘀䘀㤀䌀䘀㄀䘀㤀䄀㐀䘀㜀㠀　㜀䄀䘀㌀䐀㐀㄀㌀㜀　䐀㘀㌀㠀㘀㜀㈀㜀䐀䔀㤀䄀㘀　䐀　㐀㔀䈀㌀㄀㔀䘀㤀㜀㜀㔀㘀䌀㄀　䐀䐀䔀　䄀䔀㔀䈀䈀㐀㠀㠀㜀㠀㔀㜀䘀䔀㠀䘀㄀㠀㤀　䈀㈀䌀㠀㌀㠀䐀䔀㌀㈀䐀䔀䄀㈀㘀㔀㘀㠀㌀㘀㤀㜀䘀䌀䈀䐀　䈀㄀㄀䌀㌀䈀㐀䈀㐀㄀䐀㔀㠀㘀㜀䈀㄀䐀䈀䘀㄀㄀㈀䐀㐀㐀　䐀㜀㠀䈀㄀䌀㘀㐀䌀㜀㔀㠀㐀䄀㌀㜀䌀䈀䐀㔀㘀㌀䌀㠀䄀㤀㜀㜀䐀㘀㘀㘀㠀㜀䄀㌀㠀㠀䌀㄀㜀㜀㠀㔀㔀㠀㜀㘀㌀㜀䘀㤀䌀䐀㈀㜀㐀䄀䔀㠀㐀㠀㐀㜀㘀㄀㤀䔀䄀䄀㘀䐀㘀䄀䌀䄀㤀䔀㤀䘀㈀䈀䔀㔀䔀䈀䌀䄀㄀㔀㔀䔀㤀㔀䈀䌀㌀㄀䈀䈀䌀㤀㘀㈀㐀䈀　䐀㜀䈀㈀㜀㄀㜀䄀㈀䐀㌀䘀䄀䄀　㌀㜀䄀㐀㄀㠀㤀㜀㠀䈀㌀㠀㔀䌀䘀㤀㔀㤀㌀㌀㈀㜀　䔀㤀㤀㠀䘀䄀㈀㜀㄀㠀䈀　　㠀䐀㤀㄀㤀㈀　㤀䌀䔀㠀䌀㘀㜀㘀㄀㈀䄀㐀䄀䐀㠀㔀䔀䈀䐀䔀䄀㄀䐀㤀㈀㔀㐀䐀䄀㜀㈀䌀㘀㜀㘀㄀㔀㤀　㄀䄀　䄀㄀㘀㔀㄀㘀㄀䘀䐀㘀㤀㌀䈀䐀㜀䔀㤀䄀㔀㐀䔀䐀䘀䌀䔀䐀㄀㜀㄀㌀　䐀䄀㄀㌀䔀䈀㠀　㠀㜀䐀㘀　䌀㜀䘀㤀䈀㠀㘀㘀䄀㄀㈀㠀䔀䔀㄀㜀㌀䘀㜀㠀㐀　　䐀㄀㌀㄀䘀㜀䈀㤀㜀㤀㜀䘀㔀㌀㐀㈀䈀㘀㠀㄀䄀䘀䈀䔀㠀㄀㤀䘀㌀䐀䘀　䘀㠀䄀　㔀㐀㘀䔀䌀㄀㤀　㐀㘀䌀䄀䘀䌀㄀䔀䔀㔀䘀㔀㘀㔀㘀䄀䔀㄀　䐀㜀㈀㄀㈀㠀䌀䄀㜀䘀　㈀䈀㌀㜀㜀　㈀㐀㤀㌀㠀㈀䄀　䈀㌀䔀　䔀㐀㜀䌀㔀㄀㄀䌀㈀䔀䘀㈀䘀䄀㠀䘀㔀䄀㔀㌀䌀㔀㤀㔀䔀㤀㈀㔀㄀㠀䘀㄀䘀䈀㐀䈀䔀䔀㤀䘀㘀㠀䄀㄀㐀㜀䄀㔀㠀䔀䐀䘀㈀䔀　㔀㐀䈀㄀䄀㄀㘀㔀䔀㔀䐀䈀䔀䘀䘀㈀㈀㠀㐀䘀㔀䌀䄀㐀㌀㐀㠀䘀㜀䌀䘀㐀䌀㐀䔀㔀㌀㄀䐀㠀㤀㜀㘀㔀㤀㠀㠀㄀㤀䈀㘀㌀㄀䘀䄀䌀㌀㜀㐀㜀㠀　㠀䔀䔀䘀㐀㄀㤀䐀　㔀㌀䔀㐀㐀㜀㠀　㐀㄀㘀䘀㠀㤀㈀䐀䘀㌀䐀㈀䔀㈀䘀䌀㄀䐀䌀㐀䄀㜀㈀㄀㔀䔀㤀䐀䌀　䐀㔀㤀䘀㌀䄀㜀㐀㜀㘀㔀㠀䌀䔀㄀䔀㜀㄀㌀　䈀㜀㄀㜀䐀㄀㈀䌀䄀㄀䘀䔀䘀㘀㄀㈀㔀㘀㈀㈀㌀㈀㠀䄀䘀㈀㠀㤀㔀䌀䌀　㠀䄀䐀㐀　㄀䌀䌀㌀㔀䐀㤀䐀㠀㈀㜀䘀㜀㄀㠀䔀㄀㄀㐀㠀㤀㌀㈀䔀㔀㘀㄀㄀䌀　㌀㤀䈀䌀㐀㈀㤀䄀䌀㄀㈀㔀㜀㈀䘀䄀　䌀㠀䈀㔀䈀䌀䔀㈀㐀㠀㜀㐀㠀䌀䔀䈀㌀㠀䔀　　䄀㠀㐀䌀㔀㈀㔀䐀䄀㄀㘀㜀䔀㤀䌀䐀㠀㄀㄀䐀㐀䌀䐀㠀䈀㜀㤀䘀㐀㘀㄀㔀㈀䄀㐀㐀䔀䌀㈀䘀㈀㌀䘀䈀㘀㌀㘀䔀㤀㐀䈀㈀䄀㌀䘀㘀㘀㔀䈀䌀㄀䔀㈀䄀䔀㜀䌀㈀㐀㠀㄀㤀䌀　㐀䔀䐀䌀䔀㜀㌀䐀䈀䔀㘀䐀㈀䔀䈀㠀㈀㐀䔀㌀　㤀䘀㠀䄀㜀㜀㄀䄀㐀㠀䄀　㌀䄀㜀䈀㘀䐀㔀㄀㄀㐀䄀䔀䔀㄀㔀䘀㘀㈀㠀䌀䐀㐀㠀㈀㠀㘀㄀䌀䘀㈀㌀㤀䄀㄀㜀㔀䘀　㠀㄀㘀䌀㜀㤀䔀䄀㌀㌀㐀　㤀䌀㠀㠀㠀䌀䘀䐀䄀㘀㈀䔀䌀㜀㐀䄀㠀㘀㄀㔀㠀䈀㘀䔀䈀㤀䔀㤀䘀㈀㄀㐀䌀䈀㠀䈀㐀㈀䄀䈀䔀䈀㌀䔀䌀㄀䘀䔀㄀䘀䌀㔀㔀㔀䌀䌀㜀㔀䐀　㌀䘀㘀䄀㄀㔀䌀㄀㌀㜀㠀䔀㔀　㔀㜀　㐀㘀㠀㜀䔀㤀㠀㤀䐀㠀　㔀㘀㘀㘀㈀㄀䌀㜀　㈀㘀㠀㈀　䐀㄀䔀䄀䈀㜀㘀㈀㜀㘀㄀㜀㠀䘀㔀㤀㄀䄀㈀䈀㈀㠀㔀䐀㔀㌀㔀　㘀㄀䄀㄀㔀㜀㠀㐀䌀㄀䐀㄀㐀㌀㔀䌀㤀䐀㈀㠀㈀㔀㘀㜀㌀㔀　䔀䐀　　䔀䔀䈀䈀䘀㈀　　㤀㔀䐀䐀䐀㐀㘀㤀㤀㔀㔀㘀㈀㌀䐀㄀㄀㘀䌀䌀䐀㐀㘀䈀㘀㄀㄀㜀㠀䔀䐀䔀㄀㤀䌀㈀㄀　䐀㠀㘀㘀䐀㜀䔀䈀䔀　䄀䔀㌀䈀䈀䘀㜀㈀　䔀䈀㠀䌀㌀㜀䔀㐀㜀䐀㈀㐀䄀㠀㜀　㠀䔀䌀㄀㌀㐀㠀㘀㔀㌀㌀䈀䔀㐀㠀䔀㜀䔀䔀㜀㈀䔀　䄀㜀㈀㔀㈀㔀㜀㐀㈀㜀㄀㈀㘀㜀　㠀㘀㌀㠀㌀㌀㠀㘀㠀䈀㜀㄀㐀䘀䐀䈀䘀㐀㄀䄀䘀䈀　䐀㄀䌀䔀㠀㘀䘀㐀　䄀䔀㘀䘀䔀㘀䐀㈀㠀㔀㘀㈀㜀㌀䌀㄀㈀㐀㠀㌀䌀㌀㠀䈀㐀㤀㌀㔀㄀㔀㌀㘀䌀㤀䘀㌀㐀㄀㠀㈀㔀㘀䄀㈀㔀䐀䌀㌀㈀䈀㐀㐀㄀㜀㔀㈀䘀㐀㐀　㐀㠀䌀㌀㘀㘀㈀㈀　㤀䐀㤀㈀㔀㐀㤀㄀䘀䄀㄀䄀㈀㄀㈀㈀㈀䄀㌀　䈀㘀㄀䔀㔀㔀㄀䈀䐀㐀㌀㄀䈀㜀　䘀㘀㜀䘀㄀䐀䌀㔀㐀㤀㐀䐀㌀㈀㠀㜀㌀䘀㌀　㄀䔀䐀㜀䌀㤀䌀䄀㔀㘀㠀䔀㜀㄀䘀㤀䘀㈀䔀䌀䈀㈀㜀㈀䌀㤀㌀㜀㐀㐀㌀䘀㌀䌀㐀㜀㜀　䄀䌀䈀㠀㜀　㄀㐀㤀㤀䄀㔀䌀䄀㄀㄀㜀㠀　䈀䈀㘀㤀㐀䔀　䈀㄀䘀㜀㜀䘀㤀䌀㌀䈀㌀㐀䐀㠀㔀䌀䌀㄀䐀㤀䔀㤀㘀㈀㜀㤀䐀㘀㔀䄀　㐀㐀㌀䌀㔀䈀㌀㔀䘀㠀䌀　㈀㐀䐀䐀䄀㐀䈀　　䈀　㔀㔀㤀䐀䄀䔀　㘀㠀㘀䐀㔀䈀㈀㘀㈀㄀䐀　䈀䐀㠀㘀㜀㠀　㘀䔀䐀㤀䘀　䄀㈀㔀䐀㐀㠀㜀䈀㔀㐀䔀㌀䌀㤀　㈀䘀䔀㘀㜀䔀㐀㄀㐀䐀䈀䔀㠀㄀䐀　　㌀䐀㘀䄀㘀㄀㐀㤀㘀䔀䘀䈀䄀㐀㤀㜀㔀　䘀㄀㜀䔀䔀㄀䈀　䐀䌀㐀㘀㠀　㠀㘀㜀　䄀䘀䐀䔀㘀㜀　㌀䐀㄀㄀㠀䐀䄀䌀䈀㔀䈀㜀㈀㤀䔀䐀䐀䔀䔀㈀㜀㄀　㐀㤀㜀㔀㄀㠀㠀㔀䈀䐀䌀㌀䈀㐀㐀㔀　䄀䔀㐀㜀䔀㌀㔀䄀䈀䘀䄀㈀䄀䄀　㤀㤀　䐀㔀䐀䘀䐀　㈀㐀䘀㄀㈀䐀㈀　㐀㐀㄀㔀㐀㄀㐀㈀䐀㌀䌀䌀㐀㜀㐀䘀㄀䌀䄀㔀㌀㐀㌀㄀䈀㤀㤀䐀䘀㠀䐀㘀㤀䔀䌀㠀㈀䄀㠀䄀　㌀㜀㠀䈀䌀　㤀㜀㜀㌀䐀㔀㌀㈀䘀㄀䈀㌀㐀㄀㘀㌀䈀䘀㄀㌀㘀䘀㄀䄀㈀㌀　㜀㔀㔀㄀㤀䔀㘀㐀㔀䄀㘀㘀　䌀㘀䌀䄀䔀䄀㜀㔀㤀　㔀㜀䐀㜀䘀䄀㘀㐀㈀㄀㠀䔀䄀䘀㘀㘀䌀　䄀㄀䄀䌀䐀㄀䐀㠀䌀䐀㌀䘀㤀　㠀䌀　䈀䄀㐀㄀㠀䈀㤀㜀㔀㜀䌀　䐀㄀䄀㘀䄀㐀㠀㔀㜀㜀　㄀　㄀䌀㈀　㠀䘀䔀䄀䈀㌀㈀䘀㜀䐀㄀䐀䈀㔀䔀䔀䌀㔀㌀䐀㠀䈀䔀䈀䄀䐀䐀䘀㌀䌀㔀䐀㜀㤀㐀㈀㜀㌀㐀㠀䔀㜀䐀㘀䈀㤀䄀㘀　䔀㄀䔀㠀㔀㈀　䌀䐀䌀㐀㤀㤀㔀㌀㠀㔀䈀䈀䐀㘀㌀㐀㄀䈀㈀䔀　㜀㄀㤀㈀㔀　㘀䔀㠀䌀㌀䌀㠀䈀㤀㈀㠀䔀㄀䌀䘀　䄀㜀㔀㔀䌀　䈀䘀䌀㔀㈀㠀㜀䐀　㔀䐀　䄀䘀　㌀　㜀㌀　㜀㔀䔀㐀䐀㐀　㘀䄀㈀䄀䄀㄀㘀㠀䌀㠀䄀㜀㔀㘀　㄀䌀㄀㌀䔀㜀㌀㈀㘀　㤀㄀㐀㤀㤀䄀㈀　䈀䔀䘀　㌀㘀㘀㄀㜀㐀䄀㄀䌀㄀㘀㤀䐀㠀䐀㐀㜀䘀㔀䄀㔀㐀㤀㐀㌀䘀㘀㄀䈀䄀䈀　㤀䘀䐀㤀䘀　㜀㔀㤀㔀㌀䔀㈀䔀㤀㈀䐀㄀㈀㘀䄀㈀㤀㤀㤀㜀䔀㐀䐀㜀㄀㤀㄀㤀㌀㜀䈀䐀　䄀䘀　㈀㔀　䘀㌀䐀㘀䔀㘀㐀䐀㜀䔀㔀䐀㜀䐀㜀㌀㌀䌀䐀䄀㤀䌀㘀㈀㔀䔀　䈀㈀㄀䔀䄀䄀㘀䘀㌀㠀䘀㄀㈀䌀㈀䌀䘀䔀㤀䘀㘀㘀㄀㔀㐀䐀㄀䌀㈀㜀䔀䔀㐀㠀㠀䔀　㐀䐀　㐀䈀㜀㄀㐀㐀㈀㌀䘀㜀㄀㈀㌀　㄀㈀㔀　䌀䔀䔀䄀㜀㄀䘀㤀㌀㠀　　䌀䔀䄀㔀䘀㈀䔀䐀㌀䔀　㐀䈀㠀　㐀䔀䌀䘀㘀䐀㄀㄀㌀㄀䄀䈀㠀㈀㄀㐀㜀䔀㌀㜀㤀䐀㐀䔀㐀㌀䐀㜀　㄀䔀䌀㈀㘀㈀㌀䌀㠀䈀㔀䘀㔀㐀䈀㄀㤀䔀　䈀㜀　䐀䄀㜀㘀㈀㘀㌀㤀　㠀䘀㠀䈀㠀㈀䘀䘀㐀㄀䈀䄀䈀㌀䐀㄀㜀　㈀㘀䌀㔀㜀㔀　䌀㈀㔀䘀㌀㄀㠀㘀㐀㘀䌀䌀㜀䐀㘀䘀䈀㤀㄀㌀䈀㤀㈀䔀㔀䌀㔀㤀　㌀㔀㘀　㈀䔀䄀㄀㘀㄀䘀㘀䈀䐀㈀䌀㔀䘀㠀㐀㄀䔀䐀䄀㤀㐀䈀㤀䄀㠀㄀㜀䌀㠀䈀㌀㐀䌀䐀㤀䌀㤀䔀䈀㤀㠀　㘀㘀　䘀㘀㜀㔀䌀㌀㠀㤀㠀㠀㤀㤀㌀㔀䔀㘀㠀㄀㠀䘀㐀㄀　䈀㐀㠀䈀㜀䈀㈀䐀㠀㈀䐀㔀㘀　㠀㌀㠀䌀䘀㜀䈀㠀㐀䔀㐀㌀䘀㤀㔀䌀㄀㄀㄀㐀䌀䐀㘀㜀㔀䘀䔀　䌀䈀　䔀䌀㌀㈀䐀䌀㠀䄀䐀㠀㤀㐀㐀㠀䌀䌀㄀䌀㔀㠀㘀㈀㌀䈀䌀㌀䔀㄀　䘀䌀㘀㌀㈀㈀㘀䔀䌀䘀䔀㌀䌀䌀㤀㄀䌀䔀䈀㐀㠀㜀䌀㐀　䈀䈀㈀㤀㈀㈀㘀㤀㔀㘀䘀㌀㜀　㄀䔀㠀䔀㔀㤀㄀㤀㜀㤀䔀㄀䐀㐀㄀㤀㌀㄀　䄀㐀　䈀㤀䄀㐀㔀䈀䘀䔀㄀㔀㘀䄀㄀䄀䄀䘀䔀䄀䐀䘀㐀㔀䌀䌀㘀㈀㤀　䘀㘀䌀㤀䌀䔀㈀㤀㐀㘀䔀䔀㘀㔀　　㈀䔀㠀䌀㈀䔀䔀㤀㤀䔀㤀㘀䌀䘀㌀䐀㐀㐀䔀㄀䐀䘀䈀㐀㤀㈀䐀㠀㈀㈀㠀䔀䘀㐀㐀㤀㐀䈀㠀㤀㤀䄀㘀㤀䔀䄀㜀㘀㠀䔀䐀䘀㔀㤀㈀䄀䐀㤀䘀　㐀㔀㘀䄀㤀䔀　䌀㘀㔀䄀㔀㘀䐀㄀䘀㔀䐀䐀㌀㌀㠀㘀㌀　䄀㌀䔀䄀䈀㄀㜀䔀　䌀䄀㜀䘀㌀　㔀㌀㐀㐀㐀㔀㔀㤀㄀䘀㤀䔀㤀䔀䘀㈀㔀㠀㠀㠀䐀䐀㠀　㄀㐀㔀　㜀䐀㘀㔀㔀䐀　䌀㄀䌀䌀㜀䔀㄀䈀䌀㐀　㠀䌀㈀　㈀䌀㐀㘀㤀䈀㐀㜀㄀㘀㔀㐀㔀㐀㘀䐀䔀㜀㘀㐀䘀䌀䔀㔀㠀　㠀䄀䄀㌀㘀䄀䈀㔀䐀䔀䔀㈀䘀䔀䌀䈀㠀㐀㄀䔀䈀㌀㔀㐀㘀䘀㠀㈀㜀㜀䌀㄀䔀㤀㔀㄀䘀㜀㔀䔀䐀䈀㠀䘀㈀㘀䔀㘀䈀䄀㜀㠀　䔀䐀䈀䌀䌀䄀㈀㐀㄀䌀㘀㠀㌀䄀㌀㘀㈀䄀䈀㈀㄀䈀㜀䐀㔀　㈀　䘀䔀䄀㠀㄀䈀　䘀㌀䄀䔀　䐀䘀㘀䈀　䈀䘀䄀䄀䌀䌀㈀㘀㠀䐀㐀㜀㘀　㄀㄀㈀㤀　㤀㈀䌀䘀　㤀㔀㜀䐀䐀䘀㤀䈀㔀㈀䄀㘀㔀㤀㔀㤀㐀䘀㤀㠀㈀㄀㐀㘀㌀䌀䌀䘀㐀㔀㤀㤀㜀㘀㤀㔀㤀㈀㄀　䐀䘀䘀䘀㄀㐀㌀　㜀㠀䌀䐀㔀㔀㔀㜀　䔀䌀㜀㌀䄀䐀㘀　㜀㜀㤀㄀䐀䔀䈀䌀㔀㜀㜀㠀䐀㌀䘀㐀䄀㤀㘀㌀䔀㠀㐀䐀㜀㐀䄀㘀㠀㐀㐀㠀㘀䄀䄀㜀㤀㔀㠀䘀㄀㄀　㄀䌀㈀䐀　䄀㈀㠀　㈀㐀䈀䄀㠀㜀㤀䔀㌀㐀㤀㘀㤀　䌀䌀䐀䈀䐀䌀㘀䐀䘀䘀㠀㌀㤀㜀㜀䌀㌀㜀䌀㠀㠀䌀㠀㄀㌀　㠀㘀㠀㌀䄀䄀㠀㌀　䄀㔀　䄀㠀㤀㜀䔀㐀㈀㔀㠀䐀䈀䌀㠀䈀　䈀㘀㄀㄀　㈀㈀㄀䄀㈀㜀㌀䔀㜀䄀㤀䘀㔀㐀㄀䐀　䐀㤀䌀㌀䌀䘀㜀䄀䌀㄀㠀㤀㜀㌀㈀㠀㄀㌀㔀㐀䐀㄀䄀　䄀㐀䌀㈀㤀䌀㜀㔀㠀䘀䐀㌀㤀㌀㔀㐀㈀䄀㠀㤀䈀㔀㐀㈀㈀䈀䌀㌀　䐀䐀䌀㌀䈀㐀㤀㜀䌀㔀䄀䘀䔀䐀㜀㌀䄀㔀㠀㐀㄀㘀㜀㜀䌀䘀䈀㈀㤀㠀㄀㘀䄀㔀㘀䘀㠀㄀䘀㜀䌀䄀㤀㌀㤀䄀䈀㐀㜀㄀䐀㔀䔀㠀䈀䌀㔀䄀㄀䔀㈀䌀㈀㈀䌀䄀　㘀㄀㄀䄀䘀䐀䈀䈀㄀㐀㈀㄀㌀䘀㔀㤀　㐀㈀㜀䈀䘀㔀㈀䔀㠀㌀䌀㠀㔀　㔀㔀䘀㘀㈀䌀㐀　䔀䐀㔀㌀㤀㈀㘀㐀㈀㠀䈀㘀䔀䔀㄀䐀　㘀㄀　䐀䈀䄀㐀㐀㐀䈀㄀㜀㔀䐀㌀䐀㌀㌀㘀㐀　㤀㘀㈀䐀㈀䔀㜀䘀㐀㤀㜀㌀㐀　㜀㌀䐀䔀㈀　㜀　㈀㄀䐀䄀䌀䄀䘀㈀䌀㈀㐀㜀㔀㤀䈀㜀䘀䔀㐀㐀䔀㌀㘀䄀䐀㈀䌀㔀㐀㄀㈀䐀䔀䔀䄀㔀㈀㔀䐀䔀䘀䐀㈀䈀㠀㄀㠀䈀　䄀㘀䐀䈀䈀䐀䄀　䈀㐀䄀䘀㐀㔀㘀㐀㈀䐀㔀䌀䈀䈀㜀㤀　㘀䐀　　㠀㄀㜀㔀䄀䔀　㜀㘀㄀㠀㔀䈀䌀㠀䄀䐀　㠀㌀䈀䘀　䘀䄀㜀㜀䌀㜀㈀㄀䔀　䐀㌀䄀㐀　㈀㘀㤀䐀㠀㐀㤀㘀㌀㔀䈀䌀䌀䈀㠀㌀䐀䐀　㠀䘀㐀㜀䄀䌀㠀　㜀㠀㠀㌀㐀㌀㜀㌀㤀㐀䐀䘀䌀䐀䈀㤀㔀䌀㔀㔀㄀䄀㔀䌀㌀㜀䘀㘀㤀㘀䄀䔀䐀㤀䌀㈀䌀䔀䘀㐀㌀㐀㐀㘀㔀　㤀䘀㤀䄀㐀䐀䘀㠀䔀　䐀㔀㔀㜀㐀㠀㔀䐀䔀䌀㐀㘀䌀㘀䔀　㌀䄀㠀䄀　㄀㠀㘀䄀䔀㜀㈀䄀䐀䘀　㈀䐀䔀㘀　㠀㐀㤀䐀㠀㄀䌀㠀㔀䄀㄀㔀䐀㤀㐀㘀㈀㄀㄀䌀䈀䐀㈀㐀䄀䄀㈀　䔀䄀䘀䌀䌀䐀　䔀㈀㤀㠀㤀㘀㌀㔀䄀㄀㘀㌀䔀㜀䄀㄀㠀䈀　䘀㔀㄀㜀䄀㘀㈀㐀䐀㘀㠀㘀䈀䈀㌀　䄀㠀㌀䌀䄀㄀䌀　㈀㈀㈀䈀䈀㔀㄀䈀䈀䌀䌀㌀㠀㠀䄀㐀䐀㘀㤀䘀䌀㈀㘀䄀㈀䄀㐀䈀䌀䄀㤀㜀㔀㜀䈀㔀㜀㤀㐀㄀㈀㌀䔀䘀㜀䐀㔀䈀䈀䔀㜀䄀㌀䐀㈀䐀㌀㘀䐀　䈀䘀䔀㌀䄀㐀㄀㜀㄀㠀　䈀㐀㤀㠀䈀㤀䌀㜀䄀䄀㔀㐀㌀　㐀䌀㌀䄀㈀㌀㐀㌀㔀㤀䌀㄀㈀䌀䘀㌀㈀㔀䄀䘀㠀㈀䄀㜀㔀㌀䌀㄀䐀䄀㌀㈀㄀㠀　㐀㔀㈀䌀㠀㌀䈀䌀䈀䄀㄀㠀䐀䐀䌀䌀㠀㄀㄀䔀䌀䔀㈀䔀㐀　㈀䐀㈀㘀㜀㜀㜀㄀䌀䄀䐀㠀䈀㜀㠀㠀㄀　　㤀䌀䈀䔀䄀䌀䄀䄀㘀㔀䐀㈀䐀㜀㄀䐀䐀㐀㄀䔀㌀㤀㜀䈀䄀㘀㌀䄀㠀㌀㜀䔀㔀㄀㠀㄀㜀䐀㌀㄀䐀㜀㐀㔀㄀㘀㔀㤀㔀䔀䈀㔀㤀䘀㄀䐀㜀㜀㠀㄀㐀　　　㈀　㈀　㄀㘀㘀　㄀㐀㐀　㔀㌀䄀䄀䈀䔀䔀䈀䐀　㔀㤀㠀　㔀　　㄀䐀㈀㠀㤀㤀㠀䘀㤀䔀㤀㠀　㔀㄀　䌀㐀㈀㌀㈀䘀㈀㈀㄀䘀㔀㄀㘀㄀　㠀㤀䈀㜀䄀䐀　㘀㠀㜀㈀㐀㠀䘀䌀䈀㠀䈀䌀䈀㘀㜀䘀　㌀䄀䈀　䐀　䄀㈀䘀䔀䄀㐀㐀䈀㄀䄀㔀㈀䌀䈀㘀㔀㌀㌀㠀㌀㤀㌀㠀䄀䌀㄀㠀㜀䐀䔀㤀㔀㐀㐀䐀䌀㠀䔀　㌀㔀䔀㔀㜀䘀㌀䄀㠀䄀㤀　㤀㜀䄀㜀㔀㜀䐀　㈀䌀䘀㔀䐀㈀䈀㌀㤀㌀㌀䌀㔀䘀㘀㠀㐀䘀㔀䔀䈀䔀㐀㜀㌀䔀䄀㄀㜀㤀䔀䔀㔀䈀㤀㠀㌀㔀　㐀㈀㄀㠀　䔀䔀䌀㤀㈀　㔀㔀䔀㜀䄀㄀㄀䌀㐀㈀䐀㜀㤀㔀㘀㠀䐀㌀䐀䐀䘀㐀㈀㘀　㤀䈀㤀㜀㄀㐀㄀䐀㈀䐀䔀　㐀䘀䄀䈀䄀㐀䄀䌀䔀䐀㄀䄀㘀㘀㔀㐀䄀㈀㘀䐀㠀䔀䈀㐀㠀䈀㘀㜀䈀䐀䐀䐀㤀　㜀㈀䔀㠀䌀䄀㤀㔀㐀䔀䈀䈀㄀㄀　䈀㔀㌀䔀䐀㜀䈀䄀䌀㤀㔀㠀䘀㔀㐀㤀㠀㜀䈀㠀㤀䌀㘀㤀䔀㄀㤀㔀㜀㜀　䈀䘀㘀䐀㔀㈀䌀䐀㠀　㘀㜀　䄀䈀㘀㈀　㄀䈀㌀䘀䐀㔀㘀㐀㜀㤀䔀㈀㘀　㈀㘀㘀㜀㌀䐀㌀䌀㌀㠀　䈀䐀㜀䐀䌀㄀䈀㈀㌀䈀䔀䌀㜀㔀㄀㔀㈀㌀㠀㌀　㐀䔀㈀㌀䈀䔀䈀㜀㐀㘀㈀㤀㘀㠀　㠀㐀䐀㈀㐀㘀㤀䌀㌀䐀䈀㤀㈀䘀㘀䈀㠀䐀䄀㈀㄀㐀䈀　㘀㐀㈀㘀㄀㈀㄀䐀㘀䐀㤀䔀㌀㔀䈀䌀㈀㄀㐀㜀㔀㔀㠀㐀䌀䐀㔀㄀㈀㔀㌀䌀　㐀㈀䔀䔀㘀㔀䐀　䈀㜀䘀　㜀㐀䘀䌀䌀　䔀㜀㠀　㌀㄀㐀㤀䄀㘀㔀㤀　㜀㄀䘀㘀䐀　䐀㜀㐀㔀䔀䔀䔀䐀㜀　䐀䌀㄀䘀䄀䐀䔀䔀㤀㈀䔀㔀䐀㔀㤀㜀㌀㠀㄀䘀䘀㜀㌀㈀㐀㈀䄀㠀䌀䈀　䌀䔀䄀䘀㤀㌀䌀䘀㐀䔀䌀㌀㈀㜀㤀䄀䔀䐀䌀㔀䔀䈀　㌀㤀䘀䄀䌀䌀䐀䐀㜀㐀㘀㠀㔀㘀㌀㔀䈀㌀㄀䔀㈀㘀㘀䔀㌀㌀㌀㌀㈀㌀㄀㄀㈀㘀䌀䐀㠀㘀㔀㘀㔀㄀䘀䐀　䈀䐀㌀䌀䘀䔀䔀㜀㔀䐀䔀㜀䈀㔀㈀㘀㐀㈀㤀㤀䔀㘀㄀䄀䔀㘀䔀䄀㜀㤀䄀㘀㜀㔀䈀䐀䐀䐀㤀䄀　㔀　䄀䘀䘀㔀䄀㐀䄀㄀䔀䔀㔀䘀㜀㜀䘀　䄀䈀䔀䘀䘀㤀㐀㈀㔀䈀䔀㔀䌀䄀䄀㈀䄀䈀䌀㄀㐀㐀㠀㤀䔀㐀㈀㄀䐀㠀䔀䐀㠀㘀㘀㈀㔀㠀　㜀㘀䔀䐀㜀㤀䌀䔀䈀㐀䘀䄀䈀㜀㐀㔀㈀㌀㈀㌀㈀㄀䘀㤀㠀㘀　㐀䄀㐀㔀㈀䌀䈀㜀䘀䄀㠀　㜀䈀㘀䌀㐀䐀㠀䘀䘀䔀㌀㠀㌀䐀㈀　䐀䈀㤀㜀㘀　䄀䔀䐀　䘀㤀　䌀㐀䐀㌀㤀䄀䄀㜀䘀䌀㐀䌀㔀㜀㘀䌀䐀䐀㈀䄀㠀䈀　㜀㠀㄀䄀䄀　㌀㄀㠀　䌀㜀㔀㤀㐀㔀䔀㔀䔀㌀㠀㘀㤀㤀㈀　㌀㄀㌀㄀䌀㠀㌀　㜀㌀㈀㔀㠀㐀㔀㄀䔀㐀䔀㘀䌀㄀䈀㌀㤀㐀㄀　䐀㌀䌀㈀㄀㈀䘀　㤀　㌀䐀䘀㐀䔀㘀䐀㠀㄀䐀㔀㐀㄀㠀㘀㄀䔀䈀䘀㐀㐀㤀　䄀㈀䄀䔀䈀䘀㤀㠀㤀㄀㄀㌀㠀㐀㤀䔀㜀㈀㔀䔀㤀䔀䘀㐀㌀㌀㘀䐀㐀䌀㐀㐀㔀㐀㔀䈀㌀䈀㤀㘀㌀䈀䘀䐀㔀㔀㠀䔀䈀㌀䌀䈀䔀㌀㌀㘀䐀㔀㠀䄀㘀㤀㤀䄀㤀㤀㌀㐀䔀㘀䐀㜀㜀䐀　㌀䐀㔀㤀㠀㄀䌀䄀䔀䐀㈀㌀䄀㠀　㔀㈀䌀㜀䐀䔀䈀㌀㘀㤀㌀䈀　䌀　㜀䘀㘀㌀㘀㄀䌀㈀㠀䌀㜀㠀䌀㌀㘀㌀䐀　䌀䄀䈀㜀　㐀㜀㤀䔀㔀㠀䌀䄀㈀䔀䄀㠀䐀㘀䈀㠀㠀䈀䌀䐀㈀䐀㈀䐀䘀　䐀㐀䘀㐀䌀䌀㌀㘀㈀㌀䄀㈀㔀㈀㔀㤀䈀䔀㄀䐀㠀䔀㜀䄀㄀䄀㜀䘀䌀㜀䈀䘀䘀㔀䄀䄀㤀㐀䌀㌀㌀䘀䌀䘀䘀㄀㜀㜀䐀䄀㤀　䘀㔀㠀䔀㄀㠀䈀䈀䄀㔀㈀㈀㌀㈀㤀䘀䄀䌀㤀㘀䄀㘀㈀䌀㠀㐀㜀䘀㤀㌀䘀䐀㄀㘀䔀䔀䐀　䈀㈀㌀䌀䐀㜀㄀㘀㔀㐀䘀䄀䘀㌀　㌀㈀㄀㜀㜀䔀䄀㈀㐀䐀䌀䌀䌀䐀㐀䘀㌀㤀䘀㜀䐀㤀㐀䔀㐀䄀㜀䌀㐀䌀㔀㜀䄀䌀䈀䔀㄀㌀䐀㌀䐀㄀㠀䔀㘀䄀䐀㘀㠀㄀㔀㌀䄀㌀　㈀㌀㜀䔀㄀䄀䈀䔀㜀㜀㤀㌀䐀䌀㤀䐀㠀㤀䌀㌀㜀㔀㐀㘀㔀䔀㤀㠀㄀䄀䈀䘀䘀㜀䌀䐀㈀㌀㔀㈀㌀䐀䌀㐀㌀䔀㐀　㈀㠀䌀䈀㔀㘀䔀䐀㌀㐀㄀㘀䘀䄀䄀㘀䘀䘀㐀䄀䌀㌀㄀㠀䔀䈀㄀䈀㤀㌀㌀䌀䄀䈀䌀㠀㜀㐀䈀㠀䔀㔀䐀㈀䄀䄀䐀㄀㤀䌀㔀䈀㌀䈀㔀䐀䌀　㠀䐀㔀䌀㐀䄀㈀㐀䈀䘀䔀㘀㘀㘀䄀㈀㈀䄀㠀㐀䈀㄀䄀㘀㜀㌀㄀㠀䐀䐀䔀䔀䔀䘀㔀　㠀䐀㄀䄀䌀㐀䐀㜀㤀㘀㔀䐀䘀㤀㤀㤀㐀䔀䘀㜀　㌀㐀䄀䘀㐀䐀㠀㄀㠀㠀䌀㤀㘀㄀㈀㌀㔀㜀䔀䐀㈀䌀㜀䘀䄀㔀㌀㐀䐀䄀䌀㠀䘀㘀㌀㌀㤀䌀㄀㌀䐀㔀㠀䔀㌀㌀㄀䈀䘀　䈀㠀㜀㄀䄀㌀䄀㌀　㐀㄀䌀䐀䔀㜀䘀　㜀　㘀㘀䐀㔀䌀䐀䄀䔀㤀㄀䘀䈀㈀㘀㌀㜀㈀䈀䐀䘀䄀㤀㜀㘀㜀㤀㌀㄀㐀㜀㘀㠀㤀㔀㘀㈀㠀䈀䔀㠀䈀㐀㐀䌀㌀㤀㜀㘀䐀䌀㐀㌀㄀㠀　䈀䘀㠀䈀㠀㠀㠀　㘀㜀　㔀䐀㌀㔀㌀㈀䘀䔀㘀㌀㌀㄀㄀䌀㜀䈀　䘀䔀䈀㐀㜀㠀㈀㌀㜀　䔀㔀㜀䘀䌀䌀䐀䐀　䈀㘀䔀㔀䌀㌀䐀䄀䈀㌀㜀㜀㠀䈀㘀㠀䌀䈀䘀䌀㜀䐀㌀㜀䄀䌀㘀䔀㌀㌀㠀㐀㜀䌀䌀㔀䔀㄀䔀㤀䐀㠀䌀䄀㄀　㜀䌀㤀䈀㌀䌀䔀䘀　䌀㤀䐀䈀㈀㐀㐀䘀䄀㄀㈀㐀䐀㄀㐀㜀㌀䘀　　䈀䐀㠀䄀㔀㘀㔀䔀㜀䄀㈀㄀㈀䄀㘀䌀㄀㈀㈀㠀㘀㤀䘀㐀䐀　㜀㌀㄀㔀㜀㜀㤀䈀䐀㤀㈀䐀䐀㌀㜀㘀䔀䌀䔀䈀䄀䐀䔀㤀㤀㌀㄀㈀㌀䄀㔀㄀䔀㔀㠀䈀　䄀㈀㤀䄀䌀㠀㄀㠀䌀㔀㌀㔀䄀䌀䐀㜀䐀　䄀㔀㔀㐀㤀㈀䔀㐀䄀　㐀㤀䘀䈀㤀䔀㈀㐀䄀㈀䐀䌀㔀䌀㔀䔀䐀㐀䐀䄀䐀㌀䐀䘀䔀㘀㤀　䈀㌀㤀䐀㘀㔀䔀䄀㄀㤀䘀䄀　㔀㌀㤀㈀㌀㘀㔀㐀　㔀㔀㜀㔀㠀㄀㜀䌀䐀㐀䌀䐀㈀㜀㘀㔀　䐀䄀䄀㘀䄀䌀㤀㜀䄀㠀㘀䐀㈀㌀　　㤀㜀㘀䐀㜀㐀㔀䐀　䌀䘀䄀䈀㈀䄀㈀䐀㔀　㠀䄀㜀㤀㘀䘀㘀䄀㄀㠀　㔀䐀㈀㠀䄀㤀㠀䄀㈀䄀㄀䘀㜀㜀䌀㘀　㌀㠀䐀　㐀䌀㘀㠀㌀　㔀㠀䔀䄀㜀　　㘀　㔀㜀㤀㈀　㈀䐀㠀䔀㔀㔀㤀㐀㤀　㠀䈀　　䈀㜀㌀㤀㘀㄀䔀㜀䄀䐀䐀㤀䔀䄀䌀㤀㈀㤀㄀㜀䈀䈀䔀㤀㘀䘀䐀䔀䈀㠀䐀䘀㄀㌀䘀䐀㄀㠀㌀　㤀䐀䘀㐀㠀㄀　䘀㌀㜀㜀㤀㈀䘀㤀䔀䌀䌀㠀㄀䔀㤀㌀䘀㜀　㈀　㘀㌀㜀㐀㘀䌀㐀㠀䌀㤀䘀　䄀㌀㔀㈀㔀㌀㘀䌀㄀㤀䌀㤀䈀㘀㜀㔀㄀㘀䘀　　䈀䔀䌀䄀䈀　䌀　㔀㜀㔀㐀㔀㘀㠀䔀䘀㄀䈀㔀䔀䘀㔀㘀㜀　㤀䈀䐀㄀䘀㤀㤀㐀䘀㄀㌀㄀䌀㈀㄀㜀䔀㠀㄀㈀䌀䈀䔀㄀㌀㤀䐀㘀㐀　㤀㄀㜀㤀㈀㤀㌀㌀㌀䘀䘀㈀㜀䄀䄀㠀㠀㤀㤀䄀䈀㜀㘀㌀　䐀㄀㐀䐀㘀㠀䐀㄀㌀㘀䄀㄀䔀㈀　㄀㈀㄀㄀䐀䘀㄀䈀䘀㐀䄀㐀㄀㐀　㜀䘀䌀㌀䐀㘀䐀䐀䈀䌀䐀㘀䐀㠀㜀㘀䄀䐀䌀㈀㐀㈀㌀䄀䄀㌀䄀　䈀㔀㄀㔀㄀㌀䔀㄀㠀㤀㔀㌀㐀㤀䄀䈀䌀䄀䄀㤀䄀㌀㜀䈀䘀䈀䔀䄀㘀㈀䈀䈀䐀䌀㈀䐀䐀㈀㈀㜀㌀䌀䐀㌀㄀㤀䐀㤀㐀㜀㈀㈀䌀　䘀䈀㘀㈀㈀䈀㠀䔀㘀㈀㄀㄀䔀　㈀䐀䌀㈀䐀䄀䘀䐀　㌀㌀　㌀䈀䘀㈀㘀㌀㜀䔀䔀㄀䔀䌀䈀䔀㈀䄀㜀㈀㔀䐀䌀䄀㘀㔀㘀㔀㈀㌀㠀㈀㜀㠀䐀㄀䔀㘀㌀㌀㤀㠀䄀㈀㠀㠀㔀㠀㐀䄀　䔀㌀㌀䌀　㌀䐀㌀䌀㜀㜀㐀䄀䌀　㠀㘀䈀䘀䐀㄀㔀㔀㔀䐀㌀䈀㈀㌀䔀䐀㌀㈀㐀䄀　㐀䐀㤀㐀㘀䈀㐀㘀㤀㈀䐀㔀䘀㌀㘀䐀䄀䄀䘀㠀䘀㄀䔀䄀㈀　䄀䘀㐀　䄀䄀㄀　㔀　㔀䐀䌀㜀䔀　㔀㘀㌀㔀㜀䌀㜀㘀㠀　㜀㔀㔀䐀㄀㤀㌀䌀㘀䈀䈀䌀㄀㜀㤀㠀㘀㄀㄀䄀㐀㄀䐀㐀䐀㐀㠀䈀䘀㘀　䈀㤀㄀㌀䐀䔀㔀㤀㄀　䔀　䘀㜀㌀　䄀䄀䌀㠀㘀㌀㈀㜀㔀䘀䌀䄀䘀䔀㐀㈀㌀㄀䔀䌀䈀　㜀䄀䈀䌀䄀㤀㔀　䈀䈀䄀䘀㐀㄀㤀㈀䌀䈀㐀㤀㘀䈀㔀䈀䈀㐀㤀㔀㄀䘀䄀㤀䈀䌀䄀㤀㠀䔀䌀䄀㄀㤀㔀㈀㠀㔀㘀䈀㔀㜀㘀䄀㔀䌀㐀㄀㘀䄀㘀㌀㌀㠀㘀㐀㈀㠀䘀䐀䐀㠀㤀䐀㈀䐀㈀㌀㔀㠀　㄀㔀㘀㄀㈀㠀㔀　㔀䄀㄀䘀㜀　　　䄀䌀䐀㤀㤀㘀㄀㤀䄀　㌀㠀㄀㘀䌀䐀㘀㤀䘀㠀䔀　㄀㜀㌀㠀　㤀㘀㤀䄀䐀䐀㌀㤀㄀䐀㜀㘀㌀䌀㘀䘀㜀㠀㠀㔀㤀䄀㤀䐀㘀㜀䈀㤀㘀䐀㔀㤀䐀䘀䐀㐀㌀　　䈀䄀䄀㔀䘀　㠀㌀㘀㘀䄀䈀㌀㔀䔀㈀䘀㄀㤀㌀㄀䔀㘀㌀㈀㌀䌀㈀㔀䄀㌀㌀㌀㌀㘀䐀㈀㜀㠀㘀䘀㘀　㔀䔀㤀䄀䔀䔀㘀㄀㄀䄀㈀㠀㜀䄀䈀㜀䐀㌀䘀䌀㘀䈀㈀䌀㌀䌀䔀㜀䌀㠀䐀㤀㈀䌀䌀㌀㔀䘀㌀㔀㔀㐀䌀㘀䔀㘀䈀㈀㐀㘀㌀㔀㄀㌀㘀㔀䘀䈀䐀㈀䌀㤀䔀　䔀䈀䄀㄀㐀㘀䄀㘀䘀㤀㘀㄀㄀㔀䔀䄀䈀䔀㐀㈀䔀䔀㤀㔀㄀㤀䘀䐀㤀　㜀㌀䘀䔀䘀㠀㔀䄀䄀㐀㜀䐀䘀㜀㘀　䌀䔀㘀䐀㔀䔀㜀㠀㐀䔀䔀㌀㤀䌀㌀　䈀㌀䈀㈀䔀㌀䈀㤀䘀　䔀㘀㈀䄀䌀㔀㔀䐀㄀䐀䌀䈀㔀䌀㔀　㜀䘀㈀㤀㈀䐀㈀㄀㠀㈀㜀㔀㜀㜀㤀䐀㠀䘀䐀　㘀㈀䘀䄀㤀　䄀䔀䌀㈀㔀㐀㔀　㤀㤀䐀㜀䈀䈀䐀㄀㠀㤀䈀䈀㔀䔀㐀　㌀㘀㌀䄀㜀㈀㌀㔀㜀㌀㠀㠀㘀䈀㔀䔀㌀䘀㌀㌀　㌀㤀㘀䘀㔀㐀䄀䔀㠀㠀㈀䐀㘀䄀㜀㔀䐀㤀㈀㠀㈀㜀㈀㜀㐀　㘀㌀㜀㘀䈀䌀㠀㤀㈀　䈀䈀䔀㘀㔀䔀䈀䌀㄀㤀㠀㔀㜀㜀䐀㤀　䐀㄀㜀㔀㌀㐀䔀㄀　㘀　㈀䔀　䐀䌀䔀䈀㜀㜀㐀䄀䘀㈀㈀䌀㐀㄀㠀㤀䌀　㈀㈀䄀㠀㐀䐀䌀䔀㐀㐀䔀䔀㌀㘀㤀㜀䔀㌀䈀䈀㠀㄀㄀䐀㈀㤀䘀䈀䐀㌀㜀㄀㄀㠀䌀䈀㠀㠀㘀䌀䘀䐀䄀㔀䔀㌀㤀㄀䄀䘀㐀䄀㘀㌀㠀㤀䘀㌀㈀㠀　㠀䈀㔀䘀㠀䌀　㠀䘀䘀　㤀㄀㠀䘀㜀㘀䔀㠀㐀㜀㄀　㌀　䈀㐀㠀䐀䄀䔀䔀䄀䌀㜀䄀㠀　㘀䈀㌀㔀㐀　㐀䘀䔀㄀䘀䐀㠀㄀㜀㐀䄀㌀㄀䌀㌀䘀䔀䔀㤀　䄀䈀䈀㔀䈀㜀㔀䌀㈀䘀㘀　㠀㄀㔀㠀䌀㐀㈀㌀䐀㌀䌀㠀䈀㜀㈀㠀㌀㐀䄀䐀䌀㘀㘀䄀　䄀䐀䘀䄀䈀䔀㜀㠀䈀䔀䄀㔀㔀䌀㐀㘀㄀䐀㔀㈀㈀　㤀䘀　㐀　䔀　㠀㤀　㜀㄀䐀䈀䐀䔀䄀䘀䈀㘀䌀㔀䄀㄀㘀㘀㔀㘀㔀㌀䌀䐀㌀㐀㌀䘀䄀㘀㜀㄀㌀㌀㔀䄀㄀㈀㌀㔀㈀㌀㘀㔀㌀䈀䐀㐀䔀　䌀㜀䈀㌀㜀㄀㘀㐀㔀䄀䐀㌀䈀䄀㘀㤀㌀　䈀㌀㄀　㔀䌀　㜀㘀㐀䄀㄀䐀㐀㌀䄀㐀䌀䐀䄀䐀㠀㌀䘀䐀䄀䘀䘀㜀䌀䌀㔀䄀㈀㤀㌀䈀㌀㄀㌀䌀䘀䘀㌀䔀䌀㠀㘀　㔀㄀㜀㤀䘀䄀㘀㔀㐀䔀㌀㜀㠀䔀㜀䘀䐀䄀㘀㜀㌀㘀䐀㌀㄀㈀䐀㄀䄀䌀䐀䐀㜀㠀㠀䈀㠀㈀㤀㔀㌀㈀　　㤀㌀㘀㌀䌀㌀㌀䘀䈀　㔀㜀㤀㌀㈀䐀㄀䔀㜀㜀㌀䐀㠀䐀㔀䈀　䘀䔀㘀䌀㔀䔀䘀䌀㘀㔀䈀䔀㤀䄀㤀㈀䌀　㐀　䐀㌀㄀㘀䌀㈀䄀䄀㘀㔀㄀䔀㈀䐀䈀䈀㘀䌀䈀㐀㈀䘀䐀　䘀㌀　㈀䌀䘀㘀㠀䄀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㤀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㔀　㘀㄀㘀㜀㘀㔀㈀䘀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㈀　㌀㈀㈀　㌀　㈀　㔀㈀㈀䘀㔀㈀㘀㔀㜀㌀㘀䘀㜀㔀㜀㈀㘀㌀㘀㔀㜀㌀㌀䌀㌀䌀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㌀䌀㌀䌀㈀䘀㐀㘀㌀㄀㈀　㌀㔀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㌀㈀　㌀㄀㌀㄀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㐀㈀　㌀㄀㌀㌀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㌀㔀㈀　㌀㈀㌀㄀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㐀㔀㜀㠀㜀㐀㐀㜀㔀㌀㜀㐀㘀㄀㜀㐀㘀㔀㌀䌀㌀䌀㈀䘀㐀㜀㔀㌀㌀㜀㈀　㌀㜀㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㔀㌀㌀㠀㈀　㌀㠀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㔀　㜀㈀㘀䘀㘀㌀㔀㌀㘀㔀㜀㐀㔀䈀㈀䘀㔀　㐀㐀㐀㘀㈀䘀㔀㐀㘀㔀㜀㠀㜀㐀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㈀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㌀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㤀㔀䐀㈀　㌀䔀㌀䔀㈀䘀㐀䐀㘀㔀㘀㐀㘀㤀㘀㄀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㤀㌀㔀㈀䔀㌀㌀㌀㈀㈀　㌀㠀㌀㐀㌀㄀㈀䔀㌀㤀㌀㈀㔀䐀㈀　㈀䘀㐀㌀㘀䘀㘀䔀㜀㐀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀㈀㌀　㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㈀䘀㔀㌀㈀䘀㔀㐀㜀㈀㘀㄀㘀䔀㜀㌀㜀　㘀㄀㜀㈀㘀㔀㘀䔀㘀㌀㜀㤀㈀䘀㐀㌀㔀㌀㈀䘀㐀㐀㘀㔀㜀㘀㘀㤀㘀㌀㘀㔀㔀㈀㐀㜀㐀㈀㌀䔀㌀䔀㈀䘀㔀㐀㘀㄀㘀㈀㜀㌀㈀䘀㔀㌀㈀䘀㔀㌀㜀㐀㜀㈀㜀㔀㘀㌀㜀㐀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀㌀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㌀　㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㔀㌀　㌀㈀㌀㘀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䌀㔀㔀䐀㔀㤀㘀䘀䐀䈀㐀㠀㄀㈀㜀䔀㌀㜀䔀　䘀䘀䌀　㐀㜀㘀㤀㄀㄀䐀㌀㘀䌀䐀䔀　㐀　㘀　㌀䔀㐀㤀䌀䌀䌀㈀㈀䐀㤀䐀㤀㄀㤀㜀䈀䈀㄀㔀㠀㘀㐀䘀㘀㠀㄀䄀㈀㘀㠀㔀㤀㄀䈀㠀䈀䐀㐀㠀㠀㤀㐀㄀䐀䔀䘀䄀䘀䐀䘀䄀䔀㘀䄀䘀㘀䌀㄀䄀㌀㘀㐀㘀㜀䌀㈀䌀䔀　䔀㄀　㠀䘀　䔀㤀㈀㔀䐀䐀䐀㔀䐀㔀䐀䘀㔀䐀㔀䄀㤀䌀䈀㤀㜀㠀㜀㜀㘀㜀䈀㤀㌀㄀㜀䄀䐀䘀㌀䌀㌀　䘀㤀㜀㈀䘀䐀䈀㌀㘀㈀䘀㘀䔀䌀䈀䈀㔀䘀㌀䔀㤀䘀㈀䈀䄀䐀䔀䘀䘀䘀䈀䘀㈀䘀䄀㜀㄀㔀䘀㔀䔀䘀䔀㌀䐀䐀䘀㘀䌀䄀䈀䈀䌀䐀䐀䐀㘀䐀㔀䔀㔀䐀㔀㜀㄀䐀㔀䌀㈀㐀㜀䔀䘀䌀䈀㜀䌀㔀䐀㄀䔀㜀䔀䘀䌀䐀㄀㜀㤀䘀㔀䔀㘀䈀㔀䘀㌀䌀㜀䘀㤀㤀㤀䔀㜀㜀䄀䘀　㔀䘀㤀䄀㈀㘀䌀䌀䘀㄀㤀䌀㈀㠀㠀䈀䐀䌀䌀　㜀㜀䐀㈀㤀　䈀㤀㤀㤀䔀䘀㄀䌀䌀䄀䘀㌀䈀㌀㜀䘀䘀䔀䌀㔀䄀㤀䌀䔀䌀䘀㔀䔀㔀䐀㤀䘀㤀䘀㔀䐀䈀䔀㘀㌀　䔀㘀㌀䄀䔀㄀㜀㌀䄀䐀㜀㌀㜀䔀㜀㘀㜀㜀　䈀㔀䔀㜀㌀　㈀㜀䘀㄀㔀䐀䌀䘀　䘀㤀䐀㈀㐀㠀䈀㔀䐀䐀䘀䈀㤀䐀䔀䘀㄀䌀䈀㜀䔀䈀䄀㐀䄀㤀䌀㐀䐀䌀㌀㤀䘀䔀䌀㘀䌀䘀　㔀䐀䐀䄀䈀䐀䘀䈀䔀㤀䘀䌀䔀䌀䐀㌀䌀㈀㔀㤀䘀䔀䐀䈀䈀㤀䘀䔀䔀䈀䘀㤀䐀㤀㔀䈀䘀䔀䌀　㔀䘀䌀䘀䌀䘀㤀䔀㐀䐀䌀　䄀㔀㤀䄀䔀䈀䄀䈀㠀䘀㠀㈀㘀䔀㜀㠀㜀䄀䔀㈀䈀㤀㔀㄀　䄀㠀㌀䘀䈀㘀䔀㤀㠀㌀䄀㘀㄀㄀㐀䈀䄀㜀䔀䔀㈀㜀㠀䘀　㄀䄀䔀䔀䈀䌀䘀㤀䌀䈀䘀㤀㤀㤀䘀㌀㤀㘀㔀䘀䘀䔀㈀䈀㠀䔀㠀㔀㈀䘀㈀䘀㠀㤀㌀㔀㜀䈀㔀㔀䈀㜀㘀䐀䈀䐀䄀㌀㤀㜀䔀䐀㔀䐀㔀䐀䈀㜀㜀㌀㈀䔀㔀䈀䌀㐀㌀㈀㐀䔀䈀䄀㄀㌀䘀㠀㘀䔀㤀䄀䔀㈀䈀㈀䔀㄀㜀䌀䈀䄀㐀㔀　䄀䘀䘀䔀㐀㈀㈀㤀䐀㄀㠀䌀䔀㠀䘀䐀䌀㠀㐀㄀㠀䌀䐀䌀䄀㤀㘀㠀㐀䄀㄀䌀䈀㘀㈀䈀䔀㈀㌀䈀㄀㄀䈀㐀㔀䈀　㈀㌀㐀㤀㤀㘀䐀㄀㤀䈀䔀㈀㔀䌀㔀䔀䔀䐀䘀㌀　䄀㜀㘀䔀㐀䔀㌀䔀䈀㤀䘀䐀䘀㌀㠀䐀䔀䔀㔀㠀㜀䈀䌀䐀䄀㌀㠀㠀䈀䈀㈀䈀䄀㜀㠀䘀㤀㠀䘀䔀㔀㤀䘀㔀䈀䘀㌀䌀　㘀㄀䈀䔀㤀䈀䌀㔀㤀㌀䄀䌀㄀䄀㐀㜀䘀㠀㐀䐀㘀䘀㄀㤀㤀䌀　䈀㜀㠀㜀䄀䌀㠀㄀䘀㜀㠀㔀䐀㜀䌀㔀䄀㔀䌀䈀㔀䘀㔀㘀㄀䌀䈀㐀㤀㜀㠀䈀㜀䈀䌀㘀　㘀䌀䈀㄀䈀䐀㈀䈀㤀䈀㘀䘀䐀䐀㤀㄀㄀㄀㌀㄀㈀䌀䘀㈀䐀䌀㠀㐀㈀　㘀㘀䈀㐀㈀㜀㔀㌀䄀䈀䌀㐀㘀㘀㔀㠀䄀㔀㔀㌀　㜀㌀䄀㠀䌀䐀䌀㈀㠀㄀䌀㄀㄀㜀㘀㜀䐀䈀䈀　䌀㄀㜀䄀㔀䈀㌀㌀䘀㈀䌀㈀䘀䌀㈀䌀㔀㜀㘀㄀㤀㈀䐀䄀䄀㘀㈀䈀䈀㠀䌀㄀㜀䘀䈀㌀䈀䘀䔀䄀㜀㜀㐀䔀䄀㄀䈀䘀䔀㠀㤀　㌀㔀䘀㤀㔀䐀㔀㌀㈀㔀㠀㌀㐀㐀㜀䈀䔀㠀䄀䘀䌀䘀䄀䌀䐀㤀㈀　㔀䔀㈀䔀㌀㄀㘀䘀䔀䐀䌀䔀㘀㐀䈀䐀㘀䈀䐀䌀㐀　䘀䐀㜀䘀䄀㜀䐀䔀䔀㈀䌀䐀㌀　㔀㜀䘀㜀㘀䈀　㈀㠀㜀㜀䘀㤀㤀㘀䐀䘀㔀䄀㌀㔀䔀䄀䐀䔀䄀㈀䌀㘀㘀㜀䌀㈀䄀　䘀䌀㐀㌀㈀㘀㘀䔀䌀　㜀㄀㔀䄀㌀䔀㌀㠀㔀䔀䘀㈀䌀　䈀䘀㠀㌀䔀䘀䌀㔀㌀　䘀　㈀䌀䘀㄀䄀䄀㔀䌀㜀㘀䌀䘀䌀㠀䘀㄀㜀㄀㐀䐀㠀䐀㐀㐀䔀㜀㈀䐀㌀䘀䘀䄀䌀䈀㘀㐀㜀㄀䌀㌀㔀䘀䌀㌀㔀䐀㜀㜀䘀䌀㔀䘀䐀㤀㌀㠀䐀䈀䌀㘀䔀㄀㜀㜀㈀㔀㐀　䄀㘀䘀㄀㘀㠀㌀䔀䈀㔀䘀㐀㐀䘀㄀䘀㄀㔀䈀㄀䐀䄀䔀㄀㠀㤀䐀㔀　䔀㤀㠀㤀䈀㠀䔀䐀㤀　　䄀㤀䌀㜀䔀㔀䌀㠀㜀㄀䔀䔀㜀㤀　㄀䔀㐀䈀㜀㜀㈀䔀䐀㜀㄀㐀㄀䘀㈀㌀䈀㐀㤀㈀㈀㘀䔀㐀㜀㔀䈀㘀䔀䘀　㠀㘀䔀䐀㤀㈀㜀㔀䔀䈀䘀　㌀㠀䈀䈀㌀㐀㘀㄀㐀㤀䔀䌀㜀䄀㌀㄀㐀㔀䈀㐀㈀䈀䔀㤀䌀㄀㌀䘀㔀㜀㐀　䌀㜀㄀䔀㌀㘀䄀　　　䘀䄀㘀䔀㈀㐀䄀㄀　㔀䐀㈀　䐀㐀䈀䘀䔀䘀㠀㐀㈀㔀䐀㈀䌀㜀㜀㠀䈀䄀㤀䘀㜀䘀㄀㔀㌀䐀㌀㘀䘀䘀　䌀㈀㄀䐀㔀䌀㜀㐀䌀㐀䈀䐀㔀㔀㌀䈀䈀㘀㄀㈀䈀䈀㌀䔀䘀㜀㠀䔀　㔀㜀㄀䔀㘀㠀㘀　㄀㌀㔀䘀㤀㤀㜀㤀䌀㘀㜀㔀䘀㜀㌀䐀䄀㜀䔀　㘀　䄀䐀䔀䌀䌀㌀䘀㌀㠀䈀䘀㈀㌀䌀䄀䄀㠀䌀㄀㈀䘀㈀䌀㠀䌀㤀㜀䈀㤀　㄀䄀㌀䌀㘀㈀䈀䔀䄀㄀䐀㌀䘀䘀㠀䄀㄀䔀　䈀㔀㔀䌀㤀䌀䌀㐀䈀㤀㜀㤀㈀䐀　䌀㘀㌀㌀㜀㐀㠀㘀㤀㔀䔀㤀䈀㜀䘀䈀䌀㠀䌀㄀䌀㠀䘀㈀䈀㌀㈀㈀䘀䘀㈀㌀㈀㔀㐀㄀㄀䌀䔀䈀㜀㜀㄀䐀㘀䔀㐀䐀　㄀㄀䐀䘀㔀䌀㘀䄀䄀㘀䈀䘀　䌀䌀䔀　㜀㄀䔀　䈀㈀㤀䔀䘀㤀䄀㜀㈀㈀㠀䔀䈀䔀㘀䄀㘀㐀䐀䌀䄀㈀㤀㤀㘀䈀䄀㘀䌀　䌀㈀㄀䐀㘀㐀㈀㔀㐀　䄀　㄀㌀䔀䘀㜀䐀　㄀䌀㔀㤀䌀㘀䘀㐀䐀　　㔀䔀㜀䈀䈀䐀㤀䔀㔀㄀䈀䔀㌀㐀　㌀㈀䄀㘀㐀㘀㤀䌀㜀䘀㠀㘀㠀䌀㈀㔀䌀㠀㜀㌀䐀㌀䔀㌀　㤀㜀㔀　㠀㈀䈀䈀䌀䐀䔀㐀䄀㤀㄀㌀㤀㌀䘀　㤀㤀䌀䔀䐀㄀㌀㤀㈀　㐀　䈀㔀㌀㠀䔀㌀㠀㈀㈀䄀㈀㠀㘀㔀䈀㈀㄀㠀㜀㜀㌀䔀㤀䌀㈀䘀䘀䔀䘀㐀㤀䔀㔀㜀䘀㔀㠀㘀㘀㘀㈀㈀㤀㠀䔀㜀䈀䌀㤀㘀䌀䔀㔀㄀䄀䄀䔀㜀㌀㠀㔀䘀䄀㠀㠀㈀䐀㔀　䔀㤀　㌀㐀㠀　䈀㈀㠀㌀㈀㐀㄀䐀㘀㌀䈀㔀㈀㐀㌀㤀㔀㜀㜀㠀㠀㈀㠀䈀㘀㌀㔀㈀㜀䄀䔀㠀㈀䌀䐀䈀䄀㐀㌀㈀㠀㄀㐀㤀䈀㘀㜀㘀㌀　㔀䔀䄀䈀䄀㔀㄀㘀　　㐀䈀㄀䌀䈀　㘀䘀㘀䈀㐀䐀㈀㈀䄀䄀䘀㐀　㌀㤀㠀䄀㈀䘀㌀㜀㐀㜀䘀㠀㌀㐀㌀䘀䔀㐀㔀㔀㠀䈀㈀㌀㜀㐀㄀㜀䐀㤀㌀䄀䐀䄀㔀䔀䌀㠀䌀䘀㤀㤀㈀㔀　㠀䘀㈀㐀㈀㈀㤀䔀㔀㘀㌀㄀䘀䘀䈀䔀㄀䘀䐀䌀㠀䐀㈀䐀䐀䘀䐀䄀䌀䌀㌀　㠀䈀　㜀㐀　㌀䘀　䈀㘀䌀㈀䄀㔀㠀㈀䔀㔀㌀䌀㜀　䐀㐀䘀㘀䄀㠀㐀　䄀㄀㜀䌀㘀　㔀㤀　䐀㤀䔀　䐀㤀㐀㐀䔀㌀䔀㈀䌀䐀㘀㌀㠀　㐀㐀㄀㄀䘀㘀　䈀䔀㘀㌀䈀㔀㈀䔀㤀㜀㈀㄀㌀䔀㔀䄀㘀㄀　䘀䔀㌀䘀㈀㜀㠀㜀㄀㤀㐀㠀　䌀㔀㐀　䄀㌀㜀䄀㜀㔀㘀䄀䈀㔀　㘀䘀㐀䈀　㤀㘀㜀㘀㈀䔀䌀䔀㄀㠀䌀　䈀㄀㄀㌀㐀㈀㔀㤀㌀㌀㤀䔀　㄀䌀䔀㘀㘀㌀䘀䐀㈀㌀䔀㌀㜀䘀㘀㈀㠀㘀㈀㤀䔀㘀㄀䐀　䘀㠀㜀㘀　䐀㤀䄀㤀㠀䔀㌀㌀㘀㜀䘀䌀䌀䐀䘀㤀䐀㐀㄀㤀㌀䔀䘀䘀㜀㠀㜀㄀䄀㤀䌀　㄀䐀㈀䈀䄀㔀　㜀䈀㔀㜀㌀䈀㠀䐀䐀㐀䄀䐀㘀　㄀㐀　㈀㠀㌀㘀䔀㤀䌀㄀䈀㌀　㄀　　䌀㤀䈀㈀㄀䄀䘀䐀㘀䌀䄀㐀䔀䌀㤀㤀䈀䄀㘀㤀㘀㜀　㄀㜀㐀䌀　䌀䘀㤀䈀㐀㄀䐀䔀㜀䄀䌀䈀㈀䌀䐀䐀㜀㜀㤀㤀䈀㈀䈀䈀㄀䌀㘀㘀䐀㠀䌀䈀㤀䈀㜀㈀㄀㠀㠀　㌀㌀㜀䌀㤀䄀㠀䔀㤀䐀䔀㤀㜀䘀㌀　䘀㤀㠀㐀㐀　　㠀㠀㠀㤀　㄀䔀㜀䔀㜀䈀㌀㈀　㐀㤀䌀㄀䄀㤀㐀　㠀䌀㔀㜀䌀㈀㌀䔀䐀䌀䔀㌀㘀㤀䈀䌀䔀㜀㘀䈀䐀䘀䔀䐀㐀㤀㜀䐀　䘀㄀䘀㤀㜀　㜀㘀㜀㄀㤀㘀䄀䐀㤀㠀㔀㐀㘀㐀㌀䔀㤀䄀㈀㔀䐀㈀㜀㘀㔀㠀㘀㘀　　㜀䈀㄀㤀㜀䈀㄀䈀㠀䄀㈀䔀㘀㈀㘀䌀㔀䈀㜀㤀䄀㜀䔀䄀㜀䘀㠀㤀㈀䄀㌀䈀䔀㜀㠀㜀䌀㘀　㠀㐀㔀㈀㈀㤀䔀　䌀䌀㔀㘀䄀䐀㈀㐀㜀㄀　䐀㘀䘀䔀䘀㔀㄀䐀㔀䐀㐀䄀　　㔀䌀㔀　䌀　㘀㘀㈀㘀䘀䄀䈀㔀㤀㄀㠀䔀㐀㄀㐀㜀　㘀㠀㜀䐀　㐀䘀㐀䔀　䐀㐀䄀䈀䘀䘀㈀䌀㈀䘀㌀㠀䈀䘀㘀䄀㄀㄀　䔀㤀㌀㘀䌀㔀䄀㈀㔀䈀㔀㠀㐀㤀䌀䐀䘀㈀䌀㐀㜀䌀䈀䘀㈀䈀䄀㘀㌀䘀㔀㄀䄀䌀㔀䘀㜀䐀㜀㌀䐀䌀㤀䄀㤀㠀㄀䐀䐀㔀㄀㈀　䔀㈀㤀䘀㔀㈀㜀䐀䐀䘀㔀㠀䌀　䐀　㜀䔀䔀㐀㌀㈀㐀㘀㈀䐀㈀䄀　䔀䘀䐀㐀㔀　䈀㘀䐀㜀䌀㈀䘀㄀㘀㜀㄀㜀䔀㐀䄀䔀㈀㄀　㜀　㌀䌀㐀㄀㠀㤀㠀㔀㤀㤀䌀㜀㠀㤀㤀䈀䄀㔀䐀㐀㜀㠀㈀㠀䄀㜀䔀䔀䌀䈀㐀䔀䐀㤀㘀䄀䘀㘀㤀㠀䌀㄀䄀䐀㜀㄀㠀䄀䈀㜀䔀㄀㠀䔀㌀㄀㜀　㘀䄀㠀㐀䘀㄀㠀䘀㘀䄀㐀㤀　䄀㔀㄀䔀㔀䈀㘀㜀㤀䈀㐀䄀㄀㤀㤀㜀䌀　　䈀㜀　㐀㌀㔀㠀㠀㘀䈀㌀㠀㐀䈀䈀㜀䌀　䐀㄀㠀㘀㜀㄀䄀㔀㤀䐀　㠀㄀㔀　䄀㠀䘀㤀䈀㘀䐀䐀䈀䈀䌀䈀　䄀㈀䌀㜀㜀䐀㠀䔀䘀䘀㔀㤀㐀　䐀㄀䈀㜀㌀䄀㤀䄀㜀䔀㈀㠀䘀㐀㐀䄀䔀㤀䘀䐀㄀䈀㜀䄀㐀䌀䐀㘀㠀㜀䘀䌀㠀㄀㐀䈀䈀　㄀㔀䈀䄀䐀㐀㠀䄀䌀䘀䔀㘀㄀䔀㈀㌀㘀㠀㔀㄀　䌀䌀䘀䐀㔀㄀䐀㄀䌀䌀䈀㤀䐀　　㘀䄀㤀㄀䘀　䄀䈀㔀㔀㤀䈀䄀㔀㜀㈀䐀㐀䘀㔀㌀䌀㈀䘀㌀　㔀䔀㔀䔀㠀䌀䐀　䔀䐀㄀㠀䘀㄀㐀㔀㜀㠀䄀㜀㠀㔀㌀䐀㤀㐀㄀䌀䔀㔀䄀㜀㘀䔀㌀　䔀㤀㠀㠀䌀㠀　䘀㔀㈀䐀㔀㐀䔀㌀䄀　㈀㘀䘀㌀㐀㠀䔀䐀㔀㠀㜀䘀䔀　㄀　㐀㈀㤀㄀㠀㄀㘀㤀䘀㄀䈀㜀㔀㄀䈀㘀㈀㌀㔀㈀䐀㄀䐀㈀㘀㔀㜀㜀㤀㠀　㄀䔀㌀㤀㌀　　䐀㈀㐀㌀　䔀㔀䘀㜀㌀䐀㘀䄀䔀㄀　䈀䄀䘀㌀㐀㔀　䔀䌀㌀䈀㈀䈀㜀㄀䐀㔀䘀㄀䐀㔀㄀㄀㌀㤀䐀　䔀㐀䈀䌀㐀㤀䈀㠀㌀䄀　　䄀　䘀䐀㘀㜀䘀䘀䐀䘀㐀㄀㈀㠀㤀䈀㌀㐀㄀䘀㤀䔀　㈀䄀㄀䘀䌀䌀䘀䈀䈀㄀䄀㌀　㤀㔀㤀䄀㜀㠀㘀㌀㤀䄀㜀䐀　䐀㤀䘀㄀㄀㐀䈀㄀㘀䌀㜀㠀䔀䘀㌀㤀䌀䄀䄀䔀㐀㤀䈀㄀䌀䌀㈀䈀㈀䌀㔀㜀㈀䐀䄀㠀㤀㌀㈀㐀䌀㜀䄀䔀䌀䌀㤀㤀䔀䔀　䌀䘀䐀䔀　㘀　㠀㄀㐀䐀㜀䈀㤀㤀䄀㘀㜀䌀㜀㈀䈀㤀㤀䔀㜀䌀㘀　㤀䈀㔀㐀　　䄀㠀㠀䔀䌀㘀䈀䈀㔀䘀䘀㘀㈀䈀䐀㌀䄀䈀㔀㌀䔀䈀䈀㤀䔀　㠀㌀㠀㐀䌀㘀㜀㄀㐀㌀㤀㈀㜀䈀㘀　㘀㘀㠀㔀㈀㈀㜀　㈀　　䌀㄀㄀䈀䘀䔀䔀䘀㈀㌀㜀䌀㜀㜀䈀㔀䈀㐀㘀㠀㤀㜀䌀㘀䐀䔀䄀㐀㐀㄀䐀㄀㈀　䄀䘀㈀䈀䌀㘀䈀㠀䄀䐀㄀䘀㤀㐀㠀㘀㌀㌀㐀䌀䈀㠀䘀䔀䈀㄀䔀䐀㜀㠀　㄀䈀㠀㘀䈀㜀㌀䐀㠀䈀㘀䌀　　㔀㌀㄀㜀㄀㔀㈀㘀㘀㄀㜀䘀㄀㘀㄀䔀㐀㜀䄀㄀㤀㌀㔀㄀㤀　䈀㈀䄀㈀㔀㐀䌀㔀䐀㤀䘀㔀㄀䔀㌀㄀㤀䄀㜀㔀㈀䔀䐀䄀㠀㌀䔀　䐀㈀㠀㔀㤀㠀䌀䘀㌀䐀㈀䘀㌀䐀㠀㔀䈀䘀㐀䈀㘀　㐀㜀䔀䔀㠀㜀䄀䌀㤀㌀㐀䌀䐀㄀㠀㤀䘀䘀㌀㈀㄀㈀　㔀㔀㠀　䌀䐀㘀㘀䌀㄀㠀䄀　㤀　㌀䐀㜀　䈀䈀䔀䐀䘀　㘀　㔀㘀㄀䔀䌀䈀㈀㠀㠀㄀䄀㘀䘀䄀䘀㌀　㜀㈀䐀䐀　　䐀　䔀䘀　㄀䔀䐀㠀㄀㜀㠀　㜀䌀䐀㌀　䈀䘀㤀㐀䘀　㌀㈀㌀㜀㈀㄀䌀㤀㘀䈀　䌀　䌀㈀䘀䌀䐀㔀䈀㐀㐀㐀䄀㜀䐀㄀　䈀㄀㌀䘀㤀㐀㐀䐀㔀㤀䄀㄀　㤀䔀䌀䐀䈀㄀㌀㄀　㔀㄀㠀䄀䐀䔀䐀㌀㈀㄀㠀䐀　㌀　㠀㤀　㔀㜀　䔀㈀䔀㈀㜀㘀㠀㈀㄀㈀㄀㌀䈀䌀䄀㔀㘀䔀䈀㤀㤀㌀㔀㔀䄀䔀䌀㐀㜀䌀㌀㄀䌀㘀　㘀㠀㜀㜀䌀䐀㜀䔀㈀䌀㌀䐀䐀䘀䌀䐀㄀㈀㠀䄀㘀㐀䔀㔀㈀㔀㐀㌀㐀䌀㈀㈀㈀㐀䄀䔀䐀㌀㠀　㜀䐀䌀㜀　㐀㌀䔀㔀㌀㘀㜀䘀㄀䈀䔀䔀䌀䈀㤀㄀䌀　㐀㔀䌀㘀㤀㄀㐀㠀䘀䄀㠀䌀㌀㔀䈀㄀㠀㜀䔀䐀㈀䔀㤀㠀㤀㐀䄀㐀㠀䘀㈀䌀㈀㠀㈀䐀䔀㐀䈀䌀㄀㄀㐀㈀㌀䔀㘀㘀䄀䌀㄀　　䔀㈀䈀䌀䔀䄀　㜀䐀㐀㜀㠀㘀䈀㐀　䐀㄀　㌀㐀㐀㔀㜀㐀䈀㌀䈀䐀䘀㠀䌀㔀䘀㄀㐀㠀㠀㠀䈀㜀㄀　㔀䄀㔀䈀䈀㤀㤀㄀㤀㐀䔀㠀㌀䈀䄀䈀㈀㠀㤀䄀㈀䄀㈀㈀㐀　　䄀䌀㌀　　䔀㜀㈀　　䘀㔀㠀䐀䘀㘀㘀㜀䄀䌀㄀䔀䈀㔀䈀䈀㐀㤀䄀㄀䐀䈀㔀䌀㠀㘀　㜀䘀㐀㜀㔀䌀㌀　　㈀䄀䐀䌀㔀㔀䐀㠀㤀䔀㠀䈀䔀䘀䄀㌀䐀㜀㤀䌀㤀㠀䌀䈀㐀䐀䐀䘀㐀㜀䔀　㈀㠀㤀㜀䌀　㤀㜀㔀䌀㐀㐀㄀㌀㈀䐀㈀㠀䐀䘀　㐀㤀㔀㈀㄀㐀㄀䐀　䘀䌀㤀䌀䔀䘀䄀㜀䔀䌀䌀㐀㜀㠀㄀㘀㄀㘀㌀䌀　䐀䐀䐀㠀　㔀䌀䘀　　㜀䔀㤀　　　㈀䐀㘀㔀㠀　㌀䈀㜀㔀㐀䘀㔀䐀㈀㔀㐀㈀㘀㈀䈀㠀䐀㤀　䘀㈀　㈀㌀䐀㐀䔀㜀䈀㈀㔀㐀㤀㄀　䈀㔀㈀㌀㐀䘀䈀㤀㌀㘀㐀䔀㘀䌀　㘀㌀䄀䘀㜀䈀䈀䄀䐀㔀㌀䌀㠀㜀䌀䐀　䈀㤀䌀㐀㜀㠀䐀㜀㠀㜀㄀䌀　䐀䘀䐀䄀㄀㈀㔀㌀㄀㘀䐀㐀㠀㌀　㜀䈀䔀䔀　䄀㈀㤀　䈀䄀㈀䌀䌀䌀䐀䈀㈀䄀㜀䘀㐀㔀䄀㜀㄀　㜀䄀㐀㄀䔀䈀㔀䄀㜀㜀㌀　㔀㤀䈀䐀㤀㜀㤀䔀㜀㤀㐀䔀㌀㜀　䐀䄀㌀㌀㘀㜀䌀㜀䐀䔀㘀㄀㤀　　䄀㄀㠀㔀㄀䔀㐀㄀䈀䘀㄀㈀䐀㠀㌀䔀䘀㜀㘀㐀䄀㐀㘀䄀㄀㠀㠀䐀䄀㤀㐀䔀㠀㤀㈀　㄀㈀㤀䔀㜀㐀䐀㐀　䘀㤀㜀㠀㤀㄀　㌀㈀㠀䌀㈀䄀㐀㈀㌀㠀㄀㐀䌀䄀㔀㄀㤀㜀　　㜀㔀䈀䘀㘀㔀㠀㄀䔀㔀䔀㈀䌀㈀㔀㘀䘀䘀㜀㤀䌀㈀㜀㘀䄀䐀䐀㘀䌀㌀㠀㄀䔀㘀㌀㌀㜀㘀㌀䐀㐀䄀䌀㤀㄀㜀㤀㘀　㘀㘀㠀㘀㜀㜀㐀㄀㤀㤀䔀䔀㔀䐀䘀㠀㘀䈀㜀㘀㠀䄀㤀㈀　㐀㔀㈀　䌀㤀䘀䐀㠀　㜀㔀䈀䌀䌀㄀䈀㘀㈀䔀㘀䐀䘀㜀　䐀㐀㐀䄀㌀㠀䈀　　䘀㘀㠀㜀㤀㤀㤀㜀㈀䄀㜀㔀㄀㠀㤀㔀䘀㠀㠀䐀　㠀䔀㐀䐀㄀䘀䔀䘀䔀㘀㌀䄀　䐀䔀䌀　㄀㠀䔀㤀䔀䈀㄀㠀䌀䌀䔀㔀㘀㜀㄀䈀㤀㌀㘀㘀㄀　䌀㤀䘀㌀㠀㜀䌀䄀㠀㈀㌀䈀㐀㠀䘀䌀䄀䄀䐀㈀䘀䈀㠀㘀䐀　㌀䐀㜀㘀㤀㜀䐀䐀㤀㌀䘀㔀䌀㄀㠀㘀䘀䔀䌀㤀㈀䌀㄀㌀㐀䄀䐀䄀㜀䌀㈀䈀䐀㠀　䈀　㠀　䐀㈀䈀䌀䌀䐀㔀㜀䔀　䔀䈀　㠀䄀㜀㈀㌀䈀䐀㄀㘀㠀䐀䄀㠀䌀㠀㐀䈀䌀㄀䘀䘀㐀䈀䄀䌀䘀䘀㌀㌀䌀㈀㜀　㠀㄀䐀䐀㌀　㔀䌀䌀㐀㠀䐀㌀䌀䘀䔀㠀㐀㈀㄀㘀㄀䘀䘀䔀㠀㤀䌀㘀㤀䘀䐀䔀　㐀䌀䐀䔀䘀㈀㜀㔀　䔀㌀䄀㜀㜀䌀䐀㐀㤀䔀㜀　㌀㄀㠀㐀㄀㐀䐀䐀䘀㠀㌀㈀㘀㜀㈀䌀㈀㄀䄀䌀㔀㄀䐀㈀䈀㤀䐀　㔀䄀㠀㤀㐀䐀䄀㈀㐀㄀䔀㠀㐀　䐀䘀䈀䐀㈀㐀䄀㜀䔀䌀䌀　㜀䄀㘀㤀㜀㈀㘀䄀㌀䌀㌀䐀㈀㌀䈀㘀　㌀㘀㔀䘀㐀㜀㐀㄀　㘀䌀䔀䌀㄀㄀䈀䌀㤀䄀㤀䘀㔀　䔀㐀㄀䘀䐀㈀㠀䄀䌀㠀䐀㄀㘀䐀㐀䄀㌀㤀　䐀　㌀䄀㈀　䐀㄀㜀㜀䌀㐀㐀　䄀䄀㐀㄀㐀㌀㜀䄀㌀㜀㘀䐀㤀䐀㘀㄀䘀䔀　䐀㄀䈀䘀㌀㤀　㤀䔀㜀㘀㈀䈀㄀䐀㈀䐀㔀䐀䈀㘀㔀䈀㄀㜀㔀㠀㜀㠀㌀㄀㜀㐀䄀㘀䈀　㜀　䈀㠀㘀䘀㠀㤀䐀䔀䈀㘀䔀㘀㄀㘀㄀㔀㄀㠀㤀䌀䄀㜀䈀㔀㔀㌀䐀㔀䔀䄀㤀㤀㔀䐀䈀䄀䄀㜀䌀䄀䘀㐀㄀㐀㤀䈀㈀㄀㠀䔀䄀㐀㐀䄀㜀㘀㐀㈀䌀㜀䈀䌀䌀㌀㜀㜀㔀䔀䘀㤀㜀䌀䈀㐀䔀㤀㔀㐀㄀䘀㌀㘀㜀㤀䈀㔀䔀㔀㤀䘀　䈀䐀㠀㌀䈀㐀㐀䈀䐀㄀㌀䔀䈀㈀㠀㔀㌀㐀䘀㐀㄀㌀㤀䔀㘀㠀㜀㜀㔀䐀㌀䐀㜀㌀䔀㤀䄀㌀䈀㤀　䔀㈀　㜀㌀䌀䘀　㤀㘀㤀㘀㌀䔀䌀䌀㄀㈀㌀㜀㄀䌀㐀㌀㄀㐀䌀䔀㤀㘀　㜀㤀　㤀䌀　㘀㐀䘀㜀㘀䈀㈀㘀䈀䌀㠀㜀㘀㠀䐀㤀㌀㄀䘀㄀㐀㐀㌀㈀㄀䐀㄀㄀㔀㠀㘀　㐀䈀㐀㜀㔀䈀䈀䔀㘀㠀　䌀䔀　䄀䘀䄀䘀㜀䘀㠀　㄀㐀䘀䄀㠀㄀㤀㜀㐀䔀㄀㜀㘀㘀㤀䈀㈀㈀㠀㜀䄀㔀㄀㄀㠀䔀䘀䌀䄀㄀㄀㐀㜀㐀㠀　䈀　䐀㄀㄀㐀㄀䄀㔀䄀㐀䈀䔀㐀䔀㄀䔀㄀㔀㜀㜀㘀㠀㈀䘀䔀䄀㐀　䌀㠀䌀㌀㌀㄀㈀䔀㘀䔀　㔀䌀㌀䌀㐀㌀㈀䄀㔀㔀㜀㤀䔀㈀䄀㤀㐀䌀㠀䘀㜀㘀㔀㠀䘀㄀䘀㘀䔀㔀㔀䌀　㘀㜀㠀䌀㌀䈀㘀䌀㘀䐀㜀㘀㄀䄀　　㜀㐀㤀㠀㌀㐀㤀㐀䈀㐀㄀䌀㜀㤀䌀㠀㔀㔀䈀㘀㈀䈀㘀㘀㐀　㘀㄀㌀㠀㌀㘀㄀㜀㠀㄀　㌀䐀㠀䌀䐀䘀㤀㜀㄀㔀䌀䔀䌀䈀㤀㠀䌀㈀㈀䔀䔀㄀㤀㠀䄀㈀㐀㤀䌀㈀㜀㠀䐀㌀䘀䄀㐀㔀㘀㈀䐀㘀㈀䔀　䌀㜀㤀䔀㐀䔀䌀䄀　㈀䈀䐀䘀　㄀䔀䘀䔀䘀䔀䌀㈀䄀㔀䌀㄀㘀䘀䘀䌀䄀㌀㘀䈀䘀㤀䘀㄀䘀䈀㈀㔀㠀䄀㈀䈀䐀　㄀䈀㄀㤀䘀䘀䐀㐀䈀㠀䔀㐀㔀䘀㠀䔀㜀䌀䘀㜀㐀䔀䄀㠀㤀　㤀　䈀䘀䔀㠀㈀䔀䘀䔀䌀　㔀䘀䈀䌀㜀㔀㈀㘀㘀䔀䔀㌀㈀䘀㔀䔀　㈀䈀㌀䘀䌀　㐀䐀䘀䘀䄀㌀㠀䘀䄀䐀䘀㤀㘀㈀　　䈀㐀㌀㜀䌀　　㔀䔀䘀　䘀㘀㠀㌀䈀䄀䔀䌀㔀䄀㌀䔀㄀　䔀䔀䘀䔀㤀䈀䘀㠀㌀㠀䌀㐀䄀㜀㜀䘀㄀䈀㜀㜀㤀䐀㔀䄀䄀㜀㈀　　㐀㌀㜀䌀䌀㜀　㤀䐀䐀䔀䌀㠀䌀㄀䄀䘀㄀㔀㜀㄀䄀䘀䔀㐀㐀㜀㔀㜀㘀䘀䄀䘀㘀㘀䄀㜀㠀㘀㜀㄀㄀㠀䌀䄀㐀㠀㘀䄀㤀䔀䌀㄀㐀䔀㤀㄀㔀䐀㔀䌀㄀㈀䈀㈀䐀㠀　䐀䌀㘀䌀䄀䔀䔀㜀䄀䘀䔀㐀㌀㤀䘀䈀䄀㐀㤀㐀㠀㠀䔀㌀㜀㤀䐀䔀䐀㜀㘀㄀㄀　㠀㤀㤀㔀㘀䘀㐀㘀㈀㠀㤀㈀㜀㤀㈀䐀䐀㠀㘀䌀䄀䄀　䔀㠀䐀䌀㤀䘀　㘀䔀㐀䐀㘀㤀䄀䈀㔀㌀䔀㐀㠀　䘀㈀䐀㠀　㤀䄀䄀䐀䌀䄀㘀㠀䐀㐀㐀䄀䄀㘀㤀㌀䈀㐀䘀㄀㈀㐀㌀䔀䌀䔀㄀䐀㌀　㌀㘀㠀㜀䔀㐀䔀䄀㄀㠀䄀㠀　㠀䐀㐀䔀䌀㈀䄀䄀㔀㐀䐀䔀㤀㠀㜀㤀㠀㤀㔀㈀　㌀㈀㔀䌀㘀㠀㔀㔀䘀㈀㜀䄀㌀䔀䔀㐀㐀䄀䐀㄀㔀㤀䐀䔀䔀䐀䘀䌀䘀㤀㔀㤀䔀　㄀䈀㠀䄀㠀㤀䄀㄀㌀䘀㈀䐀㔀㘀䘀㌀㠀䘀　㜀䔀䔀㔀　㘀䄀䄀䄀㄀㜀䌀㘀㔀䌀䔀䘀䔀㘀㜀㜀䈀䌀䘀㄀㄀䈀㌀㈀㠀䘀㤀䌀䄀䈀㠀㔀㔀㐀䘀㄀㠀䌀䐀䔀䐀㘀㐀䘀㠀䈀䐀䘀㄀㜀㄀䌀　䌀　䄀䐀㘀䈀䔀㈀㤀䘀䈀㐀䔀㔀䔀䌀㌀㐀㌀㌀䔀䌀　㜀䄀㠀㘀䔀㔀㤀㤀㌀䈀䄀䘀䈀㘀㐀䈀㌀㘀㌀㠀㤀㐀䘀䌀䘀㌀　䘀䈀㤀䈀㈀㌀䈀㌀㘀㌀㈀㘀　㠀䘀䔀㤀䘀䄀㈀䈀䈀㠀䈀㔀䔀㜀㠀䄀䘀㤀㤀㘀　㤀㐀㜀㤀㌀㤀䔀㌀䘀䌀䘀㠀䐀㄀㤀㌀㄀䔀㄀㄀䘀㌀䌀䔀䘀㄀㔀䘀䈀㜀㄀㜀䔀㘀㜀㘀㌀　䌀䐀䔀䐀䐀䔀䘀䈀㘀䄀㜀㜀䔀㤀䄀䈀㤀㘀㤀㐀㐀㠀䐀䘀㜀　䄀䐀㔀㈀㜀　㌀㠀㔀㄀䄀䔀㌀㤀䈀䐀䘀㤀㜀㄀㘀䔀㈀㤀㈀㌀䔀䌀㐀䌀㈀　㠀　䄀　䌀㔀䈀䘀䔀䄀㈀䌀䈀㄀䘀䐀㐀㜀䔀　㠀䔀㄀䄀㜀䐀㈀䌀㄀㌀䌀䔀　㤀䌀䔀㈀䐀㘀㠀䔀䐀䘀㈀䐀䘀㐀䐀　䈀㈀㈀㘀䌀㠀䐀㐀　㤀㈀㠀䔀䈀㠀㘀䈀㈀㜀䄀　䈀㔀㤀㘀䄀䄀　㌀㈀䄀䄀䄀䐀㐀㤀䐀䔀㠀　䔀䘀䄀䄀㌀㜀䄀㘀䘀㈀䄀㤀䌀䌀䈀　㠀䈀㔀　䄀㘀㘀䈀䔀䐀䐀　　䔀㐀㈀䔀㔀䄀㄀㤀䐀䐀㔀㐀䄀　㜀䄀䐀㘀㐀㈀㠀㘀㐀㜀　㌀㌀䔀䔀㐀䌀㜀㌀㈀䌀䐀㄀䈀㈀䈀㐀㄀㐀㜀㌀㈀㜀䄀㘀㘀㘀䄀㌀㌀䄀㠀㄀㠀㄀䐀䈀㤀䘀㄀㠀㐀䘀㄀㤀䄀㤀㌀㈀㈀㤀㘀㈀䘀㘀䔀㄀㌀㌀㄀䘀　䔀㈀㘀㌀㄀䈀䌀䌀䐀㌀䌀　㄀䌀䔀䔀㄀㜀䌀㐀㐀㘀㈀䔀　䐀㜀䔀　㄀䘀㐀㐀㤀䌀㜀㐀㔀䘀㄀䔀㤀䄀㄀㈀㈀㈀㐀䄀䈀䄀䘀䌀㐀　㔀䈀㜀㠀㘀㌀㄀㌀㜀㐀㤀㐀䌀㘀㈀㔀䘀　㤀　㔀㤀㤀䌀䈀䄀䐀㔀㐀㜀㘀㜀䔀㠀㔀㄀䔀䘀䔀䌀㜀　㐀䈀䘀㔀䄀㄀㤀㠀㘀㌀㌀䐀㠀㘀䌀䐀䔀㔀㤀㜀䈀㘀㌀䌀㜀㐀䌀㘀㌀䐀㔀㠀㠀㐀䘀㌀㄀㜀㈀㘀　㄀㔀㠀䄀㄀㐀㘀䈀㜀㔀㄀　㠀㄀㔀㤀䔀㄀㠀䄀䘀㐀䈀䌀㜀㌀㜀㈀䄀䐀䐀㔀㐀㔀㐀㜀䈀㤀䌀㘀㔀䌀㘀㈀㘀㐀䈀㐀㠀䄀㘀　　㘀㘀䘀㜀㄀㔀䐀䄀䐀㌀㐀䐀䐀㤀䌀䈀䄀䔀㔀㐀䐀㈀䄀㌀䘀䘀㔀㄀㜀㔀　䈀䐀㄀㤀㌀㠀㌀䔀㄀　　㌀䈀㈀㔀䈀　　㘀㐀㈀㜀㘀㜀㌀㐀㐀䔀䘀㔀㈀䄀䔀㤀䐀㠀㘀䄀㔀䘀　㘀㈀䈀㔀䌀䄀䈀㤀㌀㄀㤀㔀䌀䘀㘀㘀䐀㄀䐀㤀㄀㐀䌀㐀　䌀㌀㐀䘀䄀㘀㐀䌀䌀䄀㈀㤀䘀㌀㤀　㜀㜀㌀㠀㈀㤀㔀䈀　䔀　㘀䌀㘀　　㄀䈀㠀䄀䐀㈀㜀㐀㤀㐀㄀㤀㐀㄀䄀㠀㌀㄀㌀䌀㈀㐀䔀䐀䐀㈀㔀㘀㌀㔀㠀䘀䈀㐀㘀㈀䌀䌀㌀䌀䘀䐀㈀㤀䌀㜀䄀㠀㈀㤀䐀　㘀䌀㈀㈀㄀㐀㘀䈀㌀　䄀㠀䐀䄀䔀䘀㈀㠀䈀䘀㘀䐀㘀㄀䐀䄀䄀䄀䔀㔀㠀㈀䄀㄀䔀䘀㈀䌀㔀　㤀㤀䔀㠀㘀㘀䈀㔀㘀䔀㠀䘀䔀㈀㤀㔀㔀㌀㐀㠀㈀㜀㐀㔀㈀㈀㤀䐀㐀㌀㄀㠀䄀㠀䔀䄀㤀䔀䈀㠀㄀㤀䈀䘀㈀㐀㜀䔀㔀㐀䌀㌀㌀㤀䌀䔀㔀㠀㘀䄀䈀䐀䈀㄀㘀䈀㌀㜀㄀㈀㔀䌀㤀䌀㘀㜀䔀䌀㄀㤀䌀㘀䈀䔀㔀䄀㔀㤀㤀㜀䌀㘀㌀䔀㘀䈀㔀䌀　㜀㐀㜀㐀䘀㄀䘀䘀䄀㐀㘀䔀䔀䘀䘀㘀䄀㠀䘀㌀䘀䔀㔀䄀　䄀㘀㤀㄀㈀䈀㐀䘀㜀䌀㈀㐀㤀䈀䐀㄀䌀䄀㠀䘀㤀㄀㄀㐀㘀　㈀㜀　㤀䘀䄀　䄀㌀㔀㜀䄀䄀䌀㜀㜀㤀㠀㄀　䌀㘀㐀䈀㌀㄀㌀　㜀䐀䈀㤀䔀䐀㘀㠀䔀㌀䐀䌀　䄀㔀　㐀䔀䐀㌀䘀䄀㌀㄀㜀䌀　䘀㜀䈀䌀　㐀䄀㠀䈀䈀　㐀㌀㈀㔀㈀㤀　䘀㐀䈀䘀䔀㠀㌀㤀㘀㄀䔀䔀㠀䄀䐀　䐀㐀㜀㤀㠀㔀㜀㤀　䌀㄀䘀㔀㔀㤀䄀㔀㌀㤀㜀㈀䄀㠀㜀㈀㤀䈀㐀㌀㜀䔀㈀㐀㠀䐀㠀㤀㠀㠀㌀䔀㐀䔀㄀㈀　㠀㐀㘀䐀㤀㠀㄀㘀㤀㠀䔀㠀䄀　䄀䘀　㄀　䐀㄀䌀　䈀㄀㄀䌀㘀䔀㘀㤀㐀䘀㘀䈀㌀㔀㔀㄀䈀䄀㔀䌀㌀䔀䄀㜀䔀㈀㠀㐀㌀㄀䈀　䔀䘀䈀㐀㌀䈀䐀䌀㈀㈀㐀䈀㔀㤀䐀　䌀㘀㜀　䌀㠀㈀㄀㔀㔀㜀㈀㔀㘀㐀㜀㄀䌀㤀䐀　䔀㘀䈀䈀㘀㔀䐀䘀䘀㜀䌀䘀䐀㜀䔀㜀㄀䐀　㘀㘀㔀㌀䔀䈀䌀䔀㔀　䘀㠀㄀㔀㠀䌀䈀䘀㔀㘀䘀㔀䌀㔀㜀䈀䐀㔀䐀㠀䄀㔀　䐀㈀㐀㜀䄀㤀䈀㜀㜀㐀㤀䔀㜀䈀㈀㌀㜀䄀㌀㐀㄀㠀㄀㤀㘀㘀䔀㠀㐀㤀䈀㜀㔀㠀㈀䘀㄀㠀　㈀㜀䔀䘀㐀䄀㤀䌀㔀㜀䌀㠀㘀㐀㜀㌀　䈀㘀䔀䈀㄀㄀　䌀㤀㠀　䘀㠀㄀㠀䌀㈀㄀㘀㄀䔀䘀　㄀㈀㜀㐀　䔀㄀㠀　䌀㐀䐀㔀㄀㜀㔀㘀㤀㈀㈀㠀㔀㠀㠀䄀䘀䐀㠀㄀䄀㘀㘀㤀㠀　　䐀㠀㔀䘀䐀　䘀䄀㠀䔀䐀㠀㜀䈀㌀䘀䌀㄀㐀　䈀㔀㠀䄀㄀䐀䈀㐀䘀　㈀䐀㜀䌀䘀㈀㠀䈀䄀㄀䈀䌀㔀㔀䔀㜀㜀䐀䐀㌀䘀㤀㔀㈀㜀　䄀䘀䔀㄀㠀㤀䐀㄀㈀䄀㄀䐀㐀㤀㐀　䄀䔀䌀㈀㠀䐀㘀㤀䘀　㠀䔀㘀䌀䐀㘀䘀䌀䄀　㔀䄀㤀䔀㜀㘀㘀㄀㄀㌀㔀　䐀　䈀䌀㈀㌀㄀䌀㔀䐀㐀㘀㜀㘀㈀㌀䌀㄀㐀㈀䌀㄀㌀䐀䐀㘀䌀䌀䌀㄀㈀㤀　㄀㠀㠀䌀　㄀　㜀䌀　䌀㄀㈀　㌀㜀䐀㠀㐀　㄀䘀㄀　㈀㐀㈀䐀㜀㜀䌀㈀㈀㐀䈀㈀㈀㘀㄀䌀䘀䐀㈀䌀　㌀㈀䈀㜀㠀䄀䄀　　㈀䐀㌀䘀㘀䌀㐀䄀㐀㜀㈀㤀䌀䈀䈀㔀䈀㌀䐀䔀㠀䔀㈀㌀䈀䌀䄀㠀䔀㄀㠀䘀㐀䈀㄀䐀䐀䐀㔀㐀䄀　䔀㘀㔀　㜀　㔀㄀㠀㠀䔀䔀㘀㈀䘀㄀㔀㔀䐀㄀㄀䔀㜀㔀㠀㠀䈀㌀䔀㤀䌀㜀䌀䈀䐀䘀䌀䈀㤀㠀㘀㈀䄀㄀䌀㄀䌀㐀㔀㐀䔀㈀䔀㄀䈀䐀㐀䔀㘀㐀㜀䔀䐀㐀䐀　㠀㠀㤀㌀䄀㤀䘀䌀䔀㄀㤀䐀㐀㜀䄀㈀㤀䘀㘀䘀㠀䈀㐀䔀䘀㈀㐀㘀㈀㔀㔀㜀㠀䔀㘀㠀㄀㘀㤀㠀㐀䄀㤀䌀䌀䐀㌀䘀㐀　㄀㌀㘀㠀䄀㜀䈀䄀㤀㤀㈀䐀㌀　㌀䘀䐀䘀㐀㘀㈀䌀㜀㄀㐀㌀㤀䘀䐀䄀　㌀㜀䈀㜀䈀㤀䔀㐀㘀㘀䔀㌀㐀㠀㘀䌀䔀䈀䘀㈀䘀㐀㐀㠀㔀䔀䐀　㘀　䔀䈀㜀䄀䈀㌀㘀㘀㜀㔀䘀䘀㘀㠀䐀䈀　㐀㜀㘀䐀　㔀䘀㔀㤀㜀㤀䌀㜀㌀䘀䌀㜀䐀㄀㜀㌀䐀㈀㠀㄀䈀　䈀㠀䔀㌀䐀㤀䘀㐀㔀㘀䔀䌀䄀㈀㠀䔀䄀㔀㔀㄀䄀䌀㌀㔀㐀　㤀㘀䐀㤀㜀㐀㠀㄀䈀㐀䘀㌀䈀　㌀㜀㐀㄀㈀㄀䈀㜀䔀㈀䐀䐀㘀䄀㄀㌀㤀㠀㈀䔀㜀㘀䘀㤀䌀䐀　　㐀䐀㈀䘀㠀䈀䘀䌀㜀㠀㌀㐀䔀㐀㘀　㜀㌀㜀㈀㘀　䔀䈀㤀䔀䄀㄀㠀䔀㤀㐀䄀㔀㘀㈀䐀䐀㜀㠀㜀㜀䌀㘀㌀䄀㌀㔀㈀㌀㔀㠀　㔀㘀㔀䘀䔀㐀㌀㈀䌀㐀㤀䄀䌀䔀㤀䐀㤀䄀䐀䐀㜀䘀䔀䐀㈀㘀㐀㈀䘀䈀　㤀　㌀䔀㜀䐀㈀㤀㐀䔀㈀　䈀㈀㐀䘀䌀䘀䈀　㤀㤀㜀　㐀㄀　䐀㔀㐀㘀䘀　䌀䈀㘀䈀㈀䌀㠀䌀㄀㘀㄀䈀㜀㔀　㔀䈀㘀䈀㤀㤀䐀䘀㔀䘀㈀䈀㤀㘀䔀䌀䔀　㈀㠀䄀㐀㐀䌀䔀䄀㜀㄀䐀䈀㠀䌀㈀㘀䌀㠀㌀䘀䈀䐀㈀㔀㤀㤀㔀㘀㔀䄀㔀䔀䄀䐀㄀䌀䌀㄀㈀㘀䔀㔀㠀䌀㜀䈀䐀䌀　㠀㠀㤀　　　䌀㜀䘀㤀㐀䄀㈀㜀㄀㜀㠀㤀䐀㈀㜀㌀䔀䐀㔀䔀㠀㈀　㤀㄀㜀㔀　㠀䄀㌀䔀䈀䘀䐀䈀㌀㠀㠀㘀㈀㐀㔀䌀㘀㈀㌀㘀䐀䘀䐀㘀㔀㈀䔀䄀㐀㐀㘀㔀　㤀㌀㄀㔀䔀㜀㤀㈀㌀䘀䐀㜀㈀㐀㘀䘀㠀䈀㄀䄀䈀㜀㠀　　㄀　㄀䐀㈀㠀㄀　㘀䐀㄀㐀䄀㠀䐀䈀䔀㈀䌀㄀㘀㠀䐀㈀㔀㐀㄀㄀㈀㤀㈀䌀䐀䄀㜀㄀㌀㐀䌀㐀䘀㘀䘀㤀㤀䐀䌀䌀䌀䔀㜀㠀䔀㠀㈀䌀㜀䐀䔀㠀䘀䌀㠀　䔀㤀㈀䌀䐀䐀㘀䌀䔀㘀㐀䘀䈀㤀　㤀䐀䌀㌀　䄀㈀䔀㠀㤀䐀㜀䘀　䈀㜀䐀㈀䘀㠀㄀㠀㄀㠀㠀䘀㄀㜀㐀䄀㐀㈀㄀䄀䘀䘀䄀㜀䄀㔀䌀㐀䈀㔀㐀㔀㔀㜀㘀㌀㈀㤀㔀䌀䐀䈀㌀㤀㌀㌀㔀㤀䐀㈀㈀㐀䈀㔀㤀㈀㔀㘀㜀㄀㈀䔀䐀　㔀㈀㐀䌀㌀㄀㠀㐀㔀㌀㌀㜀　䈀㌀㠀䔀㐀　㈀㌀䌀㈀䔀㠀㜀㐀䌀䄀　䈀㠀㐀㐀㠀䘀㠀䌀㤀䄀䔀㌀㜀䈀㐀㤀㤀㌀䌀㘀㘀㠀䈀㤀䘀䌀㈀㜀　䌀䄀䌀㄀㈀㐀㈀㄀㠀㜀㈀䈀㜀䐀㌀㄀㄀㘀䄀䌀　㤀㈀䘀㠀㈀㘀㈀㐀䘀㠀㈀㠀　㘀㜀㤀㠀㔀䄀㠀㤀㔀䐀㔀㌀䌀䈀䘀㜀䘀䐀䄀㤀㤀䔀㘀㜀䐀㘀㤀㈀㈀䘀㠀㠀䘀㄀　䌀䌀㜀㤀䔀㈀䄀䄀㌀䔀㜀㘀䄀䘀䔀䘀㌀䈀　㔀䈀䌀㈀㐀㔀䈀䘀䄀䐀䌀㘀䘀䌀䐀䈀䌀㔀㌀㔀㌀㄀㈀㠀㤀㠀㘀㤀㈀䄀䘀㄀　　　　　䌀　㤀㘀㜀　㤀㈀䈀㔀㌀㄀䄀㈀䔀㈀　　㤀㌀　㌀㌀㐀㜀㐀　䈀䘀㤀䄀䔀㔀䈀㔀㠀䐀㈀㌀䈀䐀㈀䘀䘀䐀䘀㘀㤀㤀㘀㘀㈀㄀䐀㈀㈀㤀䐀㜀㄀㐀㔀㔀㘀㌀㌀㄀㜀㈀㠀　䔀㠀䄀㠀㌀䌀㤀㘀䔀䄀㌀㤀䐀　㜀㔀㘀㜀䐀　㜀㈀䌀㜀䐀㘀㌀㄀䔀㘀　䄀㠀䌀㘀䌀䐀㌀㐀㘀䄀㜀㠀㔀㄀㌀㈀㄀㠀䄀䘀㤀䈀㌀䘀㘀㔀㈀䌀㠀䈀㌀㈀㈀㠀㠀㌀䌀䐀㄀㈀㜀䈀㌀䘀㌀　㄀䄀㌀䈀㠀㤀㔀䔀䈀　㠀䐀䐀㔀㄀㔀㜀㄀㘀㐀䌀㐀㔀䘀　㄀㈀㠀㐀㘀䌀㤀䄀㐀㠀䘀㐀䘀㘀䈀㌀㔀㐀㌀㐀䔀㈀䈀㔀䐀　䐀䌀䄀䘀㠀㌀䈀㤀䌀㐀　㈀䐀㤀䌀㠀㔀䘀㐀㠀䐀䐀㌀㠀䄀㈀䌀㘀㜀䈀䄀䄀㤀　㠀㔀䔀䈀䄀㌀㜀䔀㠀㈀䌀㄀䈀䈀䐀䄀㘀䌀㔀㈀㘀㘀㘀　　䘀　㘀䌀䐀㜀㈀㤀䐀㠀㜀㈀䔀㌀㐀㈀㔀㠀䌀　㤀㐀䈀㈀㜀㠀　㘀㔀㤀㄀䈀䐀㔀㘀㜀㄀㔀䄀㤀㐀䘀㐀㘀㈀㘀䔀䈀㈀㐀㜀㠀㈀㈀㠀䔀䘀㘀䘀㤀㔀㤀䄀㄀㜀䈀㔀䄀䈀䐀㈀䈀㐀㌀㐀䌀㐀䈀㈀㄀㈀㄀　㘀㠀㐀㘀㄀㄀㔀㘀㔀䈀㈀䌀㐀㐀㄀㠀䘀㐀㜀䘀䌀㌀㐀䔀䌀㔀㐀㘀䘀䈀㤀㜀㔀㄀㜀䐀䌀䔀㠀㔀䔀㔀㌀䔀㄀㄀䄀㄀㠀䘀䘀㔀䈀㈀䌀㐀䔀㈀䌀㈀䄀䌀䈀䈀䐀㈀㄀㠀䔀㄀䔀㘀㄀㄀㐀䔀䄀㄀䄀䐀㔀䄀㘀㈀　䈀䌀䐀㤀㐀䔀㐀㜀㘀䄀㜀䘀䌀㠀䔀㜀㄀㈀䈀㘀㠀㈀䄀㌀䔀㌀㠀䈀䘀㈀䈀䐀㐀　㌀䘀㌀㤀㐀䄀　䌀㈀㠀㘀䔀䈀㄀㔀㐀㌀㤀㄀㤀㌀䔀㌀䘀㔀㠀㐀䐀㌀㘀㘀䘀䔀䈀㈀㜀䈀䔀㘀㜀㌀䌀䐀㐀䘀㐀䐀㜀㔀䘀䔀㔀䌀㐀㐀㄀㘀䌀　　䔀㔀㌀䔀㌀㄀㤀䘀䄀㔀䄀㠀　㜀㠀㌀䈀㘀㤀㌀㌀䄀　䈀㄀㤀㈀䔀䘀䈀㤀䈀䘀䐀䌀䘀㈀䄀㐀䌀㜀㘀䈀㤀㔀䔀㔀䄀䔀䔀㌀䄀㔀䈀㔀䔀䄀㌀㠀㌀䄀㘀㠀㌀䈀䐀䐀䄀㔀㤀㌀㈀㠀㤀㄀㌀㄀䘀㐀䐀㄀㠀䔀㠀䄀㠀㄀䈀䔀㈀䄀䌀㔀㐀㐀䈀㘀　㔀㌀䄀䐀㄀䐀㄀㐀㐀䘀㘀　㔀㘀㈀䌀㤀䌀㤀䌀䔀㤀㐀㈀䌀㄀㤀䔀㈀䐀㜀䔀䘀㔀㄀䐀㜀　　㄀䈀䔀䈀㔀㌀㤀䐀䔀䐀䈀䔀㄀䄀㈀㠀㔀䐀䔀㠀㌀㈀㌀䄀㌀䔀㤀䐀㐀䄀䘀㐀㄀㄀䈀㈀㔀㄀䈀䌀䌀㈀㐀䐀䐀䄀㐀㤀䌀䄀㘀䐀䄀㜀㈀㄀䘀㠀㔀䌀䌀䔀䘀㤀㄀㤀䈀㔀㘀䄀㐀㘀　㜀䈀䔀㠀㤀㔀㘀㜀䔀㤀㐀㄀䘀䐀㈀㈀㠀䘀㌀㠀㔀　㔀䈀䐀䌀㌀䘀䔀㐀䄀䄀　䔀䄀　䌀䔀䈀䐀䈀㠀㠀㔀㔀㜀㘀㐀㤀㠀䈀㄀㘀㔀䄀㐀㄀㈀㐀㘀䔀㐀　㐀䔀䌀䐀㐀㘀㈀䄀䄀㐀　㜀䈀㔀㈀㄀䌀㐀㜀㠀　䐀㠀㘀㐀䔀㠀䐀㜀㠀㠀㌀㘀䔀　㤀㜀㔀䄀㌀䌀䌀㤀㐀㔀䐀　㤀　㘀䄀　㔀䔀䌀䄀䌀䘀䘀㘀㠀䔀㐀㤀㄀㐀㐀㈀䄀㠀㘀䘀䄀䄀䌀䔀㄀䈀䄀㌀㄀䐀䌀㔀㈀䐀䌀　㤀㌀䄀㘀䐀䌀䔀㜀㠀㜀㔀䌀䘀䘀䔀䔀㐀㄀䈀䘀䄀㜀㤀㤀䔀䔀䔀䈀㘀㘀䐀㠀㐀㐀䐀䘀㤀䔀㤀㄀㌀㘀㜀䐀㐀㐀㘀㈀㌀㜀䌀䔀㈀㠀䄀䄀　㔀㈀䄀䌀㤀䐀㜀䔀䈀䄀䐀㐀㐀㘀㤀㐀㘀䌀㤀㤀䐀䔀䄀䄀㠀䄀䄀䌀㐀䔀㐀䐀㐀㐀䘀㈀䌀㐀㠀䘀䈀㔀㄀㄀㤀䔀㌀㐀䘀　䈀　䌀㈀䈀㠀䐀䈀㈀㠀㈀㌀㐀㜀㄀㄀㤀㌀㤀䐀㄀䔀㤀㜀㘀㘀㘀㌀㄀㜀䄀䌀㤀㜀䈀䌀㄀㐀䐀䄀䐀　䘀㄀䄀㜀䈀䔀㤀䈀㐀㠀䌀䐀䘀䔀㄀㠀䐀㐀㄀㘀㌀㜀㄀㈀䈀㔀㜀㐀䄀㄀㔀䐀㤀㘀䐀㠀䌀㜀㌀㜀䔀㈀㠀㐀㜀䐀㔀䐀　㌀㈀䘀䐀㜀㜀㘀㔀㜀㠀䌀䈀㠀䌀㄀䄀䘀䄀䐀㤀㤀㤀㈀㤀㘀　㄀　䘀　㈀㐀䌀㠀㤀㜀㐀䈀㘀㜀㈀㌀㠀䐀䌀㘀㘀㌀䐀㐀䄀㠀㜀㘀䐀䄀㠀㠀䈀㌀㠀　㄀䄀㘀䘀䔀　㌀䘀䐀㘀㌀㔀䌀㠀㔀㈀㐀䄀䄀䈀䈀䔀㈀䔀㤀䐀㜀䄀䐀䘀㠀㤀㔀䘀㔀䘀䐀㄀㘀㜀㔀䔀䘀䌀　㐀㐀　䐀㌀㘀䘀䐀㤀䘀䄀㔀㈀㠀㔀㄀䌀㈀㘀䔀㐀䐀䐀㐀㔀㌀䘀㤀䈀䈀䄀䐀㜀　㐀　䌀㌀　䘀䐀䈀㠀　㌀㤀㠀䈀䐀㠀　㌀㄀䘀㌀䈀㤀㜀㈀㄀㠀　㌀䈀㄀㄀㌀　䐀㄀䈀㌀䘀䐀䈀㐀㤀䘀㈀䌀㈀䘀䔀䐀㔀　㐀㌀㔀䈀　䔀䄀䄀䄀㘀㐀䌀㐀䔀䌀㤀㜀㌀㤀㌀䘀㌀䄀䌀䐀䐀　䘀䄀㤀㠀㈀㘀䌀㌀㠀㘀䄀䘀㄀㄀㜀䈀䄀㌀㄀㈀䔀㌀㜀㔀䌀䔀䈀㔀䈀㈀㈀䄀䘀㈀㌀䐀㤀㐀䄀　㄀䘀㠀㔀㄀㐀㌀㘀㌀䄀㘀䐀䔀䄀䈀䔀䄀㄀　㈀䔀㄀㌀㘀䔀㠀㜀䄀㈀㠀㠀䔀䐀　㔀䘀㐀䘀䘀䄀䔀㌀㜀㜀　䄀㘀㘀㤀㐀㜀㜀㜀㘀㜀㈀䌀䈀㌀㠀㈀䈀㠀㔀　㄀㌀㔀㠀㤀㠀㄀䔀㌀㜀　㜀䔀㜀　䌀㌀䐀䌀㌀㐀䘀㤀㜀䔀㌀䈀㄀㘀㘀㐀㈀㄀㌀㐀䘀㐀㈀　䌀㘀㜀䈀䌀㘀㐀䘀䔀㘀㤀　㌀䔀㄀㠀㌀㌀㄀㌀䈀　㘀㜀㔀䔀䄀㠀䔀㠀㠀䌀㈀䐀㄀㄀㈀　㐀䌀㘀䔀㈀㈀㈀㤀㔀㐀䔀㘀䐀㜀㔀䈀䌀䄀㘀䔀㈀㜀　㘀㔀㜀㜀㄀䔀䘀㈀䔀㐀㐀㌀㐀䈀䘀䈀㠀㠀㄀㐀䔀䈀㘀䌀㐀䔀　㄀㘀䌀䔀㌀㤀䐀㜀䈀㐀䄀㄀㐀䘀㠀䐀㐀㜀㤀㐀㘀㐀㐀㘀䔀㌀䔀㌀䘀䐀䄀㠀䈀䄀䔀㄀㔀㌀䄀㤀㠀㤀㔀㠀䈀䌀䐀䘀䔀䈀䌀㤀㔀㈀䐀䐀䐀㜀䐀䐀　㌀䔀䔀㐀䈀䈀㌀㘀䐀㠀㐀　㘀㜀䌀䈀䄀㈀㤀䐀　䐀㜀䔀㐀㈀䔀䌀䘀㘀䔀㌀㘀㠀㐀㈀㜀䈀㘀㘀㐀䘀䔀㌀㘀㘀㄀㔀　䌀㄀䘀䔀㄀䐀㌀㤀　　㜀䔀㄀䔀㤀㄀䔀㘀　　㄀䐀䈀䌀䄀㤀㘀䄀䄀㌀䈀㈀䐀㠀䐀㈀㠀㄀䌀䘀㌀㈀㌀㜀㐀䈀䌀㜀䌀㈀　䈀䘀䐀䈀䈀㠀䐀䌀㠀䘀㈀㄀㘀㈀㤀㄀䐀　䘀㈀䄀䐀䘀䔀䈀㠀㤀㔀㘀㔀㜀䘀䐀㈀㘀㈀䐀㄀㌀㈀㄀㈀䄀㤀䈀㌀䘀㄀㌀㄀㌀㘀㈀㄀䔀㄀㄀㌀㄀䄀㤀㔀㄀䌀㈀㘀㠀䌀䘀㤀㜀㠀㌀㤀㤀㘀㐀㠀㘀䌀　㄀䐀䐀㠀㤀䘀䐀㠀㤀䌀䐀䄀䌀㘀㠀䘀㤀㠀㘀㄀䈀㜀䄀䄀㐀㤀㠀䄀㜀䈀㐀㔀䌀㄀㔀䈀　䈀䈀㤀㤀㔀㐀㤀䔀㠀䄀㘀　㄀䈀㔀㔀䄀㌀㘀䌀　㐀㄀　㈀䈀㤀㤀䌀㌀㐀䌀䈀㐀㄀㌀䌀㜀㈀㠀㈀䔀㜀㘀㈀䔀㠀㄀䄀㠀䄀㔀㤀㌀㤀㜀䐀㠀㐀㘀䔀䌀㜀䘀䈀䐀䘀㄀䐀㠀䌀㤀㐀㘀㌀䐀　㜀　㐀䌀㘀㔀㔀㜀䘀䐀䄀㄀㔀㤀㔀䘀䌀䈀䌀䈀㐀㄀䈀㄀　㐀　㈀䈀㐀㔀㌀㌀䄀㜀䘀㈀䐀㘀䐀䔀䔀㘀㄀　㄀㤀㐀䔀㤀㜀　䌀　㈀㐀䘀㘀㜀㈀㔀　㔀㠀䐀㤀㈀㠀㤀䘀㠀㌀䐀㄀㠀㤀㌀䌀䘀䔀䔀䄀㔀䘀䌀㈀䘀㤀䄀䄀㈀㘀䔀䄀䌀㌀䐀䔀㤀䌀䐀㔀䘀㠀㤀㜀㄀䘀㠀䐀㠀㌀㘀䐀㈀䐀㔀㜀㌀䐀䘀㈀㜀䌀㠀㠀㐀㄀㄀　䈀䈀䔀㌀䐀㠀㄀㌀㈀䐀䐀　㠀㌀㠀㤀䌀㌀㜀㌀㜀㈀䔀　䘀㤀䌀㜀　䈀㤀䘀㌀䘀㄀䔀㘀㘀㠀䄀䘀䌀　䘀㘀䔀㤀㐀䈀䌀䘀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㌀㄀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㔀㌀㜀㔀㘀㈀㜀㐀㜀㤀㜀　㘀㔀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㌀　㈀䘀㐀㈀㘀㄀㜀㌀㘀㔀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㐀㈀㐀㌀㐀㐀㐀㤀㐀㔀㐀㔀㈀䈀㐀㄀㜀㈀㘀㤀㘀㄀㘀䌀㐀䐀㔀㐀㈀䘀㐀㔀㘀䔀㘀㌀㘀䘀㘀㐀㘀㤀㘀䔀㘀㜀㈀䘀㐀㤀㘀㐀㘀㔀㘀䔀㜀㐀㘀㤀㜀㐀㜀㤀㈀䐀㐀㠀㈀䘀㐀㐀㘀㔀㜀㌀㘀㌀㘀㔀㘀䔀㘀㐀㘀㄀㘀䔀㜀㐀㐀㘀㘀䘀㘀䔀㜀㐀㜀㌀㈀　㌀㈀㌀㈀㈀　㌀　㈀　㔀㈀㈀䘀㔀㐀㘀䘀㔀㔀㘀䔀㘀㤀㘀㌀㘀䘀㘀㐀㘀㔀㈀　㌀㄀㌀　㌀㈀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㌀㈀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㔀䈀㈀　㌀㈀㌀㌀㈀　㌀　㈀　㔀㈀㔀䐀㈀　　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㌀㌀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㈀㘀㄀㜀㌀㘀㔀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㐀㈀㐀㌀㐀㐀㐀㤀㐀㔀㐀㔀㈀䈀㐀㄀㜀㈀㘀㤀㘀㄀㘀䌀㐀䐀㔀㐀㈀䘀㔀㌀㜀㔀㘀㈀㜀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㌀㐀㤀㐀㐀㐀㘀㘀䘀㘀䔀㜀㐀㔀㐀㜀㤀㜀　㘀㔀㌀㈀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㈀䘀㐀㌀㐀㤀㐀㐀㔀㐀㘀䘀㐀㜀㐀㤀㐀㐀㐀䐀㘀㄀㜀　㈀䘀㐀㤀㘀㐀㘀㔀㘀䔀㜀㐀㘀㤀㜀㐀㜀㤀㈀䘀㐀㐀㔀㜀㈀　㌀㄀㌀　㌀　㌀　㈀䘀㐀㌀㐀㤀㐀㐀㔀㌀㜀㤀㜀㌀㜀㐀㘀㔀㘀䐀㐀㤀㘀䔀㘀㘀㘀䘀㈀　㌀㈀㌀㐀㈀　㌀　㈀　㔀㈀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀　㌀㈀㌀㔀㈀　㌀　㈀　㔀㈀㈀䘀㔀㜀㈀　㌀㄀㌀　㌀㐀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㌀㐀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀䘀㜀㈀㘀㐀㘀㔀㜀㈀㘀㤀㘀䔀㘀㜀㈀㠀㐀㤀㘀㐀㘀㔀㘀䔀㜀㐀㘀㤀㜀㐀㜀㤀㈀㤀㈀　㈀䘀㔀㈀㘀㔀㘀㜀㘀㤀㜀㌀㜀㐀㜀㈀㜀㤀㈀㠀㐀㄀㘀㐀㘀䘀㘀㈀㘀㔀㈀㤀㈀　㈀䘀㔀㌀㜀㔀㜀　㜀　㘀䌀㘀㔀㘀䐀㘀㔀㘀䔀㜀㐀㈀　㌀　㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㌀㔀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀䘀㜀㈀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀䔀㘀㄀㘀䐀㘀㔀㈀䘀㐀㈀㐀㌀㐀㐀㐀㤀㐀㔀㐀㔀㈀䈀㐀㄀㜀㈀㘀㤀㘀㄀㘀䌀㐀䐀㔀㐀㈀䘀㐀㘀㘀䌀㘀㄀㘀㜀㜀㌀㈀　㌀㌀㌀㈀㈀䘀㐀㤀㜀㐀㘀㄀㘀䌀㘀㤀㘀㌀㐀㄀㘀䔀㘀㜀㘀䌀㘀㔀㈀　㌀　㈀䘀㐀㄀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㌀㤀㌀　㌀㔀㈀䘀㐀㐀㘀㔀㜀㌀㘀㌀㘀㔀㘀䔀㜀㐀㈀　㈀䐀㌀㈀㌀㄀㌀　㈀䘀㐀㌀㘀㄀㜀　㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㜀㌀㈀㌀㠀㈀䘀㐀㄀㜀㘀㘀㜀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㐀㌀㐀㌀㄀㈀䘀㐀䐀㘀㄀㜀㠀㔀㜀㘀㤀㘀㐀㜀㐀㘀㠀㈀　㌀㈀㌀㘀㌀㘀㌀㔀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㔀㜀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㐀㌀　㌀　㈀䘀㔀㠀㐀㠀㘀㔀㘀㤀㘀㜀㘀㠀㜀㐀㈀　㌀㈀㌀㔀㌀　㈀䘀㐀䌀㘀㔀㘀㄀㘀㐀㘀㤀㘀䔀㘀㜀㈀　㌀㌀㌀㌀㈀䘀㔀㌀㜀㐀㘀㔀㘀䐀㔀㘀㈀　㌀㐀㌀㐀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㈀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㈀䐀㌀㘀㌀㘀㌀㔀㈀　㈀䐀㌀㈀㌀㄀㌀　㈀　㌀㈀㌀　㌀　㌀　㈀　㌀㜀㌀㈀㌀㠀㔀䐀㈀　㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㐀㘀㘀㤀㘀䌀㘀㔀㌀㈀㈀　㌀㄀㌀　㌀㌀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㌀㘀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㔀　㘀㄀㘀㜀㘀㔀㈀䘀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㈀　㌀㈀㈀　㌀　㈀　㔀㈀㈀䘀㔀㈀㘀㔀㜀㌀㘀䘀㜀㔀㜀㈀㘀㌀㘀㔀㜀㌀㌀䌀㌀䌀㈀䘀㐀㘀㘀䘀㘀䔀㜀㐀㌀䌀㌀䌀㈀䘀㐀㘀㌀㄀㈀　㌀㔀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㐀㔀㜀㠀㜀㐀㐀㜀㔀㌀㜀㐀㘀㄀㜀㐀㘀㔀㌀䌀㌀䌀㈀䘀㐀㜀㔀㌀㌀㜀㈀　㌀㜀㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㔀㌀㌀㠀㈀　㌀㠀㈀　㌀　㈀　㔀㈀㌀䔀㌀䔀㈀䘀㔀　㜀㈀㘀䘀㘀㌀㔀㌀㘀㔀㜀㐀㔀䈀㈀䘀㔀　㐀㐀㐀㘀㈀䘀㔀㐀㘀㔀㜀㠀㜀㐀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㈀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㌀㈀䘀㐀㤀㘀䐀㘀㄀㘀㜀㘀㔀㐀㤀㔀䐀㈀　㌀䔀㌀䔀㈀䘀㐀䐀㘀㔀㘀㐀㘀㤀㘀㄀㐀㈀㘀䘀㜀㠀㔀䈀㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㤀㌀㔀㈀䔀㌀㌀㌀㈀㈀　㌀㠀㌀㐀㌀㄀㈀䔀㌀㤀㌀㈀㔀䐀㈀　㈀䘀㐀㌀㘀䘀㘀䔀㜀㐀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀㈀㌀㜀㈀　㌀　㈀　㔀㈀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀㜀㜀㈀㘀䘀㜀㔀㜀　㈀䘀㔀㌀㈀䘀㔀㐀㜀㈀㘀㄀㘀䔀㜀㌀㜀　㘀㄀㜀㈀㘀㔀㘀䔀㘀㌀㜀㤀㈀䘀㐀㌀㔀㌀㈀䘀㐀㐀㘀㔀㜀㘀㘀㤀㘀㌀㘀㔀㔀㈀㐀㜀㐀㈀㌀䔀㌀䔀㈀䘀㔀㐀㘀㄀㘀㈀㜀㌀㈀䘀㔀㌀㈀䘀㔀㌀㜀㐀㜀㈀㜀㔀㘀㌀㜀㐀㔀　㘀㄀㜀㈀㘀㔀㘀䔀㜀㐀㜀㌀㈀　㌀㐀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㌀㜀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㐀㌀㘀㌀㜀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䈀㔀㤀㐀㐀䐀㘀䈀䐀䈀㐀　㄀　㠀㘀䔀䘀　㈀䘀䐀㠀㜀㌀㤀㐀䄀　㄀䌀䘀㜀䔀㘀㠀㌀䘀㈀㄀　㐀䔀䌀㜀䌀䈀㔀㈀㔀㠀㘀　㐀䄀㤀䘀㐀㘀　㜀㈀㔀　㘀䐀䐀㤀㌀㄀㘀䐀㈀㐀䌀㜀䐀㤀㔀㈀䘀䄀䔀䘀䄀㌀㤀㔀㐀㈀　䘀䄀㤀㌀㘀　䐀㠀㤀䄀䌀䐀㌀䔀䔀䈀㈀㤀䄀䔀㜀㤀䐀㜀㜀㘀㘀㤀㘀㐀䌀䘀㜀㘀䔀䈀䈀㈀䔀㤀㜀　䔀㠀䔀㠀䘀䌀㤀䐀㐀䈀㤀㜀㈀㜀㤀㔀㜀䄀䐀㘀　㐀㄀㠀䄀㘀㘀㜀㜀㐀䈀㠀䄀㌀䘀䈀䈀㠀䄀㔀䌀㤀㜀㤀䈀㘀䐀㔀䐀䈀䄀㘀䐀㔀㌀㤀㌀䘀䌀䐀㜀㜀㜀䔀㜀㠀䘀㌀䔀㔀㔀䔀㔀䄀䄀䐀䄀㤀䘀㤀䌀䌀　䔀䌀䔀䌀㄀㐀㄀䔀䔀㈀㠀㠀㈀㈀䘀㔀㤀䘀㌀㄀㤀䄀　㄀　㔀㘀㤀㈀㔀㘀㘀㄀䌀㠀䌀㘀　㘀㠀㌀㤀䔀䌀䄀䈀㌀㠀䘀䄀㜀㘀　㐀㜀㔀㄀䌀䌀䐀㠀䄀㌀㠀㈀㈀㄀㜀　䌀㄀㠀㐀㌀㈀䄀䄀　㔀㠀䌀㜀㤀㄀䈀䘀㐀䐀㠀㄀㠀㄀䔀㘀㐀㠀䈀㤀　　㘀䐀㄀㔀㜀㈀㈀㠀䔀䔀䐀䈀㘀䈀㤀㜀䈀㤀㠀㘀䌀䐀㘀㌀㄀䈀㄀㤀㌀㘀䐀䐀䌀䔀㌀䌀䔀䘀㈀䔀䔀㌀㘀㠀㤀㄀㐀　㜀䄀　䈀䌀㔀㤀㜀㌀㠀㌀䄀㘀䘀　㌀䐀䔀䌀㐀䐀㄀㤀䈀　㔀㤀　䈀䘀䈀㤀䌀䔀䔀㘀䈀䐀㘀䔀㄀䘀㔀䐀㔀㌀㤀㐀䌀㘀䌀㌀㌀㤀　䄀　㌀㐀㈀　䄀䔀㐀㄀䄀䄀㠀㔀䘀䘀䈀㌀䘀䐀㜀㐀㜀㜀㄀　㐀䔀㜀䔀䐀䘀㔀㤀䈀㠀䔀䐀㔀㈀䐀㐀㤀䌀　䈀㌀㔀㤀䔀㌀㔀䌀㜀㌀㄀䘀䈀㘀䔀䐀䄀㈀㘀㤀䐀䌀㤀㠀䈀㘀㐀㤀㘀㘀㔀䈀䔀㤀㤀　㜀㄀㌀㐀䄀㘀䈀㌀䄀䐀䌀䈀䔀㜀䐀㤀㈀㐀䘀㤀㐀䔀㤀㌀㔀䔀䌀㄀㜀㄀㠀㤀㌀䄀㐀　㌀䈀㐀㠀㐀㤀㠀㐀㐀　䄀㘀䐀䄀㠀䄀㈀㠀㤀㐀䐀㈀㔀㜀㐀㐀㔀䈀㄀䈀㈀䔀　䄀㤀　㜀䌀㔀㜀䐀㘀䈀䔀㈀㈀䘀㌀䐀㌀䌀䘀㘀㜀㐀　䌀㤀㔀㔀㔀㤀㘀䘀㈀　䄀㤀䔀䄀䌀㤀䘀㐀㘀䈀㌀䄀㜀䔀䄀䈀㈀䄀㠀䐀㔀䄀䘀䐀䌀䘀㠀㘀㈀㄀㘀㄀㘀䌀㄀䌀㘀㄀㈀㈀㈀㐀㐀䌀㘀㐀㤀㠀䈀䐀䄀䌀　䘀㐀䌀㜀䌀㜀㐀䄀㄀䐀䄀䘀㌀䔀㔀㈀㈀䌀㤀䈀㜀㌀䘀㜀䘀㜀䌀䈀㐀㌀㤀䘀䔀䌀㄀㔀䈀䐀㄀㐀䘀䐀㄀㄀　㜀䔀㤀㄀䘀䌀㐀䔀㈀㜀㔀㤀䐀㈀㌀㐀䄀䈀䐀㄀䈀㄀㠀䌀㄀䈀䄀㐀㈀䄀㠀㐀㜀䐀㘀䘀㔀㜀䈀䔀䌀㈀䌀䈀䈀䌀䌀䐀㈀㄀㔀䔀䐀䔀䄀㐀㌀㘀㔀㤀䘀䈀㔀䌀㔀䐀㈀䄀䘀䄀䄀㐀䌀䈀㜀䐀㌀㔀䈀䔀　㠀䄀㌀㤀㄀䌀䈀㌀㜀㈀㘀㌀䐀䐀㐀㠀㌀䘀䌀䌀　䌀㌀䌀㄀㘀㤀䘀䈀㔀　䈀䌀䐀㐀㌀㔀䔀䘀䔀䐀㔀㠀䐀䔀䄀㔀㠀䌀䈀㘀㈀㈀㈀㜀㈀㈀䔀㄀㌀㐀䌀䐀㄀㈀䄀䔀㐀㘀㜀䘀䄀㠀㔀㠀㐀㘀㤀㄀䘀㌀㠀　　䌀㐀㠀㔀㔀㐀䘀䘀䘀㜀　㜀㌀　䌀㜀　㈀䐀㘀㘀䌀㌀䔀㤀㜀㜀㄀㌀䄀㠀㈀䌀䔀䈀　㘀㄀　　䔀㠀　㄀㘀㌀㈀㠀㐀㄀䔀䔀䔀㠀㠀㈀㜀㌀䌀䐀㜀㤀䘀㐀㘀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㈀㌀㠀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㘀㤀㜀㐀㘀䌀㘀㔀㈀㠀㐀㘀㜀㔀㘀䔀㘀㐀㘀㄀㘀䐀㘀㔀㘀䔀㜀㐀㘀㄀㘀䌀㜀㌀㈀　㘀䘀㘀㘀㈀　㐀㌀㘀䘀㘀䔀㜀㐀㜀㈀㘀䘀㘀䌀㘀䌀㘀㔀㘀㐀㈀　㐀㐀㘀䘀㘀㌀㜀㔀㘀䐀㘀㔀㘀䔀㜀㐀㈀　㐀䐀㘀㄀㘀䔀㘀㄀㘀㜀㘀㔀㘀䐀㘀㔀㘀䔀㜀㐀㈀㤀㈀　㈀䘀㐀㄀㜀㔀㜀㐀㘀㠀㘀䘀㜀㈀㈀㠀㐀㜀㘀㔀㘀䔀㘀㔀㜀㈀㘀㄀㘀䌀㈀㤀㈀　㈀䘀㐀㌀㜀㈀㘀㔀㘀㄀㜀㐀㘀䘀㜀㈀㈀㠀䘀䔀䘀䘀　　㐀䐀　　㘀㤀　　㘀㌀　　㜀㈀　　㘀䘀　　㜀㌀　　㘀䘀　　㘀㘀　　㜀㐀　　䄀䔀　　㈀　　　㔀㜀　　㘀䘀　　㜀㈀　　㘀㐀　　㈀　　　㌀㈀　　㌀　　　㌀㈀　　㌀㐀㈀㤀㈀　㈀䘀㐀㌀㜀㈀㘀㔀㘀㄀㜀㐀㘀㤀㘀䘀㘀䔀㐀㐀㘀㄀㜀㐀㘀㔀㈀㠀㐀㐀㌀䄀㌀㈀㌀　㌀㈀㌀㘀㌀　㌀㌀㌀　㌀㠀㌀㄀㌀㜀㌀　㌀㠀㌀　㌀㠀㈀䈀㌀㄀㌀　㈀㜀㌀　㌀　㈀㜀㈀㤀㈀　㈀䘀㐀䐀㘀䘀㘀㐀㐀㐀㘀㄀㜀㐀㘀㔀㈀㠀㐀㐀㌀䄀㌀㈀㌀　㌀㈀㌀㘀㌀　㌀㌀㌀　㌀㠀㌀㄀㌀㜀㌀　㌀㠀㌀　㌀㠀㈀䈀㌀㄀㌀　㈀㜀㌀　㌀　㈀㜀㈀㤀㈀　㈀䘀㔀　㜀㈀㘀䘀㘀㐀㜀㔀㘀㌀㘀㔀㜀㈀㈀㠀䘀䔀䘀䘀　　㐀䐀　　㘀㤀　　㘀㌀　　㜀㈀　　㘀䘀　　㜀㌀　　㘀䘀　　㘀㘀　　㜀㐀　　䄀䔀　　㈀　　　㔀㜀　　㘀䘀　　㜀㈀　　㘀㐀　　㈀　　　㌀㈀　　㌀　　　㌀㈀　　㌀㐀㈀㤀㈀　㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㌀㌀㘀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀䘀㘀㈀㘀䄀㔀㌀㜀㐀㘀䐀㈀䘀㐀䔀㈀　㌀㜀㌀㄀㈀䘀㐀㘀㘀㤀㜀㈀㜀㌀㜀㐀㈀　㌀㔀㌀㐀㌀㤀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㄀㌀㄀㌀　㌀㈀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䄀䐀㤀㠀䐀䈀㘀䔀䐀䈀㌀㠀㄀　㠀㘀䔀䘀　䈀䘀㐀㄀䐀䔀㘀　䐀㈀㐀㤀䔀㐀㤀䄀　㈀㠀㤀　䔀䐀　㄀㈀䐀䐀㈀　㘀㐀㄀㄀䌀䄀　㄀㜀㐀㄀㈀䘀㤀䌀㐀㐀㤀䈀㄀㠀䈀㔀䄀䐀䌀　㔀㄀㠀　䔀㘀䔀䐀䘀㜀㄀䘀㠀䐀㄀㈀䐀䈀㔀㠀㐀䄀䄀䔀䈀㤀　䈀㄀㠀䄀㘀㈀㠀䘀㄀㄀䈀䘀䔀㤀䄀䔀㄀䘀　㈀　㘀㌀䄀㤀㈀㘀㄀㌀䌀㠀㈀㤀㌀㈀㤀㄀㔀㐀㘀䐀䌀㠀㈀㐀㔀㈀䌀䔀㤀㄀䄀䐀㐀㤀䐀㜀㤀䔀䄀䌀㈀㔀䔀䐀　㈀㔀㤀㐀㜀㐀㘀䐀㔀㘀㐀䘀㄀䐀㠀䔀㌀㄀㤀㘀䔀䔀㠀㐀㐀㌀㘀䔀㈀䄀㜀䌀㤀㜀䄀㜀㈀㘀䌀䄀㄀㈀㘀㔀䘀㈀䈀㌀㘀䔀㐀㤀䐀㈀㔀㤀䈀㈀㠀　　㜀　㠀㘀㐀㈀䈀　㠀㐀㄀䈀㔀㄀㐀㜀㜀㈀㤀䄀㘀㈀㐀㐀䌀䐀㔀㌀　㈀　䈀䈀㌀䄀䄀䄀䔀㌀㔀䄀㄀㌀㌀㔀㔀㌀䈀䐀㐀䐀㄀䈀㄀䐀㈀㄀䄀㔀㘀㔀　　㘀㄀㠀㠀㔀㄀䔀㘀䐀㔀　䐀㜀㈀㠀㤀㌀㈀㜀㘀䘀㐀㠀㄀㤀䔀䔀㐀㔀㤀㄀䈀㈀㈀䌀㠀䐀䌀䈀㠀　䈀䄀㠀㔀䔀　㄀　䐀　㈀䐀㈀㤀　䘀㔀㤀䐀䔀䄀㌀㠀㐀㈀䔀　䘀䘀䈀䌀㄀㌀㠀䘀㈀䈀　㄀㌀㘀㈀㈀　㌀㐀㔀㔀䐀㄀䈀　㈀䔀㤀㐀㐀㤀㔀㌀㠀　䐀䐀㠀㐀䘀㜀　䈀䈀　㤀䈀㘀　㄀䘀㌀䄀㜀㔀　䐀㔀䐀䌀㄀㤀㄀㠀㘀㌀　㠀㈀　㐀䄀䐀㈀　㌀㤀㐀㐀䐀㈀䈀䄀㜀㘀㜀㠀㄀㄀㤀㐀㄀　㄀䐀䔀㄀㄀㤀䄀㌀㌀䌀㐀㔀㠀㔀䐀㈀㈀㜀䈀䌀㄀㤀㘀㤀䄀䈀㄀㔀㐀㔀㠀㌀㄀㈀䌀㘀㈀㈀䈀䈀㐀䌀䔀㌀䈀㤀㘀㌀䐀㜀㐀㔀㠀䄀䈀　䔀㌀㐀䐀㐀䐀㤀　䄀　㔀㤀㔀㜀㠀㐀䈀䐀㘀　䔀　㤀㄀㠀㐀㄀㈀　䘀㄀㌀䔀䌀䈀　㈀䔀㐀㠀䐀㈀㄀㄀㤀㔀　㐀㌀䈀　㤀㤀䔀㐀䔀䈀　㤀㌀㤀㈀㈀㌀䘀䌀　䌀䔀䈀㠀㈀㐀㐀䌀㌀䈀䄀㔀㈀㐀　　㤀㔀䐀㈀㤀㤀㈀㠀㄀㘀　㜀㘀㈀㈀㈀䔀䔀　㔀㐀　㔀䘀㜀㄀䈀㔀㌀䔀㌀㌀㘀䌀㈀㘀㐀䔀　㐀㘀㌀㠀䌀㌀㜀　㠀䘀㠀㘀㐀㌀　䌀㘀㔀㐀㘀㈀㄀䄀䌀㤀㘀㌀㄀㌀㠀䄀䘀㠀㘀㄀㤀㠀㐀䈀㈀䘀㜀㌀㠀㘀㈀䄀㤀㈀㄀㈀䈀䄀　㌀㐀㄀䌀㄀䐀㐀㐀䐀䄀䄀㈀㜀㄀㐀㈀䐀䐀㐀㈀䐀㘀䈀䈀㜀㜀䐀㔀㌀㤀㄀䈀䄀䐀䔀㤀䄀㈀㤀䄀㔀㔀䔀㜀䐀㔀䔀㔀䘀㌀㐀㌀㔀㌀䌀䐀䈀䄀䌀䐀䐀㌀㐀䐀䘀㜀㘀㤀䐀㤀䄀䌀䄀䄀䐀㌀㈀䈀䄀䄀㜀䘀㔀㈀㜀㔀㜀䔀㐀㜀㜀䐀㤀䈀䘀㜀䔀䘀䐀䘀䈀䔀䐀㤀㐀㜀䈀䔀䄀㠀㄀䌀䄀㌀　䄀㄀㠀㌀䐀䌀㤀㘀㐀䄀㔀㤀㤀䔀㌀㄀㄀㤀䈀㐀㌀䔀䌀　䈀䘀㈀䔀䐀㜀䄀㤀㤀㠀㌀䐀䌀㌀㐀䘀㐀㔀㜀㜀䈀䘀䈀㤀䌀䌀㌀㜀䌀㄀㘀㔀㌀㈀䘀䐀㠀䐀㜀䄀䌀㌀䔀䌀䔀䐀䄀　䈀䌀䔀㐀䄀㄀㐀㔀㤀䐀䔀㐀䘀㘀䈀　䐀䐀㌀䐀　㤀㠀䐀㘀㔀㠀䄀㈀㌀㔀㠀㠀䐀㘀㌀㠀䄀䄀㌀㔀㐀䐀㘀䈀㐀䐀䐀㌀䐀　㤀㠀㔀㘀㤀㔀㄀䐀㤀㈀　㜀䌀㐀㘀㈀㜀䄀㘀㄀䈀㄀㐀䔀㠀䐀㠀㤀㐀㔀䐀䔀㐀䐀㠀䄀㔀㔀䐀㤀㐀㄀䈀䐀䄀㔀㐀㘀䐀㔀㘀㘀　㜀䘀㘀㈀㄀䈀㔀㐀㘀䐀㐀䐀䄀㔀㄀䈀㔀䔀䔀㠀　䐀䄀㘀䌀㘀䔀㘀䌀䄀㤀㔀㄀䈀㔀䘀㤀　㐀㌀㤀䄀　䐀㘀㠀䈀䐀䄀㌀　䄀䄀㌀㘀㄀䔀㔀　㤀䈀䌀䐀䈀　㈀䐀㌀㔀䄀䄀䈀㘀㈀㐀䌀㔀㔀䌀㌀䘀䌀　㜀㠀㌀㄀㄀䄀㔀㄀䔀䈀䐀㔀　㄀䈀㔀䐀㤀㄀䌀䐀䈀㔀㈀䄀㌀㘀䄀㐀䈀㤀㈀䌀䌀㘀䈀㔀㄀㘀䈀䌀㘀䐀㐀䈀䔀䌀䔀㜀㜀䐀䘀䄀䄀㄀㌀㐀䌀䘀㘀㜀䐀㈀㔀㤀㜀䄀䌀㌀㈀䄀㈀㘀㐀㈀㘀㄀㠀㤀㈀㘀䌀㄀㠀䈀䐀䌀㌀䈀　㄀㠀䘀䌀㌀䐀䈀䌀䌀㠀䘀㄀㔀㌀䄀䈀䌀䄀䄀㘀䘀㌀䄀㄀㔀㤀䘀䘀䌀　䘀㈀䄀㈀䈀㌀䐀　䘀㐀䘀䄀㤀㈀㔀㔀䄀㜀　䈀䐀㘀㤀㜀㐀㄀㤀䈀㜀㈀䌀㜀㠀㠀㔀㌀䐀㌀㔀　㔀䔀㔀䌀　㄀㘀㌀　䄀㄀㠀㔀䈀䌀　䈀㠀　㈀䌀㘀㤀㜀㌀㠀㈀䔀㘀㐀䄀㄀㄀　　㘀㘀㠀䘀㘀㌀　㔀䘀䘀䘀　䈀䔀㌀䘀㘀䐀㈀䔀　㤀㐀䔀䄀㌀䘀㄀㐀㄀㜀㜀㤀䐀䘀䘀㜀㌀䄀䌀㈀䌀䈀㠀㈀㄀䈀　䄀㠀㈀㜀䈀　䌀㘀㌀䄀㘀㤀㤀䈀䌀㌀㠀㔀䈀䐀　㤀㄀㈀䈀㘀　㜀䌀　㄀㄀㌀　䄀㤀㠀㔀㠀䌀　䄀㐀㄀㈀䌀㜀䈀䐀䔀㐀㜀㤀㌀䄀㘀㘀䈀㘀㈀䈀㘀　㜀㐀　㄀㘀㌀䄀㘀㤀㤀䘀䌀䄀䌀㘀䄀　䈀㌀䄀㜀㈀　㔀㠀䌀㈀䘀㘀　㐀㈀　㄀㌀㌀　㐀㐀㠀䘀䈀䔀㌀　㌀㜀㐀㄀㐀䄀㌀䈀㌀㠀䌀㜀䔀䐀㤀㤀㄀㜀䔀㘀䌀㘀䘀㤀䔀㔀㘀䌀䐀䈀䄀䌀䈀䌀㘀㐀㤀㌀㘀䔀䔀㐀㘀䘀㘀䌀㐀㐀㘀㤀㘀㔀㈀㈀㌀䌀䈀䄀䌀㤀㔀䈀䐀䄀㜀䄀䌀䘀㐀㜀䌀䄀䄀䔀䐀　䈀㔀㤀㜀㐀䈀䐀㈀䌀䌀㠀㔀䔀㌀㠀㈀䘀㔀䌀㄀　㈀　　㠀㄀　㘀㐀㤀㔀　䔀䈀㈀㠀㈀　㜀䌀㄀㠀㌀䔀　㐀㄀㜀　㤀㤀㈀㔀䘀㤀　　䐀䈀㄀㜀䌀㈀㐀㔀䔀㄀䄀㈀㜀　㔀㄀䈀㠀㈀㠀㔀䌀㄀㐀㈀䔀　䔀㤀䌀㜀㐀㄀䈀㐀㔀㘀䔀㄀㈀㌀䌀　㤀㤀䔀　㐀㐀䘀㠀㈀㈀㜀䌀㄀㤀㌀䔀　㐀㤀䘀　㈀㐀㌀㠀㄀䘀㔀㜀䄀㔀㄀䌀㜀㘀㄀　㠀㌀　㜀㜀㜀䈀䌀㜀㔀䈀㤀㘀㤀㤀䄀㠀䈀䈀㘀䔀䐀䄀䄀㠀䈀㜀㘀䐀㤀㜀䌀㤀䘀㌀䘀䘀　　㄀㤀㘀㜀䐀㜀䈀㌀䔀䐀䘀䌀　䄀䘀䘀䌀㤀㐀㠀䘀䈀㈀䘀䐀㜀䌀㜀䔀㌀㔀䌀㐀㠀䄀㐀㌀䘀㈀䘀䄀䘀㐀䄀䌀䘀㤀䐀䐀㤀䐀㌀㘀䌀䘀䔀㐀　㘀䐀㌀㤀䘀㘀㄀㘀䈀䐀䐀㜀㘀㐀䐀㜀㔀䌀㘀㜀䘀㤀䘀䐀㘀䈀㜀䐀䈀䌀䄀㈀㔀㤀䄀㔀䔀䈀㜀䈀䘀䄀䈀㔀㤀㜀㌀䐀㌀㔀㔀㔀䘀㤀䄀䘀㤀㘀䐀䈀㌀㤀㄀㘀䈀㘀㘀㔀䔀䄀䔀䈀䘀䄀䔀㤀㜀㠀䈀㜀㔀㌀㌀䈀䈀㤀䘀䈀㌀㐀㈀䈀䔀㜀㄀䈀㈀㠀㘀㠀㔀㜀㤀䈀㜀㘀㠀䐀㜀㐀㌀㜀䐀䐀㌀㈀䐀䘀䔀㤀䔀䔀㌀䄀㈀䄀䘀䘀䐀㘀㠀㌀㜀䈀䘀䄀䔀䐀䈀䘀㘀䐀㜀㜀㘀㈀㐀䘀　㤀䐀䌀㜀䘀䈀䄀㘀䔀㤀㔀㠀㘀㐀㔀㜀㜀䐀㤀䘀䐀䘀㘀䌀䐀䄀㤀䐀䘀䄀㠀㜀㜀䈀䘀䌀䔀䘀䐀㐀㌀䘀㈀䔀䔀㘀䌀䈀䘀㘀㘀䔀䔀㜀䌀㘀㘀䌀䈀㤀䈀㠀㄀䐀䈀䄀䔀䔀䐀䈀䌀䄀㈀㔀㤀䄀䐀䐀㘀䐀䔀㘀䄀䈀䔀䄀䘀㌀䔀㈀䔀䔀㘀㤀㠀㌀㔀㜀㔀㤀㜀㐀䌀䈀㠀㘀㔀㌀䘀䐀㐀㌀䈀䈀䔀㈀㔀䔀㐀䘀䐀㘀㌀㜀䘀㜀䔀䐀㐀㘀㔀㘀㐀㐀㜀䔀䐀㜀䌀㜀㤀䔀㄀䄀㔀䌀㜀㈀䘀㘀䈀㐀㜀䄀㐀㐀䌀㘀䘀　㈀㜀㠀　㌀䔀㄀㠀䘀䌀　䐀㠀　㈀䘀㌀㐀㜀䘀　㐀䔀㠀　㜀㈀㔀㜀䘀　㔀䔀㠀䌀㜀㈀㌀㜀䘀　㘀䐀㠀　䐀䐀㐀䐀㤀㜀䌀䐀㔀㌀䌀㔀䔀㐀㤀䘀㔀䌀䘀㐀㘀䘀㐀䔀䔀㘀㤀㜀㔀䘀䘀㌀䌀䈀㠀㜀䘀䔀　䐀䄀㌀䘀䐀　䔀䌀㄀䘀㄀㠀䘀㘀㌀㜀䔀㐀䘀䈀㄀䈀䐀䔀䄀㤀㘀㐀䘀㤀㐀㤀䄀䌀䘀㈀䈀䘀㘀㔀㠀䌀䐀㠀　㠀䘀㄀㜀䘀䌀㠀㄀䔀㌀㄀㔀㔀㤀㠀㐀㈀　㈀㠀䘀䔀㔀䐀㄀䐀䈀㌀㜀䘀䘀　　㤀㤀㔀䌀䔀䘀㠀䈀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㐀㌀㈀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀䘀㈀䘀㐀䌀㘀㤀㜀㌀㜀㐀㈀䘀㐀䌀㘀㤀㜀㌀㜀㐀㐀䔀㜀㔀㘀䐀㘀㈀㘀㔀㜀㈀㘀㤀㘀䔀㘀㜀㈀䘀㐀㐀㘀㔀㘀㌀㘀㤀㘀䐀㘀㄀㘀䌀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀　㌀㈀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㈀㌀㈀㌀㐀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀㔀䐀㤀　䌀㄀㘀䄀䌀㌀㌀　　䌀㠀㘀䔀䘀㜀䔀　䄀㄀䐀䐀䈀㐀㌀㜀㄀䐀㈀㔀䐀㐀㌀㘀　㘀䈀㄀㤀䔀㐀䈀　㘀䔀㈀䌀䐀䈀　㌀㌀㠀䈀㘀㤀㈀㄀㤀㄀㘀䐀㤀㈀㠀䌀䔀㈀㄀㘀䘀㌀䘀䐀㤀　䈀㄀䐀㐀䌀㘀　㠀㌀䘀䌀䘀䘀㤀䘀䘀㠀㈀䐀㜀䐀䔀㤀䄀䔀㄀䐀䘀㤀　㐀䘀䄀㠀䐀㠀㌀䔀䐀㌀㄀䌀㄀䔀㠀䌀㤀㌀㄀㈀䔀㘀㄀㘀㔀㠀䈀㌀　䔀　䔀㐀㐀㤀䐀㔀㄀㔀㌀㠀㘀䘀䐀㌀䐀䔀㤀㔀䐀䈀䌀䔀㈀㘀㈀䄀㈀䐀㜀　䈀䘀㈀䐀　㤀䔀㜀㠀䔀䌀㘀䄀　㤀䄀　㘀䘀㐀䈀䈀㠀㠀㐀䈀䔀㈀　䐀　䔀㠀䘀㈀䔀　䌀㜀㠀㔀㐀䘀䄀㤀㔀㄀䐀䈀㈀䄀㜀　㤀　䔀㤀䘀㤀㜀㔀䔀䘀䄀㜀䔀㠀䐀䘀㄀㄀䈀㘀㜀䄀㐀　㐀㤀㔀㘀䄀㔀䈀㜀　㌀㠀䌀䄀䄀　㄀㜀㄀㌀㘀䘀㘀㘀㐀㘀䐀　　㔀㌀䈀㜀㔀㐀䔀㜀㐀㤀䘀䈀㘀㤀㌀㌀　㜀䘀㠀䔀㠀䘀㈀䐀㈀㈀㤀䌀㐀䈀㔀䘀䘀䘀㠀㘀䈀㄀䌀㄀䔀㄀㄀㈀㠀䐀㐀㔀㌀㘀㌀㐀䄀㄀㘀䄀㈀䄀䄀㤀㄀㘀㤀䄀㘀㜀䄀㤀㔀㘀㈀㄀䈀㤀㜀䘀䘀䄀㐀䔀　䐀䄀㌀䘀䐀㌀㈀㤀䌀䐀䐀㐀䘀䈀㔀䈀㠀䌀䘀㔀㔀䘀䐀㔀　䐀䌀䘀䈀㜀䈀䔀㘀䘀㈀䘀㜀䔀䔀䄀㄀䔀䌀䌀䄀㈀䌀㜀㤀䌀䄀　䔀㐀䄀㤀　㄀䌀䌀㄀㄀㌀䐀䔀䐀㜀㄀㐀㐀㌀䌀䌀㔀㐀㌀䔀㌀䘀　㤀㐀㤀㘀䘀㈀䈀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀　㌀㌀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㔀㌀㄀㌀㘀㌀㈀㌀㜀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㌀㄀㈀　㌀㄀㌀　㌀㈀㌀㌀㌀㌀㌀㘀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䐀䌀㜀䌀　㤀㜀㠀㔀㔀䐀㔀䐀㔀䘀㘀㌀䄀䔀㌀䈀䐀　㤀㐀㌀㐀㈀㐀㈀㤀㠀　㈀䔀㐀㠀㘀㐀䈀䌀㈀㄀　㈀　㄀　㘀㐀㐀㘀　㠀㤀㤀㈀　　㄀㤀㤀　㌀㐀㤀㐀　㐀㤀䌀㠀䌀　㄀㠀㐀　䄀㄀㠀䄀䐀㠀㘀䄀㄀㐀㈀㄀㜀㠀　㄀䄀䈀䐀㈀䘀㈀㈀㌀㈀　㤀㌀㠀　　䄀㔀㠀㘀䔀㠀㈀䐀㔀㠀　㜀䔀㠀㔀䐀䄀　䄀㘀㈀㄀㔀㘀䐀㈀䈀䈀㐀㔀㔀䄀䈀㔀㐀䄀㔀　䔀㘀㠀䘀㔀㜀㜀䘀䄀䄀䄀㐀㠀䌀䔀䘀㜀䄀䔀㜀䐀䘀㘀䈀㤀䈀㤀㌀㤀　䌀䌀㄀䈀㘀䘀䘀䘀㌀㌀䘀䌀䘀㤀㜀䔀㐀䈀䐀㘀䈀䌀䘀㜀䈀䔀䐀䈀䐀䐀㜀㔀䔀㜀䈀䔀䐀䔀㄀㠀㘀㄀㐀㈀㈀㘀䄀㠀㤀　䘀㤀䐀䄀䄀㈀㘀㐀䌀㐀㤀㐀䐀㘀䈀㤀䐀䈀䈀㜀㈀㈀䄀㤀㄀㌀㈀㄀㜀䄀㄀䌀㔀䄀㔀㤀㔀㈀㔀㐀䈀䌀㘀䘀㐀㔀㐀䔀䘀㈀㄀㄀䄀㜀㌀㤀㘀㐀㠀㌀䐀㔀㈀㜀䄀䔀䈀㌀㈀䐀䘀㤀㌀㐀㜀䐀䘀䈀㤀㤀䘀䄀㠀䘀㐀䌀㜀㐀㐀䔀㘀䄀㈀㠀䄀㈀㔀㜀㌀㈀䄀　㜀䔀䘀㘀㤀㤀㌀㐀㈀㌀㐀㜀㘀㈀䈀㔀㄀䈀㌀䔀　㤀䌀㠀㔀䈀㜀㔀㜀䈀䌀㤀䔀䐀䐀䔀䔀㈀㈀䐀㄀䈀䌀㐀䘀㠀㠀㔀䔀䔀䈀㌀㈀䈀㜀䈀䌀䄀㐀䔀䌀䈀䈀䘀㠀㈀䐀䐀㄀㈀㠀　䈀㜀䔀㄀䄀㌀㠀㄀㜀　㄀㌀㄀䘀䐀㌀䈀㈀　䈀䘀䐀㈀㄀㔀䘀䔀䄀䔀㜀㌀㈀䈀㤀㜀㈀䐀䔀䘀䈀㌀䔀䔀䌀㔀䔀㘀䘀　䈀䘀㐀㠀㌀㐀䈀䄀䐀䐀䌀㈀䌀㔀䄀㔀㈀㔀㤀㌀䐀䔀㔀䌀㌀㔀㠀䐀㤀㐀䄀㄀䌀㠀䔀㌀㜀䘀䄀　䈀㈀㘀㐀䘀㤀㤀㈀䈀㘀㠀㄀㄀㘀㜀䔀䌀㐀㠀䘀㐀㄀㜀䄀㔀䘀㘀㔀䘀㤀䈀㈀㄀㈀㘀䐀㠀㜀㔀㄀㐀㈀䌀䄀㌀䄀㈀䘀䘀㌀䈀㜀䄀㠀䄀㐀䈀㈀䘀䌀䐀㠀䌀㠀䘀㈀䐀䐀䄀㐀䐀䌀䈀㠀㠀㌀䄀㠀㐀䘀䌀䔀㤀㈀䌀㔀㐀䈀㤀㜀㔀㤀㌀䐀㘀㤀㈀㌀㈀㤀㘀䈀㌀䘀䔀㐀䘀㐀㐀䈀㘀䔀㈀㤀㔀䘀䈀㈀䈀㌀䘀㘀䌀㌀㠀䘀㠀㤀䄀㘀㠀䘀㈀㌀㘀䄀㤀䔀㐀䄀䐀䌀㔀㘀㐀䘀䘀㌀㔀㜀㜀㘀㄀䘀䘀䌀㜀㐀䘀㈀䄀䌀䄀㠀䔀㄀㔀䘀㜀䈀䔀㌀䈀㤀㄀㠀䄀㈀㔀䐀䔀䘀㜀㔀䔀䈀䌀㤀䘀㐀㔀䌀㜀䔀䌀㜀䐀㈀䔀䘀　䔀㔀䔀㤀䌀㄀㌀㐀䐀䐀䔀㐀㤀䘀　㐀㘀㠀㠀䘀㐀䘀䌀　㌀䔀䄀㄀㤀㔀㄀㌀䘀㤀䔀㌀㈀䄀㌀䔀㤀䈀䈀㠀㌀䐀䘀䄀䐀㠀㠀䄀㘀㔀　㠀䌀䘀䌀㘀㤀䘀㔀　㈀㠀㜀䈀㐀㌀䄀㐀㄀㔀㔀㄀㐀㐀䐀䘀䐀㐀㠀㈀㌀㄀㔀㌀㐀㤀䐀㔀㘀㄀㌀㄀㤀㘀䐀㔀㄀䄀䘀㠀䄀㔀㠀㐀䐀㔀䈀䄀㌀㌀䌀㐀　　㘀㜀㤀㠀䐀䌀䐀㐀㘀㜀䘀㄀㐀㄀　㘀䘀㔀㌀䔀䐀䘀㜀㔀㐀䄀㄀䌀㘀㜀㠀　䐀䈀㔀㤀㤀䄀㤀䄀䈀䘀䌀䄀㌀㤀䘀䄀㔀㌀䔀䐀㘀㌀㄀㔀䄀㌀䔀㐀㌀㜀　㠀　㤀䘀䄀㤀㌀㜀㘀㐀䘀䄀㔀　㤀㘀㈀䘀䔀㤀㘀㔀䔀㌀㠀䘀䘀㔀㤀㌀㤀㐀䘀䔀㤀䔀㄀㄀㐀䄀㘀䐀㌀䄀㈀㤀㤀㘀㘀㔀㘀㄀䐀　㤀㈀㠀䐀㘀㜀䈀㤀䄀㔀㄀㐀㘀㜀㐀䄀㤀㘀䐀㐀㈀㄀㈀㄀　㐀䐀㔀㌀䘀䐀㄀㐀䐀䘀䄀㔀㈀㠀䄀　㌀㜀㈀㌀䐀㤀䐀䔀㠀㌀㘀㘀㌀㄀䄀㄀㔀㈀㠀䐀㔀㔀㐀䄀㐀䔀䔀䄀㌀㄀䘀㌀㌀䈀㐀㐀䔀㤀㐀䄀䔀㄀䘀䄀　㔀䈀㤀　㜀㘀㄀䘀䘀䌀䄀㌀㐀　㠀䘀㜀　㔀䔀䄀㐀䌀䘀　㜀䐀䔀　㄀㠀㘀　㌀䐀㌀㠀　　䔀㌀㈀䔀䌀　㘀䄀　　㐀㤀㠀䌀㈀㜀䔀䄀㐀㌀䐀䌀䌀㜀㤀㔀㄀䌀㘀㄀㈀㈀䔀㐀㜀䐀　䄀㔀㔀㐀䔀㐀㐀䐀䄀　䌀㔀䌀㘀㌀㐀䔀䈀㈀㈀䔀䄀䐀䈀㘀㠀㤀䌀䄀　　䄀㘀　㄀䈀䐀䌀䈀䈀䘀㐀䘀㜀䔀㠀㜀㄀㜀㌀　㠀㔀㔀䌀㈀䈀䘀㄀䈀䘀㤀㠀䔀䔀䄀㐀㐀㠀㌀㌀㠀　䐀䘀㈀㘀䌀㌀㐀䘀㜀䐀㄀㈀㘀㠀㐀㘀䘀㐀㔀㜀䌀㈀㤀䌀㈀䈀㘀㠀㄀㄀㘀䌀　䈀䘀㄀㌀䔀䔀㤀㤀䌀㠀䐀㜀㔀㜀䈀䄀㈀㌀㌀䌀䔀䈀䄀㤀㌀䐀㔀㌀䌀　㐀㐀㜀㠀　䘀㤀㐀䈀㌀㔀㘀䈀㘀䈀㜀㤀䈀䘀㘀㘀䈀㄀䄀䄀㠀㈀䘀䈀㔀䘀䔀㠀㘀䈀㘀㄀㐀䄀㈀䌀䌀㌀䌀㘀　㌀㔀䔀䄀㤀㠀　㠀㤀䄀　㌀㠀䌀㐀㔀㤀䄀㔀㠀䐀　　䌀䄀　㔀䄀㌀㤀㐀㄀㘀䈀㤀㐀㄀㌀䐀㘀㈀䔀䌀㐀㠀㌀䐀㈀㐀䄀䐀㐀㔀䘀䌀䐀䔀㄀㐀　㤀㘀䄀㐀㘀㌀㔀　䌀䔀㈀䄀䌀㐀㠀䘀㐀㐀䈀䔀䄀䔀䘀　䄀䘀㠀㐀䈀䈀　㌀䘀㠀㌀　㐀㄀䄀㌀㠀　㐀㐀䄀　䈀䈀㜀䄀㠀　㠀㘀䄀㠀䄀䐀䔀㤀㌀㤀䐀　㔀㐀䈀㐀㜀䘀䈀䄀䐀䐀㘀䔀䔀　　㐀䌀䐀䔀㔀㌀㘀㠀㜀䐀䄀　㐀䘀䔀㈀㔀㐀䘀㤀㜀䌀㈀䔀㘀㜀㄀㘀䌀㌀㠀㔀　䔀㜀㜀䘀　㄀㜀䔀㜀㔀㠀㠀㜀㔀　䔀㌀㐀㈀㈀㠀䌀㌀㜀㌀㜀㔀㘀䈀䄀㤀　䄀䈀䘀㔀䄀㜀㈀䄀䐀　　㔀㐀　㌀䌀㌀　㐀㤀㜀䐀㠀㔀㈀䄀䘀㔀㜀㄀䄀㐀䄀　䈀䘀㄀䔀㌀㘀䌀䔀㤀㄀䌀㘀㠀　䔀㐀㜀㌀㌀䘀䈀䐀　䐀㔀䌀䄀䘀㤀㜀䐀㄀㜀㠀䘀㠀㄀㔀䘀　㌀㤀䌀㔀㜀㠀㠀䄀㌀㘀䈀㌀㄀䘀䈀㠀㐀㄀㘀　䄀㤀㜀㔀㔀㄀䐀䘀㐀䄀㌀䈀䈀㐀䄀䘀㘀㠀㌀　䔀㈀㔀㘀㤀㠀㄀䈀䐀㄀㠀䔀㌀㈀䘀㐀㜀㜀㌀䘀䔀　㄀䈀㐀䄀㔀㔀㌀䘀䄀㄀䐀䔀㘀㘀㄀㈀䐀䐀　㔀䘀㤀䌀䄀㐀㈀䘀㤀㜀㜀　㌀䐀䈀㔀　䔀㘀㠀㜀㐀㈀㄀䔀䌀䄀㘀㠀㈀䄀䔀䄀䔀䘀　㌀䐀䄀㔀䘀㌀䘀㈀㜀㘀㐀㘀㠀㌀㔀䌀　㤀㌀䘀㜀㌀㌀䄀㜀㤀䘀䈀㠀㘀䘀䔀　䈀䘀㄀䈀䔀㌀㌀䄀㄀㤀㜀㔀㜀䐀䌀䘀㌀㌀㄀㈀䘀㤀䄀㜀　　䄀㌀㌀㄀㈀䔀㔀㔀䌀　㐀㈀䔀㘀　㜀䘀㔀䄀㜀㜀㈀㤀䘀䘀㌀䈀㠀㈀䈀䐀㌀䔀䄀㠀㜀㈀　䔀䐀䘀䈀㐀㠀㌀㌀㤀㌀㠀㄀䘀　䈀㘀　㈀㘀㠀㌀䈀䌀䈀㈀㐀䔀㜀䔀㄀䘀䌀㈀㠀㈀䈀㐀㤀䌀䄀䔀㄀䄀䔀　㘀㐀䄀䈀䈀㤀　㘀㘀㌀䐀䘀䄀䘀㔀㈀䌀䄀㠀　䔀䌀㐀㌀㄀　䘀　䔀㠀㐀㤀䌀㐀㤀㈀　䔀䔀㌀㠀䌀䄀㘀㤀　䘀㤀㠀㐀　㈀㜀䄀　　䘀㜀　　䔀䐀㠀　㔀㈀䌀　　㠀㘀　㈀㘀㌀㠀㄀䔀䔀䄀㠀㤀䈀㔀　䄀䘀㈀㘀䔀㐀㄀㔀㌀㈀䌀㌀䈀㈀㈀㤀䔀㐀　㌀䈀㈀㘀㄀㤀䌀㐀　㄀䘀㠀㈀㌀㜀㈀㄀䈀㌀㜀㘀㄀䈀䈀㘀㠀㤀䘀㄀䈀㐀䔀㜀䌀䌀㐀䔀㔀㤀㄀㘀䐀㜀㤀㌀㘀㠀㄀䔀䄀　　㔀㄀㈀㠀㤀㔀䌀㈀㘀䌀䘀㄀㜀㤀㘀㔀㤀䘀　㔀㈀䔀㌀㤀㐀䌀䐀㜀㌀㠀䄀㘀㔀䌀㘀䄀㄀㐀㈀䈀䔀㄀㜀　㠀䈀㤀䘀䘀　㜀䈀㜀㤀㌀㘀㔀㈀䄀㐀㐀㌀㄀䘀㜀䘀㐀䘀㌀㌀㐀㤀䄀㜀㤀㄀　㜀㌀㄀　䈀㈀䔀㔀㔀　㤀䔀㜀㜀䔀　㤀㤀䔀㜀䌀㌀㐀㘀㌀㔀㤀䘀䐀㘀　㠀㜀䄀㠀　㔀㘀䈀㈀䌀䌀㌀㈀㜀䘀　䔀䔀㔀㜀䔀㘀㄀㔀㤀㄀㌀㜀䐀㠀㈀㌀㤀㈀㄀䔀㤀䘀　䈀　䈀㘀䘀㘀㄀㔀㜀㌀　㐀㔀㐀㠀㌀䔀㈀㤀㘀䈀㈀䈀䔀䐀㈀䄀㄀㐀䔀㔀䘀㠀㐀䔀㠀㔀䌀䐀䄀㠀䐀㌀㈀㠀䈀䌀䐀䐀㤀䐀　㈀㤀㌀䈀㘀㠀㠀䌀䈀䔀㠀䌀䌀㘀㘀㠀　䘀䐀㈀㘀䌀䘀䐀㜀㌀䌀䄀䐀㈀㜀䄀㔀　㄀䘀䄀㌀㈀䘀䌀㈀䐀　㄀䔀䄀㐀　䐀䄀䄀䔀㜀㘀㤀䈀㈀䘀㜀㄀㠀䘀㔀䌀㜀㔀㠀㐀䔀㠀　䘀䘀㘀㄀㄀㜀䐀䐀䌀㐀䘀　㤀䌀㔀㘀䔀㘀㄀䈀䌀㜀䐀　䌀䔀䘀䐀䔀㠀䌀䘀䐀㌀䘀㐀　㠀䘀䄀䘀㐀㘀㘀䘀䐀䈀㐀䐀䄀㐀㔀㌀䘀䄀䐀㄀㠀䌀㘀㜀䔀䔀䈀㈀㌀㠀㌀㤀㐀㤀㌀䌀㘀㜀䔀䘀㔀㐀䔀䔀㄀䈀䔀㠀㐀䈀䄀䄀㄀㄀䌀䈀㌀䔀㌀㤀㠀㌀㈀䌀㈀䔀㌀㜀䔀㘀㠀䘀㠀䈀䘀　㈀䘀㔀㠀䌀䈀㄀㄀䘀㌀䄀㜀㌀䈀䘀䘀㔀䈀㄀㜀㄀䐀䄀䈀㈀䐀　㤀䔀㠀㜀㜀㠀㐀䔀㜀㠀䌀䔀㈀䈀㜀䐀　㄀㤀䘀㐀㌀㄀㄀㔀䔀　䈀㔀㐀　㄀㌀䐀䈀䐀㈀㤀䌀䄀㈀㘀䔀䘀　㈀䄀㔀䌀䔀㤀㌀㐀䘀䐀㄀㈀㘀䐀㄀㔀㜀䌀　㘀㈀㌀䐀㤀䐀㠀㘀㄀䄀䔀㤀㌀㐀㐀㠀㌀䘀㠀㘀䘀㄀㠀㤀㠀㌀㤀䔀䌀㜀㔀䌀㐀　㜀㠀䈀䔀䘀㄀㌀㜀㌀䄀䄀䄀䄀䐀䌀㜀㔀㠀㤀䘀䈀㘀䘀䔀䄀㈀㔀㐀㔀㄀㤀㔀㠀䄀㌀㈀㌀䌀㜀㄀㔀㐀䄀㈀㘀䔀㠀㐀㐀䔀㐀㌀㔀䐀䔀䄀㄀㤀㔀䄀䌀㤀䔀　䘀㈀㐀㄀㤀㜀㠀㐀䌀㤀㔀㄀㈀㌀㤀㤀㜀㌀䌀䈀㤀㈀㐀㌀㄀䐀㜀㤀㜀㔀㔀㌀䐀㘀䘀㤀㔀㈀䄀㘀㄀㈀㐀　㐀䐀䌀䌀䈀䘀㔀㌀㄀㈀䔀䘀㐀䈀㜀䌀　㌀㜀䌀　䐀㌀㤀㄀䄀　䈀㤀㤀㘀䌀䌀䘀㘀䈀　㌀䔀䈀㘀㜀䈀㄀㌀䔀㐀　㐀㜀　㌀䄀䈀䄀㔀䈀䌀䌀䔀　䘀䌀㤀䔀㜀㐀㤀䐀䄀　㌀䈀䄀䐀㘀㤀㄀㐀䘀㤀㜀㤀䌀䌀䔀㜀㜀䌀㤀㘀㜀㜀㌀䈀㜀㔀䌀䈀䄀䄀㤀㔀㠀㔀䈀䄀　䐀䘀㤀䐀㜀㤀㠀䄀䈀䄀䔀䔀㜀㌀䐀䄀䌀䘀䘀䄀㤀㄀㜀㔀㄀䌀䔀䈀㐀㠀䐀㘀㜀㌀䄀䌀㘀㜀㤀䌀䘀㐀㘀䔀㄀䄀㤀㘀㌀䘀䄀　䔀䔀㠀㌀㄀䌀䈀㌀㄀䔀㜀䔀㠀㔀㠀䄀䔀㐀䈀䌀䔀䔀㈀㈀㤀㄀　㜀㄀䔀䐀䘀㤀㔀㜀㌀㄀䘀㜀䄀㄀㠀䔀㌀㌀䐀䐀䐀䈀㈀䌀䌀㄀䌀䔀䈀㌀㄀䘀㌀㈀㤀䔀䈀㜀㄀㈀䐀䌀㘀㜀䄀䐀䌀㐀䌀㠀㌀䘀䈀䌀䘀㠀　㘀㄀㌀䐀㠀㘀䈀䔀㔀㠀㄀䔀㔀䄀㔀㌀　䈀䄀䌀㜀䄀䈀㤀㤀䔀䘀㘀㜀　䐀㘀㔀㈀㌀䈀㤀䌀㤀䄀㌀㤀䔀䈀㈀㠀㘀䌀㠀䈀㐀䄀䄀㤀䌀䘀㜀㘀　䈀㜀䐀䘀㌀　㔀䘀䐀㐀䌀䄀䌀䄀㌀䐀㌀　㐀㜀䘀㄀㄀䔀㘀㐀㄀䈀䄀䌀䈀䈀㠀㠀　㜀㄀㠀㜀　䔀㄀㐀䘀䌀䔀䔀㤀　㜀㌀㄀　䘀䐀　㤀䈀䔀㄀㜀䔀㠀䌀㔀䔀㠀䘀㌀䌀䐀䈀㐀　䔀䔀䐀㘀㠀䄀䘀㔀㔀㘀㌀㌀䔀㈀㈀㄀䌀㤀㠀䌀㤀㜀䐀㈀㈀䌀㘀㠀㈀䄀㠀㄀䐀䄀䘀　䈀䈀䌀㈀㘀㘀䄀㌀䘀㐀㜀㌀䘀䘀㌀㔀䄀䈀㐀㤀䔀㔀㘀㘀䄀㘀䘀䌀㈀㔀䔀䔀　䈀䌀䘀䐀䄀㤀㤀㔀㔀㠀㈀䘀㐀㘀䐀㈀㜀㐀䘀　㜀䔀㔀㈀㠀㐀㘀㄀㐀䐀㘀㔀䌀䄀㘀㄀䌀㘀㜀㐀䐀䄀㘀㔀㤀䔀䄀㜀㌀㐀㌀䐀㄀䘀䈀䄀䘀㘀㄀㠀㤀㔀䘀㄀㔀㠀㜀㄀㌀䈀㤀㠀㄀䘀㄀䔀㜀䈀䔀䘀㠀䘀䄀㠀㠀㔀㌀㜀　䔀㜀䄀䔀㈀㌀㐀䘀㔀䐀㌀㤀䘀㐀　㤀䄀㌀㠀㠀䄀㐀㐀䈀䄀㄀䐀䄀㈀　䘀䐀㈀䔀㤀㌀㄀㈀㄀㄀㜀㤀䌀㜀㜀　㄀㘀䌀㈀䌀䘀㐀㠀㔀䄀㜀㤀㐀㌀䌀㤀　䐀㤀䘀㄀㐀㠀䌀㌀䔀㔀䔀䐀㄀㐀㜀㤀䐀㈀㈀㤀㐀㘀䘀㘀䌀㜀㘀䔀䐀㄀㄀㜀㈀㈀㌀䘀㘀䌀㄀㄀㤀㘀㘀㄀䔀䔀　䈀㤀㐀㘀㤀䌀㘀䐀㄀㘀㐀㘀㄀㐀䘀㤀䌀䄀㜀䔀䐀㐀㘀㌀䔀㐀䐀䌀㜀㄀䌀䐀䄀䔀㤀䄀㤀䄀㈀㤀䐀㘀㘀㌀䔀䔀㘀㔀䌀㄀䌀㌀䐀㠀䔀㌀㈀䘀㘀㈀　㔀䘀㄀䔀䘀㌀㠀㈀㜀䌀㄀䐀䌀㐀㜀䄀䘀䐀㜀㌀㤀䄀㠀㄀䘀㤀䈀㔀　㘀䈀䄀㘀㤀　䐀㜀㐀　䔀　㤀䘀㤀㈀䘀䈀㈀㈀䔀㘀㠀䘀䈀䐀㄀㤀䔀䔀㔀䐀　䔀䈀㠀　㔀㘀㠀㔀㌀䔀䐀䄀㐀䘀䔀䐀㠀䌀㈀䄀䘀㐀䔀㄀　㈀䐀㄀䘀㘀㈀䌀䐀䐀䐀㘀䈀㄀䐀㔀㌀䌀㜀䘀䈀㐀㜀䐀㤀㐀䌀䌀㌀㈀㘀㈀䘀䔀㄀䌀㜀䄀㤀㠀䔀䐀㠀㤀㤀䘀㔀㌀㐀　㐀䘀䄀㄀㘀䌀㜀㌀　㄀䄀䐀㐀㜀䐀㠀㜀䄀　㌀㜀䄀㄀㈀䘀㔀䄀䔀㐀㔀䐀㠀䈀䐀㤀㠀䈀䘀㈀㤀㤀㠀䈀䈀䘀㜀㈀㄀㜀䘀㠀㈀䐀㐀䐀䈀㠀㐀䈀䄀䔀䘀㐀㌀㌀㠀䔀㜀㄀䐀䌀㤀䈀㘀　䌀䐀䈀　㠀㌀䌀㔀䘀㌀䌀䔀㤀㄀㐀㘀䈀㔀㘀　㤀㌀䈀㠀　　㐀　䘀㘀䌀䄀㜀䄀　㜀䔀䔀䐀㈀㌀䐀䄀䄀㤀䔀㔀䐀㄀㄀䄀䌀㠀䘀㄀㈀㠀䔀䘀䌀䘀䐀㄀　䘀䄀䈀䄀㠀㌀㜀㔀䐀䐀㌀㠀䘀㜀㔀㐀　㄀䄀䌀㄀㌀　㌀　䄀䐀㔀㌀㔀䄀㌀㐀䘀䐀　㐀㜀㐀㤀　䐀䄀㤀䘀䘀䔀㠀　㄀䄀㤀䄀䌀㄀䌀䐀㘀䈀䔀㠀㘀㄀䘀䐀㘀䔀㤀䄀䄀㜀㐀䘀䄀㌀㌀㐀䄀䐀㄀䘀䔀㘀㘀䔀㈀䈀䔀䄀䄀䐀䘀䘀㄀䔀㜀㌀䘀㔀㔀䈀䐀䄀䄀㈀㐀㔀䐀㄀㈀䌀䘀䐀㈀㔀䐀䄀䄀㈀䐀㜀䐀㄀㌀䄀䘀㘀䔀䈀䈀㄀䐀㐀㔀䐀　䈀䄀㈀䘀䐀㐀䘀䌀㄀䈀㘀䔀㐀䘀　㔀㜀㘀㤀㈀㈀㠀㜀䄀䈀㜀䘀㠀　㜀䘀㄀㌀㄀㔀䔀㤀䌀㌀㤀㄀㜀䘀　䐀㈀䐀䐀㈀㘀㜀䐀㄀㔀㈀䄀䐀　㘀䈀㈀䘀㜀㌀䄀㐀㔀䔀䄀㄀㔀㄀㠀㘀䈀䔀㐀㌀㌀䔀䔀㠀㜀㤀䌀㜀㐀㐀㔀䘀䔀㈀䘀㔀　䄀䔀㠀㐀䘀㈀㄀䔀㄀㔀㘀㤀䐀㌀㌀　䈀㜀㔀㘀䌀㌀䘀䐀㈀䐀䐀㘀㐀㄀䄀㐀㄀㌀㜀㔀㌀䌀㘀㔀䔀㔀㌀㈀䘀㐀㌀㄀䐀㐀㔀䈀䔀㐀　䈀㠀㌀䔀　䐀㔀㠀㄀㠀䈀㘀㜀㜀㔀㈀䌀㔀䄀㤀㔀㠀㜀㌀㄀　㔀䈀䘀䔀䌀㘀䔀䌀㐀㈀䘀㜀㠀　䐀䘀㄀䔀㤀䘀　㜀㠀㄀㤀䘀䔀㐀㐀㌀䈀䈀㤀㔀䌀䔀㐀䔀㌀㌀㐀䘀䄀㄀㘀㄀䄀㠀䔀㜀䔀㜀䄀　䈀㐀㠀䈀㈀㘀㤀䘀䐀㈀㐀㜀㔀㌀䐀䔀䐀　㜀㜀㘀䄀㠀㘀䘀㔀　䄀㘀㜀㘀　㌀䐀䐀䄀䔀㌀䌀㘀䔀㄀䐀㐀㄀㈀㜀䔀㜀䈀㠀㌀　㈀㘀䐀䌀䄀䘀　䘀㔀　㜀䔀　䌀䘀㐀䐀㄀　㜀䐀　㌀㌀䌀　䐀䐀㜀　䘀㜀　㈀䘀䐀㄀㔀㜀　䐀　䘀㘀䌀㌀㜀㘀㄀䈀㐀　㘀䘀　㈀䄀䈀㔀　䘀㘀㌀㄀䐀　㐀㌀䈀䌀㈀䘀㘀　䄀㠀㄀㤀㌀㐀㤀　㈀㤀䌀㈀䈀㘀　㄀㤀䈀㠀　䐀䘀㌀㤀㜀㄀䔀㄀䔀　㜀䄀㈀䔀㄀㜀㄀䔀　䔀㈀㌀䐀䔀㌀䄀䐀㈀䌀㠀䘀䘀㐀䈀䄀䌀㌀㔀㠀　䘀㈀㤀㔀㜀㔀㠀㐀䔀㄀㐀䔀㠀䘀㜀䔀㄀䔀㠀㠀䘀䄀　㘀䔀䄀䐀㜀㔀䈀㐀㜀㄀㠀㤀　䌀㔀㌀䌀㠀㘀㜀㤀㄀㜀䈀㔀䘀㘀䐀䌀㐀䄀䄀䐀䈀㔀㘀䔀　㠀䔀䘀㠀䌀㜀䌀㈀䔀䈀䘀㄀㄀㠀䘀䘀㤀䘀㐀㐀䈀䔀䄀䄀䄀㤀㄀䘀㔀䐀䘀㐀䐀䘀㄀㜀㐀㌀㔀䔀　䄀㜀㔀䘀㔀㠀㌀䘀䄀㘀㠀㜀䈀㜀䐀㄀㄀㤀　䘀䐀　㌀㘀䐀㜀㠀　䈀㜀䌀㈀䄀㠀㠀䘀䄀㤀㔀䌀㄀䈀䘀䔀㘀㔀䐀䔀䘀䔀㔀㔀㘀　㜀䌀㔀䈀　㄀㜀䐀㐀㔀䘀䘀䘀䔀㠀㌀䔀㈀㘀䌀㄀㤀䄀㈀㔀㠀䔀㔀㠀䌀䘀㔀㈀㜀䐀　㘀㤀䌀䄀㄀㤀㘀䄀䄀㔀䘀䐀　㠀㌀㈀　㠀䌀　䐀䘀　㜀䘀䔀㔀㠀䄀㜀㌀䘀㤀䐀㜀㄀㐀㈀䘀㠀　㘀㄀㄀䔀䔀㄀䄀㌀䘀㌀㔀䌀㌀䄀䄀䔀㜀㌀䔀㜀㜀㠀㜀䈀䈀䘀䐀䔀䔀㜀㄀㘀䐀䌀䄀䄀䘀㄀䔀䄀㈀㔀㤀䔀㄀㜀　䔀㐀㈀　㈀㐀　䘀　䘀䐀㄀　㠀㠀㘀㌀䔀㄀㈀䔀㤀　㄀䈀㜀䐀䘀㜀䈀㤀㈀㐀㘀㌀　䌀䌀㄀㜀㄀　䘀㜀䌀㈀䄀㔀㜀䔀䘀䐀䈀㄀㈀㘀㔀　㐀㐀㌀䐀䈀㔀䌀䐀䌀䌀㄀㌀㘀㐀䈀　䐀䈀䄀㔀㜀䔀㜀㌀　㈀㜀㔀㘀㌀䄀㠀㔀䐀䌀㄀㘀䈀　㜀䌀䔀㠀㌀㌀㤀　㜀㠀㐀䘀䌀䄀䘀㐀㈀㐀㜀　　㤀䌀㔀㘀䔀㐀㘀䘀㐀㄀䄀㌀㄀㤀㌀䌀㜀㜀㄀㤀䔀䄀㔀㌀䐀㠀䄀䘀　㄀䄀㄀䘀㠀　㄀㤀㐀䌀䐀㘀㠀䔀㠀㔀㜀㄀䄀䌀㠀䘀䐀䄀䄀㘀䐀䈀㘀䔀㌀㤀䐀䘀㄀㜀㄀䌀㘀䌀㔀㌀䐀㌀䔀䔀　䄀䘀㤀䘀㜀䔀㠀䄀㐀㘀㠀㄀㜀㘀　㌀㄀䐀　䄀㌀䄀　㔀㌀㐀䌀䘀䄀㄀䔀㄀㜀㌀䐀㘀㌀䐀㘀䘀䐀䐀㘀㄀㠀䔀㈀䔀䈀㤀㔀䌀㄀䄀䐀㜀䐀䌀䔀㠀㜀㜀䄀㔀㌀㈀䘀䘀㌀㜀　㄀㜀㌀䔀㜀㈀㔀䔀　　㐀㜀　䘀䌀䘀䘀㜀㔀㔀䐀　䄀㐀㄀㔀㘀㠀㄀㘀㠀䌀　㜀䌀　䈀㜀㘀䌀㠀㐀㠀䐀㠀㤀㄀䄀㜀㘀㄀㤀䘀䌀䌀䄀　㤀㔀㐀㐀㄀㜀䄀㄀㐀䈀䈀䔀㐀䘀　㔀䘀㘀㐀㈀　䘀㐀䐀　㔀䘀䐀㄀㌀䌀㈀䈀　㜀䄀䐀㜀䘀㜀　　㔀䄀䌀　䐀䐀　䄀㘀㄀㜀㌀㐀　㄀䘀㈀㄀䈀䄀䘀　㌀㔀䐀䌀䈀㜀㈀　䘀䌀䈀㐀　䐀㐀䈀䐀㔀䔀㌀㘀㤀㠀㜀䈀㐀㈀䈀䐀䈀㈀㌀䔀䌀㘀㤀㤀㤀䐀㜀㈀䈀䌀䈀㤀䈀㘀㈀䔀㜀䈀䘀䘀　㈀㈀䐀㄀㜀㜀㔀䘀　㄀　㜀䔀䐀䘀䌀㄀㜀䘀㘀　㄀䘀㌀䔀㄀䘀䔀䈀䘀　　䐀㘀䘀㌀　䈀㜀䘀　㔀䘀䐀㌀㔀䔀㠀㈀㘀䄀㐀䘀䘀㄀㠀䘀㤀䔀䔀　㔀㜀䐀䐀䔀㠀䔀䈀䘀㌀㠀　䈀䘀䔀㔀䈀㠀㄀䔀㜀䔀　㌀䘀　䘀䘀䘀㐀㈀䄀　　　䔀䔀　㜀㐀　䔀㌀㐀　㜀䈀　㄀䈀㄀㐀　　䌀䘀㈀㘀䘀㘀㐀䈀　㌀䐀㜀㈀䌀㤀㌀䔀䘀㐀㌀䘀㐀䔀㈀䘀䈀䘀䘀䘀䈀㠀㔀㘀　䄀㤀䈀䄀㔀㄀㐀㜀䌀㈀㘀䘀　㤀㤀㄀㜀䔀㠀㠀䘀䐀䐀㜀䈀㠀㠀㘀䈀䄀㘀䌀䔀㜀㠀㌀㘀㐀㄀䐀䐀㜀䈀　䐀㘀㜀䘀䌀㤀䈀䄀㈀㘀㄀㘀㜀　㘀㈀䔀㘀䄀䘀㜀　㌀䘀㘀㐀䌀䔀䘀䌀㈀䔀䔀　䈀㠀㘀䔀䘀㜀䐀䄀䔀䈀㘀䌀㜀㜀㄀㈀㠀䌀㘀䈀㌀㌀䔀㄀䌀㜀䄀䈀䔀㜀㔀㄀㄀㌀㘀㘀㔀㜀㌀䈀㘀䄀㌀䐀㤀㤀㘀㘀㔀䘀䈀㔀㤀䐀㠀㠀䘀㤀㈀㠀䄀䘀䐀㤀䈀䈀　㘀㌀㔀㄀㈀䘀㔀㄀㘀䈀㠀㜀䈀㈀䔀䐀䌀䌀䘀㘀㈀䈀䐀䈀䌀䔀㘀䌀䈀䘀㠀㈀䔀䔀㄀㐀㘀㜀　㘀㠀㘀䔀　㈀㜀㤀䘀䘀㜀䘀㤀㠀㈀㈀䘀䈀㤀㘀䔀㠀㐀䔀䈀㔀㘀䔀㔀㈀䈀䐀䄀　㘀㐀㐀　㌀䘀㄀㤀㈀㈀䔀㐀　㤀䄀㘀䘀䐀㔀㘀䔀䐀㘀㈀㤀䔀㠀㤀䔀㈀㠀䌀㠀䘀㜀䐀㜀䐀㠀㄀䈀䔀䐀㘀㘀䌀　　䘀㄀㤀䄀㌀㘀㤀㌀㘀䄀䌀㔀㜀䈀㄀㜀㘀㐀㔀㘀㄀䄀䐀㌀䈀　䄀䈀䐀䘀䈀㌀㔀䔀㠀㈀䈀䘀　㜀㜀　㈀䘀䐀䐀䄀㔀㤀䐀㌀㄀䌀䐀䐀㜀䄀㠀㤀㠀䔀㘀䐀㘀㈀㐀䐀䘀䈀㐀䘀䘀䈀㜀䘀䔀㠀㄀䄀䘀㤀㈀䘀䄀䌀䄀㤀㘀㤀㄀㈀䈀㌀㔀䌀䈀㠀㔀㈀䈀㠀㠀㌀䌀㄀㄀㈀䈀㤀　䌀䘀㜀㔀䄀䘀䌀㐀㌀䐀㄀䐀㐀䐀䄀䘀䐀㈀䘀䄀䘀䔀㔀㔀㜀㔀㠀䄀㌀䌀㌀䐀㜀䔀㤀㜀䘀䐀㜀䔀䘀䄀䌀䘀㌀　䔀㈀㈀㐀㘀㔀　㄀䄀䌀㌀㤀㌀㘀䔀㄀䐀㘀㄀䈀㠀䔀䐀䐀㈀㐀䈀䔀䌀㠀　㈀㘀䘀䌀㐀䐀䐀㤀䈀㤀㌀䘀䐀㐀䔀䘀䈀㘀㌀䈀㜀䔀䈀　䐀䘀㘀㔀㤀㜀㌀㠀㜀䔀㌀㜀㈀䔀㠀㤀㜀㜀䌀䈀㤀䔀㘀㌀䌀䘀㜀㐀䄀　　䔀㈀㄀䈀㠀䔀㘀䐀䐀　䘀　㔀䔀䘀㈀䐀䘀㐀㔀䘀㌀㘀䐀㠀䘀䔀　䔀　䘀䔀䔀㜀㤀㄀䌀㤀䄀㘀䘀䐀㈀㠀䘀㌀䔀䌀䄀　䔀　㜀䘀㐀㐀　㜀㜀䈀㤀㠀㘀䔀䔀　㈀䈀䔀㠀㐀䌀䔀䔀㠀　㐀㘀　㠀䐀䈀㈀㄀䔀㠀㈀䘀䘀㐀䔀䔀䘀䘀㜀㤀㐀䔀㘀㜀䐀㤀㈀䐀㈀䔀　㔀䘀　㌀㘀　㔀䐀䈀㐀㐀㘀　㈀㘀㔀㄀䌀　㜀㌀䄀㔀　㔀㤀䌀䘀䔀㜀䐀䈀䐀㘀㐀㔀䘀㠀䔀䘀㠀㄀㌀䘀㔀䄀㜀䘀㐀㔀䄀㐀㈀䐀㤀　㈀㠀㘀䈀㐀䄀㤀䔀䐀䐀㜀㈀䌀䈀䘀㘀䈀㤀䈀　　䘀䐀㄀㘀㜀㐀㈀　䘀㌀䔀䌀　䘀䌀㔀㌀㈀䄀㌀　　䌀㠀㠀　㄀㘀䄀㠀　㐀䄀㘀㜀䄀䌀㜀㤀　䘀㠀㤀䈀䄀䌀䘀䄀䄀㔀㠀㜀㔀㜀㤀㤀䘀䄀䈀㄀㜀㔀㤀㔀䘀䔀䈀䄀㜀　　㤀㜀　䐀䐀㠀㈀㐀㄀䐀㐀　㌀㜀　㌀㐀䘀䌀㈀㄀䘀　㔀㜀䘀㄀㐀㜀㐀㜀㄀㘀䈀䈀㌀㄀㔀䘀㐀㜀㘀㌀䄀㌀䐀䌀㘀䔀㜀䘀㄀䄀　㤀㄀䄀　㤀㄀䐀　䔀䘀㤀㌀㄀䄀䌀䔀䘀㠀䄀䌀㠀䈀䔀㘀　䄀㤀㄀㈀㘀㐀䘀㤀䌀㈀䐀㈀䘀䄀㌀㌀㄀䐀　䘀㌀㠀䈀䘀㐀䐀㌀㜀䌀䘀㘀㘀㔀䘀䐀㔀㘀㤀䌀䔀㤀䐀㔀㔀㌀㤀㐀䄀㜀䈀㤀䈀㠀㐀㜀㔀㤀㠀㤀㌀㔀㌀㐀䌀㄀㌀㤀䄀㜀㠀㌀㌀䘀㠀䔀䌀䘀㠀㘀㌀䌀㌀䔀㌀䔀㈀䘀䈀㄀䔀䄀䔀㐀䘀㤀㔀䌀䈀㄀䘀㤀　㔀䐀㘀䌀㄀䔀㤀㔀㠀　䘀㈀㌀㜀㠀䔀䐀㐀　䈀䐀䐀㌀䌀㐀㤀䐀䐀　　㈀㤀䐀䌀䘀㜀㄀䈀䘀䄀　㤀䘀㘀㤀䌀䐀㈀㠀㐀䈀㤀䔀㈀㄀䈀㜀㜀㘀䌀䔀㤀㈀䘀㤀㜀䌀㠀䄀䐀㜀㈀䈀䈀㌀　䘀㐀㔀㠀䈀㜀㌀㠀䌀䘀　㜀㌀䔀㐀䘀㜀㘀　㄀䈀䌀䘀䄀㐀㈀䌀㘀　䄀㐀㘀䔀䐀䘀㔀㌀䔀㔀䘀㌀䘀㤀㠀䈀㜀㘀㐀䔀䐀䌀䐀㔀㔀㐀䘀㌀䈀㤀䈀䈀㌀㘀㤀䔀㤀䔀㤀㌀䘀㜀㔀䈀䌀㄀䌀㠀㜀䐀䈀㐀㈀䐀䔀㈀　㐀㘀䐀䘀㌀㤀㘀㔀㄀㠀䔀䘀㜀㈀䔀㜀㄀䐀䘀䈀㐀㔀㄀䐀䈀㐀䄀㈀䈀㄀㄀䈀㘀䐀㔀㜀㌀㌀䘀㘀䐀㌀㔀㔀㌀䌀㐀䘀䐀㐀䄀䈀䔀䈀㌀䄀䔀䘀㈀㤀䄀㜀㠀㤀㤀䈀㌀㌀䘀㌀䔀䌀䈀䔀䌀㄀　㌀䄀䐀㌀㤀㐀㘀䐀㜀㘀䐀䈀　㐀㠀㈀䈀䘀㤀㤀㌀㐀㠀䔀䌀䘀㘀㌀䌀㈀䔀䈀㜀㔀䘀㈀㜀㤀㜀㌀䈀　㤀㘀㜀䔀㈀㄀䌀䔀䄀㄀䔀䌀㜀㌀䌀䌀㈀㘀㘀䌀㄀䈀䄀䌀䘀㄀　㄀䄀　䌀䌀䈀䔀䄀䘀䈀　䈀䔀䈀㤀䘀䌀㜀㤀䄀㜀䘀㔀䈀㈀㌀䌀䘀㜀㤀䌀㈀䈀䐀㜀䘀㠀㔀䈀㐀㌀㘀䈀䈀䔀䘀䈀㤀䌀㜀䔀㈀㘀㐀䐀䐀㈀䔀䔀䌀㐀䈀䔀䌀䘀㌀㤀㤀㌀䐀䐀　䈀㜀䄀㠀㘀㘀䔀䐀㈀㔀㜀　㌀䈀㈀㠀䘀䐀䐀䈀䌀㌀㠀㜀㔀䄀㄀㔀䘀㈀䔀㔀䔀䌀㤀㄀㘀㜀㈀㘀䌀㄀㌀䈀㠀䄀㜀㠀䈀䈀㌀㌀䔀䘀䈀䈀䔀㠀㜀䌀䘀䄀　㘀㈀䌀㌀䔀䔀䔀㄀㜀㈀㐀㐀㌀䘀㜀䘀㈀㐀䌀㘀㈀䈀㤀㜀䌀㜀䌀䌀㘀㠀㠀㄀㌀㤀㄀䌀䌀㔀䔀㌀㘀䘀㄀䐀䐀㘀䔀䐀䘀䈀䈀㤀　䌀㜀䐀㌀㤀䐀㈀䄀䈀䐀㐀㔀䔀䘀䘀　䌀䈀　䌀䘀㄀䔀䌀㔀䘀䐀㄀䌀㤀䘀　䐀　㌀䐀㌀䐀㔀䈀䘀㈀　䘀䐀㌀㘀䌀䌀䐀㄀㐀㔀㤀㠀㈀䈀㤀　㐀㄀㜀䐀㠀㌀䈀㠀䌀㌀䈀䈀㔀㜀　㈀㘀㤀䄀䐀䈀䐀㈀㈀䐀䘀㐀㈀䘀䈀䐀䔀䌀䌀㤀䌀　㈀㠀䌀　㐀㔀䘀㄀㔀䌀㠀䈀㜀㠀䘀䔀䘀㠀䔀㄀䌀䐀　䄀䄀　㘀㔀㠀䔀䘀䔀䈀䘀㤀㄀㐀㄀　㄀　䔀㜀㘀䄀䐀㘀㈀䔀䈀㔀䈀㔀㜀㔀㄀㠀䘀㐀㄀㘀䘀㔀㜀㜀䔀㈀㠀䔀㌀㄀㐀䄀䐀䔀　㔀䈀㘀䐀㜀䐀㜀䐀㄀㔀㐀㜀㄀䄀㘀䐀㤀㜀　㈀㜀䐀㠀㐀䔀䔀䘀㈀䔀䌀䔀䄀䐀䈀䈀䔀䈀㔀㌀　㄀㠀䌀㌀䘀㜀　㌀䈀䘀䌀㔀䐀㐀㔀䐀䈀㈀㔀㄀㔀㜀䐀㤀㔀㠀䔀㜀䌀㔀㄀㤀㐀㈀䈀䐀䄀䌀㠀㘀㜀㜀㌀㜀䐀䘀㠀䘀䄀㤀䐀䈀䌀䐀䄀㌀　㜀㤀㐀㘀㈀䄀䐀㌀㜀䄀㤀䔀䄀㄀㄀䌀㐀䘀㌀䄀䔀㐀䈀㔀㄀㤀䔀㔀㄀㠀㠀㜀䄀㠀䄀䈀䈀㘀㄀㠀䘀㘀䌀䈀㌀㄀䔀㠀䈀䄀㠀䔀㄀㠀䈀䈀㌀䌀㠀䌀㘀䈀㄀㐀䄀䐀䐀㐀䐀䔀䄀㔀䌀䔀䘀䄀㘀　㈀䄀䐀㔀㔀䄀㔀㄀㄀㤀㐀㌀䌀㤀䈀㄀㐀䔀㈀㤀䔀㜀㐀㄀㘀㄀䄀㤀㌀㌀䐀㐀㠀䘀㄀㄀䘀䔀㄀㜀䐀　　㜀䔀㄀䔀㜀䈀䈀䐀䘀㌀䘀䐀㄀㐀䐀䌀䔀䈀䐀㤀䄀㜀䐀㌀䔀㐀䐀㄀㜀　㐀㔀䔀㠀㈀䄀䐀　　䌀㠀䈀䈀㔀䌀㐀㘀㌀㤀㐀㌀䐀䐀䄀㜀㈀㐀䌀䄀㜀䈀䌀㈀㐀㈀䔀㤀䔀䔀㘀㐀䈀䈀㄀㄀㌀㘀㠀㐀㤀䔀㄀㘀㜀　䌀䄀䐀㠀㐀㜀㜀䈀䌀㌀㠀　㜀㐀䐀㘀䈀䈀䌀　　㔀䘀㔀㘀㜀䄀㠀㌀䈀㠀㌀䌀䄀䐀㐀㌀䄀䐀㐀䈀㄀　㌀䈀䌀䄀　㄀䔀㈀䐀㄀䄀䘀㌀䌀䘀　㔀䔀㐀㤀㤀㈀䐀䐀㄀㔀䐀䐀㘀㌀㌀㔀䄀㤀䘀㠀䔀㌀㤀䐀㘀㄀㠀㤀㤀㘀䔀㈀　㈀䘀䐀㌀㔀㐀㌀㜀㄀　䌀䔀㌀㐀䌀㤀　䐀㄀㤀䐀䔀䌀㄀　䐀㠀㐀㌀㌀䌀䐀㜀　　㌀䔀㄀㄀㤀㤀㜀䔀㄀䔀㌀㐀䄀䔀㤀䄀䔀䌀㐀䌀㜀㤀㔀䌀㈀㤀㌀䐀䐀㐀　㜀㠀䘀㈀㜀䘀㠀　㠀䘀㈀䈀㤀㔀䔀䈀㜀㜀　㌀䔀㄀䘀䔀䄀䈀䘀　㌀㜀䐀㘀　䐀㠀㐀㠀䘀䘀䐀　㄀㜀䌀㔀䌀䄀㤀㤀䘀䈀䈀䈀䄀㠀㄀䘀　䄀䔀㔀㜀䔀㄀㘀㌀䈀䌀㄀䈀　㠀㄀䘀䔀䘀䔀㘀　㌀䘀䄀　㤀䘀䈀䐀㠀䘀䄀䔀㌀䐀㠀㤀䈀㄀䔀　　䘀䐀䈀㌀㔀䌀䔀䘀㌀䘀　㈀㄀䐀　㜀　䄀䔀㤀䄀䈀䘀䘀㈀䐀㤀䘀㘀㌀　㌀㄀㔀䐀㈀䘀䘀㘀㜀㤀㤀䔀䔀䘀䘀　　䐀㠀䘀䘀㔀䄀　䘀　㌀䐀㠀㈀䈀㔀䈀㄀㤀㄀㈀䐀　㜀㤀㄀㘀䔀䘀㠀㄀䄀䈀㐀㄀㌀䘀　㄀䈀　䄀䘀䈀㘀㈀㘀㌀㔀䄀　䘀䔀㈀㐀㘀㠀㐀㜀䘀䈀㠀䌀䐀䌀䄀㤀䌀㜀䐀䄀　　䘀㐀　㐀䄀㘀䐀㤀㜀㔀㜀㄀䐀䔀䘀䄀㘀㜀䔀䐀䈀䄀　㔀㘀㐀㤀䐀䘀㔀㠀㜀䔀䌀䘀䌀㄀㜀㤀䘀　㐀㜀䐀䐀㄀䔀㔀㘀䘀　㌀䘀䌀䐀䐀䄀䔀㐀䘀䐀㐀䌀䐀䈀䄀䘀㜀　㠀䄀㠀㄀䘀䐀㠀㈀䌀䐀䈀䈀㜀㐀㘀䐀㘀㄀䈀䈀㐀㜀㤀䄀䘀䐀䘀䐀　㤀　䈀䔀䈀䔀䄀㌀䐀䐀㐀㘀㤀㄀㈀䘀䐀㠀　　㐀䈀　㌀㈀㘀㈀㌀㜀䘀　㈀䔀㠀㤀㐀　㘀䐀㐀䘀䘀䐀㈀㠀㘀䘀㔀㄀䈀䐀　㔀䘀　　㜀䌀㈀䔀㜀䄀㐀㈀䘀㈀䌀㔀䔀䔀䌀䔀䈀㈀㌀䘀䈀㠀䌀䐀䌀䘀㜀　㔀㤀　䐀㜀䄀㠀㄀䈀䔀䐀㌀㌀㜀㐀㌀㘀㜀㄀㐀㄀㌀㘀㄀䄀䐀㘀䔀䔀䐀䐀㤀㘀㜀㔀㌀䘀䐀　䔀㄀䄀㈀㜀㜀㐀䔀䔀䄀䈀㠀䐀䐀㘀䄀䄀㈀㔀㐀㈀㄀䘀䈀䔀㐀㜀㠀䘀　䈀㜀䐀䌀㜀䄀䘀㔀㠀㠀㘀㔀㌀㤀䄀䐀㤀　㈀㜀㘀䌀㠀㈀㌀㤀㐀䌀㄀㜀㘀　㌀䔀䈀㜀　䄀㌀㔀䌀䄀㐀㔀䘀㘀䈀㤀㐀㘀㄀㘀䐀㈀㈀䐀㠀㈀㜀䈀　㄀㔀㠀㐀䈀䐀㜀　㤀㘀　䌀䘀䐀　㔀㘀䄀㘀䘀㤀䌀䄀㌀㔀㤀䘀䄀㈀㈀䌀䄀䐀㈀㤀䔀㠀㘀㔀䐀㌀䌀㄀䄀䘀䄀㄀㘀㜀㔀㠀㠀㜀䈀㄀㤀㤀㐀䌀䐀㜀䄀㤀䈀㘀䐀　䔀䔀䐀㌀䔀䈀䄀　㄀㄀　㜀㜀㤀㔀䔀㈀㐀䔀㠀㠀䔀䘀㐀䔀㤀㘀㔀㌀㜀㔀䔀㐀㔀㌀䌀㈀㜀䔀㠀㤀㐀㘀㤀䄀䐀㘀䘀䄀　㜀䔀　䘀㜀㘀㄀㌀䄀㠀䄀㌀䐀䐀䈀㄀䄀䄀㌀㠀　㄀㐀䔀㐀㌀㜀㌀䐀㜀䐀䔀　㜀䘀　　䔀䈀䘀䄀㐀䔀㔀䄀㘀䔀䐀䌀㐀㄀㈀䈀䈀䌀㤀㔀㜀㐀䐀㐀䘀䌀㤀䌀䔀䘀㐀䌀䄀㤀　㈀䔀䈀㔀㔀㠀㈀㌀㤀㠀䈀㠀㘀㄀㠀䘀㜀䐀　㄀㠀㘀㜀㘀䘀㘀䈀㔀㘀㔀㈀㠀㐀䐀㄀㄀䌀㜀㘀㠀㄀䄀㐀䐀䔀㐀䐀㔀㐀䔀䄀䔀㤀㠀㔀䘀　㜀䐀䔀㐀䐀㌀䘀䘀㐀䔀㄀䐀㈀㌀䄀䄀㘀㄀䐀㜀䈀䐀㐀㘀㄀㌀䐀㄀㘀㜀㠀㌀㤀䌀䈀䄀㐀㌀㜀㜀䘀㜀㄀䔀㘀䄀㠀䐀䘀　䈀䐀䘀㘀䘀㤀㠀䄀㤀　㌀䘀䔀　䘀䈀㄀㐀㘀　㤀䌀䔀　㄀㤀䘀䌀䌀㈀　䔀䐀㌀䈀㄀䈀㜀㘀䔀䔀䐀䈀䌀㄀䈀㌀　㘀䔀㐀㐀㤀䘀㤀㐀　㤀㜀䔀䌀㘀㠀䈀㌀䈀䄀㜀㈀㜀㐀㠀䌀㜀㄀䔀㤀䐀㠀䌀䌀䘀䈀　㜀㘀䔀㜀㔀㈀㜀㜀㐀䘀　㐀㘀䌀䄀䘀㔀㐀㔀䄀㄀㌀䐀㄀㠀䔀㜀㘀㤀㠀䐀䘀䄀　㄀䐀㈀㘀䔀䌀䐀㐀㄀㐀㜀㄀㈀䘀㔀䘀㈀㄀䘀䈀䈀䔀㈀䘀䐀䘀㌀䘀㜀㤀䔀㘀㔀　㌀䘀䄀㌀㤀䄀㤀㈀㤀䐀䈀䐀䈀䈀䘀㤀㌀䔀䘀䄀㜀㤀㈀䄀㐀㔀㌀䄀㤀㐀䔀䘀䔀㌀㤀䌀䘀㌀　　䐀㠀㘀䔀㌀䈀䘀㔀䈀㤀䌀㈀㔀䔀㠀䌀㄀㄀䘀㜀㔀䄀䘀㈀㌀䌀㈀　㐀㐀㤀䐀㌀㈀䘀㠀䈀䔀䄀䐀㠀䄀䐀㘀䘀㄀㔀䈀　㤀䈀㜀㔀䐀䔀㌀䐀㠀㔀㄀㈀㄀㤀䈀㐀㈀㤀䔀㄀㄀㠀㐀䌀䔀㄀䌀㤀䌀䘀㘀㠀　䘀㈀䘀䄀㄀㤀㘀䄀䈀䘀䄀㐀㘀㄀䘀㘀㠀㘀㜀䐀䄀㘀㜀　　䌀䘀㘀㘀㤀㄀䌀䄀㔀䘀　㌀䐀㤀䔀㌀㠀㄀㌀㜀㄀㔀㌀䌀㤀㤀㌀䈀㠀䌀㜀㌀䈀　㘀㔀㤀㤀㈀䘀㘀䄀䌀䔀㜀㈀㠀䔀㔀㜀㤀㌀㐀䐀　䈀䐀㔀㐀㘀㄀䄀䔀䄀㘀㈀㤀䌀㘀　䐀䔀㠀㤀㜀㔀㠀㤀䄀䔀㈀䘀㤀　䐀䌀㔀㜀㠀㐀㘀㔀㌀㌀䈀䈀㘀䌀䘀㌀䌀㄀䔀㘀㄀䐀㜀㔀㔀䘀㈀㄀䄀㘀䐀㜀䌀　䈀㔀䈀㜀㐀　䄀㈀㔀㘀㌀㘀䌀㌀㈀　㄀䔀䌀㈀㤀䄀䌀䘀㤀䘀㘀䈀䐀㤀㠀㔀㔀㈀㠀䔀㜀㌀㠀㤀䘀䈀㤀䘀䐀　㤀㤀㠀㠀㤀䌀㤀㜀㠀㤀㌀　䌀䔀㌀䈀㌀　䄀㠀䌀䈀㤀䐀㔀　䌀䔀㄀䘀㤀㌀㈀㈀䘀䔀㈀䄀䐀㄀䘀䐀㤀䘀䈀　䌀㤀㄀㠀㘀䔀䘀䌀䘀　㈀䐀㈀㤀䐀㈀㤀㔀㄀㘀㘀䄀㜀䔀㄀䈀䌀㄀㜀䘀䘀㈀䄀䐀㌀㌀䘀㄀㤀㜀㘀㔀㘀䘀㌀㠀䔀　䐀䈀㄀　䘀䘀㄀㠀㔀䐀䈀䄀㤀䘀㈀㈀䐀䐀㔀䔀䄀㐀䈀㘀㠀䌀㌀䐀䐀㌀䐀䌀䈀㐀䘀㐀䔀㤀㌀䘀㐀㄀䄀䌀䘀䐀　㜀㠀　䔀䘀㌀㤀䈀䄀䄀䌀䈀䐀䌀䘀㄀䈀䈀䔀㤀　㘀䐀　䈀㤀㠀䔀㄀䘀㜀㘀䐀䔀㌀䈀㤀㠀䄀㌀　䘀㈀㄀䄀䘀　䘀㌀　㄀䐀㌀䈀䐀䄀㐀䐀㜀㔀䘀䈀䈀䔀䘀䘀㐀䔀㤀䈀　䄀䐀䈀㤀　䔀㤀㄀䔀㐀㤀㄀䘀㘀㔀㔀㤀㘀㌀㔀䈀䌀䘀㐀䐀䐀䐀䔀䘀㔀㜀䄀䔀䘀㐀㤀䔀䔀㔀㈀䄀㜀㘀䄀䌀㌀䐀䌀䘀㄀䌀䐀䄀䘀㠀䐀䐀㠀䈀㐀㌀㘀䘀㤀㈀㌀㐀㌀㤀䘀㐀㈀䔀䄀㜀　㤀㄀䄀䘀䔀㐀䔀䄀㘀㠀㄀㔀䄀㤀㘀䘀㐀䈀㜀䈀䌀䐀㘀䈀㌀㌀䈀㜀㤀䔀㘀䐀㘀䌀㄀䄀㄀㤀㜀㜀㤀㜀䘀㘀　㤀䘀䌀㤀㌀㔀㔀　䘀㌀㤀㈀䘀䐀㔀㌀㌀㠀㄀㔀㘀㌀㐀㈀㤀䄀䈀㐀㘀㌀䐀㤀㜀䔀䌀䘀㄀㌀䘀㜀䘀䌀䘀䌀㌀㘀䔀㜀㈀䄀　㠀䈀䐀䔀㄀䈀䄀　㜀㌀㈀䐀　㄀㠀䐀㌀㄀㠀䘀䌀㤀䔀䔀　㜀㈀㌀　䈀㄀㤀㈀㌀　㌀䌀　䈀㄀䈀㐀㌀䐀䄀䘀㤀㔀㜀㠀㐀䘀㤀㔀㌀䔀㐀　㌀䈀䌀　㤀㘀䔀㔀㠀㔀䘀㌀㈀䌀　䘀㌀䐀䐀㌀㘀䄀䌀㈀䐀㄀㈀䔀㜀㈀㔀㜀㘀㌀㄀㌀㐀　㔀㜀䈀㘀㤀㜀䔀䔀䄀䘀䄀䄀　㄀䈀䐀㘀㤀㜀　㈀㤀㜀㜀䘀㔀䘀㤀㜀㘀㔀㌀䔀㠀㈀㜀䄀　㄀㘀䘀㘀䘀㄀䈀㤀䔀㤀㌀㌀㘀㠀㐀䘀䐀㜀䘀㄀㔀䄀　　䘀䌀㠀㠀㌀㤀㔀䐀㐀㄀䈀㈀㌀䄀㠀䌀㤀㘀䈀䔀㄀㔀㔀　㄀㈀䈀㠀㌀䔀㄀䘀㤀㐀䌀㘀㈀䄀䐀　㌀䌀䈀㘀㈀㌀㠀䘀䐀䔀䔀䘀㐀䄀㌀䐀㌀㈀䘀㘀㠀䐀䈀䐀䘀䐀㄀䔀䔀䈀㤀㈀㄀㤀䔀㤀䐀䘀䄀㘀㔀䈀㤀䘀䘀䔀䔀㌀㠀䘀䔀䈀䈀䔀㌀䘀㈀㤀䘀㘀䄀䘀㜀䐀㔀㜀㠀　䘀㠀㜀㜀䌀䄀㌀䔀㜀㔀　㜀䔀䈀䈀㘀㜀㔀䔀㤀㘀㘀䘀㠀䌀㠀䘀䌀　㤀㜀㌀㘀䌀㐀㔀䈀㤀䄀㜀䐀㄀㐀㈀䈀㘀㄀䄀㈀㔀䘀㤀䘀　㔀䘀㘀　㌀㈀䘀㐀㤀㘀䌀㘀　㘀　䄀䔀㜀㐀䔀　䈀㜀㐀䄀㔀䄀㌀㤀䔀㐀䄀㤀㔀䌀䈀䌀㔀㜀　䌀䔀㔀䈀㤀㐀㐀　䔀䐀㘀㘀㌀㘀䘀䌀䄀㤀　㜀䔀䘀㤀䘀䔀䌀㘀㌀㐀㘀㄀䐀㤀㜀㤀䐀䄀䐀㤀䘀㌀㠀　䐀䘀䘀䔀䐀㠀䄀　䌀㈀䌀䈀䘀㔀㠀䘀䄀㜀䐀䌀㤀㘀㌀䘀㐀䘀㌀㜀䈀䈀㤀䘀䌀㐀䈀䈀㄀䐀䐀䈀䘀㘀㌀䄀㠀㜀㜀㘀䈀㐀㤀　㘀䘀㘀䌀㈀䈀䄀㐀䔀䔀䔀䈀㄀䄀㌀㄀㤀㄀㜀㘀䌀䄀㜀㜀䈀㈀　㤀䄀䌀㔀䈀䈀　䔀䔀䘀㈀㌀䌀䔀䘀䄀䈀䘀䘀㤀䄀㈀䄀㄀䄀䐀䈀㜀䌀䐀㘀㄀㐀㜀䈀㌀䘀㘀䐀䔀䐀䌀㈀㌀䄀㘀㤀㈀　㜀䐀㈀䈀㘀㌀㄀㤀䔀㔀䄀㠀䈀䘀䈀㌀㄀䔀㌀㔀㔀㘀㐀　㈀㜀㜀䌀㘀䔀䈀䐀㘀㠀䐀䌀　㔀㔀䈀　　㐀　㔀䐀䘀㜀㐀䄀㤀䌀㤀㐀䐀㠀㘀㄀䐀䈀㜀䔀䐀㘀㐀㄀䘀㤀　䔀䐀㈀㄀㐀䔀䘀㠀㄀䘀㜀䐀㄀㄀㌀䔀㄀䌀　䐀䔀䈀㘀㌀㌀㠀㌀䐀㌀䐀㠀䔀䈀䄀㐀䈀㔀㐀㜀䐀䄀䐀䈀㘀䌀䌀㜀䐀䔀㘀㈀䄀㌀䘀䔀　㌀㌀䈀䈀䌀㠀㄀㈀䘀㐀㜀䘀㜀㘀䄀䘀䘀㐀㐀㌀䈀㈀䔀㔀　㜀䈀䘀㄀䈀䔀㌀㐀㔀䐀䔀䌀䄀䘀㈀㜀䔀䄀䘀㌀䈀　䄀㜀㤀䘀㐀㜀䔀䐀䈀㔀䘀㌀㠀㠀㠀㜀䈀䐀䌀　䘀㜀㐀䐀㔀䄀　㤀㠀䐀䔀㈀㌀㔀㐀㌀㄀䈀　㠀䐀䈀㠀䄀䐀䘀䐀䌀㈀䌀㤀㜀䔀䘀㘀㔀䘀㤀䔀䌀䔀㄀㘀䐀㔀　㄀䈀㈀䐀䐀　㈀䘀㄀㌀䈀㔀䌀㜀䌀㌀䔀㘀㌀㜀䈀䘀䄀䘀䔀㄀㜀㜀㌀㔀㠀　㜀㠀㤀㌀䌀㌀䔀㌀㜀㐀㄀䌀㘀䈀　　䄀㜀㌀䘀㈀䔀䘀㈀㌀䈀䘀䈀䘀䈀䔀䔀䔀㈀㜀䌀㘀㤀　㄀䘀㐀䘀㠀㤀䈀㤀㐀㈀　䐀䔀䘀䔀㈀　㐀䔀䈀䌀䔀㤀㐀㄀㄀㤀䘀䌀䐀㘀㠀㤀䔀䐀㈀㈀　䐀㌀䈀　䄀㘀㌀　㈀䔀㐀㘀㈀㄀㈀䐀㈀㐀䔀䈀㈀㜀䔀䄀䘀㘀䐀　㈀㄀䐀㈀㌀䘀㄀㐀䘀㘀　㄀㄀䘀㠀㤀䐀㐀㘀䘀㌀䐀㐀㜀䈀䄀㤀䈀㜀㔀㘀㠀㄀䘀䐀䘀　㘀䈀䈀　㜀㜀䔀㈀㄀　㜀䔀㌀㌀䈀　㄀㠀䔀䔀㜀㘀䄀　㔀㄀㐀　㈀㄀䈀　㄀㔀䈀㠀㤀㔀䘀䄀㠀㤀䘀　　䈀㤀　㤀㌀䔀䘀㤀　㄀䔀䐀　㜀㐀䘀㠀㔀䘀　㘀㌀㔀䈀　䈀㜀㌀㜀㄀　䘀㘀䄀䐀䌀㐀㌀䄀㄀䈀㄀䌀㈀䘀䘀㘀䐀䈀㐀䘀㔀㌀㄀㤀㘀䌀䔀㈀㌀㈀㤀㐀㘀㜀䄀㜀㌀䈀㈀䐀䘀㈀䐀㠀㌀　䄀㤀㐀䌀㜀㤀㔀䔀䐀㐀㔀㔀䄀㘀㘀㔀䄀　㌀䌀䄀㐀㔀㌀䈀㄀㔀㌀䐀㈀㘀　㔀㄀㘀㠀㜀㄀䐀㈀㘀䐀㈀㈀㜀䔀㄀㔀䘀㈀㄀䐀䈀㔀䘀㜀䔀䘀㜀䌀䄀䔀䌀　䔀㤀㐀㔀㤀䌀㤀㌀㈀㘀䄀㈀㈀㄀㠀䐀䔀㜀㈀㜀㤀㐀㄀㌀㔀㤀㐀㄀㌀㤀䐀䄀㐀䄀䐀　㔀㐀䐀㠀㄀㄀䄀㌀䄀䌀㈀㌀䌀䄀㐀㜀㌀㐀㔀䌀㈀䘀䄀㈀㔀㘀㄀㠀䐀㌀㄀㘀䌀　　　㠀䌀䘀㔀㈀㤀䈀㤀㜀䘀䔀　㜀䐀䐀㌀䄀䈀　　㜀䄀䌀䈀䐀䄀　㘀䘀䘀㐀䈀䄀䄀䘀䈀㔀䐀㠀　㜀㌀㐀䘀㈀䔀䄀㤀䘀㄀㈀㐀䌀䐀㌀㌀䄀䔀䄀㜀䐀䔀䌀㘀㐀㔀䐀㠀　㜀㘀䘀㐀㄀　䔀䌀䔀䐀㈀㜀　䔀㌀㄀䈀䐀䄀㘀㈀㠀䌀䄀㐀䔀䔀䔀㘀㐀㐀䄀䌀㘀㌀　㜀䔀㠀㤀㘀䘀　㤀㜀㐀䈀䘀䌀㤀䔀㔀㠀䈀䌀㈀㔀㌀䔀㘀䐀㤀䐀㜀㈀䌀䔀䈀䔀㄀䐀㤀㠀　㔀㄀㐀㄀㜀䘀㄀　㈀㠀䐀䌀㘀㄀㠀㄀㈀䈀䘀䐀䘀㜀　䄀㠀䈀䄀㄀䘀䔀　䐀㜀㐀䔀䘀㤀㘀㈀㌀䐀㄀㈀㘀䘀䔀㤀㄀㔀䔀䌀䈀㘀㘀㠀䈀䘀㔀䐀䄀㘀㜀㠀㌀䘀㘀䐀䌀䘀㌀㔀㘀㄀䔀㜀㜀䄀䈀㈀㘀㠀㈀㔀䔀㘀㜀㄀　䔀㌀　㐀㘀䈀䔀䘀䈀䄀䔀䈀　䔀䘀䌀㜀㘀　㠀㌀㘀㈀䔀䔀䔀㤀䘀㘀㌀䈀䐀㔀䔀䔀䘀䄀㄀䔀䔀䄀㠀㐀㤀㈀㔀㐀㜀䈀　䘀㔀㔀㠀䘀䐀䔀䈀㈀㜀㠀㌀䔀㐀䌀㠀㄀㘀䔀　㠀㤀䐀䈀䐀㌀㈀䔀㔀㌀㜀㘀䐀㈀䌀㔀䈀䐀㈀㄀㘀㘀㐀㄀䈀䘀㌀㠀　䘀䄀　㜀䐀䔀䐀㜀㠀㈀㤀㜀　䔀䐀㘀㄀㄀㜀㔀㈀㈀㜀㔀㤀㘀㜀㤀㘀㜀䐀㠀䘀䈀㔀㈀㠀䈀䌀䘀䄀䈀㜀䘀　㘀䘀　㤀㤀䔀㔀䐀㘀䈀　䘀䈀䄀㜀㠀䐀㠀䌀䘀䘀䐀䘀䘀㜀㔀䈀䄀䄀䔀䈀㄀䔀䔀䄀㐀䄀䘀㜀㐀㔀㐀䐀䈀䐀䌀䐀㘀㠀䔀䄀䄀䐀䌀㘀㈀㔀䘀䔀㄀䘀㜀㠀䄀㜀䔀㈀㜀䔀䈀䈀䐀㄀䐀㐀㔀䈀㠀䔀㈀㘀䘀䐀䄀䔀㌀䈀㤀㜀䄀㘀䔀䔀䌀䈀㈀　䄀䈀㘀䌀㈀㌀䔀㜀㘀　㔀䐀㌀㤀㘀䄀䔀䔀䈀㌀㐀䔀䌀㌀䘀䘀　䌀䘀　㈀　䘀㐀䔀䈀㘀䔀㠀㘀㐀䔀㤀㘀㈀㔀䌀䔀㐀㜀㘀䐀㜀䈀䔀䐀㌀䔀䄀䐀㄀㤀䔀㘀䘀㘀㌀㈀䔀䌀㐀㄀㜀㌀䄀㤀䄀䈀㌀䌀㄀㌀䔀㔀㜀㌀䐀㈀䌀䔀䐀　㔀䘀㤀䐀䘀㔀㜀㔀䔀㈀㐀䌀㜀䘀䈀㔀㔀䐀㄀䔀䌀㔀㐀㈀㌀㜀㘀㔀䐀㠀㘀㜀䘀㌀䐀㘀䘀㜀䘀㈀㜀䈀　䔀䔀㈀㌀䌀㤀㔀䌀䘀䔀㘀䐀㠀㈀䔀䐀㔀䐀䄀㠀㤀䔀䘀㐀㄀㜀㐀䐀　䔀䐀䔀䘀㌀㔀㜀　䘀㤀㜀㤀䘀㈀䘀䌀㔀㘀㜀䌀㘀䘀㈀㈀㜀㐀㐀䔀㜀䈀㄀䐀䔀㔀䈀㌀䄀䔀㘀㔀㤀䐀㈀䄀䐀㘀　䌀㜀䔀䐀䈀㠀䐀㜀䐀㄀䄀䘀㐀㐀䐀㄀㤀䔀䈀㄀㘀䘀㔀㈀㐀䘀㔀㔀㜀䈀䘀䈀㜀㜀㔀㤀　㜀㈀㔀䄀㠀　㔀㠀㄀㜀㠀㤀㜀㌀䌀㤀　䌀䘀　㤀㠀㈀㄀䄀㠀㜀　䄀䈀㌀䐀䄀㔀㐀䔀䌀㤀䄀　　㠀䈀㔀㌀䘀䐀䄀䈀㈀䌀㄀㠀㘀㄀㘀㘀㔀㤀䐀㄀㐀㌀䄀䄀㤀䄀㔀䄀䐀䈀㌀㌀㐀㐀㈀㜀㤀㜀㔀䄀䌀䌀䘀䈀　䘀䔀䐀䄀䘀䄀䄀䄀㤀㌀䐀㘀䌀㄀䐀㘀㔀䘀䔀䄀䔀䈀䈀㘀　䔀㔀㈀䐀䘀㐀㘀㄀䄀　㜀㔀䘀　㄀㄀䘀䘀㌀㔀䐀　䐀䔀䘀䄀㜀䌀㔀㤀䔀㤀䄀䘀㜀㘀㘀㐀䘀㠀㠀䈀㔀䔀㤀㌀䈀㔀䈀㐀䘀　䄀㔀䐀䌀㠀䔀㜀㤀　㜀　㠀䈀䔀䘀䄀㌀䐀㠀䘀䈀䄀㜀㈀㠀㤀䔀㠀㌀䘀䌀㌀䐀㤀㠀䄀㘀䔀䌀㈀㔀㘀㤀㔀䈀䔀䔀㜀㜀䐀㄀㘀㜀㄀䐀䐀䄀㤀㐀㔀䐀㈀㠀䘀㌀䔀䌀㤀㜀㜀㤀㈀䔀㐀䐀㈀䘀䔀䘀㘀䔀䈀　㤀㘀䌀㐀㠀䄀㌀㔀䘀㤀　㐀䘀㔀䔀　䈀㜀䈀䐀䄀㄀㜀䐀㄀㜀㔀㄀㜀䘀䘀㄀㌀㘀䘀䄀䔀䘀㘀㈀䈀䘀㌀㈀　㘀䘀㄀㘀䌀㠀㌀㌀㐀䐀㠀䘀㤀䌀䔀㜀㤀䈀䈀㄀㠀㈀㜀㠀䌀㤀㄀㜀䐀䈀㜀䄀䘀䈀㠀䘀㜀　㔀㜀䌀㤀䘀䌀㌀㘀㌀䔀䈀䔀䌀䔀㤀䔀䐀㜀㌀䈀㌀䘀䄀䐀㜀䌀㌀䔀㠀㈀䌀㄀䈀㘀㈀㤀䐀䔀㘀㜀䔀䘀䌀　　㜀㘀㔀㤀㈀㐀䐀㘀䐀䐀㜀㄀䄀㈀　䔀䔀㠀㌀㠀㜀㄀䐀䘀䈀㌀䐀㐀䘀䄀㐀䄀䘀㈀䌀㤀䘀䈀㤀㌀䘀㘀㤀　䐀㌀䈀㔀䄀㄀䈀䐀㤀䘀䈀㌀㤀㜀㜀㌀䘀㘀㄀䄀㐀㐀䌀㌀䘀㐀㘀䐀䈀㐀㔀䈀㤀䈀　㌀㔀䈀䄀㠀㈀䘀䈀䘀㐀㤀㄀㈀䔀䈀䘀䐀㜀㌀㘀㄀䘀䈀䐀䈀䐀䐀　䌀䘀㄀㠀㘀䔀㐀㈀㐀䔀䐀㄀㄀㘀䘀㤀㤀㐀㄀㄀㄀䘀㘀　䄀䐀㈀㠀䐀䈀㄀䐀㜀　䐀䈀㄀㠀㘀䈀䌀　　䈀䌀　㘀䘀䌀㄀䔀䘀㠀　㜀㜀　䌀㘀㌀䔀䄀㜀䈀䄀䘀㠀㄀㜀䘀䔀䔀䔀㄀　䘀㜀㐀䈀㘀㠀㌀䘀䈀㐀㤀䐀䐀䘀　䘀䐀㐀㄀䘀㌀㘀䐀䔀㐀㈀㜀䘀㄀䐀䄀㜀　㠀䔀䘀㌀㠀㘀䄀㘀䘀㄀䔀䈀㄀䔀䐀㄀㔀䄀䐀㠀䄀㘀䔀䔀㄀㜀㌀㜀㄀　㘀㜀㠀㜀䈀㤀㠀㈀㄀䈀䔀㌀䈀䔀㔀㘀　㄀䘀䈀䘀䄀䈀㄀㄀㘀䘀䄀㄀㠀㘀䌀㤀㜀㜀㠀㐀䈀䌀䄀䘀䌀䘀㤀㈀㄀㐀㌀䄀㤀㜀㜀㈀㠀㔀㤀䔀㔀䘀㈀䄀䔀䔀㌀㜀㘀㘀㘀䄀㌀㄀䈀　　䘀㈀㘀㐀㈀㐀䔀㜀㈀䔀㠀㜀䄀䘀㠀䘀䈀䌀㄀㜀䐀䈀䐀䘀䔀㄀㌀䐀㠀䔀䄀䐀䐀䌀㐀㌀䐀䐀㔀㌀㐀䘀䐀㜀㘀䘀㄀㤀䐀㤀㠀㜀䌀䄀䐀㌀䐀䘀䄀䄀㄀䔀㄀䘀䈀㔀㔀㘀㤀㄀䌀䄀㘀䐀䘀㠀㤀㜀㐀䄀㤀䔀㈀㜀䐀䔀䘀㄀㐀䘀䐀　䔀䌀䄀㌀㜀㔀䔀䄀　䘀㤀䌀㘀㄀䘀䄀㤀䐀㐀䘀㠀㈀㜀䔀䐀㠀䐀䌀㠀䄀㌀䈀䐀䄀　㔀䈀㌀㔀㤀㔀㠀㘀㄀㤀䄀㌀䔀䌀䔀䘀㐀䘀䔀㠀䈀㜀㔀　　䔀䔀䘀䐀㌀㘀　㔀㜀㔀㐀䄀䈀㤀㄀䐀㠀䄀䘀㈀䐀䄀㔀䘀㄀㔀㠀㄀䘀㔀䄀䌀㈀䘀㘀㔀㤀䌀㔀䈀䌀　㠀㜀䔀㤀　㤀䔀䔀㌀䌀㐀䈀䌀䈀䐀㄀㤀㘀䈀䐀䄀㜀䐀䈀㐀㐀㤀䘀䘀　䐀䔀㈀㌀䔀　　㔀䐀　䌀㜀㠀䈀㄀㠀䔀䄀㔀䌀㈀䘀䘀㌀㤀㘀䐀㔀㈀㌀䔀䄀㘀㐀䐀䐀䄀㔀㈀㠀䌀㄀㌀䐀㈀㘀㠀䌀䘀㠀㤀㜀㜀䐀㌀㤀䈀䘀㐀㐀䘀㐀　䘀䈀㈀㄀䈀䔀㔀㈀䐀㈀㌀㜀㄀㄀㔀㘀　㤀䘀䐀㄀　㠀䐀㜀㐀㜀䘀䄀㔀　㜀䘀㔀䈀㤀䔀㐀㌀㔀　䈀䄀㄀㜀㌀㄀㘀㤀㌀㔀㜀㔀䘀　㠀䈀㐀䄀㐀　㐀㄀㌀㜀䈀㈀䄀䔀㠀㤀㤀㤀㤀㈀㠀㘀㌀㌀　䘀㈀䘀㐀㄀㌀䘀㔀㜀䌀㠀　㌀㔀䘀㄀㌀㜀䘀㐀㠀　䔀　䔀㄀㜀㈀㘀　㤀䔀㄀㘀㐀䈀㤀䔀㈀㐀㤀㐀㠀䘀䄀䐀䄀䘀䌀　䐀㌀䘀䐀䄀　㐀䘀　㌀㘀䘀㌀㠀䈀䌀䈀㠀㈀㄀䘀㠀　㠀　㜀䘀㌀䔀㄀㈀䔀㌀䈀㄀䌀㄀䘀㐀㠀㜀䔀㔀䌀䘀㔀㌀㄀䈀㠀㈀䘀䌀㈀䌀㄀䘀䐀䄀㈀㜀䘀㐀㄀㜀䐀㔀　䘀䘀㐀㘀䔀　䈀䘀㠀　䐀㜀䌀㄀䐀㌀　㠀䄀　䐀䄀䌀㠀㘀䌀䐀䌀㔀䘀䔀㄀㘀　㔀䔀㐀㌀䘀㠀䈀䄀㌀㄀䐀䘀䄀㈀　䘀㄀䐀㜀　㔀䘀䈀䄀䌀㄀㜀䐀䔀䈀䄀　䄀㔀䔀䌀䔀㜀䌀䈀㠀　䘀䈀㌀䐀㄀䌀䄀㈀䐀䐀　䈀㄀䈀䌀㘀㈀㄀　㐀䘀㐀　㄀㠀䘀㠀㤀㄀㠀　䈀㈀㤀　㌀䐀䄀㈀䘀㔀　㌀㜀䈀䈀䈀㤀䐀䐀㤀䌀䔀㘀㜀㌀㤀䈀㐀㜀㤀㘀　㄀㈀㄀㈀㌀㐀㔀䄀㐀㌀䄀䔀㌀　䘀㤀㤀㄀䌀㈀㜀䘀㠀䘀䔀䈀䈀䔀　㜀㜀㤀㌀㤀䔀㐀㐀䘀㌀　㔀㘀䘀䄀㠀䌀㜀䌀㠀㠀㄀㈀䔀䌀　䐀㠀䄀㌀㈀䘀㌀㠀䌀䐀䔀㐀㔀　㤀㤀䈀㘀㌀䌀䐀䐀㈀䘀䘀㈀㜀㄀㌀䄀䌀㐀㠀㤀㌀㄀㘀㐀䐀䔀䈀㠀㤀䘀　䘀㔀㈀　䘀䌀㄀䌀㌀　㤀㈀㄀㔀䈀㜀㤀㔀䌀㈀䘀䌀㜀㜀㌀㜀䘀㤀䄀㔀䘀㔀㄀㤀㐀䘀㤀㌀㐀䐀㈀䈀䌀㠀㄀㌀䄀䐀䄀㈀　㐀䐀㈀㤀䘀㤀㐀㔀䐀䐀㔀䌀䘀㘀㘀䄀㤀䈀㌀䘀㤀㄀㜀㜀㄀䔀㜀㐀㄀㠀䌀䄀㌀㈀䄀㜀㈀㈀㌀䔀　㄀㘀䈀䐀㔀㌀㤀㠀㐀㌀㄀䐀䄀䐀㠀㜀㄀㠀㈀㜀䘀䐀㤀䄀䔀㄀　䔀䘀㌀䌀䘀䔀䌀䌀㌀䈀䌀䄀㌀㐀㔀䄀䐀㠀䈀䌀䌀㌀㤀㘀䐀䌀㠀㐀㌀㤀㌀䄀䌀䔀䔀䌀㠀䔀䈀㈀㌀䄀㈀㌀䘀䐀㠀䘀㘀㄀㔀㜀䈀㈀㠀䌀䔀㐀　㌀䌀㜀㈀㤀䌀㜀㌀䌀㈀㠀䌀㘀㈀䄀㐀㘀䘀㌀䐀㌀㈀㘀䔀㠀㠀㌀㈀䔀䔀㄀䐀䘀䐀㜀　㈀䐀䄀䌀䄀㌀　䘀䔀㘀䔀㔀㠀㈀䔀䐀　㄀㌀䔀㠀㈀䘀䘀䐀㐀䌀䈀䈀㠀㠀㜀㤀㜀䌀䄀䐀䔀　䘀㤀㜀䔀䄀䐀䘀㠀䄀㜀䐀　　㤀䔀㄀䐀㠀䐀䄀㄀㐀㔀㠀㄀䘀䈀㠀㤀　䔀㘀　䔀䐀㌀䐀䈀㔀㠀　㜀䌀㈀䘀䐀䄀䌀㌀䘀㠀　䘀㄀䔀䄀㌀䌀䐀　㌀䐀䌀㈀䔀䐀㘀㤀䄀䄀㄀䌀䐀㘀㔀㄀䄀䌀㤀䘀㤀䄀　㈀䐀㘀䈀㄀䌀㜀㄀䌀䘀䐀䔀㔀䄀䔀㠀㌀㜀㔀㄀㤀　㌀㌀㘀㐀　䌀䈀㤀　㔀䔀　䈀䌀㜀　䔀㤀䄀㄀䔀䐀㘀䘀䘀䄀㈀䔀䘀䘀㤀㈀䐀䈀㐀䘀䔀㈀㤀㌀䐀䌀㈀㌀　㤀䈀䌀㄀䄀㘀㌀㤀㐀䐀䄀䈀㠀䌀䘀㜀㘀㠀㤀㔀㤀䄀　䌀䈀䐀㤀䔀㠀䌀㜀㈀㤀㌀䄀㤀㄀㜀䐀　㄀㤀㈀㠀　㔀䘀䄀　㈀䘀㄀㐀　㈀㜀㠀㤀㄀䔀㌀㈀㈀䔀㔀㤀䘀䄀䈀䐀㐀　䘀㜀䔀㘀㄀䈀㈀㤀䄀㜀㘀㔀㜀㌀㔀䔀　㌀䄀䌀㈀㌀㈀䐀䘀䘀㈀　㈀㠀䐀䈀䐀䔀㤀㠀㔀㄀㄀㘀䘀㘀㌀㄀䐀㘀㤀㘀䄀㘀㘀䌀㘀　䈀㜀䄀䐀䔀㜀䐀㠀㠀　䔀䔀㜀㐀䈀　㄀㌀㜀䘀䄀㌀㤀䌀䈀㄀㘀㘀㠀㄀㜀䔀　㐀䈀䄀䔀䄀㐀䄀㘀䘀㔀䐀䄀䔀䔀㐀㜀㜀䈀䘀䄀㔀㜀㄀䈀䘀㠀㤀㘀㤀㠀䄀䄀䘀㐀䈀㘀䌀㔀㈀䘀㜀䈀䈀䄀㘀䄀㜀䄀䌀䈀㌀　㘀㔀㤀㘀㜀䘀㔀㠀䐀䐀㘀㠀㜀䘀䄀䘀䈀䐀㘀㠀㜀㤀䔀㤀㤀䈀　　㤀䐀䘀䄀　㌀㐀㐀䘀㐀䈀䐀　㔀㠀㄀䄀䐀㈀䔀䌀㄀㤀㜀㄀㄀㜀䐀㔀　䈀㜀䐀䘀㈀㌀䐀㄀䌀　䈀㠀　䄀㔀㐀䌀䐀䐀㜀䌀㔀䔀䔀䈀䈀䈀䘀䘀㘀䈀㘀䐀㌀㜀䈀䘀㄀㌀㄀㐀㌀㘀䌀㔀㈀䈀䘀㘀㤀䔀㠀䈀䘀㜀䘀㄀䔀㈀䌀䔀䔀　㠀　䈀㐀㌀䘀㤀㘀㔀㈀㄀㄀䘀㘀䄀㔀䈀䌀䐀䘀䈀䘀㄀㌀䘀䔀㐀䔀㤀䔀㔀䘀㔀　㠀䌀㄀㤀㐀㜀䔀䐀䌀䌀䘀㄀䈀㐀䌀䐀䘀㠀㄀㔀㔀㔀㜀䈀㤀䔀䄀　　㠀䘀㌀㠀䐀䐀　㄀䈀㤀㘀䐀㔀䐀䔀㜀㔀䐀㐀䌀㈀㄀㌀㐀䈀䔀䐀㈀㈀㔀䄀㘀㈀㤀䐀㌀䐀㈀㔀䔀䘀㌀㠀䈀　䌀䘀㌀㜀㄀䔀㠀㔀䘀䐀䈀㔀㔀㠀㤀䌀㤀㔀䌀㘀㠀䄀䔀䘀㄀㈀䈀㌀䘀䐀䐀䐀㠀㔀㠀䔀㘀䄀䄀㤀㤀　䌀䐀㈀㌀䐀　㈀䈀䌀䈀㘀　㐀䈀㄀㔀㘀㈀㔀䐀䐀㤀㐀㈀㤀㄀㘀㈀㜀䘀䌀㠀䘀䈀䌀㄀䈀㜀㘀　䌀㌀㌀䌀䌀　䐀䘀㄀㄀䈀㔀䘀㠀䄀䌀㈀㘀㠀䈀㘀䐀㈀㜀䈀䔀䄀㌀㘀㜀䈀䈀㔀㔀㜀䔀䈀㜀㤀㤀䈀䘀䌀㌀㌀䌀䌀䘀㄀䌀㐀䔀䘀䈀㤀䄀㐀䐀䈀㌀㤀䔀䘀㜀䔀㘀㔀㤀㌀㄀䌀䐀㤀䄀㔀㌀㄀䄀䔀㐀㈀䌀䄀䈀䐀㄀㤀䔀䘀㔀　䌀䄀㤀䌀䄀䔀㌀䔀㈀㈀䐀㜀䘀㠀䔀㄀䐀㐀㘀㄀䐀䐀㐀㐀㤀䐀㠀㠀㜀㌀䐀㐀䔀㌀䐀䌀㈀䌀㈀䌀㘀㐀㠀䐀䄀㐀㌀㔀㈀㈀㜀㜀䌀㤀㄀䄀　㤀㜀䈀䌀䈀㜀䈀㐀䈀䔀㔀㔀䘀䈀䐀　㜀䄀䘀㄀䔀䔀䘀㈀㘀㄀䔀䌀㄀㔀㠀䔀㠀䄀㜀䐀㌀䌀䐀䈀㈀㈀㔀㄀䈀　䄀㄀㘀㌀㄀㤀㜀䄀㌀㜀䔀䈀䈀䘀㄀㤀䐀䌀䔀㜀㔀㜀㠀㌀㔀䔀㐀㔀㔀䐀㄀㤀䐀䄀㌀㤀㠀䌀㘀㄀㤀㠀䈀䈀䌀㤀䘀䐀䄀㈀䔀䈀㠀䐀㜀䔀㤀㌀㘀䘀䘀　㤀䈀㜀㠀㜀㌀䐀䘀䔀㐀㄀䌀㜀㤀　㘀㜀㌀㠀䘀䔀㄀䌀䌀㤀㌀　㔀㤀㐀䌀㌀㠀　　䌀㜀㔀䈀㘀䔀䐀㐀䈀䄀㘀䔀㈀㌀䌀㘀䄀　㈀䔀㠀䈀㜀䄀　䈀䘀䈀㐀䔀䘀㐀䈀䄀䐀䐀㄀㈀䔀㌀㜀䐀㤀䘀㜀㜀㘀㐀䌀䌀㔀㔀㤀㔀㘀㔀㜀㘀　䈀䄀䌀㐀㐀㌀㈀䔀䄀㐀䐀䄀䘀㜀㐀㌀䐀㘀㜀㔀㐀　㌀䘀䌀㜀䈀䔀䔀㜀䈀䐀㜀䐀䘀㠀㜀㜀㠀䘀䘀㠀䈀䈀㐀㌀㜀㈀䌀䘀䐀䘀䐀㌀䘀㤀㜀䔀㤀　㤀䔀　㔀㄀䈀䘀㄀㜀䄀䌀　㐀䐀䈀㌀䌀㌀䐀䌀䐀䌀㌀䘀㐀㠀䄀䘀㜀㔀㠀㌀㄀䔀䔀䌀㐀䈀䄀䐀㤀㔀㄀㔀䐀㐀　㜀㘀㔀䐀䌀䌀䄀㘀㜀㄀䌀䌀㘀䌀㜀㤀　䈀䘀㤀㜀㠀㄀㈀㌀㤀㐀　㌀㔀㤀䌀䘀㄀㄀䔀䔀　㌀䈀　㄀䘀㔀䔀　㐀㜀䐀　㤀䘀㈀䈀䐀㠀䌀㜀㘀㠀䈀䈀㠀㘀䌀䐀䄀䄀㌀　䘀䄀㄀㌀䐀㤀䔀㜀㈀䐀䄀　㌀㤀㤀䐀䔀　㈀㤀㤀䐀䐀　㈀㄀䐀㌀䄀䐀䌀䐀㠀㐀䈀　㄀㤀㄀㘀䘀㌀㌀㘀䐀㌀㄀㈀㌀㤀　䔀㜀㔀㤀㜀䄀䐀　䐀㠀㘀㜀㜀䐀㘀㈀㌀䌀㠀䌀䈀㤀䌀㔀㘀㔀㘀䐀䄀㈀㘀䄀㜀㌀㌀䄀䐀㈀㜀䐀㠀㠀䘀㠀㐀䔀䈀㈀㈀䔀䔀㠀㐀䈀㘀㌀㌀㐀㘀䌀㤀䐀㐀䄀䈀㠀㄀㜀䐀　㌀䌀䐀䐀㠀㜀㌀㈀䐀䈀䐀㄀㐀㐀䔀㌀㈀㜀㌀㐀䐀㠀䌀㐀㤀䔀䌀䘀㘀䌀　䘀㜀䔀䘀䈀䐀㄀䐀㌀䔀㈀　䐀䌀䄀　䌀䔀䈀㜀㘀㘀㔀䈀㌀䈀㔀㔀㌀㐀䐀䄀　　㐀䔀㔀　䐀䔀䈀㈀㤀䈀䐀㈀㌀㘀㔀㤀㠀㐀䘀䐀　㌀䐀䈀　㈀䈀䄀䈀䘀㔀㐀㜀㘀㄀㐀㜀㌀䘀　㄀㔀䄀　㤀䌀䌀䄀㄀㌀㄀䐀䄀㘀㜀䄀　　㠀㌀㜀䄀㘀䌀䈀㌀㠀䈀㠀䈀㄀㈀㜀䄀䌀㌀㘀㤀䘀㠀㐀㜀䘀㌀䄀䘀䌀㤀㔀㜀㘀㌀䌀䔀䌀㤀㔀㄀䌀䔀㄀㔀䔀㐀䔀䘀㜀䌀㌀㜀䘀㠀䘀䘀㈀䈀䌀䘀㔀䄀㠀㔀䔀㘀㤀䘀䐀㔀㘀䐀䈀㠀䈀䘀䐀㄀㄀䔀㈀䐀㔀䔀㌀㄀㐀㈀䐀䔀䄀䘀　䐀㌀㈀䌀㜀䐀䄀㔀䌀㠀䌀㌀䘀㔀䐀䐀㘀㌀䔀䔀㤀㔀䘀㔀䐀䔀㐀䌀㄀㤀䔀㠀䌀䈀㘀䄀䔀㄀㤀䘀㘀㌀䘀䐀㔀㌀㔀䘀㠀㈀䘀㘀㜀䌀㠀㤀㌀㘀㌀䔀㈀㔀䔀㘀䘀䔀㘀㄀㜀㔀㄀㌀㜀㔀䘀㄀䄀䄀䈀㐀㤀　㘀㄀䈀䌀㐀㘀㌀㤀䐀䔀䐀㌀㜀㐀㠀䘀䌀　㘀䈀㌀㘀㘀䐀㄀㘀㠀㜀㜀䌀㐀䈀䄀㤀䄀㌀䈀㜀䔀㄀㌀䈀㜀㐀㌀㜀䈀㠀䔀㜀㠀㄀㜀㈀㄀㌀㘀䐀㜀　䌀䔀㐀㐀䐀䌀㘀䘀　㜀㈀䘀㌀㤀㤀䈀䌀㠀㐀　䈀䔀　䐀㌀㐀䐀㐀㔀㤀㌀㜀䘀㠀㐀䐀　㄀㜀䘀㐀㜀䐀㈀㌀㠀㘀㄀㄀䐀䐀㌀㄀㜀㔀㠀㠀䘀㐀㘀㌀䔀㐀䄀䔀㐀䈀䐀㄀䘀䘀䄀㈀㐀㄀䘀䈀䄀㘀㜀㄀㔀䄀㠀䐀䌀䌀䘀㤀㤀　㠀㌀㜀䘀㌀㘀　䔀㌀䔀㐀㔀　䄀䌀㘀㤀䐀䄀䐀　䌀㜀㘀㈀㐀䘀䘀㤀　㔀㠀䐀㌀㐀㘀㜀䄀　㤀䐀䔀䔀㌀㌀㄀㘀㤀㜀䈀䔀䔀㜀䈀䐀㄀㤀䐀䄀㔀䈀䄀㤀㄀䌀䄀　㈀㈀䐀　㄀㤀䄀　䔀㌀㤀䐀㜀䐀㄀䐀䌀䄀䔀䔀㘀䈀㄀㠀㤀㠀䔀㜀　䈀䈀　㘀䘀㘀㈀㈀㐀㐀㈀　䔀㄀㤀㌀㔀㄀㈀㔀䔀䐀䈀䈀㘀㠀䐀㄀㠀㘀㄀㔀䐀䘀㐀㠀䌀　㌀䈀䐀㄀䈀䈀㐀㤀　䘀㈀䈀䌀㌀䐀㐀　㄀㌀㈀㠀䌀䘀㜀㌀　㠀䈀䄀䘀㄀䔀䌀䄀㔀㔀㐀㤀䌀㠀㄀㄀㄀㜀㔀㠀㈀㘀䔀㠀䌀䔀㄀䈀䈀䘀㠀䈀　㌀䈀㐀㄀䐀䈀㌀䘀㠀　㌀㘀䄀䄀㜀㜀㠀㠀䔀䘀㌀㜀䌀㘀㐀　㜀䔀㐀䌀㄀㌀䄀䈀　䌀㜀㐀㈀㠀㜀㤀㐀䌀䐀㠀㐀㌀　㌀㈀㤀㈀䈀䘀㈀㌀䌀㤀㔀㜀䄀㄀䔀㄀㄀㜀㜀㜀㠀㌀㄀㐀㠀䐀㌀䌀䄀䐀䌀㐀㤀䄀䐀㠀䐀㈀䐀䔀㠀䌀䘀䔀㔀䐀　䌀㤀㈀䈀　　㘀㜀㘀䘀㜀㠀㠀㘀　䄀㠀䌀　䈀㤀　㤀㤀䈀䐀䐀㐀㔀䐀㄀䈀　㌀䐀䈀䘀㤀㌀㄀㌀㄀㠀䘀㠀㘀䐀䈀㜀䈀㘀㌀䔀䈀㜀䐀㘀㜀䔀䘀䄀㠀㤀㜀䐀㄀㜀　䔀䐀㐀䈀䔀㠀㌀㠀䈀䈀㌀䌀䐀㌀㈀㤀㔀㜀㠀䘀㠀㔀䐀䔀䌀䘀䄀㈀㘀䄀䔀䐀　㄀㤀䄀䌀㠀䐀　㌀㔀䘀㐀㌀䐀䔀㌀㈀㜀䐀㠀䌀㜀　㄀䔀䄀㈀㌀㈀㠀㘀䈀㌀䔀䔀㐀䘀䌀㜀㤀㔀䄀䔀㤀䄀㤀㠀㄀䌀䌀䐀䔀䌀䌀䔀㜀㈀䐀䈀㐀䌀䄀㈀㐀䄀䌀　䈀㈀㔀䐀　㠀䐀䄀㜀　㐀㈀䘀䘀䌀㜀䐀䐀㈀㔀䌀䔀䐀㜀䄀㌀䄀㈀䄀䘀䔀䐀㜀㐀㐀㄀䐀䘀㘀㠀㈀㠀䌀䔀䐀㘀㈀㐀䘀㤀㠀㈀䈀䘀䔀㈀䘀㐀㔀　㔀䔀㘀䔀㔀㐀䈀䄀㠀㐀㜀䄀㘀㌀㄀㤀㈀㐀㌀㜀㜀䈀㤀䈀䈀䈀㔀䘀䈀䄀㤀䈀㔀䔀㤀䄀㜀䄀䐀㄀㠀䈀㌀㘀䄀䌀㠀䌀㈀㜀㜀㜀䌀㐀㘀㈀㐀䐀䘀䐀㤀㔀㔀㤀䈀㜀㌀䐀㄀䔀䔀㄀㔀䐀㐀䐀㤀㄀㠀㈀㘀䌀䔀㌀　㘀㌀㠀䐀㈀㈀䄀䌀㌀㔀䘀䐀㈀㄀䌀㜀䌀䘀㠀　㤀㘀㠀㄀㐀䄀㌀䘀㜀㠀䔀㠀㠀䌀䘀㐀㜀䌀㌀㘀䌀　䔀䘀㌀㘀䔀㌀䔀㐀㜀㜀㔀䌀㤀㤀䈀㈀㄀䐀㄀䈀㈀㜀䔀䘀㈀䔀　㜀㐀㌀㐀䘀䈀㐀㄀㘀䐀䘀䄀䘀䔀㔀䔀䘀㌀㌀䐀䌀㈀䔀䐀䔀㈀㈀䔀㠀㘀㈀䐀䘀䐀䈀㠀䘀㐀㘀㄀䄀䔀䘀䌀㈀䘀㘀䔀㜀㜀㄀䐀䄀㐀䌀䔀䈀䈀䌀㈀㘀䌀䐀㄀㘀䘀㜀㄀㘀䐀䐀㘀㤀㤀　䈀㘀㄀㄀㌀㘀㜀㠀㈀㜀䐀㠀㈀㄀㜀䌀䔀㘀䘀㐀㄀䔀䐀䐀㠀㐀㌀㐀㠀㔀䈀䌀㈀䔀䘀㈀䈀䈀㠀㈀㠀㠀㌀䈀䄀㠀䄀䐀䈀䔀䌀㌀䘀䄀䌀䌀㜀㌀㄀䐀䐀㘀䌀㐀㌀䘀㐀㈀㐀㜀㈀䌀䈀㔀䈀䔀㤀㔀㘀䘀　䔀䌀㐀䘀䘀䔀㠀㔀　䈀䘀㠀　䘀䈀㌀㠀㜀㐀䐀㤀䔀㜀䐀㘀㌀㜀㈀㘀䐀䄀䄀㜀䐀䘀㈀䘀䘀䘀㌀䘀䌀㜀㘀䌀䄀㐀㤀䐀㠀䐀㌀㄀㜀䌀㠀䘀㌀㘀䘀　䘀䘀㠀䌀　　䄀㘀　䄀㘀　䌀䌀㄀㤀㜀䄀㌀㤀㘀㐀䘀㄀㐀䐀㘀㄀䄀㜀䄀䘀䐀㈀㐀䐀㔀䄀䄀㔀㌀䐀㠀㄀㌀䔀㌀　䄀㠀䈀㌀䘀㘀㌀䈀㠀䌀䔀㄀䌀㌀㜀䌀㔀㜀㈀　䌀䘀䄀䐀㤀㘀㔀㈀㜀䈀㜀㤀㘀㜀㔀䌀㈀䐀䘀㘀㠀㈀䘀䐀㌀㄀䄀㘀㄀䘀㔀䄀䐀䘀䔀㠀䌀㜀㠀　䐀㌀㜀䌀　䔀㘀㘀䈀㔀䐀㄀㐀䘀　㌀㔀㐀䘀䘀㈀㄀㤀䘀䄀㤀䈀　㌀䐀䌀䘀䔀㜀㔀㠀䐀　䄀䘀㤀䐀㤀㔀　䈀㈀㠀㘀䘀㌀㈀䌀䄀䘀䐀㈀䐀䄀䐀㌀㄀㜀䐀䈀㐀　㘀䘀㔀䌀䘀㠀㔀㘀䌀㜀㌀㤀㤀䘀㤀䈀䌀䌀䘀㄀㄀㜀䐀䌀㄀䔀䘀㔀㜀䄀䘀䘀㄀㈀䌀㔀㔀㠀䈀䌀㌀㜀䌀㠀䈀㘀䈀䈀　　䈀㈀䘀䈀㄀㤀㜀㤀䄀㔀䄀㄀㌀㔀䐀㘀㜀㠀䘀㔀㠀㘀䈀㘀䄀㌀　㜀㜀䄀㄀㜀䔀䄀䌀㄀㄀䘀㘀㌀䈀䄀　㜀䄀㜀䔀㘀㌀䌀　䔀䘀㤀㜀䘀䈀　㌀䐀㄀㌀㘀㈀䔀䐀䔀㐀䈀䘀㐀䘀䐀㘀䄀㠀　䈀䘀㠀㌀㔀㐀㠀䔀㌀㐀䘀䐀㐀　㤀䘀䈀㄀䐀㜀䈀䌀䘀䄀㌀㤀䐀䄀䐀䈀䘀㐀㌀㜀䔀䘀㌀㈀㘀䄀䌀㄀㠀　䄀䔀䄀䌀㘀㘀㄀䐀㈀䄀䐀䔀㈀㄀㈀䘀䄀㔀㐀㔀㘀㈀㄀䘀㜀䈀㐀㈀䘀䌀　䘀㤀㠀㔀䔀䌀䔀䐀䈀　㌀䄀䐀䈀䘀䐀　㄀㄀㐀㜀䌀䌀䐀㌀䔀㠀㜀䘀䘀䔀㜀䔀㠀䈀䈀䌀㐀䈀䘀㜀䘀㐀㄀㌀㘀䘀㜀㔀㐀䌀㜀㄀䈀䔀㈀䐀䔀䐀㤀䐀䈀　㜀㜀　㘀䘀㘀䘀䐀㜀㠀㄀㄀䘀㈀㤀㐀㘀㄀　䌀㌀㈀㘀㠀　㌀䘀㘀䄀㈀䐀㔀䘀䄀㐀㌀䐀　㌀㄀㠀㤀䔀㈀䔀䌀䄀䈀㐀㠀㤀䌀㐀䘀㤀䔀䈀㌀䔀䘀㐀䘀䘀㠀㘀䔀　㐀㜀㘀䐀䔀　㠀䄀䐀　㐀㌀㘀䔀㜀㌀㌀䘀㘀㤀䈀㐀㠀䐀㠀㔀㔀䄀䘀㠀㤀䘀㜀㠀䐀䘀㘀㜀䐀䐀㐀㤀㌀㔀　䈀㘀㐀㔀䘀䄀㤀䐀䈀㐀㄀䘀䔀㔀䈀䘀㐀㌀㜀䔀䘀㄀㜀䐀㌀㘀㐀䐀䄀㈀䄀㌀䘀䐀䈀㔀㌀㘀䘀䄀㄀　㌀䔀䈀㠀㤀㐀㜀䘀㤀　㐀䔀㈀䘀䌀㌀䐀䘀㠀䈀㜀䌀㜀　㌀㔀䄀㜀㈀䔀䐀㐀㠀㌀㠀㘀㔀　㄀㄀䄀䐀䄀　㄀䐀㈀㠀䔀㜀㄀　㄀䐀㔀㘀䘀䄀䄀㤀㠀㌀䐀㐀䈀䘀㤀㠀䔀㤀䈀䔀　㠀㔀䘀䄀䌀㈀䘀䐀㔀㤀㜀䔀㔀㔀䈀䔀㈀䈀䈀䈀䐀㐀䈀㔀䌀䐀㈀䌀䈀䘀䌀㤀䘀㜀㜀㤀　䄀㜀㄀䈀㜀㈀㠀䔀䄀㈀㄀㈀㤀㄀䈀䄀䘀㘀䈀㈀䄀㤀㤀㜀䐀㤀䄀㤀䄀䐀䘀㜀㐀㈀䈀䘀䄀㔀㔀㘀㈀㤀㠀䐀䄀　㠀㄀䐀㘀㘀䔀䔀䘀㤀䘀䔀䈀㤀㔀䔀䘀㠀㌀䔀㜀㐀䘀㤀䐀䐀䐀㜀㘀䘀䔀䘀㄀䈀㌀䈀㜀㜀䐀䘀䄀　䐀䐀㄀䐀䈀㜀䈀䌀䘀㔀䐀㐀䘀䄀䔀䘀䘀㈀䈀㜀㐀㠀㔀㄀䘀䈀㤀䈀　䈀㐀䘀䌀㔀㔀䌀䈀䄀㌀㈀䐀䌀䈀㔀䄀㄀䔀㘀䈀䘀㤀䔀䈀㤀㘀䔀㔀䘀䌀䔀䘀㔀䈀㄀䄀䘀䔀㈀䐀㤀㄀䄀㈀䄀䄀䘀㘀㌀㔀㐀㘀䘀㠀　䘀䐀䘀㜀䔀䔀䈀　㘀䈀䈀㈀㈀㘀㄀㘀㄀㔀㈀㔀㐀㜀㐀䄀䈀㤀㠀䐀㠀䐀㘀㜀㄀㘀䐀䐀䄀䈀㘀㘀䈀䐀䘀㈀㄀㔀䔀䈀䔀㔀䘀䄀㌀䄀䔀㐀㤀䌀㤀䐀䐀䈀䄀䘀㜀䔀㠀㤀㤀䐀㈀䄀䈀㜀㜀㤀䘀䐀㐀䈀䔀䘀䐀䐀㈀䘀䄀㔀䘀㌀㜀㘀　䔀　䄀　䌀㄀㐀㌀㠀㘀　䔀㄀䈀㜀䔀䈀䐀㄀䐀㤀䘀㤀㔀㤀䐀㌀㌀㜀䄀㐀䌀㘀䔀䐀䔀䐀㠀㜀㄀㌀㜀㠀䌀㤀䘀㌀　㜀㄀䐀㈀䔀㐀㈀㤀㔀㌀䘀㌀䄀㜀㐀䐀㈀䘀㈀㠀㈀䌀㤀䄀㌀㄀䘀㌀䌀㘀㘀䈀㘀㈀䘀䌀䐀䄀㜀䘀㌀㐀䘀㄀㔀㤀㄀㌀䘀㈀㌀䘀㜀䈀䔀㔀䄀㐀䄀㜀䘀㤀䔀㌀　䐀䐀䈀䘀䐀䈀䘀㘀䄀㐀㐀䐀㌀㘀㜀䄀䌀㔀䄀䈀㘀䘀㐀㤀㘀㤀䈀㤀㜀㈀䌀㔀䔀㔀㐀䈀㤀㜀　䌀㄀䘀䌀㜀㤀㜀㌀䔀㜀㔀㐀㤀㐀䌀䘀䈀䔀䈀㄀㘀　䘀䄀䈀㐀䘀䌀䄀㤀㄀㌀䌀㘀㠀䘀㐀䄀㄀䘀㌀㤀䔀㈀䘀䄀䔀㄀䌀㌀㠀㘀　䔀㄀㤀㌀䌀㘀㠀䌀　㜀㔀䘀䐀䐀㌀䘀䄀䘀㔀㐀䐀䔀䐀䐀㌀䈀䈀㔀㜀㐀䄀䌀䘀㄀䔀䐀䐀䈀䈀㈀㔀㈀㜀㜀㔀䘀㔀㜀㜀㐀㤀䘀㐀㈀㔀㜀㐀䔀䔀䐀㐀㌀㄀䈀䔀㐀㌀䘀䈀㜀㘀㘀䐀䐀䈀䌀㐀䈀㔀㠀䔀㠀䐀㘀㤀㄀㔀㄀䐀䐀㔀䈀㈀㐀㔀䘀㌀㘀㘀㤀㄀㄀㄀㔀䔀㠀䘀㘀㤀䔀㠀㤀䄀䄀䄀㔀　䄀䘀㘀䌀㜀䘀㐀䔀䈀㄀㈀䘀㤀㠀㔀䌀㄀䌀䐀㐀㤀㌀䘀䐀㘀㌀䌀㘀䘀㐀㘀㘀䈀䘀䈀䘀　㐀　㄀㈀㔀㘀㄀　㄀䌀㔀㐀㄀㄀䘀㠀㈀㜀㈀㄀䄀䄀㜀　㤀䘀䄀㠀䄀㐀㔀㌀㈀㔀䘀䔀㌀㤀㐀䔀㤀㐀㠀㔀㤀䔀㄀㐀䄀㤀㤀㘀䔀䄀㜀㐀䌀　䘀䄀㔀㔀㐀䄀㈀㜀䐀䌀㌀㘀㤀㜀㠀䔀䘀㔀䔀䈀䔀㘀䌀䈀䘀㈀䘀䘀㠀㐀䄀㤀㘀䐀䘀㔀㜀䄀㜀㄀㐀㐀䐀㈀䄀㠀　㜀䈀㜀䐀㤀㘀䈀䘀䐀　㄀㜀䘀䌀㔀㐀䈀㠀㘀䘀㄀　䔀䔀　㜀㠀㐀䈀䈀　㔀䐀䌀㠀㤀㠀㤀䌀㠀䔀　䌀䈀㘀䔀㌀㜀㌀㜀䌀䈀㄀㜀㔀㐀㠀䄀㜀䐀䐀㤀䌀㄀㤀䌀㔀䈀䔀㜀　㘀䈀㈀㠀䈀䈀㌀㔀　㔀䌀㐀䐀䈀㌀䌀㠀㐀䌀㜀䘀㘀㘀㜀㤀㘀㐀䔀䘀㔀䔀㔀㐀㄀㌀䐀㤀　䌀䌀䔀㘀㘀㜀　　㔀䐀䈀䘀䄀㤀㜀䐀㐀㈀㠀㘀䐀㐀㜀㈀㠀䌀㈀䄀㄀䈀㘀䌀䐀㄀䔀㔀䄀䄀㌀㤀㈀䈀㜀　㔀㤀㠀　䄀㜀㘀䘀　㘀㜀㘀㔀　㜀䐀䈀䘀䈀䈀㌀㤀㠀㠀㌀䄀　㤀㘀㤀㐀㔀䐀㔀㈀㄀㘀㤀䌀㌀㠀䄀㤀㈀　㌀䈀㈀䈀㌀䔀㌀㄀䈀㄀䈀　㜀㜀䄀䘀䄀　㤀㈀㔀㤀䔀䄀㤀䘀㄀䐀㈀㐀㜀䘀㐀㘀㌀　㈀䄀㐀㔀㈀㐀䄀㄀㐀䌀㔀㄀㐀䐀䐀　䌀䌀　䌀㜀䄀㐀㐀㌀㔀䈀䔀㜀㤀䐀䌀㄀䄀㔀䄀䔀䈀䄀䈀䔀㤀㜀㔀㈀䌀䈀　䄀䔀㈀䔀㤀䄀㘀㘀㄀㜀䄀㜀㌀㐀㈀䘀䘀㌀㤀㜀㤀㔀䌀䌀㈀䌀　㠀㘀䄀㈀㔀㠀㔀㔀䌀㐀㜀䄀䈀㄀㐀䐀㐀㤀䈀㄀㔀㘀䌀䈀䈀䔀㈀䘀䐀㜀㘀　䐀㔀䔀㄀㐀㄀䔀㤀㌀㔀㤀㔀　㄀䐀㄀䔀㄀䈀䄀䘀　㔀䈀㈀䐀䈀䌀䐀䘀㌀䈀㄀㌀㜀㄀　䄀㠀䘀㘀　㔀㜀㜀㐀䌀㈀䄀　㠀㠀䘀㐀䐀䔀㐀䌀䘀䌀㈀㐀㈀㤀㐀㠀㄀䈀䌀㘀䄀㔀㈀㐀䔀㜀㄀㈀　　㜀㔀㔀䄀䘀㐀㌀㈀㜀㠀䔀㤀䐀䔀㈀㐀㌀㘀䐀䔀䄀䄀䄀䌀㈀㠀㈀䄀　䈀㈀　䄀㔀㔀䘀䄀䈀㠀㈀㔀䐀䌀㈀䄀䈀䈀㜀䐀䔀㔀䘀䔀㘀䌀　䔀㈀㤀㤀䔀䔀䘀　䈀㐀㘀䘀㠀㌀㌀䘀䌀㜀㌀　㌀䘀㌀㠀䈀㌀㄀㌀㐀㄀䐀　㈀㐀㄀㤀䄀㜀䌀㜀䈀㘀㈀㘀䐀㠀㜀　䔀䔀㤀㠀㜀䄀䐀䈀㌀䐀㐀㈀㄀䐀䈀㄀㜀㤀㠀㔀䄀䔀　㐀䘀　䌀㠀䔀㠀䌀䘀㜀㄀㜀㤀㘀㘀㐀㜀㔀䄀䌀㘀㤀㐀䐀㠀㄀䌀㤀䈀㜀㄀䘀㘀䄀㤀䘀䔀䔀㘀䈀䐀䘀㌀㠀䄀㘀㜀㜀䄀䘀㤀䄀䔀㠀㔀㘀㜀㘀䌀㜀䐀㘀䈀㐀㠀䌀㤀㈀㠀䔀䔀㘀㈀䐀䌀㈀㄀䐀䔀㔀䄀㄀㌀㠀䔀㄀㄀㈀䌀㤀䐀㤀㌀㔀㜀㘀㜀㈀䄀㠀㘀㜀㄀㔀䔀㘀䌀㠀㤀䘀　䈀㠀㄀　㠀䘀䄀㐀䄀㜀䐀䔀　䄀㐀䌀　㠀䘀㌀㘀　䐀䔀㘀㠀䘀䘀㈀䌀㄀㄀㐀㈀㠀㄀䐀㠀䌀㘀㐀䘀㠀㈀㤀㔀㐀㤀　㈀䈀㔀㠀㠀㘀㄀㄀㤀㤀㄀㜀㠀䌀䌀㠀㈀䌀　䔀㐀㐀　䘀䔀㔀㜀　䌀䔀㄀䘀㌀㐀㤀㈀䄀㈀䘀䐀䈀䔀䌀　䐀㜀　㐀　㤀䘀　㜀䘀䘀䄀㐀㤀䔀㌀㤀　㄀㈀㄀㤀㘀㈀㈀㘀㐀㔀㜀䘀㐀䐀䔀䌀㘀㐀㌀㤀　㤀㠀㤀㄀䄀䔀㈀㄀䐀㜀㜀㌀　㈀㔀㈀㔀䐀㠀䈀㌀㈀㜀㠀䈀㠀㠀㈀㜀㄀㌀㘀㌀　䄀㄀䔀㐀㜀　㠀䘀䘀㠀　䐀䔀䈀䐀㘀䔀䄀䐀㔀㌀䘀䐀䘀䔀㈀㔀䐀㄀㌀䔀㄀　㜀㐀㄀䘀㐀䐀㐀㐀䐀䘀㤀㘀㄀㐀　䔀㐀䐀㐀㔀䘀㜀㈀㜀㈀㘀䘀㈀　　䄀䘀䄀䐀㐀䈀䄀㜀䐀㤀䘀　　㐀䄀䈀㈀㘀㄀㔀䐀㠀㜀䔀㄀䘀䌀䐀㠀䔀䄀䘀䄀㔀䘀㐀䐀㐀㤀㐀䌀㈀䄀　㔀䄀䌀䌀㌀㄀䌀㜀㤀䌀㤀㠀䈀㠀㜀䌀㠀䔀䄀㤀㜀㈀㘀㈀㐀㈀䐀㤀㠀䈀䘀䐀㤀　䔀㐀䄀㜀㠀㐀㐀䄀㠀㠀　䈀㜀䄀㤀㌀㐀㌀㜀䘀㔀㄀䐀㄀㘀䐀㘀㈀䈀㌀䔀㜀　䔀　䐀㈀䄀㘀䐀䄀䔀㄀㈀㔀䐀㘀䔀䌀㜀㠀䘀㤀䐀䔀㈀㄀䘀㌀䈀䄀㤀䄀㠀䌀　㤀㜀㄀䐀㈀㠀㤀㘀㜀䐀㌀䈀㜀㘀㘀䄀㈀㌀㤀䘀㄀䐀㌀䘀㌀㠀㄀㐀㈀㜀㔀䐀䌀㄀䐀㠀䌀䌀　㈀㈀䐀㔀䔀㤀㔀㈀䔀㌀㔀㔀䔀㄀㌀䈀㄀㄀　䌀䄀㤀㤀䄀㄀䌀㐀䔀䌀㈀㤀㘀㠀㄀䔀䐀㐀㤀㌀䘀　㘀㜀　䄀䄀㄀㈀䔀䄀䈀䘀㌀㜀㠀㈀㄀㤀㔀㈀㈀㐀㐀䘀㄀䔀㔀　㐀䄀㌀㠀䈀䌀㜀䐀㠀㤀䘀㠀㔀㤀㄀㠀㤀㠀㤀䐀㜀㤀㠀䄀㤀䌀䔀䘀䄀㤀䌀㜀㌀　㤀䐀㈀㤀　㐀䐀䈀㈀㄀㤀㄀䌀㤀䄀䐀㈀䐀㠀㌀䘀䄀䌀㤀㄀䈀䘀㄀㄀㜀䈀䌀䐀　㌀㄀䄀㄀㠀䐀㘀㤀㌀䐀㔀䈀㄀㔀㌀㠀䈀　㈀㠀㄀䌀㠀㐀㘀㜀㄀㄀　㌀㔀䈀䈀䌀㈀㔀䌀㐀㤀㈀　䘀㄀㌀㐀䈀㔀㈀　䐀㄀㤀㜀㄀㤀䄀㐀㜀䌀䌀䌀䌀䌀㈀㐀䘀䌀䐀㔀㔀㤀䌀㜀　㘀㌀㌀　䄀䔀㌀㠀㌀䔀㤀䔀㠀䈀㈀㐀䌀㐀䔀　　䘀㤀䈀㌀㠀㌀䄀㐀䈀㜀㔀㄀䌀㈀㜀㠀䔀㤀㈀䔀䌀㐀　䘀㐀䈀㘀㜀䔀䘀㔀䔀㌀㤀㔀　㜀㐀㠀㄀㐀　㠀䔀䐀䘀㤀㜀㄀㌀㈀㠀　䔀㤀㐀䐀㐀㔀㤀㔀㔀䈀㌀䘀䐀䈀䔀㘀㠀㜀䘀䔀　䈀　䘀䄀䈀䌀䘀䄀㜀䌀㘀　㐀㤀㜀㘀䈀㄀㈀㌀㌀㠀㜀㔀䐀㘀㤀㄀䈀㔀䘀㄀䌀㄀㤀䌀㜀㔀㠀㔀䔀㠀䄀䈀䈀㤀䌀䄀䐀　䐀䔀䈀䐀䘀䌀㄀䌀㄀㌀　㠀㤀㐀䐀㔀㤀　㤀㘀㠀㐀㘀䄀䐀㈀䔀㌀㘀䈀㄀㐀䔀㄀㄀㠀㤀㐀䈀㤀䈀㘀㌀　㌀㠀㈀㄀䄀㔀䐀　㄀䘀㤀䌀㤀䐀䔀㈀㐀䘀䘀㐀㄀㜀㤀㐀䄀㌀㈀䐀㌀㔀㐀㌀䄀㤀㜀㤀䔀㈀䐀㐀䔀㈀㐀䌀䈀㠀㔀㐀䌀䄀䄀㠀䘀㄀㈀䈀㘀䈀㈀㘀䐀㔀䄀㐀㈀䈀㘀䈀䄀㘀㄀㐀㄀㔀㄀䌀㠀䔀䌀㘀㈀䄀䈀㔀㘀㘀㘀䄀㐀㄀䄀䐀䄀䄀䄀㠀㤀㤀䌀㔀㄀㤀㠀㔀㌀㔀㔀䐀㄀㄀㔀㜀㜀　䐀㠀㠀㜀䄀㔀㐀㈀㠀㐀䄀䄀㄀䌀䌀䄀㠀㄀䔀䌀䘀㄀䈀㄀㠀㜀䌀㘀㈀䄀䔀㠀㤀䄀㔀䄀䐀㔀㈀䈀䐀㈀䌀㜀㄀䘀㐀䔀㈀㜀䄀䄀㄀㈀䈀㄀䈀䄀　㠀㄀　䘀䔀䐀㈀㌀䄀㠀㔀㐀㐀㤀㠀䐀㜀　㤀㔀㌀䄀㠀䈀㐀㐀䔀䈀㔀䌀㌀䄀㈀䔀䐀㠀䄀㤀㈀㐀㔀㐀㔀䔀㤀䈀　㈀㤀㐀䄀䔀䈀㜀㐀㌀䈀㈀㘀䐀䐀㐀㤀䄀䐀㈀㌀䌀䌀㘀䈀㠀㜀㔀㔀䐀㤀䄀㤀䈀䈀䌀䈀䐀㐀㔀䔀䌀㐀㐀㐀㜀㌀䌀䌀㄀㄀䌀㈀㠀䄀㐀㌀㈀㈀䐀㈀䘀䔀䄀㤀㠀㄀㘀㜀㘀䄀㐀㄀㜀䄀䔀㐀䄀　䘀㐀䄀㄀䔀㤀䌀㌀䐀㈀㐀㜀䄀㠀㈀㌀㔀㔀䘀㐀　㠀　㜀䐀㔀㈀㈀䔀㐀　㠀䐀㈀　䔀㔀㌀䔀㠀䐀　　㠀㘀㔀䄀㐀㄀㈀㔀䘀㠀㌀㌀㈀㈀㜀㠀䈀䔀　㌀䄀䄀㔀䄀䄀㘀㘀㔀㠀㜀䄀䘀䌀㘀㄀㔀㄀䐀㈀㘀㐀㤀㤀䈀㈀　䄀㈀㤀㌀㤀䄀䌀㈀䄀㄀㐀　㘀䌀䔀㌀㤀㔀㤀㔀㠀㐀㄀䄀㠀䌀䘀㘀䔀㜀㠀㜀䔀㐀㌀　䈀䘀㈀㠀䈀　䄀　䔀㠀䐀㈀　㤀㐀㈀䘀㌀䔀㤀㄀㈀㈀㠀㌀㜀䘀㔀㠀䐀㌀㠀㈀㠀㤀䘀　㌀㤀㈀㐀㄀㐀㄀㌀䌀䈀䘀㤀䘀㐀㤀㐀㠀㈀䔀㘀㘀䄀㘀　䔀䌀㄀㐀㐀㠀㈀　㐀㜀㐀㘀　䔀㠀䔀㠀䘀　䌀㠀䈀䘀㘀㜀㄀䌀㘀䄀　䔀㈀　䘀䌀䔀䘀㈀㈀䘀㐀䘀䔀㐀䐀㘀　㔀䄀㜀䘀㤀㘀䘀㐀䘀㐀㐀䄀　㌀䘀䔀㠀㠀㌀䈀㘀㐀㘀䄀㈀㄀䄀㄀䄀䐀䐀䈀㄀㌀　㄀　䘀　䔀㄀䐀㜀㠀䘀㔀䔀㈀㤀㤀䐀㔀㘀㘀　㜀䘀㜀㈀㤀㐀䐀㈀䄀䈀㈀㌀㐀䄀㈀䄀　䌀㔀㘀䌀䐀㜀㘀䐀㈀䌀㘀㜀㜀㠀㐀㐀䌀㌀㐀㜀㠀㤀䈀㈀㌀䄀䈀㤀　䄀䈀㐀㌀㄀䐀㔀㤀㠀㜀㠀㐀㘀䄀䈀䈀䌀㌀䄀㤀䔀䐀㄀㘀䐀㐀䌀㘀㠀䔀㠀　㔀㌀㔀䐀䈀　䘀㐀䈀㈀䈀㔀㠀㄀䘀䈀䄀　㌀㈀㠀㌀㌀䘀䌀㔀㤀䘀㘀　䈀䘀㘀㘀㈀　䘀㤀䔀䐀䘀䄀䈀㄀㐀䄀䐀䈀㤀㔀　㘀㘀㘀　㘀㠀䄀㈀　㠀䘀㠀㤀䌀㄀㐀䔀㔀䌀䈀㄀䔀㐀　㌀䐀䔀㤀㘀㄀䐀　䈀㐀㔀　㤀䔀　㘀㐀㤀㌀䔀　㐀㐀㄀㄀㠀䈀㔀㌀㈀㤀㘀䌀㠀㈀　䄀㤀䔀㐀䈀㌀䔀㔀㘀㜀㈀㔀　㤀㌀䘀䔀䈀䌀㄀䄀㜀㔀㜀䌀㠀䄀䄀　㠀䄀䄀　㠀㄀㌀䌀㜀䘀㜀㘀㄀㤀㔀㈀㌀　䈀　䔀㠀　䔀䌀　㘀　㈀㔀䘀䄀䌀䄀　䄀㌀㤀㤀㔀㤀䘀㈀㜀　䐀　䈀䘀䔀㄀㔀㄀㌀㈀㤀㘀㄀㠀㤀㜀㠀㈀㄀㄀㄀㠀㔀　㜀䄀㈀㠀㜀㌀㤀㌀䔀㐀㔀䘀䄀䔀䌀䔀㤀㄀䈀　㠀䌀䔀㘀㤀䔀䌀㤀䐀㄀䈀䘀㈀䔀㘀㌀　㘀　䄀㌀㈀㐀䘀㔀䈀㄀䐀㔀　㐀䐀䄀㈀㈀䄀㘀㘀䌀㘀㈀㜀　㜀䔀㜀䌀㜀　㘀㄀㘀㄀㐀䄀㈀㠀㐀㤀　㤀䈀㜀㌀㤀㠀　䈀㤀㌀䐀㤀㐀㈀㜀䘀㠀㔀　㤀㄀㜀㤀㌀㐀䄀㌀㄀㠀䌀䈀䌀䔀䔀㠀㘀　㔀㔀㘀㤀　㤀㔀㠀䌀㐀㜀䄀㤀㌀㔀䈀䔀䄀㐀㜀㐀　㄀䔀　㈀㜀䌀　㔀䈀㌀䔀䐀㄀䔀䔀㐀㠀㔀㌀䄀䌀　㤀㘀㔀㌀㘀㤀　㤀䈀㈀㜀㄀㈀䘀䌀䈀㤀䄀㠀㈀㠀䈀㔀㈀㄀䄀㄀㔀　㤀㤀䐀䄀　㐀　㐀㔀䄀㄀㈀　㘀䔀㐀䔀䈀　㘀䄀䄀㈀䄀䘀䈀㠀䐀　㔀㜀　䌀㄀䐀䄀㈀㐀䌀㐀㈀㘀㜀䌀㜀䘀䈀㠀㈀　㘀䄀㠀䄀䘀　㈀䔀㘀㤀㌀䈀䘀㠀㐀䘀㔀䌀㘀㐀㐀䈀䈀㌀䐀㄀㌀䄀㄀䘀䌀㐀㄀㐀䄀　㈀㔀㌀㤀　㤀㜀㜀㠀䐀㠀䔀㈀㠀㌀㄀䔀䔀㠀䈀㌀㠀䄀㤀㈀㜀㈀㌀䘀㈀䈀䐀㜀㈀　䌀䈀䈀䈀䐀䐀䘀䈀䌀䌀䄀㌀　䔀䔀䔀㘀㠀㐀䄀㐀㄀㤀　䔀㈀　㌀　㄀㌀䘀㘀㐀　㠀㈀䌀㈀㘀䔀㔀㈀　㌀㄀㠀䄀㐀䘀　䔀㤀䄀䌀㤀䈀㤀㐀䌀䘀　䈀㜀㈀㐀䌀㔀㔀䘀㔀㈀䌀䔀㤀㘀㔀䐀　㔀㄀䈀㜀㘀䔀㔀䈀㘀䌀㤀　㄀㜀㘀㐀㔀䔀䘀㜀　㘀㤀䘀㄀䐀㤀䘀䔀䌀㐀㐀㈀㈀㐀㔀㄀㤀㌀㐀㐀㔀䘀䄀㈀䔀㌀㌀　䐀㄀㘀㘀䘀㌀㐀㜀㘀㤀㠀　䔀䐀䌀㘀㄀䈀㠀䈀㔀㌀䐀　㄀㌀䄀䐀　㈀㌀㄀　㄀䐀䘀㤀　　　㈀㘀䘀䌀㠀䐀䐀㄀䘀䌀䔀䘀㐀㤀㐀䈀䄀㜀㄀㔀㐀㌀䄀䘀䘀㤀䄀㈀㜀䐀㌀㤀㌀䔀㌀㄀䐀㐀㈀㔀䘀㄀䘀　䄀㄀㄀㌀㜀㈀䐀㤀㔀㜀㠀㠀㠀㈀䔀䌀㠀㐀㄀㄀㐀㤀㤀䌀㄀　䘀㤀䌀㔀㔀䘀㜀㈀䈀　㌀㈀䄀㔀䔀㘀㐀㘀㐀䘀㔀㈀㐀㌀㠀㠀䘀㠀㔀䈀㤀䌀㘀㈀㈀㜀䘀㘀㠀䄀㔀㈀㠀㔀㄀㄀㄀㄀㤀䌀䔀㠀㈀㐀䘀㄀㠀㠀㌀䘀㌀㠀㘀䔀㐀䔀　㤀䄀䄀㘀䐀　㜀㈀㌀㤀㈀㄀䈀䄀䘀㐀䌀㈀䔀㄀㈀䔀䈀　㈀　㘀㠀䄀㌀䈀䌀䘀㐀㠀䌀䄀㐀㔀䘀㜀䄀㘀㐀㌀䄀䄀䔀㈀㌀㤀㌀㜀㘀㘀䐀㄀㔀㐀䈀㤀㘀䌀䐀㠀䘀㤀㜀㌀㌀㤀㘀䈀䈀䌀㌀㌀㘀　㜀㘀㌀㘀㠀㐀㄀㐀㌀䄀　䈀　　䔀㐀䈀䐀㈀㘀㐀㤀㔀㤀㌀㌀㌀㄀㔀䌀㄀㌀䌀䔀　䌀䌀㘀㠀䌀㤀䐀㌀䌀㈀㌀㄀䔀㄀䐀䐀䈀䈀䈀㘀㘀䔀䄀䄀䄀㔀㄀䌀䐀䈀㐀㔀䔀䘀䌀䄀䈀㜀㘀䄀㄀㐀䔀㤀㐀䄀　䄀㔀㘀㠀㌀䐀㘀㤀㌀㠀㘀㠀䌀䘀㔀䄀䈀㌀㔀㌀㐀㈀㤀䐀䐀㘀䘀䐀㔀　㜀㈀䈀䈀㠀㐀䐀㜀㤀䔀䐀㌀㜀䄀䐀　㔀㤀㐀　䐀㔀㜀䄀䐀㐀䄀㘀㜀㐀㐀䄀㌀㠀䄀䌀㜀㔀䐀㌀㌀䄀䐀㔀　䔀㐀䈀㐀㠀䄀䘀䐀㌀䘀䌀㠀㜀㘀㈀䔀㈀䐀㈀䄀㈀㐀㘀䘀㔀䐀㘀㜀䌀㔀　䌀㄀䄀㤀䔀㈀䐀㌀㠀㜀䌀䘀䌀㔀䌀　㐀㄀䔀　䄀㠀䌀㘀䐀䈀㤀䄀㔀㤀㔀䄀㘀㜀㠀㐀㐀㜀䔀㌀䘀㌀㈀䔀䄀　　䄀㌀㠀　㠀㄀䌀　㔀㔀䔀　㌀䈀　　㤀䌀㐀㈀㜀䌀㜀䘀䄀㠀　䌀㔀䌀　㜀㘀䔀　㈀䌀䌀㜀㘀㠀㤀䐀䈀㐀㠀䔀䈀㔀䈀䔀㠀㐀䔀㠀㔀㄀䐀䐀䈀㐀䘀㘀䌀㠀䐀䈀㄀䔀㐀䐀㠀㠀䐀㈀䐀䄀䐀㈀㘀㜀㠀　　㔀㘀㠀䔀　䈀㌀㈀䐀㘀䄀㘀䐀㐀䈀㄀㌀㠀　㔀㤀䌀　㐀䘀㠀㄀䔀䐀㠀　㈀㤀䐀㈀㜀㄀䌀㠀㘀㈀䔀　㈀䔀䔀　㈀㠀䘀　䈀㤀㠀㠀㐀㤀䐀㜀䐀䄀䐀㘀㌀䔀䐀㐀㄀䘀䈀䌀䈀㜀䄀䐀㔀䐀㈀䈀䌀㠀䄀㄀䘀㤀　䈀䐀㌀㠀㐀䈀㜀䌀㐀䘀㘀䌀䔀䈀䌀㔀㄀㜀㠀　䘀㐀䐀㈀䘀䈀㐀䔀㤀　䐀㤀㌀㘀䌀㤀䄀㤀㔀㘀䈀㈀㜀㄀䈀㘀䄀㈀㜀䔀䈀㜀㜀㤀䐀㄀䐀䐀䌀㈀㜀䌀㌀䄀㘀䐀䐀㜀䄀䐀㤀㌀㐀㈀㘀㈀㤀䄀䐀㠀䄀㘀㤀㘀㐀㠀䈀䈀㐀㘀㌀䄀㌀䐀䄀㘀㠀㘀䐀䐀　䌀㠀㌀㘀㘀　㜀䌀　㤀㌀䔀㄀㔀䘀㔀䈀㜀㄀㐀䄀㔀㈀㠀㤀㐀㐀　㌀䈀䈀㐀㌀㠀　䄀　㈀䄀䄀㘀㘀䌀䄀㤀　㜀㐀㈀䐀䔀㘀㔀　䐀㜀䔀㐀䈀㐀䔀䐀㐀㜀㌀㔀㤀䐀㄀㐀㐀䐀䐀㔀㄀㐀㈀䄀䄀㌀　㐀䔀䈀㤀㠀䄀㘀䐀㐀䈀㘀㘀㠀㤀㔀㌀㘀㈀䄀㔀㈀䈀㔀䐀㐀䌀䘀㈀㠀㠀㘀㄀㈀䐀㐀㜀䘀䄀㠀㤀䘀䐀䄀㌀㄀䔀䄀䄀㜀㠀㜀㔀䄀䈀㘀㐀䄀䐀䈀㌀䔀㈀䄀㐀䘀㜀䐀㤀㜀　䔀　㈀㐀㜀　㄀㐀䐀㜀䐀㄀㜀䈀䘀㜀䘀㔀㌀䘀䘀㐀㘀㜀㜀䄀㤀㘀㜀䈀㤀䌀䘀䘀㄀㌀㤀㄀㈀䐀㠀　䔀㄀䌀　㔀㔀䔀　㔀㌀䔀　㌀㐀䌀䘀㔀㈀䌀㜀䔀䐀䘀䌀㄀䔀䘀䐀䈀䔀䄀䐀䈀㄀㐀䄀㔀䘀䔀㤀㔀㔀㈀㠀㄀㤀㄀䌀　㈀䌀㘀　㌀䈀㜀　㄀㐀䘀㠀　䌀䘀　䄀㠀㜀䘀䌀㔀㘀㜀䈀㐀䘀䄀㄀㘀㄀䈀㜀㤀䔀㈀㤀㌀䐀䐀㈀㌀　㄀㔀㔀㜀䐀　䈀㤀䘀䐀㄀䔀䄀㤀䈀㘀㠀䐀㘀㤀䈀䘀㠀㠀䌀㔀㈀䐀䘀㠀　䔀䈀　䐀䘀㔀　䐀䈀　䘀㘀䌀㜀䐀䄀㐀㄀㐀㌀䐀㈀　䔀　䈀㐀㜀㐀䄀䄀䄀㜀㐀㈀㐀㈀㐀㐀㤀㐀㜀䐀䈀㜀㠀䔀㤀㠀㠀㘀㤀㤀㌀㔀㘀䄀㜀䘀䔀䄀㄀䘀㘀䐀䈀㄀䔀㤀　䄀㠀㘀㐀㠀䌀㌀㐀㈀㐀䔀䄀㔀㤀䄀䐀　䈀䘀㘀䄀㘀䘀䐀䈀㔀㈀䔀䈀㔀㐀㤀䘀䐀㈀　㜀䔀䔀䐀㘀䄀㠀㜀䌀䘀㐀䈀䄀㠀㔀㌀䐀䘀㌀䈀䔀㐀㐀䈀㐀㤀䐀㠀㌀㄀䄀䄀䄀䘀䘀䄀㌀䄀　㔀　㄀㌀䔀㈀㤀㜀㠀㄀䐀㌀㔀䈀䘀㐀䔀㌀䔀㘀　㈀㈀㔀　　䌀㈀䌀　㄀㐀䌀䈀㠀䌀䔀䌀　㜀㔀㠀㘀䄀䄀㠀　　㜀㠀　㄀䐀㐀　㄀　㠀　㤀㐀䔀㄀㌀㌀㄀䄀䘀　䄀㤀㈀䘀　㄀㈀䘀　㌀㘀㜀䄀㠀㈀䘀㤀　　䔀㐀䌀　㐀䈀䌀䔀䄀㘀䈀䈀㔀䄀㠀䄀㘀㐀䔀㜀䐀䈀㔀㌀㘀㌀㤀㈀㌀㘀㄀㔀㐀㄀䈀䘀㔀㤀㐀㜀䄀㠀㈀䐀䄀䄀㈀䌀㜀㔀䘀㔀㄀㔀䘀㄀㐀䘀㐀㘀㔀䘀㔀䈀㠀䄀　䈀䘀㔀㌀㔀䘀㄀　䘀㐀㈀㐀㘀㠀㘀㜀䐀　㤀㜀䐀㐀䔀㌀䈀㔀㤀䐀㄀㌀㘀㠀㔀㐀㌀㌀䌀㐀㄀㌀䘀㈀㐀㐀䘀㌀㘀㤀㌀䐀㘀㠀㈀䄀䔀㈀　䐀䘀㔀䐀㜀㠀㜀䈀䄀䌀㘀㈀㐀㔀㠀䄀㌀㔀䄀䄀㤀㐀㜀䐀㄀㜀㜀　㤀䘀㠀㐀䌀　㔀㐀㘀　㈀㄀㌀㠀　㔀㤀䌀　㐀䘀　㄀㔀㌀㌀䐀䄀䄀㜀㘀䄀㤀㈀䐀㐀䈀㠀㠀㐀㄀㈀㄀䌀䘀䐀㈀㐀䈀䐀㠀㔀䈀㈀㜀䄀㠀䈀㔀䘀㐀㤀㄀䄀　㜀䈀㘀㤀㤀㜀㤀㜀䐀㈀䔀㜀㈀㜀䄀㐀㈀㜀㘀㜀㐀㈀　　㜀䐀䘀䌀㤀㄀㌀䌀䘀㐀㜀䄀䈀㠀䘀　䈀㄀䐀䐀䈀㜀㌀䐀㔀㤀㐀䐀㐀䘀䐀䔀䘀㠀㌀　䈀䌀䘀䌀㤀㄀㜀䌀䘀䘀㐀㌀㜀　䘀㄀㐀㜀䘀㈀䈀䐀䔀䈀䔀　䔀㈀㠀䘀䔀㐀㄀㔀㜀㜀䌀㌀䌀㔀㄀䘀䌀㤀　䈀㘀䘀㠀㔀㠀䈀㌀䘀㤀㈀䌀䈀䔀㘀䌀㌀䌀㔀㄀䘀䌀㤀㐀㔀䈀㌀䔀　䔀㈀㠀䘀䔀㐀　㤀㔀㌀䔀㄀䌀㈀㐀㜀㤀䐀䈀䄀䔀䐀㤀㤀䄀䔀䐀䐀㄀㈀　㘀㐀䐀㔀㠀䄀　䘀㠀㐀㘀㐀㔀䄀㤀䈀㜀䄀㄀㤀㜀㘀䔀㐀㌀㈀䘀䐀䐀㠀㘀㔀䔀䈀䄀㠀䐀㜀㐀䘀㔀㌀㘀䘀䔀䄀㔀㘀䘀㜀㔀䔀㘀㘀䐀㐀䈀㘀䐀䌀䘀㤀䔀䔀㠀䈀㄀䌀䐀䔀㤀㈀㤀㌀䐀㜀䄀㈀㘀㔀㐀䌀㄀䈀㘀㜀㤀㐀䔀䄀㤀㤀䄀䄀䌀㔀㐀䔀䐀㔀㈀䄀䄀䌀䄀㤀㔀䄀䄀㌀䈀㤀㔀䄀䄀䈀䈀㤀㔀䄀䄀䔀㄀㐀䄀䐀㔀㐀䐀䌀䄀䘀䘀㤀　䘀㘀㈀㔀䘀　㔀㄀㄀㐀䐀㤀䌀㌀䘀㔀䄀䄀䘀䄀㤀㠀䄀㌀㘀㜀䄀㘀㘀㜀㌀㈀㔀㜀㌀㈀㤀㌀㌀㤀㜀㈀㐀䌀㠀　　㄀　㈀　㤀㄀　　㈀㤀㄀　䌀　㠀䈀㈀　䄀　㄀䔀㐀㠀㠀　㐀㠀㤀㠀　㠀　㈀　䔀　　㈀　㘀㌀䌀㤀　㈀㌀㈀㠀㤀㜀㠀㠀㠀㈀㄀㜀　䄀䔀䈀㠀㄀㌀㜀䄀㠀㘀㠀㐀㠀　㈀　䌀㠀㜀㈀䈀　䄀䄀䈀㜀䘀㜀㄀㔀㤀㔀䌀㜀㄀㔀䐀㠀䘀䈀䘀䌀㈀䈀䄀㠀㠀䔀㠀䈀㜀㐀㄀䐀䌀㘀㔀㤀㄀㄀㔀㌀㈀䘀㌀䈀䐀䄀䄀㤀㤀　㤀䌀㤀䔀䄀䘀䔀㜀䔀䘀䈀䘀䐀䈀䔀㘀㤀䈀䄀䄀䈀䈀䄀䘀䄀㜀㔀䐀㔀䄀䈀㔀㜀䔀䘀䄀䔀䐀㘀䐀㐀㐀㜀䄀㄀䐀䔀　䘀䘀㔀　㄀䄀㠀㠀䘀㐀㄀䘀䐀㌀䔀䔀㠀㠀䈀䄀㐀䄀㠀㠀㜀㔀㠀㜀㌀㠀㜀䐀䈀䘀㈀㤀㠀㄀㜀䔀䄀　䘀㐀㌀䘀䐀㜀㘀䄀㠀䄀䘀㠀㌀䘀䄀　㠀䐀㐀㄀㜀㐀㈀㜀䐀　㄀䐀㐀㠀㜀䄀　㈀䌀㄀㘀䄀㜀䔀㄀䌀㘀䄀䈀㐀䈀㐀㔀㌀㄀㐀㐀㄀㐀㐀䐀　㌀䈀㤀䐀　㘀㄀㜀㤀䌀㔀　　䐀㐀㌀䔀㌀㘀㄀䄀㐀㘀㠀䄀㠀㘀㤀㄀䔀㜀䌀㌀䄀㠀㄀㌀䐀䔀䌀㐀䔀䈀㔀㄀㌀䌀㤀㌀䔀㈀㈀䔀㠀㘀㐀　䄀㄀䈀䌀㄀㐀㜀　㜀㘀㠀　㤀㜀㜀㤀㐀䐀㔀䐀㈀䄀㔀㌀䘀㜀䐀䐀䘀䈀㤀㔀䌀䌀㐀㔀䘀㄀㌀㤀㠀㠀㈀䘀㄀䔀䌀㐀㘀㔀㌀㠀㐀㠀㠀䔀䔀㌀㈀㤀䔀㄀　㈀㄀䐀㐀㐀㌀㘀㌀䄀㠀㠀㤀䐀㄀䌀䌀㐀　䔀㘀䌀㜀㠀䄀䐀䌀㐀㜀㌀㄀㈀㤀䔀　㜀䘀　䘀䌀㄀䔀䌀䘀㈀㐀㤀䔀　䄀㐀㈀䔀㜀㈀㄀䔀㈀䔀䈀䌀㔀䐀㔀㠀㘀䐀㜀㘀㈀㌀䌀㈀䈀䘀㄀㤀䌀㠀㐀䔀㜀㌀㈀㌀䌀䈀䘀䌀㜀㔀㌀㄀㄀䔀㠀㜀䌀㠀䘀㈀㜀㈀㔀㜀㌀䐀㌀㈀㠀䈀䔀㈀䔀㄀　䔀㌀㐀㠀㄀㜀䄀㜀㄀㄀㄀䘀㠀㤀䄀㜀㐀㐀　䘀䔀㈀㤀㄀㠀㜀㐀㜀㤀㠀㠀㘀㘀㌀䈀㤀䈀䄀㔀䘀㠀䘀䔀䄀䈀䘀㘀㈀䔀䈀䘀䐀㘀　　䈀䌀　䌀㠀㐀　㌀㈀㐀　䌀䈀㠀㠀䐀䈀㠀䐀㜀㄀㤀㘀䌀㌀㘀䔀䈀　䌀㜀䌀㄀䈀㈀䔀䈀㐀㜀䌀䈀㠀㔀㄀䘀㈀䐀䌀㐀㌀㠀䐀　㐀㠀㄀䘀䄀　䔀䈀䈀㤀䔀䄀䄀㘀㄀䈀䐀㈀䔀㔀䘀䄀䌀㘀㜀䘀䄀㄀䔀䄀㠀㘀䌀㜀㄀䈀㈀㌀䘀䈀㠀㈀　㌀㔀䐀䘀　㄀㠀　㤀㐀㠀䌀㠀㜀㤀㔀　㐀䔀㈀㈀㔀　㠀㠀㘀㔀㔀䘀㔀㈀㈀㜀䔀䔀㜀䈀㄀㌀䈀䘀㠀㄀㤀㜀䈀䐀㠀㠀㤀䘀䈀䔀㠀㈀㘀㔀㐀㤀䄀㌀䈀䘀㄀䄀㔀䘀䈀㌀㌀㔀㐀㘀䈀䄀　㘀䘀㜀㠀㈀㤀㔀䈀䘀䈀㔀㈀䈀䘀㠀㈀䘀䘀䘀䌀㤀䔀　䈀㜀䘀䔀㌀㠀䌀㔀䔀䄀㘀㤀䘀䘀䈀䔀䔀　㤀䘀㐀㌀㜀㄀　㤀㄀䄀㠀㌀㜀䘀䌀㈀㤀㘀㔀㜀㜀㘀　㔀㌀䘀䘀㈀䐀䘀㄀䈀㜀䌀䄀䘀㌀㠀㘀䔀䌀　㤀㘀䘀䐀㤀㄀㌀㠀㘀　䈀㄀㌀㜀㈀㐀㐀　䘀㜀䘀㠀䘀䈀　㘀䈀㜀㄀䘀㄀㘀䄀　䌀䈀䘀㄀䌀㄀䔀㘀䌀㘀䔀　㔀㈀㔀䔀䔀䌀　䄀㈀䔀䘀㄀　䘀　䐀䌀䔀䘀㘀㠀䈀　㜀䐀㌀㔀㌀　䘀㘀䔀䄀㠀䌀㌀䈀䈀㤀㠀㈀䐀㌀㠀㌀䄀㌀㈀㈀㄀䘀㠀㈀䈀䔀䌀㘀䘀䈀　䘀䘀䌀㘀㘀　䄀䌀　䔀䘀䈀䐀䌀㄀㔀䄀䌀䘀㐀䐀䘀㄀　䄀䌀㐀㠀㐀㄀䘀㔀䔀㘀䔀䘀䔀䌀　䄀䘀㘀㐀　㄀㐀䄀㈀䄀㤀㘀䄀㄀㜀㐀㐀䈀㘀䈀㌀㔀䘀　䌀㤀䄀㄀䘀䌀　㤀㘀䔀㘀㘀　䔀䘀㜀㄀䔀㌀䌀䄀䔀㈀㌀　㌀㌀䐀㘀㔀㔀䐀䐀䄀㠀㠀䔀㔀㜀㐀㜀䄀䄀㜀䐀䐀㐀㄀㈀䈀㔀䄀䈀㄀䄀㔀㘀㠀㌀㘀䄀䄀䔀䔀䄀㔀㌀㤀䐀　㘀㠀㜀㐀㄀㌀㜀㔀㠀　䐀㤀䄀䌀㄀㘀㐀㌀　㄀㠀㄀㐀㠀㌀㘀㐀䄀　　㘀㘀㈀㜀　䌀㘀㤀㌀㈀㜀㘀㈀㔀㄀㤀䔀㘀㠀㜀㐀㈀䄀㌀䄀㈀䘀䘀㠀䐀㜀㠀㠀㐀　㈀㐀㔀㄀䐀㜀㈀㤀䈀䘀㠀䄀㐀䘀䄀䈀㔀㄀䄀䔀䌀㄀㐀　䌀㤀㌀㔀䄀㐀㈀㄀㠀䈀　䐀䄀㌀䌀㌀䌀㘀　䌀㠀㈀㘀㄀　䐀　㜀䄀㘀㤀㈀㘀㄀㌀㜀㠀㘀㄀䄀䌀䔀㠀䘀䌀㤀㠀䘀㠀㌀　㤀　㌀㌀䘀㌀㤀㜀䘀㄀　䄀　㘀㔀㈀㔀䌀㌀䌀㘀　䔀㘀䄀䔀㠀㄀䈀㄀䐀㄀㘀㔀㜀㤀㌀䄀㌀㄀䈀䌀䄀䄀㈀䌀㌀㄀䄀䐀㐀㔀㄀䐀㜀㠀䘀䐀䘀　㄀䘀　㐀　　䐀䈀㘀㌀㘀䐀　㌀㔀㄀㠀䈀䄀㠀䌀㄀䐀㄀䘀㠀㜀㈀㐀㘀䘀㔀䄀䔀㤀䔀㌀㈀㤀㤀㘀㌀䐀　㐀䌀　䈀䔀䘀㈀㜀䔀㄀䘀㈀䘀㌀䈀䄀䐀䈀䌀䈀䘀䄀㘀㠀㘀㜀㠀䐀䐀䈀㜀㔀㔀㜀䄀㈀䈀㄀䐀　㌀䔀䌀䔀㔀㔀㜀　䐀䘀䔀㠀㔀䌀䈀䔀㐀䘀㐀㌀㔀㜀䄀䘀㤀䔀㜀䔀䐀㔀　䌀䘀㄀䐀䐀㐀䈀　㜀㄀䐀㠀㤀㠀䘀㄀㠀䐀䈀䐀㔀䘀㜀䔀㌀㤀㜀㜀㔀　㐀䐀㐀㌀㠀㤀䄀㠀㈀㜀㤀㌀㔀㠀㄀䘀䐀㘀䘀　㌀　㐀䘀䌀㔀䔀䌀㠀㄀䈀䘀䌀㌀䐀㤀㈀㄀㠀㌀䘀㜀䌀　　䘀䈀䌀䄀㠀㄀㤀䈀䘀㠀㜀　䐀㠀　䈀䘀　䘀㄀㤀䌀䐀䐀䈀䐀㤀㠀　䌀㄀㌀㔀㌀㔀䌀㌀䔀㈀㔀　㈀䐀䔀　㐀㠀　㠀㜀䔀㐀　㌀㠀㘀㐀㤀䐀㄀䘀　㐀㤀䌀　㄀䄀䐀㌀㐀㠀㜀㈀㌀㈀㄀㐀㌀㈀　　㔀䈀㜀㌀㤀　㔀㔀㜀㠀㠀䔀䘀㈀㌀㔀䌀　㄀㈀䘀㄀　䌀䔀㘀㠀㈀㐀㠀㔀　㈀䄀䔀䐀　㘀㠀㄀㐀㜀　㄀㈀㜀　䈀㠀㄀䐀㜀㔀　㔀㐀㌀　㘀䔀䘀㈀㠀㈀㠀㄀　㌀　㤀䔀㄀　䄀㤀㄀㌀㌀　㜀㔀㤀䔀㔀　㜀䈀㤀㠀䌀㌀㠀㔀　㠀㔀㌀㔀㠀㈀㠀㘀　䐀䌀䘀㔀䔀㐀䈀　㠀　㌀㤀䔀䌀䄀䔀䔀㜀㌀　　䐀　㌀　㐀㠀㠀䐀䘀㠀䘀㈀　　㄀䈀䘀　　㠀㄀㄀䌀䔀㈀㄀㜀㈀　㜀䔀䌀㠀㄀㄀㈀　䐀㔀㤀㜀㐀㄀㠀䄀䐀㌀㈀　䘀㜀䈀㘀㠀㄀䐀䌀㈀䈀㐀㘀㘀㈀㜀　㄀㤀䌀㘀㤀䘀㠀㈀䈀㄀㤀䌀䌀㠀䌀　㔀㠀㐀䔀㈀　㐀䌀䘀㐀䈀䘀䘀䐀㐀䐀㄀䘀㄀㐀㠀䐀㐀㈀㔀㌀䘀䘀㤀䄀䄀㤀㄀㌀㜀㤀㄀䄀㘀䈀㜀㈀䘀䔀㤀　䔀㤀㜀㠀㐀䔀㘀䔀䈀㠀䔀䘀䈀㘀㤀㤀㔀䔀䔀䔀㤀㄀㠀㜀㜀㘀㐀䌀䄀䐀㐀㤀䔀㜀䈀㜀㈀㈀㤀㌀㘀䘀㤀䌀㌀䄀㤀㌀㤀㜀䔀㠀㤀㌀䐀㘀䔀㐀㐀䘀㄀䘀䐀䌀㌀　㌀㔀㜀䘀㜀　㘀㠀㐀㜀䘀䘀㠀㤀䈀䘀䘀　㜀㠀㈀㈀㜀䘀䐀䌀㌀䘀㜀䘀䘀　　䔀㌀㈀㜀㄀䌀㠀䐀㠀䘀㄀㌀䈀㈀㘀䌀㘀䄀㘀　䘀㘀䔀䔀䌀㄀䘀䔀䈀㌀䘀㈀㐀㜀䘀䌀䄀䔀　㤀䄀䄀㘀䄀㄀䄀㌀㜀䄀㤀㔀㜀㔀㄀㠀䔀䈀䐀䔀䈀㘀䈀㄀㜀䄀㠀䐀䘀䄀㠀㔀䌀䔀㐀㘀䘀㄀䌀䔀㜀䄀䘀㄀䈀㄀㠀㘀㤀㘀䘀䐀䌀㈀䔀㌀㌀㈀䘀䔀㜀㠀㈀㠀㄀䘀䄀䈀㠀䌀㠀䘀㔀㔀䌀㘀䌀㜀㄀䄀㄀䄀㄀䈀㈀䄀䌀㘀㈀㈀㠀㈀䐀㔀㐀㜀㠀䐀䐀䘀㘀㄀㈀　㠀㌀㘀䄀䄀䔀㤀䌀㤀㠀㈀䄀㤀䈀䄀㠀䐀㤀㠀㐀㘀䌀㌀䈀㄀㤀䘀䐀䘀㠀㐀㄀㘀䔀㜀䐀䐀䔀　　䌀㄀䌀㌀䘀䐀䌀㌀䐀䔀䄀㔀䈀䔀䈀䐀䔀㠀䈀䄀㘀䌀㈀㔀䔀㘀㘀㠀㐀䐀㠀㌀㤀㘀㌀䘀䄀㠀䌀㄀㠀㈀㈀㜀㜀䘀䐀㐀㘀䐀㘀　䈀㜀㠀㄀䘀䌀㄀㄀㠀䄀㄀㘀㜀䘀㘀㐀䔀㔀䈀㤀䌀䄀䘀㐀㈀㌀䔀䘀䐀㈀䘀䔀㘀㄀䐀䘀㔀䔀䐀㠀㤀䄀㜀䔀䄀㐀㘀㌀䈀㌀㌀䐀㜀䘀㄀　㠀㤀㈀䔀㔀㠀㔀㠀䈀㜀㤀　㜀㠀㠀㜀䐀䌀㌀䌀㌀㠀䘀㔀䄀䘀　䔀㜀䘀䐀㠀䈀㐀㘀　㈀㄀㈀㜀㜀㠀䔀䄀㄀䄀䄀䐀䘀䈀㐀䘀㌀䘀㜀䌀㌀㘀䄀㐀㈀㄀㌀㘀㘀㔀㜀　䐀䐀　㈀㐀㈀㠀㘀㌀㔀㜀㐀㄀㤀㌀㌀䄀䌀䄀㄀㄀㈀㠀㌀䐀䘀㄀䐀䄀䄀㠀䄀䄀䐀㤀㌀䘀㤀㤀㐀㄀䄀䘀䄀㘀㔀䐀䄀䌀䌀䔀㘀㈀㄀䘀㄀䔀㐀㠀㄀㔀㐀㘀㌀㜀㜀㘀䌀䔀䌀䌀㜀㄀䈀㄀㤀㘀䈀　㌀䔀㐀㘀䐀㄀㔀䈀䌀䌀䐀㘀㠀㐀䌀　㌀䘀䔀㜀䌀䘀䐀㄀㜀䄀㘀䌀䈀㈀䈀䈀㤀㄀㐀䐀㐀䐀㌀㜀䐀㐀䐀㄀　　䈀䌀　　㈀㔀㈀㔀㜀䌀㌀㄀䄀　㈀䌀㌀䌀㘀㔀㈀䐀㐀　㠀㘀㌀䐀㌀㐀㤀䄀㄀䈀䐀䔀㠀㔀㠀㜀㄀㔀䈀㔀㄀㔀㜀㠀㌀㄀㌀䄀䌀㠀㌀㈀㠀䐀㐀㘀㔀䘀䄀㐀㠀䄀㌀㄀䐀㠀䐀㤀㈀䐀㐀㌀䐀䔀㄀㜀㌀䌀䔀㤀䌀　䈀㄀㘀䄀㘀㘀䈀㘀㤀㔀䄀㈀䌀㐀㠀㤀㜀䄀㤀㌀㜀䘀㄀㤀㔀䈀䄀　䌀㐀㤀䐀䄀㜀䔀㤀䌀㔀㠀䐀㄀㌀㘀㠀䄀㈀䐀㄀　䐀䐀　䄀㜀㈀㐀㘀㈀㜀㠀䔀㄀䘀㘀㠀㘀㔀㜀䐀㔀㠀㌀㄀㄀㤀㠀㠀䈀䔀㜀㌀　䘀㈀䌀䈀䈀㘀㄀䐀㤀　䐀䌀䈀㄀㈀㈀䌀㐀䈀㔀㠀㜀㄀䌀䌀㄀㄀　㤀㌀㈀㔀䄀㄀㘀㌀㐀㄀䄀䌀䄀㠀㈀㘀㘀䐀㌀䔀　䄀　䄀䄀　䌀　䔀㘀㘀㜀䄀䄀䐀㠀㤀㄀㈀㜀㤀㈀䘀䌀㤀䌀㘀㌀㌀㐀㜀㜀䔀㠀㤀㘀㐀㐀䈀㄀㄀䘀䔀䘀䐀㜀㔀㤀㈀㜀䘀㜀㜀㜀㈀㤀䄀㤀㜀㠀㤀㤀䈀㤀㌀䄀㜀䘀㤀㜀㌀㔀䔀䐀㈀䔀䘀㔀　㘀䈀䌀㘀䐀㌀㈀㜀㈀㄀㔀䈀䌀㤀㜀㘀䈀㠀㤀㤀㘀䌀㈀㜀㘀䘀㤀㈀䈀㜀䔀㄀㈀䌀䈀䔀䘀㔀㌀䄀䐀㤀㐀㌀㤀䄀　㤀䘀㜀䄀䄀　㘀㤀㌀㈀㜀䌀㠀㘀㈀䘀㈀　㠀㔀㤀㠀䐀㤀㘀㜀㈀　㈀䈀㘀䐀䌀㐀䈀㐀㘀䔀㌀㈀㄀㘀㌀䘀䈀㈀㌀㤀　㤀䐀㘀䌀㈀㘀䌀㔀䔀㐀㄀㤀䈀㐀㤀㔀䌀䘀㤀　㈀㌀　㠀㜀䈀㄀䐀㔀㤀㐀䄀䘀㘀㄀㈀㌀㜀㜀㠀㤀㌀䐀䘀㤀㈀㘀㔀㘀㐀㈀㔀㌀䈀㠀㘀㘀䘀䄀䐀㈀㐀㄀㘀㤀㈀㠀㜀㤀㌀㄀㤀㐀㔀䔀㘀㤀㈀䘀䈀㘀㄀㜀㠀㜀㈀㈀㄀㤀㤀㐀㠀㠀䔀㐀䈀䘀㜀㤀　㌀㈀㌀㈀㤀䌀䘀䌀㤀䄀䌀䌀㠀㌀䘀䄀䔀㐀䘀㠀䔀㐀　㌀䌀㤀㠀㜀㤀㈀䌀䘀㤀㌀㄀㜀䌀㠀㄀䔀䘀㘀㌀䘀䌀㤀㔀㘀㘀㈀㈀㘀㌀㤀㘀㐀㈀䄀㄀䔀㐀㜀㤀㈀㘀㜀䔀㐀㐀䘀㤀㈀䘀䘀㠀䈀　㐀㤀㠀㐀㠀㄀䔀㈀㔀㤀䈀䌀㠀㜀㄀㜀㠀䌀㠀䈀㠀㤀㌀䌀㐀㜀　㤀㐀㜀䄀㠀㐀㜀䌀㤀㈀䐀䌀㐀䄀㌀㘀䈀㌀㔀䄀　㤀㤀㈀㌀㌀㤀㈀㌀䘀㈀㄀　㘀㘀㄀㜀㈀㌀䈀䔀㈀㈀　㤀㄀㈀䄀㜀㈀　㐀　䔀䐀　㈀㠀䘀㘀㌀䔀㤀䐀㜀䌀　㌀㔀䔀㔀㠀䌀䌀䄀䔀䌀㐀㔀䔀㤀䔀㐀䈀㌀㘀㈀㐀　䘀㈀㄀㤀㐀㤀䘀䐀㐀㤀㈀㤀㤀㘀㐀㌀㌀䐀㤀　䈀䈀䐀㘀㄀㈀㠀　䐀䌀䈀㄀㌀㤀㌀㔀㔀䌀㤀㈀㌀䌀㐀㠀䐀㘀㌀䐀䌀㠀㄀䈀䐀㘀䔀㈀㈀㠀䐀㘀㐀㄀㜀㄀䔀㜀㄀䘀㈀　㘀䘀㤀　䌀㌀㐀䘀㤀㘀䌀䘀㈀䘀㤀䔀㐀㔀㤀㤀㈀㐀䐀䈀䄀㤀㈀䄀䈀㜀㄀㌀䔀䌀䐀䔀㐀　䘀㜀　㠀　㈀㔀㔀䄀㤀㜀㈀㜀㈀䄀㤀㄀㘀㈀㌀㈀㔀㈀㠀㤀䔀䘀　㐀㔀䐀㠀䐀䘀㌀䘀䄀㈀䐀㜀㤀㤀㜀㜀䌀　　䘀㤀䘀　㄀㘀㤀䐀㈀䈀㘀䈀㜀㈀㠀㤀㄀䌀㤀㌀㄀㜀㈀㔀㌀䘀㈀㈀㐀䔀䐀㈀㤀㌀㠀䌀㐀㌀㘀䌀㔀䘀䌀㈀㌀㜀㐀䘀䌀㄀㠀䘀㜀㐀㈀㤀㄀䔀䌀䈀䐀㠀㌀䈀䐀㈀㔀㔀䌀㤀㐀㄀䌀㐀㠀䄀㜀㐀㜀㤀㤀　㔀㌀㤀䈀䘀䌀㠀䔀䘀䌀　㔀㜀㈀䄀　㄀㠀㐀㘀㐀㈀㌀㔀䔀䐀㐀䌀䔀㜀䐀㈀䄀㜀䐀㠀䄀䐀䌀㐀㠀　㈀㌀䘀㘀䌀㐀㘀㌀㄀䄀䈀㤀㄀㤀䔀㤀䘀䐀㌀㠀䘀㘀䘀䔀㈀㔀㌀㈀䔀㌀㈀䔀䄀䄀䐀㄀䄀㌀䔀䌀㌀㤀䔀㤀㄀㔀䔀㤀䄀㈀㤀㈀㤀䈀㌀㠀㤀㄀䈀㐀䔀㈀㠀䄀㐀㐀䌀㠀㘀䘀䌀㠀㤀㌀䔀㐀㈀䐀䈀　䔀　㐀䌀㐀㌀㔀　　㜀㜀㜀䌀㌀䌀㜀䘀　㔀㜀㜀䄀㈀㔀㤀䐀㐀㐀㜀䘀㐀㌀䈀䘀㘀㈀㠀䘀㐀㠀䐀䈀䄀㐀　䘀䐀㔀㈀㤀㌀㠀䔀䈀㄀䈀䌀㠀㈀䐀䔀㐀㜀䔀䘀㈀　䄀䘀㤀㄀㄀㄀䌀䐀　㄀㜀䄀䔀㠀㔀䔀䈀㘀㄀㈀㘀㈀䌀㠀㘀䐀㔀䘀　㈀　㘀䌀㠀㈀㈀㌀䘀　　㄀㤀䌀䄀㘀　㌀䔀㤀㔀㠀㌀䄀㤀䈀㜀䔀䌀䘀㘀㘀䈀㈀䘀㤀䔀䌀　䐀㘀㤀㄀　㄀䔀㘀㌀䄀㐀㌀䄀䔀㤀㄀䔀㜀㤀㤀㔀㜀䌀㤀䘀㜀㈀㌀䄀㌀㄀㌀䔀㜀㄀㈀㠀䘀㄀䌀㜀䌀㐀㠀䘀䌀㤀㤀㈀䔀㐀㈀䄀㜀㈀㈀䐀䘀㈀䌀㌀㜀㈀䌀㐀䘀䔀㔀㄀䘀㈀㄀㐀䌀䔀㘀䌀　䘀㌀㤀㐀䄀㌀䔀䌀㔀䔀㌀㌀㠀䘀㤀　䄀㘀㐀㌀　㠀㌀㄀㔀㠀䘀㄀　㠀㐀㘀㄀㄀䌀䐀䌀㠀㔀䌀㜀㔀㈀䈀㠀㄀䘀㤀䔀㠀㔀䄀䐀䈀　　䐀㤀䄀㜀㄀㤀㐀　䘀䔀　㈀䈀䘀㠀㄀㘀　䐀䐀䈀㌀䘀䔀㄀㈀㈀㐀㔀䈀㌀㐀䐀㄀㔀䔀䄀㐀㌀㔀䘀㠀䄀㜀䈀㔀㐀䘀㤀䘀㐀㔀㘀㜀㐀㔀䄀㄀䘀䄀㄀㐀䘀䐀　䄀㌀㜀㠀㜀䌀㐀　䘀䘀㐀㘀䘀䘀䌀㔀㌀䌀㈀䌀　䘀㠀㌀䐀䐀䐀䔀䄀䌀㠀㈀䐀㔀䈀　䈀㤀㠀㠀䐀㔀㘀䄀䈀㘀　㄀㠀䘀㤀䐀䔀䌀㈀䘀㔀㈀㠀䔀㜀㐀㔀㐀㐀䄀㈀㈀㤀䐀㐀䈀䔀㐀㠀䐀䘀㈀䐀㌀䘀㈀㔀㘀䘀㤀㄀㔀䘀㤀㘀䐀䘀㤀䄀䌀䄀㈀䄀㤀㜀㜀䄀㌀䌀㌀䘀　䘀䈀㐀䈀䌀䘀䈀㔀㜀㘀㘀㤀䘀䐀㌀㈀㐀㄀㄀㈀㘀䈀㄀㈀㄀䈀㄀㌀㠀䐀㠀㤀䔀㘀䔀㐀㔀䘀㠀㠀　䈀䐀㜀㄀　㘀䐀㄀　䌀㘀㜀　㄀㔀㠀㠀䘀䐀㄀㐀㌀䌀㘀㘀䔀㄀㜀䄀㘀䘀㐀㐀㠀䔀㜀䈀㤀䐀㄀䌀　㌀　䐀㘀㤀㤀㜀　㌀㔀䐀㘀　　　　䌀㐀㜀䌀䄀㐀䌀㠀㈀㔀㤀㌀　㄀䘀䔀䔀㐀　㐀䄀䄀䔀㠀　䌀䐀䘀　㠀㈀䌀　䘀䐀㌀㔀䐀㠀㠀䘀㔀㐀䘀䄀㌀㌀㜀䌀㠀䘀㌀㠀㔀䈀䄀㠀㔀䘀䔀　䐀䌀㤀䐀䘀㘀䄀㘀㠀㌀䔀㠀㐀㠀㌀䌀㘀䔀䄀　䐀㌀䔀㤀㜀䌀䘀㐀䔀䐀㄀䔀䄀㈀䌀䐀䘀㐀㘀㌀䘀䄀㄀㌀㔀㌀㤀㤀㤀㤀䐀㤀㤀㠀㠀䈀㜀㔀㘀㄀㐀㌀㔀㤀㈀䐀㤀䈀䌀䔀㄀㘀䈀　㌀䈀䐀㤀㐀㘀䐀㘀䌀　㜀䔀䌀䘀䈀䔀㘀　㔀䘀䈀㄀䘀㌀䔀䌀㄀㈀㄀䔀㐀㤀䌀㤀㈀㐀　㔀䄀㔀㌀䌀㈀㤀㈀㈀㐀㔀䄀㔀䄀㄀䐀㈀㈀㐀㘀㤀䄀㄀䘀㐀㤀㐀䘀㐀㠀䐀䘀㐀㠀䐀㌀䌀㔀㄀㜀䔀㔀䘀䘀䔀㔀䄀㌀㄀㈀㤀䈀㜀㈀㠀䄀䈀㤀㐀䈀㠀䘀㈀　㌀䈀䄀㐀㠀　㌀䐀㐀㔀㄀䔀䄀䈀㔀㘀䄀䄀䐀䈀䄀㔀䔀䐀䐀䄀㔀㜀䔀㘀㐀㤀㠀㠀䌀䐀䌀㜀㤀㤀　䔀䌀㈀㐀䈀䈀䐀䈀㘀䘀䘀㐀䌀㄀　㤀䈀㘀㤀䌀　䐀㘀㄀㌀䈀䌀㤀　㌀䈀㐀㔀㐀䌀䄀䌀㘀䄀㠀䔀㠀　䘀䌀㠀䌀䘀㤀㌀䌀㠀㌀㐀㔀㘀㐀㔀㤀㄀㔀㌀䔀㤀㔀㘀㔀㠀㐀㌀㤀㜀㐀　㌀㌀㈀䐀㤀　䔀䘀㔀　䘀䄀䐀㌀䘀䔀㌀　㠀㈀㤀䌀㤀㔀㈀㈀㐀㠀䔀䈀㜀㜀䔀㠀䐀㌀䘀㐀㌀䌀䔀䐀䌀䘀䄀䄀㘀　㄀㠀㠀䌀㈀㄀䈀㌀䘀㠀㔀䘀䐀䘀䔀　㌀䘀䌀㔀㈀㤀䈀䐀㠀䌀㐀㔀㠀㔀㜀㐀㤀　䈀㐀㐀㠀䘀䈀㜀㄀㘀䔀㜀䘀䌀　㤀䔀䔀䘀㔀　㌀㐀㔀㠀㐀䄀䈀䘀㔀㜀㌀㐀䐀㈀　㠀䄀㤀䘀䘀㜀䔀䔀䐀㜀㜀䄀䌀㠀㜀㄀㐀㘀㔀䔀䘀㤀㌀䌀䘀䐀㠀㜀㄀㔀　䄀㔀㘀㜀䌀㠀䔀㜀㤀㈀　㤀㌀䌀䐀　㐀㈀㔀䘀㘀㈀䄀㌀㤀　　䈀䐀䔀㤀　　㘀䌀㠀䔀㌀㐀㤀㤀㠀㌀䐀㐀㄀㔀䔀㘀㌀䘀㌀㘀㄀　㤀䐀㤀㐀㤀㠀㜀㄀　㘀㈀䈀䄀㘀㠀㔀㠀㠀㜀㜀䌀㌀䌀　㈀㔀䔀㐀㘀䈀䐀㌀　㄀㘀㐀䄀䔀　　㈀㐀䈀㘀㈀㐀　㌀䌀　㈀䈀㤀䄀㠀㠀䌀䘀䐀㤀㔀䐀䌀㐀㌀㘀㘀䐀㌀㐀䘀㐀㠀　䈀䌀䄀䘀㄀㄀䄀䘀㈀㄀㠀㐀䌀㤀㌀㘀㘀㤀　　㜀㐀㠀㈀㤀㈀䌀㈀㘀䐀䘀㤀　㄀㜀㔀㄀㈀䄀㌀䄀䌀䈀䈀䘀㔀㘀䈀䄀㈀㠀㈀䔀㜀㠀㠀䘀䐀䔀㈀䌀䄀䐀䄀㔀㔀㤀䐀　㐀䌀䄀㠀䈀㐀㠀䐀㜀䘀㠀㜀　㈀　㔀䌀　㘀㐀㈀㜀㔀㤀　㄀䈀㔀㘀䌀䈀㌀䘀㈀㌀䐀䘀䐀㤀㐀㈀䌀㈀㐀㐀㜀㈀㔀㄀㌀䘀㤀㤀㈀䈀䐀㠀䄀䐀㠀㄀䘀䄀㔀䄀䘀䈀㄀㈀䄀䔀㤀䄀䌀㌀䌀㄀䄀㘀㘀䄀㈀　㐀㈀䌀㈀㄀䄀䈀䌀㠀䘀䌀䔀㐀㜀㈀㜀㈀䄀㜀㌀䌀㔀䔀䘀䄀㄀　㘀㘀㄀　　㘀䐀㔀䄀㐀㔀　㌀䄀㠀㄀䐀䄀㘀䐀㌀㄀㈀䈀㤀㄀䌀㈀㔀㠀㈀䔀㐀㌀䄀䐀㌀㈀㄀㄀㜀㔀䐀䄀㈀䔀㤀㐀䔀䔀䈀䐀䄀㠀　㜀　㘀䈀㈀㈀䄀㘀䌀䘀㄀㈀㈀䔀㜀　䌀㐀㜀䈀䔀㄀㠀㠀㜀㄀䄀㘀㈀㌀㌀㄀䔀㠀䘀䄀㌀㤀䔀㤀　㤀　㠀㌀㘀䔀㐀㘀㄀㤀䈀䘀　䔀䈀㔀䐀㠀㄀䘀㐀㠀䈀㌀㌀㈀㤀㘀䌀㘀䌀㤀　䌀䐀㤀　䄀䄀㠀㜀㔀　㠀㤀㄀䐀䔀㐀䘀㠀䌀㈀㘀㄀㌀㤀㈀㈀䘀㤀㈀㐀䐀䌀㤀㄀㤀䔀㐀䐀㜀䌀㤀㠀㜀㐀㠀㌀㜀䐀㐀　㜀䄀䈀㤀㌀㠀䈀䈀㄀䌀㜀䄀䐀䔀㐀㘀䈀䈀㈀㤀䔀㘀䌀㠀㔀㤀㔀㠀㤀䈀䈀䌀㠀㌀䌀㠀䌀㐀䔀㌀䘀㐀㔀䐀㤀㄀䔀㈀䔀㔀䘀㐀㔀㠀䘀䌀䄀㔀㜀㈀㔀䈀䈀䐀㄀䈀㔀䘀㐀㔀㌀㌀䄀㠀㘀㘀䔀䔀䌀䈀㠀䈀䔀㐀㠀䔀䐀㐀㈀䘀　㤀㈀䔀䘀䘀　㜀㠀　䐀㘀䘀　㘀䌀㠀䘀䈀䌀㠀㔀䄀䔀㤀䌀䘀㘀㐀　䌀䄀㤀㐀䌀䄀䔀㐀䈀䘀䔀　㤀䈀㤀䈀䈀㄀㌀㘀䄀䐀㠀㐀䐀䔀㐀㐀㘀䘀㐀㜀䔀㐀䘀䔀㈀㈀䌀䌀䘀䔀　　㠀䈀䘀㘀㈀　㜀㐀㠀㘀㤀㘀㈀　㐀䐀䐀㤀㄀䈀䌀㠀䄀䌀䐀䌀㌀䘀㤀㄀䔀㈀㜀䐀㜀㈀㘀㔀䘀㐀䄀　㘀䌀㄀㐀㐀㘀㘀㈀㘀䔀㜀㤀　㤀㄀㘀㐀㌀䘀㜀㤀㐀㄀㤀㔀䌀㤀㄀㐀㌀㔀㠀䄀㘀䈀䐀䌀　　㄀䘀䔀㈀㜀䌀䔀䘀㈀㈀䐀㌀䔀㤀䔀㠀䔀㐀　㈀㌀㘀㌀䐀㜀㄀㌀㌀䐀㈀㘀㄀㌀䐀㔀㈀㠀㄀䘀䘀䄀䐀䄀㄀㠀㔀䄀㠀㜀䘀䔀䔀㤀㔀䔀㘀㐀䈀䘀㜀㐀㠀䘀䘀㈀㈀䔀䈀㔀　䔀㘀㌀㜀䄀㈀䈀䔀䐀㤀㠀㈀㜀㈀䘀㌀㌀㈀㐀䄀　䔀㤀㜀㜀䐀㈀㈀㤀㈀䘀　䄀㠀　䌀㘀㔀䈀䔀䈀䐀䄀䔀㤀㈀㐀㄀䌀䐀㄀㐀㐀䔀㈀䄀㘀䄀㤀䌀㘀䔀㠀䄀㘀㔀㄀㄀㔀㤀㌀䄀䌀㤀㠀㠀㐀㤀㤀㔀㐀䔀　㈀䌀㤀㌀㘀㈀㠀䘀㈀㐀㤀䌀䄀䘀㘀㈀㌀㤀㌀㄀㤀㔀㄀䔀㔀㜀㐀㈀㜀䐀䔀䄀㠀㜀䔀䈀䔀䄀㈀䈀㔀㘀㈀㠀㐀㜀䔀䄀䔀䄀㈀䄀䄀䈀㔀㠀㈀㔀㐀㘀㈀㔀䐀䈀䘀㠀㐀㤀㜀㤀䔀㌀䐀䌀㈀䘀㘀䈀　䈀䐀㄀　㈀䘀䔀㠀䔀㐀㤀㌀㐀䈀㈀㄀㜀㘀䔀　㔀㈀㐀䌀㈀㘀㄀㜀㐀㤀㐀㠀㌀䄀䌀　䈀䘀㌀䔀㘀㠀㐀　㔀䄀䄀䌀㐀㜀㄀䈀㈀㘀㄀㌀㈀㌀䐀㤀䐀㠀䈀　㌀㈀㌀䄀㜀䔀㠀㜀㈀㈀㌀㈀䘀䌀㤀㐀䌀㠀㜀㄀䘀䄀㜀䄀䌀䌀㘀䌀䄀㠀㔀　㐀䌀䌀㘀㜀䔀㔀㈀㠀㔀䐀㈀　䘀䄀　䘀㠀㘀㐀䔀䈀㐀㤀㔀㈀䐀㤀㜀䄀䄀䄀䐀㈀䈀㜀䌀㌀㈀䘀㤀䔀㐀㘀䘀　㈀㤀㈀㔀㠀䄀䌀㤀䘀䌀㌀䔀㌀㌀䘀㘀㤀㌀䘀䈀㐀䄀㄀㔀䄀㐀㈀䘀䌀㈀䈀㄀　䄀㐀䄀㐀㌀　　䘀　䈀䔀䌀㤀㘀㐀㔀䔀㄀䔀㜀䔀䔀㘀㜀㄀㜀㐀䐀㐀㄀㄀䄀䈀䐀䄀㠀䄀㈀䄀䈀䐀㐀㔀㌀䘀㠀㤀㔀䐀㤀䌀䐀㐀䌀䘀㤀　䌀䄀䌀䄀㈀䄀䈀䐀䘀㔀㄀㐀㌀䄀䔀㤀㐀䐀㌀㈀㌀䄀㔀　䄀　㔀㜀䔀㠀㄀㔀㌀㔀㌀㔀㌀䐀㜀䈀䘀㠀㜀　㤀㤀䐀㐀㤀㠀㠀㈀㜀㄀　㜀䘀㄀㔀㘀㔀㘀䔀㘀㄀䌀㈀㤀㈀㤀䔀䔀䐀㄀䈀㌀㈀㘀㠀䈀䐀㤀㐀䈀䔀䐀㠀䌀䘀㔀㈀䔀㜀㔀㜀䐀㔀㌀㜀㘀䈀䌀䐀㜀㜀㌀㐀㜀㘀㄀　䔀㌀㌀䌀㈀㤀　䌀㐀䈀䔀㐀䈀㌀䘀㈀㘀㄀䔀㌀㤀㜀㈀　㐀䔀㜀㜀　　㌀㘀䈀䄀㈀䈀㜀㠀䈀㌀㤀㤀㠀䌀㤀䌀㌀㜀䌀　䔀㐀㠀䌀㘀䔀㐀㠀㔀䄀㘀䈀䌀䌀㈀㔀䔀㜀㈀㌀䌀㜀㤀㈀㄀㤀㘀㄀㜀䔀㤀䐀䌀䌀䈀䄀䌀㤀㠀㜀　㜀㤀㌀　　㠀㤀㐀㘀㔀䌀㔀㜀䌀䌀㘀㘀㠀㌀　㌀　㐀㘀㠀㤀㘀䄀䄀㠀㌀　䐀㤀㠀䌀䘀㔀㐀㘀㘀䄀㐀㐀㐀䘀㈀㜀䔀㘀䈀㈀䐀㠀㜀䄀㄀㤀䈀䘀　㐀㈀㘀㔀㔀㔀　㠀㠀㔀㤀䔀䌀䈀䐀㈀　㔀䈀㤀䈀䘀䘀㤀㈀㤀㜀䄀㌀㄀䔀䔀㔀㄀㐀䐀㔀㔀䈀䄀㌀䈀㔀㄀㔀㠀㈀䈀　㄀䌀䐀㤀䐀㘀　䄀䈀䌀㠀　䐀䐀㔀㄀㔀䔀䌀䔀䌀䘀㤀䔀㌀䐀㈀　㄀䄀䘀㔀䌀㔀㌀㐀㤀　㔀㐀㄀㌀㤀㄀㄀㔀　䌀䈀㌀㔀㈀㄀㌀䐀　　䘀㜀㤀䌀䄀䌀㔀　㐀㄀　㜀㜀㔀㘀㈀䄀䄀䔀㄀䈀㐀䄀㠀䔀㜀㐀䘀䈀䄀㈀䔀㜀㤀㄀㄀䔀䄀䌀　㤀㌀䌀㘀㜀䌀䘀㈀㘀䈀䔀㐀䐀㔀䐀㜀㤀䈀䌀㌀㔀　㄀㤀䈀㠀䄀䌀㐀㈀䌀㈀䄀䘀㠀㄀䌀㘀㈀㈀䔀㈀㈀㌀㌀㤀　䌀䘀㔀　䌀㈀㤀㘀㠀㜀㘀　　㌀㔀　㤀㠀䄀㔀㜀　㜀䌀䘀㐀䘀㌀䈀㔀㈀䐀䄀㐀䈀㈀　㔀㔀㈀䔀㌀䘀䄀㜀㘀䔀㈀㤀䌀㘀㈀㘀㈀䈀㐀㤀䌀㈀㌀䔀㔀㤀㜀　㜀㔀䈀䐀㌀㔀䐀　䌀䔀㄀䘀㠀䔀㜀㌀䘀㄀㌀㘀㜀䈀　䔀䘀䌀㔀㠀㤀㘀䈀䔀㤀㘀㐀䘀㤀㄀㠀䐀㄀䌀㤀　㠀䐀㄀䈀㜀䄀㤀䌀㠀㠀㘀䌀㄀㤀䔀㐀㌀㌀㔀䔀㠀㜀䄀㄀䌀㐀䄀㤀䈀䌀㠀䐀㌀㔀㘀　㌀㤀㘀㌀㄀䈀䈀䘀䄀䈀㐀䘀㔀　㘀䌀㈀㜀㐀㄀㘀㘀㈀㠀䌀䈀䐀㘀䄀㜀䘀㜀㈀㤀䐀㄀㠀䄀䔀䘀㔀㜀䌀㠀䈀㜀䔀㄀䔀䌀㜀䄀䌀䄀㠀㐀㐀㘀㘀㠀㈀㔀䄀㔀䘀㄀㌀䈀㄀䄀㤀䌀　䄀㜀㠀㜀䄀㌀㐀㄀㠀㐀䐀䄀㜀䈀㤀㔀䘀㔀㈀㤀㈀䈀㔀㔀㔀㐀㌀䌀㔀䌀㌀䄀䌀　䘀㄀㐀㜀䘀䘀㔀　㌀㔀㘀㄀䘀䘀䘀㈀㌀䈀㠀䈀䄀䔀䌀㠀㠀䘀㐀㈀㌀㐀㜀㄀䔀䐀㜀䔀䈀㠀　　䐀㘀㌀㌀㤀䘀䈀㔀㔀䔀䘀䌀䄀　㘀㘀䔀䐀䌀㘀㜀䐀㘀䘀㈀㐀㠀㈀㠀㤀㄀　䔀㤀㠀　䐀㄀㘀䐀　㈀㈀㌀䄀䐀㄀㌀䔀䐀䄀㐀㔀㌀䄀㌀㐀㤀　㜀䔀㈀㌀　㜀㈀㤀䌀㐀䌀㐀䘀㌀㌀䌀　䈀㈀㤀㤀㌀䌀䌀䐀㘀䔀䈀　䌀㘀㤀㌀㘀㜀㤀䈀㜀㔀㤀䐀㠀䔀䌀㌀䌀䄀㠀㔀㘀㘀㤀䈀㐀䐀㔀㐀㐀䔀㌀㘀㔀䈀㈀䌀䄀㈀䘀㈀䈀㜀㤀㠀䌀䐀㘀㐀䄀㈀䔀㌀㘀䌀䐀㘀䄀　㤀㔀㔀䄀㔀䘀㜀㔀䄀㐀䈀㄀䔀㘀䔀䔀䐀䈀䌀䘀㌀　　㜀㤀䈀㌀㄀㠀㌀㜀㤀㔀㘀㌀䔀䈀㄀䘀㜀㈀䄀㠀䄀䔀　㔀㄀䔀䄀䘀㘀䈀㠀㔀䐀㌀䄀㘀䐀㔀䐀㠀䔀㠀䈀㤀㠀㜀㜀㐀㔀䐀㄀䄀㈀䔀㔀䘀䈀㈀㜀㔀㐀㄀䐀㐀䐀㔀䌀　䈀㈀㜀䔀　㈀䘀䘀䈀䘀㜀㘀䌀㔀䌀㌀䈀䔀㄀䌀㌀㠀䈀䄀䐀㤀䘀㤀䐀㐀㤀䘀䌀㤀䐀䘀䘀䔀䘀㤀䄀㠀㄀䈀䌀㤀䌀䘀㠀㄀㈀䔀䔀㐀㄀䈀䘀䌀㠀㐀㐀䄀㘀㜀㄀䈀䌀㜀㜀㤀䄀㔀　㐀㠀㔀䘀㔀㄀䔀㈀㌀　㈀䄀㄀㘀㄀㄀㠀䌀　䘀㈀㘀䄀㠀㈀　㈀㘀䌀䄀䘀　㠀㘀㈀㠀㜀䐀䐀㔀㜀䔀㈀㌀䐀㄀㘀䔀䌀䌀㐀㔀㈀䐀䈀㠀　㔀䐀㜀㜀㔀㠀䈀㤀㤀　䈀　㌀㠀䄀䌀㈀䈀㤀㤀㌀㜀䄀　䈀䘀㈀　䘀㈀䔀㈀㌀㘀㜀䄀㘀㄀㘀䈀䐀㔀㔀㈀䌀㈀㜀㔀䘀㐀䐀㔀㔀　㄀䈀䔀㈀㌀䌀㜀㔀㜀䈀㌀䘀㠀　㠀㘀㈀㔀㤀㠀䄀㠀䈀䔀㤀㔀㐀䐀㐀䄀㈀㌀䔀㜀䐀䌀䄀㜀㘀㄀䐀㄀㤀㜀㔀㔀䐀㐀㤀㜀㤀㄀䘀㜀㘀䔀㐀䌀㠀䘀䌀䘀䈀㈀㈀㔀㔀䐀㤀㔀㌀䄀䔀㐀㜀㘀䌀　㘀㐀㈀㤀䌀䌀䔀䄀㈀䈀㜀䄀　䄀㘀䈀㠀㐀㈀㔀　㌀㄀㜀䈀㄀䔀㤀䐀䌀㜀㘀㠀㄀㔀㔀㐀㈀㄀㈀㈀䘀㤀㠀㐀䔀㘀䌀㠀䘀㌀㄀　㈀㠀㔀䈀㤀䄀㜀㜀㌀䘀䔀㜀䔀㌀㤀㌀䈀㔀䘀䄀㈀㤀㔀㈀㔀䌀䐀㔀䐀㈀䈀㌀　㜀㤀㤀㠀䘀䌀㐀㘀㠀㈀㐀㌀㄀䄀㐀㐀㔀㜀㄀　䔀㄀䘀㈀㘀䄀䈀㜀㜀䐀㠀㌀㔀㤀　㜀㘀㠀㘀䘀㠀䌀䔀㤀䐀䘀㠀䌀㈀㔀䔀䘀㄀㜀䘀䄀㄀㌀䈀㠀㈀䈀䐀㤀㘀㠀㤀㔀䔀䈀䐀㤀㐀㐀䘀䄀㤀㈀㈀㌀㔀㤀㄀䐀㜀㠀㤀䈀㐀　㔀㘀㄀䈀㘀㐀㠀㘀㈀㈀䔀䔀㜀㘀䈀　㔀㌀㜀㈀㈀䔀䄀㐀䐀㘀䐀㠀㠀䄀㜀䐀㄀䐀䔀㜀䈀　㐀㠀㔀㤀㌀䔀㜀㄀㄀㤀㈀䐀䘀䐀　㜀㈀㔀䌀㘀㤀㤀㘀䄀㈀䐀㠀㄀䔀䌀㈀㤀㈀㔀䘀㌀㘀㌀䄀䌀䈀㘀㤀㌀䌀䘀㤀㘀㔀㈀䌀䔀㐀㈀䌀㜀䘀㠀䌀　㄀㘀㔀㐀䘀䈀㌀䐀㜀㄀㤀㘀㔀䈀㜀㄀㄀㜀　䘀㈀䌀䘀䄀㈀　　㘀㄀㐀䐀䔀䌀㌀㐀䄀㄀䄀㜀㤀㄀　㌀䈀㘀䔀䐀㐀㐀䔀䐀䐀䘀䈀㐀　㠀䌀㜀䄀䄀䐀　䌀䘀䈀㔀䔀㠀䄀㤀䐀㔀㔀䌀㈀䐀㜀㜀㠀䘀䐀㘀㈀䔀䐀㄀　䘀䘀㄀㔀㔀㐀㔀䌀㤀㘀䈀㐀㈀㄀䐀㤀㠀㔀㤀㔀㜀㄀㜀㤀㐀　㈀㘀䌀䐀䈀㤀　㄀㠀㤀䘀㈀䐀䘀䘀䔀䐀㈀㜀㈀㜀　䄀䔀㈀䈀㠀䔀㐀㌀㜀㤀㈀㔀䐀㌀䔀㠀　㤀䌀㤀㘀　䈀　㤀䄀㄀䔀㄀㘀㠀㘀䄀㔀䈀㌀㌀㈀㜀㈀　䌀㤀䌀䔀㠀　䌀㔀䔀㈀㐀㄀䘀㄀㌀䘀㈀䐀䈀㠀㠀䄀㔀㜀㘀㈀䐀㤀㤀䌀䄀䐀㠀䌀㜀㘀䄀㈀䘀㄀㄀㘀䔀㈀䐀㘀㌀㐀䈀䌀㘀䄀䈀䌀㠀䐀㄀㐀㈀㌀㐀䈀㄀䐀䌀㄀䌀䈀㄀㄀㤀䌀䈀㄀㤀㠀㜀㌀㐀䄀㔀㜀㜀㘀䔀䌀䔀㤀㄀䌀䘀㘀䄀㐀䘀　㤀䔀㐀䔀㈀㄀㜀䘀㠀䄀䌀䄀㤀㤀㔀㠀䈀㘀䐀㤀䄀䌀䘀　㈀䔀㜀㔀䐀䔀㐀㈀㜀㐀㐀䐀䔀㌀㔀㜀䐀䔀䐀㘀䐀㘀䔀㔀䔀㔀㌀䔀㘀㌀㈀㌀㈀㐀㘀㔀㌀㔀㔀䐀㘀㌀㔀䔀㘀㌀㜀䈀䌀䘀㈀䄀㄀䈀㔀㔀䈀㌀㤀㜀　䔀䌀㤀㄀䄀䔀䔀䈀䄀㈀㘀䘀䈀㐀䄀䐀䘀䐀㠀䄀䌀㠀㤀䄀䔀㠀㤀䐀㤀䄀㌀㜀䐀䈀㌀䐀㔀䐀㤀䔀㘀䄀㤀㔀㤀㜀㌀㔀䌀䈀㌀䈀㌀㈀㜀䘀䈀䔀䔀䄀㐀䈀㜀㈀䈀䈀㜀㤀㤀㄀㜀䐀㤀㔀㘀㈀䈀㠀䘀䄀䈀㄀䈀䘀㔀䘀㜀䈀䌀㤀䘀䐀㄀㠀䘀㤀㔀㠀䘀䌀䐀㤀䘀䐀䈀㜀㈀䐀䄀㔀　㄀䄀䄀㠀㈀㜀䌀䘀㄀㄀㠀䐀㘀㠀䈀㠀㌀䌀䐀㔀䌀㐀㤀㌀䘀䌀㌀䈀䔀䄀㐀㠀㜀㌀䈀䄀㜀䔀　㄀㈀㌀　㤀　䈀䌀㐀㘀㈀䘀㘀㘀䄀㐀䘀㤀䐀㌀㄀㄀㘀䌀䔀䔀䘀䐀㔀　㌀䄀㔀䌀㌀䄀㠀䄀㌀㌀䔀㄀䌀㘀㠀䌀㈀㤀㜀㌀㈀㠀　㐀㘀　䌀㜀㘀　㐀䔀　䔀䔀㘀䄀䔀㌀㠀㘀䄀　㔀䐀䐀㌀䈀㐀㌀㠀䌀㐀㤀䄀䄀䈀䔀䐀㔀㘀䈀㌀㌀㤀㔀㔀㌀㄀㔀㠀㈀䌀㔀㠀㘀㤀䄀䄀䈀㘀䐀㜀㄀㄀䄀䔀㐀㠀㌀㔀䔀䌀㠀㤀䘀䘀㌀㄀㌀䌀㐀䄀㌀㈀䄀　䌀㐀㤀　　㘀㈀㔀㈀㤀䐀　㔀䐀䐀㔀㘀㐀㐀㌀䔀　䐀䐀䘀䈀㌀㠀䘀䘀䔀　䐀㐀㘀䈀䄀㌀㈀䐀㜀㠀䔀㔀䐀㔀䐀䄀䘀㤀䄀㈀㤀䄀㈀㘀　㔀䐀㐀䌀䔀㈀㜀䈀㔀　䐀䘀㐀䌀䄀㠀㘀䐀㠀䄀㠀䘀㄀䌀䐀㐀䄀㈀㠀㔀䈀䘀㜀䄀㌀㄀䄀㘀㠀䄀㐀㈀㄀䘀㌀㘀䘀㤀㌀㈀㜀㠀㠀㄀䈀㐀䘀　㜀㤀䔀㌀㘀㌀䌀䘀䈀䘀㈀㄀䘀䔀　㔀㤀㔀㌀㔀㌀䔀㌀䐀䈀㘀㄀㜀㄀䌀㘀㔀㤀㜀㄀䘀㌀㄀䌀㠀䈀㐀㔀䌀䄀䌀㄀㐀䄀䔀㌀㄀䌀　㤀　㌀㠀䈀䌀䄀㘀㠀㘀㔀㤀㐀䈀㌀䈀㤀䔀䔀䔀㠀㔀㌀㔀䄀䔀㈀㜀㘀㌀䈀㔀　䐀䌀㤀㔀䘀䌀䈀䌀䄀㈀㐀㠀㤀㘀䔀䔀㈀䔀㈀䐀䔀㤀㘀㌀䐀㜀㈀㌀䘀㤀㜀㤀䄀䄀㌀㈀㘀䔀䘀㘀䈀㄀㈀䐀䈀㜀㌀㔀㈀䔀㄀㠀㌀㐀䔀䈀䐀㠀㌀㌀㄀䘀䐀䐀䘀㤀䔀　㤀䔀㘀䐀㠀䈀㄀㜀㘀䘀䐀䈀䈀㘀㜀㐀䘀㄀㌀㔀䈀㔀䘀㐀㄀㠀㐀㠀㜀　䌀㔀䄀䈀㤀㌀㤀䄀㄀㈀䌀㤀䌀䘀㄀㈀㠀㤀䌀㐀䌀㄀䔀䐀㠀䘀䔀䘀㠀㘀㈀㜀㄀㌀㠀䘀㜀䐀㜀䘀㄀㘀㔀䐀䘀䔀㔀㤀㘀㜀㘀䔀㔀䔀㠀㔀㌀䌀㜀䔀㄀䌀㐀䐀䔀㤀㐀㔀䔀㐀㌀㄀㄀㌀㔀㠀㌀㤀㠀㜀㌀㔀㤀㤀䐀䄀㘀㘀㤀䔀䄀㤀㤀㠀㌀㈀䐀㐀㈀㈀㤀㤀㠀䄀㈀㤀㐀㔀㠀䈀㌀㘀䄀㈀䌀㐀䌀㈀䐀㔀㠀䌀䐀䈀㤀䐀䐀㤀䐀㈀㌀㈀䈀䄀㤀䔀㘀䔀㌀㈀㐀㠀䄀䘀㐀䄀㘀　㈀㐀㠀䄀㐀䌀㤀㤀㔀㄀　㘀㠀䐀䌀㈀㘀㄀㤀㌀䄀　䄀䔀㠀㤀䄀䘀㄀㌀　㄀䈀䔀䔀䐀㄀㐀㐀䘀㤀䔀㄀　㔀䄀㄀㄀㈀䈀䐀䘀䌀㔀䔀䌀㠀㈀㔀䐀䘀䐀㠀㈀㔀䐀䄀䐀㠀㈀㔀䐀㤀㄀㔀䄀䈀㄀㘀䌀䌀䔀㠀䌀㄀㤀㠀䔀㄀㌀䐀䌀㤀㜀䄀㌀䌀㤀㌀㄀䈀㐀㜀㐀㌀㈀䔀䘀䌀䈀䌀䄀䘀䈀㤀㈀㈀㄀㠀㐀䘀㄀㄀㔀㤀㔀䈀㌀䌀䐀㜀䈀䄀㄀　㈀㔀㘀㤀㈀㤀㐀䄀䄀㤀㠀㤀䘀㔀䄀㄀㄀䘀㄀䌀㌀㤀䈀㤀㐀㐀䘀㔀㄀䔀㤀㈀㤀　㜀㌀䈀䈀㜀㜀㘀䈀㔀䄀㐀㄀㘀㤀㔀䈀䈀䘀㠀䄀㄀䐀㤀䄀㌀㘀　㔀㐀㘀㈀䈀㈀㘀䌀　㐀䌀䐀䌀㠀㘀㤀㔀䐀䔀㤀㈀㠀㐀㜀䄀䐀㠀㈀　䄀　䐀㈀㤀㄀䔀䌀䔀䈀㜀㈀䈀㠀䄀䐀䄀㄀䈀䐀㔀㔀㜀㈀㤀䈀䐀䐀㠀㌀䌀䘀　䐀㠀䐀㠀䌀㜀䈀䔀㈀䄀㔀䔀㈀　䐀䐀㌀㔀㘀　㜀㄀䘀　䈀㔀䄀㄀㠀㜀㈀㜀䔀㄀㄀䌀㈀䄀㔀　䈀䄀㔀㔀䄀㐀㔀䌀㠀　㄀㘀㔀䐀䘀㘀㌀䔀㘀㈀㐀㘀䈀䈀㘀䔀䘀㄀㘀㘀㘀㔀㈀㤀䔀㌀㈀䌀㔀䌀䄀　䔀䌀㜀㘀㔀㄀㌀㤀㄀㌀㌀㌀䔀䄀㌀䄀䐀㘀　㈀㐀䔀㌀㤀䌀　　㔀䐀㔀䌀㌀　㄀　㈀　㄀䘀䔀㌀㐀䔀　䈀㜀䔀㈀㤀㌀㠀　䌀㘀㘀㜀㄀㠀㠀㠀䐀㌀㜀䐀㠀㠀㤀㌀䌀㤀䔀㌀　㤀　㔀㜀㔀㌀䈀䈀䄀㈀㈀㐀㄀㐀㐀䄀㔀䘀㠀㈀㌀㠀䔀㔀　䘀㄀㄀㄀㔀㈀䌀䌀㄀㤀㈀䌀㔀䄀䌀㤀䄀䘀㠀㜀㐀䄀䈀㠀　㠀䐀㌀䈀㘀　㄀㌀㔀㠀㜀㠀㌀㠀䄀　㄀㘀㌀㐀㘀㤀䈀㤀䐀㘀㘀䌀㘀㌀㤀㄀㄀㌀㌀㌀䈀䈀㈀䔀㠀䈀㠀㠀　㤀㌀䈀㜀䘀㄀䈀䔀㄀䈀䈀㄀㘀䈀䄀䔀㌀　䌀䌀㘀㘀㌀䄀䌀䔀䌀㌀䄀䐀㠀䘀䄀　䘀㘀㈀䘀㠀䐀䌀㘀䄀㔀㤀䄀㠀䘀䌀㜀㐀㜀㄀㌀㠀㌀䌀㔀㠀㘀䘀㘀㤀㜀䘀䈀㈀䈀䘀䈀䔀㐀㌀㜀㤀㔀㜀䐀䔀䄀䈀䈀㠀㘀䘀㜀䘀䌀䔀䄀䐀㔀㔀䄀㠀䐀㌀㘀䐀㘀㌀䄀㔀䈀㤀䈀㘀㘀㔀䐀䔀㐀㔀㠀㤀㐀㜀㔀䄀䘀㘀㌀䈀䘀䔀㌀䔀䈀㤀䌀䄀䘀㜀䐀㘀㜀㜀㌀䈀㐀㌀㜀䌀䐀䈀䈀䈀㌀㘀㠀䌀　䄀㐀㄀䈀㄀㐀䔀㔀䈀　㌀䘀䌀㜀䔀㤀䘀㜀䔀㜀㄀㠀䘀䌀㌀㤀䄀㠀㈀㤀　䐀㌀㤀㜀䔀㘀㘀　㤀䔀㠀㜀㄀䘀䄀㜀䌀䐀㌀㐀㠀㌀䈀䐀㠀䔀㌀䔀　䐀䐀䌀㤀䘀㄀㈀㐀㄀䌀䈀㄀㈀㘀䄀　㤀䄀䄀㤀㠀㌀䈀㠀㤀䈀䐀䄀㠀㤀䈀䈀䄀㤀㐀䐀䐀䌀㈀䐀䐀㔀䄀㘀㌀䄀䌀䘀㌀㄀㔀㐀䈀㐀㔀䌀䔀㐀㘀㄀㄀䘀㔀䐀㐀䔀㐀㈀㐀㐀㠀㜀䈀䔀㌀㄀䌀䐀䈀䔀䈀㌀㄀㈀䔀㌀䐀䌀䈀㤀㜀㐀㄀㤀㤀㔀䔀㠀㔀䔀㔀䄀㐀　㠀㈀䈀　㜀䔀㠀㜀㄀　䐀㈀㔀䄀㔀㐀䈀䌀䔀㜀䄀㌀㔀䌀䘀䘀　䄀䔀㤀㐀㐀䔀䘀䄀㜀䈀㈀䄀㔀䈀㔀䘀㘀䄀㐀䐀䐀䌀㄀䘀㤀　㄀㈀䘀䄀䈀䄀䐀䐀䐀䄀㌀㔀㘀㔀㐀䌀㜀㈀㤀㈀䈀㤀㘀㄀㘀䐀㤀㤀㠀䐀㄀䄀㜀䘀䈀䘀㔀㔀䌀㌀䐀䄀　㈀䈀䈀䘀䌀㔀䄀　㔀䘀㐀㔀㐀㄀㌀㔀㘀　㘀㤀䌀㐀㌀㌀㈀㌀䄀䘀㜀䐀㘀䈀㐀㠀㈀䐀䐀㐀䐀䔀㠀䄀㔀㈀䌀䈀㤀㜀䐀㘀䔀㈀㔀㌀㔀㔀　䈀　䐀䌀㐀㔀㤀㘀㤀䘀㌀㄀䌀䄀䄀㌀㤀㈀䐀㐀㈀㜀䄀㤀䐀㘀㤀䔀㤀䈀㔀㤀㜀䐀䈀㐀䈀㤀㄀䄀㐀䌀㠀㔀㈀㠀㔀䄀䔀㜀　䄀㐀　䌀㄀㤀䄀䄀㐀䘀㤀䘀䐀䔀䈀䐀㔀　㘀䔀㠀㔀㜀㄀㐀㐀䄀㄀㐀㘀㌀㌀㠀㤀㄀䔀㠀㠀䄀㈀㐀䄀䔀䄀䄀㔀㌀㈀䔀䄀㈀㤀㜀䌀㘀䔀䘀㌀䘀㜀㔀䈀㌀㜀䐀䐀㜀㔀䘀㜀㄀㌀䈀　㈀㜀䔀䈀䌀㈀㄀䘀㠀䘀㤀䐀䘀䘀䐀㔀㐀䈀㘀䘀㌀䘀㌀䈀㌀㄀䈀　㜀䐀䘀䈀䌀　㠀䄀䄀㤀　㜀㤀㘀㄀䔀䘀䄀䘀䄀䄀㘀䐀㤀　䘀㌀䘀䈀㄀㌀㘀䔀䈀䔀㠀䄀㜀䐀䘀㘀䐀㄀䘀䘀䘀䘀㈀䘀䔀䔀㜀䐀㜀㐀䌀䔀㤀㠀㤀㤀䌀㔀㠀㤀䐀㌀䌀㈀㔀䈀㤀㤀㄀㄀㌀䄀㌀㜀　䈀䔀㤀䐀㤀㔀㌀　㘀㜀㜀䈀㘀㌀㜀䌀㜀䐀䈀䐀㜀䔀　㈀㔀䌀㘀㐀䄀㈀㄀䄀䐀䔀㐀　䔀㜀㜀䌀㤀㌀䌀㔀䄀㘀䐀㤀　㈀㈀㘀㔀㌀㘀㜀㔀㜀䌀　㈀䘀　㔀㌀䄀䘀䈀䔀㔀䌀䔀㤀㘀㜀䌀㠀䈀䔀㘀䌀䐀㐀㘀䘀㜀㈀㔀䄀㐀㜀㌀㈀㄀　䌀䄀㤀㄀㄀䌀䔀㈀㔀㄀䌀㌀䌀㔀㈀䌀䌀㜀㔀㌀䌀㄀䄀㜀㐀㌀䌀㠀㠀䄀㌀㄀䌀䘀䐀㐀㈀䈀㐀㘀㌀㌀㠀㤀㤀㤀㘀㜀㜀䘀㐀㜀㜀㄀䌀䔀㔀䘀䄀䄀㄀㘀㠀　㤀㌀䘀㌀㤀㜀䘀䘀㐀㤀　㈀䐀㘀䔀䌀䈀㄀　䌀䈀㈀䄀㠀䈀㌀㐀䌀㐀㜀䔀㤀䐀䘀䐀㌀㘀㄀䘀㄀䈀䔀䐀㤀䔀䄀㌀䌀䘀㜀㈀㐀䔀㜀㌀㈀䘀䈀㐀䐀䌀䔀㤀㔀䌀㘀㔀㔀㤀䔀䈀䈀䌀䐀㜀䘀㜀㠀㈀䌀㔀㘀㐀䐀㘀㈀䌀㔀㘀㐀㤀　㔀㄀䌀　䘀㌀㠀㈀㌀䘀　㐀䘀㠀㄀䘀㘀　㄀㐀䘀㤀䔀㔀㠀䄀　㜀㜀䈀㌀䄀㘀䈀㤀㈀㐀䔀䘀㔀䔀䘀䄀㌀䌀䌀㤀䄀㘀㌀㌀㘀㌀㐀㘀䌀㐀㐀䔀㐀㘀䘀㐀㈀䌀㠀䔀　䔀㜀䌀䔀㄀㘀㠀䌀㜀㄀㜀㠀䔀㜀㘀㘀㘀䌀　㔀㄀㌀㜀㈀㤀㌀㐀㌀㜀㐀㐀㐀㌀㔀䔀㈀䔀㐀㜀䄀㄀㜀䄀䈀㔀䌀㌀㐀䈀㘀䄀䈀䈀㤀㜀䐀㐀㜀㘀㈀䘀䄀㤀㜀㔀㄀㄀㘀㄀㌀䈀㈀㈀㐀　㈀㈀㜀䄀㠀㐀䔀㈀䄀䌀䌀䘀䔀䐀䔀㘀䔀䘀㐀㜀㌀㘀㜀㐀䘀㌀䌀㘀䄀㄀㘀䘀㘀㌀䘀㘀㌀㄀䐀㠀　䈀㜀䐀䐀㄀　䐀㌀㠀㄀　㌀㌀䈀㜀㔀㤀㠀㘀　䐀㔀䐀䔀㌀䘀　㔀　㤀䄀䈀㤀䄀㈀㈀䐀㠀㈀䈀䐀䐀㈀䌀䄀䘀䘀㔀䌀䈀㐀䈀㘀䌀䐀　㘀䈀㐀㤀䔀䔀㐀㘀㈀㠀㐀䘀䔀㄀㄀䔀㜀䈀㔀㄀㐀䄀䈀䈀㔀䈀㄀㔀㜀䄀㌀㄀䌀㘀㈀㈀㠀㤀䐀䌀㠀㐀㘀㌀㔀㔀䌀㄀䐀䌀㄀㜀䌀䌀䔀㐀㐀㄀㠀㐀䄀㐀㠀䘀㤀㤀䄀䌀㔀㘀㘀㐀㈀䐀䔀䐀㤀㌀㤀䌀㜀㘀㘀䘀㌀㜀㜀㤀㘀䈀　䈀㘀㜀䈀㐀䔀㘀㜀㐀䈀䈀㘀䐀㜀䔀䈀㜀㜀　㤀㠀䔀䘀㈀　䈀㠀䔀㈀䄀㈀㤀㈀䔀䔀㔀㐀䌀㔀㔀㄀䌀㈀䐀㈀䐀㈀㤀䌀㜀䄀㈀㤀㐀㔀䈀㠀㜀㌀㈀㌀㜀䈀㜀　㘀㠀㈀䄀䈀䐀㐀䈀㈀䈀㘀㘀䄀㠀㘀䌀㄀㌀㠀㠀㜀䄀㤀䘀䌀㐀䄀䘀㈀䘀㌀㈀㈀䐀㔀䌀䐀䌀㄀㐀㜀㘀㜀㈀䘀㜀䈀䘀䐀䐀㤀㈀㔀䄀㔀䌀㌀㤀䐀　䔀㜀㌀㔀䐀㜀䌀䐀㔀䄀䌀㤀䈀䐀㜀㌀㤀㤀䈀䌀㌀䐀䘀䈀䐀㜀㘀䌀㜀䔀㄀䐀㤀㌀㜀㐀䐀䈀䈀㜀䈀㐀㌀䔀㈀䘀㐀䌀㜀㘀䘀㈀㔀䔀㄀㄀䔀䔀䘀䄀㘀䐀㔀　䐀㜀㜀㈀䘀㜀䔀䌀㘀䘀㤀㄀㐀䈀䐀㘀㌀䌀㤀䐀㐀䈀䈀㔀㜀䄀䌀　㠀䔀䐀㜀䌀㜀㜀㐀㘀䔀㌀䈀㐀㐀㤀㐀䘀㜀㐀　䘀䈀䌀䘀㄀䌀　㠀㄀䌀㐀㌀䘀㐀䘀䘀㄀　㠀㈀䌀　㜀㌀㔀䄀　㠀䔀㜀䔀䈀䘀㠀㤀㔀㠀䄀㠀㤀䘀㜀㌀䐀䔀㜀䔀䄀㈀㈀㔀㜀䘀㐀䄀㤀㄀䈀䐀䈀㤀䐀䄀䄀㈀䄀㐀　䐀㠀㠀㤀䌀䈀㄀㈀㐀㐀䄀䄀㘀㘀㈀㘀䌀䈀㌀㈀䐀㤀㤀㠀䄀㤀䌀䈀㄀㈀䐀㐀䄀䄀㘀㘀㈀㘀䌀䈀㌀㌀㘀㤀㤀㠀䄀㘀䄀㐀㠀　㌀㄀䈀㌀㈀㄀㔀㌀㔀㘀㌀㤀䐀　䐀㠀㘀㌀㘀㤀㠀䈀㐀㘀㤀㌀㈀㘀㐀㈀䄀㜀㈀䄀㘀䄀㈀㘀㐀㈀䄀䌀㘀㐀䌀㈀㔀㘀䐀䌀㜀㘀㈀㘀㔀䐀㔀㠀䔀䘀㄀䐀䄀㐀䌀㘀䐀䈀㌀䈀㘀㐀䐀㜀䈀㐀䘀㤀㌀㠀㜀䈀㌀䔀㄀㤀㘀㐀㜀㈀㐀䔀㘀㐀　㤀㔀㐀㔀㌀㐀㠀㔀䄀㤀䈀㈀䌀㤀䌀䌀㔀㐀䈀㐀㠀㘀㄀㘀䌀䈀㘀㄀㈀㘀㌀㤀㄀㤀㤀㌀㤀㠀㠀㔀㔀　䌀䐀㈀㈀䄀㤀㘀䌀㄀䘀䐀䐀㠀㜀㠀䔀㈀㌀㠀㔀㈀䐀㌀㄀㄀㌀䘀䘀䄀䈀㜀㈀㤀䄀㐀㘀　䔀㤀䈀䄀㐀㌀㠀䈀䐀㘀㤀䈀㜀㈀䌀㤀䈀㘀㈀䈀㤀䌀㄀㔀䔀䄀㘀㠀䌀㤀㤀㌀㌀䄀㔀㜀䌀㈀䄀㔀㄀㌀㤀㈀㌀㤀䌀㈀䈀㔀㌀㄀䌀䌀䄀㘀㈀㄀㘀㌀㔀㤀㘀㤀㜀䐀䘀㐀䈀䄀䐀　䘀䘀㜀㔀㘀㌀㜀䐀㠀㈀㠀㤀㜀㔀㄀䈀㌀䌀㔀䐀㤀㠀䈀㔀　㤀䐀㠀㘀㈀㠀䄀㌀䘀䌀㘀㔀䘀䔀　䔀㔀㘀㐀䔀䔀䔀䔀㈀䔀䘀䐀　㤀䐀䐀㘀㌀㠀䄀䌀㄀㌀䄀䌀䘀㜀㌀㜀䔀䔀㜀䈀㜀　㈀䈀㜀㜀㠀䔀䐀䈀㠀㐀　䄀䘀䐀㤀㐀㈀䔀㠀䌀㄀䌀㐀㘀䐀　䔀㜀㈀䈀䔀䌀䔀㔀䔀㔀㈀㈀䌀㐀㔀䄀䐀䐀㌀䐀㈀䄀䄀㄀㘀㘀䈀㌀䐀㤀㘀䌀㘀㠀䘀㘀㐀㐀䌀㈀䐀䈀㠀㈀䔀䔀䄀䈀䄀㌀㄀䌀䔀䐀䌀㐀㐀㜀㌀㄀㜀㌀㘀㤀㌀㤀䌀䈀䔀䈀㔀㘀䌀䔀䄀㐀䐀䌀䐀䌀　䄀㤀㄀㈀䔀㐀㘀㐀㘀㐀㐀㤀㠀㤀㠀㔀㌀㠀䈀㤀㤀䌀䈀䈀㔀䘀䄀㔀㄀䔀㔀㔀䄀㈀䌀㔀㈀䄀䔀䔀㔀䘀㤀䈀㄀䔀䌀㔀㘀㤀䔀㐀䄀㈀㠀䌀㌀㈀䘀䔀䌀䄀㜀㤀　䄀㠀㘀䘀㤀㜀㈀㘀㄀㤀㄀㔀㘀㘀䄀㄀㜀㄀㔀㘀䈀㈀㤀䈀䈀䈀㈀䔀㐀㐀㤀㌀㌀㈀䄀㘀㌀㐀㔀䄀㔀䄀㔀䄀㤀㈀䈀㈀䄀㔀䘀㘀㜀　㘀䘀㈀㠀䈀㔀㤀㜀䈀䄀䘀㈀䔀䐀䌀䌀　䔀㜀㐀㘀㌀䔀䈀　䄀䘀䄀䔀㐀䌀㌀䔀䘀䈀䌀䐀㌀㤀䌀䔀㠀　䐀㤀㌀㔀䔀㘀　䈀䈀㈀䔀㔀䐀䘀㌀㐀㈀䔀㈀㄀㤀䐀㐀䐀䌀㠀䘀䈀㘀䌀䔀㐀㘀㠀㔀䌀　䈀䐀䐀䔀䈀　䘀䌀㈀㈀䐀䄀㔀㔀㔀㔀㜀㠀㈀㐀㔀㤀㄀㤀㄀䔀㜀㄀㘀㐀㈀䄀㔀㤀㔀䄀㜀䄀䈀㔀㄀䐀㤀㤀㐀䄀㤀㘀㤀㘀㔀䔀㔀㈀　㜀㔀㘀䘀㘀㜀　㐀㄀㐀䘀㈀㤀䌀㄀㌀䐀　㐀㤀　䄀䄀㄀㘀㐀䔀㐀㘀䘀　㔀䈀㐀䐀　㄀㤀㜀䌀䈀䔀䘀䔀　㐀㘀䐀㘀㘀䌀㤀㌀䄀㐀㠀　䐀䘀㘀㈀　㔀䄀㈀㜀䄀䐀㄀　㔀㄀㄀㈀䔀䈀㐀䄀㠀　㠀㠀㔀䌀㤀䌀䐀㄀䘀㔀㜀㜀㠀㔀䌀㤀　㜀㄀㄀䄀䄀䐀㠀㜀㔀　䌀㤀㜀㄀㄀䐀䐀㜀䌀䈀㈀㄀䌀䌀䈀㐀㐀䐀㔀䌀㠀㜀䔀㔀䐀䌀㤀㤀䈀䈀㌀㘀㜀㜀㘀㌀䐀㘀㐀䈀㔀㤀　㜀䈀㔀㠀䘀䈀㔀䌀䘀㜀䐀　㘀㘀㌀㤀㘀䐀㜀䐀䄀㈀㔀㠀㜀㘀㔀㤀㤀㔀䌀㠀䔀䄀䌀䄀䌀䌀㌀㔀㘀㤀䈀䐀㌀㤀䄀䔀㔀䈀㐀䐀䄀㈀䌀䄀㠀䔀㜀㘀㈀㔀㤀㜀䌀䔀㠀㤀㠀㜀㔀　䈀㐀㘀㜀㤀㔀㘀㔀䈀䌀䌀　㔀㘀㤀㌀㐀㜀㘀䐀䈀㈀㐀㌀㠀䌀㘀㜀㔀㈀　㄀䄀䌀㌀㤀㠀㤀䐀㈀㌀㘀㐀㤀䘀䄀㐀䌀䘀䐀㔀㤀㜀䔀㤀䔀䈀㜀㔀㐀㤀䘀䘀䄀䘀㜀㔀㤀㠀㔀㜀䔀㠀㌀　㈀䘀㐀㘀㄀㄀䈀䄀㤀㜀㜀䄀㌀㌀㌀䄀䌀䌀䈀䈀㈀㄀䔀㐀䐀㠀　䘀䈀䐀㠀㤀　䐀㄀䔀㐀㔀䌀㠀䈀䔀㠀䐀䐀㘀㤀䐀䈀䘀䄀㐀䌀䈀㠀㈀㄀䐀㜀㔀㔀㤀　㜀㘀䐀㔀㘀䌀䈀䄀㌀㌀䌀䐀㐀㔀䘀㠀㈀　㘀䈀㔀䄀㠀㘀㤀㘀䄀㜀㤀㄀㘀㘀㐀䈀㔀䄀㄀㜀䈀㔀㐀㐀㘀䈀㘀㈀㈀䔀䐀　䐀㘀㘀䈀㌀䈀㄀㠀㜀䐀䌀䌀㌀䈀䌀㄀㜀䔀䐀㈀㐀㄀㌀㜀䄀㠀䐀㘀䈀䈀㘀䘀㤀䈀㔀㜀䌀㄀㌀㈀㈀䔀㌀㘀㠀㄀㄀䔀㈀䈀㜀㘀㐀㔀㤀䐀㄀䐀䘀㤀　㔀䌀㈀㤀　䐀䔀㜀㜀㈀䐀㤀䘀䌀㤀㈀㜀　㜀㜀䘀䐀㄀㘀㤀䈀　㌀㈀䐀㘀㜀䔀㌀㄀䌀㤀䈀㤀㐀㌀㄀㤀㠀䌀㔀䘀䌀㐀㐀㜀䔀䈀㄀䄀㜀䔀䌀㘀㘀㜀䈀䘀㔀㠀㘀㌀䄀㈀䐀㈀䈀䔀䌀　䄀㌀㌀䐀㐀㘀䈀䌀㐀䔀㔀㔀㐀䐀㄀㄀㜀㠀䔀㠀䌀㜀䈀䌀㌀䈀㔀㘀㤀䌀䔀䐀䐀䌀䐀䐀䈀䐀㜀㔀䐀䈀㜀䄀䔀䐀㌀䈀㘀　㜀䔀㠀䄀㜀䄀䐀䈀䈀㐀㜀䄀䔀㜀㠀䘀　　　㄀㠀㄀㘀䐀䌀㜀䘀䔀䔀㜀䘀㔀䄀䄀㄀㔀䔀㔀䘀㜀䈀䐀䘀䄀㄀㘀㜀㌀㜀㌀㜀㠀䔀䄀䌀㜀㐀䐀㌀㄀䘀㔀䔀㐀䐀䐀䌀㌀㘀㌀㄀㜀㄀䘀䔀㠀䘀䔀䘀㌀䔀䐀㠀㜀㠀　㈀䄀㜀㔀䘀㠀㔀㤀䌀䔀㘀㐀㈀䈀䈀㤀㤀㐀䈀䈀䄀䌀　䈀㜀䔀䐀㈀䌀㘀㜀䐀　　㘀㐀㄀㤀㠀　㐀　䌀㜀䌀㤀䐀　㈀㌀㄀　䈀㔀㠀㈀䌀䔀㠀㐀䔀䘀㤀䔀㐀䈀䌀㠀　䐀㌀㘀㈀　䄀　　㈀㤀䐀㐀䈀㤀䄀㌀㈀㔀㘀㈀㈀䐀㌀䐀䔀　䐀㄀㌀㤀䔀䈀㜀㠀㠀㐀䐀䐀䘀㐀㠀㠀㔀㠀䌀䈀㤀㌀　䔀㠀䌀㠀䔀㜀䌀㜀㐀㐀㐀䘀䘀㔀䐀㠀㘀㠀㔀㘀䄀㔀䈀䘀㐀㐀㌀䈀㔀㤀䌀㠀㔀䈀䄀䌀䐀䌀䔀㠀㘀䌀㄀㘀䄀䌀䌀㌀㔀㌀㠀㜀䈀㜀　㘀㠀㠀㈀㘀㌀㘀䌀㘀㠀㌀㘀㤀䈀䄀㘀㐀䔀㌀㌀䌀䌀㜀㈀㐀䌀　䈀㈀䐀㌀　㈀䌀䘀㐀䄀䘀㌀㐀䄀䌀䘀㈀㜀䘀㘀䌀䘀㠀䌀㠀㘀䐀㔀㜀㐀㌀㜀䌀　䐀㠀䈀㔀㈀㈀䄀㐀　㄀㤀㤀㜀䌀䘀㤀䐀㌀㤀㄀䘀䄀䘀㠀㔀䌀㔀　㌀㠀䔀䐀㘀㈀㠀　䈀㐀㔀䌀㐀㜀䌀㜀　㠀䌀䘀䈀䄀㈀㜀㄀㘀䔀㌀㄀㌀㌀㐀㠀　㈀䈀㜀㔀䐀㘀㐀㘀㜀㘀㄀　㜀䘀䔀㈀㤀㘀䌀䌀㜀㌀䘀㠀㔀䔀䐀䘀㠀䄀㜀䈀　㐀䔀㄀㜀䘀䌀䄀㌀　㌀䐀㄀㔀㄀㔀㔀䔀㄀䐀䌀䌀䔀䔀䔀䔀㘀㌀䔀䈀㜀䈀䔀䄀㄀㈀䈀䔀䄀䄀㠀䈀䔀㐀䐀㠀㄀㠀䌀䐀　　㔀㌀㈀㘀䄀㌀㠀㠀　㔀䄀㜀㌀㤀䘀䔀㠀㈀㜀　　䔀㔀㌀㄀㐀䈀䄀㔀㘀㜀㤀㈀㘀㜀䄀䔀㘀㜀㤀㤀㐀㜀䘀㈀䔀㠀㘀㤀　　䄀㐀㠀㘀㔀　䄀䈀䐀㘀㘀䄀㠀䘀㤀䈀㜀㜀䔀㔀㜀㄀㜀㌀㤀䌀㌀䐀㜀㄀㔀䄀䐀　㄀㐀㘀䐀　䈀㤀䐀㔀㈀䈀㘀䈀㈀㌀䐀䈀䘀䈀㔀䄀㐀　䌀䄀㜀㌀　㤀㠀㐀㠀䈀　㌀㘀䔀㘀䐀䄀䌀㌀㄀䐀䈀　䔀㘀䄀㈀㔀　㜀䔀㈀㠀㄀䌀䌀䘀㜀　㄀㜀䔀䘀㠀　䐀䈀䌀䔀㄀䄀䐀䘀㐀䔀　　䐀㤀㘀㐀䔀㤀㈀㐀㜀㠀䌀䄀㘀㈀䘀㄀㌀㤀䘀㌀　㐀㐀䘀㌀㤀㈀䐀㌀䔀㔀㤀㤀㠀㐀䌀㤀䘀㜀䌀㤀㤀䄀㜀㐀䄀㔀㈀䐀䌀　㐀㘀䄀䄀㐀㐀㠀㐀㐀㐀䐀㠀䄀䌀䄀䄀䐀䄀㌀㠀㌀䈀䈀㔀䘀䘀㤀㜀㤀䌀㐀䄀䔀㤀㜀㜀㄀㔀䈀　㤀䌀䔀㜀㘀䈀䌀䌀㘀㈀䔀㌀㘀㜀㤀䈀䈀㔀䔀㌀䐀䈀䈀㜀䄀䔀　䈀㠀㄀䈀䔀㤀䌀　䘀䐀㌀㌀㤀䄀㔀䈀㘀䘀䘀䘀㘀　䌀㔀㔀䘀㄀㈀㈀㜀㤀䘀䈀䌀䘀㜀䘀㐀䘀㘀㈀䘀㔀䄀䌀䈀㐀㘀㌀䔀㌀　䔀㈀䐀㘀䔀㜀㤀䘀䈀䐀㘀䈀䐀㄀䌀䈀䐀㈀㄀㠀䔀䈀䄀䌀㄀䔀㔀㔀㌀䐀　㘀㤀䌀䘀㤀䐀䘀䄀㤀㤀㌀㄀㌀㌀䘀㜀䔀䈀㠀䈀㘀㘀㔀㈀㤀　䌀㠀㌀䌀㔀䈀　䔀䐀䄀䐀䄀䐀㘀䘀㔀䘀䘀䄀䄀㈀䘀㘀䔀㔀㤀䄀䘀㠀㔀㌀㠀䘀䈀䘀䘀䔀㌀䄀䄀䔀䐀㈀㄀㐀䈀㐀㤀㜀㘀䔀䘀㤀㈀㔀䄀㐀䘀䐀㜀䐀㈀㈀㌀䈀㘀㄀㌀䐀㘀㐀　㄀　㤀䘀䘀㔀㄀㠀㌀㘀㐀㐀㐀䄀㌀䌀㈀㄀㔀㔀㌀　䘀　䄀㤀㈀㔀㄀䈀㌀䐀㐀㌀㄀㐀㘀䘀㤀䈀㈀㠀䌀㄀㐀㔀䔀㈀䐀䄀㌀㌀㤀㌀㘀㐀㌀㤀䐀䘀㄀䘀䘀㤀　㤀㄀䌀㠀㤀㔀㤀㌀㈀㠀䄀䈀䌀㐀㘀㈀㈀䔀㈀䌀䌀㌀䐀㠀㈀䔀䐀䈀㤀䄀㄀㘀㘀　㤀䔀䄀㘀㤀䌀㔀䘀㔀㄀㜀㔀䄀䔀㘀㔀㠀㐀㜀䔀㤀䔀䌀㜀㌀䌀㌀䌀䐀䈀䌀　䈀䐀㔀䐀䘀㐀㄀　㔀㈀䄀䔀㈀䐀䌀䄀䄀㌀䄀䘀䐀㤀䄀㠀㌀㄀䔀㐀㄀㔀㈀䔀㘀䈀㈀　㘀㐀䄀䐀䈀㐀㌀㈀㤀䐀㐀㄀㔀㄀　㠀㔀㌀䐀㐀䘀䌀㌀䔀　䔀㐀㜀䐀㤀㄀㐀䈀㘀㜀㌀㔀䐀䄀㈀㘀㔀㔀㠀㄀䘀䐀䈀㄀䔀㜀㘀䘀㜀㌀䘀䔀䔀㤀㔀㜀䔀䐀䄀䈀䔀䔀䔀䐀㄀㠀㐀㈀㌀㜀㄀㌀㄀䘀䔀䘀㤀㜀㘀䘀㠀　䔀䐀䔀㜀䐀㠀㈀㌀　㌀㈀　㘀䄀㔀㈀㘀㄀䈀䄀㔀䌀㘀㐀㌀䘀㈀㐀㤀　䘀䘀䄀䌀䔀㘀㔀䈀㤀㘀㤀䐀㘀㠀㠀㈀䘀䐀　㤀䐀㤀䈀㌀㄀㠀䌀㘀䘀䔀㠀䈀㠀䔀䔀䐀䐀㄀䐀䔀㄀㠀　㈀㈀㜀㜀　䄀㌀㠀㈀䌀　㄀㘀䔀䘀　㐀㔀㤀㈀䔀㈀䐀䌀㈀䔀㤀㄀䄀㌀㠀㠀䐀䄀㜀㠀㔀䔀㠀䌀㠀䈀㠀䔀㈀䐀㄀㌀㤀　䘀　㠀䄀㜀㠀㘀㠀䘀㌀䈀㈀㐀䌀䐀㈀㠀䌀㘀㔀䄀　㔀㠀㤀䈀䌀㠀䈀㄀　㈀㤀㜀䌀㘀䌀㄀㔀䐀䄀㈀㐀㜀㤀㜀㄀　㌀㤀䐀㜀䔀㔀㔀䌀㐀㐀䌀㜀㐀㐀　㜀䈀㜀㐀㄀㈀䐀㈀㈀䐀㤀㤀㠀㠀䄀䌀䔀㜀㘀　䈀㐀㐀㤀㐀　䌀㈀㈀㐀䄀　䄀㤀㄀㤀㌀㈀㈀䔀䘀㘀㄀䌀䈀㤀㠀䐀㤀䘀㐀䘀㠀䈀䌀　䐀㈀䈀㤀㜀㘀㈀㜀㤀䈀䌀㤀㄀　䘀䌀䈀䐀䘀㜀㐀　㤀䐀䐀䔀䘀㄀㈀㌀㌀䈀䐀㌀䌀䈀䘀䌀䌀㘀　㌀㠀㄀㘀㄀㐀䄀㜀㄀㄀䌀㠀㤀䌀㔀䌀䔀䄀䄀䈀㜀䄀䈀䈀䄀㄀䈀㌀䘀䈀㘀䄀䘀㜀䐀㔀㤀㄀㔀㌀䐀䄀䈀㜀㌀䐀㘀㐀㘀㌀　䘀㔀㠀㐀㈀㤀㘀䌀　㘀㈀㘀㤀㠀㄀㘀㄀䈀䔀䘀㤀㔀㘀㘀䐀䄀㄀㘀㔀㤀㄀䔀㜀㌀䔀䈀㈀㄀㘀䐀㘀㐀㤀䄀䈀　䌀䌀䈀䌀䐀㈀䈀䈀㐀㔀㔀㤀㘀䘀䈀㌀䐀䈀䘀䈀㜀䈀䘀㤀㌀䔀㔀䐀　㐀㠀䌀　㐀䈀㌀㐀㄀䌀㘀㤀㐀䈀㜀㜀㘀㠀㐀㜀䌀䌀　䔀㜀㈀㄀䐀㘀㠀㈀㜀䐀㜀㠀㄀㠀䌀㔀䌀䔀䘀䄀䄀　䔀䐀㐀䈀䐀㘀㤀　㐀䔀㌀㐀　　㜀㤀䐀㐀㄀䄀㈀䔀䐀䄀　䄀㌀䔀䐀䄀　䄀㌀䔀䐀䈀㐀㐀　䈀㐀䌀䔀㄀㘀　䈀䄀㄀㄀㘀䈀　　㄀䈀㄀䔀㤀㌀㘀㘀䄀㠀䈀䌀㌀㠀㌀䌀䐀㈀㔀䐀䔀㠀䌀䔀㠀㜀䈀㌀㌀䄀㈀䔀䘀䌀䐀㈀㐀㐀㄀䈀䌀㜀㔀　䐀　䌀㔀㠀㤀䌀䌀䔀㘀㠀㈀䄀䌀㠀　　㄀㔀㘀㐀㠀　　䄀㌀㈀㐀㤀㤀㔀㠀㈀㌀䄀㔀㜀㈀㘀㔀㐀　䘀䈀㤀㘀㈀㈀䔀䔀䄀䐀䄀䐀　䘀㌀䐀䐀㠀䌀䄀䐀㄀㄀　㘀㐀㘀㈀㐀㐀䘀䌀䔀䈀㔀䐀㤀㤀䈀㌀㘀䔀㜀䐀㤀㔀㄀㔀䔀㈀䈀㐀㠀㤀㤀㐀䄀㄀㐀䈀㜀䄀㤀㠀㄀䈀䌀䔀㐀㠀㤀㐀㘀㜀䘀㈀㠀　㜀㤀㔀㐀　㘀㌀㈀㠀㔀㐀䌀䌀㠀䈀㘀䔀㈀㄀䘀㐀䐀㤀㐀䘀䔀䌀䔀㠀㄀䌀㄀㈀㔀䄀㈀㄀㘀㔀㜀㜀㘀䄀㘀䘀㤀䐀㐀䘀䔀㘀㘀㌀㔀䌀䐀㘀㠀㐀㤀㐀䔀䈀㈀䔀䐀㐀㠀㈀䌀䘀䄀㜀㌀㠀㌀䄀　㤀䈀㔀䔀　䈀　㈀㠀㘀㄀䄀㄀㄀㘀㤀㐀㜀㘀㘀䄀㐀㄀䔀㐀㤀䔀㈀㄀㄀㈀䔀㤀䐀䐀㈀䈀㄀䐀㠀䌀㘀㔀㔀䌀㘀㔀㠀㈀㈀䐀㔀㤀䌀䔀㜀㘀䐀䄀䄀　䈀䐀㘀䄀㠀　㔀㤀䘀㌀䔀㘀㤀䌀㜀䄀䘀㌀䌀　㜀㜀䈀㌀㘀䘀㔀㤀㜀䐀㜀䘀䔀㈀䘀䌀䄀㜀㤀䘀㈀㘀䌀䔀㌀䘀㜀㠀䔀㌀䄀䄀䐀㤀㌀㌀㔀㜀䐀䔀㜀䈀䐀㌀㠀䌀㌀㔀䘀䐀䄀䔀䐀䔀㌀　㘀㘀䘀㤀䐀㘀䔀䐀㜀㜀㈀䘀㜀䈀㠀㤀䘀㤀㌀䄀㌀䘀㌀䔀㘀䈀䌀䈀㘀㜀䌀㜀䈀㜀䐀䌀䘀㐀㔀㠀䔀㜀䄀䔀㠀㜀䐀㘀䔀䌀㐀䘀䄀㈀㤀䈀㜀䘀㘀　䘀䐀㔀䈀㌀　㜀㘀䔀㘀㠀䄀㜀䈀㈀㘀㐀䐀㔀䐀䈀䐀䔀㈀㔀㈀䈀㈀㘀䄀䌀㌀䌀㠀㄀㜀䔀䈀䔀䘀㜀䔀㜀㤀㈀䈀㐀㤀䔀㜀䘀䈀䈀㠀㘀㐀　㔀㐀㠀㄀㜀㌀䄀䔀㄀㜀㈀㐀䔀㘀㄀䈀㜀㌀㤀㠀㠀䐀㘀䈀䐀䐀　㠀䔀䈀㘀䘀䐀䈀䌀㘀　㐀䈀㘀䔀䔀㐀㠀㔀㔀䐀䘀　䘀㈀㐀㐀㐀㤀㈀㜀䌀䔀㤀㜀㔀䔀䈀䈀㘀　㐀䌀䈀䈀䌀㠀㤀㜀䐀㠀䈀䐀䘀㘀䄀䔀㔀㄀㜀㌀䄀㜀　　䌀䘀㈀䈀㠀䘀䈀㐀㌀㈀䄀䈀䐀㔀㐀㤀㐀㘀　㄀㠀㠀㈀　䐀　䄀㈀䐀䈀㤀㔀㜀㄀䌀　㔀䐀㠀䐀㌀䌀㄀䔀㜀䌀㜀㌀㘀䄀㄀䘀㠀䄀䐀㘀㤀㘀　㠀㠀䐀㔀䈀㈀㈀　㠀㠀䔀㌀䌀䌀䈀㠀㔀㐀㠀䔀㜀䘀㘀䔀䈀㠀䈀䐀䘀䈀㔀䔀㔀㄀㤀䐀䄀㈀㄀㜀㄀䐀㤀㔀䐀㠀䄀㜀㔀㄀㄀䘀䔀㤀㈀㔀䐀䌀㠀䔀㈀㜀䘀㄀㠀䈀㔀䔀㌀㔀㠀䘀䘀㌀㘀㔀㐀㜀㄀䘀䈀㠀㄀㘀㈀㐀㌀䘀䈀䔀㔀　䌀㜀㜀䌀㜀䘀㈀䄀䘀㜀㜀㔀䘀㤀㜀㜀䘀㄀㌀㤀䈀䔀㌀䈀䔀㈀㔀㘀㜀㐀㘀䘀䔀䄀㈀㤀䌀㈀㔀㠀㄀㜀㔀㌀㤀䘀㜀　㔀㌀㘀䈀䈀䈀㜀䔀㔀䔀䌀䌀䘀䘀㤀䌀䔀㜀䐀㈀䄀㜀㐀㌀䔀㤀㐀㜀㔀㠀㔀䘀䈀㈀㤀䘀㜀㜀㘀㌀㜀䔀䈀䐀㜀㜀㤀㤀䄀㐀㈀㌀䈀　㔀㐀㘀㔀䄀㈀㜀㜀㄀䈀䘀䌀䄀䌀䘀　㜀㠀㄀㘀㌀䄀㌀㔀㈀䐀㘀䈀　㤀㤀　䘀㄀䈀㄀䌀㔀㠀䐀㐀㠀䔀䘀㜀㠀㌀䔀䐀㜀㠀㌀䘀㤀㠀䔀㄀㜀䐀㔀䔀㠀㜀㜀㈀㘀㈀㘀䔀　㜀㘀㜀㐀䔀㤀䔀㘀䘀㠀㌀㌀㌀䈀㜀㠀㌀㌀㌀㐀㌀䐀䘀㤀㠀䈀䐀䄀㌀䈀㌀䈀㔀䄀㄀㈀䈀䈀㜀䈀㔀㌀䈀䐀㄀䐀㘀㘀㘀䄀㐀䄀　㌀　㈀㌀　㔀㠀㔀㄀㤀㈀㤀㈀㠀䄀䌀䈀㌀䈀㜀㐀㤀㠀㄀㌀䐀㘀㘀䄀㜀䘀㘀　䐀䐀㄀　䔀㔀㈀㠀　㈀㘀㌀　㈀䐀　㄀㘀㤀䘀䔀㘀䘀㜀㌀䈀㤀㈀䔀㤀䈀䌀　㜀䐀䄀㐀　㠀㜀䐀䄀䈀䘀䌀䔀㐀㠀㤀䄀㘀㜀　㐀㠀　㤀㘀㔀䘀㈀　䘀䘀㌀䄀㄀䈀㘀㐀㘀㄀㠀㐀　䌀㤀㘀䌀㐀䐀㄀㤀㐀　䄀㐀㜀㤀㤀䈀㔀㌀㈀㔀㈀䌀㘀㄀䘀䈀㈀䌀㐀㐀㤀䈀　㄀㐀䌀䈀㤀㔀㌀　㌀㘀㠀䔀䘀㔀䔀㐀㔀䐀䌀䘀㈀㘀㄀㐀㤀㤀　䘀㄀㄀䐀㜀㘀㤀㄀㔀㤀㠀䌀㠀　㘀　㘀䘀㤀㜀䔀　䘀䈀㜀㤀䐀䈀䐀䐀㠀䈀䄀㜀㠀䌀㔀㤀㌀㈀䄀䄀　䘀䘀㐀䐀㤀㜀㜀䌀䈀䄀䔀㐀䈀䄀　䈀䔀䈀㌀䈀䔀䔀㔀䄀䔀㐀㔀㌀䘀㌀䌀䘀䈀䔀䄀㘀㜀䘀㐀䘀䐀㄀㜀㄀㘀䐀䌀䐀㄀䈀㠀㘀䐀䘀㄀㤀㈀㘀㜀㘀　㠀䌀䈀䔀䔀㠀䐀㜀䌀㌀㤀㜀㜀䐀㌀㈀㐀䘀䘀㌀㔀㘀䌀䘀　㘀䌀㌀㈀㜀䌀㜀㐀㄀䐀䘀㤀䌀䘀㠀㘀䈀䔀㈀䔀䘀㠀㤀㘀䘀㄀㈀㐀䐀䄀䘀䈀䐀䌀㤀㜀䄀䘀䐀㘀㘀䐀㜀䄀㄀㈀㜀䐀㘀䄀㄀䘀㤀㈀㌀㤀㐀䘀䘀䈀㔀㈀䈀䈀㤀　㘀䔀㌀㐀㔀㤀㔀㔀㠀䔀㤀㔀䄀䌀䔀䐀䘀　㌀㜀㌀䐀㄀㌀䘀䈀䘀䐀　㈀䔀䔀㤀㜀㌀䄀㤀䄀䐀㘀䔀㘀䌀䐀㜀㈀䔀䈀㜀䄀䈀㐀䈀㤀㤀㜀䄀䈀䈀㌀　㔀　㤀㄀䐀䄀䔀㈀㐀㄀㐀䐀䘀䈀㘀䐀䘀䄀㤀㔀㤀䘀㔀㈀㠀䈀㠀㠀㘀　㠀䄀䐀㤀䘀䌀䐀䈀䘀㐀䈀䈀䔀㜀㌀㈀㠀䐀㔀㐀䌀䈀㌀㐀䌀㈀䔀㔀㐀㘀䌀㔀㤀㐀㠀㤀㈀㈀䐀䐀㤀㤀㤀㐀㘀㜀㈀㘀䌀　㌀　㘀㜀㠀㈀㔀㤀㤀㌀㈀㤀㄀㌀䈀㄀㘀㘀㈀䄀㐀㘀㘀䈀　㘀㠀䐀㐀䌀㠀䈀㤀䄀㘀䄀䐀㤀㔀䐀　䐀㔀㘀㤀䈀㈀䔀　㈀䈀㠀䈀䘀㌀㜀䄀㜀㈀䈀㄀㜀㠀㐀䐀䌀㔀㈀㘀䔀䌀䔀㘀䄀㠀㐀㈀㔀㄀㈀㔀㘀㐀㔀㄀㘀䐀㜀㘀㈀䈀䐀㠀㜀㌀䔀䌀㌀㌀　䐀㌀㌀㠀㔀㤀㔀䘀䌀㌀㌀㘀䔀㠀䔀䘀䌀㤀䔀䘀㈀㠀　㜀䘀㐀䈀㌀䈀䄀䐀㤀㈀　䐀㜀㐀　㌀㔀㄀䐀䄀㔀䌀䘀㌀㐀㌀㜀䔀㠀䘀䘀䐀　䘀䔀㘀㄀䘀㤀㠀㜀䐀㔀㈀㠀㘀㤀㤀㈀㐀㔀䈀㈀㌀㈀䈀㌀䌀㤀㈀㠀㐀䈀㤀㈀㘀㘀䈀㄀㄀䄀㄀㐀㔀㔀䐀㔀䈀　㘀䔀㔀　㌀㐀㄀㔀　㠀䔀㄀㔀䈀㠀㜀㌀㘀㤀㄀㐀䔀　䐀䄀㤀㤀䄀㄀㌀㄀䘀㔀㄀䌀㘀㜀㠀㤀䈀㠀䈀䈀㜀䈀㄀㤀　䄀㐀㌀㤀䘀㄀㈀䐀㘀㌀㐀　㤀㘀　䐀　㄀㠀㔀㈀㤀㜀㄀㌀䄀㈀䘀㘀㘀㈀㐀　㘀䔀䐀䐀䈀㄀㠀　㔀㐀䄀䘀㜀㠀㈀㄀㤀㜀㔀㤀㐀㌀㤀䔀㘀䐀　㐀㈀㘀㐀䈀䄀䌀䄀㐀㘀㠀䘀㤀㈀㠀䔀㐀䄀䌀㜀㈀㔀䈀㘀㐀㄀　㈀㈀㤀　䔀㄀　㌀㌀㠀䘀䐀㈀　䔀䄀㠀䌀㜀㌀㔀䈀㘀㐀㄀　㌀㠀䐀䐀䘀䔀䈀㌀㘀䘀㔀䄀㠀㐀䄀㤀㜀䄀㤀䘀㔀㈀䄀㔀㔀㄀䘀䈀㘀㜀䐀䘀䌀㘀㜀䈀㄀㐀㤀㌀㐀㌀䘀㄀䈀㐀䘀䘀䌀䔀㜀㘀䐀䐀㄀㔀䈀㜀㈀䈀㈀䘀㔀㤀㘀㄀㘀㘀㐀䌀㄀㠀䄀㤀䌀㤀㘀䌀䄀㤀㌀㄀㔀㜀䌀䘀㌀䄀㠀㠀㔀㘀䘀㠀㄀㐀㐀㌀㄀㠀㐀㔀㠀䐀䐀䐀䐀㈀䈀䌀䄀䐀㐀㘀㘀㈀㐀　㘀䄀䌀䘀䄀䄀㄀㐀㌀䐀㘀㐀㌀㠀㜀㔀㘀䌀䈀䄀㤀㄀㈀㜀䐀㤀㘀㘀㄀　䐀䔀㘀㌀㄀䌀㌀㄀䄀　㈀䐀㜀㐀䔀㐀㠀䌀㤀䌀㄀㠀㐀䘀㄀䌀䐀㤀㈀㠀䐀㄀㤀䐀㐀䈀䐀䌀㤀䈀㌀㜀䌀㤀䈀㌀㐀䄀㔀䔀䘀㘀䘀㤀䐀㔀䘀䘀䈀　䈀㠀㄀㘀㤀䐀䈀䌀䘀䈀㜀䌀㌀䄀　䌀㐀㔀㤀䌀䘀㤀㠀㌀㘀䌀㜀㘀　㈀　㈀　㄀㤀㜀　䄀㈀㐀　㄀㄀㤀䘀䐀㈀䌀䄀㐀䄀㤀㄀䔀㠀㐀㐀㜀㤀䌀㠀㠀㜀㔀㈀䌀㠀㘀㜀㘀㄀㤀㘀㄀㔀㘀㘀㤀㄀㈀㈀㐀㔀㘀㔀䈀㐀䘀㐀㠀䘀㜀㐀䘀䌀㄀㜀䄀䘀䈀㐀䘀䔀䔀㘀㤀㤀㐀䘀䔀㄀㠀㜀㐀䐀㔀㜀䔀㔀䘀㤀㐀䈀䔀㔀䈀䐀㌀䘀㔀䐀　㔀䘀䈀㄀㌀㠀㌀䔀㤀　㐀䐀㠀䈀㠀䔀㜀䘀㘀䘀䈀䔀䘀㐀㌀㈀䘀㘀㠀㈀㌀䘀䄀㜀㈀䐀䘀㈀㈀㈀䘀䐀䈀㐀㔀䘀㐀䘀　㘀㔀㘀䄀㜀䘀　㠀㄀㤀㈀䌀䐀㘀㤀㤀䔀䘀㠀䔀㐀㠀䐀㈀㔀㔀䘀㤀䐀㔀䘀㤀㌀㜀䔀㔀䐀㜀㄀㤀㔀㜀㄀㠀㤀㔀㤀䈀㜀㌀㄀㘀䌀䄀䘀㌀㠀䌀㜀㔀䔀㘀㜀䈀䔀㐀㜀䈀䌀䌀㐀䄀㤀㄀䐀䈀䌀㠀䈀䌀㐀㔀㔀䐀　㈀䔀䔀㔀䌀㈀㌀䐀䄀䘀㄀䐀㌀䔀䐀䘀㠀䘀䐀䘀㐀䌀䘀䈀㜀㈀䐀㘀㈀䐀䔀㘀䄀䄀㌀㌀㄀䌀䈀㄀㄀䔀㠀䐀㈀䄀㔀㜀㌀㘀㜀䔀㈀䌀䘀　䐀䔀　　㈀　㔀　㌀　㄀㌀䈀㌀㄀㜀㠀䘀㄀䐀䐀㐀㐀䐀䈀䈀䈀䐀䔀㜀㘀㤀䄀䌀䐀㠀䈀䐀䄀㐀䈀㄀㌀䔀䘀㤀䄀䄀䄀䈀䐀㄀㄀㐀㔀䔀㌀㘀䔀㤀㐀㄀㈀㐀䘀㤀䔀㠀䄀㄀㔀㜀㈀䄀㔀䄀䐀㌀㠀䈀㠀䌀㈀㔀㘀㄀㐀䌀䔀　㠀㠀䄀㠀㄀㘀㌀䄀䄀　㠀䐀㘀㔀㌀㤀䌀㤀䌀㈀䐀㤀㔀䈀㄀㠀㔀㄀䐀䘀䄀䔀䐀㄀㠀㌀㌀㘀㐀䘀䄀䐀㔀䄀䈀　䈀㈀㌀㤀䄀㤀䘀䘀㜀䄀䈀㤀㤀㜀㠀㘀䘀㄀䄀㘀㜀㘀㘀㠀䐀䘀㜀䄀㔀䔀㔀㜀㐀㐀㔀㄀䌀㜀䘀㄀㘀㈀䘀㤀㠀㌀㈀䔀㄀㐀　㈀　㈀㐀㤀㈀䘀䘀䄀㄀㜀㐀䔀㘀䘀䘀䈀䌀䈀　㈀㌀䄀㈀㤀㈀䌀䔀䘀䄀䘀䘀䐀㐀㈀䌀䈀㠀㌀㘀㔀㔀㔀㄀㔀㈀䘀䈀　　㈀㘀㤀㄀䘀䈀䄀䘀㠀䐀䘀㘀㤀䘀䔀㠀㘀䐀䌀䈀䔀䈀䐀㜀㔀㘀䈀㐀䘀㈀䈀㐀䌀㜀　㠀㜀㄀㔀䘀㤀㔀䌀䄀䈀䐀䄀㔀㜀䔀㤀㜀䐀㌀䈀䌀㜀㠀䔀㈀䘀䄀㔀㘀䔀㠀䔀㠀　㌀㜀㌀㜀䈀㘀㘀䔀㜀䐀䈀䐀䐀㈀　䐀㈀㜀　㘀㈀　䘀䌀　䐀㜀㘀㠀㜀㐀㜀㐀㐀㄀㔀㜀㜀㠀䔀㜀㄀䌀㠀㜀　㌀㐀㠀㈀䄀㜀㔀㐀䈀　䌀㤀　㤀䈀䘀㈀㠀䔀㘀㤀㌀䈀䘀㜀㠀　㘀䘀　䄀䐀䄀䌀㌀䔀䐀䈀㈀㘀㠀㔀㘀㤀䄀　䘀䔀㄀㤀㈀㔀㐀㄀㘀㌀㜀㤀㈀㄀䘀䌀㘀㘀㜀㘀㔀㔀䌀㤀㤀䘀㈀䘀䄀㐀㘀㄀䄀䐀㤀䘀䄀㜀䔀䐀䐀㐀䐀㌀㌀㔀㘀䄀䔀䈀䘀䄀䔀䘀䔀䄀䐀㜀㔀㠀㤀㠀㜀䔀㄀㠀䄀䔀㔀㜀䐀䄀䘀㄀㤀㜀㘀䐀㔀䐀䐀㐀䘀㈀㔀㌀䔀㠀㜀㔀䈀㘀䔀㠀㠀㔀䌀㌀㤀䄀㄀䐀䘀䐀㠀㐀㜀䐀㜀㈀㔀䈀㘀䌀䈀㜀䈀㘀䈀䘀㘀㐀䌀䈀䘀䔀㄀䌀㔀䐀㈀䄀㈀䘀䐀䘀㔀㌀㌀㜀㘀㐀䌀䔀䔀䌀㤀㐀㘀䐀䈀䐀䐀㌀㜀㔀㔀㔀䐀㌀䐀䈀㜀䘀㌀䌀㔀㈀䐀䄀䄀䐀㘀㜀㜀䘀㘀㔀㔀䄀㌀䔀䘀䔀㐀㔀㤀䐀䐀㤀䈀㤀㈀䐀䘀䌀㠀䈀㜀䌀㤀䌀㜀㐀㠀㈀䔀㄀㐀㠀䈀䘀䐀䐀䄀䄀㤀㜀㐀㔀㘀㈀䔀㠀㔀㤀㐀䈀䈀㈀䌀㘀㠀㜀㌀㌀䄀㌀㘀㠀㤀䐀㜀㐀㈀䄀㐀䌀㐀㌀㈀㤀㔀䌀䌀㈀㌀　䈀㜀㈀䔀䈀䌀㤀㠀䄀䐀䌀　䐀㘀㐀䈀㌀䘀䌀　䄀㜀䈀䌀㄀䈀㈀㠀㜀㌀㔀㔀䈀䐀䔀䈀㔀㜀䌀㐀　㐀䔀䔀㘀䘀䔀㈀㌀䐀㜀㘀䔀㜀㔀䔀㐀䐀䄀㜀㌀㜀㌀㔀㤀㄀㜀䄀㔀㤀㌀䈀䐀㠀䈀㌀䘀㄀㐀㄀䌀㘀䄀䄀㤀㜀㘀㔀䔀䔀㜀䄀䄀䌀䔀㤀䔀㈀㤀䌀䘀䌀䔀䈀䐀䌀䈀㜀㄀㤀䘀㘀㌀㌀㌀䐀䈀㘀㐀䐀䐀䔀䌀䐀䘀　䄀䌀䘀䐀㌀䄀䐀䘀㘀㌀䘀㔀㤀䈀㌀㠀㠀㤀㌀䔀㐀䔀㠀㐀䔀㌀䐀㐀㜀䔀㈀㄀䈀㤀䐀㠀䐀㤀䐀䌀䄀㠀㔀䔀㌀㄀　䔀䄀㔀㐀䄀䔀䐀䈀㔀　㠀　㜀䌀㔀㤀　㄀㠀䐀䘀㤀　㈀㤀㈀㔀㄀㠀䘀䐀㠀䄀䔀㈀㄀㄀㄀䘀䔀䈀㔀㐀㐀㐀䔀䐀　㤀㌀㔀㤀㜀㐀㐀䘀㘀㘀䐀㄀㌀䐀䔀㤀㐀㔀㌀㜀㔀㔀㜀䈀㈀㈀㈀㄀　㌀䄀　㔀䔀㄀㘀䈀㜀㤀㘀㘀䄀㠀㌀䔀　㄀㐀㐀㌀㜀㘀㘀　䔀䄀䌀㐀䐀㐀㄀㜀　䄀䐀㄀㔀䄀䈀㄀㠀　䈀㠀㤀㘀㔀㠀㐀㤀　㜀㠀㄀㜀㘀㐀䘀䔀䄀䌀㌀㠀㐀㔀䄀䈀䔀㠀䘀㠀㘀㤀㄀䐀䔀䄀䐀䈀䔀㤀㠀㠀㤀䘀䘀㘀㄀　㔀㤀䈀䄀䔀㘀䈀㤀㈀㈀䘀䌀䔀㐀䄀㤀䄀䔀㜀㘀　㤀㐀㤀㐀㠀㔀㤀㔀䌀㘀㌀㤀㄀䄀㐀䈀䄀䐀㤀㔀㠀㌀㘀㜀　䌀㔀㈀䔀㤀㔀　䘀　㈀㠀㔀㈀㜀䔀㔀䔀　㄀䄀䔀㠀㤀䄀㌀䄀　䈀㐀㐀㐀䘀㈀䄀㠀㄀㄀㘀䔀䐀㈀䄀㠀䌀䈀䔀㤀䔀　㐀㘀㐀䐀㘀䄀㜀䔀䘀䈀㠀䄀䌀㐀䌀㄀䄀䘀㔀䈀㄀㈀㜀䘀䘀䔀䌀䐀䔀䈀㜀　䔀㔀䐀䈀䘀䘀　䈀㔀䐀䘀䈀䈀䘀㔀㤀䘀䄀䘀㘀䌀㌀䐀䈀䘀䔀㌀䄀䘀㄀㤀㘀㔀㌀䄀䈀㤀䔀䘀䈀㠀䄀䐀㈀㤀䔀䐀䘀㔀䘀㜀䌀　䈀㜀䔀䘀䐀䔀㄀䐀㜀㌀　㘀䔀䌀㜀㠀㤀䘀㜀䈀䈀㘀䐀㜀㤀䔀㠀䐀㤀䌀㐀䘀㜀　䘀䔀䔀㐀䈀㜀䌀䈀䈀㜀㘀㌀䘀䘀㜀䐀㄀㤀䔀㐀㈀㄀䈀㌀㘀　㄀䔀㔀䐀䔀㠀㘀䔀䈀㤀㈀䘀䄀㈀㈀䌀㄀㄀㄀　䄀䌀㈀㤀㔀㠀㘀㤀㐀㜀㐀䐀䄀䘀㔀㠀　㠀䐀㄀㠀㌀䌀㄀䐀䄀㐀䄀㠀䔀㌀䌀䔀㘀㔀㐀㘀㠀䄀㠀㈀㤀䌀㌀　㐀㘀　㠀㠀䄀㄀㐀䈀䐀㔀㄀㠀㠀㠀㐀䐀㄀㈀㐀㜀㘀㜀㈀䈀䐀䄀㈀㐀㔀　㠀㤀㔀䈀　㄀　㌀㤀䌀㄀㔀䌀㌀䐀㐀㌀㔀㘀䐀䐀㤀㐀䌀䔀㜀㌀䔀㤀㈀㤀㠀㜀　㌀㠀㔀㐀䄀䘀䘀䄀䘀㠀㔀䔀䄀䌀㜀㠀䌀㔀　㔀䐀䌀㠀　㠀㔀㔀䔀　㄀㜀㠀㐀㈀䄀㜀䐀㔀䈀䐀䈀㐀㄀㤀㈀㜀䄀䘀㘀䈀㠀䘀㈀䌀䔀㔀㠀㄀䘀䔀㘀㔀㌀　䐀㠀䄀㐀㄀㌀㘀㐀㠀　㘀㐀㤀䌀㤀䘀㘀䔀㘀㜀㠀䄀㤀㘀㈀㌀㘀䄀㄀　䔀㌀　㌀㄀䌀㔀䔀㔀㜀㘀䈀䄀䈀㌀䐀䌀㐀䌀䘀㄀㌀㄀㐀䘀㄀㠀㄀䌀㔀㘀䈀䌀㜀㠀　䐀䘀䔀㌀　䈀㠀㐀䐀䘀㘀㌀　㠀㤀䘀㈀䘀䐀䈀㘀㈀䔀䘀㠀㔀䈀　䔀䈀㔀䈀䔀㄀䐀㐀㐀䘀䘀㘀㔀㔀㄀㐀䈀㐀䈀㤀㤀䌀㜀䔀䐀㜀㄀㘀㌀㐀㐀㐀䔀㔀㄀䌀㘀　䄀䌀㌀㈀㔀䔀㤀䄀䐀㄀㈀　䌀䐀㜀䌀㌀㐀䘀䌀㄀䈀䘀㔀䔀㤀㤀䈀　䈀㐀㘀㘀㐀㄀䐀䐀㠀㠀㐀㔀　䘀㄀䔀㔀㤀㤀㤀䐀㠀　㄀䔀㔀　䘀䈀䔀䐀　㜀㌀㐀㠀䐀㔀㘀㌀㜀㌀㐀㘀㘀䌀㐀䘀䘀䌀㔀䔀䐀䔀䔀䈀䌀䄀㄀䐀㜀䔀㘀㌀䔀㈀䔀㠀䄀㄀㤀㜀㄀㈀㠀㤀㘀䐀㔀㌀㐀䄀䈀㘀䘀㜀䔀㤀㌀㤀䔀㐀䐀䈀㄀㜀㐀䘀䘀䐀䐀㠀㈀㔀䌀　㜀㜀䘀㄀㤀䘀㐀㔀䌀㘀䔀㄀䐀䘀䈀䄀㤀䄀㐀㤀㐀䈀䔀䄀䔀䈀㄀㐀㐀㔀　䔀㄀㠀　䌀䄀䄀㐀䄀㤀㠀䌀㐀㤀㜀䌀䌀㘀㐀　䌀㤀㠀㠀㤀㐀㄀䔀㔀㌀䌀䔀䔀䐀㐀㄀䐀䈀䐀䐀㐀䈀㄀䔀䌀㤀䄀㤀　㈀㤀㘀㐀䄀㄀䄀㘀㄀䌀㠀䈀㘀㐀䄀㐀㘀䐀㌀㘀㌀䔀㤀㌀㤀㔀㘀䔀㔀㌀㘀㘀䌀㘀䘀䘀　㜀㘀㔀㘀㘀㌀㐀䘀䔀　㜀䄀䐀䄀㘀䘀㔀䈀䘀㌀䔀㈀䐀　㔀䔀㤀㈀㔀䄀㠀䌀䄀㈀㠀䈀㘀䐀䄀䄀䄀㜀㌀㈀㜀㜀䘀䄀㘀䌀㤀䈀㠀㌀㜀㈀䔀㄀䈀㠀㐀䐀㘀㤀㈀㘀㔀㈀　䌀㘀　䌀㈀㤀䄀㔀㤀䘀㘀㤀䄀䐀㄀㐀㌀㤀㔀䐀䔀㄀䘀㐀䘀㤀䄀䌀㔀㐀㜀　䔀㤀㈀㤀㄀㘀䈀䐀䘀㐀㈀㜀䈀㘀㐀㈀䐀䔀䈀䈀㌀䐀㔀㄀䘀㤀㘀䄀䌀㈀䈀㈀㤀䐀䐀㌀　㘀䌀㌀　䔀㘀㤀㈀㔀䐀㈀䌀㘀㐀㠀㠀䔀　㤀䐀䄀䔀㐀　㤀䐀䄀䄀䌀㔀㜀䄀㄀㠀䐀㌀䌀㐀㠀㤀䄀㈀㜀㐀㈀㌀㐀㘀㐀䄀㘀㌀㐀䌀㜀䘀䌀䘀䘀㐀㤀㠀䘀㤀㠀㌀㤀䘀㔀㐀㔀㐀㈀㔀䄀㜀䐀㈀㔀㜀䔀㐀㘀　䐀㔀㌀䘀䘀㠀㤀䘀䘀㤀㄀㄀䄀㈀㜀㔀㌀䘀㤀　䌀䔀䔀㄀㜀㜀㜀䄀　䌀㐀㘀䔀㐀㄀㠀㤀㜀䘀㈀㌀㠀㄀䔀㌀䐀䘀㈀㤀䈀　㤀㔀㜀䐀㜀㄀䔀㤀㘀䈀䐀䄀䐀　㌀䄀㠀䄀䌀䘀䈀䔀䐀䘀䘀㘀䐀㘀㤀䈀㄀　䐀㌀㔀䈀㔀　䈀䘀䔀䔀㐀㄀䘀䐀㔀䄀　㠀㈀䘀㠀㤀䈀㤀䔀㜀䘀㠀㤀䌀㌀䔀㄀㜀㤀䐀㔀䌀　㐀㌀㜀㄀㠀䈀㈀䌀　䌀㄀　䄀　䄀㐀㠀䐀㠀䔀㄀䄀㄀㠀㔀㈀㐀㐀　㠀㔀　㈀㜀㐀㜀㄀㘀䌀　㄀㄀㐀㐀䘀䌀　䌀䄀㌀　㄀㐀㌀㜀　㈀㐀㐀㠀䄀　䄀　䈀㌀䄀㐀㠀㜀䄀㐀㄀㌀䈀㐀㤀㈀䘀㘀㠀㤀㌀㜀㐀㐀䈀㜀㔀㐀㄀㠀㠀㌀㄀䄀㐀㘀㄀䐀㄀㘀㐀㤀㄀䐀㔀㌀䘀㈀㤀㈀㠀㈀㌀㤀䌀䌀㈀㜀㐀㜀䄀䘀䘀㌀㌀䌀㄀㈀㤀䌀㈀㈀㤀䈀㐀䘀㈀㔀㄀䔀㠀䄀䐀䘀㔀㐀㔀㔀　㤀㐀㤀䈀㈀㄀㜀㘀㘀䔀㠀㘀䐀㠀䈀㤀㘀䐀㐀䄀㌀㔀㌀㜀㄀㈀㌀㈀㠀㄀䄀㤀㐀䐀䄀㤀㤀䄀㐀㐀䐀㠀㘀㜀䌀䄀㠀䔀㐀䌀䈀䐀䈀䔀㠀㌀㔀㈀䄀䐀䐀㈀㘀䈀䌀䘀䄀㜀㈀㤀䄀㤀　䈀㔀㈀㜀㈀㤀㜀䄀㜀㈀䐀㌀㌀㠀㈀䔀㐀䌀㐀䘀䈀䐀㐀䘀㘀㔀㐀㌀㤀䌀䘀㄀㄀䄀㄀㠀䌀　䘀㤀㘀䘀㈀㜀䐀䘀䔀㄀䌀㜀䘀䈀㘀㤀䘀㈀㤀㔀䄀㐀㐀㈀䘀㜀㐀㐀㔀㠀㈀㄀㄀㐀㌀䄀㄀㄀㐀䌀㤀㈀䘀䘀㐀㔀䄀㜀㈀䌀㌀䌀㐀㘀䐀䌀䈀　䄀㈀㌀䈀　㌀㌀㈀䈀䄀㐀䔀㈀㔀䐀㤀䔀㔀䌀㄀㠀　㘀䈀䘀㄀㤀㠀㔀䐀䐀㘀㤀䌀㜀㐀䈀䌀　㄀㠀　䔀㤀㌀　㈀㠀㘀㄀㜀䘀㄀㘀㄀㌀䌀　䄀㌀䐀䘀䘀䐀䌀䄀䌀䌀䐀㄀㄀䔀㌀䔀㈀㐀䘀㘀䄀㜀䐀䈀䈀㔀㤀䄀䌀䄀　㈀　㘀䌀㄀㔀㘀㤀䄀㠀㤀䐀㜀㌀　　䄀䌀㌀䌀㈀㈀㈀䘀䐀㤀㌀䐀㐀㜀㌀㄀㌀䄀䈀㈀䈀㈀䄀䌀㄀䔀䄀㄀䐀㈀䄀䐀䄀䌀䌀㌀㌀䔀㤀㜀㔀䐀䔀䌀䌀䄀㜀㌀䈀䐀䐀䔀䈀䈀䐀　䐀䔀㐀㄀䈀㌀䈀䈀㌀䐀㘀䄀㜀㜀㠀䄀䄀䄀㤀䐀㜀䘀䌀　䔀㔀㜀㐀㐀㠀䄀㠀䐀䌀䌀䈀䔀䌀㘀䌀㌀㠀䈀䐀㘀㔀㜀䐀䔀㈀㠀㌀㈀䐀㤀䘀㈀㐀㤀䔀㘀䔀㘀䔀㠀㈀㔀㄀㤀䘀㌀䘀　䐀䘀　㔀　䔀㐀䘀㔀䘀　㠀䐀䈀䈀䔀㘀䄀䔀㜀䌀䘀䈀䘀㘀㜀　䐀䘀䐀㔀㐀　㄀䘀㔀䌀㜀䄀㜀㘀　　䄀䐀㜀䌀㄀㔀㔀䄀㐀䘀䐀䌀㔀䄀䈀㜀　㜀㘀䔀䘀㠀䔀㐀㘀㌀䄀㠀㘀䈀㤀䔀㄀㄀㜀䘀䄀㐀䌀㜀䈀䌀䘀䄀䄀䄀㘀䈀㔀㜀㠀䌀㔀䌀䘀㌀䘀㐀䄀㄀䌀㐀㠀㔀䘀䄀㈀㤀㘀㔀㘀　㐀㜀㄀䔀㜀㤀㄀䔀䈀㔀㜀䐀㄀䔀䐀㜀㄀䐀㜀　㔀㔀䌀䄀䌀㌀䈀㌀㈀　㈀㜀䈀㠀䈀㌀㔀䌀䈀䐀㈀㐀㄀㘀㌀　㤀䄀䈀㘀㤀㠀㌀䔀㌀　㔀㄀㤀㌀㐀䌀䄀㤀䐀㤀㠀　㔀䄀䈀㄀　㌀㈀䈀㄀㠀䐀䄀䈀㄀㠀㈀㈀㄀䌀㌀　䄀㌀䈀䄀䈀　䐀㈀㄀㔀㔀㔀㔀䘀㠀㄀䔀䐀　䘀䘀䄀㔀䔀䌀㔀䈀　　䄀㌀䄀㠀䌀䔀䈀㘀䔀㜀㤀䌀䈀㤀䐀䘀㘀㜀㘀㜀䔀䘀㤀㜀㘀㐀㜀㜀㤀㌀䌀䐀䔀㘀䈀㈀　㤀　㤀㐀㤀　㠀㈀䌀䌀㐀㘀㘀㔀　㐀㄀䈀㤀㐀㤀㔀　㔀㤀㈀䔀䈀㈀㈀㔀㔀㘀䘀㄀　㈀䄀㠀　㐀㠀㔀㜀䄀䄀䐀䈀㄀䄀䐀㠀　㐀䄀㤀㔀䐀䄀㔀䘀䄀䈀䄀䐀㔀㘀䄀䌀䐀㘀䄀㈀䐀㘀㄀㈀㐀㠀　㠀䘀㤀䌀　㐀䘀㔀㌀䌀䄀㘀䘀䈀㔀䄀䐀䌀㔀䄀䘀䘀㔀㔀㈀䄀㤀㄀㜀㜀䔀㌀䘀㔀　㘀䄀㐀㔀䘀㤀㈀䐀䄀㔀　䄀䌀㤀䔀㘀㌀䘀䔀㜀䌀䌀䌀䌀㘀㘀䄀㌀䔀䐀䐀䘀㜀䔀䌀　䌀䔀䈀䌀㌀䈀㄀㤀㌀㘀䈀䈀䔀㜀䈀䌀䔀䘀䘀㌀䐀䔀䐀䘀㈀㔀䌀㘀㄀㠀㘀㈀　㄀㐀䈀㈀㘀　㘀㄀㤀㠀㤀㄀䘀㜀㌀㌀㠀䌀䄀䔀䈀㈀㜀㐀㘀㄀㤀㈀　㐀㘀㔀㤀䈀䔀㐀㜀　㔀㈀䄀㤀㐀㔀䐀㌀䔀㤀　㔀䐀㌀䔀㤀　㘀䐀㌀䔀䐀㠀㤀䐀㤀㌀㄀㌀㐀䔀㌀㔀䌀㔀㤀　㈀㔀䄀㄀㌀㜀䘀㔀㘀䘀　㠀㤀䘀䔀　　㠀㔀䘀㠀㤀㈀䔀　㠀㌀㠀㔀　㤀㐀㔀　㐀㄀㐀㈀䔀䐀㔀㐀䈀䈀䐀㐀㌀㔀㈀䄀㌀㌀㘀䐀㐀㤀㈀㠀㤀㌀䔀䘀㈀䔀㤀㘀㔀㄀㄀㐀㜀㔀㠀㌀䌀䐀㐀䔀㤀㤀㜀㘀㤀䈀㤀䈀㐀㠀㐀㄀㔀㌀㌀㘀䐀䘀㐀㠀㄀㐀　㐀㐀　䄀㘀㌀㘀㈀䐀䄀㄀㔀䐀䈀㔀䐀㐀䐀㔀㌀㐀㐀䐀　㄀㘀㐀㘀䔀　䈀㈀䌀㈀㐀　㈀䐀㤀㌀㄀㘀㘀㘀䈀䔀㌀䄀　㜀䔀㄀㈀㌀䐀㈀䄀䐀㄀䘀㄀䘀㄀㜀䐀䘀　䐀㐀䈀䔀㜀䐀㈀㌀㄀䌀䈀䈀㘀㜀䔀㐀　㤀䈀㠀䘀㐀䐀㐀㐀䌀䐀㠀㌀㜀㌀㈀　䘀㜀䐀㄀䄀䘀䌀㘀䐀㈀　䈀㜀䄀㄀㌀㔀䄀㜀㐀㄀㈀㜀䌀㤀䘀䘀㐀　䘀㜀䘀㌀䐀㌀㈀䔀　㄀㜀㤀㘀㜀㈀㄀㘀㠀㐀㐀㐀䌀㔀㜀㄀䐀㌀㜀䔀䔀䘀㌀䔀㈀㠀㈀㔀㌀㈀䔀㠀䐀㘀䔀㘀㔀㄀㔀㔀䈀㘀㄀䐀㈀㠀㠀㈀㠀䐀䔀㜀䄀䐀䄀䐀䔀　䘀㜀㈀䄀䈀㐀㌀　䘀䔀㐀㌀　䐀㘀㐀㄀㔀䌀㔀䌀䐀㈀㌀㜀䔀㔀　䌀㔀㈀㘀㐀䐀㈀䐀㜀䐀㈀㘀䄀㤀䘀㄀䈀㤀䄀䔀䌀㜀㌀㐀䐀䄀䐀㜀䐀䄀䔀䄀䌀䈀㈀䌀䘀㘀㔀䔀㔀䘀㘀㌀㤀㄀㐀䈀㄀㠀䈀㔀㈀䔀䄀㔀㐀䄀㌀㌀㔀䌀㄀㘀䔀㘀㄀䈀㜀䈀㌀㐀㠀䐀䔀㤀㄀䈀䐀㜀㈀　䘀䈀㔀㤀㔀䔀䄀䄀㔀㤀㠀㐀㘀䌀䄀䄀㈀㌀䄀䄀㤀㜀㜀䄀㤀䔀㌀㄀㐀㘀䈀㈀㘀䐀　䌀㔀㈀䐀㄀㐀䌀䐀䐀䄀䌀㤀㌀䔀䈀䌀㌀㜀㈀㄀㘀㜀䌀䘀㌀䔀㜀㈀䘀㜀䔀䌀㘀㌀㜀㜀䌀䘀㐀䔀㔀䄀㠀㘀䔀䐀䌀㐀㤀㄀㌀䐀䘀䈀㌀㄀䘀㌀䘀䄀㤀㈀㄀㈀㘀㔀㜀䐀䐀㘀䈀㈀䌀㔀㌀䈀㜀䈀㤀　䄀㜀㤀㘀㔀䘀䐀㈀䈀䐀䈀㘀㜀䐀䄀㐀䔀㠀　㈀䔀㄀㈀䌀㈀　㌀㄀㤀䐀㠀䄀䘀䔀㐀䘀㄀䘀　㈀㐀㜀䔀㠀㔀㐀㤀㠀䔀㄀䐀㔀㜀䘀㜀䔀㄀䘀䘀㘀㘀㘀䐀　㌀䄀㐀䘀㄀䔀䘀䐀㠀　䈀䔀㄀㠀㜀䈀㌀　㈀　㐀䌀䘀　䌀䘀㔀㠀　㄀㈀䘀䔀㜀䄀䔀㠀㌀䔀䈀䈀㠀㐀䐀䔀䄀㈀㘀　䘀㈀㜀㄀㈀䐀㐀䔀䈀㤀㜀㌀㄀䔀㠀　䐀㠀㈀㐀㠀㌀䘀㔀㌀䄀䔀㠀䈀䔀㈀㌀㠀㄀㘀㄀㜀㐀䈀㔀㠀㔀䌀㄀䌀㘀㌀㜀㄀㌀㄀㈀䐀㐀㤀䘀䘀㠀㘀㈀䌀䘀㐀䔀㔀㠀㐀䈀㐀㠀䌀㘀㌀㐀㤀䘀㠀䔀㌀䌀䈀㘀䔀䔀䄀㐀䐀䈀㘀䐀㔀　㈀㈀㄀㘀䌀㌀䈀㄀㜀㔀䘀䈀㄀㐀㠀㄀䄀㐀㄀䌀䔀㈀㜀䈀䌀㈀　䔀㄀䈀㔀䈀䌀㤀䐀䐀䔀㈀䔀㈀䘀䔀㌀　㔀㘀㤀㠀䄀㔀㐀㈀㤀䐀㠀㌀䄀䘀㘀㐀㌀㤀㜀㤀䘀䐀䘀㜀㈀㤀㐀䌀㤀㄀䌀㜀㌀䌀　㔀䐀䄀䔀㘀㌀㐀㘀䈀䔀䘀䈀㘀㐀䐀㄀㌀䈀㐀　　䔀䄀㠀㄀䐀㘀㜀㌀㤀㤀㘀㐀㄀㈀䈀㠀㔀㄀　㘀㤀㄀㜀㔀䄀㐀㔀㔀㄀㘀㜀㠀㠀㈀䔀㐀㔀㤀䘀㤀㄀䄀䌀㔀㔀㘀㘀㜀䌀㘀㈀䈀䐀㘀䐀㄀㈀㔀䄀㌀㠀㤀㈀㈀㘀㐀㠀㐀䘀䐀䈀䌀䔀䄀䘀䈀㤀㘀㐀䐀㘀䌀䄀㤀䄀㜀䐀㐀䈀㜀䔀䘀㄀䌀䐀㔀䘀䈀䌀　䌀䈀㘀㠀㘀䈀㘀䐀䐀㜀䌀䐀㘀䈀㔀䐀䘀䄀　㌀䘀㄀䐀　䔀　䘀䘀䔀㜀䄀䔀㔀㌀䈀㔀㠀䄀㜀㈀㈀䌀䘀㤀　㌀䐀㄀䘀㘀㌀　㘀䈀䌀㤀　䄀䌀㘀䈀㌀㤀㔀䐀㌀㄀㌀㤀㈀䈀㠀㠀㔀㌀䄀䈀䄀㔀㐀㤀㔀䌀㤀䈀㜀㐀㠀䔀䈀㐀㠀㠀䐀䔀㐀　䈀䘀㐀㄀䘀㌀䔀䈀䄀㔀㌀㜀䔀㤀㌀㜀㤀㄀䔀㤀㠀㐀㔀㄀㤀䘀㤀㠀㜀䌀㌀㔀䔀䌀㘀㘀䔀㘀㐀䔀䘀㘀㈀㤀䔀㘀㐀㌀㠀㄀㤀㔀㄀㠀㌀　㠀㤀㜀㤀㤀䐀䌀㄀䐀㔀䈀䐀㠀㜀㈀䌀䐀㄀㐀䌀䈀㘀䐀㈀　㤀㜀䌀㐀　䔀㘀㜀㠀㤀䘀㤀㈀㌀㔀䘀㄀䐀㔀㌀䔀䘀㐀㔀䌀㜀　䌀䔀　䌀㌀䔀㤀㜀㤀㄀䘀㌀㔀　㤀䘀㄀㤀䌀　䐀㜀䐀䘀䈀㄀䌀䔀　䄀䄀㌀䐀䘀㔀㤀㔀㔀㜀㔀㠀㘀㈀　㠀㘀䌀㌀㘀㜀㌀　㜀㔀䄀㄀䐀　㤀㤀䌀㠀䔀䐀䔀㌀㐀㔀㐀㤀㄀㐀㈀㐀㤀㘀㘀㘀㤀㠀　㐀㈀䈀䘀㤀㔀㠀㄀㘀㌀䐀㐀㌀㠀㠀䌀㐀䘀㤀㄀　㈀㠀㐀㤀㄀㈀䌀㔀㐀㈀　㘀㈀　䐀㄀㐀㈀㜀㈀㈀䈀䐀㄀㔀　　㘀㄀㐀㌀㌀　㠀䄀㜀㔀䄀㜀䄀㄀㌀　䈀䈀㘀䈀㈀䈀䐀䔀䌀㄀　㜀䈀㠀㠀㘀㔀䐀㠀䐀㤀　㈀䈀䔀㈀㘀㌀㜀䘀㄀㈀　㠀㄀㔀䌀䘀䔀㔀䔀㤀䔀䔀㘀　㜀䔀㄀㠀㘀䈀䔀㜀䘀㠀䄀㔀　㐀㠀㌀㔀䌀㤀㠀㤀䘀䘀䄀㤀䌀䈀䘀㜀䔀㤀㤀㠀㜀㄀䈀㐀　䐀㠀㜀㄀㌀㌀㈀㘀㌀䘀㘀䔀㠀㐀㠀䈀䔀䘀䈀䐀㠀　㤀䘀㐀䌀　㠀䄀䄀㔀㄀䐀䌀㌀㐀䘀㜀䈀㌀䈀㜀䔀㈀　㘀䌀䌀㄀㌀㄀　㔀㔀䌀䌀㜀㠀㌀䌀䔀㈀㄀㤀㈀䘀㘀䔀㘀　㔀䄀㌀㔀䐀㘀㠀　㜀㜀㌀㜀䄀㐀㌀㄀㜀䌀䌀䔀㤀㠀䐀㠀䔀㐀㔀㄀　䈀　㤀㌀䘀䔀䌀㜀㈀㤀㐀䈀䔀䌀䌀㠀㈀䄀㜀䔀㜀㈀䈀䌀㐀䘀䘀㄀䔀　䄀㔀㌀䐀㘀䔀　㔀㄀㄀䌀㄀㄀㤀㤀䄀䄀㜀㔀㔀㌀　㌀㐀䄀㌀㔀㔀䌀㐀㤀㐀㘀㐀㈀　㤀㄀㜀㘀䘀䄀䈀䌀㤀㘀㘀㐀䌀㘀　㐀　䈀䄀㜀䌀䄀㌀䐀㘀㈀　㔀㔀䄀䔀㌀䘀䄀㜀　㤀㘀䌀㄀㠀䘀㠀䄀㘀㠀㄀㘀　㤀䘀㔀㌀䈀　㌀　㄀㐀㐀　㘀䈀㈀㄀䌀䐀䔀　㈀䐀㤀䌀䌀　䄀㄀㔀䈀䔀㈀䌀㘀㌀䘀㤀䈀㈀㜀㠀㐀䈀㜀㘀㔀㔀㈀㄀䐀㈀㤀䘀㈀䐀㠀㤀㐀䐀㈀䌀䌀㄀䄀䘀　䌀䈀䄀䐀㜀䔀㘀㌀㌀㄀㐀　䔀㘀㈀㐀㐀䐀㄀㐀䈀㜀㈀㄀䌀㐀㌀䄀㌀䄀䐀㈀　䔀㠀䌀㤀㠀䌀㐀㌀䌀䘀㄀㘀䄀㐀䄀䄀㔀䈀㄀䌀㄀㤀　㘀㐀㤀㠀　䘀䔀䘀㄀㤀䔀䘀䈀䘀㜀䌀㄀㌀䘀　㈀㜀䔀䔀㐀㐀㄀䘀㠀䌀䐀㔀㄀㘀䄀䔀㐀䔀㐀㜀㄀　㐀䄀㐀䈀㔀䘀　㠀䐀㤀㄀㤀䘀　䘀㌀䘀　　䐀䘀䘀䘀䈀　䌀　䐀㠀䈀䌀䌀㠀䐀㐀㤀㄀䌀䄀䔀䌀䌀㜀䔀䐀㔀䄀㘀㔀　　㤀㄀䔀㘀㘀㈀㈀㤀㈀㄀㠀㄀䔀㌀㌀㤀䘀　䄀㜀䈀䈀㜀㠀㔀㠀㐀㐀㔀㔀䐀䄀䐀䐀㌀䌀䈀䄀㘀㠀䐀㌀䐀㄀䘀䘀䈀㘀㠀䐀㜀䈀䘀㈀㐀䈀䈀䔀　㔀䘀㜀㠀䘀㜀䌀㠀䈀䘀㜀䘀㌀䈀㘀㐀㤀㠀䈀䌀䐀㌀㜀㠀䄀㜀㘀䌀䐀㔀㜀㔀䈀䔀㐀㔀䌀䔀䐀䔀　㐀㜀㤀䘀䔀䄀䘀㜀　㠀䄀㌀䘀䔀㐀䄀㈀䌀䐀㐀　㜀㈀㠀㠀䄀䐀㌀䐀㄀㈀㜀㌀　㘀㠀㔀䈀㄀䈀　㠀㜀㔀䈀㈀　䐀䔀㠀㄀　㄀㄀䔀㌀㌀㈀䘀䐀　㠀㔀䄀㘀䌀㈀㔀㈀㜀㘀㠀䄀䄀㠀㜀㤀㠀㔀㌀　㠀㐀㤀㄀㄀䌀㄀䔀㈀䘀䄀䈀䈀㄀䄀㐀䌀㈀㤀㈀㘀䘀䔀㌀㄀䄀䈀㈀䈀䈀㐀㐀㠀　㄀㈀㠀㠀㠀䈀㈀㐀㘀　㤀㈀㈀㤀㐀㘀㐀㠀䔀㘀　㤀　䔀㄀　　䐀　䄀㤀　㄀　㈀㐀　　㘀㠀㔀㠀䈀㌀㘀㤀䌀㐀䘀䘀䔀㤀㤀䘀䈀䌀㤀㠀㜀䘀䈀䌀㜀䐀㔀䐀㌀䔀㈀㌀䌀㔀㌀䌀㜀䐀　㤀　䘀㄀䌀䄀㈀䈀㐀㌀䈀㠀䌀㐀㈀㜀䔀㌀䈀　　㠀䔀㔀䐀㘀䐀㜀䌀㘀㜀㤀　㈀䐀䔀㄀䌀㌀㤀䐀㈀䔀㐀䌀㠀㤀　㈀㌀㐀䈀㠀䔀　㈀䔀㘀䘀㘀㐀䄀㐀䌀㐀㄀㘀㈀㄀㔀㈀㌀䄀㌀　䈀㤀䈀㜀䘀䐀䄀㔀㠀㘀㐀㔀　㈀㈀㐀㜀䐀䔀　䐀㄀䌀　䄀㜀㠀㠀㄀䔀㌀䄀㐀㐀㘀㠀㤀　㔀㐀䄀㐀㈀㌀㈀㔀䈀㜀㔀㜀㈀㘀　㤀㄀㄀㜀　䌀㌀㐀䔀㐀䌀㜀䄀　䌀㔀㈀㐀㌀㔀㈀㘀䘀㠀䐀㔀　㠀㐀㄀㔀䔀㘀㐀㈀䘀䌀䌀㔀㄀㈀㘀㘀㔀䌀　㤀䌀䄀㔀㌀䄀䔀㘀㌀㜀䔀㜀㘀䔀㄀㜀㜀㤀㔀㤀　䄀㘀㜀䄀䐀㌀㈀㈀㜀㄀䄀㐀䘀㄀　㤀㜀　䘀㠀㤀㤀㐀䘀䐀㘀㄀䘀㈀㈀㔀㤀䄀䌀㐀㄀㘀㠀㈀䄀㠀㜀㔀㈀䈀　㔀㜀㔀䌀㄀　㜀䄀㌀　㈀䈀㌀㔀䔀䐀㤀䄀　䈀䌀㠀㠀㤀㘀㔀㈀㤀㤀䄀㔀䌀䌀䐀㈀䔀㤀㔀䄀䄀㘀㐀䄀䄀䐀䐀㜀㄀㘀䐀㌀㄀㜀㌀㄀䔀䈀䐀㔀䔀䈀䈀㔀㠀䐀䄀䄀㈀　㐀㌀㔀㘀䌀㠀䄀䄀㘀䐀䐀䄀㜀䌀㌀㠀㠀㜀㌀䔀㤀䈀䈀㜀㠀㐀㜀㤀䔀䄀㤀㤀㤀䄀䘀㐀　　㜀䌀㤀　䈀䔀㤀䘀䈀䘀㔀䘀䐀㠀㐀㘀䘀䘀㤀㐀䔀㜀㐀䌀䄀㠀㘀䈀㔀䄀㄀㌀　䈀㄀㄀㄀　㐀㄀㐀㄀㔀㄀䐀㔀㈀㘀㔀㘀㐀　䄀㐀䄀　㤀䌀䄀䘀㤀䘀　䘀㈀䌀　　䄀㄀㈀　㠀㠀㤀㈀㠀䌀㤀㐀䄀㐀䄀㘀㄀㤀㜀㠀㤀䘀䈀䄀䌀䌀㄀䔀㄀㌀㤀䄀㜀䈀䔀　㌀㘀䄀㐀㌀䔀㈀㘀䔀䔀㘀㐀㄀㌀䌀㈀㈀　㤀㠀䈀㠀㐀䈀㄀㄀㈀㔀㌀㜀㘀㠀䔀䈀㐀㐀㘀㘀㈀䐀㌀㄀㈀㜀㈀㔀㈀䌀䔀㔀㔀㘀㄀㤀䌀㠀㜀䈀䐀　䌀㜀䐀㘀㠀　㠀䌀䔀䔀㠀㔀㠀㌀䔀㠀䄀㐀　㌀㘀䄀䈀䄀㔀㐀㄀㈀䐀䌀䄀㜀㠀㠀㈀䔀㔀㈀䈀　㈀㄀㐀㔀㈀㔀䘀㐀㌀㔀　㘀㌀　　㘀㘀㄀㘀䔀㜀㜀㠀㈀䔀䐀㘀㈀㜀䈀㔀㠀䄀㐀䄀㄀䔀㄀䈀㘀㌀䔀　䘀䈀㘀㠀㌀䌀㈀䈀㠀䔀䌀㌀䐀䐀䘀㄀䔀㄀䄀㈀㄀䈀䄀　㌀䌀㜀㌀㌀䐀㄀䈀㌀㐀㠀䌀㤀䐀㌀䌀㌀㜀㤀䌀䌀䈀䘀䔀䐀䄀㐀䈀䈀䌀㈀䘀䐀㄀䈀㌀㄀㠀䔀㤀㄀㌀㠀䔀㜀䌀㘀㔀䈀㐀㠀㤀㠀㄀㌀㤀䐀㤀　䄀䔀㈀㤀㠀㘀㌀㌀㄀㜀䘀䘀㈀㜀䄀㔀㈀　䌀㌀㐀㌀㄀㠀㜀䐀㤀䐀㠀㈀䄀㌀䄀䘀㤀㌀㌀　䔀㘀㤀䌀㔀䔀　㔀䘀䐀䄀䌀䄀㘀㄀㐀䄀㠀䐀㐀䐀㄀䌀䘀㜀㘀㘀㠀㄀㈀䘀䔀䄀㄀㔀㌀䈀䐀䘀㌀䔀䄀㐀　㌀㈀䄀䈀䐀㔀㈀㜀㐀㤀　㔀䌀䘀䌀　䔀㐀䄀䌀䐀㘀㌀䌀㤀㤀㤀　䈀䈀㄀䄀䐀　㔀㔀䄀㜀㐀䄀㈀㜀䈀㌀㘀㐀㘀䐀㜀㜀㄀䔀䄀㄀　㤀㐀䔀　䐀㔀　㜀㠀䈀䘀㔀㐀㠀䌀䔀㜀㈀䌀㘀䔀䄀㔀㠀㜀䈀䄀㄀㌀䘀㠀䌀㐀㜀䘀㘀䐀㘀䈀　　㜀㤀䔀㠀䌀㄀䈀㘀䌀㤀㈀　㠀㤀䌀䌀㌀㄀㔀　　㤀㌀䌀　䘀㠀　㄀㐀䈀㠀䄀㠀㈀㤀㄀　㤀䔀　㐀㤀㘀　㌀㜀㘀㘀䘀㈀㄀䈀㜀䈀䐀䈀　㤀㠀䐀䐀㜀㌀䘀䄀䐀㌀䔀䘀㤀䔀䐀䈀䘀㤀㐀㌀㜀䄀䘀㠀䐀㐀㐀䌀䔀㘀㌀㜀䄀㜀㈀㜀㌀㄀㠀㜀㐀䔀㘀㌀㐀㐀㜀㠀　㠀䔀㤀䈀㠀㌀㠀䘀㘀㄀䈀㈀㄀㈀㐀㔀㈀㐀㤀㠀㜀䐀䌀䌀　䈀䈀䔀　䌀㘀㌀㐀㜀㜀䔀㘀㐀䌀䐀㤀㌀㔀㐀䌀㠀㔀㤀　㄀㈀㈀　㐀㤀㔀䌀䄀㐀䄀䘀　㌀㐀䔀㌀㘀䈀㜀䐀㈀䔀㌀㌀㤀㜀㌀䄀㄀䄀　㤀　㈀㌀㐀㐀䘀㘀㄀㈀㈀䘀㈀　㌀㔀㈀㐀㐀　㤀䔀䄀㘀　㔀㤀㄀㠀㄀㔀　䔀㐀　㔀㠀㘀㐀㘀㘀㘀䌀㐀䔀㤀䄀㈀㄀㤀㐀㄀㤀㜀㤀㠀㄀㄀䈀㐀㜀䈀㜀䐀㄀㜀䌀㈀㈀㠀㠀䔀㘀㌀㔀䐀䘀㌀㠀㤀㈀䐀㤀䄀䐀㐀䄀䌀㈀䐀䔀䈀䌀㠀䐀㈀䈀㔀㈀㈀㐀㐀䔀　䘀㈀　㤀㄀㤀㈀㐀䔀㐀㐀䔀䈀㤀㐀䈀㔀䔀㈀㌀䘀㜀䌀㠀䄀䌀㈀䌀㤀㐀䘀䄀䈀　㠀䔀㔀㜀㤀䈀䈀　㘀䐀㘀㤀㄀㔀䈀䐀䔀㔀㜀䘀䌀䘀㤀㜀㘀㔀䈀䔀㘀䌀㐀䔀㄀㜀㜀䐀䐀㤀㄀㈀㘀䈀㈀䐀㤀㌀䌀䘀䈀㐀㄀㌀㜀䔀䌀㤀㜀㜀㤀䘀䘀㠀䄀㈀䘀䐀㘀䌀䔀㈀㐀㐀㘀㜀㌀㘀䈀䈀㤀㄀㈀㄀䌀䌀䔀㈀䔀䄀㈀㔀㜀䄀䘀㐀䐀　㘀䔀䄀㐀㠀䔀㠀㐀　㐀㌀䄀㔀　䄀㐀㤀　㘀㘀㘀㈀㄀㌀䘀㘀䄀㤀㄀　㈀㜀䘀㐀　䈀䐀㘀䌀䌀㈀䌀㔀䄀䌀㈀䄀㄀㠀㄀㤀㤀㔀㤀䌀㄀㘀䄀䈀㘀䌀㤀䔀㘀㈀䌀㠀䘀䈀㐀㄀㄀　䔀䐀㠀　䐀㠀㐀㄀㄀䐀㤀㘀䌀㤀㌀䘀㠀㘀䄀䄀㔀䐀䐀䄀䘀㈀　㔀㜀㘀㘀㜀㤀䌀䐀㠀㜀㄀䔀㔀䔀䘀䌀䘀䌀䌀㐀㠀　㄀㜀㤀㄀㘀㔀㌀㘀㔀㤀㠀㘀㐀㠀㌀䘀㈀㘀㌀䘀䐀䈀㔀㄀㔀㐀㐀䘀䄀　㐀㐀䔀䄀㘀䐀㐀㘀㔀㈀㘀㠀㠀㄀　㈀䘀䌀㄀㜀䐀㔀㤀㈀㄀䐀㄀䐀㘀䐀　㄀䐀㠀䄀㐀　㜀㤀䔀㠀㜀㜀䔀㐀㔀䌀㌀㌀䐀䈀䘀㄀䄀㈀䔀㈀　䄀䔀䈀㤀㠀䐀䈀㤀㄀㔀㜀㄀㐀䌀䌀䘀䔀㤀㄀䔀㌀䌀䌀㤀　㠀㜀㤀䐀䄀㘀䘀䈀㌀䄀䘀㔀㈀㄀䄀㄀㔀　㔀䈀㘀㐀䐀㌀㐀㈀㜀䄀㈀　㌀㤀䘀䔀㄀䘀㌀㐀㔀㠀㌀䐀㄀㈀㠀䌀㌀㄀㠀㠀䌀㐀䘀　䔀䌀䄀㔀㄀䔀㘀䌀㤀䔀　㠀　䘀㘀㠀㈀㐀㘀　㜀㠀㌀䄀㄀㈀㠀㐀䌀㤀㐀㔀㤀㤀䔀䘀㤀䐀䔀䘀㤀㐀㄀㈀䈀䈀㈀㤀㠀㔀䐀㈀䌀㈀䔀㌀㈀㄀㘀㜀䄀㤀㘀㜀䈀㤀㜀　㘀㤀㜀㠀㜀㜀㈀㤀㄀㐀㔀䐀㄀䈀䈀㠀㈀　䘀㐀㈀㈀㌀㔀䌀㐀䔀䐀㌀㘀㘀䈀㤀㈀䌀䘀䄀䌀㜀䐀㤀㤀䄀䘀䔀㄀㈀㈀㘀䘀㄀䈀䈀䈀㘀䔀㘀㐀　䌀䔀㤀䘀㐀䔀䘀　㠀　㜀䘀䄀䔀䄀㐀㌀㔀㠀　㐀㜀䈀䌀㠀㠀䈀㜀㤀㜀㜀㜀　䐀㘀䔀㄀䔀㈀㜀䘀䐀䘀㄀䄀㘀䘀㈀䐀㠀㤀䄀䌀㐀䘀䈀䌀䄀䈀䈀㘀㤀㔀㘀㄀䔀㘀䘀㌀㠀　㄀㘀㔀㌀䔀䐀㈀㔀㌀　㘀䌀䄀㜀㐀㔀㜀㘀㔀䔀䄀㈀䔀　䈀䔀㤀㐀㔀䌀䘀㔀䌀㐀䘀㘀㌀䌀䔀㈀㤀㜀㘀　䐀㌀㠀㈀䔀䈀䄀㌀㜀㐀㜀㜀㄀㈀㔀䈀㠀㄀䈀㠀䔀㔀䐀㌀㈀㄀㘀䔀㤀㜀　䔀㌀㤀䘀䘀㤀㈀㈀䈀㌀䌀䌀䘀䈀㘀㈀㈀䈀㐀㄀㌀䔀䐀䘀㄀䐀䐀䐀㈀㄀㤀䈀㈀㐀䘀　㈀㤀㠀䈀㜀㐀㤀㠀㜀㠀䌀㤀㌀㐀㔀䐀䐀㈀㄀䐀㐀　㈀㔀㤀䈀㄀㤀㄀䌀㌀㜀㈀㌀䐀䔀䘀㄀㘀㐀㠀㌀㘀䄀㘀㤀䄀㘀㌀䌀䄀䐀㌀　㔀䐀㔀㤀㐀㄀㔀䐀　㈀㌀㘀㠀㄀䈀㘀䐀䘀㠀　㤀㤀㐀䘀䘀㜀㄀㜀　㘀㤀䔀㌀䘀㔀　䐀㠀䈀㌀䔀䐀㐀㔀㔀　䘀㘀䌀㘀㤀䘀㐀　䘀㐀㠀㘀㌀䘀㜀䘀䘀㜀㜀㜀㠀㔀㌀㜀䔀　䄀䘀䌀㄀㔀㔀䔀　䔀㄀㜀䐀㠀㔀㤀䘀䈀䌀䘀㔀㘀䔀㘀㄀䔀䈀䄀䔀㄀㜀䌀㄀䐀㈀䔀㜀　䄀㜀䘀㈀䘀㄀䌀　　䄀䐀㈀　䐀䄀　㜀䔀㐀䔀䘀㄀㔀㠀䔀䐀㠀㄀㄀㐀䘀㘀㘀　㐀䌀㤀䈀䄀㐀䄀㠀㔀䌀　　㐀䐀䈀䄀㈀㔀䐀䔀㄀㔀㤀䔀㔀㠀㌀㜀㌀㠀䌀㌀㤀䈀䔀㠀䈀㠀䌀㠀䈀㜀䌀㠀䌀䄀䌀㤀㐀㈀㌀㈀　䄀㜀㠀㈀㈀㄀㌀䈀㔀䔀㘀㐀㠀䔀䐀䈀㤀　㜀䘀㔀㠀䈀　䐀䈀㤀㜀㌀㌀䐀㌀䌀㈀㔀䔀䈀㐀㌀䐀㜀㘀㤀㘀㐀㌀䌀䈀　㤀㈀㐀㤀㌀㈀　㄀㠀㠀䔀㔀㈀㌀䌀㘀㄀㤀㤀㜀㠀㤀䐀㠀㐀㐀㠀㈀㈀　㈀䐀　䈀䘀㐀㠀㐀㠀㜀㔀㔀㜀㔀䌀㜀㔀㔀㜀㔀䌀㈀䐀㄀䄀㈀㤀䔀䄀䘀䘀㌀㐀䘀　䘀㐀䔀㔀㌀　㔀䌀䈀㠀䐀㐀㔀㘀㄀㤀䌀䈀㈀䔀㜀㐀䐀䈀㔀䈀䔀㈀㘀䌀㠀㜀㄀䈀㠀㜀㈀㌀䌀䔀㈀䔀　䔀㘀㔀䔀䌀䐀　㄀㐀㄀㈀㠀　䐀㈀㌀㐀㄀䌀㠀　　䄀䘀䐀䔀㌀　　㔀㐀㜀㌀䈀　㄀䌀䄀㈀㜀䐀㐀㤀㈀㘀㌀䐀㠀㠀㈀䔀　㘀㌀㌀㘀㄀䔀䐀䈀䐀䘀㌀㔀㘀䐀䘀䈀䈀䔀㐀䔀㌀䌀㈀㐀䈀㠀㔀㐀䐀䔀　䄀㘀㘀㜀㜀䘀㤀㐀㤀䘀㌀䈀䘀㄀䐀䈀㠀㔀㌀䈀䐀㠀㌀䐀㤀䄀䈀㤀㘀㈀䔀　䄀䄀䈀䐀㠀㔀㤀㄀㤀㄀㤀䘀䐀㄀㘀　䘀㌀䄀䐀䌀䈀䈀䔀䔀㔀㔀㜀㜀㄀䌀䌀㜀㤀䘀㄀䔀㠀䐀䐀䔀䌀䌀㜀㐀㠀㜀䔀䘀䌀㔀㐀　䐀䄀㐀䌀㤀　䔀䐀䌀䈀㜀㌀䌀䘀䐀㐀㠀㄀䄀㠀㘀㐀㌀㤀㌀䘀䐀㔀　㠀䔀㌀㄀㜀㄀㄀䌀䈀㐀䘀㄀䌀㔀㜀䐀㤀㔀㔀䌀㄀䐀䐀䈀㄀　䌀䌀䄀㐀䄀㜀䈀㄀䔀䐀䌀㄀䄀㤀䔀㤀䈀㤀䔀䌀䐀䌀䔀　䄀䌀㜀㐀㤀䔀㔀䐀㔀㠀䈀㤀㌀㠀㜀䐀　䐀㜀䈀㄀㌀㜀䐀㈀㌀䈀䈀㤀㤀䐀䔀䌀䌀䐀䔀㐀㜀䘀䐀㠀　㜀䔀㤀䌀㜀䄀㤀䄀㜀䔀㠀䐀㜀䄀㈀䐀㜀　㠀㐀㌀䄀㄀㈀㌀䌀㄀㈀㠀䄀䌀㐀䐀㠀　䌀㔀㔀䌀㜀㐀䔀㘀㌀㤀㤀㌀䌀㜀䈀㘀䘀䔀㠀䘀䔀䘀㐀㘀䈀㘀㤀䄀㘀㈀䄀㔀　㤀㜀㘀䔀　䐀㘀㐀䐀㌀䈀㌀㐀㈀䈀㌀㘀㈀㌀㌀䔀㈀㌀㌀㈀䄀䔀㜀䄀㐀㜀㌀䌀㈀㘀㈀䌀䘀㐀㈀䘀䘀䐀㈀䐀㠀䐀㈀䈀㈀㔀䌀㜀䌀㔀㄀㘀㈀㔀㄀䌀㔀㤀㔀䔀䌀㘀㔀䘀䔀㔀㔀䔀㤀㤀䈀䐀㈀㜀㜀䌀㜀䔀䔀㐀䔀䘀䘀㈀㤀䘀㐀㔀㘀㌀䄀㈀䌀㠀㜀㠀　㄀䘀䔀㤀䄀㈀㤀䐀䐀㄀㈀䌀㠀㔀䔀䈀㐀䈀㤀䈀䄀㈀㔀㤀㈀㘀䔀㐀　䈀䐀㔀䈀㄀㔀㌀㔀㤀　㘀䐀㈀㠀㄀㄀䄀㤀䄀䄀䘀㐀㤀㠀㜀　㈀㈀䌀䌀㔀㈀㔀㘀㤀㘀䘀㠀㐀㠀㔀䘀㠀　㤀䌀㔀䄀㘀䌀䄀䌀䈀㜀㔀㄀䄀　䄀䄀㤀㜀㈀㔀䔀㠀䌀㠀䌀㘀㌀㤀䄀㐀㠀　㤀䐀㌀㐀㐀㐀䄀㄀㈀㔀䄀㤀㄀䈀㐀㌀㜀㠀㐀㜀㜀䐀㜀䔀䈀　䄀䄀䐀䐀㜀㜀㔀　㄀䈀䐀㔀㠀㜀䄀䘀㄀䘀䔀㜀䄀㔀䐀䄀㄀䘀㔀㄀㘀䐀㤀䌀㠀㌀䈀㄀䈀㐀㘀㄀㈀㜀㔀㌀䐀㜀㔀䈀　㈀䔀䔀㤀䈀㈀㔀㄀䐀㈀㘀㔀䄀㌀㘀㐀㔀㄀㜀　㤀㌀㘀㤀䄀㐀㈀　䔀㐀䄀㈀䈀䌀䌀䄀㈀㄀䔀㈀㜀䐀㄀㈀㜀㤀㤀㔀䌀㌀䈀㔀㘀㌀䘀㈀㌀䄀㈀㘀䄀䔀䘀㌀㄀䌀䐀㜀䌀㐀㤀㔀㔀㘀㤀㈀䈀㜀㜀　䄀㈀㘀㤀䌀㄀㈀䌀䔀㔀㘀㤀㌀㄀㔀䔀㌀㈀㔀䔀䌀䄀㌀䈀㠀㤀　䌀㘀䄀㈀䐀㔀㘀䌀䄀䐀䐀㘀䈀䄀㌀㤀㘀㤀䘀䄀㔀㈀㠀㔀䔀　䘀䄀㔀䐀㌀䄀㤀䘀㈀㤀䄀㐀　㈀　䄀㔀㐀㌀㠀䈀䄀㘀䘀㤀㄀㐀㤀㄀㘀䐀㔀䔀䐀㐀䌀䈀㠀㤀㘀䌀䔀䈀㠀䔀㘀䌀䈀㜀䐀㠀䔀䐀㈀㠀㠀䐀䘀㠀㐀　䌀䄀㈀㄀㠀㤀　䈀㔀　㄀㔀　㠀䘀㈀䔀㤀㘀䄀䄀䔀㈀㐀㄀　㠀㘀㐀㔀㄀䘀㔀䐀㘀䐀㜀㌀㘀㐀䐀䔀㠀㌀　㄀㘀　㜀㈀䈀䄀㤀䄀䘀㤀䐀䈀䌀㘀䈀㔀䐀㤀㄀䘀㌀䐀䘀䌀䐀㠀䘀䘀䘀䔀㔀㔀䔀㄀䐀㤀䔀䐀䈀䐀㘀　䌀㘀㐀䈀㄀㠀　㜀䄀䔀㄀䔀㜀㤀㜀䘀䐀䈀㔀㔀㐀䘀㈀㌀䘀㄀㜀䘀䈀㌀䘀　㄀䔀㠀㠀䈀䔀㜀㔀䌀㔀䈀㈀㠀䈀㔀㘀㌀䌀㤀䌀䌀䘀㘀䌀䌀䌀䐀䔀㜀㐀䐀㄀㄀　㔀㠀㜀㘀䘀　㐀䐀㜀　䔀㤀㤀䔀㔀䘀㄀㐀㜀䔀㜀㈀㜀　㔀㜀䔀㄀䐀䐀䔀䘀㌀㐀䔀㘀㄀䘀　㈀䐀㤀㤀䐀㐀　䘀䄀㔀䔀䔀㄀㠀䐀　㈀䈀䄀䈀㤀䘀　䈀䈀䔀䄀㘀㤀㘀㄀䌀䌀㠀䘀㠀䘀㈀㈀䔀䐀䘀䘀　䌀㐀㈀㠀㐀㄀　㔀㔀　㄀㘀䘀㈀㔀䘀䌀㤀㠀㌀㐀㘀㔀　䐀㤀㠀㘀䐀䈀㄀䄀㔀䘀㄀䌀䈀㠀㐀䄀䈀䔀㈀㠀䌀㐀㠀㄀䄀㜀㘀　㐀㜀㈀䔀㐀䌀㤀㌀㄀㠀㔀㠀㌀　㤀㜀㠀䄀㌀㐀㠀㔀䈀　䌀㈀㘀㄀㐀㤀㜀㤀　㔀䐀䌀㈀㄀䌀㄀䌀㜀䐀䄀䘀䌀䘀㠀䌀䈀㐀䄀㈀䘀㌀䘀㄀䈀䔀㠀䄀䔀䄀㔀㘀　䘀㜀䔀㔀䔀㔀㘀䐀䐀㘀䄀㌀㠀㘀㜀䐀䐀㌀㤀䄀㌀㤀䘀䘀䘀䈀㄀䄀䘀㈀䌀㘀䐀䘀䘀㄀䌀䐀䐀㘀䘀㌀㠀㘀㜀䘀䌀㜀㌀㘀䈀㄀㘀㈀㈀䄀䄀䈀㐀䐀㤀䈀㄀䐀㤀㠀㤀　䈀䔀㐀㘀㔀䈀㄀䄀䈀㘀㈀㘀䈀䌀㔀䔀䈀䈀㔀㄀䈀䘀㐀䐀䈀䄀㔀㐀䐀䘀䄀䘀㜀䐀㔀㈀㜀䘀㔀㐀㄀䘀䐀䄀㠀䘀㘀㠀㄀㘀䔀㈀　㈀䌀㐀䘀㜀㠀㜀㐀㤀䘀䌀㜀䄀㌀㜀䈀㜀㐀㐀㔀㌀㐀䄀㌀㌀　㄀㤀　㤀㐀㠀㤀䌀㠀㤀㌀䈀㘀㤀䐀㠀㤀　㈀㠀　㘀㠀㈀㤀㄀㜀　㜀㤀䘀　䈀㤀䐀㄀䄀㄀㤀㈀䈀䌀䌀䐀㤀　㄀䐀㤀㤀　䈀　㘀䄀㤀㘀㐀　㔀䌀㄀䈀㤀㄀　䔀㈀㐀㐀㐀䐀㈀㠀㄀䘀䌀㜀䈀㜀䔀㌀㠀䈀䈀㄀㠀䄀㈀㄀㤀㄀䘀㈀䈀㐀䘀㘀㄀　䔀㜀㜀㘀䔀䄀㜀㄀㈀䔀㌀㈀㤀㄀㜀　㔀䘀㤀㠀　㐀䘀䔀㌀㠀㤀㈀㜀䐀䌀䐀㈀㜀㔀㈀㘀䈀㔀㈀㌀䐀㈀㤀㌀䄀㔀㔀㄀㄀㠀㈀㔀䘀䄀䄀䈀䌀㈀䄀䌀㈀㔀䐀䔀㠀䐀䘀㠀㔀㌀䈀䔀䔀㤀䘀䐀䄀㈀㘀㤀㔀䐀㠀䈀㄀䘀䔀㜀㈀㤀䌀䐀䐀䐀㄀㐀　䔀㄀䌀㌀㈀㄀㈀㜀䘀㜀㠀㌀　䐀㔀㤀　㜀䘀㔀㤀　䔀䘀㠀䐀㤀䔀㘀㐀㄀䈀㐀㤀䐀䘀㠀䌀䐀䐀㌀㘀䌀㌀㄀㘀䈀䈀㄀㠀㐀䈀䘀䔀㘀　㠀㌀㠀㄀㄀㐀㤀㈀㐀䈀㠀㈀䄀㔀㘀㜀㜀㔀㘀㌀䄀䄀䌀㜀㤀䌀㠀䄀㐀䐀　㠀䐀　㐀䐀㘀䌀㔀㠀　䐀㔀㤀㈀㈀㤀㄀㜀　䐀㘀㠀㌀㘀䌀㄀㔀㄀㌀㌀䐀㌀㐀㈀䈀㤀㘀㌀㔀㤀　㠀䈀㘀䌀㔀㐀䌀㐀䐀㄀䄀㌀㘀㠀㜀䌀㈀䌀㠀㤀䔀䔀㄀㐀䌀㌀㌀㠀㄀㐀㘀䌀䌀㤀䄀䈀䌀㌀㘀㄀　䄀䔀㠀䌀㠀䔀䄀　　㄀㔀㐀㐀㌀　㄀䌀㜀䌀䈀㔀䔀㌀㠀㤀㔀䘀㐀㠀䌀䐀　㘀　㌀㐀㄀㘀䘀㈀㔀㌀䐀　㄀㈀㈀㠀㐀䄀䐀㈀㐀㘀㠀㐀䈀㐀䄀䈀㔀㤀㈀㠀䘀䌀㈀㌀䈀䘀㜀䘀䘀䘀㘀䌀㘀㔀䘀䘀䘀㘀㄀㔀䔀䌀䐀䌀㈀䈀㤀䄀㌀㈀㜀䘀㘀㈀䐀䈀䌀㜀䄀㔀㄀㐀㌀㜀㈀䌀䔀䘀䘀　㄀㠀䘀䐀䔀㜀䔀䘀䘀㜀㤀䐀䘀㜀䘀䄀䌀䐀　䌀㐀䔀䔀㤀㤀䘀䘀䔀㈀　䐀　䘀䈀䐀㔀䔀㔀㘀㤀㔀㌀䄀㘀䘀㔀䐀䄀㄀㄀䈀㐀䌀䘀䌀䘀㘀䔀㘀㈀㤀㌀㈀㌀䘀䈀㈀㠀䔀㘀䔀㤀㤀㜀䌀䌀㌀㌀㤀㔀㜀䔀　　䔀䈀㤀㘀㔀䄀㌀㄀䘀㌀　㜀䘀㘀㄀䘀䘀㐀　㌀㔀䐀㄀䐀㌀㐀㤀䌀䐀㠀䄀㠀㜀䄀䄀㈀䔀䄀㤀　䄀㐀䄀㤀㜀䐀　䌀㔀䈀䄀㔀䄀䈀㐀㔀䘀㠀㘀䈀㌀㠀㌀㘀㄀㤀㜀㠀㠀㈀　㘀㈀㜀䄀㤀䌀䐀䌀䄀㜀㤀㘀䔀㐀䘀䄀㤀㔀㄀㈀㔀䄀㈀䔀䄀㄀㘀㌀㈀㔀㜀㐀䐀㐀䄀㔀㤀㄀㘀䘀㄀䔀㜀㈀㄀㠀　㈀䈀䄀　㐀䈀　　㤀䄀䈀㈀㘀㜀㜀　㤀㜀䐀　㤀㜀㌀㈀䐀㜀䐀㄀䐀䌀㌀㔀㐀㔀㔀㐀䘀䄀㈀䈀㌀䈀㄀䈀㌀䔀㠀㔀㤀䘀䌀䐀䌀䈀㈀㄀㤀䘀㄀䈀㌀㔀㌀㌀㌀䄀䈀㈀䘀䄀　㤀㜀䘀　䌀䈀䌀䄀㄀㘀䐀㔀䐀䌀䔀㄀䐀㔀㈀䄀㜀㄀䔀㈀　㄀㌀㌀㐀䘀䌀䄀㈀㔀䄀䄀㔀䌀㈀㈀䔀䐀㄀㈀䐀㔀㈀䔀㔀㄀㐀㤀䘀㠀䌀䄀䈀䔀䐀㤀㈀㘀䄀䄀㔀䌀㈀㈀䔀䐀㄀㈀䐀㔀㌀㠀㔀㈀㌀㤀㄀㌀㔀㌀㌀㔀㘀䄀㌀䄀　㔀㔀㌀㜀㐀㜀㔀㔀㔀㤀䈀䐀䔀㔀䄀㜀㤀㜀㘀䐀㔀㠀䌀䌀㘀䄀㔀㠀㤀㔀䌀䔀㔀䌀㈀䄀䄀䐀㔀䘀㈀㐀䄀㜀㔀㤀㔀㜀㘀㤀㤀㘀䘀㐀㔀䔀㠀　㘀䘀㤀㐀㘀䘀㔀㐀㘀䘀䐀㄀㘀㘀㌀㔀䐀䔀䄀䐀䄀䄀䄀　䐀䘀㐀㤀䐀䘀㈀㄀䐀䔀䄀㤀䐀䘀䄀㜀㜀㠀䌀䐀䈀㔀㌀䐀䘀䄀䄀䈀䄀㔀㜀䈀䐀㔀䘀䈀䘀䐀䘀㔀䘀䔀䔀䈀㠀䌀䐀　䐀䌀㤀䈀㐀㄀㤀㐀䐀㐀㜀䌀㐀㜀㐀㈀䐀㐀㠀㔀㌀㔀㐀㘀䐀䌀㐀㘀㐀㤀䄀㈀㜀䄀㘀䄀㤀㄀㔀　㠀㜀䄀䐀㐀㠀㘀㄀䈀䄀㈀㜀㜀㐀㐀㘀㄀䈀㐀㈀䄀䄀　㌀㘀㤀㐀㔀㜀㔀㜀㠀㄀㈀䄀㌀㘀䌀　㄀㘀㔀㌀䄀㔀㘀䌀㜀㤀㠀㌀㔀㠀㔀䔀㄀䔀䄀　㠀㤀䔀㤀㠀㐀䐀㌀　㘀㜀㤀㌀䈀䈀䘀㠀㄀㐀䘀㜀㤀䐀㈀㠀㌀䐀㌀㜀㠀䌀䌀䘀䔀㄀䈀䈀㔀㄀䄀䄀䄀㔀㈀㤀䄀㈀䄀䈀㌀䌀㤀㔀㠀㔀㤀㜀㤀㔀㐀䔀　㌀㤀㠀㘀㠀㘀㄀䌀䄀㠀㐀䄀㔀㔀䄀　㘀䈀㄀䌀㔀䈀㄀䔀㘀䐀㠀㠀㔀㠀㔀㠀㠀㘀䔀䔀㐀㄀䈀㘀䌀㜀䈀㄀　　䐀㔀㐀　㄀㈀㐀　䌀㐀䄀㄀㌀　㐀　　㈀㜀㐀㠀㈀㈀䔀䈀　　㘀㘀䌀　㄀㄀䌀㄀㠀　㐀䈀䐀㤀㘀䐀㈀㔀　㤀䔀䘀　㜀䄀䌀䘀㔀䌀㠀㠀㜀䘀㌀㄀㠀䈀㐀㔀㔀䄀䌀㔀䌀䘀䘀　㔀䈀㐀㄀㤀䘀㘀　䈀㘀㌀㠀䄀䔀㔀㠀㜀㌀㜀䌀䌀㠀䈀㐀㔀㠀䄀䌀㈀㤀䄀㘀䄀㤀㔀䄀㔀　㠀䈀䌀䐀㐀䔀㐀䐀㠀㌀　䈀㘀䈀䘀㄀䔀㜀㈀㄀㈀㈀㔀䌀㄀䈀㘀㤀㐀䔀㈀䄀㔀䘀䐀㈀㔀㠀㘀䔀　䐀㈀㘀㔀䄀㈀㌀㤀　㌀㘀䈀㄀䔀㜀㠀㌀䘀䘀㤀㜀䔀㤀㈀㈀㠀　㔀㤀䄀䌀䘀䔀㌀㄀㈀䘀䌀㐀㐀　㄀㄀㤀䔀䔀㠀㈀㐀㠀㔀䘀㈀䘀㌀　䔀㤀㌀㘀　䄀㠀㤀㌀㘀䐀㜀㜀㌀㔀㄀㤀㐀㤀䈀㤀䔀㌀㐀㘀㌀䘀㘀㌀㈀㐀㤀䘀㌀㤀㠀䌀　䘀㈀㜀䘀　㐀䄀㈀㄀㈀㄀䌀㜀䔀㘀㌀䐀䄀䔀㤀㠀㔀㠀㠀㈀䌀㌀䄀㐀䐀䐀㘀㌀㌀㈀　䔀㐀䄀㤀䘀㄀　㠀㤀㠀䘀䔀䔀　㘀㔀㄀䐀　㄀　　䐀㌀㐀䈀　㈀㐀䄀㐀䐀㌀㈀　　㜀䌀䄀㠀㤀㌀㔀㄀㐀䄀　䐀䐀㠀䌀㈀㐀㄀㈀㔀㜀䈀䈀䘀㐀䄀䌀㄀䌀䈀㘀㌀㐀㌀䈀㐀㤀䐀䐀㔀㐀㌀㔀㈀㤀䈀䄀㈀㐀㄀䐀㐀䄀㐀䔀㠀䔀䐀䔀䔀䘀　䈀　㘀㤀㠀㈀　㤀㄀㘀㜀䄀䌀䐀䔀䐀㈀䌀䈀㜀㘀䄀䈀䌀䈀㔀䘀䈀䌀䔀㔀㤀䄀䄀㜀㈀䔀䔀㠀㔀䌀㌀㘀䄀䐀䈀　㜀䄀䌀㄀㤀㔀㤀㜀㜀䘀䔀㌀䐀㌀䘀䘀䘀㔀䐀㠀䔀㜀㄀䈀䐀㠀㌀䐀䘀䄀㌀㌀㐀䘀䘀㘀㌀䔀㤀䄀㤀䐀　㈀䐀䔀㔀䌀䐀䌀㜀㌀䔀㌀㠀㘀䐀㌀　䘀䘀䘀䄀䄀䘀　䐀㜀　㜀䌀㄀㄀䈀䌀㘀䐀㔀䐀䘀㔀㤀㜀㐀䔀㘀䈀㔀㘀㜀䌀䘀䈀㠀䈀䌀㌀㈀㜀㠀㜀㄀㘀㘀䘀㈀㘀㌀㈀䈀䄀䔀䘀㤀䌀㔀䄀㔀㔀㜀䘀䔀䘀㘀㌀㘀䔀䐀䄀䔀䈀䈀㘀䘀䈀䈀㘀㠀㜀䔀㐀䈀䌀䈀䄀䄀㤀䄀㘀㤀䈀䈀䐀㘀䄀䘀㌀䈀㜀　䔀䐀㜀㔀㘀㐀㘀㘀㐀㄀㄀㌀䈀㈀㘀䄀䘀㜀䔀　㔀䄀㌀㐀㄀　㈀㐀㄀䔀㈀䌀䔀㜀㐀㈀㈀䔀䔀䘀㄀㈀㤀䌀㤀䈀㘀㔀䔀　䘀䘀㘀㔀㤀㘀㠀㄀㜀㌀䈀㌀　䌀䘀䌀䈀䘀䌀㠀㌀㈀㈀　䘀䌀㘀㘀㘀㄀㌀㤀㘀㈀㌀㘀㠀䄀㜀䌀㔀㄀㠀㈀㌀㠀　㠀䄀䘀䔀䐀㐀䈀䐀㠀䄀㔀㔀㔀䈀䈀䈀㤀　㐀㠀　㠀䐀䈀㠀䄀䄀㄀㘀㠀　㔀䐀䌀　䌀㤀䔀䈀㄀䌀䈀㔀㘀㐀㠀㈀䘀㌀㠀㈀　㌀䘀㈀㤀䘀䈀䄀䘀㄀䈀㘀䘀㜀㔀䌀䈀㐀㄀䘀㜀㘀䐀㄀䈀䐀㘀　㐀㜀㜀㈀䘀　㈀䈀　䄀　㌀　䘀㤀㘀㠀㘀䐀䔀䘀　　㐀　䈀㘀㌀䔀㐀㜀　䘀䔀㜀䐀㠀㌀㜀㐀䔀䔀㜀㜀㌀㠀䔀㤀㤀䄀䔀㈀㤀䘀㘀㠀㌀䘀㈀㔀㜀　㌀㐀㈀㐀㌀䈀㐀㘀㄀㌀㜀䌀㘀䐀䔀䔀㜀　㤀䄀㜀㘀㜀　䔀䔀㄀㐀㜀䄀　䈀㘀㔀䌀䌀㤀䐀㠀㔀㈀㠀䄀䈀㌀䔀䘀㌀䌀䌀䄀㤀䈀䘀䔀㈀䈀㔀㜀䈀㄀㐀䘀㤀㜀㌀㌀㠀㈀䈀䔀㘀　㌀䐀㌀䔀䌀㤀㤀　䌀㘀㤀㜀䐀㌀㄀䈀㌀㔀㠀㜀㠀㐀㤀㘀　　㈀㠀㌀㐀䔀㜀䔀䄀䌀㤀㔀㤀㤀㈀㘀䌀䌀㘀㐀㘀㘀　䈀䔀䈀䘀㔀㈀㜀䐀㠀䄀㌀㌀䄀䄀䘀㔀　䐀　㠀㌀㄀䈀㔀　㌀㤀䐀㄀㌀㜀㐀䔀㘀㄀䘀䄀㐀䄀　㐀䌀㈀㌀㜀㤀㘀㄀䄀䘀　䄀㔀䄀㄀䔀䈀䐀㄀䌀㌀䄀㈀㐀㜀　䘀　䐀㈀㜀㐀䈀㜀䄀䌀㠀䘀㘀䔀㠀㘀㄀㌀䔀㄀㄀　　㠀㤀㐀　㘀㜀　　㜀㘀　㔀䐀㘀　㐀㜀䄀　㈀㜀㐀䔀　㤀䘀㜀䄀　㤀　㌀㌀㤀㤀㔀㈀㐀㐀䌀䐀䐀㜀㠀㠀㐀㤀㐀㜀　䈀䄀䈀㈀㘀䌀䔀䐀㈀㤀䈀㤀䈀㈀㈀㌀㄀㔀䈀㔀䄀㜀䌀㐀㌀㠀㄀㄀㌀㐀㔀䈀㜀䈀㐀䄀㐀㔀䔀䐀㈀㤀䔀㔀䘀䐀䐀㠀䈀㌀㄀䘀䐀㌀㤀䔀㜀㘀㘀㐀㜀䄀㤀䔀㤀㄀㜀㜀㤀㈀　䌀㐀㔀䔀㜀㠀䐀䈀㠀　㤀㄀㤀䔀䌀㈀㜀㜀　㄀䔀䈀㐀䈀㘀　㌀䄀䈀㌀㤀㤀㄀㠀㈀䈀㈀䔀䐀㌀䄀㘀㌀䔀㜀　　䈀㐀㜀㠀㄀䌀㜀䘀㠀䐀㘀㐀㄀㜀㐀㠀䄀㈀䌀㄀䌀㌀㜀㐀䔀䐀䈀䈀䈀㐀㜀　䘀䄀䐀㔀䐀䘀㄀㔀㐀䔀䄀䐀䐀㤀㜀㜀䌀䔀㌀㌀䈀㜀䈀䌀㌀䔀䌀　䔀䔀㄀㤀䐀䔀䘀㄀㜀㘀㘀㄀䘀㠀䈀㄀䈀䈀㠀㄀䘀䄀㘀㜀㜀䄀䘀䔀䘀　䌀䔀䔀㜀㜀㜀㜀䐀㘀䐀㄀䘀㤀㤀㌀㔀㐀　㠀㤀䌀㠀　䄀㤀䈀㠀㤀䈀䈀䔀䘀䔀　㔀㤀㠀㐀㠀㌀䐀㤀㜀䄀䈀㜀㠀㔀䌀䔀㔀㔀　䐀　䌀㈀㈀㄀䌀㤀㔀㈀㌀㠀䌀䌀䈀䌀㜀㤀䌀㈀䄀䐀㈀䐀㐀㌀㠀㤀㜀䈀㠀㌀㐀㐀䘀䘀㌀㘀㤀㔀㄀䔀㔀䈀㠀㠀䈀　㤀䈀㔀䄀㈀㄀䌀㠀㠀䄀㌀㄀䘀㄀㘀䈀㔀㤀䔀䔀　䐀㈀䘀䐀㌀㤀䌀㤀䄀㜀䄀䄀䌀䘀㌀㤀䄀䘀䘀䈀䈀䔀㜀䈀㄀㄀䄀㐀㤀䌀㤀䄀㄀㔀䔀㠀㄀㈀㔀㈀䌀㐀㠀䐀㄀㘀䔀㄀䐀䈀㤀䌀㘀䄀㐀䔀㤀　㜀㈀䈀㌀㜀䈀㠀㠀㈀㠀　㤀䔀䌀㔀䄀㈀㘀䌀䔀䔀䘀㄀㌀䌀䘀㔀㈀䄀㈀㔀㠀㔀㄀㘀　　㄀㘀㐀㄀䈀䐀䘀㜀䔀䐀㤀㜀㠀䘀䈀㘀㔀㐀䘀㐀䈀　䈀㘀㔀㐀㜀㈀㄀㜀　䘀㄀㜀　䄀䄀㤀㄀　㔀㜀㔀㔀㐀　䐀㔀䐀㈀㔀㌀㔀㈀䄀㐀䐀㐀䄀㤀㜀㜀㈀㠀㜀㜀　㠀㜀䈀㠀㐀㔀㄀㤀㔀㈀㠀䔀㈀䈀㜀㈀㐀㈀䔀㤀㔀㐀㈀　　㌀㘀㔀　㄀㌀䄀　㔀䐀㔀㈀㈀㔀　㘀㐀㄀㈀㜀㜀䔀䔀䔀㠀㈀　䌀㔀㠀㜀䔀㠀㜀䘀㐀䈀䄀㈀㤀㠀㄀　㔀㠀㤀䘀㈀　䈀　㄀㐀㄀㈀㌀䔀䌀㠀䘀䄀㈀　㘀㐀㐀㔀䘀㐀䄀䈀䘀䔀㤀䌀㤀　㈀㠀㐀㄀㔀䌀㈀㄀㠀　㄀㔀㔀　㈀　㐀㤀䈀䈀㤀䄀㘀䌀䄀㜀　　㜀䄀㠀㐀㈀䐀　㈀㜀䄀　䔀㠀　䄀㔀㐀㈀䄀䈀㈀㘀䈀䈀㄀䌀㠀㈀㜀䈀䔀　㈀㌀㄀　㐀㈀㜀䌀䌀㔀㤀㌀㘀　㌀䈀㔀㤀䐀㠀䌀㐀㜀㘀䈀㄀㔀䈀䐀㠀㈀㄀䘀㘀㌀㠀䌀䈀䈀㈀㠀㌀㜀　㔀㌀㤀䘀䐀䌀䈀㔀䌀䐀　䔀㈀㔀㜀㘀䔀㌀　䔀㜀㔀䘀䌀　㠀㄀㤀䘀㘀㐀䌀㠀㠀㐀㠀䘀㠀㔀㠀䌀㠀㤀䔀　䈀䔀㄀䐀㐀㐀㐀䔀㈀㤀㈀㐀㠀㌀䈀㔀㐀䔀㠀㄀䈀　䈀　㜀䔀䔀䄀㐀㜀㐀䌀㐀㠀㐀䘀䘀㜀㜀䄀㜀㘀㠀　㈀㜀䌀㄀㈀㜀䌀㌀㠀䈀䔀䔀䐀䐀㘀䈀䌀䌀䘀䔀㤀䄀䐀㐀㄀㜀㜀䈀㜀㈀䐀㔀㠀㐀䄀䔀㘀䌀㜀䔀　㘀䘀㄀㐀㈀　㠀㄀　㌀䐀䌀㈀　䘀㌀䔀㔀䄀䔀㌀䐀　㈀䐀㠀　㌀㈀䌀㈀㔀　㠀㘀䔀㈀　　㜀䘀䈀㄀㐀㐀㤀䐀　㘀㈀　㜀　㌀㔀䈀　　㤀䌀㌀䔀䘀㈀䔀㈀䔀䘀䌀㄀㈀䐀㄀㌀䔀㈀㄀㔀　䐀㘀　䘀㌀　䈀㈀㌀䘀䈀䐀㠀㌀䐀䄀㜀䐀䘀䔀㠀㔀㤀㜀㌀䘀䐀䘀㔀㐀䌀㈀䐀䌀㤀㄀䈀㈀㈀㄀㜀㠀　㔀䘀㠀䘀䄀䐀㜀䘀䘀㠀㜀㜀䈀䈀䔀㜀㔀㌀㜀㜀㜀㤀　䈀䔀䐀㄀䐀㤀㈀㐀　㠀㜀㐀㔀䈀㐀㄀㈀㈀䔀䐀㌀㐀㜀㐀㜀㠀䄀㜀㜀䐀　䔀㌀䔀䔀㜀　䘀㤀㐀䐀㄀䘀䄀䈀䌀㈀㘀㔀䈀㠀㘀㈀㄀䔀䄀㈀㠀㐀䘀㄀㘀䌀㠀㘀㜀㘀䈀㔀㈀㄀䔀䐀㄀㈀䔀㠀䘀㜀䈀㤀㔀㘀㤀㔀㠀㘀㔀䔀䌀㈀䔀㔀㐀㤀䈀䐀㠀㐀㌀䘀䘀㔀㄀㈀　㔀䄀䌀㠀䌀䈀䔀㠀䄀㜀䔀㠀䐀䔀䄀㤀㐀　㠀㌀䈀䈀㐀䐀㔀㤀㈀䄀䈀䄀㔀䐀㈀㤀䔀㔀䄀㌀㌀㄀䐀䌀䄀㔀㈀㘀䐀㐀㠀㔀㜀䈀㔀㠀㔀㘀㘀㔀㄀䔀㜀㜀㠀㘀㘀㤀㤀䔀㜀㠀㐀㄀㘀㔀㌀㠀䈀㌀䌀㠀䈀䌀䐀㐀㔀㈀㄀䔀㌀　㄀䔀㄀　㄀㄀䐀㜀䄀㐀㈀㌀㠀㠀䐀㘀㘀㤀　䄀㌀㘀㌀䄀㤀䈀㐀㄀㠀㈀　㄀㈀䌀䔀䘀㠀㔀䈀䐀㤀㔀㘀䔀㔀㘀䌀䘀㘀㘀䌀㘀㔀㠀䔀䘀䘀㐀㈀䘀㘀㐀㈀䔀㔀㈀㈀䘀䘀䄀㔀䔀䌀䄀㔀䌀䄀㈀䄀䘀䘀㜀㔀䔀䌀㜀㔀䌀䄀㐀䐀㜀䔀㤀䐀䘀㔀䔀㌀䔀㠀䈀䌀㠀㤀㠀䌀㔀㠀㄀䐀㤀㈀㌀㔀䔀䘀䈀　㠀㌀㘀㜀㐀㄀㘀㈀㤀㐀㘀　䔀䔀㈀䈀䄀㜀㄀㤀㤀㘀㠀㔀㄀䌀㠀䘀䈀㠀㐀䘀㐀㈀䘀　㈀㌀䄀䄀㤀䄀䄀䔀㈀䈀㌀䔀䄀䘀㘀㤀䔀㈀䄀䘀㐀䘀　䄀㈀㄀䈀䘀䈀䄀䈀䐀㠀䘀䄀㔀㐀㈀　㤀㜀䌀㔀㘀㐀䌀　䘀㌀䔀㔀䈀㐀䈀䘀䐀㠀㈀㤀㠀䄀　㔀㠀㌀䌀䄀䘀　㠀䔀㄀㌀　䄀　㐀㈀䄀䌀㈀　㤀㐀䘀䈀㐀㌀㌀䔀䈀䘀㌀䘀㘀㐀㈀䄀䄀㈀㔀㠀䔀䔀㌀㜀㄀㄀㘀㤀㜀䄀㄀㐀㔀䐀㐀䘀㄀㠀㄀䔀㤀䘀㘀㄀㜀㠀㐀䌀㔀㄀㄀㄀㐀㈀㜀䔀㔀㘀䘀㜀㄀㠀　㠀㠀䌀䐀㄀㔀䈀㘀㈀䔀㤀㤀　䄀㄀䔀䈀䄀㈀㠀㠀䐀㠀　　䈀䐀䄀㜀㤀　㘀㤀㜀䄀㌀䌀㤀㐀㄀　　㤀　㘀㈀㌀䌀㘀㜀㐀㄀㄀㈀䌀䄀　㄀㈀㘀㠀䌀㔀㄀㘀㔀　㜀䔀䘀㐀䈀　㈀㠀㄀㘀㈀䌀㄀㠀㐀㠀䔀　㐀䄀䈀䘀㜀　㜀㠀㄀　䐀䌀䈀㔀䌀㌀㜀㘀㄀䔀䘀㈀㤀㄀䘀　䈀䌀㤀㄀㐀㠀㘀㠀㘀㐀㈀㐀㄀㈀㄀䔀　㤀㤀䐀㌀㜀㘀㌀䌀㔀䐀㤀䔀䘀㄀㜀㌀䐀　㘀㌀㜀　㠀㠀䔀㤀䐀　㔀㘀㜀䌀䔀㤀　㔀䈀䔀㈀㌀䈀䄀䘀㌀㐀㈀㐀㌀䔀䘀䔀㠀㐀䐀㠀㜀㈀䄀㌀㘀㘀䔀䌀䐀䘀㠀䘀　䔀䔀䐀䘀䈀㔀䐀䄀䄀䘀㐀㠀　䐀㠀㔀䌀㐀㜀㘀䌀䔀䔀㈀㤀㄀㄀　䄀㔀㌀䌀㈀㐀䐀㄀㄀䈀㘀　㠀㔀㐀䄀㄀㤀䘀䐀㔀㤀㔀䌀㘀䌀䘀㠀㤀㈀㐀㌀㠀㐀㄀㜀㜀㘀䐀䔀䌀　㜀㜀䐀㠀䄀䌀㔀㔀䄀㜀㠀䔀㈀　㘀㈀　䔀㤀㤀䄀䈀㔀㜀㤀䄀䄀㄀㠀䔀䔀㈀䌀䐀㄀㠀㤀㤀㘀䄀䄀㤀㠀　㠀　䈀䐀　㤀㘀　㄀䔀㠀㄀㜀㤀䌀㠀䄀㘀㄀㄀䌀㌀䄀䈀㜀㘀㔀䌀㔀㘀䈀䌀䈀㠀䄀䐀㜀㐀㐀㈀㜀㘀䘀　䈀䄀㠀　㐀䈀㠀㜀㈀㄀㠀㠀　㄀䘀㄀㔀㘀䔀䘀䄀䐀㔀䈀䈀䄀㤀䌀㠀㄀㐀　㤀　㐀㌀䘀䘀䌀䘀䐀䘀䌀䌀䄀㔀㠀䌀㌀䘀䈀䈀䘀㈀䌀㔀䌀䈀䐀䈀㜀䘀　㤀䈀㘀䄀㌀䔀䔀㠀㈀䈀䈀䌀㠀㐀䈀　䈀䌀䔀㌀䘀䈀䘀㜀䘀䐀㈀㔀㐀㔀䈀䘀㌀㌀㄀㈀㈀㤀㜀䌀䘀㐀䐀㜀䈀䈀䘀䄀䔀㤀㤀䘀㤀䘀㤀䄀䌀㤀䔀㐀㌀㜀㈀㜀㔀㘀㤀䌀㜀㌀䘀䄀㌀㄀　㜀䐀㄀㘀㜀㈀㄀䌀㤀䘀㈀䐀㈀㠀䈀㠀㤀䄀㜀㈀㄀㔀㌀㐀㘀㐀㤀䈀䄀㐀㈀㜀㜀䔀㤀䘀䔀㤀䌀䄀㜀㔀㠀䈀䐀䄀䔀㠀䐀䌀㤀㠀䐀㔀㤀䈀䌀㈀㠀㠀䌀㄀㔀䈀䘀䈀㌀㔀䌀㔀㄀㜀㐀䐀䌀㤀䘀䄀䄀㘀㌀䐀䔀㠀㐀㌀㜀䔀㐀㔀䔀㄀㐀䈀䘀䔀㐀㘀㈀㔀㠀㜀㔀㌀㤀㘀㐀㘀　㠀㘀㐀㄀㐀　㠀㘀䈀㔀㘀㘀䄀䐀㜀㜀　䄀㤀㠀㐀䌀㐀䘀㄀㄀䄀㘀㠀㠀㔀㌀䐀㐀䄀㤀䐀䄀㈀㐀㜀㌀䈀㈀㔀㜀㌀㈀䈀䐀㌀㠀㈀㜀㘀䐀䔀㈀㠀㌀䔀㘀㈀㐀䄀㈀㔀㔀䔀㜀㔀䌀㤀䄀䄀　䈀㘀㔀㘀䔀㌀　䌀㜀㔀䌀㈀䌀䐀㘀㄀㜀䘀㄀䐀㜀䌀㔀䐀㠀㘀㘀㤀䄀㘀㤀㘀䄀䘀㤀㄀䔀䈀䈀㐀䈀㐀䐀㤀䌀㘀㐀䌀㄀㔀䄀㘀䌀䄀䘀㠀㄀㔀䌀䘀㄀㔀㈀䔀㘀㐀䘀㈀䌀㈀㌀㈀㜀㤀䄀㤀㜀㘀䄀㄀㜀㤀㌀㤀㔀㠀䌀㄀䄀䌀㄀㐀㔀㘀䌀㤀㔀㜀㘀䄀㈀䈀䌀䌀㜀㔀䌀䌀㠀䐀　㈀㜀㘀㄀䈀䈀䔀㘀䔀㜀䔀䐀䐀䈀䈀㠀㄀䈀㤀㤀㌀䈀䘀㔀㌀䈀䄀㠀䘀㄀㤀㄀㐀㜀㘀㤀䈀㈀䘀㌀　㈀䘀　㤀㘀䘀㌀　㜀䘀㄀㐀䐀䔀䐀㐀㔀䔀㌀㜀㌀䘀㘀　㠀䔀　䄀㐀㜀䈀㔀䘀㜀䌀䐀㜀䄀㠀䔀㠀䌀㄀㌀㔀㄀㌀䌀䌀㠀㐀䔀　䘀䔀　䄀㌀㈀䌀䔀　㈀㌀　㈀䌀䌀䌀䘀䘀䄀㌀　䔀㄀䌀㠀䄀䌀䄀䌀㔀　㜀䔀㤀䘀㄀㄀㤀㈀㌀䌀㄀䌀䘀㘀䌀㄀㠀䘀㔀䄀㄀䄀䄀㘀　䌀㠀䔀㠀㈀㈀䄀㔀㈀㌀㄀㄀　㤀㈀䄀㠀㌀䌀䔀㘀㔀㜀䌀㐀㄀㘀䈀㘀㜀㠀䔀㘀㤀㄀㘀㐀㠀䄀㈀㈀䌀　䐀䘀㘀䌀㐀㔀㈀㌀㜀䈀䌀䌀䄀䈀㘀䈀䄀䄀　䄀　䌀㐀㌀䘀㔀㤀㠀㔀䔀䄀䘀㠀䌀䈀㘀　䐀䄀䄀㌀㈀䄀䐀㜀㠀㈀㔀㄀㤀㜀　　㘀䘀㐀㠀䄀㤀㈀䐀㜀㤀䈀䄀　㐀㐀䄀㐀䄀㈀㐀㔀㄀䄀䄀䄀㘀䄀㐀㈀䄀㄀㜀䐀㠀䄀㐀㈀㈀㌀䘀㔀㐀㈀䐀㌀㄀　㜀䄀㔀㔀㔀㔀㔀㄀㈀㠀䄀㄀䐀㄀　䘀䘀䌀㐀㠀䐀㈀㄀㈀㠀䄀䄀㔀㐀　㠀㐀㘀㌀䌀䈀㜀㜀㈀㜀䄀㐀㈀䐀䐀㈀㤀　㐀㐀㐀䈀㠀㌀㘀　㜀　䐀㜀㜀㈀㐀㜀㤀㌀　䌀㔀䄀㄀㈀䐀㜀㘀䘀㄀㤀㤀䐀䌀㘀　㄀㠀㌀㌀㘀䐀　㐀䐀㤀㘀㤀㐀䄀　䌀㈀㌀䔀䘀䘀䈀䔀㈀㐀䐀㘀㈀㐀㤀㤀䘀㌀㐀䔀㘀　䘀㤀䌀䈀㠀㜀㠀䔀㠀㐀㠀䘀䔀㔀㠀䘀䔀㔀㄀㄀㐀㄀㐀㐀㌀　㌀䘀㐀䔀　㘀㌀㜀䈀㈀䔀㌀䌀㐀　䐀䈀㜀䔀䌀䄀㈀㌀䘀䈀䄀㠀䔀㈀㔀䄀䌀㔀䐀䐀㠀㔀䘀㜀䄀䈀㈀㈀㔀㘀䌀䘀䘀㄀㈀䄀㈀㄀䔀䔀䌀䘀㠀㘀㘀㔀㄀㈀㘀㠀㠀䔀㜀㈀䔀䔀㌀㄀䌀㐀㈀㌀㠀　䈀䈀　䐀㜀㄀䔀㠀䄀㘀㘀㐀䐀㔀䌀㄀䄀㄀䌀䌀䐀㜀䄀䔀䐀㄀㌀㠀㌀㜀䈀䘀㜀䄀㈀㔀㤀䄀㄀㈀㈀㤀䄀䌀㔀　㌀䌀㤀㜀㘀䌀㘀㜀　㔀䔀㘀䄀䌀㠀㠀䄀䌀㜀䈀㈀㔀䔀䔀㐀䔀㄀䐀㌀䔀㠀䄀㄀㘀䄀㠀㄀㘀　䈀䈀䐀㜀　䌀　㐀䌀䘀㄀　㐀㐀㐀㐀䐀㄀　䌀䄀㈀㘀㐀㤀䌀㤀㜀㤀㠀㘀　䄀㈀䐀㜀㌀㐀䈀㌀䈀㈀㔀㈀㤀㘀㌀䌀　㌀㔀　㘀㔀䌀㤀㜀㘀㔀㤀䌀㈀㄀㐀䌀㐀㤀㐀䔀㈀　䐀䄀㈀㘀䈀䐀䔀㈀　䈀䄀㠀㘀㈀㤀㠀㠀䄀㠀䘀㄀㔀㈀㔀䄀㈀䄀䈀㘀㐀䈀㐀　䘀㜀㄀㜀㄀䐀㤀㌀䔀㠀㘀䔀㔀㔀䌀　㤀㤀㐀㌀䔀㠀䔀㐀㈀䈀㜀　䈀㠀　　㠀䌀䔀㤀㌀㤀㔀㜀㘀䄀㐀㔀㌀㠀䈀㤀䄀　㜀䌀　　䄀㐀　䈀㈀䄀㈀㜀㤀䔀　㔀䄀䄀䘀䘀㌀　㌀㈀　㈀㌀㌀䌀㜀　䈀䘀㜀䌀㐀㤀㌀㄀㌀䘀䐀㠀㔀㈀䐀㜀　㄀㠀㌀䔀㔀㜀䐀㠀䈀㐀䄀䔀䄀㌀㜀㌀㄀㄀䈀㠀㜀䐀㘀㐀䐀䔀䘀　䔀㜀㔀　㘀䔀㤀㠀䐀㐀㔀㤀㔀䔀　　㜀㠀䘀䄀䈀㐀㘀㌀㜀䘀㈀㤀䈀　㠀䈀䐀㠀㔀䘀㌀㈀䔀䈀㤀㠀㌀㜀　䄀㈀㈀㐀䄀㤀䌀　　䈀㔀䌀㐀　㤀㜀　㐀䌀䄀㈀㘀㈀㌀㜀㠀㤀䌀㈀㄀㔀䈀㔀㈀㄀㄀㠀㘀㜀㤀㔀㄀㔀䄀㜀㈀㠀㌀　䌀㠀㄀　㤀䐀䔀䔀㜀㔀䔀䌀䈀㌀䔀㄀㄀㈀䘀䈀䔀䌀㔀㐀㠀㤀㈀㜀㌀㤀㘀㘀䄀䈀䔀㤀㘀䔀　㄀㠀㘀䔀䈀䈀䌀㈀㠀䘀䘀䌀㈀㜀㤀䐀㤀㤀䐀㄀㌀䌀㐀䄀㤀㌀㐀㌀㌀　䐀䔀䐀䐀䈀　㜀㜀䐀㘀㘀㄀　䌀䈀䔀䌀　㜀㤀㘀㠀㘀　㠀㈀㘀㠀䌀　䔀㌀㐀㌀䔀㠀㠀㌀㠀䐀䔀㄀㘀㈀㈀䔀㈀䘀䌀㐀㜀㘀䈀㄀䄀㈀㈀㤀㠀㄀䄀㜀㐀㌀　㤀㄀㄀㐀　䈀㜀㔀㔀㈀䄀㌀䌀㘀㔀䌀　㄀䄀䔀䔀　䄀䔀㤀　䐀䘀䔀㄀㄀㠀㈀䌀㄀䘀㤀䌀䌀　㠀䈀㄀䌀㈀㜀㜀㈀䈀㐀㈀㠀㈀㤀䈀㠀䄀㘀㌀㤀㈀㄀䌀㤀㌀䔀㐀㤀㤀㈀㌀㤀㤀䄀㄀㌀㘀㤀㄀䌀㈀㠀　㠀䔀　䄀䈀㜀㐀　㈀　㈀㘀㐀㘀　　㄀㐀䔀㤀㄀㌀㤀㠀　㔀䌀　䔀㈀　　䘀䌀㈀䈀　㈀㔀㐀䄀㄀㈀㄀㈀㄀㤀㘀㐀䔀㜀㘀㤀㠀㌀㌀　㘀㐀㠀㤀㠀䄀㜀㠀䈀䔀㈀㔀䘀㔀㐀㠀㄀　　㤀䌀㔀㈀䔀㐀䈀㤀㔀㘀㔀㈀㔀㐀㄀䐀㄀䔀㜀䌀䘀㠀㜀䘀㜀㄀　䔀㄀䐀㠀㘀㔀䔀㄀䈀㤀㔀㤀㌀䔀㌀㜀　㠀㘀㘀䌀㤀䌀㐀㐀㄀㔀㈀㄀䌀䄀㜀䔀㠀㌀䐀䌀㜀㐀䐀㠀㈀䄀㄀　㄀㔀㔀㜀㌀　㐀㠀㘀㄀㠀䔀㜀䐀㠀㄀㜀㌀䄀㘀㘀㠀䌀䐀㠀䄀㜀䘀㜀䈀㄀㈀䘀䐀㐀㠀䔀㘀㠀㤀㈀䔀䔀㐀㘀㤀䄀㘀䄀䔀㌀㠀㐀㐀䌀㐀㘀㐀　䐀㘀㄀㜀㐀䈀㌀䄀㔀㌀㌀　䈀㔀㄀㄀䘀㜀䄀㌀㄀㠀䔀㠀㌀　䄀㜀㌀㜀㠀㠀䈀㐀㐀㠀䄀䌀䄀㐀㄀㌀㐀㔀㔀　㐀㐀㠀㔀䐀㤀㠀㌀䔀　㤀㜀㄀䔀㌀䐀㘀㄀㜀㜀㘀㐀㘀㄀㌀㜀㄀㤀㤀　䔀　㤀㜀㐀㠀㐀䄀㐀㌀䐀　　㌀　㤀䌀㘀㌀䈀㌀䈀䌀㈀㌀㠀䄀䔀䈀㔀䔀㐀㄀䘀㌀㈀䄀䐀䄀㌀㘀䌀㜀㘀　㈀㤀㤀䌀㌀䔀㄀㈀䔀㘀㤀䈀㔀㠀䌀㄀䌀㠀㐀㌀㄀㠀䔀㈀㔀㌀㌀㄀㐀㠀㠀㈀䈀㌀㘀䌀㘀䈀㔀㄀䔀㌀㠀㘀䐀䔀㐀㌀㜀㄀䘀㠀㄀㘀㐀䔀㜀㠀䌀㌀㌀䈀䘀　䄀㘀㈀䔀䘀㠀䐀䔀䌀㠀㘀㔀㜀䐀㄀䘀㌀　䄀㌀㌀㘀䘀䈀䔀䘀㤀䐀䄀㈀䐀㘀　䘀䈀㜀　䐀䘀䌀㠀䘀㜀䈀　㘀䘀㔀　㠀䈀䈀䌀䐀䈀㔀䔀䌀䌀㤀䈀䔀　　㈀䐀䈀㐀㘀㈀䈀䈀㄀䔀㜀䈀䘀㌀㠀㔀㠀㘀㌀㘀㜀䌀䔀䐀㐀䈀　䈀㐀䔀䄀䄀䄀䄀㜀䘀㔀㔀䌀㜀　㠀䔀㜀　䄀䔀㐀㠀㐀䈀㠀㈀㈀䌀㌀䄀䈀㘀䈀㈀䄀㔀㈀㤀㤀㐀䄀㘀　㈀䈀㤀㔀䌀㐀㄀䌀㘀㐀㤀㌀㤀㠀㜀䐀　㜀㄀䄀㐀䈀䐀㘀㌀㘀㐀䈀䘀㠀㌀㠀䌀㤀㤀䄀㜀㄀㤀䈀㐀㜀䘀　　㌀　䄀㈀䌀㐀　㠀㤀㈀㤀㐀㈀䔀㐀䈀䈀㘀䐀㘀㐀㠀䔀　㜀㌀䔀㐀㘀䄀㈀㔀　　㠀㌀䌀䌀㄀㈀㐀㘀䄀䄀㤀㄀㘀㌀䄀䐀　　㄀䘀㌀　䘀㜀䘀㐀䄀㄀㌀㌀㠀㌀䈀㤀䌀㠀㠀䈀䄀䘀䄀㈀䘀䘀䌀㈀㤀㘀䘀㌀㄀䌀㤀㐀䄀㔀㜀㈀㠀㐀㠀㤀䐀㈀㔀䔀㠀　㈀㜀䈀㠀㌀㄀㘀㠀㘀䈀䄀㌀㄀㐀䐀䘀㈀㐀㔀㠀䌀㠀䌀　㤀䔀䄀䐀㜀㐀䌀㠀㐀　㠀䔀㘀㠀㠀　㘀㈀䈀㤀　㔀㔀㐀㔀㠀䌀㔀㜀䔀㈀䐀㌀㈀㌀䐀䔀㘀㤀䐀㐀　䔀　㠀㘀䄀䈀㠀㈀䐀䈀䔀㜀㤀䐀䔀㠀㘀䔀㌀㜀　䔀㄀䈀䌀㌀䌀㔀㐀㈀䔀㤀㜀㘀㐀䘀㤀㘀䄀䌀㈀䘀㄀㤀䈀㌀䐀㘀㠀䐀㔀㄀㐀䘀㌀㌀㄀䌀䔀䈀㘀㄀䔀䐀㄀㈀䐀㈀　㔀㐀䐀㘀䄀㜀㜀㐀㐀㔀㠀㤀㄀䌀䌀㠀㈀㔀　㄀㈀䌀㌀䐀㔀㌀䈀䈀䈀䌀㈀㔀㤀㔀㠀㐀㄀㌀㘀㈀㤀㐀㌀䘀　　䘀㘀䐀　㜀㈀㔀㤀㄀䘀㈀㔀㐀㘀㐀㈀㌀㜀㌀㈀䌀䘀㄀㠀䈀㌀㤀䌀㜀㈀䘀䌀䔀㌀㐀㤀㌀㄀㤀㜀㄀䄀　㘀䐀㌀㈀㜀㘀㠀䔀　㄀㤀䘀䘀㐀䐀㜀䌀㈀㐀䘀㌀䄀䌀䘀㄀䐀䘀䔀㄀䐀㄀㌀㄀㤀㜀䔀㘀㤀　㤀䈀䐀䄀䐀㤀䘀㜀䔀䘀䄀䐀㈀䐀㤀䌀䘀㌀䌀㌀㌀䌀䌀㔀䘀䘀䔀　䌀㠀䔀㤀㐀䌀䘀㄀䔀㌀䐀䌀䄀䌀㐀㤀㠀䄀䘀㔀　䘀㠀䐀䈀㘀䄀㈀䈀㠀㠀䄀䘀㔀䌀㈀䘀䄀䄀㘀㈀㔀䐀㔀㠀㠀䐀䐀㐀䐀㔀䄀䄀㜀㔀㜀㔀㔀㤀䈀㔀䌀䐀㌀䘀㌀㤀㌀䄀䈀㔀㘀䔀㔀㘀㔀䐀㔀䔀䌀䐀䐀㜀䄀䐀㔀㐀䄀䘀䄀䌀䔀䈀㘀䄀䈀䄀㔀㌀䐀䐀㔀　䘀䈀㠀㌀䌀　　䘀㈀㌀㐀䘀䄀䄀䘀䔀㄀䄀䈀㜀　㠀䄀䔀㤀䄀㐀䌀㜀㜀䌀㌀䐀㐀㄀㌀䔀㄀䄀㜀㘀䄀　㘀䌀㈀㜀䈀㘀䈀䘀㘀㠀㜀　䘀䐀㐀䘀䌀䐀䔀䘀䘀㜀㘀㠀䐀㜀　㜀㘀　　㤀㐀䔀㌀㠀　㤀㄀　㜀䈀䈀䄀㤀䄀㘀㌀㤀䐀㘀㐀䐀㌀㘀　㤀㈀䈀䐀䘀䘀㤀㤀㠀㠀䄀　㜀䔀㌀䄀㄀㐀䌀㜀䐀㔀䐀㘀䈀㤀㘀䌀㤀䐀㘀䌀䘀㘀㈀䌀䔀䄀䐀䌀䘀　㤀㐀䈀㌀㈀㤀㜀　㤀㔀㜀㘀㘀䐀㘀㈀䈀㄀䈀㤀㔀㤀㜀㤀㐀䌀䘀䐀㔀䌀䘀㌀㌀㤀䔀䌀㤀䄀䐀㄀䄀㘀　㠀䌀䌀㘀㔀㐀㘀䈀䈀　㌀㤀䔀㤀　䈀㈀䐀䄀䘀䈀䐀䄀㘀㄀㘀䐀㘀䌀㘀㄀䄀䈀㔀　䔀䔀䐀㄀䔀䔀䐀㄀㄀㘀䐀㔀㐀㘀㌀㄀䘀䐀㄀䈀㘀㘀䈀㤀䘀㘀㠀䈀㐀䈀㘀䐀㜀㠀㔀㤀䐀䐀䐀㌀㤀㐀䐀㜀㄀䄀㘀㄀㤀㜀䔀䔀㠀䌀䔀㌀㜀㌀䌀㘀㄀䘀㤀䘀　㤀㐀㈀䈀㠀䐀㜀㐀䄀㈀㘀䄀㄀䌀䔀䔀㔀㐀䐀㔀䐀㈀　䔀㈀㘀㘀䄀㈀㄀㠀㈀㜀㠀䈀䈀㜀㈀㤀䄀㄀㘀䄀㌀㠀㌀㠀㌀䘀　䄀㤀䈀䔀㤀　䔀䐀䄀䔀䔀㈀㠀㠀㜀㘀䈀䐀㈀㐀㤀䐀䈀㤀㌀　㜀㐀㤀䘀㈀䘀㄀㘀䔀㌀䄀㤀䔀㈀㘀㜀䄀㄀㘀㘀㔀㐀㐀䈀䌀䐀㌀㄀㔀䄀䄀䔀䈀䐀䐀㠀䈀㠀㤀㠀㤀䄀㘀䔀㠀䌀䄀䈀䐀䈀䘀㠀䄀䌀　㐀㈀㤀㠀㜀㤀䐀㈀㐀䄀㈀㤀䌀䄀㌀㌀㠀㈀㈀䘀䔀㔀㔀䌀㤀㄀㐀　䔀㄀䔀㌀㠀㈀㄀䌀䔀㠀䘀䔀䌀䔀　㐀㄀㠀䄀䌀㄀㠀㠀㤀　䌀㈀䐀㔀䐀㜀䈀㠀㜀䈀㌀䌀㠀㔀㜀㌀　䔀㜀㠀㌀䐀㔀㌀䈀㠀㘀㈀㔀　䌀㘀㘀䘀㌀䈀㐀㔀䐀䔀㜀　䌀䄀㠀䐀䄀㠀䄀㐀　㘀䔀㄀㐀㔀㤀㘀㔀㘀㘀䐀䔀㄀䌀㤀㐀　㠀㤀㜀㐀㔀㌀㜀䄀㜀䈀㤀䄀䌀䐀䔀㈀㄀䌀　㘀㠀䔀䈀㔀䄀㔀　㜀㐀㜀㔀䘀䈀㜀㠀㤀䈀䐀䄀䔀䌀䘀䐀㄀㤀㜀㐀䈀㐀䘀䌀䌀㤀㈀䐀䄀㠀㄀䘀㈀䌀䄀䐀㘀䄀㘀䔀䌀㔀　㄀㘀㘀䔀䌀䐀㠀㈀㘀䌀㄀　㐀䘀䔀㌀䌀　㈀䘀㄀䔀㄀㐀䐀䌀䐀䄀㤀㐀㘀　㔀㔀䄀㠀䄀㈀䐀㄀㄀䐀㐀　䐀㌀䔀㠀䈀䄀㌀㄀㠀䐀䈀㘀㈀㠀㔀䄀㤀䔀㔀䌀㘀㌀䔀䄀㜀㤀䔀䔀　　　㜀䔀㌀㔀䌀　㜀　㜀㌀㤀㤀䘀䔀䈀䐀㄀䘀䈀㠀䄀㌀㌀㘀䌀䔀䌀䐀㜀㤀㤀㤀　䔀㌀㌀㐀㤀㈀㐀䌀㈀　㠀㠀䌀㜀㠀㔀㐀㠀㄀㘀㠀㄀䘀㐀䌀㔀㜀㌀㈀㐀䌀䈀䌀㤀㘀㤀㈀㐀䄀㌀㐀　䌀䄀䌀㈀䈀㤀㠀㤀㔀㌀䌀㘀　䄀㜀㤀䘀㄀㐀㠀㌀㐀㌀䈀䔀䄀㤀㜀䌀㤀㄀㠀㐀㠀㐀　䌀㠀㄀㐀䈀䈀㘀㌀䌀㔀㔀㠀　㘀䌀㤀㜀䌀㘀㘀㠀䔀㄀䌀䌀㄀䘀㄀㠀䈀䌀㌀㤀㤀㠀䔀㘀㌀䔀㠀䔀㤀㘀㄀㜀䈀㄀䔀㔀㠀䘀㄀㌀䘀㜀㜀䐀䈀㌀㄀㔀㔀㜀㜀䄀㘀㄀㄀㐀㔀䔀㈀䘀䘀㘀㐀䐀䄀　㜀䐀㔀㄀䐀䐀䐀㐀䐀䐀㄀㤀㤀㠀䌀䄀㈀㘀㠀䈀㔀㠀㌀㜀㐀　㌀㐀䔀㠀䌀䌀㘀䄀䄀㈀㔀䈀䄀㤀㤀䐀　䈀㐀㄀䌀　䄀　㘀㘀㌀㌀䔀㜀䈀㠀䔀㄀㄀㔀䘀䄀䌀䔀䘀䔀䔀㈀　㈀䐀㔀㘀㈀㐀䈀㔀㠀㔀㄀㌀㔀䈀䄀㐀䌀㐀㄀㈀䌀㜀　㐀㈀㜀㤀㌀䈀䘀㤀㌀㔀䄀䄀䈀䔀䐀㤀㄀㄀䘀㔀䘀㠀㄀㈀㐀㐀㠀㄀㠀䘀　䘀䈀㜀䐀㠀㄀㘀　㘀㔀㤀䄀䔀㘀㜀㠀　䐀䐀䄀㈀䐀䄀䄀䔀㠀㈀㘀䈀䄀䘀䐀䐀㈀䘀䘀㔀㠀䈀㤀䘀䐀䐀㤀㜀㌀䄀䔀㌀䐀㜀㜀䐀㈀䄀䄀㠀㌀㤀㜀㠀㌀㤀㘀㄀㤀㤀䈀㘀䔀䈀䐀䄀㄀䄀䌀㌀㜀㜀㐀䘀㔀㈀䈀㜀㜀㘀䌀㜀䄀䄀䄀䐀㌀㄀　㠀㌀㄀㔀䌀䘀䌀㘀㠀㈀㔀䘀䐀䈀㜀䘀䌀䐀䈀㈀䔀㘀䄀䈀䄀䔀䈀䌀䔀㈀䌀㜀䔀㤀䈀㈀㘀䘀㈀䐀㤀䌀䘀㤀䘀㐀䔀䐀䔀㜀䐀䐀㜀㘀㤀䔀㐀䘀㔀㌀㈀㌀䄀㤀㈀䄀䔀㤀䔀䄀㠀㘀㌀㌀㤀㘀㜀㐀㠀㜀䈀䄀䔀䘀㤀䄀㘀㌀㔀䐀㌀䌀㜀䈀䌀㈀䘀㔀䌀㜀㐀䘀䐀䘀㜀䔀䌀㘀㄀㐀䘀　㜀㘀㐀䐀䌀䌀䄀㠀㤀㤀䐀㜀㜀㠀㘀䔀䐀㜀㐀㔀䘀㌀䌀䘀䘀㠀㌀䄀㤀㘀䔀㌀　䐀㐀㠀㠀䔀㜀㄀䈀䐀㠀䈀㐀㄀㤀㔀㐀㄀㤀㌀䌀㠀䘀㄀㐀䐀㠀　㔀㔀䘀㐀㄀㐀㌀䈀㠀㤀㤀䐀䌀㄀䈀㈀㄀䐀䘀㄀䐀䔀㌀㠀㠀䌀䌀㜀㈀䈀㘀㈀㈀䐀䈀㄀㌀㌀㘀㌀㘀䈀䔀㈀㔀䈀䔀㈀䐀䌀㔀㐀㘀䘀㜀䈀䄀　㌀䐀㌀㈀㌀㜀㌀　㌀㜀㤀㈀㄀㜀䘀㈀䔀䄀㘀㈀㌀䐀㄀䘀䘀㠀㘀䄀㘀㐀䄀㔀䈀　㔀䄀䈀䐀㐀㈀䈀䘀㌀䄀㜀　㜀㔀㘀㐀㈀㠀䘀䔀䄀㘀㜀㈀㌀　㜀㠀㌀　䘀䌀㤀䔀䘀㜀䄀㌀䔀　㐀㜀䔀㄀䘀䘀㈀䔀㌀䈀㄀㐀㄀䘀㠀䐀㠀㜀㄀㌀㘀䌀䄀㌀䐀䔀䔀㠀㘀䈀㘀㈀㌀䈀㜀㐀㠀䈀㤀䐀䄀䈀㜀㜀䈀㈀㤀㜀䈀㄀　㜀䌀䈀䘀䔀䌀㘀㤀䌀㌀㈀㄀㐀䌀㌀䄀䘀㌀㄀　㠀㜀䔀䄀㈀㌀㄀㘀㐀䄀䄀㐀㠀䘀䔀㤀㠀㈀㘀䔀㌀䔀㘀䈀䘀䈀㄀䄀㐀㐀㌀䄀㠀䌀㐀䈀䐀㈀䐀㌀㘀　㈀㔀䄀㄀㔀䈀㤀㔀　䔀䄀㄀㔀㄀㤀㄀㠀䈀㈀㈀㔀㜀㜀䌀㤀㌀䐀㌀㈀㘀㌀䘀㜀㄀㤀䌀㤀㐀㐀㘀㘀䔀㔀㤀　㔀㌀䔀㤀㜀㘀䐀㈀䌀䐀䈀䘀㄀䐀㜀㜀㐀䈀㘀䐀䔀䐀㄀㄀㤀　㌀㈀㤀䔀㌀䈀㐀㈀㄀㈀㤀䘀㈀㐀㄀㐀㠀䐀㔀㤀㐀㤀䈀䔀　䔀㈀㤀㄀䔀㠀㜀　㤀㌀䐀㌀㘀㄀㌀　䔀䔀㐀㌀䌀㈀䐀㤀㐀䔀㤀㄀㘀㌀䄀㌀　䄀䄀㔀䈀䔀㠀䌀　䐀㠀㤀㔀㌀㄀㈀㐀㄀䄀䐀㤀㔀㈀㜀㐀䐀㐀㘀㤀㘀㜀䐀㘀㔀㈀㌀㠀㐀㜀㔀㜀㐀㄀㌀㠀　㐀䌀　㄀㘀䈀　㄀㔀䘀㐀㠀㈀䔀㌀㠀　㠀㤀㠀㌀　䔀㌀　㄀䘀䐀　　　㠀㜀㌀　䈀㄀䐀　　㈀㌀䌀㜀㐀䄀㄀　䌀㠀䈀㄀㜀㈀　䐀䌀　䐀㐀㠀䐀䌀　䘀㤀㠀㤀㠀䈀䈀　㄀䔀㄀㘀䔀㘀䌀䐀　䘀㜀㘀㌀䈀㄀㈀㈀䈀㜀　㘀䘀　㔀䈀　㘀㈀㄀䐀㈀㤀䔀㐀㄀䐀䄀㄀㠀㐀㄀䈀㠀䘀䌀㤀䌀䌀㤀䔀㌀㐀㈀㜀㐀㤀㠀㜀㄀䐀㜀䐀䄀㌀䐀㄀　䔀㐀䐀䄀㘀㄀䌀㐀䘀䌀㈀㌀䔀㌀　㔀䌀㈀㐀䔀䔀　㜀㘀㤀　㌀㘀㐀㄀㔀䈀㤀㄀㜀㜀䄀䘀㐀㔀　䌀䐀䐀　䘀㈀㐀㐀㌀䘀㌀䐀䈀䌀䐀䐀㔀㌀㈀䌀㌀㐀㔀㐀㤀㜀㌀㌀㔀䌀㜀䐀䈀㐀㌀㜀㈀㌀㌀㔀㤀㌀㜀㔀㐀㔀䄀㠀㤀㌀㠀䈀㠀䄀䐀䄀㔀䈀㤀㄀䌀䘀䄀　䐀䄀䄀䈀㈀䄀㈀㤀䄀䘀㘀　㔀㐀䈀㈀㘀　㔀㌀㐀䘀䌀䈀㐀㜀䘀䔀䐀㠀䔀䄀䘀㘀䐀䔀䘀䈀㘀　䄀㤀䘀䘀䔀䔀㜀䈀㌀䄀䈀㘀　䔀䈀䌀㈀䔀䘀䄀䔀䘀䘀䐀㤀㐀䘀䐀㘀䄀䐀䘀䘀㄀㤀䈀䈀㘀㜀䔀㐀㘀䘀䘀㜀䌀䌀䈀䘀䔀㜀䐀㜀䐀㜀㄀㘀㌀䔀㈀㤀䈀䌀䘀䔀㌀　䈀㠀䘀䘀䘀㤀㠀㔀㜀㜀䈀䐀䘀䌀㤀䈀㔀㜀㔀䔀㜀㠀㄀㤀㘀㤀䌀㄀䌀䔀䐀㄀䄀㌀䘀㐀㌀㄀䄀㐀㌀㜀㈀㈀䘀　㘀㈀㔀䈀㜀䘀　㜀㐀㜀㠀䘀䈀䈀㄀㘀䄀㄀䔀㐀䈀㘀㌀䐀㠀䈀㈀䔀䄀㄀䈀䈀㠀㐀䔀㄀㄀㈀㜀㠀㠀䈀㐀䄀㘀㌀㘀㠀䄀䐀䐀䄀䄀䐀㌀䄀䐀　㌀㄀㜀䌀㜀㘀㔀㈀㘀䈀㈀㠀㤀䄀㘀㈀䌀䌀㤀㠀䌀䌀㠀㜀㘀㈀㠀䌀　䌀㌀㐀㌀䘀㈀䘀䔀　䈀㔀䔀㘀䌀㤀㔀䄀䘀㌀䄀㐀㤀㌀㤀䘀㌀㜀䘀　㔀䄀䘀㌀㐀㐀䔀䄀㔀䘀㜀䔀䘀㔀　㔀㤀㈀㐀䔀㌀㄀䘀㘀䔀㜀㤀䈀䘀㄀㠀㌀䘀㐀䔀㤀㠀䈀　䄀㠀㠀䌀㜀䌀䔀䘀㈀㤀䔀㄀㔀䈀䌀䌀　㜀䈀㐀㄀䈀　䌀䈀䐀䈀㄀㔀䘀䌀㈀㄀䘀䌀㈀㄀䘀䐀　㌀䘀㔀㜀㄀䔀㌀䘀㄀㠀㠀㈀㈀䄀㠀㘀㄀㘀㤀㈀㔀䈀䌀㤀㈀㔀䔀䌀㤀䄀䔀㔀㌀䐀㘀䄀㠀㌀䐀䔀䄀㄀㌀䌀䄀㈀䔀㜀㄀㐀　䐀䄀䄀㔀㈀㠀　㄀㘀㔀㠀㌀䘀㈀䐀䘀㤀　䐀㘀㈀䄀㤀㘀䔀䈀䐀㜀䔀㠀䈀㜀䔀䄀䈀㐀　䔀㤀　㄀䄀䈀　䐀㈀㐀䐀䄀㐀㌀䄀䈀䔀　䈀䈀䐀䄀䐀㈀䐀䐀㐀㔀㘀䔀䄀㄀　㜀㔀㄀䌀䈀㤀䌀㄀䈀䄀㈀䔀㔀㌀㘀㌀䔀䘀㌀㄀㠀㘀䐀䔀㌀䄀㄀㤀䔀䈀㌀㤀㄀㘀㐀䔀㜀㈀䐀㤀㔀䌀䌀䘀䔀㤀㈀㤀㐀䐀㈀　䘀䄀䄀㘀㈀㈀㐀䄀㤀㄀䘀䄀䈀䔀㄀㌀㈀㔀䈀䄀䔀㄀䔀㌀䔀㈀㘀䐀㔀㐀㐀䄀䌀䔀䌀㐀㤀㄀䌀㔀　㠀　　䈀　䈀㐀㠀䌀㤀䐀㌀㠀䈀㌀㄀䌀㜀䔀　㘀㤀㘀䈀㌀㘀䄀䄀　䌀䐀㐀㘀䔀㄀　㐀䈀䄀㐀㐀䘀㠀䌀䌀㈀㈀㐀䌀㜀㘀㈀䔀㘀㄀䄀䐀　㠀㘀㄀䄀䐀㔀㤀㌀㄀䈀䘀　䈀䐀䔀㜀䔀㤀㜀䈀㔀䘀䐀　䔀㜀㠀㈀㜀㜀㌀䘀䔀䐀㐀　㄀㄀䔀䌀㐀䘀㤀　䔀㄀䔀䘀㈀㄀䄀䄀㤀㈀　㤀㈀䘀　　䈀䘀　㐀㐀㈀䈀䘀㌀䔀䔀㠀㠀㈀䄀㔀䔀㜀㄀䌀㐀㠀㜀㤀䘀㄀㠀㘀䐀䐀䐀㔀䘀　䌀䐀㐀䐀䈀㘀䌀㔀㠀䐀㈀㜀㈀䈀㄀䐀㘀䘀㤀㤀䄀㐀㠀㌀㈀䌀㌀㘀䄀䌀䄀㄀㈀䘀㐀䐀㌀䈀㔀㈀㜀㜀　䄀䐀䌀㄀㔀䄀䈀㜀㠀㄀　㜀㐀㄀䄀㜀㤀㄀㌀䘀㠀䌀䘀䔀㤀㄀䘀䌀　䌀㘀㈀䐀㠀㈀㔀䌀㔀䌀㄀㤀㘀䈀㠀㔀䈀䐀㈀㐀㐀㄀䄀䌀㈀㘀㐀㐀㈀㠀㐀㘀㌀㤀㄀㄀㌀㘀㄀㄀㈀䔀㠀㤀㔀䘀㤀㘀㈀㠀䘀㔀㠀㐀㤀䈀㜀㈀㐀㤀㤀㜀䘀䐀㌀㐀䄀㈀㘀㠀䌀㄀㘀㄀㌀㌀㄀㤀㠀㠀㄀䔀㤀䘀㘀㄀䐀㘀㔀㤀䘀䘀䌀䘀䌀㘀　䔀㄀䔀䘀㘀䈀䘀䘀㜀䌀䌀㜀㌀㌀㘀䘀䌀㔀䈀㜀㠀㜀㘀䘀㔀䐀䈀䄀䔀㤀䄀㤀䌀㜀䈀䘀䈀䐀䘀㈀㘀䔀㜀　㜀䈀㜀　䘀㜀　㄀㔀　　㘀䄀㐀㤀䘀　㄀㜀㠀䐀䈀䘀㘀㐀㜀䄀㌀䄀䈀㔀㘀䘀䘀䘀㈀　䘀䄀䘀䔀䘀䘀䈀㈀㘀㐀㈀䌀䄀㤀㤀㠀㠀㜀㌀䐀䘀䈀㔀䘀䈀䄀㈀䄀㄀㤀㜀㈀　䔀㔀䌀䐀㄀㈀㘀㐀䐀㐀㈀䄀䈀㔀㔀㔀㌀䐀㔀䈀㘀㔀㈀㜀䘀㤀㈀㘀䌀㔀㄀㘀䌀㄀　䈀䄀㔀䘀㌀㜀䐀㄀㜀䌀㐀㈀䔀㠀㜀㤀㜀䈀㈀㈀䈀䌀㐀㐀䈀㜀䌀㔀䐀䈀㄀䄀㄀䘀㠀䄀䈀䔀䌀㘀䈀䐀䔀䈀㜀䌀㌀㐀㜀䈀䌀㐀㜀㜀䌀㤀䘀　㐀䘀䘀㄀㈀㌀䔀㐀㈀㄀　㌀㄀㄀　㠀䘀㘀㜀㈀㈀㄀㠀㐀㘀䔀㜀㐀㐀㌀　䄀㘀䘀㈀㄀㌀㘀　㐀䄀㤀䐀㄀　㤀㠀　䄀㈀㜀䄀㤀㜀㌀䔀　　䌀㜀㔀䄀㘀㘀䘀㔀㘀㘀䌀㤀㄀㤀㐀㔀㌀㈀䘀㔀㜀㠀䘀㜀　㄀䘀　㐀㐀䔀㠀㄀㄀㌀㤀䄀　㄀䘀䌀䈀㐀㈀㘀㄀䈀㌀䄀㐀㈀㐀䄀㤀㤀䘀㜀㔀　　㠀㈀䄀㤀㄀䌀䔀㤀㤀㈀䔀㠀䐀㠀㌀䌀䄀䔀㈀䔀䌀㠀　㔀　　䈀䄀　䘀㘀㠀䔀䐀㤀䌀㐀㔀㐀㤀㔀㐀㜀㄀䘀㠀㜀䄀䄀䘀䄀㌀䘀㘀㐀䈀㜀㔀㐀㐀䔀䄀䘀㌀㈀㠀䌀㔀㜀㌀䌀䌀　䘀　㔀㠀㤀䔀㈀䔀㐀䘀㠀䘀　㜀䔀㄀㈀䄀㄀㘀㄀㔀㄀䈀㔀䐀㌀䐀㈀㘀㠀㘀㈀䘀　䘀䈀㄀㘀　㌀　䌀䔀㜀䄀㌀㠀㈀䌀㔀㠀㄀䔀㠀㈀䈀㘀㄀䔀㤀㈀䌀㘀䌀　㌀䌀䔀㄀䐀㄀㌀　㐀䘀㜀㠀䐀䌀䐀䄀㔀䌀㠀䘀㔀䈀㠀㌀䔀䈀䐀㤀䔀䈀䈀䔀㌀䈀　㐀䄀䌀䐀㜀㤀㤀㐀㈀㜀㄀䄀　㤀㤀㌀䈀䘀䐀䌀䌀䔀㘀䈀㈀㠀㄀㤀䌀㤀㤀䔀㈀䐀䐀㤀䌀㌀㈀䄀䔀䄀䐀䌀　㤀䌀㌀㜀㈀䐀䘀㜀㌀䌀㜀䘀㠀　㜀䘀㤀㜀㄀䘀䔀㔀㄀㤀䌀䌀㜀䐀䘀㌀㜀㤀㤀䄀㈀䘀㈀㜀㈀㈀㐀䌀　䌀　㌀䈀䔀䐀䌀㄀㘀㘀䐀䌀㈀㤀㄀䌀㐀㌀㠀䔀㌀㈀㌀㠀㐀㈀㌀䌀㌀䔀㔀䄀䐀㤀䐀㈀㔀㌀㠀㠀㤀䈀䐀㘀㜀㤀㈀䈀䐀㈀㠀㐀㈀㈀㌀䈀㤀㘀㠀㌀㜀㐀䌀㈀　䈀䌀㘀䌀㌀䘀䔀䌀㈀㐀㌀㘀䘀　㘀㌀　䌀㈀㠀㜀㄀䈀䐀㘀㤀㜀㐀　㜀㠀䐀㐀㄀㄀㈀㌀㤀㌀　㌀㐀㠀㈀㄀㐀㠀䐀㤀㈀㘀㐀㄀䈀㈀㤀㘀㔀㔀䔀䈀㜀㤀㄀䈀㈀䄀㌀䌀㔀䌀䌀㤀㈀䄀䌀㐀㜀㜀㈀㄀㈀㔀㘀䘀㄀㐀㠀䌀㜀䐀䈀䐀䌀㠀㘀㠀䈀䐀㤀㐀䈀㐀㜀䄀䌀㐀䌀㔀㤀䈀㄀䘀䘀䐀㘀䐀㜀䐀㘀䄀䐀㜀䌀䘀㔀㔀䈀㔀䐀䘀㜀㌀㜀䘀㘀㠀䐀㈀㐀㜀䔀䈀㘀㘀䔀䘀䐀㐀䘀䈀㘀䐀䐀㜀㐀䘀䐀䄀㌀㄀䈀㜀䔀䈀㐀䘀㤀䘀㐀㘀㌀㠀䘀　　䘀䄀䌀䔀　㔀䐀㌀䄀㄀㜀㘀㘀䄀㈀㘀㌀㐀㜀䘀䘀䈀䔀䈀㔀䘀䈀䌀㜀　䘀　䈀㜀䘀䈀䈀㄀㘀䔀㤀䔀㠀㌀㜀㐀㜀㌀㌀㤀䌀㈀㐀䄀㌀䘀䔀㈀䈀㠀　　䔀㄀䈀㠀㘀　㤀䌀㠀䄀䘀㤀㤀㄀㤀㜀㤀㤀㘀㜀䘀㌀䔀㈀㐀㈀㜀㤀　㔀䈀䐀㠀䄀䈀䐀㐀㘀㔀䌀㈀㄀　䈀㜀䔀㜀䈀䘀㈀㌀㘀㔀㤀䘀㌀䌀㌀䐀㘀䘀㤀㤀㠀㈀䄀㠀䈀㤀㄀㌀㤀㔀䈀䔀㘀㤀䈀䔀䌀㈀㤀䐀䘀䌀㤀　㠀㌀㌀䐀㄀㤀䌀㄀䄀㤀䔀㄀㠀㤀䈀㘀䔀䌀䔀㠀䈀㐀䌀㠀䘀㈀䐀㌀　㤀㜀㠀㔀䌀䘀㠀䘀㔀䐀㘀䌀㔀䔀㄀㔀䈀㤀㌀㠀㜀㘀㌀䐀㜀㜀䈀䐀䘀䘀㈀㐀㌀䌀㄀㤀㌀㈀䄀㠀　　䐀　䐀㔀㘀　䈀　㌀㌀㠀　㔀㌀㐀䔀㜀㐀㈀　䄀㘀㘀䘀㌀㄀䈀㘀㄀䄀䐀　㌀　㤀㠀㘀㠀㐀䌀䔀㈀䄀㤀㌀䐀䘀　㈀㤀㈀䌀䄀䈀䄀䔀㄀㘀㄀䈀䈀㈀䌀㠀㔀㘀㄀䈀　㠀㜀㌀䔀䔀䘀㌀㈀㈀㄀䌀䌀㌀㘀䐀䌀㄀䌀㜀䘀䘀䘀䘀　㌀㠀䐀䘀䈀㜀㈀㐀㄀㐀䈀㐀㔀㈀㘀㈀㤀䌀㤀㐀㘀䄀㤀䔀䔀䈀　㐀　䐀㔀䔀䐀㘀䘀㈀㄀㔀㄀㄀㔀䈀㄀䈀䄀䄀䔀䈀㔀㔀㜀　㔀㘀䄀㈀㐀㠀䔀䘀䈀㌀䐀䄀䄀䐀㈀䄀䐀䘀㠀䈀䌀㄀䈀㤀䈀㤀䐀㜀㄀㄀　　䘀䔀䌀㜀㔀　䐀䔀㈀㠀㄀㔀䌀䄀　䄀㔀䄀㠀　䘀䌀㘀㄀䄀㠀㠀　㔀㔀㜀㐀䘀㄀䈀㈀㤀䐀䔀㐀䄀䐀㔀䈀㔀䈀䄀䘀䌀䔀㈀䈀㈀㤀㤀　㌀㔀㌀㔀㘀㈀㘀㠀㜀㐀䈀䐀㜀㠀䈀㈀䌀㄀㐀㈀㌀㈀䌀㘀㐀㠀㌀㔀䄀㠀䌀㌀　　䘀㘀㤀㄀䈀䌀㌀㈀䌀㌀㐀㔀䔀䐀㔀䔀㘀㌀㌀䄀㐀㤀㠀䔀㐀㌀　䈀䄀㠀㘀䐀㠀䔀㤀㈀㐀　㤀䌀㠀䈀㠀㈀㤀㌀㄀䐀䌀䄀㘀䔀㐀䌀䌀㌀㘀㘀㤀㄀䘀䔀㤀䈀㘀㠀㜀䐀　㤀䈀㘀䔀㐀㌀㌀䔀䔀㤀㠀㐀㠀㠀㔀䄀㘀㔀㄀㐀㔀㄀㔀㄀㌀䐀㐀㠀㄀䈀䈀　㐀䐀　䔀㌀㄀㐀㐀䈀䐀㠀㈀䄀㌀㈀䐀㠀䌀㄀㄀䌀　㌀䌀䄀㘀䄀䔀㌀㘀㈀㠀䄀㌀䌀㤀㠀　㔀䔀䐀䄀㤀　㄀㠀䄀䘀　㌀㘀䘀㔀㈀㤀㐀䌀　㤀䈀䌀㐀䈀䈀䌀䐀䔀　䌀䈀䈀䘀㤀䄀㘀䘀䌀䌀㜀㠀㔀䄀㄀䄀䘀㌀䐀䐀㈀㔀㄀　㘀㜀䐀㜀㐀㔀䘀䄀䘀㠀㈀㐀㐀㤀䈀㘀㠀㄀㈀㐀㄀㤀　㐀䌀㘀䐀㄀㔀䘀䐀䐀㔀㌀䘀䘀䘀㄀㜀䘀䘀䌀䈀㤀䘀　　㤀䘀　䈀䐀䘀㔀㄀䄀䐀　䌀　䘀　㔀㄀㘀㤀䔀㜀䔀䐀㤀㜀㘀䌀㄀䔀㌀㤀　㠀㄀㜀㈀㠀㔀㌀㜀㈀㜀㜀䐀䌀䘀䌀㈀㐀䌀㠀　㔀㄀䘀䔀䈀　㜀㜀㄀㘀㐀䄀㌀㈀㠀䄀　䄀㘀䘀　㐀䔀䔀㄀㜀㌀㈀㌀䈀㄀㜀䐀䌀䘀㄀㔀䔀　䈀䔀　䐀㘀㜀㔀䐀䘀㄀　㐀䘀㘀䈀㘀䈀䐀㠀㠀　䐀㜀䈀䐀㠀㌀䘀㔀　㐀㄀䘀　㔀㔀䈀䈀㌀䔀䐀㈀㈀㜀　㈀㌀䐀䐀䌀㄀㠀㘀䔀　䄀㔀䈀䔀㄀㌀㔀䔀㄀㄀䘀㈀䄀　䘀䄀㤀㐀䘀䄀䄀㐀㈀㐀㐀䄀䐀㔀㄀㜀䈀䌀㌀㐀㌀㘀㄀㈀㘀㐀䌀㐀㈀㘀㌀㤀㄀㜀㠀㘀䈀㤀㤀䄀　䐀㈀㠀䄀㄀䔀㤀㌀㠀　㄀䘀㘀㘀㜀䌀㔀䔀㠀㘀䔀㘀㈀㠀䔀㤀㄀㄀㄀䘀䘀　㠀䐀㜀䄀䔀䐀䌀䐀䐀䄀㤀䐀䘀㌀㔀䄀䌀䌀㔀㠀㐀㌀䈀䐀　䈀　㠀㐀㄀䄀㜀䘀㌀㔀䈀㐀㘀䄀䔀　㐀㐀㌀䐀㄀䘀　㔀䔀㐀　㠀䄀㤀㘀䘀䈀㈀㘀㐀䔀㘀㤀㈀㔀䌀㔀䌀䈀㤀㤀㔀㠀䈀䌀㜀㔀　䈀　㔀䌀㈀㄀㘀㠀㘀䄀　䈀　䄀㔀㈀㈀　㠀㜀㈀䔀㈀㈀㐀㌀㔀㈀㐀㐀㘀㔀㈀㠀㄀㐀㄀㠀㤀䄀䄀㜀㜀㈀㈀㈀㔀㤀䘀㌀䄀䌀㔀㐀㈀㌀䔀䄀㜀㔀㠀䔀㠀㐀㌀㘀㈀㔀㜀㤀㄀䐀㘀　㜀㌀㈀㜀䘀㜀㤀㜀　䘀㐀㄀㐀㄀㤀　㜀㐀㜀㌀䐀㄀㘀　䄀㌀䘀　䈀䘀㘀㔀　㐀㤀䔀䄀㈀㐀㤀　㈀㠀㌀㜀㤀䌀㔀㈀䐀䌀㜀㌀㄀䌀㔀㠀㐀㄀㌀䔀㌀㤀　㄀㠀䄀㘀㌀㤀㤀㘀㌀㜀㤀㌀䈀䈀㈀㠀㈀㠀㜀䔀䐀㘀㘀㌀䐀㜀㘀㘀㌀䄀㤀䌀䘀䘀　㜀　㈀㈀䌀䘀　㤀䌀㠀䄀䈀㌀㄀㐀㐀㌀㌀㐀䄀㜀㤀㌀㠀㌀䐀　䄀㌀㈀㈀　㔀㌀㜀㜀䐀䈀㘀䐀㈀　㠀㌀㈀　㘀㐀㘀䐀㜀㐀㄀㜀㈀㔀　㔀䈀䌀㌀㠀　䐀䐀䐀䐀　䈀䘀㤀䄀䔀㘀㈀㐀㤀䐀䐀㐀䘀䈀㐀㠀䌀　㈀㤀㠀㐀㘀䈀䈀㘀㈀䈀䐀㘀㈀䈀㈀㜀䈀㔀㐀䌀㘀䄀㤀䐀㠀䌀㘀䈀　㘀㤀　䄀㈀䌀㈀㜀䄀䌀䄀㠀䘀㠀㜀㐀䄀䔀䔀㜀䌀䔀㐀㄀㄀㘀䘀䔀㐀㔀䈀䔀䈀䔀㜀㈀䔀㠀䈀㐀䔀㘀㤀㌀䔀䘀䘀䔀䌀　㌀　㜀䔀㠀㄀䘀㘀䌀䔀䔀㔀䔀䐀㔀㌀䄀㜀㌀㤀㄀䘀㤀䈀　㌀㐀䈀㌀䔀䈀㘀䈀㤀䈀㠀㜀㈀䘀䌀㌀㌀㠀㜀㄀㘀㘀㘀㄀　㄀䘀䐀㈀㄀䌀㈀　㤀㌀䌀㔀䐀䄀㤀㤀㘀䔀䌀㔀㌀㤀㜀㈀䌀䈀㌀䈀䔀㜀䄀䈀㤀䌀䄀㌀㜀㔀㜀㤀䔀䔀㄀䔀㌀䌀㐀䈀㈀㜀　㔀㤀䈀䐀㤀䌀䘀㘀䐀㔀㔀㜀㘀㘀䔀㔀㌀㘀䐀䘀㘀䌀㜀㤀䄀㘀㈀䘀䌀㜀㈀䘀㤀㘀䄀䘀㤀　㐀䘀㐀㤀㜀䘀䘀㌀㘀䈀㄀㌀㈀䄀䔀䈀䄀䈀䈀䘀㔀㈀䘀㤀㤀㔀䔀䄀䈀㤀䐀㔀㔀䈀䔀䄀䈀㜀䐀㘀䘀㌀㘀䐀䌀㤀䈀㘀䐀䄀㠀䔀䘀䄀㤀㤀䘀㈀䌀䌀䔀㐀㠀䌀䐀䄀　䈀㤀㌀㄀㜀䐀㘀㔀䔀䌀㤀㔀䘀㤀㈀䈀䌀䄀㐀䈀㘀䄀䈀䈀䔀䄀㜀䘀䔀㘀　䘀㔀䐀㄀䔀㐀䌀㜀㤀㔀㤀䘀㔀㐀㜀䈀㠀㈀　㄀䌀䔀㌀䘀　㠀㜀㜀䘀㐀䐀㜀䌀㐀䈀䌀㌀䌀䈀㄀㜀㐀㠀䌀　㐀䐀㔀㐀㐀䔀䌀㤀䌀㄀䔀䌀㈀䐀　䌀㠀䐀㔀㠀㔀䈀㜀㔀㠀　㘀㄀䈀㠀䈀䔀㤀䐀㈀㠀䌀㠀䄀㤀㠀㈀㈀　㔀䘀䌀㈀䐀㔀㔀㈀䐀㜀㠀　䄀㜀㈀䔀㤀䔀㐀䔀㌀㐀䘀㐀䈀㠀㘀䔀㌀䈀㠀䔀㌀䈀䄀㔀㈀㌀㤀䄀㤀㈀䄀㄀㐀㜀䄀㈀㔀　㠀㠀䌀䄀　㄀㔀䔀䌀　䄀䘀㘀　㐀㤀㤀㜀䄀䈀㐀㠀䈀㜀　㘀㄀㌀䐀䐀㄀㐀㈀㐀㄀䄀㈀㠀㔀㠀㈀㐀㔀㈀䐀㄀㐀㈀㐀㔀䄀　㠀䌀䘀䔀　㈀㌀㔀㜀㌀䘀䈀㐀䈀㔀㄀　䈀䔀　䈀䌀䘀䔀㐀㜀㌀䈀㐀㔀　䐀　䔀䔀㘀䌀㐀㄀　㐀㔀㈀㤀㠀䄀㜀㐀䄀㌀　䔀䄀㤀㐀䘀㌀㌀䈀㤀㔀㔀䌀䘀　㌀䄀㄀䐀㔀㐀㔀㄀㄀㔀㜀㄀㤀㜀㈀㄀䔀㌀㈀䔀㐀㌀䌀㘀㄀䐀㠀㘀　䌀䔀㘀䔀㈀䄀㤀䔀㜀䘀㔀　㌀䘀䄀䈀䈀䘀䄀䄀㠀䌀䔀䌀㐀䘀㔀　䔀㜀䐀㌀䔀䈀㈀䘀㄀㔀䌀㔀㠀䐀㄀㄀䐀㐀䐀㌀㔀㈀㄀䄀㜀㄀㌀㔀㠀䐀㄀㈀㌀㤀㠀䔀䐀䘀㐀　䄀㌀㈀䘀　㈀䐀㠀㘀䐀䘀㤀㄀㌀䐀㔀㔀㔀㌀㈀㜀㤀䄀㐀㤀　䘀㘀㜀䔀䄀䄀䘀㐀䈀㘀㈀䔀㔀㤀㐀㌀㤀㘀䘀　䌀㔀㤀䈀䄀㤀䐀㜀䄀㄀㔀䄀㌀㔀㐀㌀䘀㄀㄀　㔀㐀㔀㄀　䔀㜀㈀㐀㤀䔀㔀㜀㜀㤀䐀㠀㤀㤀㤀䘀㜀㐀䐀㠀㐀䔀䈀䘀㜀㜀㈀㌀䌀㌀　㠀㔀㤀㐀㌀㐀㠀㐀㠀　㌀㌀㐀㐀㔀㜀㤀㘀㌀㈀䌀䈀㄀䔀㐀䐀㄀㠀䄀㈀䈀㄀㔀㘀㐀䈀䄀㈀䔀㔀䄀㜀㔀䌀䔀䔀䘀䄀䐀㈀㄀䐀㠀䔀㄀䈀㔀䈀䐀㔀㈀䐀䈀䄀䌀㐀㜀㄀㠀㠀㔀㄀　　㐀䈀㄀㔀䌀㄀　㐀䘀㈀㐀㈀　㜀䔀㘀㘀䈀㔀㌀䐀㈀䈀　㤀䔀䈀䄀䐀䔀　㈀㐀䈀㜀㄀䐀䈀　㜀㐀㌀䔀䐀㠀㘀㔀䐀䈀䔀㔀䔀㘀䈀㌀䄀䔀䈀䈀㘀㔀㔀㌀㐀㠀　㌀䔀䈀㜀䈀䘀䘀㜀㐀䘀䌀䔀䄀䘀䘀䘀䄀䌀䔀䈀㌀㌀㜀㌀䔀䈀㄀䔀㈀㐀䘀㔀䈀㤀䘀䘀䈀䘀　䌀㄀㈀㜀㘀䔀䈀㤀㜀㤀䐀䈀㌀㌀㌀㜀㔀䔀䈀䘀㘀䐀㜀㄀㘀㐀㐀㄀㔀㔀䘀㌀䄀㔀㐀䈀㈀㜀䘀㜀䐀䔀　㔀䐀䄀䐀䘀㜀䔀　　㠀　䌀䐀　䘀䘀㐀　䌀䄀䘀䘀䌀䔀䌀䌀　䘀㔀㐀䘀䐀㌀㜀㔀䘀䘀㌀㔀䘀㐀䘀䌀㘀䘀㜀䘀䘀㤀䌀㈀㈀䘀㌀㄀㤀䔀㘀䌀䄀㐀㈀㠀䘀䄀㈀㠀䄀㤀䄀䘀㜀㠀䌀㤀䔀䔀㌀䄀　䔀㈀　䘀㤀䘀㘀　㜀㜀㄀㤀㜀䐀䄀㈀㄀㠀䈀㜀㠀䘀㘀㔀㔀䌀䌀㈀㐀㜀䄀　㘀䈀䐀㐀㜀㘀㔀䌀㠀㈀㔀㜀䘀㌀　䐀䌀㄀䄀㄀㐀㌀䌀㠀䄀䌀㜀㐀㜀䈀㌀㠀　䐀㈀㘀㌀㈀䌀䔀䘀㤀㌀㈀㔀㘀㔀㤀䌀㌀䐀䄀㌀㤀㐀㜀　㤀㔀䔀㈀䐀䄀㌀㘀㔀㘀㜀㔀㐀䔀䄀㤀㄀㈀䄀䐀㤀㘀䈀㘀䐀㘀㔀㄀㄀㄀　䌀㠀㤀㈀　㐀　㠀䌀㤀㤀㠀　㐀㔀㠀㘀㔀㄀䐀㐀㤀　䄀㌀　䘀㌀㌀㠀䘀㠀㠀䌀㌀㈀㠀㄀䔀㌀㈀㤀㘀㠀㈀㌀㠀㜀㜀㘀㈀　㐀䐀䘀㈀㜀㤀㈀䈀㠀㈀䈀䘀㤀㜀䔀　　㄀㈀䘀㜀㄀㄀㜀㄀㠀䐀　㐀㜀㄀㄀㘀䘀㄀㈀　　䈀䘀㈀䘀䌀䔀㐀　　䔀㤀㘀㐀㌀䄀㠀䘀㤀㐀㠀㔀　㐀㔀䈀䐀䈀㔀䄀㜀䈀　㌀䌀㜀　㌀㜀　㐀䐀㘀　㘀䈀䄀　㌀㜀㌀　㄀䄀㘀　　㈀䐀　䔀㜀㌀㈀㤀㄀䌀䘀㘀㔀㄀㐀㤀䘀䌀䈀㔀䘀䈀䔀㈀䄀䈀䈀㄀㤀䌀㌀㐀　㘀䘀䔀䘀㌀㠀䘀䔀㌀㈀㠀㘀　㐀㄀㈀㤀䄀㐀㌀㄀㐀㐀㌀　䄀䈀㠀㤀䐀䈀㠀䔀䘀㈀㤀㈀䈀㐀㠀䐀　㠀䌀㜀㄀㜀䈀㤀䈀㐀䈀㔀䄀㌀㈀㐀䔀䐀㤀㠀䔀㈀㄀　㔀　㤀㜀䌀㐀㄀䔀㈀㠀䔀㤀䔀䔀㜀㌀䘀䄀㜀㌀㌀㔀㐀㘀䄀㘀㌀㜀㜀㘀㜀䐀䌀䌀㘀䔀㘀䔀䔀䌀䌀㠀㤀䘀㄀㔀䌀䔀㔀㠀䔀㤀㈀䈀㄀㤀䐀㐀㈀㄀䌀㄀䔀㈀㘀㌀㠀䄀㘀㜀㄀㄀䄀㔀䘀䄀㔀㜀㄀㐀䄀㄀㐀䄀㠀　㈀㐀㈀㌀　　䄀㠀㜀㜀㌀㘀䘀䄀㌀㌀㈀㜀㠀䄀㠀㜀䌀㜀㐀㐀　㤀㘀㈀㠀㠀㤀㘀㘀㄀㄀㜀㈀㌀㔀䘀㔀䄀䘀㘀㘀䘀㄀㈀㐀㈀㘀䐀䈀㐀㤀㜀㐀㔀䈀㘀䘀䔀䐀㔀㤀䌀䌀㤀䔀㐀䄀　䘀㘀㄀㄀㜀䌀䔀䔀䘀䐀㤀䐀㠀䘀䘀㠀䐀䄀㄀䘀㔀㌀䘀㤀䘀䐀㌀䈀䘀㘀䔀㔀㔀䔀㜀㜀㜀䐀䄀㤀㄀㌀䈀䘀㠀䔀㤀䈀䐀䘀㤀䌀㜀㄀䘀㄀䄀㔀㤀　䔀㄀䘀䐀䐀㜀㠀䐀㌀　㔀㜀㜀䐀䘀㌀㈀䈀㈀㄀㜀䄀㄀䐀㘀㈀㘀䌀㐀㄀　䔀䐀䈀㠀㄀䈀㤀䄀䔀㈀䄀㄀㘀㐀䘀㜀㐀㌀㐀䈀㔀䘀䌀䌀㠀䘀㠀䘀䌀䐀䄀䐀㐀㈀䌀㐀䘀㐀䈀　㄀㌀䔀䌀㄀䘀㈀䔀　㤀㤀㠀㠀䐀䐀㄀㘀䌀　㤀䌀䐀䈀㠀㜀㐀㜀䘀　䔀䌀䄀䄀䔀㤀䘀䔀䔀㄀㈀㤀䌀㐀䈀䘀　㠀㠀㈀㠀䈀䔀䔀㠀㐀㠀㠀㤀㜀㜀㌀㔀㐀㘀䈀㌀㈀㔀㌀㐀㔀㌀㤀㈀䔀䈀㘀㜀㤀䌀䐀䐀䄀㔀㔀䐀㠀㈀㜀㌀　㤀㄀䔀㄀㄀㈀㔀䔀䘀㜀㐀㈀䌀㐀㜀㌀㈀㐀㘀䈀㌀㈀㔀㌀㐀㔀㌀　䌀䘀㌀㐀䐀䌀䔀㠀㤀㘀䐀㜀㠀㤀䘀䔀㜀㠀䈀㔀䈀䌀㐀䄀䐀㘀㈀䄀䘀㌀㠀㈀㐀䈀䔀㈀䈀㄀䔀㄀㜀㜀㤀㐀䄀㠀䌀㠀䈀㘀䈀䌀㐀㄀䔀䘀㄀㄀㄀䔀㜀䐀㈀㈀㄀㜀㄀㔀㐀㤀㐀䔀㈀㈀㈀㜀㈀䘀㠀㜀㠀　㘀䐀㈀㈀㈀㐀㜀䔀䘀㄀䐀㄀䐀㜀㈀㔀䔀䄀㄀㈀䔀㐀㜀㜀䘀　㌀㔀　㄀䌀䌀䈀㌀㄀㄀㈀䌀㜀㔀㜀䈀㄀㄀㐀䘀㌀　㠀䈀㌀㤀㔀䔀㤀㘀㔀㠀㘀㤀㠀㐀㌀　䌀㌀㜀䌀㐀㄀䌀㘀㜀㈀　䌀㔀㈀㐀㤀㠀㔀㜀䐀　㌀㌀㠀㘀䈀㄀䔀㌀　䌀㜀　㈀㄀㔀㌀㘀㐀㌀㔀㠀㘀䈀　㄀䄀㈀㌀䔀㄀䈀㜀䌀　㄀　䄀㔀䌀㤀䈀㠀㐀䄀㤀㌀㜀㄀㘀䈀䈀　㄀㠀㄀䌀㤀㔀㤀　㌀　䐀䈀㌀㄀䔀㜀　㤀㔀䘀㘀㐀䈀㠀䈀㔀䔀㐀㤀䈀㜀㠀㌀　㔀䈀㘀㔀㐀䄀䈀䘀㠀㐀㈀㜀䈀䘀䈀㘀㌀㐀㜀㔀㌀㔀䘀䔀㐀䘀㜀㐀㌀㜀㈀㌀䈀㄀㄀䌀䘀䔀䌀䔀㄀㌀䘀㈀㈀㔀㈀㔀䘀㘀㜀㜀䌀　䔀　䄀䘀䌀䄀㐀㄀㈀䌀䈀㔀䄀㤀䈀䘀䈀䘀㤀䘀䘀㤀䌀䈀㠀㄀　㌀䄀㜀䘀䐀㐀䌀䘀䄀䘀㐀㐀㄀　䄀㠀䔀䘀䔀䈀㠀䈀　　　㐀䌀㈀㔀䘀䌀㘀㈀㠀㈀　䐀㌀㘀䈀䘀㄀㐀䘀䈀㌀䄀㔀䐀㐀㈀㈀㤀㤀㘀㐀㜀䈀㤀㠀㐀㔀㘀㔀䄀㐀䘀㌀㄀䈀䔀䌀㈀㐀㈀㜀㄀　㤀䈀㔀㜀㠀㠀䘀㈀䈀䈀㐀䈀㐀㐀䈀㈀㠀㈀䔀䄀㄀㌀䄀䔀㘀㘀㔀㔀㔀㠀䔀㘀㄀䄀䈀䐀㠀㘀㤀㐀䌀　䈀䈀䈀㠀㄀㘀㔀㠀㌀　㈀䌀䈀䘀㈀　䌀　㌀㄀㤀䐀㘀㐀䈀䘀䐀㌀䘀䌀㘀䈀䔀　㔀㌀䔀㠀䄀䔀䄀䔀䌀䘀䈀㤀䌀㤀㤀䐀㤀䈀㤀䔀䔀䌀䔀㘀䐀䔀䘀䈀㜀㘀㐀䈀㌀䌀㤀㘀㘀㤀㌀㘀䌀䌀䌀㠀㘀䔀䌀㠀㘀䈀　㄀　㤀㈀㐀㄀㤀㄀㔀䈀㠀㐀㠀　㘀　㌀㐀㤀㄀　㠀㈀䄀䄀㈀㠀㐀㈀㠀㘀㈀䈀㠀　㔀㔀　㐀㄀㐀　㄀㐀㈀䐀㈀㈀㔀䔀㔀　㘀䈀㈀䈀㔀䔀㔀䔀㈀䘀㜀䐀䐀䈀㈀㈀㈀㐀㔀䌀㐀㐀䄀䐀䈀䌀㈀䐀㔀䔀䄀䄀㐀㘀䘀㄀䄀䐀䐀䄀㤀䘀㔀㘀䐀㐀䘀䔀㠀䄀㔀㘀䄀䈀㘀㤀䘀㤀䈀䔀㠀䘀䐀䄀䐀㜀㘀䄀㌀㘀䐀䘀㌀㤀㘀㜀㘀㘀㌀㜀㤀䈀㘀　㜀䘀㘀䘀㜀㌀㤀㤀㌀㤀䈀䈀㌀䈀䈀㌀㌀㌀㜀㌀䌀䔀㜀㌀㤀䔀䘀㌀㔀䌀䘀䘀　䘀㜀㐀㐀㠀㄀㐀䔀䐀䈀㈀㌀㌀㤀䄀㐀䐀䔀㈀　䄀䌀㘀䄀㐀㤀㐀㠀䌀㠀㤀䌀㐀㜀㈀㈀㄀㐀䐀䐀㤀㠀㔀㘀㐀㈀　䄀䘀㄀㜀䄀䐀　㌀㠀䔀㤀㠀㈀㠀䔀䔀㤀㈀㘀　䈀㄀䐀㐀㈀䌀䈀㔀㐀䄀㌀㐀䌀䔀䌀䌀㌀㐀㄀䄀䘀　㄀㠀㔀㠀㤀㤀㤀䄀䌀㐀㈀䌀㈀㐀㄀㄀䄀㌀䄀㜀㔀㐀㐀㐀䔀䌀㔀㜀㜀㘀㌀䌀　䌀㄀㈀㐀䘀㈀䌀㔀㜀㘀㐀㌀㔀㤀㄀䘀䌀㐀䔀䐀㜀㈀䘀㐀䄀䄀㘀㠀䘀㔀䐀㐀㜀䈀　㈀㔀䄀㠀㜀㄀㠀䔀㠀䄀㄀䐀䄀㘀㈀䈀㐀㄀䘀㌀㘀䌀㘀䌀䘀㠀㐀㤀㄀　　㠀㠀䌀䘀䌀㠀㠀㘀㠀䄀㤀䐀㐀㜀㘀㤀㔀㌀㜀㘀㄀㘀䘀㘀㐀㔀䔀㔀㔀䌀䄀㜀㤀㔀㔀　䌀㐀㈀㐀㄀䔀㘀㠀㈀䌀　㤀䌀䘀㄀㘀㌀䌀㈀㤀䔀㠀㌀䘀䈀㌀㔀　䔀䌀䐀㜀䄀㐀㌀䔀㠀䐀㘀㄀㐀䄀㤀㜀　䄀㠀㄀㈀䐀㘀㔀㠀㐀㄀㄀㌀㤀㔀㄀䐀　㜀㜀䄀㘀㄀䌀䌀䔀㈀㔀䈀䘀䈀䈀㌀䐀㜀㐀㐀䌀㜀㄀㜀㌀㜀㠀䌀䔀䘀㐀䘀㐀䐀䐀㤀㌀㌀㤀㌀䘀㤀䘀㈀㤀䐀㜀㜀䈀䔀䐀䐀䘀　䄀　㌀䌀㜀㌀㌀㜀䈀㌀䘀　䈀䈀䈀䐀䌀㜀㘀㜀㈀䘀㐀㄀䔀䌀　䔀䌀䐀㜀䈀䘀䄀㜀䘀㜀　㄀㘀㌀㤀䄀䐀㤀䈀㄀㤀㜀㘀㜀㈀䐀䔀　䘀㈀㠀䘀䌀㔀　㤀䌀㄀㘀㤀㤀㈀㐀㜀㤀㜀䐀㌀㘀㈀䘀䌀䔀䔀㜀㈀㄀䐀㜀㈀䐀㄀　㜀㘀㈀㌀䐀㐀䌀㘀㤀䄀㈀䄀㈀　䐀䈀䌀㘀㜀㘀　㠀䈀㐀䔀㈀䘀㠀㜀䘀䈀㘀㘀䘀㔀㠀㔀䄀䌀㠀䔀㄀㠀㐀㤀㤀㤀㄀䘀㠀㘀㈀䄀䔀㈀㄀䔀㐀㄀䄀㌀㠀㜀㜀䌀䘀㈀　㤀㄀䘀䌀㄀㜀䐀㄀㘀䈀㐀㔀㐀䄀㘀㜀㈀㌀㐀䔀䔀㈀㄀　㌀䌀䐀䐀䄀㜀䌀㜀䈀㄀㠀㌀䘀　㜀㐀㌀䘀䐀䄀䔀䈀㌀㘀䘀㈀　㘀　㤀　　㌀㠀㘀䐀㘀䌀㐀㔀䔀䘀䈀　　䌀㘀㌀㘀㌀䐀㠀　㘀㘀㄀㌀䄀㈀㈀　㜀䘀㘀㄀䌀䘀㄀㄀㈀㜀㄀㈀䐀䈀䐀㔀䄀䘀䌀㤀　䘀䔀㄀㌀䌀䈀㌀䐀䌀㤀䌀㈀㔀㈀䈀㘀㤀䌀㠀䈀䘀㄀㄀㤀㜀㘀㠀㈀䐀　䔀䌀㘀㠀㜀㔀䈀㐀㌀㌀䔀䐀䔀䌀㈀㔀㔀䌀䈀䈀㜀　㈀㌀䐀㌀㘀䈀㜀䈀㔀　㜀㠀㠀㔀䘀䐀㘀䘀䔀㘀㜀䐀䘀㘀㄀㐀䘀䈀㈀㔀䘀㜀　䘀䘀㘀㔀䈀䐀䔀䄀䐀㠀䈀䄀㈀㠀䐀䄀㘀㄀㤀　䄀䄀㜀䈀　　䈀㌀䌀㜀䄀㈀㄀䘀　㜀䌀䌀䌀㐀䌀㔀䌀䄀㜀㄀㤀㈀㘀㘀㘀㈀㘀䈀㌀㠀䈀㘀㠀㤀䄀㌀㌀㌀㠀䄀䄀㠀䈀䈀㄀䔀㄀㔀　㄀䄀㐀㤀　㈀㈀㈀㜀㌀　㐀㈀䄀㠀㘀㘀　㘀㌀㠀㠀㔀䈀㈀㐀䌀䄀䔀㌀㔀㜀䔀䔀　㠀䈀㄀䌀䘀䄀㠀㘀㘀㌀䄀䐀㜀㈀䔀䄀㐀㐀㠀㠀䐀㘀㐀䄀䐀䔀㜀䌀㠀㔀㠀䈀㈀㔀䈀　　㜀䔀㔀㈀　䌀䔀㐀䄀㜀㐀䘀㤀䔀䔀䌀䄀㤀㌀䌀䘀㘀㄀㈀㄀㔀㠀㌀㄀　䌀㤀䐀䄀䌀䐀䄀　㄀㔀㜀㄀㘀䄀　䌀㔀㐀㌀　㠀䔀㈀䌀㐀㜀㠀㐀㌀䔀㠀㄀　㤀䐀䔀㐀　㌀㠀　㔀㌀㘀㤀㌀䄀㈀䔀㔀㠀㜀䐀㠀㠀㄀　　㌀㄀㔀㜀　㄀䈀䘀䐀䐀䘀㄀䌀㜀㤀㈀䔀㤀㐀䈀　䈀㈀㤀㤀㌀㄀　䄀㘀㈀㔀㐀㈀䔀㌀㄀　䐀䐀㤀㔀䐀䘀䔀　㄀　䐀䐀㌀㌀㠀㤀䌀㄀䈀䌀㔀㌀㄀䘀䄀㤀䐀䐀䐀䔀　䌀㜀㘀㘀䐀㌀㄀䈀㤀㔀㐀㜀㜀㤀䌀䘀㌀䌀䔀㈀㄀㐀䄀䔀㔀㄀䈀㘀㤀䈀㈀䈀㔀㤀䌀㜀㘀㠀䔀㄀㘀　㄀㄀㘀　䈀㔀䈀㘀㤀㐀䄀䘀　㌀㤀㜀　　㈀㘀㄀䔀㜀䌀䄀㜀㘀㄀㌀　㐀䐀䔀㄀　㠀㔀䔀䄀㜀　㐀㘀䔀　䌀㌀䔀㄀㐀㘀㤀䌀䄀㌀㜀䔀㈀　㠀䌀㔀㌀䐀㔀䐀䘀㌀䐀㄀　㈀㄀䈀䈀䘀䐀㈀㔀㄀㘀䐀㐀㌀䈀䌀㤀㈀　㔀䐀　㤀㈀䌀䐀㜀㌀䘀㌀䈀㜀䌀䔀䌀㐀　　㤀㐀㤀㌀㌀㌀䌀䔀　䌀㄀䈀䈀㠀䘀　䘀䄀㠀㈀㐀䌀㄀㄀䐀䔀䐀䌀㠀㈀䈀㌀䈀䐀㤀䔀䐀㤀㜀㜀㈀㄀㤀䄀㠀䐀㠀　䄀㠀㔀㈀䘀䄀㔀㤀䘀㘀㐀㈀　䔀䘀䘀㈀䄀　䄀䈀䈀㤀㔀䌀㠀䐀㘀㐀㠀㌀㜀㌀㄀䘀　䔀䘀㠀䘀　䌀㤀㔀䘀䔀䘀　䘀㤀䄀㠀㜀䌀㌀䌀䔀㜀㘀䐀㌀㠀㔀㌀　㄀㈀㔀㘀㐀䌀䐀㈀　䐀㄀㔀㄀㄀㜀㄀㘀䐀　㘀㌀　㌀䌀㔀䄀㔀㈀㄀㤀䐀㘀㔀䌀㐀䄀䌀䐀䄀　䄀㤀㔀䌀　䔀㌀䌀㜀㄀䔀　㜀㌀㠀㠀　㌀䌀㈀㤀䘀㜀䐀㤀㤀䔀䐀㠀㈀㈀䘀㜀䐀㤀䌀㜀䐀䘀㐀㘀㘀䐀䈀䐀㄀䔀䘀㔀䘀㠀　䌀䘀㘀㘀䐀㜀　䌀㈀䐀䄀㄀㠀䄀䐀㜀㘀㜀㜀㄀㤀䐀䄀㤀㈀䐀㘀㠀䘀䐀㘀䌀㈀　㘀㠀㈀㈀㤀䈀䌀䘀㔀䔀㌀䐀䘀㌀㠀䔀䘀㄀㄀䘀㔀㠀㈀䈀䌀㜀䄀䌀㠀㤀䘀㤀㐀㌀㜀䘀㘀　　㔀㄀䌀䈀㌀䐀㈀㄀㔀㜀䌀䔀䈀㔀㤀䔀䈀䐀䄀䔀㄀㌀㘀㄀䈀㔀㤀䈀䔀　㠀㘀䔀㐀㠀䌀㌀　㐀㄀㌀㌀䘀㈀㐀㔀䐀㘀䘀䔀䔀㘀䈀䌀㜀㤀㤀㜀䈀䈀㌀䘀䌀䐀䈀㌀㄀㈀㌀㠀㘀㘀㐀㌀䔀䌀㔀㔀㘀㘀䌀㜀䈀䌀㐀䘀㘀㠀㤀㠀䐀㘀㤀㐀㔀㤀䈀䐀㌀㌀㘀䈀䄀䐀㠀㜀㘀䈀䐀㘀䐀㤀㌀㘀䐀䐀㠀䌀㘀䄀　㈀䔀㄀㄀㈀㤀䐀䄀㄀㐀㤀㈀䘀　㌀㜀㄀㄀㘀㄀䌀㤀㠀䐀䈀㐀䄀㌀㐀㜀　　㌀䌀　㘀㐀䔀䔀㌀㌀䄀㘀䔀㈀㌀㄀㈀䐀㌀䘀䘀㠀䌀㐀㠀㐀䌀䔀㄀　㈀㠀㤀䌀㤀㈀㐀㐀䔀㔀㌀䘀㜀䔀㌀㈀䐀䌀㔀㈀䘀㄀㜀㐀㜀㌀䌀㌀䌀㤀䌀㠀䈀㈀䌀䈀㘀㄀㘀㌀㌀㌀　㠀㜀㄀㤀䈀䐀㤀㠀䔀㄀䐀㔀　䌀䈀䈀㠀䌀㈀䌀䌀䌀㄀㄀䘀㈀䔀䄀䄀䌀䈀㔀䄀䈀　䘀㠀㠀䔀㘀䔀　㔀㤀䌀㌀䈀㘀䄀㔀㤀䘀䌀　㠀䘀㤀㠀㔀㈀㈀䔀㔀䈀㠀䔀䘀㐀䈀㄀㔀㈀㜀䄀　㔀㠀㤀㜀㘀䐀䄀　䐀㤀䌀　㔀䌀䌀㐀䌀㄀䐀㤀㔀㌀㜀㌀㠀䐀㈀䐀㘀　䄀䐀䄀䔀㄀㠀㈀㄀䔀　䔀㄀㔀䈀㐀㠀㌀　㔀䔀䐀㐀　㐀㄀㌀䈀㔀䌀㠀　㈀䘀㄀䄀㈀䄀㘀㠀　㜀　䈀䐀䄀㠀㄀㠀㈀䈀㘀䈀䐀㈀　㘀㠀䐀㘀㔀㄀䐀　㤀㘀　䈀䐀䄀㐀䄀㐀㄀䐀䈀㔀㤀䄀　䄀䔀䄀㤀　㔀㘀䐀䈀䐀䄀　䄀䐀㄀㔀䈀㐀㤀䐀　㔀　㈀㜀䄀䄀㄀䈀　䄀䔀㄀㜀䈀㐀䈀㔀㠀㈀䈀㘀䌀㌀㐀䄀㘀䐀䔀㌀㜀㌀㌀㤀㘀䔀㌀㠀㌀㈀䌀㌀㤀㠀㈀䐀㌀㤀䐀㈀㌀㄀䔀㘀㄀㐀㜀㌀㐀䄀䘀㠀䄀㌀䘀㜀䈀㌀㠀㠀䔀䐀㌀䐀䐀䈀㌀㜀㄀㄀䌀䄀䌀䈀㐀㜀㐀䄀　㔀㔀䘀㌀　㈀㈀䐀　㜀㐀㘀㤀㔀㄀㠀㠀㜀㔀㘀㌀　䐀㠀䈀㠀㌀㘀䌀㘀㤀䌀　䄀䘀㠀䄀㈀㜀㘀㈀㜀　㔀㜀㘀䌀㘀䘀㠀䌀㠀䄀䄀㄀㐀㔀㔀㘀㠀䔀䔀䐀䐀㈀䄀　䌀㘀㄀　䈀䈀㈀㔀䌀㤀䄀䌀䐀㌀㠀㠀䌀㜀㤀㐀䐀㠀㈀䐀㔀䐀　㐀䐀㐀㤀㜀㤀㐀㈀䈀䌀㈀㘀㐀䄀㈀㔀㄀䌀㐀㜀䄀㐀㤀䐀㘀㔀㠀㠀䐀䘀㠀㐀䄀䈀㔀㔀䌀㈀䄀䔀㔀㠀㠀　䐀䘀㌀　㠀䔀䌀䔀䌀䘀㌀䔀㔀㠀䌀㐀䔀㈀㌀䌀㤀㐀䈀㤀㘀㜀㌀䌀㠀䐀㄀䔀㘀㠀䈀䔀䐀　䄀䌀㈀㈀　䈀㤀㔀㈀㌀　㜀䘀䄀㔀㈀　䈀㤀㔀㈀㄀　䌀㌀㌀㐀㘀㠀䘀㠀㐀䄀㐀㄀㈀㈀䌀㈀　㜀㠀㤀䔀䐀㌀䌀㠀㠀䈀㤀㈀䄀㔀㄀㈀䄀㠀㈀㜀㘀㜀䌀䌀䐀㘀　䌀䔀㌀䘀㄀䈀㐀㐀㤀㜀㌀䄀　㐀䄀㠀㔀㐀㘀㤀䔀䔀㈀㈀䄀㔀㌀㤀䘀㘀㔀䌀㘀䄀䈀㄀㘀㜀㔀㜀㔀䈀㘀㤀　䌀㤀䔀　　㄀　䈀䈀㄀㔀䄀㠀㘀㈀㠀　㤀㤀㌀㐀㐀䐀㤀㠀㜀㐀䘀㠀㈀䌀㈀㘀㐀䐀㠀㐀　㠀䔀　䈀㄀㌀㐀㠀㜀䔀䘀㜀㌀㌀㘀㤀　㌀㌀㠀㘀㠀䈀䄀㠀㄀　㈀㘀䘀㤀䌀䈀㈀㘀䐀䘀㈀䔀㠀䈀㄀䐀㠀㄀䔀䈀䘀䄀䌀㘀　䄀㄀㔀䄀㘀㠀㌀㠀㤀䔀㠀䄀㄀　㔀㘀䔀䄀㜀䌀䔀㐀㈀㘀㠀㐀䄀䘀䌀㜀䄀㠀㠀㐀㐀㘀㤀䄀䐀䈀䌀䌀㄀㠀㐀㈀䔀㘀㤀㈀㘀㠀㔀㈀㔀㜀㄀䐀㘀㘀　　㄀　㈀㤀㜀㘀䌀㜀㜀㌀㤀䌀䈀㔀䐀㜀㘀㈀䐀　㠀㜀㔀㠀㜀㌀䈀䄀㜀㘀　䔀㐀㈀䌀㘀㐀䘀䘀㔀㈀㐀㐀㌀㐀㐀㐀㔀㔀　䌀㈀　㔀㘀　㤀㔀㤀䌀㤀㠀䐀　㐀㤀㄀㐀㌀䐀䐀㄀㈀㈀㜀䐀　㘀䌀㄀㄀㘀䄀㄀䔀䔀㠀㘀㘀㐀䐀䌀㔀䈀㘀　䔀䔀㜀㐀䐀䔀㔀䔀㘀䄀㄀㤀䈀䄀㐀㔀䐀㜀㠀　㤀䔀㈀㌀㔀㔀㄀㐀㠀㠀㠀㌀㄀䄀㔀㔀　㌀㔀㜀㤀䈀㐀䔀䔀䌀㤀䄀䔀㌀㔀㜀䈀㠀䄀㘀䘀㜀䄀䘀䐀䄀㜀㌀䘀䔀䈀㈀䈀㔀䐀䐀㠀㜀㐀䘀䐀䈀䐀䘀䐀㤀㜀㈀䌀䈀㤀㘀　䘀㌀㐀㐀䄀㘀䘀䌀䈀䔀㌀㤀㠀䈀䄀䔀䈀㠀䔀㐀䔀㠀䈀䔀㐀㌀㐀㌀㜀㄀䔀䄀㈀㜀䐀䐀㠀䈀㈀㘀䐀䔀䘀㜀䌀㐀䐀　㄀䔀䔀䄀䌀　䈀䄀㜀㔀㜀㌀㄀䘀䈀䄀㜀䈀䔀㠀㠀㌀㤀䌀䘀㘀䘀䄀㌀㤀㤀䄀䐀㜀㄀䔀䘀㠀㌀㤀䈀㄀䈀㈀㌀㠀㘀䐀㌀㐀䔀䈀䄀㐀㤀䔀㔀㘀㠀䘀䄀㠀㜀䘀䄀㈀䘀䘀䔀䌀㌀䌀㐀䐀㜀䘀䔀㌀㘀㐀㄀㤀㈀䌀㄀䘀㐀㐀㄀㄀䐀䐀䘀㘀䄀䄀䘀　　㄀䘀㔀㠀㐀䔀䘀㔀㌀䐀䘀䈀　㠀䘀㠀㤀䘀　㈀䔀䐀㤀䔀㔀䐀㄀㤀㄀䘀㘀　䄀㔀㤀㠀䘀㐀㌀㜀㐀䌀㠀㜀㘀㜀㤀㤀㐀　䄀㈀䈀㄀㜀䌀䌀㜀䌀㌀㤀䄀䘀䌀㈀㠀㘀䐀䄀䔀㐀㌀㈀㄀䘀䐀㄀㔀㠀㜀䐀㐀㐀㜀䈀㤀㔀㠀㠀䐀䔀㈀䄀㄀㄀䈀䐀㔀㔀䌀䄀䔀䈀䄀䐀㄀㈀䔀㄀㜀㜀㔀㈀㤀㐀㄀䌀㐀㄀㤀䌀㤀䄀㐀㐀㘀　㈀㐀㜀䄀㈀䈀㜀䄀䘀䐀䄀䐀䔀㔀䔀㐀㄀㐀㈀䐀䔀䘀䔀㜀㌀㜀㘀㘀䔀㈀䄀㠀㐀㐀㔀㐀㘀㌀　㤀䄀㈀㌀䘀㘀㤀㠀䔀　䘀䘀㌀䐀㜀　　䐀㘀㘀㄀㜀䐀䄀㜀㜀䐀䐀㐀䘀㔀䈀䔀䈀䐀䈀䔀㘀㜀㜀䐀䌀㜀㜀䌀㠀䌀㠀䘀䄀㘀㔀㈀㘀䔀㐀䘀㠀䔀䘀㘀㌀䌀㌀㤀㘀䄀䘀㐀䔀㐀䔀㐀㈀䔀　䘀䔀㄀䐀　䐀䘀䘀㐀㘀䈀㤀䄀　㔀㤀㠀䘀㈀㠀㌀䄀䄀䄀䈀㌀㠀㐀㘀㜀㔀䐀㔀　䄀㔀㐀㔀㜀䌀㘀䔀㈀䌀㜀䌀㜀　䌀㜀䐀䄀䌀㈀䄀㌀䌀䌀㜀㐀䈀䌀　䄀㌀䘀㌀㌀䘀䄀㘀㌀㈀㜀䈀㠀㘀䄀㠀䈀㌀䄀㌀㌀䔀㐀㠀䔀㐀䈀　㠀䘀　㠀䔀㘀㐀　䘀㌀䔀　㠀㠀㌀䔀䔀䈀㘀㄀㌀㔀㐀㄀䔀㐀㐀㔀㐀䔀䄀㐀㔀㤀䈀㔀㔀䌀㘀㌀䔀㔀㈀　㔀㐀㐀㐀䐀䐀㈀㈀㌀䈀　䌀䐀㤀䈀㘀㄀㈀　䈀　䘀㐀㄀㐀㌀㜀　㠀㠀㄀䔀㐀㐀㔀䌀䈀㐀㐀䐀㈀㜀㈀㐀㘀㔀䌀䈀䐀㤀㐀䄀䘀㈀䔀㐀㘀㐀䘀㤀䔀㜀　䈀㘀㠀㘀㤀䘀䈀㘀㌀䄀䈀㐀䘀㈀䔀㜀䔀㜀㐀䄀䔀㈀䄀䘀㘀㔀㜀㈀䐀㤀䘀䐀㄀䘀㌀㄀㐀㔀㌀䈀䔀㘀㜀䐀䘀䘀㤀䐀㜀䌀䘀䄀䔀䈀䈀㜀㄀䄀㠀㠀㜀䈀䄀䘀㔀䈀䄀㘀䈀䄀㜀䔀䌀㜀䔀㜀㌀䔀㠀　㔀䈀㐀㐀㠀㐀䐀㄀䐀䘀䔀㠀㈀㠀㤀㈀㌀㘀䄀㜀㄀　　㌀䘀㄀䌀䌀㘀䘀㐀㜀㈀䌀㠀䔀䐀䈀㌀䐀㈀㜀㜀䈀䘀㈀　㌀䌀　㔀䐀㜀　㔀㌀　䄀䔀䌀㈀㈀䐀㌀䘀䘀㤀㐀　䔀㜀㐀㐀䈀䘀㜀䐀㌀䄀㌀䈀㠀㌀㘀䘀㘀㌀䐀䈀䘀㤀䄀䈀䐀㤀㘀㔀㌀䌀㤀䘀㔀㘀㈀㜀䔀䄀㄀㌀㌀䐀䘀㔀䈀䔀䘀㌀䐀㔀㄀㘀䈀䐀䌀㔀㜀㌀䈀䔀㘀䘀䄀㄀㘀䐀䄀㄀㜀　䄀㄀䐀䄀䄀㤀㜀㜀㜀䄀㈀䔀䘀㐀㔀䐀㘀䈀䈀䈀㔀㘀㔀㠀䄀㈀㔀䔀䄀䈀㔀䘀䔀䈀㔀㤀䔀㈀㔀䈀　䈀䐀䐀　㈀㘀䈀㜀㌀㔀䌀㐀䄀㈀䘀䈀　㈀䐀㄀　㈀䘀䈀㔀㜀㜀䐀㌀㔀㜀䐀㤀䄀䔀㄀㈀䈀䈀䔀䐀䄀㈀㌀㜀䌀㐀㜀　㄀䄀䔀㈀㤀　䄀䔀㔀㄀䈀㘀㌀㜀㔀㜀㠀㄀　㜀䌀㠀㤀㔀䈀㜀䈀䐀䄀㤀㘀䐀䄀䔀䈀㈀㈀　䈀㄀䈀㌀　㔀　㤀䈀㤀㜀㄀䘀㤀　㈀㜀㘀㄀䌀䘀㄀䘀㌀㔀㠀䄀䔀䐀㌀㤀䌀㐀䈀㤀䐀㌀㐀㈀䌀　㠀　㄀䈀㌀䄀㐀㠀　　㔀㌀㌀㐀　㄀䄀䌀㜀　䌀䈀㤀㈀䌀㤀㘀䄀䔀䔀㔀㈀　䔀　㔀㐀㈀䔀䌀㈀䐀㄀㔀䌀㌀䔀㤀䌀　㐀㌀䈀　㜀㌀䘀㐀㄀㤀䌀㤀㈀㘀㐀㄀䌀㘀　䐀㌀㌀䔀㘀䄀䌀䈀㌀㤀㈀㈀䌀䈀㈀䈀㘀䈀䈀㈀䔀㔀㜀㠀㤀䌀㠀㈀䔀㘀　　䈀　䌀䈀䐀㠀䈀䄀㐀䈀䘀　㜀䐀　㄀䘀㄀䔀㈀㠀㈀㄀　㈀㄀㈀䄀㘀㈀䈀㌀䈀㜀㤀㠀㄀㜀㘀㄀䐀䔀㠀　䄀　㘀㤀　㄀　㌀㔀䐀㄀䄀㜀㌀㐀㔀　䄀䔀㐀㄀䌀㤀㌀㈀㌀㐀㔀　䘀䔀䐀㤀㘀䄀䈀　㤀㠀䌀　䈀㘀　䘀㌀䈀䔀㔀㔀䔀䈀䈀　㤀　㤀㈀䐀㐀㤀㔀㠀㤀㐀䔀㈀㐀㤀䔀㜀㘀㠀䔀䄀㘀䄀䘀㄀䌀㘀㘀　㄀㜀㘀　㤀㤀㄀㌀　䄀䈀䘀㤀䈀㘀䘀㤀䌀㈀㄀㔀䈀㘀㈀䈀　㐀　㘀㠀䈀㜀㤀㠀㐀㔀㄀䔀䐀㤀㜀㌀㐀䐀㌀㌀㌀㈀㐀㌀㄀㔀䔀䈀㌀䌀㠀㈀㄀㔀㜀　　㘀㌀䐀　㘀　㤀㘀㜀㔀㈀㄀䐀㘀䘀䄀㐀㈀䐀㌀䐀䄀䐀㐀㈀㜀㘀䔀㜀䘀䘀㤀　䘀䐀　䈀㌀䔀㄀䄀䈀㌀䈀㌀䔀䌀㤀　䔀㌀䔀㜀㜀㘀　䘀䈀䄀䐀　㜀䘀䄀䈀㘀㘀䐀㌀䘀㐀　㌀㤀㘀㄀㜀䌀䔀㜀㤀䄀䔀䌀㄀䘀㠀㜀　㘀䈀䔀䈀䄀　㔀㄀㘀㐀㄀䌀㜀㤀䈀㘀䘀䈀䌀䘀㤀䌀䔀䌀䈀㘀䘀䈀䌀㠀䔀㄀䔀㘀㤀㜀䈀㜀㘀㄀㤀㔀㌀㠀㈀䄀㠀㐀䄀　㜀㐀㔀䘀　㌀䐀䌀㈀㠀㔀㔀㘀䐀㤀䐀㔀㜀㌀䐀㐀䌀㤀㘀䄀㠀䈀䌀䄀㌀㐀㐀㜀㤀䔀㠀䐀㔀　䌀㔀㤀㄀㐀䄀㜀䈀㘀㤀䈀㠀䌀䔀㔀䐀㄀㜀㌀䔀㌀㜀㜀䌀㜀䐀㘀㐀㔀㜀㠀㐀㤀䘀䔀㠀㤀䐀㄀㠀㤀䌀䔀㔀㤀䐀㄀㔀㘀䌀䔀㜀㈀䘀䈀㔀㈀䘀䘀㐀㈀䔀　䌀㜀㘀䘀㄀䌀䈀䔀䐀䌀䈀䐀㐀㘀䈀䈀䐀䌀䈀㠀㌀䌀㜀㈀㈀䈀䘀㜀㌀㤀䐀䘀㐀㤀䐀　䌀䘀䌀䄀䔀䔀㠀㤀㐀䔀䈀㔀㐀䐀㄀䄀㜀㤀㄀䔀㄀㠀㠀䄀㜀㤀㐀㐀㤀䄀㠀　㤀㜀㜀㌀䐀㌀㌀㔀㄀㤀䐀䌀㘀䌀䌀㔀㈀㌀䈀䐀㐀䌀䘀䄀㐀䄀䘀䌀㈀㔀㤀㔀㔀䐀㈀㘀㐀䐀䄀㄀㌀䌀㈀㘀㄀㄀䄀䄀䌀㈀㜀㈀㐀㐀䈀㐀　䘀㘀㠀䘀㈀㈀㈀㠀㜀䘀　㄀㐀㄀䘀㤀䘀㌀　㐀㄀㔀㘀䄀䘀㌀㤀㜀㤀䐀㄀　䄀㄀㈀䄀㄀䄀䔀㈀㘀㈀㜀㄀㤀㌀䌀㠀㐀㐀　㠀㔀㤀㐀㔀　䌀㈀䈀㄀䐀䔀㤀㜀㌀㌀㌀䈀㈀㔀㄀䘀㐀䔀㔀䐀㈀㤀㌀㜀㈀䘀䄀㔀㤀㄀䔀䔀㈀䌀㜀　䌀䐀㤀㄀　䘀㄀㈀䌀㔀㄀㐀㠀䄀䄀䐀㈀㈀䄀䔀㠀㐀䌀㔀㄀䄀㤀㄀㄀　㜀㘀㈀㠀䔀㈀㔀㔀㤀㤀䔀㐀㐀䌀㌀䐀䘀䄀㘀䌀㜀　　䘀㠀䔀㄀　㠀㠀䌀㔀䌀䔀　㠀㔀㔀䄀㄀　㜀㠀䄀㄀㠀䔀　䄀䈀䌀䘀㠀㘀㘀㘀䌀䔀　　㔀　㤀㌀㘀㐀㌀㘀䈀㄀㔀　㤀䈀䌀㈀㠀㤀䔀䐀䔀䔀　㠀㌀䄀㌀㈀㈀㈀䘀䘀㈀㠀㄀㄀㜀㠀㤀㌀㌀䄀㜀䌀䔀㠀䔀䈀㤀㌀　䈀㌀䔀㘀㌀㌀䄀㌀㐀㌀㈀䔀㠀　䄀䌀䌀㤀㄀䔀㘀㈀㤀䔀㤀㔀㈀㔀䌀㐀㜀㈀䐀㠀䐀　㄀㄀䘀䄀㤀䌀䘀䌀㈀䄀㐀㘀　䌀㘀䄀㤀㠀㔀㘀㜀㈀㘀䈀㤀㠀䌀㜀䔀䐀㈀㈀䈀㠀䘀㔀㜀㄀㠀䐀㈀䔀㈀　㤀㠀䔀䐀㐀䘀㐀䌀䐀䌀㜀䐀䌀䐀㘀䐀㈀㜀䈀䄀㔀㘀㜀䘀䈀㈀䄀㄀䔀㌀䄀䔀㄀䄀䔀䐀䌀㤀㌀㔀䔀䈀䘀䔀䘀㌀䄀㤀㔀㔀㌀䐀䘀䈀䈀㌀䌀䈀㘀䌀㈀䘀䔀䔀㤀㠀㌀㜀䔀䘀䌀䔀䔀㄀　㜀㄀䔀䌀䘀㜀䔀㜀㜀䌀㜀　㔀㄀㌀㠀㜀䈀䔀䄀㌀㤀䘀㄀㠀㌀㠀䘀䔀䌀㘀㜀䈀㘀䘀䈀䌀䘀䔀㜀䈀㐀㐀㌀㔀㌀㌀䈀㈀䌀䈀䔀㠀㐀䘀㄀㄀䐀㔀䄀㠀㈀　　㐀㜀䘀㐀㔀䄀㠀䄀㘀㔀䈀䄀㈀㄀㈀㔀㐀㤀㔀㘀䘀㄀㈀䐀㔀㐀㈀䘀㔀䐀䄀䐀㤀㘀㘀㜀㜀䈀㌀䈀䘀䌀㔀䈀䘀䄀䈀㘀㠀㘀䘀㤀㄀㈀䐀䔀䐀㐀䌀　㜀㤀䈀㠀䈀䄀㘀㌀䄀䄀㜀　㘀䔀㜀㌀䈀䔀㜀　㜀䄀䘀㜀㐀㔀䔀㄀㤀㔀䌀㔀䌀䈀㐀䄀㤀䔀㠀㔀䐀䘀㘀㌀䐀䘀䐀㜀㌀䘀㘀㐀䈀䘀䈀㔀䘀㜀䌀㘀䄀㈀㔀㄀㔀䈀㔀㈀㜀䐀䌀㄀㤀䄀䄀䐀䔀㌀䔀㤀㌀㤀䄀㘀㘀䔀䘀䄀　㤀㘀㔀㄀㄀䘀䐀㠀䘀䘀䔀　䘀䈀㤀㌀䔀㜀㐀䈀䘀䘀䔀㜀䌀㄀䔀䘀㈀㤀　㔀㌀㈀　䔀㔀㜀㈀　㈀㐀㜀㄀㌀㈀䔀䈀　䄀㌀㄀㠀㠀㔀㐀䈀䌀㜀㈀　䄀㠀䌀䄀㈀㄀㘀㌀　㈀䄀㤀　㘀㄀䌀㐀䘀㐀　䘀䈀　　㌀㔀䄀㠀㄀䄀䄀㘀㈀㈀㠀㠀䈀㤀㔀㐀䐀　䄀㔀㌀㐀㐀㐀䌀䘀䘀㐀㔀㠀㐀㔀䔀㄀㐀㘀㈀䘀䄀㔀㜀䘀㈀䄀㘀㜀䘀㠀㔀㤀㠀䘀䔀㄀㔀㘀㈀䘀䄀㔀㜀㠀㠀㈀　㐀㔀㠀䌀䔀䔀㄀䔀㌀䌀㠀㈀㠀䄀㠀㤀㤀䌀䌀　㤀䄀㠀㜀㤀㌀䐀㐀㌀㘀㘀㔀㤀㔀㤀㘀㈀㌀㤀䄀䈀㄀䄀㔀㔀㈀　䐀㘀䘀㤀䈀㔀㘀㜀㘀㤀㘀㠀䘀㜀㤀㐀䌀㐀㐀㠀㌀㔀㄀䐀㄀䌀㘀㤀㔀㄀㄀䘀㘀㐀㜀㠀䌀䘀䈀㄀䌀㌀㄀䔀䔀㜀㌀㄀䔀㔀㌀䐀㄀㌀㘀䈀䐀㠀㔀䔀㄀䄀㈀䈀㄀㘀㘀㜀䐀䌀䈀䄀䄀㔀䘀㘀　䐀㈀䌀䘀㄀㤀䘀㐀䌀䘀㌀㐀㤀䔀㐀䐀㄀䘀㈀㘀㜀㤀㐀　䌀㘀㐀㔀䌀㠀㠀㌀㤀㄀㘀㐀䐀㘀㈀㄀　㔀　㠀㜀㤀㐀㠀䄀㌀䌀㤀　㌀㘀䄀㔀㘀㔀　䌀㌀㜀㠀䌀䈀㔀䌀㌀䘀䌀䄀䌀䈀㔀䌀㔀䐀䈀㔀䔀㜀䄀㈀㄀㜀䈀㌀㜀䘀㔀䈀䘀㄀䈀䈀㤀䈀㔀䔀㔀䔀䘀㤀䐀㠀㔀　䌀㤀䌀䘀䐀㜀䘀㔀㌀䌀䈀㤀㘀䘀䌀䐀䔀䄀䌀㜀䈀㌀䌀䈀㈀㠀㜀䔀䐀㈀㄀䌀㔀㠀　㌀䈀㤀䈀䐀䐀㤀㈀䐀㐀䘀䔀䔀䘀䌀䔀㜀㜀㤀䘀㐀㈀䘀　㘀　㘀㜀䔀䘀㌀䔀䄀䈀䈀䔀䘀䈀䘀㠀䄀䔀㔀㤀䄀㘀䐀　　㔀　䄀䘀㈀　䔀䄀䐀　㈀　䄀㤀㐀䈀㘀㘀㐀䌀㐀䄀㌀䄀䄀㄀䌀䄀䌀　㔀㈀㈀㘀䌀䐀㤀䌀䌀㜀䌀䌀㘀㜀㤀㘀㌀㈀䄀䈀㄀㠀㔀㘀䐀　㜀㠀㠀㄀㄀㜀㄀䌀㐀䔀㐀䐀㜀　　　㤀䄀㠀㜀㄀㈀㘀㄀　㘀㐀　㄀㐀㈀䄀㜀㘀䘀㄀㤀　㠀䘀㐀㘀㤀䌀䐀　㐀㤀㐀㔀䌀㜀㔀㘀㤀䘀㈀䐀䔀䌀䔀䐀㜀䘀㘀䐀䘀㌀䌀䔀㘀䈀㜀　䘀䘀㘀㌀㘀㠀　㔀㠀㈀　㌀㐀䈀㜀㠀䘀䌀㈀㠀㤀㤀䐀㔀㌀㐀㜀䈀䈀㌀　㔀䈀㘀㠀㘀㌀㤀䘀䄀䘀㐀䔀㌀㌀䘀㘀㐀䘀㘀㌀䔀䄀㔀㜀㘀㤀䔀䈀㤀　㄀　㌀䔀䈀䔀㈀㌀䔀䌀䔀䔀㐀䔀䄀䌀㘀　㄀䘀㔀䈀㜀䐀䈀㘀㔀㠀㈀㔀㜀䐀㔀㜀㤀　㌀䔀䌀　䌀㄀䔀䌀㘀㐀㈀㈀㔀㤀㈀㈀㔀䄀㔀㈀㌀䘀㐀䘀㠀　㈀㔀㤀䈀㈀㔀　㠀䔀㌀㐀㔀䐀㜀㄀㄀䌀㔀䄀䘀㌀䈀㜀㌀䐀䐀㘀䈀㐀䄀䌀䘀㤀䐀㈀䌀䈀㤀䄀䌀䔀㌀䐀㜀㜀䐀㈀㘀㔀䄀䔀㈀㈀䄀㘀䘀䌀䐀㄀㤀㔀㌀㌀㈀㘀㌀䔀㄀㔀㤀䘀䐀䔀䈀䌀䘀㠀㠀㘀䄀㄀㜀㜀㜀㄀㄀䘀㌀㘀　䘀㜀䘀㐀㄀䔀䘀㐀㜀㜀䐀㔀㠀䌀䈀㄀㐀㄀㄀㘀䐀㌀䌀䔀䘀䐀䔀䌀䌀䔀䈀　䄀㜀䔀㘀䌀䔀㜀㘀䄀㈀　㘀㐀㔀䘀㔀㄀㌀　　㔀　䄀　䈀㜀㤀㤀㐀㠀䘀㈀䄀㘀䈀㌀㔀䐀㈀㈀䔀㈀䈀㘀㠀㤀㜀㄀㘀䈀㐀䄀㌀　㔀䔀䐀㤀㈀㠀㈀㜀㘀㈀㐀㈀䘀㐀㐀㘀䔀㘀䌀㘀㌀䄀㈀䄀䔀䔀㠀㐀㐀㘀㄀㤀㘀㌀　䈀㔀䄀䌀㈀䐀㜀䄀㔀㔀㜀㐀䄀㌀䈀　㔀㌀䐀㠀㔀䄀䘀㘀䄀㐀䘀㌀㌀䘀䄀䈀㜀䘀㐀䐀㌀䈀　㐀㘀䘀䌀　䔀㜀䄀䐀㘀䐀䄀㤀㜀䔀䐀䘀㘀䈀　䈀㔀㈀㄀㜀㔀㄀㤀㐀㔀䄀　㜀㐀㔀䐀䘀㐀㈀㜀䔀䄀㄀䈀　㔀　㔀䌀㈀㠀㈀䐀䈀㐀㈀䘀㜀㐀㜀㐀䘀㄀㔀䐀㐀㈀㤀㜀䐀㠀㈀㔀㜀㔀䐀㤀䈀䈀㄀䌀䘀䐀䔀㔀䘀䐀㜀㄀　㔀䄀㜀㌀㘀㤀㜀㔀㔀㠀䔀㈀䘀䔀䈀㄀　䐀䈀䄀㔀㈀㔀䔀㔀㐀䈀㈀䄀㔀㘀㤀㔀䄀䔀㈀䄀䐀䈀㔀㐀㜀㘀㠀䘀䘀㠀䈀　㜀䐀㜀㜀䌀㔀㤀䔀䔀䄀䘀䈀㘀䄀㤀䘀㄀　㤀䘀䈀㄀㌀䘀㄀䔀㜀䘀䄀㈀䄀㈀䄀䘀䘀䌀䔀㔀㜀㈀㐀䘀㐀㔀㐀䔀㤀㤀㠀䈀䔀㘀㄀䄀䄀㔀䈀㤀㐀㘀㔀㤀䄀䔀㔀㄀㘀㄀㤀䄀䔀㄀䄀䌀㘀㌀㜀　䄀㌀㌀㐀䐀㜀㈀㠀䌀䈀㌀㔀䌀㈀㌀㠀㤀䈀㐀㈀㈀䘀䌀䄀㜀㐀䘀　䘀㄀㤀㠀㔀䐀㘀㐀　㈀㤀㄀㜀㈀㌀㜀㈀㌀䐀㔀㠀㐀　㌀䐀㠀䘀㔀㄀㠀䘀㔀㔀㜀㤀㌀㌀　㄀㔀㜀䘀䈀㌀䈀䘀䐀㔀䈀䘀䌀㠀䈀䘀䌀䘀䘀䘀䈀㘀㤀䘀㔀㔀䘀䌀䌀㔀䘀䔀㄀㔀䘀䔀㐀䘀䘀䌀㐀䌀䈀㄀䘀䘀㈀䔀㌀䘀䔀㔀㜀䘀㄀㄀㤀㄀㤀㄀㄀䈀㔀㄀㌀㠀㠀㤀㘀　㌀　㔀䌀䘀㠀㜀　㄀㔀䄀㌀䈀　䄀㤀䘀　　㐀䄀㐀　　㔀㐀㈀㄀䌀㄀　㌀䔀䐀㜀㌀㜀㤀䐀㈀㈀㐀䈀㈀　㄀㠀㌀㈀㌀㐀㈀㔀㠀䈀㌀㌀　䐀䌀㄀䐀䄀㘀䌀㈀㈀㄀㌀㜀䌀㜀㤀㠀　㄀䈀㔀䌀㐀㔀㐀䘀䔀㜀㤀䌀䔀㄀䌀䘀䔀䈀㤀䔀㄀䌀㐀䈀㐀䌀㠀㠀㐀㘀䄀䄀㐀䔀㈀　　　䌀㤀㐀䘀㤀　䐀䄀㜀㈀䘀㔀䐀㠀㜀㐀䘀䄀䘀㈀㌀䌀䔀㘀㤀㤀䘀䈀㤀䌀㔀㘀䌀䌀㈀㐀䘀䄀䄀㔀㔀䘀䈀㈀㌀䘀㠀㐀䌀㜀䘀　㐀㤀䘀䔀㔀㈀㜀㄀㘀㌀䄀㌀䘀　㤀㌀㌀䌀　㤀䘀㐀䔀㄀㄀䌀䌀㤀㔀㤀㌀䈀䄀㜀㐀㈀㐀㔀㄀䈀㔀　䘀㌀㄀㤀䌀㈀䄀䘀㐀㜀䐀　㜀㐀㌀㤀㤀㄀㌀㔀㔀䈀　　䄀㔀䘀㄀䄀㜀䘀㐀䐀㔀㔀　䔀㘀䈀䄀㌀㈀䄀䌀㜀䔀㐀䄀䄀㐀䌀㠀　㔀㄀䐀㐀㜀㠀㌀䔀㌀㜀䔀㠀㜀䐀㘀䐀㔀㔀　㄀㜀㈀㈀䘀㈀㔀䘀㄀䄀䄀䘀㐀䔀㈀䈀䄀㘀㌀㜀㔀㔀㐀㜀㌀䐀䐀䄀㘀㌀䄀䄀䄀　䔀㠀㜀㘀䈀㤀㐀　㄀㤀䘀䄀㤀㄀䐀㤀㈀䔀㤀㄀㌀㌀㄀㠀㜀　㄀䄀䐀䌀䄀䈀㠀㠀㄀䔀䘀㄀　㌀㜀　䔀䔀㌀㤀䈀㠀䌀㔀㠀䔀䌀䐀㄀䐀㌀㄀㘀㈀㤀㔀㌀䌀㠀㐀㈀䄀㤀㤀　　㜀㔀㄀㈀㈀㄀㘀䌀䘀䘀䐀㈀㜀㔀㘀㈀㄀㜀㄀㠀㔀㜀㜀䌀㈀㘀䄀㐀䐀㄀㜀䄀㜀㤀㤀䘀䌀㘀㄀㘀㠀㘀䐀㐀䄀䘀㐀㤀㌀㤀䌀䘀㄀䐀　㌀䘀䌀䔀㠀䄀䄀㌀㐀　䘀䌀䈀　䈀　㤀㘀　㄀㤀㈀㌀㌀㄀㈀㠀㌀㌀㜀䌀䌀䌀㤀㠀㔀䔀䄀㈀㘀㄀㈀㈀䈀㜀㄀㌀㐀㐀㔀㠀㄀㐀䄀㌀㤀㠀㠀䌀㌀䌀㄀㄀㈀䈀㠀㔀㈀䔀䘀㐀䄀㄀㈀䄀㜀㠀䈀䄀䐀㌀　㌀㠀㠀䈀㄀䘀䔀䘀䘀㈀䔀㠀䌀䔀㔀䔀㔀㌀䐀㘀㌀㜀䔀㈀䔀㜀㄀㐀㤀㔀䐀䄀㔀䌀䐀㔀䔀㔀㤀䄀䄀䄀䄀䈀㐀䔀㤀㔀㘀㘀䄀㌀㠀䔀㐀㠀㄀　　㠀㄀㔀㔀䌀㄀　䐀䄀䌀䔀㐀㄀㤀䈀㈀㈀㄀㜀㜀䄀㔀㤀㈀㈀㤀㜀　㘀㐀㄀䈀㐀䐀㐀㘀㄀䔀㜀㈀䈀䌀㔀㈀　䄀䌀㠀㠀　䈀㈀㈀㤀䈀㘀　㠀㈀䄀　㔀㠀　䐀㘀㌀䄀䐀䌀　䌀㐀㜀㐀㈀㘀㄀䈀䄀㈀㠀䌀㔀㘀㈀㔀㌀㘀㘀䘀䐀䔀　䌀　䄀㜀㠀㌀㜀䘀㘀㘀㐀㜀㐀㠀䔀䈀䌀　㄀㐀䐀䔀㔀㄀㐀㐀　㄀㠀㤀㘀䌀䄀䌀䈀䌀㌀㌀㔀㘀㘀㔀㄀䐀㌀㄀䄀䌀㤀㄀䘀　㠀䈀㠀䌀㌀㐀㐀䘀䔀㜀㌀㠀䘀　㐀　㌀䔀㌀㐀䄀䈀㤀㘀㌀㈀䈀㤀䄀䌀㘀䌀䈀䔀㌀㌀㔀㔀㐀㜀䐀㜀䄀㜀䌀䌀㌀㔀㤀㌀㠀　㄀䔀㠀㄀㜀㐀㌀㈀䈀㄀㄀㌀㜀㘀䌀䘀㌀　㄀䔀㔀䘀㘀　䐀㄀䈀䐀㜀䐀㔀䌀㜀䔀䔀㜀㤀䔀㔀䌀㄀䐀㘀㈀㤀㄀㌀䄀䄀䔀䔀㤀䔀㜀䘀䔀㌀㠀䈀㄀䐀䐀䄀䈀㌀䘀㘀㤀䔀㘀㔀㄀䈀䈀䈀㌀䌀㤀䔀㘀㐀㜀　䔀䈀㐀䈀㜀䈀䐀䄀㤀㘀䈀䐀㜀㈀䔀㌀䐀䈀㄀䘀䌀　䌀㤀䄀㄀䔀㔀㌀㜀㔀䌀㌀㔀㜀㔀㜀㈀䄀㤀㈀䘀㔀㘀㌀㜀㜀㌀䘀㌀㤀䌀䔀㤀䈀䐀㄀㔀䌀㔀㠀㤀㄀㤀㄀䈀䄀䔀䘀㘀㔀䐀䈀㠀䘀　䌀㈀㠀㘀䐀㈀㔀　䐀㠀㈀㤀㤀㘀䄀㔀䄀㘀㘀䌀㔀䌀䐀㠀䘀㄀䌀㠀䌀㔀㌀䘀㐀㜀䐀䌀䄀䄀㘀䌀䘀㠀䘀䘀㔀㈀㔀㔀䈀㘀　㜀㠀㄀㄀㜀㔀䔀㐀㜀㈀䌀㔀㐀㤀㄀㔀㄀㄀㘀㈀㄀㘀㤀㔀㐀㐀䄀䘀㔀㐀㠀㤀䈀㈀䈀㘀㠀䈀㌀　㔀㘀䐀㄀㄀㈀㌀　㜀㤀㜀㘀㌀䐀䈀䘀㠀㌀㄀䄀㌀　䌀㌀㔀㌀㘀䘀㤀㈀㄀㠀　㜀㘀㠀㜀　㠀㘀㤀䔀　㔀㄀㠀㔀㠀㐀㈀㈀㈀㈀䄀㤀㤀㄀㤀㘀㄀㐀㌀㔀　䄀䄀㈀䐀　䘀㄀　㌀䔀㈀㤀䈀　㔀㘀䘀㄀㠀㐀㔀䔀㈀㤀䈀㄀䐀　䔀㜀㌀䘀䌀䘀㤀䌀㈀䘀㤀㠀䈀䈀㤀䔀䈀䈀㤀㐀䐀䐀䌀㈀䔀㠀䔀　㄀㐀㠀㜀䐀䐀㠀䌀䈀㌀䐀䌀䈀㄀䐀䔀㌀㐀䔀㜀　㈀䌀㠀㄀㌀㐀䈀㌀䈀　䌀䐀䌀䔀㤀　㜀㤀䌀　㘀㄀䔀㐀　　㄀㈀䔀㔀㘀㤀㔀䄀㘀䄀䄀䌀㠀㘀㠀㔀㜀㘀䘀㘀㐀䘀㐀㈀䐀㌀㔀㠀㌀㄀䌀㄀䌀㈀㈀㘀㜀㘀　䐀㔀㠀䘀䄀㠀㤀䄀㤀㠀　㜀㄀㐀㜀䄀㤀㈀䔀䔀　㠀㌀䔀㌀䘀㜀㈀䘀㄀䐀㘀㌀䘀䌀㐀㌀　㈀䐀䐀䄀　䔀㔀㌀䔀㌀䐀㠀㔀㄀㜀䔀䈀㐀㄀㤀䌀㠀　㠀㄀㄀㜀㘀䈀㈀䐀㤀㔀㔀㈀㜀䘀㔀䈀　　　䐀㄀㌀䐀䌀㐀䘀㜀䈀　㠀䈀䔀㄀㄀㈀䐀㘀㄀䐀䌀䔀䘀㌀䄀㐀㌀䔀㠀㠀㘀㐀㠀䔀㈀䐀　㘀㐀㔀㄀㈀　㘀䈀䈀㜀䌀㠀㤀㈀㘀㈀㜀㐀㜀㔀㜀㔀㐀㤀㐀䈀㄀㄀㠀㠀㜀㤀䌀䐀㈀　㌀㄀㄀䌀䔀䔀䄀㄀㌀㔀㤀　䈀䄀䄀㄀㈀㐀㌀䘀㤀䔀㔀㈀　㌀㄀㜀㌀㐀㔀䔀䐀㄀㔀䐀䈀䐀㜀㔀㘀䈀䐀䘀䌀㄀㠀㌀䌀䔀㐀㐀㐀㔀䐀㄀䄀㌀㠀䘀䄀㠀㐀䐀㔀㜀㌀䐀㐀㘀㔀䐀㜀㤀㈀㜀䔀㐀䈀䄀䈀㌀㌀䘀䈀䄀㜀㌀䔀㠀㤀䔀䐀㤀䐀㔀　㄀䈀䌀䌀䔀㘀䌀㐀㄀䔀䈀䌀䌀䄀㜀㐀䌀㌀㤀䈀䄀䔀䐀䌀㌀䄀㘀　㜀㌀䐀㠀　　㌀䄀㜀䐀䌀䐀䔀㌀㐀㄀㔀㜀㄀㜀䄀㌀　㔀　䐀　㘀㤀䌀㌀䄀䘀䈀䈀䐀㈀　㤀㈀㜀㈀䌀䔀㌀㤀䐀㄀䔀㌀䈀㜀㐀㜀䄀㈀㐀䈀㐀㐀䌀㘀䈀䄀㠀䘀䘀㐀㄀䌀䄀㌀㌀䌀䄀䔀䄀䔀　㈀㤀㤀　䌀㤀㌀䌀　㔀㔀㘀　㜀㐀䘀䌀䌀䔀㜀䌀㔀䔀㘀㠀㄀　　䈀㄀㌀䐀㜀㠀㠀㤀䐀㔀䌀㄀䄀䈀㤀㌀㔀　㠀䈀㜀䌀䐀㈀㠀㄀㤀㜀䄀䌀䐀㄀䐀䔀䈀䌀䈀䐀䌀㄀䔀䈀䈀㈀㠀㈀㈀䔀㈀䌀㌀䘀䈀㤀㤀㜀㤀㠀䈀㐀䈀䌀䐀㠀䐀䔀䔀　䌀　㔀䐀㌀䔀䔀䌀㠀㔀䌀㜀䈀䌀䐀　㌀䈀㈀㜀㐀　㔀　㄀㐀䈀　䄀㤀㈀㄀㜀　㌀䄀㐀　㔀䐀㄀䘀䐀㠀㄀䈀㜀㠀㌀㘀㌀　㄀䌀㘀　　㈀㜀㤀㌀㜀㔀䈀䐀䔀㠀㄀㘀㜀㌀㤀䔀㜀䘀䄀䈀　㄀䘀㌀䘀㈀䘀㌀㠀　㠀㄀　　㠀㄀㄀䔀㄀㠀㐀䘀　䄀㤀䌀　　㠀㌀㤀䌀㄀㐀㄀䌀㠀　䈀　䔀㤀㘀　䈀㔀䘀㈀㐀㠀䔀㜀䈀㤀㈀㤀㄀㐀㔀㤀䌀䘀㔀䌀㐀䐀㘀㈀　㄀　㌀㜀䈀㤀㌀　䌀㜀㌀䘀䌀䄀䐀　㘀䈀䘀㤀䌀㈀䌀䘀㌀㘀㈀䄀㤀㠀㐀㈀　㐀㠀㤀㤀䌀㘀䔀䌀䌀㔀㠀㜀㔀　㘀㄀㄀㤀䈀　㤀㌀　䄀䄀䔀䌀㔀　㄀䌀㌀㠀㤀䘀㄀㤀㔀㜀㠀䈀䄀　㔀㤀㤀㔀䈀㄀　㜀㠀㄀㠀㌀䐀㜀㐀䌀䔀㜀㔀㤀㔀㔀䐀㔀㘀㘀㌀㌀䈀㤀㄀　㠀㤀㜀㈀㠀㠀䘀㠀㌀㔀㘀㈀䄀䔀䄀㈀㈀㔀　䘀㐀䈀䌀㠀䄀　㌀㤀㄀㜀㔀㈀㘀䐀䌀㘀　㤀䌀㘀䌀䈀㠀㤀䌀䘀䌀䌀㌀䈀　㈀䌀㌀㐀䌀㌀㜀㘀䘀㜀䌀䔀䘀䈀㈀䌀㜀㔀䈀㔀㔀䄀㤀㔀䘀䐀㈀䄀䔀㤀䈀㌀㜀㘀䘀䔀㜀䄀㐀䘀䔀㠀㜀䘀䈀㘀㜀㔀䌀䐀䈀㔀䄀䐀䘀㐀㌀䔀䐀㄀䔀䔀䄀䘀䈀䐀㄀䈀㠀䔀㤀䘀㌀䔀㘀䐀䘀㜀㔀㄀䈀㤀㔀䘀㤀䔀䔀㐀㌀㐀㐀　㔀　㄀㄀䌀㐀㜀㠀㄀䄀㠀㐀　䄀㐀䄀䔀㌀䌀㈀䈀　䈀䄀䄀　　䌀䌀　　䘀䌀㌀　㤀㠀　㄀䔀㔀䌀㤀㤀䈀䘀㈀　䈀㠀㔀㜀㄀㜀䔀㈀㐀㄀㈀㄀䈀㈀㌀㔀㈀㄀㐀㐀㘀㔀㤀㜀䈀㘀䐀㌀䌀㄀　㜀㤀㄀㘀䈀㈀㜀㤀䄀　㠀㈀㌀㈀　㈀㐀䄀㤀㤀㐀䌀㄀㐀䔀㈀㄀㔀㄀　䈀㠀㠀㈀䌀㌀䘀㔀㌀㘀　㠀䄀㈀㔀䄀㐀㘀䌀㐀䄀䈀䈀㘀㐀㌀䌀䈀　㠀㄀䔀㌀䐀㤀㐀䔀㘀䘀㄀㠀㘀㐀㈀㐀䈀㔀㔀㄀䘀䐀䄀㐀㌀㘀䈀㈀䘀㘀㈀㄀䈀䄀䘀㔀　㔀㐀㤀㈀　㘀㄀㔀㘀㠀㐀㌀䘀㐀㌀䌀㈀㄀㄀䄀㐀䈀　㌀　䘀䐀䄀䄀　㔀㜀㄀䘀㄀䄀㌀㜀㔀㔀䐀㐀䄀㐀㐀㄀　㐀㘀䐀㄀㐀㜀䈀㈀㔀䄀㠀㄀　䌀䄀䌀㔀　䌀䄀㠀㄀㜀㘀㜀㠀　䔀㤀㘀㈀㄀䈀㘀䌀䄀㌀䐀䄀䘀㤀㐀䈀㠀㐀䄀㔀㜀　㈀㤀䈀㔀㠀䌀㔀䘀㈀㘀䄀䌀　㌀㘀䈀䔀㄀㔀䄀䄀䄀㤀㜀㔀䘀㈀㜀䄀䌀㄀㔀䈀㜀䌀㌀䔀䐀䐀㐀䄀䐀䘀㐀䔀䐀䐀䌀㘀䐀䘀䌀　䔀䔀㄀㈀㜀䔀　　㄀䔀㄀㘀䔀䘀㄀䔀㜀䔀　㌀㄀䘀㄀㐀㔀㜀　㤀㠀䐀䈀㈀䘀䘀䔀㄀㘀䈀䌀㈀䌀㜀䔀　㠀䐀䔀㄀㌀䈀䘀　㘀㜀䘀㄀㈀䈀䘀　㌀㘀㜀䌀㐀㘀䄀䘀㐀㌀㠀䄀㈀　䘀㜀㠀䌀㐀　䄀㔀　㈀䔀㌀㘀㠀㠀䄀䐀䌀　㄀　　㔀㤀䈀䄀㄀㜀䈀䐀㈀㌀㘀㐀㐀䌀㘀䔀㤀㔀䌀䐀䐀㜀䈀㠀䌀䐀㈀䌀　㘀㈀㘀㄀㄀㜀㤀㌀䈀䈀㐀㈀䄀　㌀㈀　　㔀㤀䔀䘀㜀　㔀䘀㄀　㈀䌀㌀㘀㘀㈀䈀䄀㐀㘀䈀䐀㐀㈀䐀䔀䄀㔀㘀䌀㌀㘀䈀䈀㠀㐀㔀㌀㐀䈀㐀䔀㈀㘀㔀　䐀䘀䄀　䘀䘀㠀㄀䌀㐀㐀　　㈀㈀㐀䘀㌀㜀　　䔀　䐀㈀㈀䌀㜀䘀㌀㌀㄀㐀㄀㜀㐀　㤀㠀㈀　㠀㘀㠀㠀䄀㠀䄀㤀㤀㘀㤀䔀䔀㌀㘀㔀㄀　㐀䄀㈀㤀㤀䈀㌀䌀䔀㜀㈀䄀㈀㐀　　㌀㘀㠀㐀䈀䐀䄀䄀㄀㌀䐀䌀䄀㄀䈀㠀㘀㈀㄀㘀䌀㄀㈀㈀㠀䔀㄀　㠀　䌀㄀䔀㌀㐀㘀䌀㤀䈀㘀䌀㤀㐀　䐀䈀㔀　䌀㈀㄀㐀㈀㄀㤀㌀　㈀䄀䘀䐀䔀㔀䈀䘀㌀㄀㌀㤀　䘀　㘀䘀䌀㐀㌀㤀䐀㐀㌀㤀䐀　㄀䐀䘀䔀　䄀㤀㐀䔀㌀㌀䘀㐀㌀　㤀㌀䘀㜀䄀䌀㘀㤀㤀㤀䐀㄀㘀㠀䄀䐀㌀㠀㤀㤀䌀䘀㐀䄀㘀䈀㄀㤀䘀㤀㈀㤀㠀㐀㔀㌀䌀　　㠀　䄀㘀㐀䄀䌀　䈀㄀㄀㄀㐀㐀㠀㔀㘀䈀㠀㌀㌀　㔀䔀㄀㈀䘀䈀㌀䐀䐀䈀䘀㌀䄀㄀㔀㈀䈀䘀㘀㈀㔀䈀䔀㜀䔀㈀䔀㜀䈀㄀䐀㔀㌀㌀䔀䈀㐀䘀㔀䔀䄀㄀㔀　䈀䐀㘀㔀　䈀㜀㄀㄀䄀䄀䌀㐀㜀㤀䄀㌀㠀㜀㄀㄀㔀㔀䔀䄀䈀㘀䄀䘀㔀䘀㐀　㤀㐀㤀㔀䄀㜀㐀㠀㘀䌀䌀䐀䘀㤀㔀㔀㐀㄀㠀　㠀䔀䌀㌀䘀㈀㌀㔀㔀䄀　㔀㔀䘀㜀㈀㄀䔀㈀㘀㔀䈀㌀䔀㤀㘀㠀㈀䌀䄀䐀㌀㈀㜀㌀䐀䌀䄀䐀㔀㤀㐀䄀㜀㘀　㌀㔀㤀㜀㘀㘀䌀䄀㠀䔀䄀㐀㤀㤀　䄀　㔀䔀㄀㔀䐀䘀㈀㐀㠀㤀䄀䄀㤀㌀㈀㜀㈀㠀㐀㔀䔀㜀　　㐀㌀䘀㜀㈀　㐀㔀䔀㄀㔀㜀㈀䈀㜀㌀㜀㘀䄀㄀㘀㤀㤀䈀㜀㤀㜀䌀䈀㌀㌀㘀㜀㤀㤀　㈀㤀　㤀　䔀䘀㐀㜀㄀㤀㘀䌀䄀䐀㜀㌀㄀㐀㜀䈀䘀䔀　㠀䈀䐀　　㜀䐀㠀㐀㄀䘀㌀㤀㠀㈀㄀䈀㌀㤀㐀㈀㈀䌀　　㜀㔀㘀　㜀㈀㘀䐀䄀㐀㈀㠀㐀㔀　䈀㠀䔀䘀㠀䄀㈀䌀　　㌀㤀䔀䌀䘀㘀㈀䐀㜀㈀㈀㌀㤀䔀㔀㈀䄀㠀䄀㤀䔀㐀䌀䈀㘀　䔀䘀䐀䈀㠀㈀　㐀䌀㈀㔀䐀䘀䌀䔀　㄀㐀㠀䔀䈀㔀㠀㘀䘀㈀㘀㠀䈀䄀㌀㤀㤀㐀㠀䌀㘀㔀䄀㌀㘀㤀㜀㜀㜀䘀䈀䔀䐀　䔀㈀㈀䐀㠀㜀䔀㠀㄀㄀㐀㘀㠀㄀䌀䌀䈀㄀䐀䈀㄀㤀䈀㄀䘀㄀䌀䔀䈀㤀㜀䌀䐀䔀　㤀　㘀㌀㐀㘀㄀㈀䈀㜀㌀㐀㠀㌀䈀䌀㄀㘀㌀㔀㄀䄀　㈀㌀䈀䐀㈀㠀㜀㈀　䄀䈀㈀　㘀䄀㜀㔀䐀㠀㐀㤀䈀㤀㈀䐀䈀䈀　㘀㈀㤀㐀㘀㘀㐀㌀㐀䐀㄀㜀㈀䄀䈀㤀㠀䔀䈀䈀　㠀㘀㐀䈀㠀㐀　䔀䄀㠀䔀䘀　䘀䄀㠀䔀䘀㄀㈀㈀䌀㘀㤀䌀䈀䌀㜀㐀㤀䄀㠀㘀䘀㐀㐀㜀䔀䘀㈀㈀㠀㈀䔀㔀㠀䌀㔀㔀㐀㠀䄀䐀㐀㈀䌀䔀䐀㔀㈀㘀䐀䄀㜀㐀㘀㘀䈀㄀㄀䈀㌀㠀㘀䈀㠀㔀㔀㄀䔀㤀㠀䌀㤀㌀㔀㌀㐀䈀䌀䈀　　㤀䌀㔀㈀㔀㘀㤀㌀㔀㄀㐀㌀㘀䐀䐀䘀㈀䌀㘀䔀㄀䔀㈀䈀㈀㌀㐀䌀㌀䐀䄀　㔀㈀㜀㄀䈀㄀㐀䘀䌀䈀䄀㠀䐀　㄀　䌀㈀䈀　㤀㤀㈀䌀䌀䔀䈀㈀䄀㜀　䐀㈀㈀䔀㈀䔀䌀㐀　㜀䄀㔀䈀　㔀䌀　㘀㘀㈀㔀䌀㄀㔀㤀䘀㤀　䐀㌀䄀　㤀䔀㤀䈀䌀㠀㐀䘀㤀㈀䄀㜀䐀㈀䐀㌀㔀㤀㠀㌀㤀䈀䌀䐀䈀㜀㐀㠀䔀㜀㈀㤀䐀㌀䈀㔀㔀㤀䘀䄀䄀㔀䌀䄀㠀㔀䘀䄀㜀㈀㘀䔀　㤀㜀䘀䈀㔀䐀䔀䌀䈀䄀䔀䔀㜀㔀㘀䘀㄀䌀䘀䈀㄀㐀㜀㤀㔀㐀㌀䘀䄀䐀䘀䐀㤀䔀䘀㠀㐀　䄀㐀㤀䄀䈀　　㄀㔀㠀䔀䈀㠀㔀䌀䄀㄀䌀㐀䘀㔀䄀㐀㘀䈀　㈀㘀㠀䐀　䐀㜀䘀㈀䈀㜀䘀㈀　䘀䐀　㜀䈀䔀䌀㐀䘀䌀㄀䄀㜀䄀㤀䄀㜀䄀㔀㈀㜀䔀䐀　㜀䌀㄀㈀㄀䘀㘀䄀㠀䘀䌀㄀䄀䘀㌀㌀䔀䘀䈀㠀㄀䘀　　㔀䘀㌀㠀㔀䘀㈀㘀㜀䘀䐀　䌀䘀䈀㐀䘀㈀㄀㈀㐀㄀㄀䐀　㌀䈀㌀䈀䐀㤀䄀䄀䄀䌀㤀㤀㌀㈀㘀㠀㠀䄀䌀㜀䌀㐀䌀䄀㘀䈀䈀㄀㤀㔀䄀　㈀㠀㈀䈀㠀䌀　䔀㌀㐀㤀䔀䔀㌀㘀㌀㤀䌀㄀㈀㤀㌀䈀㄀䔀㤀㐀䄀䔀㘀㘀㠀　㜀䈀㐀䌀㜀㄀䌀㐀㜀㠀㘀䐀䘀㌀㜀㄀䄀䘀　㌀㈀䔀㘀㐀　䐀䌀䄀㄀㠀䄀䐀㠀䄀㜀㄀䌀䐀　䔀㔀㘀㐀㐀㔀㐀㤀㈀䈀㄀㜀㄀㌀䐀䄀　㈀䔀㘀㐀㈀㜀㄀䄀㄀䐀㘀䄀䐀㘀䐀䐀㐀㜀㘀㘀㠀䄀㈀㈀㘀㌀㈀㠀㠀㔀㜀䔀　䔀㄀㌀　　㜀㘀㘀㈀䌀　㘀㐀㜀㌀㈀㜀㄀㈀㘀㘀㤀　㈀㔀䘀䄀㤀䄀㜀䘀　䄀䘀㈀㤀㌀䄀䄀㌀䈀䘀䄀　䔀㄀䄀㈀　㤀㌀㘀　㜀㘀㜀㄀㌀㐀㐀㤀㄀㤀㜀䔀䌀㜀㘀㔀㄀䐀㔀㌀㐀㈀㐀㐀㄀䈀㐀䘀㐀䐀㤀㠀　㠀䔀㄀㐀㠀㄀㤀㤀䌀㘀㔀㈀㔀㄀㤀㄀㈀㌀䈀䘀䐀㄀㌀㠀㌀䔀䌀㈀㘀㤀䈀䄀㤀䔀䈀　㜀㄀㈀䔀㤀䈀㠀䐀㤀㌀䐀㄀㌀㠀䌀㜀㄀䌀䈀㈀䌀䈀䔀㄀㤀　㜀㤀㐀䐀㔀㄀㄀㈀㈀㈀䔀䘀㐀㈀䄀㜀㘀㌀䌀　　䔀㠀䈀㤀㌀　㄀　䄀㜀㈀㌀䄀䌀㌀㈀䈀㤀䄀㔀䐀㜀㘀㤀　䐀䈀䐀㌀㤀㄀　䌀㠀　䔀䈀㄀㈀㘀㄀䐀㘀䄀㘀㈀䈀㄀㠀㔀㄀㔀㔀㜀㐀㜀䐀䄀㌀㌀䄀㈀　㈀䔀䌀㠀䈀㄀䌀㤀㐀㄀㈀㌀㘀䄀㜀䔀䌀䄀㄀　㈀㌀䄀䐀㈀㈀㔀䌀㈀㄀䐀䔀㠀䌀䈀㌀䄀㈀䄀㤀㠀䈀　䌀䄀㄀㔀㔀㠀㌀㈀䈀䈀㐀㤀䈀㌀㔀　䌀䄀䔀㜀㐀㤀㄀㈀㄀䄀㤀㌀㘀䈀㠀㤀㠀䈀㠀㠀㜀㘀㤀䌀㐀䘀䌀㤀䔀㌀䄀　㠀䈀䘀㜀㄀㜀䔀䈀㌀㤀㐀㈀㠀㄀㔀䘀䔀䐀㤀㘀㜀㌀䄀㌀䈀㜀䐀㐀㠀㈀㤀㐀　㜀䘀㤀㠀　㤀㜀㘀䘀䄀㜀䔀㄀㠀䄀䌀䌀㌀䔀㈀㠀䄀㄀䄀䐀㤀䘀䔀㄀䈀㔀㠀㄀䐀㤀䌀䄀䌀㌀㘀䔀㈀䘀䘀䔀䐀㔀㘀㤀㈀㘀䐀䌀䈀䈀㌀䌀㔀䘀㌀䘀㌀　㤀䐀㈀㠀䔀㠀㠀㌀䐀㐀㈀䈀䐀㌀　䘀䌀㈀㤀㔀㈀㈀㠀㌀䘀㐀㔀䘀㌀䘀䘀㐀㐀㌀䘀䄀㠀㔀㔀㈀㈀㜀䄀䄀䔀㠀㐀㌀㌀䌀㤀㤀㠀㘀䔀㜀㤀㌀㘀㌀䐀㜀䘀　㐀䄀䘀㠀㌀㄀䘀㌀䔀䈀㄀㤀䘀䄀䈀㠀㔀䔀㐀䘀䐀㤀㈀䘀㤀㈀䐀䌀䘀䄀㘀　䄀䌀㄀㌀䌀䘀㠀䔀㄀㐀䘀䘀㜀㜀㌀㄀㄀䘀㌀㐀㌀㜀䐀㜀㐀㔀㄀㐀　　䌀㈀䈀㜀㠀䔀㈀㄀　㔀㈀䈀㤀䐀　　㔀䐀㄀㐀䄀㜀㌀䔀㈀　　㔀㜀㠀䈀㈀䘀㜀㌀　　㐀䌀䄀　㠀䔀㤀䄀㤀㜀䌀䘀㔀䘀㌀㄀㜀䘀䈀䄀䈀㜀䘀　㜀㐀㘀䐀䘀㠀䐀㌀㌀䔀㌀㄀䌀㈀㐀㐀　　䘀䔀䐀䌀　䄀㤀㐀䌀　㔀䘀䘀䄀䔀䔀㈀㄀㌀䐀　㌀䄀䄀㜀㔀㠀㈀㘀㠀䈀䄀䐀䘀㌀㤀㤀㈀䌀㔀㘀䐀㜀䄀䈀䄀䘀㄀　䌀㈀㔀㐀　䐀䈀䄀㌀䈀㔀㤀䐀㜀䘀䘀㔀㠀㌀㤀㜀　㜀䈀㈀㌀䄀㌀㠀䈀䐀　㐀㌀㄀㠀㐀㠀䔀䐀㌀䈀　㈀㔀䘀䈀䘀䌀䐀㄀㘀㜀㤀䄀㤀㤀䐀㐀㌀㌀䌀䘀㌀䐀㔀㈀㌀䘀䘀㤀䐀　䈀䔀㘀䌀䘀䘀䘀㌀䌀䘀㔀㐀䘀䔀㄀䔀㈀䐀㄀㜀㌀䘀㌀䔀䄀㔀䈀䐀㐀䔀㔀䐀㌀㜀䘀㐀䌀　㄀䈀　㌀䐀㐀䐀㈀䔀䘀㌀䔀䄀㐀㌀㘀㄀䔀䘀䌀䘀䔀㘀䐀㈀䌀䐀㔀㈀䄀㐀㠀㤀䔀䘀㤀㌀䘀㘀㠀䔀㔀㔀　䄀㤀㠀㐀㈀㤀䌀䘀㌀㠀㐀㘀㌀㠀䈀㄀㈀䄀㠀䘀㐀　㜀㤀㠀䌀㠀㈀㘀䔀㈀䄀㄀㐀㔀　䐀䌀　䄀㤀㐀㔀㠀㠀㘀㄀㈀㔀㠀㠀䄀㜀㔀䄀　䄀㤀䄀　㄀　　㔀㔀䌀㐀㤀㈀㘀䌀㠀㘀䌀㈀　㐀㔀䐀㜀㠀㈀㠀㜀㄀㔀㄀䐀㈀䄀㔀㄀䈀䘀㔀㤀䌀㄀㘀　䄀䔀㌀䘀䐀㌀䄀㄀䐀䌀䌀䘀䐀䌀䌀䘀㌀䘀㈀㠀㌀䘀䄀㐀㄀䌀䈀㌀㄀䐀㘀㌀㠀䘀㜀㄀㘀䘀㈀㠀㠀㈀㘀㈀㜀㠀㌀㈀　㄀䐀䄀㈀㤀䈀㠀㄀䐀　㄀䈀㔀㄀䔀㐀䔀㤀㐀㌀㘀䌀㌀㤀䐀㄀㈀㤀䘀䐀㐀㈀䘀㘀㘀䐀䄀䈀㤀㜀㘀䔀㤀㄀㈀㜀㤀　䘀㜀䌀㐀　㜀䌀㐀　㌀䄀㐀䌀㄀䐀䈀㄀䈀䘀㈀㘀䈀䐀㈀䔀䈀䘀䄀㤀㜀䔀㐀㠀䈀䘀㈀㜀䈀䌀䔀㌀䘀㠀㠀㌀䘀䄀㤀㤀䄀㠀䔀䈀㈀㌀　㠀㄀䌀䈀䄀䄀㘀䘀㠀㄀䌀㘀䄀　䔀㠀㄀　㌀䈀㜀㄀㐀㠀㈀䌀　㈀㄀㠀䄀㄀㐀㜀䈀㌀㘀　㈀䌀㜀㔀㈀㤀㘀䄀㔀㐀䐀　䌀　䔀㔀㘀㈀　㈀㠀㄀䌀㠀䄀䄀㈀㘀㈀㄀　　䔀㐀㔀㜀㄀䄀㠀㜀㤀　㐀　䔀㔀㔀㘀㐀㄀㔀㐀䄀㄀㄀䐀㔀㔀㜀䌀　㈀䈀　㈀䄀㔀䌀㘀䘀㈀㄀㠀㄀䌀䄀䘀㌀㠀䄀　㈀㌀㔀㘀　㠀䌀㌀䌀㄀䄀䄀　㐀㠀㘀㐀㌀㘀䌀䐀㔀䄀㄀㌀䔀䐀㌀㜀㄀㤀㌀㌀䐀㈀䄀㈀䄀㤀㜀䈀㌀䌀㈀㐀䐀㠀㘀㠀㠀㐀㐀㠀㘀䌀㌀　㘀㌀䈀㤀㜀䐀䐀㐀㐀䌀䄀㘀㈀㤀䔀㘀㜀䌀㠀㄀㄀䘀䄀㈀㘀㈀䄀䐀䄀㠀䄀䈀䄀㜀䔀䄀㘀䈀㘀㤀㄀㤀㠀䐀　㌀䄀䌀䘀㤀㠀㔀㈀　㐀㄀㈀㈀㈀䐀㐀䌀䘀䐀㐀㌀㌀㠀㌀㘀㜀㈀㄀㘀䔀䐀㐀㈀㐀㌀䄀䄀䐀㘀㤀䐀㈀㜀㤀䄀㌀㘀䄀㐀㈀㘀䔀㈀㠀䌀䄀㜀㘀㠀㈀䈀㈀㜀㄀䐀䌀䐀䌀䄀㈀㄀䐀㐀㜀㤀　㌀㜀㄀䄀㈀䐀㔀㈀䔀䈀㤀㜀㜀䐀䔀㄀　䌀　㄀䌀㌀㤀　䌀㈀㄀㤀㜀䈀䐀㐀㤀䈀䄀㄀䐀㄀㌀䘀㜀䔀㜀䐀䄀　㈀㐀䄀㌀㄀㈀䌀㠀㌀㈀㜀㜀　㘀㐀㘀㐀䈀㌀㈀㠀㈀㄀㄀䌀䄀㔀㜀㠀䘀㘀㠀㈀㜀㠀䔀㌀㤀㄀㈀㌀䔀㐀㌀䄀㐀㄀㄀䌀㌀㐀䔀䈀䄀　䘀　䈀㐀㜀㘀㠀㜀　㐀㜀䌀㌀㜀㌀㐀㌀㤀㠀䘀㈀㘀㈀䌀㄀䄀㐀　㄀㐀㜀䌀䌀䐀　㜀㄀䄀㠀䌀　䄀䐀䐀㤀　㜀䘀䘀䘀㠀㜀㠀㐀䐀䄀㠀㌀䄀䐀㘀䘀㜀䘀䈀䔀䌀䐀䐀䘀　㠀䔀㤀㌀㄀䘀㐀䔀䌀䌀㜀䔀㐀㤀㔀㔀䌀　䔀䌀䈀㜀䐀㌀㘀䈀䌀䘀㐀䐀㜀䐀㤀㜀䈀㔀　䘀䈀䐀　㔀㘀㜀䈀㔀㘀㜀㌀䈀㌀㄀䌀䐀㤀㔀㘀㐀䔀㜀䐀㄀㜀䘀㐀㔀㌀㐀㄀㜀䄀　㔀䔀㈀㘀㄀㘀㌀䈀㌀㐀㘀䄀䈀㤀㠀㠀䐀䐀㜀䌀㄀䔀㔀䌀䌀䔀䘀㤀㤀㤀㘀䈀㈀㠀㐀䌀　䔀　㘀㐀䌀㄀䘀㔀㤀䈀㈀䔀㔀䐀䌀䄀㜀㠀䔀㔀䌀䌀㌀㤀䔀㌀䘀㌀䔀䔀䘀䐀　㌀䄀㈀䈀䐀㘀㄀　㈀䈀㌀㠀䈀㤀䄀䘀䌀䄀㤀㌀䈀㔀㜀䐀　䌀㔀㤀㠀㜀㐀㔀㤀㜀㐀㈀㐀䈀㜀㐀䌀㠀䄀䘀䔀㠀䄀䌀䌀㐀㌀䄀　䐀㔀䐀㠀㤀㐀㠀㠀㘀㌀䐀㘀㈀㤀㄀䈀㜀㌀䘀㤀㤀　㠀㤀䌀　䌀䘀㠀　㘀　㈀㜀䔀㄀㔀䔀䘀㠀㠀䈀㤀㤀㌀㈀䌀䈀㄀䌀㄀㌀䔀㈀㔀　㐀㄀㔀䐀䌀䔀䘀㌀䐀䄀㄀㐀䌀㠀㔀䄀䈀㐀䐀䐀㤀㈀㜀䐀㈀㠀㘀䌀㌀㐀　㌀㐀㄀㐀䄀㤀䄀㠀㐀䐀䄀䈀㜀㠀䌀㌀䐀㤀　㔀䐀䐀䔀㌀䘀　䔀㤀㜀㄀㈀㤀㘀䔀㠀䘀㌀䈀䌀㘀䐀䈀䌀㜀㌀䈀䔀䄀䔀㔀　㜀㌀㔀䄀㤀㐀㈀䄀䘀㜀　䌀䔀䘀　䈀㐀䔀䈀䔀䐀䌀䔀㜀㘀䘀㜀㌀㈀㜀䐀㤀㤀㜀㌀㤀㤀䈀䈀㤀㜀㔀䐀䔀㌀䔀㠀䐀㔀䐀㘀䈀䈀䐀㘀䈀䈀䈀㜀㌀㤀㜀㘀㘀㠀㜀㜀䔀䄀㜀㜀㌀䄀㘀䘀㜀㜀㌀䐀㈀　㌀䔀㈀䐀䈀䐀䄀　㌀䔀䄀䘀㄀䐀㜀㔀䘀䐀㐀㔀䘀䌀䈀㌀䔀䈀䔀䘀㠀䔀㈀㄀䘀㔀㔀䈀䐀㜀㜀　䄀㠀㐀㠀㜀㜀䘀䄀㘀㐀㌀㤀　䘀㈀　䔀㔀㜀㄀㐀䄀䄀㄀㈀　䄀㌀㐀䌀㔀㔀䈀㘀㈀䄀䈀㐀䔀㈀䌀䘀㌀䘀㠀㐀㘀㤀㤀㐀䐀㔀䘀㌀　㠀㔀㄀　䐀㠀䄀㘀㈀㔀㜀䐀㄀䔀䄀㠀㈀㘀㐀㘀㄀䈀䘀䌀䈀䔀㤀㠀䌀䔀㤀䄀㈀　䈀䈀䐀㔀　䔀䌀㘀㠀䘀㤀㠀㠀㐀㤀䄀㈀㐀䈀㤀㈀㐀㐀㈀㜀㐀䔀䘀䔀㤀㜀㔀㠀䘀䌀　㔀㈀　䄀㐀㠀㘀䄀㠀㘀㐀䔀㠀䄀㔀㄀　㄀㔀㌀䄀㐀㈀㌀㔀㄀䘀㔀㐀㔀　㠀䘀㄀㠀䄀䔀㈀㌀䐀㐀　㈀㐀㌀㘀䄀䐀㘀　䐀㤀䐀㔀䄀䄀㐀䈀䘀䄀㐀㔀㌀䘀䄀㄀㄀㜀㠀䔀䔀㈀㄀　㔀㐀㘀䌀㄀䘀㤀㐀㄀㄀㄀㜀䘀㐀㐀䘀䄀䌀䌀㠀㠀䐀㠀㘀䈀䔀䐀䄀䐀㜀㘀㜀䄀䄀䔀㜀䐀㤀㠀　　䐀㌀㤀䌀䐀䈀㤀㜀㔀㐀㔀　　䘀㔀㄀䌀䐀䘀䐀䌀㄀䌀㠀㐀㘀䈀㐀㤀㐀䄀　㈀䔀㄀䌀䌀㈀㠀㔀㔀䐀㄀㄀䘀㔀䔀㌀䌀㈀　㜀㌀䔀䘀㔀䌀䌀㈀㤀䈀䘀㜀䄀䄀䄀㜀㌀䔀㔀㘀　䌀　䄀㜀　䔀㤀㈀㄀㘀䄀㈀䈀䌀䌀㄀㤀㄀䄀㤀䌀　㄀㜀㠀㘀䄀㤀䔀㄀䈀㤀㘀　㐀㄀䌀䔀䈀㐀㌀䌀㈀䈀㈀㌀㄀䔀䔀䌀㄀䈀䔀㄀䌀㄀䌀䘀㤀䈀㌀㠀䄀㠀䌀㌀㔀䘀㘀　　㘀㐀䘀　䄀䄀䐀㄀　㄀㘀䔀䌀㄀䄀䘀䔀䘀㠀㔀　㐀㌀㐀㘀㠀䌀㌀㘀㘀㐀㘀㐀䌀㐀㈀㘀　䔀䈀䄀㌀㌀㤀䄀　㔀㄀㈀䐀䈀㠀䔀䘀㔀㔀　㔀䌀㌀㐀䌀㔀䄀㈀䘀䘀　㈀㄀㤀㌀䐀㄀㄀䐀䌀䔀䘀䌀㜀㤀㔀㐀㔀　䌀䈀㄀䐀䈀䄀䘀㈀㠀䄀㈀㐀㠀㜀䄀㤀㌀䌀㠀䔀㠀䄀㘀㠀䘀㌀㄀㘀䔀㐀㘀䘀㌀㌀㜀㄀　䘀㠀㈀㘀㐀䈀㔀䔀㐀㜀㈀㈀　㄀䐀㈀㌀㘀㘀䘀㜀㘀㐀䐀䄀䄀㘀䔀㤀䌀䔀㄀䐀㔀䌀䄀㘀䐀㔀㈀䘀㘀䐀䄀㔀䘀㤀䘀㐀䌀㐀㐀㠀䈀㄀㌀㜀䘀䔀䄀䌀䘀㜀㘀㐀䘀㈀㤀䄀䈀䐀䐀䐀㠀㤀㘀䌀䔀㔀䔀䘀䐀㠀䌀㔀䄀㔀㄀㄀㘀㔀䌀䄀䔀㠀㐀㤀㤀㠀䄀䄀㄀　㜀㔀㜀㘀䘀䐀䔀䈀㠀㠀㘀㔀䄀䘀䔀䐀䐀㘀䈀䘀䈀䌀䔀㘀䐀㤀䘀㠀䘀㘀㜀㐀㤀　㔀䔀㈀䌀䌀䔀䘀䄀㈀㔀㤀㈀㈀䌀㌀䈀䘀㤀㈀㔀㤀　㈀䌀䘀䄀䔀㠀㜀㘀　䌀㠀㘀䐀䘀䄀㄀㄀䔀䄀䈀㜀㌀䌀䄀㔀䌀㌀㌀䄀㄀㌀㘀㜀䔀㔀㈀䐀㐀㌀㐀　　䐀䐀㠀㔀㐀㐀㐀㈀㈀㈀㤀㜀䘀㘀䐀䌀䌀㐀㈀㠀䐀㐀䄀䄀䄀㐀㈀㐀㠀䄀䄀㄀㤀㤀㠀㄀㄀㘀㜀䌀㈀㘀㤀䐀㐀㌀㐀㜀䔀䄀㘀䐀　䄀䄀㈀䔀㠀㐀　䈀䄀㠀　㔀㜀䌀㠀㜀㌀　㔀㜀䔀䐀㠀㘀㔀㜀㔀㈀㔀㜀䘀㈀㔀䐀䌀㈀　㘀䈀㠀㠀䄀䐀䘀㈀　䐀䌀　㄀䈀㜀䘀㄀䈀㜀　䈀䐀䘀䌀㈀㌀㌀㔀㐀䐀　䌀䘀㤀㜀䌀㌀㐀䄀㌀䔀㈀㄀㘀㐀䘀㠀䘀䘀䔀　㜀䘀　䘀㌀㤀䌀䌀㌀㔀　䔀䄀䈀䔀䔀㌀㐀㠀㔀㄀㘀㈀䘀　㄀䌀㌀㜀㄀㤀㜀䔀䄀㄀㤀㐀㠀㐀䐀㄀㐀㐀㐀㠀䄀㄀㜀䌀㔀㄀㠀䄀㐀㤀　䘀䌀㐀㄀㐀㄀㔀䌀㌀㘀㤀㠀䈀䄀䐀䌀㤀㘀㐀　䌀䘀㈀䔀㔀䔀㠀䔀㈀㘀㈀㤀䐀㘀䐀㄀　㐀㈀㈀㐀䔀㈀㔀㘀㐀㤀㄀㌀䄀　㈀㤀㔀㜀䔀㈀㐀㠀䐀䐀㠀䐀㠀䔀㜀䄀㤀㐀䈀　㄀　　㄀䌀㜀㘀㈀䌀㄀　㠀䘀㜀㘀䐀㐀䈀㄀㔀㜀㠀㘀㐀　㌀㘀䔀㐀䌀㔀䘀㈀㈀㘀䘀㤀䈀㐀㘀䌀㈀㌀䌀　　䘀㘀㔀䘀㠀㈀㌀㜀㤀㄀㔀㄀　㘀䘀㠀㈀㜀　㄀䘀㠀　䄀䐀㘀　　㔀㄀㠀　㘀㌀㐀㈀　㄀㠀䐀䄀䌀　䄀䘀䄀㠀䄀䈀㐀䄀㌀　䘀䈀䌀㐀㔀䔀㄀䘀㌀㌀䌀㠀㔀㄀㄀䐀䌀㈀㠀䐀㔀㌀　㤀㤀㈀㌀㔀䄀㐀　䔀㘀㄀㄀㌀㘀㘀䄀㌀䘀䄀㔀㤀㜀㌀䔀㌀䐀　㘀㜀㈀㐀䄀䘀䐀　䐀㈀䌀㔀㔀㐀䘀㤀䈀㠀㔀㔀㔀　䌀㔀㌀㈀㈀㤀㈀㈀䄀㈀㌀㠀㔀㠀　㤀䌀䈀㜀㤀㘀䌀㠀䈀㌀㘀㜀䈀㠀䘀䌀㜀㜀䐀㠀㤀㔀䔀䘀䐀䘀䄀㌀　䔀䔀㐀㔀䐀䌀㤀㔀㘀㘀䘀㄀䈀㤀㤀㔀䔀䐀　㐀㠀㤀　㔀䌀䈀　䐀㄀䘀㄀䘀㔀　　㠀䌀䌀㠀㜀䈀㤀䘀䈀䔀㈀㜀　㌀　㈀㌀䘀　㤀䔀䔀　㘀㐀㈀䌀㄀䐀㄀䘀䘀　㘀㘀㠀㠀㘀㄀㐀㐀䘀㐀㘀㐀㈀㠀㄀㜀䘀䄀　䘀㜀㠀㐀㘀㄀㠀㈀䌀㠀䔀㐀㈀䔀䌀㄀㌀㤀㄀㈀　㜀䘀㠀㐀䄀䔀㌀䐀䐀㠀㠀䐀㜀㔀㌀䐀㤀䈀㔀㤀㌀䄀䐀䔀㌀㐀㔀㘀㘀㄀㈀㜀㠀㠀　㤀　㔀䌀㈀㤀㘀㤀䄀㔀　㈀　䔀㌀㔀㌀㈀㔀䔀䔀　䄀䔀䄀㠀㤀㤀䔀㐀䈀䈀㈀䄀䐀䘀㐀㤀㈀䄀㄀䘀䘀㔀䄀䐀㄀䐀䈀　㔀䈀䘀䐀䄀㐀䐀䘀㌀䔀䌀䔀䔀䈀㔀㐀㌀㤀㜀㘀䐀㄀　㜀䔀㠀䌀䔀㌀　㄀䔀㄀䔀䈀䌀䌀　䄀䐀㐀㤀䐀㌀㐀㌀㠀㠀㜀㜀㠀㤀　㄀㐀㔀㠀　䘀䄀㠀㠀　㠀䐀䄀　䈀㐀㌀㈀㜀䐀䔀䈀䈀㄀䄀㠀㜀㘀䄀䄀㔀㌀䘀䐀㄀䌀㈀㐀㘀㜀　䘀㤀㈀　㈀㌀㤀㄀　䘀㠀㠀㠀㌀㄀㤀㐀㐀㘀䐀䘀䌀䘀㌀　㌀䐀䘀　䘀㔀䈀䈀䔀䘀　㘀㌀　㤀䈀㄀㤀㜀䔀㤀㔀㈀䔀䈀㔀䘀䐀　䔀㜀䐀㐀䈀㠀䈀㔀㔀䐀㌀　㜀㠀　㘀㘀㤀䄀㜀㈀䄀㄀㠀㔀　䐀䐀　㐀㜀䔀　㠀䐀㠀㘀㐀㠀㐀㄀䘀䌀䈀㔀䐀　䌀䘀䈀䌀䘀㔀㄀䌀䘀䌀㌀㤀䘀　㈀㔀䘀䌀䔀㠀㜀䈀䐀㄀䐀㜀䘀䄀㤀䄀㄀䈀㘀㜀　䘀㘀㘀㈀䌀䄀　㐀㄀䌀䌀䘀䔀䘀㈀㜀㄀䌀䄀䔀㠀㄀䄀㌀㘀㤀㠀㐀㈀㔀䘀䌀䐀䌀䌀䘀䔀䌀㤀㜀㜀㜀䐀㄀㤀䐀㘀䘀䔀䔀䐀㄀㤀㐀䌀䐀㔀䄀䘀䄀　䌀䐀㜀䄀㐀㐀䐀㔀㌀㐀䐀㠀㐀　㈀䄀䐀　㔀㈀㔀㠀䈀䐀䈀㜀䔀㄀䔀㐀㐀㤀㤀㔀䐀㠀㌀㔀㄀䔀㈀㜀䘀㄀㠀㜀㈀　㐀㈀㠀㈀㔀䘀㐀䘀䔀㔀㄀䌀㔀㐀㔀䘀䘀㜀㌀䈀㐀䌀䈀　䐀㈀䐀㌀㈀㌀䄀㔀㤀䐀㜀㈀㔀䔀㈀䄀㠀㌀㄀㠀䘀㔀㐀㄀㤀㠀䐀　䌀㔀䔀㌀㠀䌀䄀㤀㤀㜀㔀䈀㔀㘀䄀㘀䌀㘀䄀㄀䌀㘀䌀䘀　㤀䌀䌀㌀䔀䈀㤀㌀㔀䐀㄀䐀㐀䄀䌀䄀䐀䄀㠀䌀㄀㔀㜀䘀䄀㐀㤀㜀㠀㌀䈀䈀䄀䄀㜀䌀䘀㤀㠀㤀䘀䌀㄀䔀㌀䈀㘀㄀䐀䘀㤀㌀䔀㤀㐀㈀㤀㐀㠀㠀㌀㐀㘀㐀㠀㌀㜀㠀㈀㌀㜀㤀㠀　䘀䘀䔀㐀䔀䐀㐀㜀䌀㤀　䌀㐀㔀㠀䐀㔀䔀㠀㔀䈀　䔀㠀　㐀䐀䈀㠀　䈀䌀㤀䘀㌀䔀㄀㈀　䔀䌀䌀䘀㌀䔀㘀㄀㜀䔀䘀㘀䔀㤀䄀㜀䘀㠀㔀䈀㤀㘀㔀㌀㈀㜀䔀㄀㐀㜀䈀㘀㌀㜀㠀㄀　　㜀䄀䌀䌀䐀䄀㘀㜀㄀㠀㠀㌀㠀䄀㐀㘀䘀䘀㄀䌀㈀䔀㄀㈀㐀䐀　䈀䔀　　㠀㈀䌀䔀䔀䔀㌀䔀㤀㈀䘀㤀㠀㈀㌀䐀㐀䔀㌀㠀㘀䌀㈀㜀㄀㌀䌀䔀㐀㠀㔀㜀䄀㠀㠀㈀䔀㐀㄀䄀䘀㄀㘀㈀䘀㜀䔀　䔀㈀㘀　㄀䈀䔀㔀　䔀㌀㌀㜀㈀㐀䘀㘀䈀㄀㔀㄀䌀㔀㈀㤀㐀㤀㠀䐀㔀㘀㄀䐀㐀㔀䄀㈀䈀㤀　㔀㤀䘀㐀㌀㄀㜀㈀㤀㌀㘀　㐀䌀䔀㐀　䈀㈀　䄀㠀㐀㄀䌀㐀䔀㘀㈀㐀㌀㠀䘀㤀㄀㐀䌀　㔀䐀㐀㐀㄀䐀㌀㌀㤀䌀㤀䐀㔀㠀䘀㄀䘀䐀䘀㤀　䐀㈀㘀　䌀䈀䐀㈀䘀㔀㐀䐀　䘀㈀㐀䈀䈀䄀㤀㤀㌀㔀㐀䐀㔀䈀䌀䌀㠀　㘀㔀㜀䐀㜀䔀㐀㈀㄀　䐀䐀䘀㤀䘀㄀䘀䈀䐀㜀㄀㄀䈀䈀䄀䈀䘀㄀　㜀㠀㠀䌀䐀䌀㔀䘀㤀　㘀㘀䔀䌀㌀䔀㘀䄀䈀㔀　䘀䔀㌀䘀㔀㜀䘀㐀䘀㌀㌀䄀㈀　䐀　㘀䘀䌀㌀䔀㤀䄀㜀㌀䘀㠀䘀䌀㜀䄀䔀　㈀㠀㜀㔀㌀㤀　㠀䌀㄀䔀㈀㐀㌀㤀䄀㈀㌀䐀䔀㈀䌀㐀㌀䘀㤀㈀㠀㜀㔀　㐀㠀㠀䐀㐀䔀㔀㠀㘀㐀䈀㠀㌀䌀㄀䐀　㐀㐀䄀䔀䐀㈀䘀㔀㄀㈀㜀　㔀㐀䌀䄀㜀㄀䔀　　䘀㌀䘀㜀㌀㠀䐀㠀㔀㤀䔀㠀㌀㘀䔀㜀㜀㄀　㄀䈀㘀䌀㠀㜀䌀䔀㜀㐀㤀䔀㔀㈀㠀㜀㠀㘀㌀㐀　䈀䌀䌀䌀㌀㔀䌀㤀㄀　䔀䘀䄀䈀㐀㄀　䄀䐀　㔀㠀　䄀㤀䘀䔀䈀㐀㔀䈀䐀㄀㄀䌀䌀㄀㠀㌀　䔀㐀㜀㐀　　䌀䔀　㜀䔀㌀㤀㈀　㘀䄀䔀㐀㜀㤀㐀䔀䐀㔀㘀㤀㔀㘀㌀䐀㜀㤀䌀㐀㐀䌀䌀䈀㄀䄀㈀䌀䐀䘀㈀䄀㄀㜀㈀㜀㠀㘀㜀䄀䈀㜀㠀䈀㐀㌀㐀䌀㤀㔀㈀䈀㜀㄀䘀䈀䐀㤀䌀䄀㘀㘀㄀㠀　㤀䌀㘀䄀㘀㐀䐀㌀䐀㜀㜀㠀䄀㜀䈀㐀䘀䘀㠀䄀䔀㔀䈀䘀㜀䘀䌀㘀㠀䐀㈀㌀㤀㜀䈀䔀㜀㤀㜀䌀㈀㔀䈀䄀㠀㤀㌀㤀㤀㐀䌀䐀䈀㌀䈀㐀㔀㤀㔀㠀㤀䐀䄀䄀㘀䔀㐀㜀㤀䔀䄀㠀䄀㘀㔀㘀䈀㈀䔀㔀䄀䐀　㌀㈀䄀㄀㘀㜀㜀㈀㔀㤀㈀䘀㤀㘀㌀䄀䄀㠀㌀㜀䄀㠀㔀䈀䐀㄀䘀㌀㈀㜀䌀　㌀䔀䘀㈀䘀䌀㔀䄀㈀㤀䄀䘀㌀䄀㐀䈀䐀㔀䐀㤀㠀䄀䔀㈀䈀㄀䌀㄀㜀㠀㈀䐀㌀䄀䔀㈀　㔀䘀㐀㤀㠀㌀㘀䘀㐀䔀㐀㤀㔀䄀㠀㤀䘀䔀䐀㘀㄀㜀䘀㜀䌀㔀㄀㘀　㐀㔀㠀　㘀䄀　䔀䌀　　　㜀䔀㜀䔀　䘀㜀䄀㜀䔀㜀䘀㄀㠀㈀䄀㜀䈀㤀䐀㤀㔀㤀㄀㌀㠀㔀䘀㔀㤀䘀䔀　㤀䘀　㔀㜀　㘀䔀㈀䈀　㄀㈀䘀㠀䄀䈀㜀㌀㤀䐀㌀　㘀㠀䘀㘀䌀㈀䐀　㄀㤀䐀㈀　䐀㌀㜀䔀　㜀䔀㐀　䈀䐀㠀㄀㤀䘀䔀㠀㜀䈀㄀䌀㄀䈀䄀㔀㄀㄀㈀㌀㤀㐀　㌀㐀㈀㔀䈀䄀㤀䄀䄀㐀㠀㤀㈀䄀䄀䐀䄀㘀䌀㤀㔀䔀㠀䐀㤀　䘀㠀㜀　㌀㜀䔀䈀䘀䌀㜀㄀㌀䌀䔀　䘀䄀㠀㜀䄀䄀䄀㠀䔀㄀㐀㄀䔀㐀䔀䔀㄀䘀㠀㌀䐀㄀㌀䔀㄀䐀㠀㌀㌀㠀㈀䘀䐀䌀　䈀㄀䄀㔀　䐀㤀䔀䈀㄀㄀䐀㘀㌀㄀㘀㤀㄀䌀㘀䐀㘀䌀䐀㤀㈀䐀䐀䄀䔀㐀㠀㘀㈀䐀㈀䘀㐀䈀㘀㄀㤀㄀㜀䐀䈀䐀䐀㌀㈀䔀䘀㤀㤀䐀㜀䐀㈀㌀㠀㘀㤀㐀㈀䈀㌀䘀㜀䄀䔀䌀䄀㄀䈀䐀㜀䔀䐀䐀䄀㌀㈀䘀䐀䈀䌀䘀㘀　㔀㌀䘀䐀䐀㜀䐀䔀㜀䈀䐀䘀㐀䄀㌀㐀䄀䄀㌀䄀㜀㘀㠀㐀䔀㐀㌀㔀䐀㈀㌀　㔀䄀䘀㠀㌀㠀䐀㠀㤀㔀㠀䈀䄀㜀䄀䄀㈀䈀㜀㘀䈀䌀㄀䘀㈀䈀㤀　䐀㘀䐀㐀䔀䌀䘀㔀㔀㔀㌀㌀䈀㜀㜀䄀䌀㐀　䘀㐀㌀㈀㜀䌀㄀㐀䌀㘀䔀　䐀㌀㄀　䘀㌀　㐀䐀䘀㠀䈀㠀　䄀㈀䘀䔀　㘀㈀　䘀㔀㄀㔀䐀㈀㌀　㐀䘀䔀䘀䈀㜀䌀㄀䄀㐀㠀䄀㈀䐀䈀㐀㘀㠀㄀㠀㄀㄀㤀㜀㠀㈀㐀䘀㘀㜀㜀㔀䘀㠀㔀㜀㄀㠀䘀䈀䄀㔀㜀㔀㠀䔀㈀䐀䘀㠀䈀䘀㤀䘀㘀㌀　䈀䘀䔀䘀㌀㄀㄀䐀䈀䔀㔀㈀㌀䔀㜀㐀　䘀　䄀䘀䌀䔀䘀㤀㘀䌀䔀㐀㌀䄀㈀　㜀䈀㄀㐀㐀䔀㄀䈀㌀㤀㠀㜀䘀䘀㌀㜀䌀䔀䔀㄀䌀㄀㌀䘀㠀䔀䘀㈀　㔀䔀㜀䄀㠀䘀䘀䌀㘀㌀㤀㈀䄀䘀㠀䐀䈀㔀㄀䐀㔀㌀䌀㐀㜀　㔀㐀䈀㐀㄀　㜀㜀㌀㈀㤀㌀㌀　㜀㜀　㐀㠀㐀䘀䘀㈀㠀㈀㘀㈀㄀　　㜀㐀㤀䐀　　　㤀䄀䌀㄀㜀㐀䐀　　䄀㈀䔀　㘀㠀䈀䌀　䐀㔀㘀㠀㔀㄀㔀䄀　䈀㘀䔀　㘀䄀䘀㄀㤀㔀㜀㔀䔀䐀㌀㌀䐀㜀㜀䌀㄀㠀㈀㠀㔀㤀㜀䄀䌀䐀䈀㌀㠀䄀㄀䘀㄀䘀䄀㔀㔀㄀㔀䐀㔀㠀䈀㤀㜀㤀㐀㔀䐀㌀　䌀㌀䌀䔀㐀䘀㌀㔀㄀㠀䌀　䄀㌀䐀䘀㔀　䄀㐀䄀䌀䈀㄀䈀䄀䄀䌀䄀䌀䈀䄀㤀㄀䈀䔀㈀㐀㤀㐀䄀䔀㜀㔀䄀㤀䄀䄀㈀䘀㌀㐀㘀㜀䐀㘀㤀䄀㄀䈀㘀䔀䈀㠀㘀㈀䔀㤀䈀㐀㜀㌀㘀䘀㔀䄀㌀䘀䈀䔀䔀䔀䈀䄀㈀䔀䐀䐀㜀㌀㘀㄀㄀䈀䌀㔀㐀䔀㘀䌀㘀䄀㐀㌀䈀䘀䐀㄀䌀䈀㌀䄀㠀䄀　㈀㄀䐀䔀䈀䈀䈀㌀䄀㌀䄀䈀䄀䐀㘀䐀㌀㐀䈀䄀㌀䄀㈀㔀䌀㔀㔀㔀㌀㔀㌀㄀䔀㔀䐀　䄀㤀㈀㄀䘀　䘀㘀㐀㤀㈀　㌀㈀㜀　㘀　㠀䔀䌀㜀㠀㌀㈀䄀㤀㤀䔀㄀㠀㔀　　㜀䐀　㐀䌀㐀㌀䄀䐀　㄀䐀䌀㈀䌀䘀䌀㈀㜀䌀㜀䌀㄀䄀㐀䈀㤀㔀㜀䐀䘀㌀㈀㠀䘀㄀䘀㜀㌀䘀　㔀㤀䌀㜀䄀㌀㄀䔀㜀　㤀㔀㐀㘀䔀䈀䐀㌀䄀㤀䈀䄀䈀㠀䈀㔀㜀㜀㔀䄀㜀䈀䄀䘀䈀㔀䌀䘀㜀䐀䌀䔀㠀䐀㜀㤀㌀䐀㜀㘀㌀䘀䘀㘀䘀㌀䈀㄀䄀䘀㘀㌀㘀㌀䈀䔀㌀䘀㜀㜀㌀䐀䘀䄀䐀䐀䐀䄀㜀㐀䈀䄀䘀㘀㔀䔀䈀䌀䘀㤀㐀㜀㘀䄀㔀䌀㘀䄀㔀䌀㄀㤀㘀䔀㘀㔀㄀䈀䔀䄀䐀　䌀䘀㈀䘀㔀㈀䔀㌀䌀㘀䄀㔀䄀㠀　䈀䘀㄀㜀㘀㈀㠀㠀　䐀䘀䄀　䈀㘀䔀㐀㠀䘀㄀䐀䘀䄀㘀㔀㘀䐀䈀䄀䄀䔀㠀䔀㄀䌀　䌀㔀䘀䌀㌀㤀䘀㘀㔀㄀㜀䔀㈀䔀䐀㌀䘀䘀　䌀㄀䘀㜀䔀㈀㄀㘀㜀䐀㜀䘀㄀䐀㔀䔀㔀䈀䌀㜀䄀㔀䈀㈀䈀䘀㐀䘀䄀㔀䌀㘀㜀䐀㠀㈀㔀䔀䌀　㌀䐀䄀㠀䐀㄀㠀㘀䈀䘀㘀䌀　㌀䐀䄀䌀　㄀㜀䔀䈀㤀㈀䘀㔀㐀㌀㌀㌀㔀　䔀䈀䈀䔀䐀䄀䐀䄀㌀㐀㄀㔀䈀㄀　䔀䌀䄀㜀㈀䄀㠀䘀㄀　㔀㌀䔀䔀䐀㠀㌀㜀㐀㘀䐀䈀䄀　㘀㌀㔀㌀　㈀㔀㤀㄀㜀䌀㈀㠀䈀㐀㠀㘀㈀㤀㘀　㤀㤀䔀㤀　㤀䄀㈀㤀　䈀䔀㔀㤀䌀㌀䐀䈀䐀㌀㌀㈀㈀䈀㠀㐀㄀㠀　㔀䈀　䐀　㐀㄀䈀㌀㠀䔀㄀㠀㌀　㠀　㤀㄀㤀䔀㤀　　㘀㠀㘀䐀䈀㤀㜀㔀㘀㄀　䘀㄀㔀　䄀䐀㐀㠀㠀　䄀㄀㠀䄀㜀㄀　䌀㠀㘀䄀㘀㘀㈀䄀䔀㐀　㜀㐀㜀䔀㠀㠀䔀㐀䐀䌀䐀㤀㐀㌀䌀㜀㄀㜀㔀䐀䐀㘀㠀㤀㤀䐀㄀䔀㘀㘀䌀䐀㔀㌀㐀㘀㈀　䔀㤀㜀䔀㠀䌀㈀㈀䈀㌀䈀㤀㌀㈀㜀㘀㌀㘀㤀㈀䔀㌀㄀㌀䌀㜀㈀㤀㌀䘀　䐀䐀㠀㘀㜀　㄀㈀㜀䄀㘀䌀䔀䈀䐀㜀䘀䔀㘀䐀㐀䔀㠀䘀㠀䔀㈀䐀㤀㄀䔀䈀㄀㜀䘀䔀㈀㘀䘀䔀㘀㈀䌀㜀㄀㌀䔀㈀㠀䌀䘀㈀㤀䔀䐀㘀㈀㄀㘀㘀㈀㔀䔀㔀䘀䘀　㌀㌀　䔀䐀㄀㜀㠀㜀㘀　　㜀㐀䌀㄀㄀㐀䈀䐀㄀䌀㈀㤀㌀䈀㐀㄀㔀　㜀䌀　㠀㔀㐀䐀䄀䐀㤀㐀䄀㤀㜀䘀䄀　㈀㘀㈀㜀㔀㈀㈀䘀　䄀㄀㈀䐀　㌀㤀㈀㠀㌀㄀䘀　䐀䌀㈀䔀㐀䔀　䌀㜀㜀㠀㄀㈀䔀　㈀䈀㐀㔀䈀㐀㜀㐀䌀㌀䘀㠀㔀㐀㠀㐀㈀㘀㘀　㐀㤀㄀䌀䘀㄀㠀䐀䔀㈀　䈀䌀㌀䐀㐀䌀䌀䐀㘀㄀䘀㘀㜀　㜀䐀　　㘀䄀㘀㄀䔀㜀㘀㐀㔀㈀䘀䈀䘀㌀䌀䔀䄀㌀㈀䈀㜀䘀　䄀䈀䘀䐀㐀䈀䈀䄀䔀㄀㈀㘀䈀㐀䌀㤀㘀䔀㔀䄀䐀㔀䈀　㘀㠀䐀㄀㠀㐀㔀㔀㘀㐀㠀䈀䄀䘀䘀䐀㌀㈀䐀㠀　㠀㄀䈀䐀㄀䈀㔀㐀㔀䄀㐀䈀㔀㐀䐀㌀㄀㠀䄀㌀㠀㔀㘀䄀㠀䐀䌀䔀㘀㠀　㐀䈀㄀䐀㘀䈀㄀䌀㤀㐀㠀㌀㈀䄀㘀㜀䌀㘀㌀㌀㄀㐀　㌀㈀㔀䈀䈀㠀䐀䈀䐀㤀㠀㠀㘀䈀㐀㜀㐀㠀㐀䈀䄀䈀䌀　䘀　䄀㌀㘀　　㤀㈀　㌀㈀㜀㠀䘀　䘀䐀㔀㜀㔀㄀䔀㐀㜀㈀䈀㘀　䘀㈀㜀㠀䄀䄀㜀㌀㈀　䐀㌀䐀㤀㌀㤀㜀㐀㄀䌀㄀㄀㘀㠀㐀㌀㜀䐀㐀㤀㌀䐀䌀㐀㐀㄀㈀㈀䄀㔀㘀䔀㔀䄀䄀㌀䄀㜀㘀㘀㌀㜀䌀㌀䘀䈀䐀㘀㔀䘀㜀㌀䌀䐀䄀䔀䌀䘀㌀㜀㌀䔀䈀㐀　㄀㜀䔀㤀㠀䘀㔀㜀㘀㌀䘀　㐀㔀㤀䌀㠀㘀㔀䈀䘀㐀㔀㌀㈀䌀䐀　㤀䘀㐀䌀䌀䔀㌀䔀㠀㜀㘀㔀　　㐀䐀䄀㠀䐀䔀㈀㜀㈀䘀㜀㜀㠀㌀㜀䄀㔀䄀䄀䐀䔀㐀䄀㐀䔀䈀㌀䔀䈀㤀㔀㐀㠀䌀䐀㐀㜀㐀䌀㤀䔀　㌀䐀　㘀㄀㠀㜀䔀㠀㤀㜀㐀㘀䐀䄀䌀䄀䔀㔀䘀䐀䈀䄀䌀䈀㐀㔀㘀䈀䈀㠀㐀䘀㘀㐀㐀　䄀㌀㘀䐀㤀　䘀㐀　㤀㜀㘀㄀䐀　䘀㤀㈀㔀㤀䄀㌀䔀㄀㤀㈀㔀㐀䌀㤀㠀䘀　㜀䔀䈀䐀　㄀䈀㜀㔀㜀㔀㈀䄀䐀䄀㠀䘀䄀䈀䔀䐀㠀㐀䐀㘀㜀㠀㄀　䌀㘀㄀䌀㜀㜀㤀㘀䈀㠀㐀䈀䈀㠀䐀䌀㐀䄀㠀㔀　㘀䄀䈀㌀䌀㜀䈀㘀㈀㔀㜀䄀　㜀㜀㔀䄀㌀㈀㜀㔀㜀㄀䐀㌀䈀㐀㘀㤀㌀䘀㘀䄀㠀㔀䔀䘀㘀㜀㜀㜀㐀㐀㔀䈀䐀䈀䄀䘀㜀䘀䔀㐀㠀䄀㠀䔀㤀䈀㔀㜀䌀䌀㔀䔀　　㈀㜀䔀䈀䌀䈀㘀㈀㤀㔀㔀㌀㤀䈀䔀㘀㄀㤀㜀䔀䐀㠀䐀䈀䘀䈀䐀㌀䘀䄀㔀䐀㈀䈀㌀㘀㔀䔀㌀　㈀䐀㌀㔀　㄀䘀㔀䐀㠀㌀䈀䔀㠀䌀䔀㤀㌀䄀㠀䌀㜀㌀䌀㠀㠀㘀㠀䔀㘀㄀㠀㠀䄀㔀㜀䄀䈀䈀㐀㠀㔀䐀　䘀䐀㐀㈀䄀㤀㌀㈀　㐀㘀　㄀㄀䈀䄀㔀㜀㐀㌀䔀㘀㘀䌀䐀䌀㈀䔀㘀䔀㈀䘀㐀㜀㈀㄀㌀㤀㠀　䄀㌀䘀䐀䌀䘀䄀㌀䘀䈀㔀㔀䘀　㔀䐀䔀䘀㜀㜀㈀䄀㈀　䘀㤀㄀㄀㠀䔀䘀䘀䌀㘀䈀㜀䐀䌀䄀㤀䄀㔀㔀　　䈀䐀䐀䘀㔀㘀　㈀䄀㌀㤀䄀㠀㜀䔀㌀㐀㤀㠀㐀㈀㠀㌀㠀䈀䌀㌀㘀䄀㜀　㘀㐀䄀䐀䐀㜀䈀䌀䌀㤀㠀㠀䄀㘀䔀㈀　㈀䔀㤀䐀　㐀㔀㤀㘀㤀㜀䐀㈀㈀㠀　䌀㌀䘀䄀㈀㔀䘀䘀㤀㜀　䌀䐀䌀䐀䔀䈀㔀䄀㈀䔀䈀䌀㜀㠀䘀䔀䌀䐀䐀㤀㌀㜀㘀　䐀㌀㠀䄀㤀㘀䄀㘀䔀䌀䔀䄀䐀䈀㤀䄀䔀㘀䐀䐀㜀㔀㄀䈀䈀㔀㠀䘀㤀䈀䘀䐀䘀䔀䈀㐀䄀㘀䄀㤀䔀䈀㔀㘀䌀䘀㤀㠀　䄀䄀䘀㠀㔀䘀㜀㌀㘀䄀㔀䈀㈀䐀㜀㘀䔀㤀䘀㌀㘀㘀㔀　䈀䔀䄀䔀䈀䈀䘀䄀㈀㌀㄀㜀㘀䄀㈀䈀䔀䔀㘀　㄀㤀㈀㔀　㈀㠀㘀　　㌀㤀㔀　䌀㔀㈀　㐀䐀　㤀䐀䔀䔀㘀㜀　　䈀䔀㈀㄀㌀㐀㠀㠀㘀䘀　䔀䈀䔀㠀㤀㄀㜀䌀　䈀㠀䔀䔀䌀㐀䄀㈀㈀䐀㐀㔀䔀䘀䘀㄀　䐀㘀㘀㌀㜀㔀㄀䈀㄀㌀㌀䐀㄀㠀䐀㜀　　䄀㈀䌀䔀䐀㤀䐀㤀䈀㌀䐀㤀㔀䈀䐀　䈀䐀　䐀㤀䘀㜀䐀㄀䈀㌀㈀㜀䐀　䈀㌀䈀䈀㐀㄀㈀㤀䔀㈀䈀㔀㌀㌀　䌀㌀㜀㤀㈀㤀㈀䄀㤀㐀䄀㠀䘀䌀㜀㔀㔀㔀㤀㔀㘀䌀㔀㔀㜀㠀㘀㐀㈀䘀㘀䌀䄀㈀䄀㐀㐀䈀㌀㤀㠀㐀䌀㘀䄀㘀䄀㈀㈀䔀㔀䘀㠀䌀㄀㔀㔀㄀　䌀㄀䐀㜀㔀㄀㜀㌀　䘀㤀䔀㄀䌀㐀㐀䈀㈀㠀㜀䘀㤀䌀㠀㄀䘀䔀㌀䄀䐀㠀㘀㤀㌀㈀㄀䔀㤀䘀㈀䘀䄀㜀㐀㠀㤀䘀㤀䐀　䘀㤀䐀㄀䄀㤀㐀䘀㌀㜀䈀㠀䌀䌀䐀㄀㌀㌀㠀㤀㤀䌀㈀䔀㜀㠀㜀㔀䔀㜀㈀䐀㤀　㔀䘀㌀㤀㜀㌀䔀㄀㤀䐀㐀䘀㈀䐀㤀䄀䈀㜀䈀䔀䘀㜀䌀㈀䌀㔀䘀䈀㜀䈀䌀㜀㤀㔀㔀㘀㔀㐀㤀㐀䄀㘀㤀㈀䐀㄀䘀㈀䐀　㜀䐀䌀䐀㤀㔀䌀㤀䐀䄀㈀䄀㘀㌀㌀㜀㈀㔀㈀㘀㜀䈀㔀䔀㠀䄀䐀㜀㔀䐀䐀㌀㜀㌀㐀䔀䔀㔀㔀䐀㌀䐀䌀䐀䔀㌀䐀㌀㤀㌀㘀䘀䈀㠀䘀㜀䈀䘀㤀㘀㜀䄀㠀㌀䌀㤀㜀㄀㈀㄀㤀䘀㈀䘀㤀㠀䐀䐀㜀㄀㜀㌀䈀㠀䄀㐀䈀㄀㈀㤀㔀䄀㠀㐀㘀㜀䌀　㐀㜀䔀㠀㤀㤀㈀䄀䐀　㌀㌀䘀㤀㤀　㔀㠀㌀䈀䌀䈀㤀　䘀㄀㔀　㌀䄀㈀䄀䌀㌀㜀䔀㘀㜀㈀㔀䄀㈀䌀　㘀㈀㌀㈀㤀䌀　㈀㈀㜀㌀䌀㈀㈀䔀䌀㄀㌀㈀㠀㈀㠀㈀　䔀㈀　䘀㘀㈀㈀㈀䐀㐀㠀㠀㈀㐀䔀㈀䈀㘀㠀㠀㜀　䘀㐀㘀　㜀䔀㠀㐀㄀䘀　䈀㠀䐀䄀㔀㈀㤀㄀㘀䐀㐀䔀㜀㄀䔀　㘀䌀䐀㔀㜀㌀㐀㤀䄀䄀㠀　䐀䐀㄀㐀　䈀䄀䐀㄀䌀㌀㘀㐀㌀䘀㜀䄀㠀㐀　䐀㤀㜀䄀㔀䘀㘀䐀㐀䘀㐀䄀䔀㤀㤀䐀㘀㌀㈀㘀䘀䌀䔀㐀䐀䘀　㤀䌀䔀䌀䄀䈀㈀䈀䔀㘀㄀㠀䘀　㠀䔀㐀䐀㔀䈀㌀㘀䐀䘀　㈀䌀䈀䈀㤀㠀　㈀㜀㠀䌀䌀㘀䘀㌀䈀䌀䐀䔀㌀㔀䐀㌀䄀㜀㘀㘀䔀䘀䌀㤀㜀㘀㌀㜀䄀㔀䔀㄀䔀䔀䔀䐀䐀䈀䈀㜀㘀　㔀䌀　㌀㔀䌀㤀䘀䌀㐀䌀䈀㐀䌀　㘀㐀䔀㐀㐀㠀㄀㌀㌀㠀䌀䔀䄀䔀㔀㌀䄀䔀䌀䐀　䔀㄀㜀㈀㌀䈀䔀䌀䈀　䌀㌀㈀㔀㌀䌀䈀䌀　㠀䘀䐀㔀㄀㔀㜀㔀㄀㤀㐀䄀䐀㘀㜀㤀㜀㄀㜀㜀䄀䈀䐀㈀㔀䔀㄀㤀䔀　㠀㔀㈀䔀㤀㔀䐀㐀㔀䄀㈀㈀㌀㔀　　㐀㠀䔀䐀　㘀㘀䌀㠀㈀䔀㐀䌀㜀㘀㄀㈀㔀㐀　䔀㜀㐀䄀㌀㤀䐀䔀㘀　䘀䌀㐀㔀㠀㔀㘀㈀䔀㤀㤀㈀䄀㠀䐀䔀㈀䔀㠀㠀䈀㈀㘀䌀䄀㤀㤀㠀䈀㤀䐀㜀㌀䈀䈀㌀䌀㔀㐀㘀㘀㔀䐀䐀䘀䈀䄀㐀㤀䌀䐀䈀䐀㜀䐀㌀䐀㘀䈀䘀䈀䐀㘀㌀㘀㌀㘀䘀㜀㄀䔀䔀㠀䈀㤀㘀㜀䘀㜀䄀䔀㌀䐀㜀㜀䔀䘀䈀䔀㤀䈀㤀㤀䐀䌀䈀㈀䘀㌀䄀䐀䄀䐀㔀䈀䐀䔀䐀䔀䐀㤀䐀㈀䈀㈀䘀㌀䔀䐀㈀䐀㔀䈀䐀䘀䐀䄀䐀㤀䘀㈀㜀䐀䐀㌀㠀㤀㔀㜀㔀䘀㌀䈀䘀㄀䘀㘀㘀䘀㔀䘀㌀䐀㐀㄀䄀㈀䈀䘀䐀　䔀䐀㈀䔀㘀㐀㄀䄀㄀　㜀㜀㠀㤀㄀䐀㄀㘀㔀䘀㄀㜀㘀䌀㤀　㐀㈀䐀䄀　㐀䄀䔀　䄀䌀　㠀䄀㐀㜀䔀㠀䄀䄀䘀䐀䐀　㠀䔀䄀㐀㜀䘀㐀㈀　㐀㌀　䘀㤀㔀㘀　䄀䐀䐀㐀䈀㐀㤀䄀㤀䌀㘀㔀䄀㤀㈀㌀㈀䈀㔀䘀　䌀　䐀㐀䘀䔀㤀䔀㠀㜀䐀䘀㘀䈀㔀㠀㐀䐀䌀䘀㄀㠀䐀䘀㔀㤀䈀䔀䄀䘀㘀㘀䔀䈀㜀㐀䘀䌀㠀䐀㌀㌀㤀　䐀䔀䘀䐀㈀㔀㜀䄀䘀㘀　䄀䘀　㄀䘀䌀㘀䐀㈀㤀㤀㌀㄀䈀㠀䐀䔀䈀㌀䌀㌀㐀㌀䔀䐀㜀　䌀㌀㔀䔀㌀㜀䈀䌀㐀䄀㠀㌀㘀䐀㄀䄀䈀䌀㔀䐀㠀㘀䔀䈀㘀㐀㌀㠀㤀㌀㠀㜀㌀㌀㄀㠀㄀㠀㠀䐀㔀㜀㔀㐀㠀㐀㜀䈀㜀㘀䈀　㜀　㄀㈀䈀䈀㠀㄀䄀㔀㈀䄀㔀㤀䌀㐀㜀䐀㈀㐀䄀㤀䔀䄀㠀䐀㌀㠀㜀䌀㈀㠀䘀䔀䈀㌀䘀㠀䐀㄀㌀㠀䈀䐀㌀㈀䈀䔀㌀㤀㐀䔀䌀䐀㠀䐀㈀䘀㠀䔀㔀㌀䔀㜀䌀㘀㘀㄀㐀㔀㜀䌀㐀㈀㤀䌀㠀䄀㐀㌀䈀䐀䌀㜀䔀㤀㘀䌀㠀㔀㄀　㌀䄀䐀㤀㘀㠀㔀䌀䐀㜀䔀㌀㘀䄀㤀㄀䔀䘀㈀㠀䔀䄀䈀㌀㌀㠀䘀㔀䘀䌀㜀䔀䄀㐀䐀㔀䔀㌀䄀䔀㐀㌀㌀㐀䄀䌀㘀㜀㌀㈀㘀㠀䄀㠀㌀䈀㌀㄀㄀㄀　䘀㤀㠀䈀䐀䄀㜀䔀㌀㌀㜀䐀㄀㄀䔀㌀㄀㄀䔀㌀䌀㠀䘀㌀䄀䘀㌀㌀䘀㈀㔀㈀㔀䄀㠀㈀䘀㄀䈀㤀䄀䔀㠀䘀䄀㌀㐀䄀䔀㔀䈀䌀䔀䌀㔀㤀䈀䔀㠀㤀㐀䐀㔀䐀㄀㤀䌀㐀䌀㜀㌀㈀㔀䘀㐀㤀㜀䐀䘀㈀䘀㈀䄀㘀䔀㜀䈀㘀㠀䘀䐀㠀䄀㔀䈀䌀䔀㜀㜀　㔀㌀㌀㄀䐀㐀䐀㜀䘀㜀㜀㄀䘀䔀㄀䌀䔀㔀䘀䈀䐀䘀㜀䌀䄀䄀䈀㄀䔀䔀䔀㘀䄀䄀㠀䈀㠀㘀㠀㐀䈀㐀㜀䐀䈀䔀䄀㔀㤀䔀㔀㄀䌀㜀㔀㘀　㜀䌀䔀䘀㠀㘀䘀㔀　䐀㜀㔀㌀㌀㤀䄀㤀䄀䔀㈀㘀㔀㔀㌀㘀䄀䌀㌀㘀㜀㤀䌀㄀䐀㜀㜀㈀䌀䄀䄀䄀䐀㔀㤀䈀　㘀䔀䔀㘀㠀䌀䄀䔀䈀㘀㔀㤀㤀㔀䔀㔀㠀䐀㜀㔀㔀㔀㐀䔀䐀䌀㌀㜀㤀㌀䈀㌀㐀䈀䔀㠀㈀䌀䔀䄀㤀䈀㐀㘀㈀㐀䘀㄀㘀䌀䐀㠀㌀㘀　㤀㘀䔀㘀䈀㠀　㔀䈀䌀㜀䌀㌀䐀䈀䔀䈀䔀　䔀䐀䔀㌀䔀　㤀㔀䐀㔀㌀䐀䐀㔀㔀㐀㔀䈀㌀㔀㤀䌀㔀䔀　䐀㤀㜀㔀㔀䘀㘀㔀㘀㔀㈀㤀㜀㤀㐀䌀㄀㈀䔀㌀㜀䔀䌀䐀㄀䔀㄀㄀㈀㄀䐀㔀䔀䄀㐀䌀㌀㘀㤀㌀䄀䈀䌀䐀䐀　㄀㘀䘀䈀㜀䌀㌀䄀㔀㌀㐀㔀䌀　㈀㔀㘀㈀㄀㈀㈀㠀䈀㘀㐀㜀䄀䌀䄀㐀䈀㈀㈀㤀㄀㤀䄀䘀㈀㜀㈀㔀䈀㠀䘀䌀䘀䄀㜀㌀㐀䐀㔀䘀㐀㈀　䐀㤀䄀㐀䔀㜀㈀㘀　㔀䈀㘀㈀䄀㄀㠀䌀䔀㠀䈀㔀㘀㤀㈀䌀䐀㌀㔀䈀　䄀㘀㈀㘀　㄀㄀䄀㐀䈀㠀䄀㈀㈀㘀㄀㐀㔀䄀䐀㔀㔀㘀㄀㔀㠀　䐀䄀䈀䌀䔀㐀㐀㔀㄀㄀䄀㄀㄀㔀㤀㤀䘀䈀㌀㐀㠀㤀㐀䄀䐀䔀䔀㌀㈀䄀㜀㠀㜀㤀㘀㄀䄀䌀㐀㜀䔀　㘀䐀㐀㘀䈀䄀㠀䔀㜀㌀䄀䌀㤀䐀㐀㐀㜀㤀䐀㠀㘀䘀㘀㔀㠀㤀䄀䌀㘀㤀䌀䄀㄀䈀㌀䈀　䐀䈀㜀㈀㌀䘀䈀　㠀㠀䌀䔀㄀㄀㘀㔀㤀䌀　㐀　㠀㌀㔀㔀㄀㘀㘀㐀䘀䈀㈀㔀䌀㐀㌀㐀㄀㌀䈀䐀䘀䄀䐀㈀䌀㐀㜀㜀䐀㘀䐀㈀䌀㤀䐀㄀䔀㘀䈀䐀㤀㜀㘀㜀　䐀㤀䔀㔀㠀䘀䘀㔀㔀䔀㈀　㄀䐀　䌀䔀䌀㔀䄀㘀㜀㜀㐀䌀䘀㌀䐀䄀㜀䄀䄀㘀㔀㤀㤀㄀㄀㌀　㘀㈀䄀䔀㈀㤀㘀䈀㌀䈀䌀㘀㤀㜀㌀㔀㈀䘀㄀㠀䐀㜀䈀㌀䌀㌀䐀㤀䄀䘀䌀䘀㔀䐀㜀䐀䘀䘀䌀㔀㤀㜀㌀䔀䈀㠀㘀㈀䘀㈀㤀㈀㈀㔀䘀　㜀䔀㠀㜀㜀㄀䐀㤀䈀䄀㘀㤀㔀㜀㌀䐀䈀㔀䘀䔀䈀䌀㠀㤀䐀䐀　䘀㔀䌀䔀㘀䈀䘀㘀㜀㘀㜀䐀㔀䐀䌀䔀䈀䄀㜀㐀䘀㔀䔀㜀㘀㐀㄀㐀㈀㄀㐀㜀䔀䔀䄀䌀䘀㜀㐀㤀䔀㌀䘀䘀䔀䄀㈀㐀㤀䌀㔀䈀㜀䐀䐀㔀㈀䈀㈀㘀㠀䔀㜀䄀㈀䐀䄀䘀䄀䌀㔀䐀䈀㈀䘀䔀䌀䈀㤀䔀䘀㄀䌀㌀䌀㄀㌀䌀㜀㘀㔀㌀㜀㌀　㤀㌀㤀㠀㄀㐀䄀㈀㘀䘀㄀㤀㐀䌀㌀㜀㠀㈀　䔀㐀䔀㘀㈀㈀　㄀　㔀䔀㔀䘀㈀䐀㘀䘀㤀㌀䄀㤀䄀㔀㐀㠀㌀㔀㘀㌀㤀㤀㈀䔀㌀䈀㤀䌀㠀㄀㄀㘀㌀㄀㄀䔀㤀㄀䘀䈀　㄀㠀㤀㄀㔀㄀　䘀㄀䘀㜀㐀㌀䌀㘀㐀䔀䄀㄀䈀䔀㘀㤀㐀㘀㈀䈀䔀㠀䘀㄀䔀㘀㄀㐀㜀䄀䌀㘀䔀㐀㐀　㄀䐀㔀䄀㌀䘀　㜀㠀䔀䄀䈀䌀㜀䔀䈀䔀䄀䌀㠀㄀䌀㈀㠀䐀㔀䌀䌀㘀㔀䈀㐀㐀㐀㈀䈀㠀㔀䌀䌀䄀㐀㔀㜀䘀䄀㠀㜀䄀䔀䄀㜀㤀䔀䈀䐀䘀㜀㤀㔀䔀䌀䄀䐀䈀㘀㘀䌀㈀䌀䈀䈀　㄀㘀䔀㜀䈀㤀㈀䘀䔀䐀㄀䘀㜀㌀䐀䐀㐀㜀㔀㐀㌀䈀䈀䌀㤀㤀㠀㈀䘀㘀㔀㜀㠀㈀㘀㠀㘀䘀㐀䌀㘀䐀䈀㠀䌀㤀㘀㜀㔀䘀䔀䐀䈀䘀䌀㔀㐀㠀㔀㌀䄀㐀㄀䄀㔀㄀䄀㘀㐀㜀㠀䈀䈀　㠀䄀䘀㄀㄀䐀㜀㠀㤀䐀㐀㐀䌀㄀㄀䌀䔀㄀㈀㌀䄀㠀㐀㈀䔀㠀㄀㤀䔀䌀㘀䌀㄀䘀㌀㘀㤀䐀㠀　㄀㘀㄀㌀　㘀㠀䔀䈀䐀㄀㜀㔀䄀㤀䌀㠀䔀䘀䘀㌀㐀㤀䄀㄀䘀䘀䌀䘀䐀䔀㜀㜀㐀　㐀㜀㜀㔀㤀䐀　㤀䐀䘀䔀䘀䈀䔀㌀㜀䈀䐀㘀䈀㘀㘀㌀㐀㄀䄀㘀㤀㌀㐀㜀䄀㈀㌀䌀䐀䄀㠀㌀　㐀㈀㘀䐀㄀　㤀㈀㘀㠀㄀䄀㠀㄀㐀　　㔀㄀　㔀㠀䄀　㐀㈀㄀㄀㈀　䄀㐀㔀㄀㐀㌀㐀㠀䄀　　㈀　㘀䔀䌀㘀　㄀䈀㠀㌀　䌀䐀㠀　㘀䐀䈀㠀㤀㠀䐀㌀㄀䈀䈀䌀㘀㔀㤀䌀㜀㘀䐀䈀䐀䌀㐀㜀㄀䈀　㠀䐀䔀㔀㌀㠀㜀㄀䐀㄀㠀㤀䔀㌀㜀㔀㔀䈀䌀㜀䔀䈀㈀㔀㐀䔀䔀㈀㤀㈀㌀䘀㠀㤀㤀䐀㐀䐀㤀㘀䈀㐀䔀㔀㜀㜀䘀䌀䌀㜀㘀㠀䐀㠀䔀䘀䐀䔀䘀㜀㘀㘀㌀㐀㄀㐀䔀㜀㘀㐀䘀㌀㤀䘀䐀䐀䈀㌀㌀㤀㈀䈀㈀䔀㤀㈀㘀䔀㜀䈀䘀㜀㜀䔀䔀䐀㜀䔀䔀㔀䐀䔀㔀㜀㠀㠀䌀䈀㘀㔀㄀䌀㌀㘀㄀　䔀䄀㐀䐀㜀㄀㄀㤀㠀䌀㐀䔀㤀㜀䐀㄀䔀㠀㜀㈀　䄀㄀㘀䌀䘀㌀㠀㜀䐀㠀䔀䄀㐀　䄀㌀㌀䈀䔀㘀㤀䘀㄀㘀䄀㄀㔀㌀䔀㜀㈀㈀㜀㤀㔀䘀㌀䈀㄀　㐀䐀㔀㄀䌀㄀䄀㔀䄀㄀䔀　䔀㜀㄀㈀㘀㜀㈀㘀䈀㌀䈀䌀㔀㌀㌀䘀㤀㤀㘀㜀䔀㤀㈀㤀㔀䔀㤀䌀䘀㠀㤀䐀䐀䐀㐀㄀㔀䈀㜀䌀　㄀　㄀䌀㌀䈀䘀䄀㌀㐀㔀㠀䄀㌀䘀䘀䘀㘀䐀㄀䐀㌀䐀㄀䘀㌀䌀䔀䔀㜀㤀㌀䔀䘀㄀䔀㌀㠀䘀㐀䐀㠀䄀㤀㐀㌀㠀䘀㘀䘀㜀㠀䔀䌀㈀㠀㌀䐀㌀䈀㜀㤀　㘀㜀䔀䈀䈀㌀䔀㄀䄀㜀䐀䔀䘀䈀䐀䔀㠀㤀䈀㘀䘀䈀䐀㘀㘀㌀䔀㜀䌀䘀　䄀䐀㜀䈀㠀䔀㌀䘀㜀㤀㤀䈀㠀㌀䘀䔀䘀䔀㄀㐀㔀㈀㜀䄀㌀㌀䔀䄀䈀䌀㌀䌀䐀㔀㠀䈀䔀㠀䔀㜀㘀㜀㤀㄀㘀㌀䔀㄀䔀䔀㔀㤀㔀㤀䐀㔀㔀㤀㌀㜀㘀㜀　㤀䐀㤀㔀㤀㌀　㤀㘀　㤀㌀䈀㌀㈀㘀㄀㐀䌀㠀㈀㌀䄀㌀㜀䘀㠀㤀䐀䄀　㜀㈀㌀䄀㤀䐀䈀㐀䐀㜀　䔀㘀㌀㔀㘀䐀㠀㘀㄀㠀㔀㄀㄀　䈀䐀䌀㘀䄀㠀㈀㌀㤀䄀㘀㜀䄀㄀㌀㔀䐀䄀䌀㠀㌀䐀㔀㤀䄀㐀䔀　䐀䔀䐀㄀㐀㘀　㤀㔀　　䔀㔀　　㌀㘀㈀㐀　㄀䔀䄀䌀㠀㌀㐀䄀㐀㐀㘀䌀　㐀㜀㔀䌀䌀㌀䔀䌀㘀㌀㜀　䈀㘀㈀㐀䄀䘀㄀㜀䄀㌀㠀䘀㄀㐀㠀㜀䐀㜀䄀䌀㐀䄀䘀㄀㘀䄀㐀䐀䈀㄀　㔀㄀䘀㌀䄀䘀㜀㘀㘀　㤀㔀㌀㤀㤀㈀㔀㈀㔀㔀䌀㘀㤀㜀㈀　㔀㜀䘀䄀㔀䈀　㜀㈀䌀䌀䐀㤀㠀㜀䐀㤀䔀㐀㌀㜀　䘀䘀㤀䘀㠀䈀䈀䐀㔀䈀㈀㌀㈀䄀㤀　䐀㄀㈀㜀㐀㈀㤀䄀㐀䔀䌀䘀㤀䘀㠀䘀㐀㠀㔀㌀䘀䈀䔀䘀䐀㐀䔀䘀㐀㈀䌀㜀䄀㌀㜀䔀㐀䌀㄀㠀䘀㔀㌀㐀䔀㄀㜀䈀䘀㜀㈀䘀　㄀㔀㔀㠀㜀㈀䘀䐀䈀䐀䘀㜀䔀䔀䐀䈀䘀㤀䘀㠀㘀㌀䘀㐀䘀䌀㐀䈀䐀㄀㐀䘀䐀䘀㜀䄀㌀䈀䘀䄀㈀㌀㠀㐀䘀㄀　㠀㠀䌀䌀㄀䄀䐀䌀䘀㤀䔀䈀㘀䘀䔀㘀䈀䘀㐀䐀㜀䐀㄀䘀㜀㈀㘀䌀㜀㔀䔀䈀䐀䔀䐀䈀㘀䔀㜀䈀䔀㜀䔀䔀㐀　䔀㜀䔀㌀㈀㔀㐀㄀㤀䐀䐀㈀䈀㤀䌀㐀㜀䈀䔀䔀䈀㐀㤀㘀㔀㌀㠀䘀䐀㌀㘀　䐀䘀㐀㘀䈀䄀䔀䐀㌀䐀　䄀㔀㤀䄀㜀㔀㄀䄀㤀䄀㠀䈀㐀䔀　㜀䐀䄀㜀㔀䄀㌀㌀　㈀䌀㘀䄀䈀㔀㈀㈀䐀㄀㌀　㐀䔀䔀䄀㔀㄀䐀㤀　䄀㐀䌀䔀㘀㄀㠀䔀䘀㐀㈀㠀㔀㔀㘀㔀㤀㠀㤀㌀㄀㤀　䐀㄀㔀　䄀㤀㠀㤀㤀　㤀㔀㐀㐀㤀㠀䔀㄀㄀㜀䌀䔀㤀䘀㠀䐀䈀䔀㤀㐀䘀䄀䄀䌀㄀䄀䐀㈀㌀䔀㤀䌀　䌀　㤀㐀䘀　㤀䌀㜀㜀䘀㌀䐀㔀㤀㄀䈀㌀䐀　䌀㐀㄀䘀䄀㄀䄀㔀　㠀䌀䈀㠀　㐀䐀㈀㠀䌀㔀䌀㐀㠀㐀㌀㈀䔀㈀㐀㤀㌀㐀䌀㔀㈀㐀　㄀䔀　㤀　䘀㜀㔀㄀㘀㐀　㄀㌀䘀䔀㤀䘀㄀㄀㤀㤀㐀㄀䈀㜀䔀㐀䌀㈀䐀䄀㔀䌀䐀㠀䔀㈀㠀㜀䈀㔀㜀䔀䔀㠀䌀㠀㠀㐀㠀㠀㄀㜀䈀㘀㜀㠀䄀　㈀䘀　㔀䘀㘀㌀䈀㘀㄀䌀㐀　㤀　㜀䔀䌀䈀　䐀㌀　䔀㜀䈀䄀䌀㠀㜀䄀䐀㜀㐀䈀㜀䔀㤀㤀　㠀㤀䔀䔀䐀㈀㄀䘀䐀㐀䐀㌀㌀㄀㠀　㄀䐀䔀㠀㌀㠀㄀㄀䈀㌀㘀㌀㌀㠀㌀㔀㤀㔀　䔀㔀䈀䈀㌀㠀䘀㘀㘀䐀㌀䔀䌀㘀䌀㘀䐀㤀㄀㌀㐀㘀䌀㌀㘀䔀㜀　䘀㘀㜀㘀㠀㐀㄀㘀䈀㐀䌀㌀㘀㄀　䐀㄀䔀㔀䌀䐀䌀䈀䌀䈀㐀䄀䘀㜀䐀䄀㔀㐀㔀㤀㔀䔀㔀㔀㤀䌀㈀㔀䔀㜀㔀䌀㄀㔀㔀　㄀㠀䐀㜀㈀㌀㘀䐀㜀㄀㔀䘀䔀㈀㈀䄀㘀䌀㘀㤀　㌀䐀㄀䔀㘀㄀　㤀㄀㈀㤀䔀䌀䄀䔀䌀㈀㔀㈀䘀㘀䈀㘀㔀㄀䐀㤀　䈀䌀䌀㐀㤀㘀　㐀䈀䄀㈀䈀㤀㄀㌀䈀㐀㘀　㠀䘀䘀䔀䔀䔀㤀䐀䈀㌀䐀㄀䘀㌀䌀㜀䘀㘀䘀䔀䘀㠀㄀㜀䐀䘀䘀䄀䌀䔀䄀䘀䌀䔀䈀䔀㄀㔀㌀㤀㜀㠀㌀㠀䐀㈀㌀㔀㜀㘀䈀㠀㜀㌀䔀䘀㘀㌀㐀䘀㔀䌀䈀䘀䔀䘀䌀㄀㐀㜀　㐀㜀㜀㘀䈀䘀㐀㈀㜀䌀䘀㐀㜀㠀㄀䈀䌀㜀㠀䘀㠀㈀䐀㤀㜀䈀㠀䔀㠀䔀㌀　㜀㜀䔀䘀㠀䐀㄀䘀䐀㌀䘀㔀㠀䈀䔀䔀㠀䌀㘀䘀㘀䌀䔀䈀㄀䘀䐀䔀䈀䈀㜀䔀䔀㤀䐀㐀䌀㜀䈀㜀　䐀䘀䈀䔀㐀㜀㄀䔀䐀䘀䈀㌀䘀㜀㜀㄀㤀㐀䐀䌀䐀㔀䐀㄀㐀䔀㘀䔀䄀䐀㔀㌀㠀㠀㤀䘀㄀䌀　䐀䈀㜀䌀䐀㤀㘀㤀㘀㐀㠀䈀㐀䐀䔀　䈀㄀㔀㔀䔀㌀㠀㤀㠀　䔀䌀㄀㘀㐀㐀㠀㐀䐀　㘀㔀䐀㌀㈀㠀䌀㌀㠀䄀　䌀䈀　㄀㘀䈀㘀䌀䈀　㠀䔀㤀㄀䔀㠀㈀㘀㌀㌀㈀䌀㌀㄀䌀㌀㈀䌀㌀㌀䐀㐀䔀䈀䄀㄀㐀䘀　䈀䔀䈀䘀　䈀䘀䈀㠀㐀㔀䄀㐀㄀䔀䔀㌀㌀　㌀㤀㤀䄀　㈀㈀㤀㈀㤀䔀䄀㘀䌀㌀䈀㐀䄀㘀䘀䔀㘀䈀　㌀䄀䌀㤀䔀䔀䘀㘀㄀㈀㐀㄀䌀㠀㜀　㜀䄀㈀䐀䔀㘀　䌀䄀䘀㈀䔀㘀㘀䐀䔀䔀㌀㈀㈀㄀䈀䄀㜀㐀䘀㠀㠀䘀㤀㤀㜀㔀㜀䄀㄀㠀䌀㔀䄀㜀䔀䌀㜀　䐀㜀䘀㐀䐀㄀㘀㜀䈀㤀㌀㘀㔀㌀㘀　䘀㘀㈀㤀㈀㘀䌀䄀䄀㐀㐀㜀䄀㘀䌀㈀䄀㌀䐀䈀㌀䘀㔀㜀㐀㄀㐀䔀㠀㘀䈀㘀䘀㐀　㔀䔀䘀㐀㌀㜀㄀㜀䈀䔀䘀㘀㐀㄀䌀䄀䔀㌀㜀㤀䄀䘀㜀䐀䔀䐀㄀䈀䐀㄀䐀㜀䘀㜀㤀䐀㌀㠀䈀㤀䔀㜀䈀䄀㜀䘀㜀㠀　㐀　䄀㤀䈀䘀䈀㐀　䘀䘀䔀䔀㜀䈀㤀　㄀䌀㜀䐀㌀㤀䈀䄀㈀䈀㌀䄀㄀䌀䈀䐀䘀㘀䄀㤀㌀㌀䔀㘀㐀䘀䄀　㄀　䈀㐀㔀㤀䌀䘀㄀䐀䈀㤀䔀㌀䔀㔀䈀㜀䔀䔀䈀䄀䘀㔀　㤀㜀㈀䘀㄀㈀㈀㘀㤀㐀㈀䔀㤀䈀㄀䄀㤀㔀䔀䄀　㘀䄀䘀㘀䘀䔀㈀䌀㈀䌀䌀䘀㐀㔀㄀㔀䐀䄀䄀㈀㜀䄀　㄀䔀㌀㜀㜀䌀㜀䌀㔀䘀㔀䈀䌀㘀㘀㄀䔀㈀㄀䄀㈀㠀㘀䘀㜀㜀　䘀㈀㜀㈀䘀㌀䌀㔀㠀䘀䌀㔀㘀㐀㔀䔀㐀䔀䔀㘀䔀㔀㄀㈀㘀䌀䌀䘀㔀㔀㠀䐀㘀㌀䐀㤀㤀㔀㄀㈀㄀䈀䐀㄀䄀㜀㜀䄀㠀㠀㤀䐀㜀䘀䘀㄀㜀㘀䄀㘀㈀㔀㘀㘀䔀　㠀㠀㘀䄀䔀㈀㜀㘀䈀㈀䘀㈀㔀㈀䔀䌀㐀䘀㔀㐀　䘀㘀㌀㌀㤀䘀㔀㤀㜀䄀䌀䈀䌀　䄀䐀䈀䐀䐀㜀䌀䈀䌀㌀㐀㄀㈀䈀䈀䐀䔀䌀䐀䘀䈀㜀䈀　㠀䐀㌀䔀㜀㜀䐀㄀㜀䐀䘀㔀㜀㘀䐀㔀㔀䈀䐀㠀㌀䘀㌀䐀㐀㤀　㌀䐀䔀㄀䔀㔀㠀㜀㄀㜀䌀㌀䔀䔀䌀㔀䐀　㔀䈀　䐀㤀㄀㌀　㌀㐀㠀㜀䄀㄀㘀䈀　䔀䈀㐀䔀㐀㐀㄀㜀㜀㈀䔀㌀㐀䔀㔀㐀㈀㠀䐀㄀㜀䄀䄀䐀㌀䄀㄀䐀䔀　䐀㜀㤀㔀㘀㈀　䘀㤀㔀㈀䈀㈀　㠀㔀㈀　䐀䐀㐀䐀㐀㤀㠀䔀䈀䄀㐀㘀䌀㤀䘀㘀䘀㜀䔀䈀㘀䐀㤀㈀㜀㠀㔀䈀䌀䌀㤀䌀㤀　䈀䐀㌀䈀䌀䐀㤀䌀㈀㐀㈀䄀䘀䄀㠀䐀㌀䄀㄀䘀㌀㠀䐀䄀䔀㠀䔀㈀㈀䈀䄀㤀㜀㜀㈀㈀㘀㌀㐀㜀㄀䄀䔀䔀㐀㌀㈀䐀䔀䘀㠀䈀㈀䈀㈀䈀㌀㜀㌀䌀䌀㐀㈀䌀䌀㄀㜀㈀䈀㐀㌀㠀㜀㠀㠀㔀䈀㌀䄀䘀㐀㄀䄀㘀㈀䄀㘀䌀䔀䔀㘀㜀　㜀㠀　㔀㐀　㄀䘀䌀㈀㠀䌀㄀㘀㤀㈀㜀䐀㘀㌀　䈀䄀䐀䄀㄀㘀䄀䔀䈀　㜀㤀㘀㄀㐀㘀䐀䔀䔀䘀䄀㘀䈀䔀䘀㠀䐀䔀䌀㜀䄀䘀䔀䄀㘀䔀䄀㠀䄀㤀䈀㜀䘀㜀　䘀䘀䈀㌀㘀㜀㘀㜀㜀㠀䄀䘀䈀㤀㘀䐀㜀　䔀㌀䄀䐀㤀䈀䔀㜀㔀䄀㔀䔀㜀　䄀䌀䈀㤀䔀䈀䔀䐀㔀䈀䘀䘀䘀㘀䐀䐀㄀䈀㘀㜀䄀䈀㜀㐀㐀㤀㘀㤀㄀㜀㠀㤀䈀䘀㜀㜀䔀䘀㤀㄀䈀䄀㠀䔀㈀䘀䐀㔀㜀䄀䈀㈀䄀䘀䘀㤀㔀㈀䔀䈀䈀䄀䈀䘀䐀䘀㜀䘀㐀䐀㘀㘀㔀䈀㜀㤀㜀㘀㐀㌀㘀㔀䌀䔀䐀䌀䄀䐀䘀㜀䈀㔀䄀䘀㌀䐀㌀䄀䈀㠀䌀㈀㤀䐀㔀㘀㘀㠀㘀䐀䈀䈀䄀䈀䄀㜀㈀䌀㘀䈀䔀㤀㘀㠀㘀㌀䌀䄀䔀　㘀㌀㐀㌀㜀㌀㤀㘀䐀䌀㜀䔀䘀㘀䌀䔀䔀㠀㌀䘀䘀㘀䐀䌀㌀䐀䈀㠀㘀㈀䔀㄀㜀䌀䘀䄀㘀㌀䄀㌀䐀䈀䔀䐀㌀㘀㔀㠀㈀䄀㤀㘀䄀䐀㈀䐀䄀䄀䐀㠀㔀　㄀䐀㤀㠀㄀㔀䈀㤀㜀㌀㠀㌀䘀㈀䔀㔀䐀䘀㐀㄀䄀㐀䄀　㤀㜀䔀㐀㤀　䘀䈀䌀㌀㔀䈀　䘀㘀㐀㐀㌀㘀㜀　　㌀㐀　㄀㔀㜀㠀　䘀㘀㘀㔀㐀㈀䈀㌀㄀䈀㌀㐀㘀䔀㘀㠀㐀䔀㠀㄀㤀䄀㄀㐀䌀㠀䈀㘀䔀䐀䈀　㄀䐀䈀　　㤀㠀㜀㐀䌀䈀　䌀㜀　㠀䈀䐀㔀䄀䔀㠀䐀㌀㐀　䄀㤀　　㌀㤀　㈀䌀䌀䄀㘀㜀　䌀㐀　䈀㔀䘀㐀㈀䘀㔀䔀㄀㠀㔀䘀㔀㔀䔀䄀㠀䘀㌀　㈀䈀䄀䔀㤀䌀䔀㘀䌀㈀㈀㔀㤀㈀㔀㈀䄀㐀㤀㜀㤀㄀㤀䌀㤀䔀䌀䌀㌀㐀䔀㄀㘀㜀䐀㠀㘀㤀䔀䔀䄀㠀㤀㔀㜀㐀㈀㈀㈀䄀㜀㘀㔀㜀㤀㈀䐀㐀㈀㤀䄀㔀㜀䄀㔀㠀䈀䄀䈀　㘀䄀䔀䄀䌀㔀㄀㔀䈀㜀㌀䌀㔀㠀　㤀㘀䄀䄀㐀䐀䐀㘀㜀㐀㔀㜀　㠀㌀䘀䄀㌀㜀　㜀㘀㌀㘀㜀䘀䌀㔀㄀㌀䈀䘀䐀㜀㌀㠀䌀㤀䔀㤀䘀㐀㜀㤀　㔀㜀㘀㔀䄀　㐀㌀䔀㜀㘀䐀㜀䈀㄀㤀㤀䄀䄀　㘀䄀㔀䔀䐀㈀㜀㔀䔀㄀䔀㜀䄀㘀　䘀㈀䔀䈀㘀䐀㄀䈀㐀䘀㜀䐀㜀㘀䔀䘀㄀䐀㄀䘀㤀䘀㘀䌀䘀䄀䘀䌀㜀㤀㐀䐀䘀䐀㤀䔀㐀㜀㜀䈀㐀䔀㜀䔀㤀　㜀䈀䔀㄀㐀㘀㘀㄀䐀㐀䘀䔀㈀䘀䌀䘀㜀㔀㌀䔀䈀　䈀㌀　䔀䐀䔀䐀䔀䘀㤀䌀䌀㜀㔀䔀㄀䈀䔀㔀㜀㈀㄀䔀䈀䐀㤀　㜀䌀㄀䘀䌀㘀㈀㔀䘀䔀䘀㐀䈀䐀㄀㔀䘀㌀䐀㔀䔀㜀㌀䌀㌀㜀㜀䌀㜀㤀㘀㜀䌀䘀䈀㄀㤀䄀㠀䘀䘀䐀㔀䄀㜀㜀㌀䄀䘀㜀䐀㠀䄀㘀㤀䔀䐀㠀㜀　㠀㔀㄀䄀䐀㐀㜀䔀䄀㜀㠀㐀㠀㜀㤀䐀㠀䈀㜀㐀㌀㜀㜀㐀　㐀㜀䘀㜀㘀䈀㘀㄀㠀䔀　㠀㘀㤀㄀㈀㌀䈀㄀㈀㈀　㔀䔀㠀䈀㐀㄀㌀㈀䐀㤀䐀㐀䐀䔀㘀㐀䌀㄀㐀䌀㠀㤀㄀㄀㈀㔀㘀㘀　㈀㌀㔀㌀㘀　䈀㈀䄀㐀䄀䄀㘀㜀䌀㜀㔀㤀䘀㐀䐀㤀㄀　㐀䘀㘀䔀㐀㘀㔀䌀㠀㄀㤀㠀䄀㠀㤀㠀㌀㜀㠀䈀䌀㜀　䔀㌀䐀㄀䘀㘀㤀䈀㄀䔀䔀䐀䌀㠀㜀㤀䔀㄀㘀㤀㘀䐀䌀㘀䄀㘀䐀䐀㐀㜀㄀䈀䄀䔀䘀䐀䐀䔀㄀䐀㈀䈀㠀㔀䘀䄀䈀㄀㘀㜀㠀㜀㐀䈀㔀䄀䔀䔀䘀㠀㐀䔀䘀㜀㠀㔀　䘀㔀㔀䔀㌀㘀㜀㐀㌀㈀䐀㔀㔀㠀㄀䘀　㤀㜀䘀䘀䔀䘀䔀㤀　䈀㠀䘀㈀㤀䐀　㘀㠀㐀䘀㈀㄀㌀㐀䈀㌀㐀㠀㔀䘀䈀㠀㜀䄀㜀䘀㌀㄀䔀䌀㈀䌀㠀㘀䐀䌀䘀䌀䘀㈀㜀䌀䐀䄀㤀㐀　㔀㐀䈀䈀㈀䄀　㈀㘀㄀㔀㤀㘀䈀㠀㤀䈀䐀䐀㜀㐀㌀㄀䄀䄀㜀　㄀䐀䔀䌀䐀㐀㐀㄀䄀䔀㔀㠀㈀䔀䐀㈀䈀㐀㤀　㐀㐀䈀㈀䄀㔀㔀䌀䌀㈀㈀　㈀㔀　㔀㔀䔀㠀䘀䌀䘀䄀㜀䌀　㤀䈀㘀䈀㘀㐀㈀㈀㌀䔀䌀㄀㈀㄀㐀㘀䈀䘀　　㈀㌀㠀䌀㄀䘀㤀䘀㈀䈀䈀㄀䈀㈀䄀　䔀䘀㔀㈀䔀㄀䈀䔀㌀䄀䘀䌀䄀䔀㌀㠀㄀䔀㔀㤀㔀㌀䔀䐀㘀㈀㜀䐀䈀　䘀㤀䄀㘀㤀㘀䐀㄀㘀㌀㘀䈀䈀㌀㄀　㈀㔀䌀䘀㤀䄀䔀䐀䘀䈀㘀䈀㤀㜀㄀䘀㄀䌀㔀䄀㤀㌀䄀䔀䌀䐀㠀㤀䔀䌀㌀䄀䈀䌀㜀䌀䔀　䌀䌀䌀䐀䘀㔀㈀䘀㘀　㜀䈀䔀䈀䔀㠀䈀㄀㌀㔀㔀㤀㔀㜀㐀㄀㌀㌀㘀㌀䘀㄀䔀　䌀䄀㐀㔀䘀䐀䌀䈀㜀㈀㘀㔀㜀㐀㄀㌀㌀䈀䈀　䄀䘀㤀㤀䄀㌀㤀㐀㌀㘀䄀䄀䌀㘀㤀㄀　䘀䈀㌀䌀㌀㄀㤀㠀㜀㜀㔀䈀　㔀䈀　㜀䄀㔀㈀㈀㔀㠀㐀䌀㄀㈀㜀㌀　㈀　䌀㔀䔀㈀㈀䄀㔀㌀㄀䄀䌀㜀㐀㘀㘀䄀䐀㄀㄀㐀㔀㌀䄀䌀䔀　㔀䐀㤀䌀䔀㜀　㘀䌀䌀　㄀㘀㔀䈀㜀㌀䔀䌀㌀䈀䐀㠀䄀㔀㔀㤀䌀䄀㔀䄀䈀㔀䌀㄀㠀㘀㠀㈀㠀䐀㐀㜀㄀㠀㄀㜀㜀㈀㔀䘀㜀䌀㔀䄀㈀㜀㘀䐀䐀䄀㜀䐀　㐀䈀㤀㜀　㜀㐀䄀㔀㘀䄀䘀䌀䌀㈀㌀㌀䈀㜀㠀䌀　䘀䈀㄀䘀㤀㜀䈀　㐀䔀㤀㠀䘀㐀䈀䐀䔀㈀䐀㘀㤀　㤀㈀㌀㄀䘀䘀䔀䘀䐀䈀㐀䐀　䌀䄀䘀㠀䌀　䘀㐀䔀　㈀䈀䔀䌀䌀䐀㈀䘀㈀㐀㄀㠀㜀㘀㄀㤀㌀㐀㄀㠀㈀㘀　㤀㤀㈀䄀㐀㌀䈀䄀䄀䄀㌀㌀䄀㔀㄀䔀㜀䐀㔀㘀㠀䘀㔀㠀㈀㤀㜀㜀䐀㐀㈀㘀㠀㜀㈀㠀㈀䈀䐀㠀㔀䈀䘀䈀　㘀䐀䘀㈀䘀䐀　㤀䔀䈀䘀䈀㄀㌀䌀㔀㐀㔀䔀㠀㐀䐀㌀㄀　㈀䘀䄀㐀䄀㄀㄀㠀　䈀㤀䘀㐀䐀㘀㤀䘀䘀䐀㘀䌀㜀㈀䔀㐀䔀㌀㠀䘀㔀㔀䔀㌀䄀㜀㌀䔀䘀䘀䔀䄀䄀㤀㔀㌀䔀㈀　㘀㌀㘀䔀䔀㠀㌀㈀㠀㘀䐀㤀䈀䐀㠀䘀㜀䌀㈀䌀㠀䘀䔀䘀　䌀䄀䌀䘀䈀㔀䘀　䈀㄀㄀䔀㤀䔀䐀㄀㤀䘀䌀㔀㜀㔀䄀㌀㈀㜀㔀䄀㠀䐀㔀㘀㘀㈀䈀㜀㔀䄀䔀䄀䈀㔀䐀䄀㐀䘀㜀㔀䄀　䐀㄀䔀㔀䔀㠀㜀㘀䔀䄀䌀㘀㜀㐀䌀䘀䔀㠀㔀㐀㌀䄀㔀䐀㄀㈀㘀㐀㐀㈀　㤀　㠀㜀䄀㠀㈀䌀㄀㄀䄀　㔀㠀㤀䔀㠀㄀䐀㌀㠀　　㌀㄀㘀䄀䄀㠀㈀㐀䔀䄀䐀㐀㔀㐀䄀㌀　㄀㌀㔀㄀㔀　㠀䌀㠀䈀䌀㐀㘀㠀䄀㔀㐀㔀㠀㄀㄀䄀㠀䌀㤀　㤀䘀㐀　㔀䌀㜀㠀㈀㔀㘀䘀㈀䔀㈀㄀㠀䘀䈀㐀㠀㈀㠀㘀䌀　䘀䄀㔀䔀　　㈀　䌀䈀㄀㘀㈀㜀　㐀䌀㜀䈀䘀䐀　㐀䘀　䔀㔀䔀㜀䘀㌀　㄀䔀㌀䈀㤀　䐀㜀䌀䄀　䐀䄀㄀㐀㌀䐀㌀䘀㤀㤀䘀㐀䐀㈀㐀䈀䘀㐀㐀㌀㈀　㤀㌀㌀㘀㜀䄀㜀䔀䐀㈀䄀㠀㄀䄀㤀䘀㔀䌀㐀㘀㐀䘀㐀䘀㈀䔀㐀㌀㠀㈀㘀䘀䈀䄀䈀㠀㐀㤀䔀䐀㐀㈀䈀㤀㐀䌀㈀㄀㠀㔀䔀㐀㘀䌀䘀㠀䈀㘀㜀䐀㠀㔀䐀　㔀䌀　　䌀䔀　㈀㌀㠀㌀　㄀㌀㘀䄀㘀㘀䈀㘀䌀䌀䄀㐀㌀㔀㜀㤀䐀　㤀䌀　䈀䌀䔀㔀䌀㔀　䔀㜀䌀㈀㄀䄀㌀䘀䄀㐀䘀䄀㐀㄀䔀㜀㠀㜀䐀䄀㈀䌀䐀㠀㤀㔀　㄀㜀䐀㄀㤀㔀　㤀㄀　㄀㠀㜀䈀䐀䐀　䔀㜀㠀㔀㤀䔀㌀㐀㘀㠀㐀䐀㠀㄀䌀㔀䌀㤀䔀　㜀㈀䐀㘀㌀㠀㘀㤀㤀㜀　㔀㜀䄀䐀㄀㤀㠀㠀䄀㜀　㠀　㠀　㌀㜀䐀㤀㤀㔀䔀䔀㐀䄀䌀䘀㐀䔀㈀㌀㈀㤀㄀䔀㠀䘀㈀㜀䔀㠀㐀䈀䌀㤀㜀㘀䈀㤀䔀䌀䐀㤀䌀㐀㘀㜀䘀㔀㐀㤀㌀䔀䌀㄀䔀㜀㈀䈀　䔀䈀㈀㘀䘀㠀㜀㔀䈀㌀㐀㄀㤀㄀䄀䄀䄀䌀㤀䘀㘀㄀䄀㠀㔀㜀㐀㠀䘀㌀㜀䌀䐀㠀䐀㈀㈀㤀䄀㤀㈀㐀䌀㈀㠀䔀䄀㤀㠀㔀　䔀㠀㠀㌀　㤀䔀䈀㘀㐀㐀㤀䌀㤀　㜀㄀㌀㌀䌀㠀䌀㔀㘀䔀㈀䔀㠀㄀㈀㔀㤀㤀䈀㔀䘀㌀䘀㌀㘀㌀㄀　㄀㈀㤀䔀㜀䄀䌀䔀䌀㈀䘀䈀䈀㄀䘀䘀䔀　䈀䘀䘀　㔀䘀㠀䐀㜀　䔀䈀㤀䔀䄀䘀㄀䄀㌀䔀　㠀䈀䔀㠀㌀㔀㘀䄀㈀　　䈀㐀䄀䌀䄀㠀㐀㤀　㘀䈀㐀䄀䐀䈀㌀㌀䌀䐀㈀䔀㘀䔀䘀䘀䌀䄀䘀㌀　䘀㐀㐀㈀㜀䌀䘀㜀㐀䘀㐀㠀䌀　㌀䈀䐀䄀䘀䔀䈀㤀㤀䘀䈀䄀䔀㘀䘀㈀䐀㄀䌀䔀㤀　㘀䐀㜀㈀䘀㈀㜀㜀䘀䈀䈀㌀䈀䘀㈀䐀㤀㈀䘀䔀䘀䄀䐀䄀䄀䄀㔀䌀䈀　䔀㌀䌀䐀㔀䐀㜀䘀䘀䔀䌀䐀㠀䈀㈀䈀䄀㤀䈀䌀䘀㤀㐀䄀䐀㄀䌀䘀䄀㄀䔀㤀㠀㐀䘀㌀䌀　㔀䐀㈀䘀㜀䈀㘀㄀㐀䈀㜀㄀䐀㜀㠀䘀㐀䐀㔀䄀㄀䐀㌀䐀㄀䘀㜀㌀䈀䄀㌀㈀䘀䌀　䌀䌀㘀㈀㐀㠀㜀䘀㘀㈀䔀㤀　䘀　䘀㄀䘀㜀㤀䘀䘀㔀㠀㐀㌀䘀䐀䈀㄀㐀䘀䘀䔀㘀㘀䔀䘀䘀㜀䔀䘀㔀䔀䌀㔀䐀䘀䐀䔀䘀䈀㠀㤀䘀　㈀㄀㜀䄀㈀㜀㐀䔀㤀㈀㐀㜀䘀䄀䌀㌀䘀㔀㘀㔀䈀㤀㌀㔀䈀㤀䈀㐀㈀䌀䈀㌀㈀㘀㤀㌀㤀㘀㜀䈀㘀䈀䈀䐀䈀㐀㌀䌀䄀㔀㌀㘀㠀㔀㘀㈀㔀　䐀䐀㘀䄀䔀䔀㌀㄀䐀㌀㔀㘀㘀䐀㠀䘀㤀㘀䄀㘀䄀㔀㌀㤀　㌀䔀　㜀　䌀㠀䌀䘀　㜀㐀㄀㌀　䔀　㤀㜀㔀䘀䐀㘀䈀㐀䐀㄀㈀　㄀䄀㤀䌀㘀䄀䌀㤀㤀㌀㘀㐀䐀㔀㈀㐀㜀䈀　㐀䈀㔀㠀㄀䘀㤀䄀㔀䌀䌀䐀䌀䔀㄀䘀䘀䐀㠀㔀㘀　㌀㜀㌀㌀䈀㐀㌀㔀㌀㠀㄀㠀㈀　䘀㔀㜀　䐀㜀㌀㌀䔀㘀㐀　䈀㄀㜀㈀䄀㜀㄀㠀㔀㐀䄀㐀㌀㄀　　䘀䔀㤀㘀㐀䐀㐀㠀㔀　䘀㄀䘀㄀㄀㠀䈀䔀䘀䔀䌀㠀㤀㜀䌀㘀䐀㘀㜀㔀㔀䐀㔀䔀㠀䐀㜀㈀㈀䌀䘀㜀㜀㠀䄀䄀㜀䄀㌀　䈀䔀㜀㜀㐀㈀䘀䌀䘀䌀䘀䄀䔀䐀䈀䈀䄀䄀㐀䄀㘀䄀䘀㈀㘀䄀䈀㜀　㘀㔀䔀䘀䐀㠀䌀䄀㤀㔀䐀㜀䐀䌀䘀㔀䘀䄀㤀䔀䈀䐀㘀䘀㄀䔀㘀䐀䈀㠀㘀㌀䐀㜀㠀㔀䔀㘀䄀㈀䘀㘀䈀䈀㌀䄀㌀㘀䘀䔀䌀䐀䔀　䘀䌀㜀㤀䘀䐀㜀㜀䄀䘀䔀䐀䈀䄀㌀㜀㄀㈀㘀㈀㔀㘀䘀䐀㘀　䈀㐀　㜀䔀㘀䌀䈀㘀䘀㔀㐀㈀㌀㔀㤀㘀㄀㠀㜀㐀㠀　㌀㘀䄀㜀㘀㜀䌀㈀　䘀㄀　㜀䔀䐀　㐀䈀㌀㐀㘀䌀㔀㘀䔀㐀　䘀䄀䔀　　䐀　㘀䔀㤀䌀㐀㈀㐀㔀䈀㔀㤀㈀㠀䄀㌀䔀䌀㐀㄀㠀㐀㠀㌀䄀㜀㐀䘀㤀䘀㠀䔀䘀㘀䄀㠀㤀䔀䘀䘀䔀㌀㈀㈀䘀㔀㠀㄀䐀㜀㤀㔀䘀㜀㄀䌀㜀䌀䌀㘀䐀㜀㔀㌀㘀䈀䈀㠀㔀㠀㔀䔀㐀㐀䘀䌀㜀䔀㘀㔀䈀䐀㐀䔀㐀㌀㠀㤀㔀䔀㄀䘀㘀　㤀䘀㌀㠀　㄀㌀䐀　䐀䈀　䐀㜀㠀㤀㔀㄀㤀㄀䈀䐀㜀㤀㔀䄀㐀㌀㐀㄀䄀䈀㔀㌀䄀㌀㠀㌀㐀䐀㐀　㈀䘀㈀䈀䌀㜀㄀㜀䐀㤀㠀䈀䘀㐀　䈀䐀䈀㜀　㄀㤀䘀㌀䌀㔀䌀㄀㄀㘀㠀䈀㌀㔀㘀㔀　㈀䐀㜀　䔀㔀䈀㈀㘀㈀䌀䘀㠀㔀㌀㤀㘀㐀㠀　㠀㠀㐀䌀䘀䐀䔀㠀䘀㐀䄀䄀㜀㐀䘀䌀㌀䘀㌀㘀㜀䄀㌀㄀㔀㌀㐀㘀䐀䘀㈀䔀㜀䄀㠀㐀㐀㐀㘀䔀㄀䐀㌀䄀㠀㤀㄀䄀䐀䔀䌀㠀㌀㄀㜀㜀䘀㐀䘀䘀㔀䔀䌀䈀䈀㔀㄀㘀㐀㐀㘀䐀㠀䄀䐀䐀㌀䐀䄀　㌀㘀㄀㄀䈀㄀　㤀䈀㘀㐀䘀䈀䌀㠀䘀㘀㔀䈀㤀䈀㘀㠀䈀㌀㄀㌀䄀䐀䌀䄀䄀㌀㌀㌀㄀䄀㔀　㔀㘀䌀䘀㤀㔀㌀　䄀䌀䈀㘀㐀䘀䈀䔀㔀㤀䌀㈀䈀㘀㠀䔀䘀㤀䄀㜀㌀㠀䌀䈀㔀䌀　䄀䐀㤀㘀䐀㈀㄀䄀㐀㠀䄀㈀㌀㈀䘀㈀䈀㈀㤀㌀㜀㌀㤀㈀㔀㜀㜀㤀㄀㘀㜀㘀㌀䄀㐀㔀　㜀㌀㄀䄀㘀㘀䔀㘀㤀㐀㘀㜀䐀㤀㔀㐀䌀㈀㐀㤀䄀䐀䈀㘀䈀㠀㜀㤀㘀㜀㠀䐀䌀㠀䘀㜀㤀䈀㄀䄀䄀㈀䄀䈀䌀㔀䐀㌀㈀㠀㈀㌀㜀䔀㔀㈀㐀䔀㌀䄀䌀㈀㤀㔀㘀㔀㘀㔀㌀㔀㘀㔀䈀㐀䄀䌀䈀㠀䄀㘀㤀㠀㤀㘀䌀䘀䄀䌀㤀䐀㐀㤀䐀㜀㄀㠀㜀䄀　䐀䈀㐀㠀䈀㐀㈀㄀㌀㠀㔀㌀㐀㠀䘀㈀㌀䔀　㤀䘀㌀㄀㈀㌀䌀㤀䔀䘀㤀䘀㌀㌀䌀䈀㤀䘀䄀㄀䄀䐀䐀㐀㔀㈀㈀䐀䄀䔀㄀䌀㐀䘀㠀㘀䌀㔀䄀䔀㈀䔀䘀㐀㔀䄀㐀䐀㤀䄀㠀　㄀㜀　㐀　䔀㄀㔀䘀䈀㔀䘀䌀㤀　㌀㐀㤀㈀䔀㄀䈀㄀㌀㈀㠀㄀䈀㤀㌀䄀䘀䌀㜀䔀䐀㐀㐀㈀　㈀䈀㐀㄀㈀䔀㤀㈀㤀㤀㘀　䌀㠀䐀䄀㌀㘀　䔀㜀㤀䔀　㜀㈀㌀㤀　㤀㠀㤀䈀䐀㠀䘀㘀䔀㜀䔀䘀㐀䈀䄀䐀䄀　㔀䄀㌀　䘀䘀㜀㜀㐀㜀䘀㈀㔀䄀㐀䘀䄀㌀䈀㠀㘀㤀㜀㌀䘀㌀䘀㠀㘀㔀㘀䘀㐀䐀㌀䌀䄀䐀䔀䄀㔀㌀㌀㠀㈀　䐀䘀䐀䔀㄀䄀䄀㤀䔀䘀䄀䐀䌀㠀㈀㄀㔀㜀䐀㠀㌀䈀㜀䄀䌀䈀㠀䔀䈀䔀䐀㄀䈀䐀㄀㐀　㔀䔀㜀㌀䌀䐀䌀䄀㠀㌀㤀䘀䘀㜀㘀㐀㤀㜀㘀㔀䐀㤀䐀㐀㈀㜀䈀㔀䔀䄀㈀㈀㐀㐀䘀㤀䄀㜀䄀㄀䌀㠀䐀䐀㄀䐀䔀䈀䔀䔀㄀䈀䄀䌀㈀䌀䐀䈀㜀㈀䄀㈀䄀䈀䘀㌀䔀䔀㐀㠀　㤀䄀㌀䈀㜀㄀㤀䌀㤀㔀　䄀㤀㤀䄀㠀㤀㄀䄀㌀䄀㌀㌀㘀䌀㌀㔀䔀㠀䈀㔀　㄀㤀㔀㐀㠀　䐀㌀㐀䄀㠀㔀㘀㘀㤀䐀㔀㔀䌀䐀㈀㈀㜀䐀䔀㘀　䄀䄀䘀㤀㠀䐀　㤀　䌀䔀㈀䔀㔀　　䈀䔀㤀㐀㤀䐀㘀㄀㠀㜀㤀䌀㔀㤀㜀　䔀㌀㤀㌀㈀䘀䈀䔀䘀㠀䔀㐀䈀㜀䈀䘀㈀䐀㄀䌀㌀䘀　䌀䐀䄀䔀㠀㘀㜀㠀㜀䐀㤀㔀㌀䄀㔀䐀㄀㐀㘀䔀㄀䔀㜀㄀㠀䈀㤀　㔀䌀㤀䈀㈀䘀　䌀䌀　㌀㤀㤀䐀　㘀㜀䐀㤀㘀䐀䄀㄀㘀䈀㈀䌀㤀　㤀㐀㐀㐀　㈀㜀㤀㜀㤀㤀䔀㤀㤀　㘀䈀䘀㔀䔀㤀䘀㠀㄀　㄀䈀䐀䔀㐀䄀㄀㤀䔀㄀㤀㔀䔀䈀㔀㐀㄀䔀䘀䘀㜀㌀㠀㔀䌀㜀䄀㤀㌀㐀㜀㘀㔀㘀㄀䘀䔀　䐀㜀㌀䔀䈀㈀䈀㈀㜀㄀㈀㈀㈀㤀䘀䐀㠀㤀䄀　䄀䌀㐀䘀㘀䔀䔀㔀䌀䘀㈀㈀䔀㐀㤀㜀䌀㜀㔀䐀㤀㐀㈀　㤀䈀㘀㐀䄀䘀㠀㜀㤀䌀㤀䐀㘀㔀㌀㜀䈀㤀䄀䈀䘀㌀䌀㔀㠀䘀㤀㠀㐀䘀䐀㤀䐀䄀䄀䐀䔀䘀䄀㔀䌀㜀㄀䌀㄀䈀䐀㜀䐀䈀䐀䈀㜀䄀䔀䌀䔀㌀䌀㘀䐀㤀䄀䐀㤀䈀㈀㜀㐀䐀㤀㤀㘀䔀䄀㠀䌀䐀㌀䔀䔀䌀䐀　䘀䔀䘀㔀䄀㄀䌀㘀㠀䈀䌀䄀㤀㈀䐀䔀䐀㄀㄀䐀䘀䐀㈀㌀䐀㘀䈀䈀䔀䈀㈀㘀䔀䐀䐀䄀㈀䔀㄀㄀㌀㘀䈀䔀㤀䔀㠀䔀㐀㌀䈀䄀䐀㌀㜀䄀䔀䌀䔀㈀䈀㘀䔀㄀䈀㘀䈀䄀㈀䔀䔀䐀㠀㈀䔀㘀㐀㌀䄀䌀䄀䄀　㄀㜀䈀䐀䔀㔀䔀㄀䘀　䈀㈀䄀㘀㘀㈀䔀　㌀㈀䈀㄀㈀㘀　㜀䐀㘀䘀䄀䄀　䐀㜀　㤀㤀䐀㌀㘀䔀㠀㌀㘀䌀㈀䄀㠀㘀㄀䈀䘀㠀㄀㜀㘀㄀䄀㘀　䄀㜀㜀䄀㐀䌀㐀䐀䐀㔀　㔀䈀䈀䈀䐀㠀㜀䈀䌀㜀㐀　䐀䈀䄀㜀㐀䌀㌀㠀㐀㤀㠀㠀㜀㠀䘀䘀䄀䌀㄀䔀䘀㤀䘀㔀㔀㌀　㈀䌀㘀㄀㐀䌀㤀㌀䔀㜀㔀㔀䄀㌀㤀㜀㤀䌀䔀㄀䈀㔀㘀㌀䌀　㐀㜀㈀䄀㤀㔀㄀　㈀㘀䈀䔀㐀䐀㠀㤀䔀䄀㤀㔀㘀䐀䈀㈀㈀㔀㌀䄀㜀㄀䌀　㌀㘀䐀　㘀㘀䌀䘀　䔀㔀䐀䈀㘀㘀䘀㔀㤀㔀㘀㈀㘀㔀䌀㈀䔀㄀䐀䐀䈀　䘀㜀㔀䐀䐀䐀䄀㔀㘀㘀㄀㈀䘀䈀㠀䈀㜀㜀㌀䐀㌀㠀㤀㠀㄀㜀㤀㔀㔀䈀䈀䘀䘀㘀㄀䔀䈀䔀㠀㌀㌀㔀䘀㔀䄀㌀㠀㜀䈀䔀㠀㄀䈀䐀㜀䄀䐀䄀䘀㔀䈀䐀　䈀䈀㌀䌀㌀䘀䈀䘀䄀㄀㜀㜀䘀䔀䄀㈀㠀㄀㄀㔀䌀㄀㠀㈀㤀㔀㔀䈀㔀㔀䔀㌀㐀㜀䘀䄀㠀䔀䔀䘀㘀䌀㈀䘀㈀㤀㔀㠀䈀㠀㜀　䔀㜀䌀㌀㤀䐀㔀䐀䐀䘀䈀㠀䈀㄀㜀䔀䔀㤀㘀䐀䄀䘀䐀䐀㄀　㜀㤀䔀㤀䘀㔀䘀㜀㘀䘀䐀㠀䘀㐀䌀㜀㄀㜀　䈀㤀䈀㜀㜀㈀䘀㔀䐀㌀㄀䈀㈀㌀䌀㤀　䈀㜀㘀䌀䐀䈀㤀㈀䐀䄀䔀䈀䐀㜀䌀䐀㘀㈀㔀㐀䌀　　㠀㈀㌀㄀䐀㘀䐀㤀㔀㠀㐀㔀䔀䐀㐀䘀㘀㜀　䐀䐀䐀䄀㄀　㔀㐀㠀㐀䔀䄀㐀㈀䌀䌀㠀㔀䔀䄀㜀㈀㐀㄀㤀䘀㄀䐀㜀䄀䌀䌀䈀　䌀㜀㜀㐀䐀㠀㐀㐀䘀䈀㐀䐀㜀　　䈀䌀㘀䈀㌀㈀㐀㜀㔀䘀㠀㘀㠀㄀㄀㄀㐀㄀㔀㔀㤀㘀㜀㜀㜀㐀䈀䐀　㈀㐀㐀㄀䈀㘀　㐀㄀㈀㤀㈀㈀㈀㜀䈀㔀㠀䈀㈀㠀㈀㌀㔀䔀㠀㘀㔀䄀䘀㌀　䘀㌀㜀㤀㤀䐀㈀䄀㈀䔀㔀㐀㔀㌀㈀㐀　㠀㌀㄀䔀䌀䐀䈀䔀㐀㌀㠀䘀㜀㄀㈀㈀㈀䘀㠀䌀䄀㄀㘀䄀㠀䌀䄀㄀㈀䈀㔀䄀㠀䈀㈀䈀㔀䄀㠀䈀㄀㈀䈀䈀㠀䌀㜀㌀㘀䌀䌀㈀　㘀㌀䄀䌀䈀䄀䄀㜀䄀㄀㘀㈀㐀㘀㠀㘀䄀㤀䔀㠀㤀䔀䌀䔀䘀㘀㄀㌀㠀㌀䘀㌀㄀㘀䔀䐀㜀㤀㘀㈀䔀䈀䔀㠀㔀㌀䐀㜀㠀㔀　䈀䘀䈀㄀䔀䈀䘀㘀䔀㜀䐀䔀㤀㠀㈀䐀䔀㘀㔀䌀㄀䐀䌀䈀䄀䌀㠀㠀㈀㐀㔀㐀㌀䄀䈀　䄀　䈀㔀㘀　䔀䐀䔀㔀㘀㌀㌀䈀㈀㜀㄀䌀㔀㤀㈀㈀䄀㔀䘀䐀㄀䄀㈀㐀㔀䐀㜀㌀䔀㄀䌀㠀㤀㌀䌀㜀㄀㔀㌀䘀䐀䐀㈀㠀㌀㈀䘀㔀䐀㄀䈀䘀㤀䌀㜀㜀䘀䘀䔀䘀㤀䐀䔀　䐀䄀䄀䌀䄀䌀㈀㈀㘀㤀㤀　䄀䈀㤀䌀䈀　㘀㘀䈀㘀䈀䄀䘀㐀㌀㈀䄀䘀䌀䐀㜀㜀㤀㌀　䘀䘀㠀䐀㜀䄀　䔀䄀㌀㐀㄀䔀㔀䌀䐀㤀䈀㘀㠀　䐀㤀㘀䘀㄀㘀㠀㄀　䘀䘀㠀㤀䐀䈀䌀㔀䔀䐀㘀㠀㌀㔀㤀䌀䔀㐀㔀㐀㜀㠀㠀㌀䌀㔀㘀䌀䐀㜀㌀䈀㤀䌀㠀㈀㘀㠀㄀㜀䌀䈀䐀㔀䌀㜀㔀　㤀㠀㌀㄀㄀㌀㔀　䄀㤀㄀䐀㈀䄀㜀㔀㤀䐀　䄀䌀䄀㔀㔀䄀　㔀㄀㠀㄀㐀䄀㘀㔀䔀䘀䈀㈀㐀㌀㠀䔀䈀䐀䌀㔀㐀䔀䔀䐀㔀㐀䄀䈀䐀㌀㘀䈀㐀　　䘀　㄀䄀㈀㜀㄀䔀　　㠀㘀㐀䈀㜀㤀䔀䐀䐀䔀㈀䄀㔀䄀㜀㌀㤀㜀䄀䐀　䔀㤀䐀䐀䔀㠀㠀㐀㔀㄀䌀㄀䄀㌀㜀㔀䐀䄀䘀㔀㜀䄀䈀䈀㄀㌀䌀㌀㌀㠀䈀㔀　㘀㐀㌀䘀㜀䐀㌀㈀䄀㔀㄀䈀㄀㄀㌀㄀㌀䄀㠀㔀㄀䔀㐀　䐀㌀㜀㌀㐀㐀㠀䔀　㈀䔀㘀㐀䈀䌀㐀㘀㤀㜀㘀䄀㐀䌀䈀㤀㐀㜀㐀䄀㠀㔀㐀䔀　㘀　㘀㌀㔀㌀㘀䔀䔀㘀㔀䈀㔀䘀㄀㔀䄀㘀㠀䈀㌀䄀㈀䌀䈀㘀㄀㤀䔀䈀　㈀㔀　㄀䐀䈀　㔀䘀㄀㘀㔀　㤀㌀䔀㈀㄀　䈀㐀㈀㜀㘀䄀㄀㐀　䌀㠀㐀㄀䔀䘀㔀㐀㈀㌀㠀㠀䐀䈀䐀䘀䈀㠀㌀䔀㘀䄀㄀䐀㜀㤀㄀㤀㔀䔀㜀䔀䈀㌀㘀㄀㤀䈀䐀㤀㘀㄀㌀㔀䄀䄀㐀㔀㤀㔀䌀㄀㘀㐀㌀㜀　䘀䌀　㤀㈀䔀㠀䈀㠀䈀㠀㜀䐀㜀㈀　㐀㠀䐀㜀㤀㘀㤀㜀　㐀㘀䄀䄀㈀㜀㌀㠀䈀㌀㌀㐀㌀䈀䘀䄀㈀㌀䈀㘀䐀䈀㜀㌀　䌀䘀㄀　䘀㈀㈀䘀䔀　䔀䔀㈀㈀㌀　㔀㘀㐀㔀䐀䈀㠀㠀㠀㄀㐀㔀㠀䘀䐀㘀㤀㈀䄀㜀䘀䄀䔀㤀㐀　㘀㈀㐀䐀㜀㤀䄀㐀䈀䐀㌀㜀㈀䐀㌀㜀㈀　䐀㐀㔀䌀䔀㠀㈀　　㌀㄀㐀㠀　㘀㘀䄀㈀　䌀䔀䔀　䈀㘀㤀㤀㜀　㜀㐀䔀㘀䌀㤀㤀㤀㜀㐀䔀㘀䌀䌀㐀䌀㔀䘀䐀　㜀㠀㐀㘀㤀㠀䘀㄀䌀䐀䌀䌀䄀　㐀㄀㄀䘀　䈀䌀䌀䐀䄀䈀㘀䈀㌀䈀㌀䄀㘀㌀㘀䘀㐀㄀㘀㤀㌀䘀㠀䄀䔀㜀　㄀䈀㜀䘀㄀㤀㄀㈀㜀䈀㄀䈀䄀㘀䈀㈀䌀䐀䔀䈀㘀㌀䐀䘀㜀㘀㘀㜀䈀㤀㐀　㜀䌀䄀㜀㌀㜀　䈀䄀䈀㤀㐀䄀䌀㐀䘀㈀㠀㤀䈀䈀䘀㜀䔀䈀䔀㌀㜀䈀䌀䔀㌀䔀㄀㤀䔀㘀㠀　㤀㜀䌀䔀䘀䐀㔀㔀㜀㔀䐀㠀㔀㐀䈀㈀㘀䘀䘀䔀䐀䐀䌀䄀䌀䘀㔀㠀䈀㜀㌀㜀㈀㄀㘀䄀䔀　㤀㤀䐀㠀㜀䄀㐀䔀㔀㔀䐀䘀㌀䐀䐀㘀㤀　䈀䈀㜀㔀䔀㜀㌀㤀㄀䐀　㐀䐀䐀㘀䘀㈀䘀䄀䔀㘀㠀㈀㤀㘀䔀䈀㔀㜀㘀㘀㠀䈀䐀䈀䌀㜀㠀䔀㘀㘀䐀㔀㈀䔀䄀䌀㈀㠀㌀　䘀䈀㄀㜀㄀㐀㄀㔀㔀㔀㜀㠀䈀㔀㄀㜀䐀䔀㐀䄀㈀䈀　䌀㘀㜀䔀㜀㔀㐀㄀㔀䘀　㈀㜀　㜀䐀㜀㔀䘀䘀䌀䈀㔀㜀㠀㌀䐀　䄀㠀　㤀䘀㔀䌀㄀䈀䄀䔀㔀㤀㤀䄀　㤀㘀㔀㄀㤀㔀　䔀㘀㠀㘀㜀䄀㄀㌀䐀㐀㘀䄀㘀㄀㠀䐀　㘀䔀䄀㌀㔀䐀　㈀㐀㐀　　䈀䐀䄀㜀㘀䈀䘀䐀㌀㐀㤀䘀䌀㐀㜀䘀䐀㈀㜀䘀䐀㐀䘀䘀㠀㠀㔀㘀㈀㌀䘀㄀　䈀䘀䐀㔀㈀䘀䘀㤀　㔀䈀䘀㌀䘀䐀䈀䔀㌀䌀䘀䐀　　㌀㠀䄀　㘀䘀㄀㌀䈀㌀㄀䘀㤀㔀䌀㄀䔀　䈀䐀䈀　㄀䘀㜀㜀㤀㔀㐀㠀㘀䄀㤀㄀䐀㜀　䘀㤀㠀　㔀㈀䐀㘀㘀㘀㘀䐀㤀㜀䔀䘀㈀　䌀㈀㔀㐀䄀㠀䌀䘀㠀㌀㈀㄀㐀䐀㜀㘀㔀㘀㜀䌀䘀䐀䌀䔀㈀䔀㄀㌀䄀䘀㐀䘀㘀䐀䘀䐀䐀㈀䐀㜀㈀㈀㘀㌀㘀䘀㄀䔀䄀䔀㘀㤀䈀䄀䘀䈀䄀䐀㌀䐀㤀䐀䘀㜀　䐀㌀㔀䄀㐀㌀䌀㔀䐀䘀㌀䐀㄀䐀䄀㠀㌀䔀䈀㌀㄀䈀㈀䐀䐀䈀㜀㘀㈀䐀䘀䐀䘀㐀㤀㌀　䐀㠀㜀䄀㜀䈀㘀㐀㜀㘀䐀㌀㠀㤀㄀䘀㠀䘀㄀䐀㌀䄀㜀䈀䐀㜀䘀㈀䄀㈀䐀㘀㌀䐀㐀䈀㜀䐀䔀䘀䌀䔀䐀㤀䘀䄀㌀㜀㄀䐀㈀㌀　䘀䘀㜀䌀䘀㌀䄀䈀䌀㄀㜀㈀㔀㤀㤀㜀㄀䘀㈀㈀　㜀㈀㔀㈀㠀䈀㤀㈀㌀䌀㈀㜀㤀䌀㔀㤀㘀䔀㠀㐀㘀䄀㌀㔀㈀䌀䄀㈀㈀　䘀䄀䄀䐀㄀㘀䌀㤀㐀㈀㈀䐀㄀㘀㤀㜀㌀㌀㐀　䈀㐀㄀㈀䐀䄀㘀䈀㜀䐀㔀　䄀䈀㜀㜀　㘀　㤀㜀㈀䔀䔀㈀䄀䔀㜀㐀㐀㜀㘀㤀䘀䌀㐀㌀㜀㌀㘀㜀䐀㘀㔀㔀㌀䔀䌀㌀㤀　㘀䄀㜀㌀　㘀　䘀　㐀㔀㌀䘀㠀㤀䘀䔀㈀㈀㄀䄀㄀䔀㌀䘀䐀䘀䘀㜀䔀㔀　䐀䌀㄀㤀㈀䌀䔀䄀䘀㜀㐀㤀䌀㄀㌀䈀㜀㐀㜀㜀䘀㄀㤀䘀䐀㔀㤀䘀㐀䄀㜀䐀㄀　䘀䘀䔀㌀㘀䐀㐀㜀㌀㜀䘀䘀䘀䌀　䈀㄀　䐀㜀㤀㠀䌀䐀䄀　䌀㤀㈀㈀䌀㠀㐀䌀㐀㐀　㤀㘀㠀㜀㜀㌀䈀㐀㔀䄀㠀㌀㈀㠀㠀㘀　䐀㔀　㘀䌀　　㘀㈀䈀　䄀㈀　䌀　㤀　㘀　㌀㤀㠀䐀㐀䈀䄀　　　㄀　㤀䐀䐀㐀䈀㐀䐀㔀　䄀㜀　㌀㔀㔀㤀　㌀㈀㌀㄀䐀㈀　㜀㈀㄀㈀䔀㐀㘀䔀㜀㘀㈀㌀㈀䌀㐀㐀㠀㄀㤀㐀㈀䐀㈀䄀㈀　㔀䌀㐀㌀㠀㤀㐀㜀䐀䈀䄀㤀䄀䘀䘀㠀㠀㔀㤀㄀㜀㐀㘀㠀㔀　㄀　䌀㈀㜀䌀㘀㈀㘀㜀㜀䐀㄀䈀㜀䌀㔀䔀䐀㈀㜀䄀㌀䄀䘀㤀䐀㠀䌀㌀䔀䄀㠀䌀䌀㈀䔀䈀䌀㠀䌀䈀㌀䔀䈀㌀　䔀䔀㐀㌀㈀㌀䌀㘀㌀䔀䌀㐀㈀䐀㄀䄀䄀㠀㈀䄀䌀　㤀䔀䄀㘀䄀㔀㄀䄀㄀䄀㄀㐀㐀㔀㌀㔀　㐀䐀㤀㔀䔀䘀䐀㌀㜀䐀㐀㌀㄀　䐀䄀䌀㐀䌀㄀㘀㘀㈀　䔀㈀䌀䈀䈀　㜀㠀㔀㐀䘀㠀㄀㐀㈀㈀㤀䈀䌀㌀䌀㜀㤀㠀㐀䄀㘀㐀䘀䘀䔀㜀㐀㔀䌀　㠀　䄀㘀䘀㐀㜀㔀䘀㌀㤀㄀㤀䐀㔀䔀㈀䈀㠀䈀㈀㌀㐀㤀䐀㐀㄀㘀㤀䘀㈀䄀㄀㌀㐀䐀㔀㄀䐀㜀　㐀㌀䌀　　䐀㘀㌀㈀㤀㤀　㘀䐀㌀䘀㘀　䄀㜀䈀㜀㔀㠀㈀㄀㘀㈀㠀㈀㔀㔀㈀㘀㈀㠀䐀㜀䐀㜀䔀䄀㘀㤀㤀䐀　㠀㜀㌀㐀㔀㄀㠀　㔀䌀㠀䌀㠀㐀㠀㐀䔀㌀㜀䘀䈀㈀䐀㄀㘀㔀䘀㠀　䄀㐀㐀䈀䔀㤀䔀㄀䘀㐀㤀㌀䔀㤀㘀㈀㜀䄀㜀㈀　　㈀㌀㄀　㠀䐀䐀㤀䔀㈀　䐀䘀䄀㜀䌀㘀㤀㌀㘀　䘀㈀䔀䄀㐀䔀　㤀㌀㘀㤀㄀䔀㐀䄀　䄀㄀㌀㌀㜀㌀㠀䌀䔀㐀䐀㌀㤀　㄀㤀㜀㐀㐀䐀㠀　㄀䈀㔀㈀䘀㈀㘀㐀䌀㤀㈀㔀䐀㤀㌀䔀䐀㠀䈀㠀䈀㄀㈀㌀䈀㤀䐀䘀㜀㠀㤀㘀㜀㜀䔀㄀㄀䘀䐀䔀㔀䐀㠀㠀㜀㈀㜀㔀䈀㄀䈀䔀䘀䘀䈀䌀㤀㔀㄀䈀㠀䈀䈀䘀㤀㤀㄀䄀䄀䔀㠀㄀䘀㈀㈀䘀㜀㜀㘀㠀㔀䌀䄀㜀䈀䔀䔀䐀䔀㌀㠀㜀䔀㌀䌀䘀䄀㄀　㌀㔀㄀䔀㜀䘀㜀䌀䐀㔀䈀䐀㘀㜀㘀䘀䈀䔀䔀㤀䈀䐀㄀㌀㈀䐀䐀㄀㘀䘀䘀㤀䐀䘀㔀䌀䈀　䘀䐀㘀䘀㌀㜀䘀㘀㌀䌀㌀　㔀　㄀㄀㄀㤀㠀䘀㔀㄀㔀　㘀䌀䔀㔀䘀䌀㈀䈀　䄀㈀㜀㄀㤀　㈀㌀䄀㐀䄀㔀㔀㈀㘀䄀䐀㄀　㔀　㘀㤀㠀㌀㤀㐀㠀䄀㜀䄀　䐀㌀䈀䔀㘀　　㤀㄀䔀㤀䈀　䌀䄀㠀㤀㈀㐀㐀䔀㌀䌀㤀㤀㔀㄀㄀㌀䘀㈀䔀㄀㤀䔀㠀䘀㌀䈀䈀㜀㌀䔀㔀䈀㐀㠀㘀䌀㌀䐀㌀㌀䘀㤀䔀㐀䘀㠀㌀㠀㘀䐀㌀㠀㐀㌀䘀㔀㤀㌀㤀䘀䄀㈀䄀䌀㔀㐀䌀　㈀䈀䘀㈀䔀㠀䐀　㠀㠀䄀㌀　䈀㈀㐀㌀㔀䄀䌀㄀㌀㔀　　䌀䘀䔀　㤀䌀㔀㐀　䔀　㐀㜀㠀㔀㠀䌀㄀䘀䌀　　㔀㤀㄀㜀䐀㜀䈀　㜀㄀䄀䌀㜀䌀㜀㌀㤀䈀䐀䘀㌀㈀䔀䘀䔀㤀䄀䘀䔀㄀㐀㜀㌀㐀㤀㈀㐀㌀㜀㘀䌀㈀䌀㔀㜀㐀㌀㔀㈀䌀　㘀䄀㜀㔀䔀㠀䘀䌀䐀䄀㈀㐀䈀䌀䔀㠀㈀㤀䄀䐀䌀䔀䌀　㄀㜀㈀㄀㤀䄀㠀㔀㐀䄀㌀㤀㜀䔀㘀㜀㜀㈀　䌀䐀䌀㔀䈀䌀㠀㈀䔀㈀䐀㐀䈀㔀㘀㤀䌀㈀㈀䘀䄀䐀㌀䄀㈀䘀㔀䘀䈀㔀㘀㌀䐀䘀䄀䘀㔀䌀㜀㠀㐀㐀㜀䔀㜀㔀㐀㘀㜀䔀㤀䌀㘀䄀㄀䄀䘀䔀㜀㠀䔀䈀㔀㜀㤀䐀䘀䘀㤀䈀䄀䘀䐀䘀䘀　㐀䌀㈀㐀䐀㐀㔀䘀㐀㠀䘀㌀㄀䈀䌀䘀㜀㜀㌀䈀䌀㜀㜀㠀㜀䔀㜀㘀㠀　䌀㘀　䐀　　䈀　㠀㄀䄀㈀䄀㌀䔀　㜀㈀㄀䄀㠀䘀䄀䘀㐀　㈀䔀䄀㜀㌀㐀㈀䘀㐀㔀䄀㤀䐀㈀䔀䄀　㄀㜀㄀䌀㜀䄀　㄀㜀䐀㄀㤀䈀䐀䌀㐀㐀㈀㘀䐀㐀㘀㄀䐀䄀㈀㤀㈀㔀㐀㔀㐀㈀㔀　　䄀㜀䌀䘀㌀㜀㘀㌀㐀䄀䈀䔀㜀㈀䌀㈀㔀㘀㌀㄀㈀㔀㔀䌀㌀䌀㄀䌀㘀　㘀䘀䘀㤀㐀㐀䐀䘀㌀䘀䄀㔀㌀　䄀㤀　㈀㐀㌀㐀㠀䘀㌀㠀㐀㌀㠀㌀㄀䄀㘀㐀䄀䈀㄀㈀䄀䈀㄀　㄀㘀　䌀䌀　㐀㤀䄀㔀㠀㜀㠀㈀　䔀䔀㌀䘀㄀㜀䔀䐀㌀䄀㜀㔀䔀㘀　䌀㤀䐀䘀㤀䘀䈀㘀㠀㌀㈀㐀䐀䈀䈀㌀䈀䈀䄀　㜀㤀㔀䘀㠀䔀䈀㜀㐀㔀㘀䐀㐀䄀䈀䌀㠀㌀㤀㔀䈀䔀䘀㈀䄀㤀㈀㄀㜀䈀㘀䌀㤀䈀㌀䄀䈀㌀㐀䄀㈀䈀㈀䄀䌀　㐀　䔀㠀㐀䈀㈀㤀䔀㄀㠀㐀㤀䐀㤀䘀䌀㜀䌀　㔀㈀㄀㘀䈀㠀㐀㠀㌀㤀㌀㤀㘀㜀㄀㔀䄀㈀㘀㘀䔀䈀䘀㔀　㈀㠀㠀䘀䄀㌀㈀䄀䌀㐀㜀㄀㤀䌀䔀㐀㠀㄀䘀　䘀䄀㘀㌀　䔀䐀㠀䔀㔀㠀　㔀㘀　㜀䐀㐀㌀㤀䌀　㤀㄀㤀㐀㄀㐀㄀　　㔀㠀㜀㈀㠀㈀㐀㠀㤀㘀㌀㠀㘀㜀䈀　䌀㜀㐀㠀㜀　㄀䈀䄀　䐀䐀　㘀䌀㠀　䌀㔀㐀㠀㄀䄀㤀㌀㐀㤀䈀㘀㠀䈀㈀㘀䐀㔀㈀㄀㄀㔀䔀䌀㐀㈀䔀㌀㘀㠀䄀㤀䈀㔀䐀　㔀㄀㈀㐀㄀䘀㄀㔀䄀䐀㄀㘀㤀㔀䄀㠀㄀㄀㤀䌀　㄀㐀䄀㔀䐀㘀䄀㐀䐀㠀　㌀䐀䈀㔀㐀䌀㜀㔀㠀㈀㠀㌀䈀䐀㘀䄀㘀㐀　㘀㔀䄀㌀䘀䐀　㈀䄀䐀㘀㈀䘀㌀㐀㈀㄀㄀䘀䈀㜀㜀　䘀䘀㤀㘀㌀䐀䈀㈀㠀㔀䘀䘀䄀䌀䘀㄀㠀　䄀㤀㈀䐀㔀䔀㐀䌀㠀㤀㤀㜀㘀㔀䈀㜀㄀䈀㈀㌀㘀㠀㜀䔀㜀䄀　㘀䌀㤀㄀㠀㌀㘀䌀䌀㘀㘀㌀㜀㜀䌀䄀䈀　䄀㐀䘀䄀㤀䄀㌀㠀䘀㄀䘀㠀䔀㤀䔀㄀㈀㐀䘀　㄀㐀䄀㠀㜀㈀㌀㐀䐀㐀䈀　䐀㔀䔀㄀㜀䈀㠀䌀䘀　㤀㠀㜀㔀㄀㐀㤀㤀䌀䈀㠀䐀　㠀㤀㔀㐀㐀䈀㤀䔀䈀㔀㔀㤀䌀䄀䔀㠀㤀䔀㐀㜀㌀䘀㔀　䘀㠀䈀䌀㤀䄀䘀㌀㜀㤀㈀　㔀䌀䐀㘀㠀㐀㠀䈀㔀　䌀㌀　䔀䌀䌀䔀䄀　　䈀㐀䔀䌀䄀䔀㐀䔀䔀㐀䈀㠀㔀㘀䔀㌀䐀　㘀㈀䔀　㘀㜀　㠀㔀㠀㜀㔀䄀　䐀㌀㤀㤀㘀㠀㠀䌀䈀䈀䈀㜀㔀㈀䐀㠀㐀㈀䘀㜀㔀　㐀䄀㌀㔀䔀䌀㘀㠀㌀䈀㘀䌀䐀䌀䄀㜀㠀㔀㐀䔀䔀䐀　㠀㘀䄀㔀㐀㜀㤀㌀㤀㤀㐀䈀㐀䈀㔀䘀㄀㔀䘀㌀㄀䈀㐀㜀　䔀㤀㠀䔀㔀㤀㘀㔀䌀㌀㄀䐀　㌀㤀䘀㠀㌀㄀䔀㘀㈀䔀㜀㜀䔀䔀㈀䔀䄀㘀䘀㐀䘀㌀䔀㈀䐀㌀䔀䘀㄀㈀䐀㔀䄀㈀䘀㌀䔀㈀㤀䄀䌀䈀䐀䘀　㄀　㜀㈀䔀㌀㈀㄀㘀㄀㈀䐀䘀㜀䈀㤀㜀䘀㈀䐀䈀䔀㠀䈀䐀䄀䌀㔀㐀䔀㜀㈀䌀㠀䄀㘀㜀　䔀㔀㠀㄀㘀䌀㌀㠀㈀　䌀㄀㈀㄀　䘀㄀䌀㐀䌀㠀㘀㌀㤀㐀㤀䘀㔀㐀㤀㜀㐀䄀㤀㄀㄀䔀㘀㄀㠀㘀㄀䄀㄀㄀㘀㘀㘀㘀䈀䄀㄀㐀䌀　㌀䐀㔀㄀㐀㐀䄀㈀㤀䄀㠀䘀䌀䌀㐀㘀䐀㜀㔀㐀䈀㘀䔀䌀㄀䔀䐀䌀㘀䄀　㈀㠀㠀㌀䐀䐀　䌀䔀　䐀㄀㄀䈀䈀䌀㤀䔀㌀䘀㜀㄀㌀㌀㠀　㘀䌀㤀㔀䄀䔀䈀㠀㈀㌀　　䈀䐀䔀䈀　㐀䈀䘀㤀䄀㄀䔀䐀䘀䘀䈀䘀䐀㜀䈀㔀㘀䄀䐀䈀䄀䘀䈀㤀䐀䈀䐀㌀㜀䈀䘀䘀䈀㤀㔀㤀㔀䄀䈀㠀䘀䈀䐀㜀㌀㜀䐀䔀䈀䄀䐀䔀䐀䄀㔀䈀㐀䄀䌀䔀㌀䐀　䔀䄀䄀㘀䐀䈀䈀䄀㈀䄀㐀䄀㌀䈀㘀䔀㄀㌀䘀㜀㌀㔀䐀䐀䘀㜀㠀㌀㤀䈀䘀㜀䘀䐀䔀　䘀㠀䔀䄀㌀㔀䘀㜀䘀䐀䐀㌀䌀䔀䐀䈀㌀䘀㌀䄀䐀䔀㜀㠀㐀㄀㤀䌀㌀㜀㜀㠀㌀㈀䐀㈀䘀㔀䐀㔀䌀㄀䈀㤀䈀㌀　㜀㄀䘀㄀䐀㔀㤀㜀䘀㘀䌀㜀　䈀䔀㘀㈀㤀䐀㜀䌀㐀㠀㜀㌀㌀㌀㜀㄀㤀㌀㠀㔀䔀㄀㤀䌀㘀䈀㤀䐀䈀㜀㌀㠀䔀㤀㘀䔀䐀䈀㈀㄀㄀䈀㔀㔀䘀䈀㠀㤀䐀䐀㠀䄀䈀䔀㤀㐀䐀䐀㤀䌀㘀㘀䈀㐀　㐀㠀㠀㔀㤀㌀㈀㔀㌀䈀㌀㈀㔀㘀㠀㌀　㤀㠀䘀㐀䔀䔀䈀㠀㠀㤀䈀䄀䌀㐀㄀䌀㜀　　䌀䔀䌀䈀䔀㄀㠀䔀　䄀㠀㘀䔀䔀䌀䘀䌀䘀㠀㔀㄀㌀㘀㔀㐀㄀㌀㌀䈀㄀䘀㄀䘀㤀㠀㔀㔀䈀㈀䔀㔀䄀㄀㤀㄀䔀㠀㈀䘀䌀㘀䌀㜀㈀䘀㄀䌀㌀䄀㤀㐀㔀㌀䐀䈀㔀㌀䘀㔀㤀㤀䈀㠀㜀䐀㈀㘀䌀㘀㌀㔀㐀䈀㘀䘀䔀䔀㤀䌀㄀㌀㘀䐀䄀㘀䘀㔀㘀䐀㔀䈀㈀䄀䔀䄀㠀㌀㌀㘀㐀䔀䔀㤀　㜀䌀㔀䌀䘀㤀　䐀㈀㘀㤀䔀㠀䐀㜀䘀䘀㌀䌀㜀䌀䘀䌀㐀　　㠀䘀㘀㤀㜀䌀　䌀㄀　㈀㌀㠀㤀㠀　䈀䄀㔀䄀㤀㠀䈀㔀㌀㘀㤀㤀㤀䈀䈀䌀㘀㐀䐀䔀㜀㌀䄀㤀㜀㌀䄀䔀㤀㔀㈀　㜀㔀㐀㌀㠀䄀　㔀䄀㠀　㌀㈀　㄀㤀㘀㜀　㠀㈀䘀䈀㠀㠀㈀㐀䈀㄀䈀䐀䔀䄀䔀䌀㈀㈀䄀㌀䌀㄀㄀　䈀㄀㐀　　䈀㤀㈀㔀䌀㐀㐀䔀㜀㔀䘀䔀㔀䔀䘀䌀㘀㠀　䄀㜀㤀㔀㘀䐀㘀㠀䘀㌀㘀䘀　䌀　䄀䐀㤀䐀㤀䈀㌀㠀䈀䘀䌀㄀㤀㈀䔀㜀　㄀䐀䘀　䌀㌀㐀䔀㘀䌀䘀㈀䘀㠀㠀㈀䈀㔀䐀䔀㔀㘀㈀䘀䘀㔀㐀䄀㄀䔀㐀䘀㤀㈀㈀㄀㘀㠀㌀㐀䐀䔀㘀㈀㠀㄀㔀䔀䌀䈀㈀䔀　䈀㘀䐀䈀㌀䌀　㔀㈀　䈀䌀䌀䈀㄀㐀　㄀䔀　䔀㌀㔀㐀㌀　䈀　㘀㈀䐀䌀䄀䈀㄀㄀㘀䈀䈀䌀㐀㤀㤀㠀㠀䔀䔀䄀　䈀䌀䌀䐀䌀䐀䔀䘀㐀䄀㤀㠀䘀䌀䄀　䄀㈀㠀䐀㄀䐀䄀㤀䈀㜀䌀㔀㌀㜀㔀䘀㌀　㤀䐀㈀䈀㘀㤀㐀㌀　㄀㈀䌀㤀㄀䌀䘀㘀䌀䐀䈀㐀㈀䔀䌀㜀㔀㌀䘀㔀㜀䈀㈀㤀䈀䐀䐀䄀䈀䌀䄀㔀䔀䈀㤀㤀㄀㌀㌀㄀㔀㔀㔀䐀㠀㐀䈀䌀䄀䐀㠀䄀㤀㄀　㜀䈀㜀㈀䔀㈀　䄀䔀䔀䈀㜀䄀䌀㈀㠀㠀㤀㤀㐀㤀㐀䐀㘀㄀䐀㤀㠀㔀㜀㜀㤀䘀䈀㌀㔀㌀㄀㈀㤀㔀㠀㔀㔀䈀䈀䈀㐀㈀㄀䄀㜀㜀㘀㐀䘀㘀䔀㐀㐀䈀㠀㐀㈀㄀㐀㘀䔀㜀㤀㘀䘀㠀㔀㔀㐀㘀㠀䐀䈀䔀㜀䄀䄀㈀䔀㤀㈀㜀䌀㔀㌀㈀㈀㤀㄀㔀䔀㘀　䐀㤀㤀䘀㔀㐀㤀䔀㌀㤀䘀　䐀㘀㔀㔀䔀㐀䔀㈀㔀㔀㤀㐀　䈀㄀㜀㐀㘀㔀㜀䄀䐀䔀㄀㤀㤀㠀䔀㘀㐀䘀㘀㠀㘀㈀㔀䈀䘀㤀㔀䐀䘀䄀㈀䔀㜀㘀㜀㠀䘀䈀䌀㐀㠀㄀䔀䌀㄀䔀㌀䐀㄀㘀㜀䄀㘀㘀㠀　㌀䈀㈀䈀㈀㜀㔀㌀䄀㄀䌀㈀㤀㐀㄀㠀䐀㐀㘀㈀㜀　㔀　䐀䐀䌀㄀　䔀㤀䈀㠀㈀㄀䔀㈀㄀㘀㔀㌀㜀㘀䈀䘀㘀㈀㘀㈀㔀㈀䌀㈀䈀㐀㔀䔀㐀㔀㤀㈀䔀㈀㈀㤀㄀㜀　㠀㔀㤀㔀䌀㘀䈀㈀㠀　㐀㜀　㈀㘀䈀䈀䌀　㈀㜀㄀䘀㜀䘀䘀㤀䌀㐀㔀㜀㜀䘀䘀㘀㘀䔀㘀　㜀䔀㘀㔀㜀䐀䘀㄀㔀㜀䌀㜀䄀㤀䄀㜀䘀㌀䔀㐀䈀㘀㜀㤀䘀䘀䘀　䔀㠀㤀䔀㈀䐀㤀㌀㄀䈀㘀　䔀䔀䌀㄀䄀㌀㜀䈀　䔀㐀㘀㤀䘀㠀　䈀㈀䐀㤀㌀㔀㐀㄀㔀䈀䐀㐀㈀䄀㘀䔀㤀㜀䔀䄀㜀㘀䈀㘀䐀䔀䘀㐀㐀　䈀㈀㔀㠀㜀䌀㄀䌀㄀䄀㤀䄀㌀䈀㔀㜀䘀　㘀㜀㐀㐀䔀䄀㜀㄀䈀㔀䈀䄀㔀㄀㠀㘀䔀㘀㤀㈀䔀㜀䌀㈀㈀㌀㌀䈀㈀䄀㘀　䈀㐀㄀䌀㜀㘀㄀㜀㄀䔀㈀䄀䄀㐀䈀䈀㘀㘀㄀䌀㤀䌀㐀㄀䄀䘀　䐀䌀　㐀㄀㌀䘀䔀䌀㤀㌀㈀　㈀㈀䌀㄀㘀䄀　㤀　䔀㘀㐀䌀　䄀䔀㔀㐀䈀㠀䐀㘀　䐀㔀䐀㔀㘀㘀㠀䈀㈀䌀㈀㘀㄀　䄀㈀㘀㘀䐀㤀㈀㌀䘀㘀㜀䄀䔀㤀䘀㤀　䘀䔀㜀䌀㔀㠀㤀㜀　䘀䘀㤀㈀㐀䌀㜀㤀䄀㜀㌀㌀㐀㐀㜀䌀㠀䌀㤀㈀㤀㤀䔀㤀䘀䔀䔀䘀㜀㜀㠀䈀㐀㜀䔀㔀㈀㈀䌀㄀㔀䐀㌀䔀㈀䈀㤀䘀䌀䔀㘀㐀㔀㐀㈀㐀䌀㠀㈀㘀㤀㜀㘀䄀㘀㠀㜀䄀㐀㔀䈀䐀㌀㘀㤀㜀䄀㜀䄀㜀䔀㘀㘀䈀䔀㐀䈀䘀　䌀䌀㘀㘀㘀䔀㘀㠀䄀㘀䌀㜀㄀㔀㜀㌀㐀㌀㘀㔀䈀䔀䌀䈀䈀㜀㜀㤀䌀䈀䘀㜀㘀㄀䌀㐀　䘀䄀㄀㈀䄀㘀㐀䈀㤀㌀㤀㘀㜀䈀䈀䘀㈀　㐀㄀㔀䈀㈀䔀㌀䐀䔀䄀㠀㈀䈀䘀㄀㘀䔀　䌀㜀㘀㔀　㈀㈀㌀䈀㠀㄀㌀㤀　㔀㐀㈀䐀䌀㜀㔀㄀㔀㈀䄀㜀㔀　㜀㘀䘀㈀㠀䐀䘀䈀㠀㈀㐀䌀㜀䈀㌀㘀㐀䘀㜀䌀㘀　䐀㈀㜀㐀㜀㌀㄀㠀䔀㜀䔀䄀㠀䘀㌀㠀㘀㄀㜀䘀㜀㔀㔀㠀䈀㐀䘀㠀䄀䔀㔀㘀䈀㜀㜀㈀䌀　䌀䘀㜀䐀㐀䔀㜀䄀㘀䄀䐀㌀㠀㌀㈀䐀䌀㜀㔀䔀㜀䘀䄀䔀　䈀䌀㘀䐀䘀㜀㜀㜀㜀㐀㌀䔀㜀䌀䔀䐀㄀㈀㔀㄀䌀㠀䔀㠀䔀㠀㜀㜀䔀㘀䌀䐀　䐀䘀㠀㐀䄀㜀㈀䘀䐀㜀㘀㐀㜀㔀㄀䌀㌀㘀㠀㘀䈀䘀䐀㜀㔀㘀䈀㐀䄀䌀䄀㈀㌀䈀㜀㌀㜀㄀䈀㈀䈀䐀䈀㄀㘀㜀㠀㔀㌀㠀䈀㄀㘀䔀㔀䔀㔀䌀䌀㈀㤀䌀䄀㜀㌀㌀㤀䔀㜀䄀䐀䔀㠀㤀㠀㔀䘀㌀䐀㠀䌀㌀㄀㘀䄀䔀䈀　䐀㠀䐀䌀䄀㔀㜀㘀䘀㠀㔀㐀䘀㜀㠀㠀㐀㤀㘀㄀䔀䐀㘀㘀㤀㈀　㠀　㌀㘀㔀㘀　䌀䄀䄀㤀㤀䈀䘀㐀　㤀㤀䈀䘀䌀　䄀㈀䌀䐀㌀㜀㈀㜀䐀䘀䔀　㘀䔀㄀䈀䈀䈀䄀㜀䌀㈀㈀㜀㜀䌀㄀㈀䐀䐀㜀㌀㈀㘀䈀䄀㔀㜀䘀㠀䈀㘀䘀　䘀㘀㠀㔀㐀㈀䔀㄀䔀䐀㤀㌀㘀䌀㠀䌀㌀䈀㤀　㐀䈀　䐀㌀㠀㐀㘀　㘀㔀㤀㄀䈀㤀䔀䈀䐀㈀㘀䈀㔀㌀㜀㤀㔀䈀㘀㌀㠀䈀䈀㤀䐀䘀㐀䈀　㄀䔀㌀　㘀㐀㤀㌀䌀䘀　㘀䌀㘀㔀㐀㌀　䄀䄀㠀㈀䘀䐀㈀㈀䔀䌀㄀　㈀㄀㈀㌀䄀　䐀　䐀㠀㘀㜀㔀㔀㌀㐀㤀㈀䐀㜀䌀䄀　䌀㘀䄀㠀䄀㐀㜀䌀㌀䔀㤀㄀䌀䈀䄀䄀䄀㌀㘀㐀㔀㤀䘀㐀㌀㐀㐀䈀㈀㠀㤀䘀㈀㘀䔀㠀䌀䄀㠀㌀㠀㄀䔀㘀㈀㠀㌀䌀䔀䈀㜀䄀　䔀䘀䌀㐀䔀　㤀䔀㠀㜀䈀㘀㤀㐀䈀䈀㠀㔀㘀㜀㔀㔀䘀㘀㐀　䔀㔀䘀䄀㠀㔀䐀䐀䈀䈀㄀㘀䐀㠀㤀䔀㠀㌀　䘀㐀䈀㠀㜀　㜀㌀䈀㤀㘀䔀㘀㤀㜀㌀㐀䘀㘀　䔀䘀㘀　㔀䔀㤀㤀䐀㤀㌀䐀䈀㠀㈀䄀䈀㤀㜀㔀㘀㄀㔀䄀㘀㄀㘀䄀䘀䈀䐀㜀䔀㄀㤀㌀䐀㠀䄀㔀　㘀䈀㜀㄀㘀䐀㘀䌀㐀㈀䄀㠀㈀䐀䔀㠀㘀㜀䌀䔀㘀䐀　㄀㘀㠀䌀㘀　㠀䌀㐀㘀　㔀㈀㠀䈀　㈀㔀㔀㔀㌀㌀㄀䌀　㄀䔀　䔀䄀㄀㠀㈀㐀　㐀䐀㄀㘀　㈀㈀㘀㐀　䐀㔀　㤀　䔀　㈀㈀䈀䐀㤀䌀㈀㠀㄀㜀䐀　　㐀㌀　　㤀䐀　　㐀　㈀䐀㈀㈀㄀㄀䘀㠀㌀䄀䄀㄀䈀㈀䌀㌀㠀㘀㔀㄀䔀㔀㜀䌀㜀䔀㔀㠀䌀㘀　㌀䌀䈀䄀㤀䔀䐀㜀䌀䔀䔀㤀㄀㈀㐀㄀㘀㈀䈀䘀㠀㄀䔀　㐀㜀䈀㄀䈀㜀㜀　㠀㈀㌀㌀㜀䐀㤀䐀㈀㠀䄀㤀䈀䄀㈀䌀㔀䐀䘀㠀䐀䌀䔀㜀䘀㄀㔀㐀䄀䈀㔀㐀㘀䈀䐀㔀㘀㐀㔀䈀㔀　䔀　䈀㔀㐀㠀䈀䐀䈀㌀䘀㌀䘀㠀㈀䌀㘀䔀䈀䈀䈀䌀䔀㐀䌀㤀䘀䌀䘀㤀㄀㔀㔀㤀䐀㈀䐀䌀䌀㘀㄀㄀㐀䘀㜀㄀㈀䄀㈀㤀䔀㠀䈀䈀　　㜀㘀　㜀㘀䘀㠀㜀㐀㠀䔀㄀㔀䄀䌀㘀㘀㤀㌀䐀㄀㘀䄀㌀㐀　㜀㐀䌀㐀㘀㠀㜀䌀㤀㜀㠀㤀㜀　㤀㐀䌀㈀㘀䔀㌀㐀㄀㈀㌀䘀㐀㄀㠀㈀㄀䌀㜀　㠀㐀㘀䌀㌀䈀㠀　䈀㜀㈀㔀䐀㤀　䔀䄀　㈀㠀㌀　䈀䈀䔀䄀㈀　㌀㜀㘀㔀㈀㐀㄀㔀䐀㘀䔀㤀䐀䌀㄀㘀㔀䐀　　㔀䐀䌀㈀䔀㠀㜀䐀䈀䄀㔀㜀㌀䐀䘀䌀㜀㔀䐀㠀䘀㔀䄀　㌀䌀䌀㌀　㐀　　䄀㌀䄀㈀　䔀䔀㜀䄀㌀㜀䈀㠀㔀㌀䈀㌀㄀　䔀䐀㈀䌀　㠀㜀　䔀㐀　㤀㠀㠀㄀䔀㌀㠀㈀䔀㐀㈀䄀䔀　㠀㤀䔀㔀㐀㤀㄀㜀䄀㤀　㐀㘀䄀㤀㄀䔀㐀㜀䄀䄀㐀㜀㐀䌀㌀䐀䌀㄀䄀㤀䐀㈀䌀䐀䔀㠀䘀㄀㌀㈀㠀㔀㌀㌀㄀㐀䈀䔀㐀䌀䄀㄀㤀䈀䌀㈀㄀䄀　䄀㘀㔀㄀㐀㜀㈀㈀㤀䐀　䔀䔀䐀㐀㤀䐀䄀㤀㘀㌀䄀㤀䌀㈀䔀䌀䐀㐀䔀㘀㔀㐀㤀䄀㄀䄀㐀㠀㌀㔀㤀䈀㠀㠀㤀䈀㜀㤀㈀䈀　㘀　䄀䌀㘀㔀㠀䄀䌀㌀䔀㈀㄀㤀㌀㈀䔀䄀䔀㠀㈀㤀㄀㠀　㌀㈀　䐀㘀㔀㤀䘀㈀㔀㜀䔀㈀䌀䌀㈀㠀㈀㜀㔀㜀㐀䔀㜀㄀㈀䔀㠀䌀䄀㜀䄀㈀㘀㜀㠀㌀㌀㠀㤀㌀䐀䔀㔀㘀㄀䄀䔀㘀　　㘀䈀　㔀䈀㌀㘀䐀㠀㠀㜀䌀䌀䈀㌀㜀㌀䈀㈀䐀㐀㘀䄀㜀㘀㘀㘀㄀　䈀㈀㌀㌀㘀䘀㘀㜀㠀㄀䌀　㤀䔀㌀㐀㔀㘀䈀㠀㘀㄀㔀㜀䌀䘀㠀䐀䈀䔀䘀㈀㔀㠀䘀㐀㌀㌀䄀䈀㔀㤀㐀　㄀㜀䌀䐀㄀䌀䈀䐀䘀　㜀㐀䘀㐀㤀䘀㤀䔀㜀䐀䌀㐀䔀㄀㔀㈀㈀㌀䐀　㄀㘀䈀㌀䔀䄀䄀㜀䔀䘀䈀䐀㘀㘀㐀䌀䈀㘀䔀㤀㐀㄀㔀㐀䐀䈀䄀䐀䄀㜀㄀㤀㠀䘀㠀㐀㤀䔀䐀㈀　䄀㤀䈀䄀㔀䄀䔀䘀　䌀㈀㐀㤀㜀㐀㠀㜀㐀㈀㠀䐀㌀㜀㘀㜀䐀䈀䔀㘀㔀㘀䌀䔀䈀㄀䐀㈀䘀㌀㤀㌀㤀䈀㜀㈀䐀㜀㌀㐀㈀䔀㐀䌀㈀䄀䐀䄀㔀㄀㐀㔀䘀㤀㔀㌀㌀㐀㐀䌀䔀䄀㌀䄀䈀㤀㌀䘀㜀㠀㐀䘀䈀㠀䐀㄀䔀㤀䐀　㄀㈀䄀㌀㐀䐀㘀㜀㈀㜀䌀㘀㈀㐀䄀䈀䌀䔀䄀䔀䈀㌀䈀　㤀䌀㔀䔀㘀㜀㌀㜀㠀　䌀㘀䄀㄀㜀㘀㘀㠀　䐀䄀　㘀㈀䈀䘀䔀䌀㔀䄀㠀㜀㌀㘀䄀　䈀㌀㌀䈀㜀㐀㌀䄀䈀䈀　䈀䐀䐀㐀㘀㠀㜀䌀㤀㐀䌀㠀䌀㠀㐀　䄀䄀㈀䌀㄀　㠀　㘀㜀㐀㤀䘀㠀䐀　䔀㈀䌀㄀㈀㤀㜀䌀㄀䄀　㜀㌀䐀㠀㠀䐀䐀䌀　䈀䐀㐀　㈀䐀㄀㐀䐀䐀㄀㤀㔀䐀䐀䄀䐀䌀㈀㠀䘀㤀㘀䔀㐀㠀䐀㠀䘀㠀㤀　㤀㈀䈀䘀䈀㐀　㌀㜀㜀　㤀㈀㜀　䘀㜀㠀㤀㌀䐀㄀㘀䌀䌀㜀䔀䈀㄀㘀䄀㠀䈀㠀㔀䄀䈀䘀㌀㘀䌀䘀䔀㠀䐀䘀㜀㈀䌀㤀　　㤀䌀㌀㌀䘀䄀㄀㈀䐀㜀㘀㜀䔀䘀㠀䘀䔀䌀䌀　䄀㠀䈀㘀䔀㐀㘀䘀㐀㐀㜀䔀䘀䌀　䈀䈀䐀㄀䌀䐀㌀䘀䘀㠀㤀㔀䌀㌀㘀䈀䐀　䌀䔀　　䘀䐀㈀䈀䐀㄀㔀㘀㈀㠀㤀䌀䈀㜀䐀䄀㘀㄀䄀䐀㠀䌀㔀䔀㐀㜀㔀㜀䐀㌀䘀㐀䔀㠀㄀㤀㐀䘀㐀㄀㤀㈀䄀㤀㄀㈀㔀䄀㈀㜀㜀䘀㤀䔀㠀㠀䄀䘀㤀㤀䌀䌀　䈀㜀䈀䐀㔀　㄀㤀㔀䄀㠀㄀㜀䌀㄀㄀䌀㤀　䌀㠀㄀㌀䄀㠀㜀㄀㐀㄀䐀㤀䔀㜀㐀㜀㌀㈀　䄀㠀㈀㤀㤀㈀䈀㄀䐀㠀㄀䔀䘀　㔀㈀㜀䘀㄀㌀䈀㔀㌀㈀㘀䐀䘀㘀䘀㘀㌀䄀䄀䐀㔀䘀䄀㌀䔀䈀䈀㄀㜀㤀㐀㘀䐀䔀䄀㈀䈀䔀　㈀　㜀㌀䌀㐀䌀䔀㘀㠀䌀䔀㜀㠀䈀㐀䔀䌀㐀㜀䔀㜀䐀㌀㠀䈀㘀䌀䄀㘀㘀　䘀㘀㄀䘀㤀㄀䔀㘀䐀䈀䄀㈀㄀㤀䘀　㄀㌀㜀䄀㌀㐀㜀䄀㐀㜀㜀　㔀㤀㔀㘀㜀䄀㐀䐀㌀㤀㘀䌀㘀㔀䈀㌀㘀㜀䄀　㜀㘀䘀䈀　㤀䌀䔀㘀䔀㈀㌀䐀㜀㠀㐀䘀䐀㔀㘀㠀䐀㈀㠀㠀䄀䘀　䌀䘀㈀㈀㤀㠀㜀　䌀䔀㠀　䌀㄀䔀㐀㐀　㌀㜀䌀㠀㘀㘀䔀㌀䔀㜀㤀㔀㜀㘀㈀䐀㌀䄀䈀㔀㈀㈀㐀㘀䌀䈀㈀䌀䔀㘀㌀㄀㔀㄀㘀䈀㤀　㘀䐀㄀䘀㤀䔀㈀䈀㈀㤀㘀㄀㌀䘀　䄀　㄀㔀㄀䈀䈀䌀㜀䐀䌀䌀䐀䔀䐀䈀㘀㄀　䈀䈀䌀䈀䌀䌀㔀㜀　䄀䔀㠀䌀䔀䘀㄀　㜀䐀㤀䌀䌀㔀㐀䔀㌀㄀㌀㜀䔀㜀㈀㘀㄀　㄀㘀䐀㐀䐀䌀䐀　䔀㈀㘀㐀䐀㘀䔀㄀㌀㜀䄀㈀㜀䔀䘀㜀㄀䔀㐀　㘀䔀䌀䘀㐀㜀㜀　䘀䐀㄀　㜀䈀䐀㜀㤀　㔀㐀㤀㈀㜀㐀䘀㐀䔀㌀㘀㈀㐀䌀䘀䌀䌀㜀㔀㔀䌀䈀䌀䌀㠀䌀䔀㐀　䄀　㐀䈀䘀㔀㄀䔀䌀䐀㌀㘀䐀䐀㠀㄀㌀㤀㌀㔀䘀㤀䔀㄀㔀㜀㔀㜀㤀　㘀㐀䘀㘀䘀㔀㐀㤀㔀㄀㐀㌀㠀㔀㈀䄀　　䘀㄀㔀㤀㈀㄀㄀䘀䐀㔀㜀㈀㄀　㠀㈀䄀㔀䐀㠀㌀䈀䘀㌀䔀㈀㘀䘀䔀㤀㈀䐀䘀㐀㜀㜀䄀　㌀㄀㤀㔀㐀㌀䐀㌀䌀㔀　㌀㐀㐀䘀㜀㐀䐀䔀䌀㠀㠀㘀䄀䈀㈀䈀㐀㤀㐀䔀䐀䈀㜀㘀䐀䌀㄀㄀㄀㜀䔀㐀䌀㜀䘀㈀㌀㘀㠀䌀㠀㘀䘀　㠀㤀㤀䌀䌀㈀㈀㤀䄀㈀㜀　㤀㠀㌀㤀䌀䈀㜀䈀㄀㈀䐀䔀㘀㔀䈀㜀㠀䐀䈀㘀䘀㘀㌀㘀䐀㤀䔀㔀㠀㤀䈀　䘀㐀㜀㌀䐀㐀　㜀䘀㠀㜀㘀䐀䈀䘀䌀㌀䈀㘀　　㘀䈀䌀䈀㌀㌀㈀㠀㘀䐀㈀䔀䈀䌀䔀䔀㜀㘀䘀䄀㄀䈀㤀䌀㜀㄀㄀䔀㌀㐀㔀䔀䈀䌀㤀㤀䌀䘀䌀㠀　㜀䔀㔀䄀䐀㤀㤀㄀㠀㈀䐀䔀䔀䄀㌀䔀䘀㘀㌀䔀䈀㜀䌀䐀䔀㠀䄀㔀㜀䄀㘀䌀㔀䄀䔀㈀䌀䌀　䈀㘀㔀䈀䘀㤀㤀㔀　䈀䄀　㐀䐀䈀㤀䐀㈀㄀㈀㠀㜀䈀㔀　䔀䌀㜀㄀䐀䔀　㔀㜀㔀㘀䌀㈀㌀䄀䘀㤀䌀䄀㌀㠀䄀䌀㌀㌀䘀　䌀䄀䈀䐀䘀䌀䌀䄀㌀　䄀䌀䌀㘀㌀㘀䌀㌀㘀㤀　䄀䌀㐀䌀䄀㈀䘀䔀㔀䔀䐀䄀㄀㜀㠀㜀䈀㄀㔀䈀㐀㈀㠀㈀㌀㌀䈀䔀㌀㈀㌀㄀㜀䐀　䐀㜀䔀㤀䄀䐀䄀䄀㌀㜀䔀㐀㜀㤀䔀㤀㘀㘀䐀䔀㘀䄀㄀㜀㘀㈀䄀䐀㈀㄀㘀䌀䐀䐀䌀䈀㔀䈀䘀㄀㔀䄀䄀㔀䐀㔀㄀㘀㘀䘀䌀䐀䌀㐀䐀㘀㔀䈀㜀㠀㈀䈀䐀㈀㔀㜀㘀㤀䐀㔀䌀㜀㔀䈀㔀䐀䐀㠀㜀䄀䈀䈀䔀䄀㌀㤀㤀㤀㄀㘀㜀㐀䄀㔀㐀䌀㜀䐀㤀䄀㜀㠀䔀䐀㌀䔀䐀䔀㠀䄀䈀㐀䌀　㘀䈀㄀㄀㈀㌀㌀㌀㔀㔀㌀　䄀䄀䄀㌀㄀䘀䐀　　㄀䐀䔀㠀㘀䐀㠀䌀䄀㘀䐀㘀㈀䄀䌀㘀䐀㐀㘀㄀䌀㈀㈀䌀㐀㄀㘀䐀䈀㌀㠀䈀㘀䄀㈀㄀　䌀㜀䘀㘀㐀㌀䄀㐀䐀㐀䔀㜀䄀䄀㄀㜀䄀䌀㘀䄀䔀㈀㔀　㄀䔀㜀㈀㤀㠀䄀䐀䄀㐀㘀㌀䔀㐀䘀㌀㔀㠀㠀㈀㌀䌀䈀㐀㐀㈀㘀䘀䈀㈀㐀㐀㤀䐀㌀㐀㐀䌀䈀䈀䔀㤀䌀㌀䌀㈀㜀䈀䔀㈀　䔀䐀㔀㜀㌀䔀䄀㌀䘀㘀㠀㌀㌀㜀㔀㈀䐀䘀䄀㈀㌀䘀䄀䐀䘀㄀䈀䔀䘀㌀㜀㔀䈀㈀䔀㐀䐀㤀㘀㔀㄀䔀䈀㐀㌀䈀㘀䔀䐀㄀㠀䔀㘀䘀䌀䌀　䐀䔀䔀䌀䔀㠀㜀㄀㘀㘀㌀䄀䘀䘀㈀㔀䘀㤀㈀㘀䐀㜀䘀㜀㔀㈀䘀㈀䐀䌀䔀㜀䐀㌀　䌀㘀㤀䈀䘀䘀㐀䘀䌀㜀䐀䘀䄀䈀䘀㘀㜀䘀㐀䘀㤀㤀䄀㜀䌀䘀䘀㤀䔀䘀㤀㜀㐀䐀㘀䔀䘀　㌀䘀㜀䔀㜀䔀䌀䌀㠀㤀䐀䌀㠀䈀䈀㈀㔀㌀㄀　㔀䘀䈀䘀㌀㄀䘀㈀䌀㠀　䌀㈀㌀㤀㐀㔀㜀䈀㠀䄀㄀䈀㐀䄀䘀䔀㈀䔀䘀㐀䔀㠀䄀䌀㄀㜀㐀䈀䈀䘀㔀㘀㔀㘀㔀㜀㤀䔀㌀䌀㠀㜀䌀䔀㜀㔀䌀䘀䄀䈀㤀䔀䈀䘀㜀㄀䌀㄀㐀　䄀㔀䈀㔀䄀䄀㜀䈀㘀㄀䘀㔀䄀㈀㤀䄀䔀䄀㌀䈀㘀䈀䈀䔀㔀䔀䘀䈀䄀䘀䘀㔀䐀㜀㈀䐀㌀䐀䘀㈀㔀㜀㤀㈀㤀䔀䈀䌀㐀䄀䘀䄀䔀㐀㌀䘀㤀䘀㤀㘀㄀㔀䌀㜀䐀㌀䔀䄀㌀䘀㌀䈀㌀䐀䈀㠀䐀䌀䈀䘀䘀䌀㔀䈀䐀㌀㘀㤀㌀䄀㐀䐀䄀㜀䘀䘀䄀㔀䔀㤀㔀䘀䘀䔀㐀䈀䐀㈀㘀䘀䄀㜀䐀㌀㜀㐀䘀䄀㤀䘀㤀㜀㄀䄀䘀㐀　䐀䘀䔀㠀㘀　㔀䐀㌀㘀㤀㌀䄀㐀䐀䄀㜀䔀㤀㌀㐀㤀䐀䄀㘀䐀㌀㜀㐀㤀䄀㐀䔀䐀㌀㘀㤀㌀䄀㐀䐀䄀㜀䔀㤀㌀㐀㤀䐀䘀䔀㤀䌀䈀㐀䄀㈀㈀䔀㈀㄀㄀䐀㤀䘀㐀䔀䘀䘀䄀㌀䐀㈀㔀㜀䄀㜀䐀㌀㜀㐀䘀䄀䄀䈀㐀䔀㄀䘀䌀㤀㘀㤀䄀㔀㘀㜀䔀㔀䄀䔀㤀㔀䐀䘀㔀䘀䘀㤀㠀㜀㘀䈀䐀䄀䄀䘀㄀㤀䘀䘀䘀䘀㐀䈀㠀䐀㤀㘀䌀㘀䘀㈀䌀㘀䔀䘀䄀䔀䐀䄀䈀䈀䔀䄀㠀㔀䐀㔀䈀㌀㔀㘀㜀䘀㘀䈀䘀㔀㄀䘀㤀䄀䔀䔀㘀㠀㐀䔀㘀䔀䘀㘀㌀㘀䔀㜀㌀㐀㄀㜀㌀㘀㤀㜀㌀㔀㔀㜀㌀㘀䐀㜀㌀㐀䄀䘀㘀㠀㘀䔀㘀㤀䐀䔀䐀㠀䐀䌀䐀䐀䄀㈀㘀䐀䈀㤀䄀㜀䔀㔀㠀㌀䐀㘀㜀㔀䄀䐀㔀䘀㘀䐀㜀䐀㜀㌀䌀䐀㠀䌀㌀㔀㄀䘀䄀䐀㘀䐀㔀䌀䈀䈀㘀㌀䔀䐀㜀㌀㘀䈀㜀䘀䈀䘀㘀䔀㜀㠀䐀䐀䈀䐀䔀䈀㈀㘀䐀㜀䐀䘀䐀　㈀㘀䈀㐀㄀㔀䈀㘀㜀㔀䈀㔀　䐀䈀㐀䘀䐀㜀䄀㐀㌀䘀䈀㠀㘀㜀㜀㌀㘀䄀㘀㘀䌀㘀䌀䐀㤀㜀㠀䌀䈀䌀㘀䌀䘀㌀㘀䔀㔀㘀䌀　䄀㘀䘀㄀䄀䐀㤀䘀㐀䐀䄀䄀㘀䐀䘀䈀㐀䘀㜀䈀㐀㌀䘀䈀㌀㌀㤀㜀㌀㜀㌀㜀䘀㐀㜀㐀㄀䌀㜀䔀䐀㤀䐀㤀㔀㤀䐀䔀䐀㤀䐀䐀䘀㠀䄀䄀㐀㐀㘀䘀䔀䐀　㌀㔀䐀㠀㜀㔀䄀䄀䔀䈀䈀㌀䘀䘀䘀䔀䐀㐀㘀䐀䘀㤀㔀䘀㤀䌀䈀䌀䐀䐀䘀㤀䐀䐀㜀㌀䈀䄀㘀䈀䈀䈀㔀䈀䈀䄀㈀㌀䐀䐀㈀㌀䐀䐀㌀㜀㜀㔀䐀䘀䐀㤀䘀䐀㐀　䘀㜀㄀㌀䐀䐀䐀䘀䔀㤀㜀䔀䘀㌀䄀䘀㈀䌀䈀䐀䐀䘀䘀䐀䄀䈀䔀䔀䘀䘀䐀㜀䄀㌀㤀䈀㐀䔀䐀㌀㘀㤀㌀䄀㐀䐀䄀㜀䔀㤀䘀㐀䈀䘀㌀㠀䐀㤀㔀㠀㈀㈀㠀㐀䌀䌀䄀㄀䐀䘀㈀㘀䔀䌀䘀㤀㌀䔀䘀㘀㤀　㘀㌀㈀䄀䈀䘀㐀㌀㠀㜀䔀㔀㠀㄀䔀㠀㜀㤀㐀㤀䔀　䌀䘀㌀䔀㤀䄀䔀㤀　㤀㈀㔀㈀䘀㤀　㘀䄀䘀䄀㈀㔀㈀㔀㈀䘀㈀㘀䘀㐀㔀㄀㤀㄀㄀㐀䘀䄀㤀㈀㤀㈀㔀㜀㘀㌀䘀䘀㄀䘀㈀䄀㜀㤀　䐀䔀㤀㠀䌀䘀㜀䐀㄀㤀㈀㈀㈀䘀䄀䄀㤀㤀㈀䐀㜀㤀㄀㐀㌀㈀䄀䈀㔀㤀㈀㌀㜀㤀㤀㐀㔀䐀㔀䐀㄀䐀㠀㤀䈀㔀　䌀㄀㘀㐀䘀䘀䈀㈀㤀㈀　㜀䄀㈀㜀㈀㌀䌀䄀　䔀㐀㈀㤀䐀㄀㌀㠀㜀䔀䄀㈀䔀㐀　㔀㤀㈀䔀㤀䘀㠀䈀䔀㤀㈀㄀㜀㄀㌀䘀䄀䄀㠀㠀㠀䐀㄀㜀㄀㔀䔀䌀㤀䄀䈀㠀㤀䌀㘀㄀㤀㜀䈀䈀䈀䄀䄀㠀㘀㄀㐀䌀㜀䘀䈀㘀㠀㐀㤀㠀䄀䘀䐀㌀䔀㈀㔀䄀䘀㈀㌀㠀䈀㤀䐀㄀䄀㈀㔀㘀䘀䐀㈀㔀　䔀㜀㌀㈀䘀㘀㘀㐀䈀䔀㈀㠀䈀　㐀䘀䄀㈀㜀䈀㄀䄀㜀㠀㔀䔀㠀㔀㜀㤀䄀䈀㘀㜀　㌀䌀䘀䄀䈀㜀㤀䘀䐀　　䌀䘀㘀䈀㜀㠀䘀䐀㘀䔀㤀䔀䐀㜀䘀㈀䘀䌀㈀㄀㤀䔀䐀㜀㈀㄀䄀　㔀䔀䘀䄀　䈀㈀㔀㈀䘀䐀㌀㔀　䌀䔀䌀䈀㌀㐀㤀㐀䘀㌀㌀㈀　䐀䔀㔀䈀䌀㤀㠀䐀　㐀㜀䄀㘀䄀㄀㤀䌀㤀㜀㘀㤀㈀㠀䔀㜀㌀㔀㘀㐀䈀㌀䔀㜀䈀㠀㤀㈀㤀㜀㘀㤀㈀㠀䔀㜀㘀㔀㄀䄀䌀䄀㜀㤀㤀㌀䐀㤀䔀㄀䈀㤀䌀　䘀㌀䘀䄀　㐀䘀㠀　䐀　䌀䈀㘀䄀　㤀㔀䔀㜀㠀䐀　㤀䘀㔀㘀㘀㤀㘀　䘀㐀䄀㌀䌀㘀䘀㘀㔀䈀　　㔀㠀䈀㜀㠀䐀䔀㠀䔀䘀㤀䄀㐀䔀　　㈀㤀䔀㜀㜀㈀㐀䘀㐀㜀㜀㜀㈀㄀䌀䔀㔀㜀䌀㜀㈀㐀㈀䈀䐀㤀䈀㔀䘀䈀䈀㤀㈀䔀㜀䐀㌀䘀㠀㔀䌀䘀㈀㤀㠀䔀㤀　㤀㜀䐀㌀㈀㄀㈀䘀㈀㜀䔀䐀䔀㔀䘀䄀㘀䔀㜀　䌀㤀䔀䔀䘀䔀㜀䘀㤀㤀㤀㌀䌀䌀䘀䔀㤀䄀㤀㐀䐀㠀　㔀䘀㤀䈀㌀　㤀㜀㌀㄀䄀㄀䐀䔀㄀㠀䌀㌀䔀㔀㔀㄀㈀㈀㤀㄀㄀㈀㔀㈀㠀㐀㌀䘀䄀㔀㤀㠀㔀䈀㐀䐀㜀䄀㐀㠀　㐀䘀䘀㈀䔀㈀㜀㠀㌀㘀㐀　　㜀䘀㐀㘀䌀㠀㈀䔀䈀㈀㠀䐀䐀㜀㈀䌀䌀㈀䐀㈀㄀　䔀㘀䐀㤀䔀䘀㜀㘀䄀䌀䔀䘀䔀㔀㌀䐀　䄀䈀　䄀㔀㠀䄀䘀㐀㘀㌀㤀㈀㐀㠀㈀㌀䐀㘀㜀㔀䔀㌀䘀㔀㈀㌀㘀㐀㤀㠀㤀㜀㈀㈀䘀㠀㌀㜀㠀㈀䈀䐀㜀㜀䔀　䔀䘀㐀䔀䐀䔀䐀㌀㠀㐀䄀㤀㄀㘀㐀䈀㤀䈀䈀㄀㌀㘀㐀㈀㜀㘀㘀㈀䌀䐀　䄀㌀䔀䘀䄀　　䌀䔀㄀䈀㤀䈀㘀㜀㄀㤀㠀䔀䈀䔀　䈀䌀㜀㄀䔀䌀㔀㜀㄀㈀㐀㄀䌀㜀㜀㄀　䌀㜀䔀䌀㈀㔀㄀䐀㤀㠀䔀䘀䌀　䘀䌀㌀㘀㘀䌀㄀䈀㠀䄀䌀䘀㈀㌀䌀㔀䄀㄀㈀䘀㈀㈀㈀㄀䌀䌀㘀㔀䌀㜀㐀䈀㘀㔀㈀㐀㤀䘀䌀㌀䐀　㠀䔀㈀㌀㘀䌀䌀㌀䈀䔀㄀㈀䌀䔀䐀䈀㠀䔀䘀㌀䈀　㌀㄀㌀䄀䌀㠀㄀㘀䄀㔀㘀䘀㌀䐀㤀㘀㜀䄀䈀　㤀㘀䈀㔀㠀䔀㈀㈀㠀䌀䌀㌀㜀㄀㤀䌀㄀㠀㄀䐀㜀䄀㌀㤀㄀䔀䘀䐀㔀䘀　㠀㐀䘀㄀㜀䄀㜀㠀㔀㐀㐀㄀㘀㘀㈀㜀㤀㌀㌀䈀㘀䈀　䐀䄀㜀㘀㐀䔀㠀㤀㐀䈀㜀㄀㤀㐀䌀㜀㄀㤀㔀㐀㌀　㤀㔀䘀㠀㈀䌀䄀㌀䐀㠀䐀䄀䌀㄀䘀㄀㘀㔀䄀㔀㈀䔀㄀䌀㜀䈀㈀㜀㔀䔀㌀䈀䌀㐀㘀䈀㐀㘀䈀㄀㔀㜀㈀㜀䄀㜀㤀䌀㠀㐀䘀㔀㌀㄀㜀䔀䐀㐀㈀㄀㐀䌀㠀䌀㌀䄀䈀䐀䘀䌀䈀䄀　㄀㐀䔀䐀䈀䈀㤀䘀䌀䘀䄀　㠀䔀䘀㄀㄀㈀㄀㔀䈀㜀㄀㐀䔀㐀㘀䔀㤀㐀䔀䘀䔀㔀䈀㔀㈀㈀　㠀䄀䘀㔀㤀㔀㜀㠀䘀䐀㌀　䐀㘀㌀　䘀䄀㘀䐀㠀䈀㜀㌀㜀　　䄀　䘀䐀㘀㌀䔀㠀㈀㔀　䘀㐀䔀㈀㤀㔀䌀㌀㐀㠀㠀㔀㈀䄀䐀䔀㔀㌀䌀㘀㈀㠀㠀㘀㐀㔀㌀䈀㠀㜀㠀㤀㐀㤀㐀　㈀㜀㤀䘀㤀㄀䌀㄀䈀䌀㠀㔀㘀㌀䐀㜀䘀㔀㄀㜀㐀㤀䌀䘀䔀㔀㌀䐀䔀㜀㔀䌀㌀㈀㈀䈀㤀㌀䄀㄀㘀䔀䄀㐀㐀㜀㌀䘀㤀䘀㐀㜀㈀㈀䈀㤀䐀㠀䈀䘀㤀㜀㘀㌀㌀　㄀㠀䄀㜀㔀䈀㄀䔀㘀㤀䔀㘀䈀㐀㄀䄀㠀䔀䔀㌀㔀㌀㠀㘀䔀㌀㄀㘀䄀㄀㌀㐀㐀䘀㠀䐀䈀㐀㄀䌀㈀㄀䘀䈀䔀䘀㤀㔀㜀㌀㌀䐀䘀䘀㤀㤀㤀㘀䘀㔀䈀䘀㄀㘀㔀㤀䈀䘀㔀㈀　䔀䄀㘀䈀㠀㔀㐀䌀䐀㈀㔀㘀㄀㈀㜀䘀㘀㄀䐀㐀　㜀䄀㌀　㌀䔀㜀㘀㘀㄀䔀䄀㔀㔀㜀　㤀䄀䌀㤀㘀㤀㌀䘀㠀㠀䘀　䘀㐀䘀㈀㄀㤀㄀䄀㜀㠀㐀䈀　䘀䐀㘀㌀　㘀䄀　䔀㜀㌀䐀䔀䄀䌀䔀㐀㤀㈀㌀㐀䌀㐀㔀䈀㜀䄀䘀㤀㄀䄀㔀䄀㠀㔀䈀䘀䄀㜀㜀　㘀㜀㌀㐀㈀䈀㈀㘀㄀㔀䄀㐀㄀䌀㌀㤀㜀䄀䄀㔀㠀㐀㌀㌀䈀䌀㐀㜀㄀㄀㤀㘀㘀䐀㄀䌀㐀䈀㄀㤀䐀䘀㈀䔀　䔀䔀䘀　㠀䔀㜀䐀䘀㄀䄀㐀䔀㘀㌀㠀㤀䄀䘀䌀㘀㔀䐀㤀䌀䄀㘀㌀㈀　䐀㐀㘀䔀㈀㜀䌀㠀䐀䘀㔀㘀㘀㜀㔀㠀㌀㔀䌀䈀䄀㄀㠀䘀㔀㄀㤀㐀䌀㄀㄀　䔀㔀䘀㈀㜀䔀䘀䈀㜀㐀䐀䔀㄀㜀䘀㌀䔀㔀䘀䔀㜀　㌀㜀䌀㤀䔀㘀䐀㄀䌀㘀䄀䘀㤀䐀䄀　䔀㘀㔀㤀㐀㠀㠀㔀㈀㘀䔀䔀㜀㘀㌀㘀䘀䔀㌀㄀㠀㘀䌀䌀㔀㔀䔀㈀㌀䈀䌀㠀䐀㔀䐀䈀㔀㤀㤀䌀㌀㄀㄀䔀㌀䔀㜀䔀㔀䈀䌀㄀㤀㔀㄀䄀䔀㤀　㈀㔀㘀㔀䔀㠀㠀䄀㤀䄀䄀䔀㌀㠀　䔀䘀㤀䘀㄀䘀㈀㤀㐀㘀䌀㔀䌀㐀㤀㤀䐀㘀䐀䈀䌀䐀䌀㠀㤀䐀㜀㜀㐀㘀　㌀㤀㔀䘀㤀㄀㄀㌀䈀㘀㄀䔀䔀㔀㜀㤀䘀㌀䔀㌀䘀㌀㔀䌀㠀䔀㠀㄀䌀䌀䈀㄀㤀䐀㤀䌀㐀䔀㄀䐀㜀䌀䔀㔀㔀䌀㠀䐀㘀㘀㌀䈀㄀㔀㐀䌀㜀䈀䘀㤀㤀䄀䔀䄀䔀㜀䄀䈀㈀㜀䈀㘀䐀㈀㈀䘀䄀㜀㌀䐀䈀䈀䄀㘀㤀䘀䔀㜀㜀㈀䈀㄀㜀䘀䐀䔀㈀㔀䈀㈀㜀䄀䘀㔀䐀㄀㘀㔀㄀㠀䘀䔀㔀㈀䐀䄀㈀㘀䄀䔀㠀㐀㤀㠀㜀䌀　䔀㜀㄀䐀㤀㠀䘀䌀㤀㔀䈀㐀䌀䘀㘀䄀䘀㠀㘀㐀㄀㘀䌀䘀㘀㈀䈀䔀㄀㤀䄀㤀䈀㈀　　㌀　䌀㄀㌀㄀㤀㤀㜀㄀㄀㌀䔀㔀䘀㐀䌀㌀㜀　䔀䘀㄀䐀㔀䈀㌀㠀䈀䌀䈀　䘀䘀䈀㈀䔀䌀㐀　　䐀㜀㄀㠀䔀䐀㔀䘀㠀㠀䄀㤀㈀䌀㜀䈀䔀䐀㤀㜀㐀㠀㤀㔀䈀䌀䘀㈀　㜀㤀㔀䐀䘀㌀㈀㔀㘀㜀㈀㤀䔀䔀㤀䄀　㘀䐀㠀䄀㈀㘀㘀㈀䐀　䌀㘀䈀㠀㄀㤀㄀䈀㠀㜀䘀㔀㘀㐀䘀䄀䔀䔀㐀䘀䌀㤀䄀㠀䄀䌀䈀㔀　㜀㄀㐀䌀䔀㐀䌀㠀䐀㄀䔀㔀䈀㈀㄀䈀䐀　䄀㤀㔀㠀㜀䈀㠀㘀䔀䔀䌀䔀㔀㘀䈀㜀㠀㐀㐀䔀㄀㈀䐀䘀㌀㔀㔀㘀㈀㔀㘀䄀㈀㠀䈀䄀䘀䔀㘀㜀䔀㠀䔀㘀㔀㠀䌀䌀䄀㤀㜀㐀䄀㜀㔀㌀䔀䔀㜀㐀䌀㌀䈀䌀䘀㜀㜀㈀䄀㜀㈀㜀　䄀㔀㐀㘀䈀䈀㜀䌀㈀㔀䔀㐀㜀㈀䌀䐀䌀䔀䘀　㤀䌀㐀㌀　䄀㌀㄀㐀㔀䈀㠀㐀㘀㘀㘀㜀㌀㘀䌀䔀㄀㜀䄀㈀䈀䌀㈀䈀㤀䐀䄀㠀䔀㜀㔀㠀䌀㐀㈀䐀䐀䐀㠀㈀㌀䐀㘀㔀㘀䄀㠀㠀䌀䈀㤀䘀㄀㌀㈀㈀䐀㤀㤀䄀㜀䄀䌀䐀䔀㈀㤀㘀䐀㌀㄀㄀䌀䄀㜀㔀㠀　䌀㤀䄀䘀䘀㠀䌀㄀䐀䘀䄀㌀㌀䘀㔀䈀䔀䔀㐀䈀㤀㘀䌀㠀䌀㘀㔀䈀㄀㌀㄀䄀㐀䘀㐀䈀㠀㌀㐀䘀㜀㘀㄀㤀䐀䌀䌀䄀㜀㤀㠀䐀㐀㐀㐀䈀㠀䌀䐀䔀䌀㔀㜀䔀䌀䌀㔀㤀㐀㜀㐀䘀䘀㈀㤀㔀䈀㄀㘀㤀㌀䌀䄀㈀䘀䈀㘀㘀㜀㠀䌀㜀㌀㈀䈀䔀㌀㈀䈀㘀㜀㌀㠀䌀㄀㌀㌀㤀　䘀㤀㈀䐀㐀䈀㐀㄀㐀㐀㤀㤀䄀䈀㤀䈀䌀䈀䘀㈀㠀　䌀㈀䘀㜀㜀䌀㠀䔀䘀㌀㤀　㘀㈀㘀㜀㘀㐀䐀䐀䌀㌀㌀㐀㐀㌀㌀䈀䄀㜀䈀䘀䌀䌀䔀㜀㤀㠀㄀䌀䌀䈀㜀㈀䈀㔀㐀䐀䐀㄀䔀　䘀㈀　䌀䌀䌀　䔀䌀㠀㜀㘀㘀㔀㈀　㈀䔀㈀㤀䔀䐀㘀㐀䌀䄀㤀䔀㔀䘀䄀䔀䌀䘀䘀䔀　䈀㜀㠀㄀㄀䄀㜀㔀　㌀䈀䌀㜀㜀䐀㔀　䈀㄀㌀㤀㌀㄀䘀䐀䐀㄀䌀㤀㘀䈀㐀㘀㤀㄀㌀㘀䘀㈀㄀䄀㤀㤀䘀㈀㜀㄀㈀㐀㘀䔀䐀㔀䘀䄀㄀㔀㤀㤀䌀㤀㠀䐀䌀㄀䘀㠀䌀㔀䈀䌀㈀㔀䌀䌀㠀䔀㔀䐀㘀㈀䐀㄀㤀㄀䐀䈀㜀㤀　㤀㌀㐀䔀䄀䔀㐀㔀㘀䄀㘀䘀䘀㄀㈀㌀䐀㜀㌀㈀㔀㠀䔀㜀䘀㘀㈀㌀䌀䄀䔀㜀䐀㜀䈀䘀㤀㜀㔀䈀㄀䐀䔀㔀㜀䐀㜀㘀䔀䘀㤀㤀㜀㘀㤀䈀㜀㄀㠀䔀䐀㈀䘀䈀䘀㤀䄀㔀㄀㐀䐀䐀㘀䄀㜀㠀㤀㜀㠀䌀㜀䔀　㤀䄀䘀㈀䈀㘀䄀㘀㔀㘀䌀䐀㤀㐀㈀㔀㠀䄀䘀㄀㌀　㤀䘀䔀䈀䘀䈀㐀㄀㌀䔀㐀䈀㔀㜀䈀䌀㄀䌀㐀㤀㤀　㄀　䄀㘀䈀㜀㘀㐀　䔀　䐀䔀㌀㘀㠀㔀㌀㄀㘀㔀㘀㠀㘀㜀䄀㌀㌀㠀㜀㈀㔀䄀㈀㔀㠀䄀䄀䐀㄀㌀㠀㈀䘀㄀㌀㜀㔀㠀㤀䌀䌀䌀㌀㐀㈀㠀㔀䔀㌀䌀㌀㜀䌀㤀㔀䘀㐀䌀㜀㘀㄀㠀㠀䄀䐀䔀䈀㐀䈀㘀㔀䔀㤀䌀䘀䄀㜀㘀䄀䄀㈀㠀㔀㤀㜀䈀㄀㐀䌀䈀㐀㌀㐀㤀㜀䌀䄀䘀㐀㄀㐀㈀㔀㜀㘀㜀㈀㌀䄀㘀䔀䘀䐀　䈀䘀㤀㄀㠀䈀㌀　㘀䌀䌀㄀䈀㄀䌀㔀　㈀㠀㄀㌀㐀㤀㠀　䄀　㤀㌀䘀䘀㘀㘀㜀㌀㐀䔀䐀㄀䄀㔀　䘀㜀䈀㜀㐀㈀㐀䐀㠀㠀䔀㤀㄀㌀䘀䄀㄀㠀䘀㘀㔀䌀䐀䐀䘀䌀㤀㌀㄀㠀㠀㔀㤀䈀䌀㌀㤀㤀㜀㘀㠀䘀㄀㜀㘀㄀䌀㜀㄀㤀　㘀䈀㤀䌀䄀䈀䘀䈀䐀㜀䈀㈀䘀䘀㄀㜀䈀㌀㌀㈀㔀㌀䘀㐀㠀㤀㔀㤀䈀㈀㈀㤀㄀䄀㈀㔀䔀䄀㤀㐀㐀䈀䄀䘀㄀䄀䔀㘀䈀䄀㐀㈀䔀㘀䐀㔀㘀㘀　㔀䔀䘀䄀䈀䐀䈀䐀䌀䘀㘀㈀䘀䔀　䔀㠀㔀　㄀䌀䘀䈀㘀㄀㈀䔀䄀㔀　㌀㜀䌀㜀㐀㜀㤀㄀㔀䌀㤀㤀㘀㌀㜀䐀㄀䄀㈀䘀䘀䄀㔀㄀㈀㄀　䈀㌀㘀䘀䈀㔀㘀㐀㌀㄀㘀䘀㔀䐀㐀㄀㤀㘀㘀　䄀㤀　㔀䄀䐀㘀㔀㈀㌀䄀䘀䄀㤀䌀㌀㌀䄀䔀㘀䈀㜀㌀㘀㘀㈀㐀䈀㌀㌀㤀㘀䄀䄀䈀㄀䈀㘀㄀䄀㘀䈀㜀㈀䈀　䌀㜀㈀䄀䄀㔀㌀䐀㠀㜀㜀㌀䄀䄀㠀㔀䐀䈀䄀㄀㔀䄀䔀䌀䐀㜀䌀㐀㘀䐀㤀䌀㌀䌀㐀㘀㈀㌀䘀䔀㘀䔀䌀　䘀㈀㄀䄀䄀䔀䔀㌀㤀㘀㄀　㠀㤀㤀㜀㔀㤀㘀㤀㈀㤀䘀㘀㘀䘀䌀　䈀㄀䐀㠀䈀㔀㠀䈀㐀㤀㈀䈀㤀䘀㘀㌀㌀㄀㠀䔀䈀㘀㠀䄀䘀㜀㘀䌀䔀㐀㘀㌀㈀䘀䌀㜀䐀䄀㘀㔀䘀㠀㜀㜀䈀㄀䐀㈀㠀䘀㔀䐀䈀㄀　㠀㘀䈀㤀䄀䈀　䌀䌀䘀㈀㌀㔀㔀䌀　䈀䌀䄀䘀㌀㌀㔀䔀　㔀㔀㜀㈀䈀㐀㔀　䄀㜀䐀㠀㐀㐀㄀㤀䐀㈀䐀㔀㔀㠀㈀䘀䌀㔀㌀㄀䈀䌀㄀㐀䄀䄀㌀䄀㌀䔀㘀㌀　䌀䈀㈀䔀㔀㔀㠀㘀䄀䌀㐀䘀㄀㘀䈀㤀㔀䐀㘀㈀䄀㄀䌀䈀䈀㠀䔀㠀䘀䌀㜀䔀　㘀㜀䘀㌀㈀䘀䔀㄀䘀㤀㠀㘀㌀㠀㤀䌀㐀䈀㄀㐀㐀㠀䄀䈀㌀㠀㠀䐀䐀㠀䌀㠀㘀䌀䌀䌀㐀㔀　㠀䐀㄀㌀㈀㔀䔀㘀㈀䈀㔀㐀䐀䘀㠀㜀㜀㈀㔀䘀㘀㔀䈀䌀㔀䔀㜀䄀䘀䔀㈀㌀㠀䌀䈀䐀　㌀㘀㜀　㄀䌀㤀㘀㘀　䈀䈀㠀䌀䌀䈀㘀㈀　䔀　㄀㤀䈀䈀㤀㐀　䌀㄀㔀㔀䔀䔀䌀㜀䔀㠀䐀㌀䄀䌀䈀㐀㌀　㄀䔀㌀㄀䘀㠀㤀㘀㘀㄀㤀䄀䌀㈀䄀䄀㠀䄀䐀㌀䄀　㤀㘀㐀㌀㌀㌀㐀㔀䈀䘀㐀㔀䘀㠀㜀㜀㈀㔀㐀㈀䌀䔀䌀㘀䄀䘀䌀㄀䐀㘀䐀㔀䐀䌀㐀㈀䄀䌀䌀　㈀䈀䄀䈀㌀㤀䄀㘀䄀䈀㌀㠀䘀㔀㄀㘀㈀䈀㌀㐀㘀㌀䐀㠀㈀䔀䔀㌀䄀㔀㈀㤀䄀䌀㘀㐀㐀䔀㈀䐀䔀㈀䐀㠀㌀　䄀䄀㌀㈀㄀䄀㔀㐀㘀㌀㜀䔀㌀㤀䘀䔀䐀㐀䌀㐀㘀㤀䐀㜀䌀㠀㜀䘀䌀䈀䈀　㌀㐀㈀㘀㠀䌀㜀㘀㈀㤀䔀䐀㔀䄀㜀㠀䘀䈀㔀㐀㈀䘀㄀㤀䈀䘀㈀䄀䔀㔀䘀㜀㈀㈀㐀䔀䈀㤀㄀㔀䈀䌀㈀㐀㜀㌀㘀㌀㄀㄀㈀䘀䄀䐀䔀㘀䈀䌀㘀㈀䄀䐀䘀㤀　䄀㈀䘀㄀䈀㌀㤀㄀䔀㤀㜀䌀䘀䐀䄀䌀㈀㈀㔀㜀㄀㌀㄀䔀䘀㔀㔀䌀㔀㌀㄀㔀䔀㄀㔀㤀㜀㤀　㈀㔀㔀䌀㜀䄀㘀㔀䔀㠀㘀㌀䐀㈀㈀㤀䌀䘀䈀㄀㈀㈀　㄀㄀㈀㜀㤀㌀䔀䌀㘀䐀䈀㐀㐀㔀㠀㘀㈀㔀㈀㈀䐀䘀䐀㠀㤀㌀㔀㈀㈀㠀䘀㄀㈀㘀䈀㘀䘀㔀㈀㌀㠀㜀䐀㈀㔀㔀䐀㄀㠀䐀㔀䄀䈀㌀㠀㐀䐀㄀㠀㔀䌀䄀䈀䔀㈀㌀㌀㜀䘀䐀㄀䌀㠀　㔀㠀䘀㐀䄀㈀㔀㐀㔀㈀㔀䄀㔀䐀㈀䔀䄀㤀䔀㠀㠀䈀㐀㜀䌀㜀　㘀　㜀　㘀㐀䐀㜀䈀㘀㠀㠀䈀㐀㘀㠀㜀　㘀㠀䐀䈀䔀　㔀　䘀䈀㐀㠀䔀䘀䔀　㐀　㠀㄀㔀㐀䐀㔀䐀䘀㈀䘀㌀㔀䘀㘀㜀㘀䘀㜀㠀䌀　䌀㐀䈀㠀䐀㤀㄀䔀㄀䌀㠀䐀　㠀䔀㐀㠀㘀㜀㠀㄀㘀㐀㌀㈀䐀㔀㐀㘀㌀㘀　䘀㐀㔀㜀㘀㐀䄀㈀䈀䈀㘀㐀㔀　㘀䘀䔀䄀㌀㔀䐀䄀䈀䘀䈀㠀䐀䔀㌀䄀䄀䔀㈀㜀㜀㘀㜀䐀㘀䔀䈀㌀㄀䔀㌀䘀㔀䔀䔀㄀㘀䄀㤀㘀䐀㜀㠀㐀　䈀㜀㜀䐀㘀㠀㘀䌀㜀㔀䈀　䐀㌀䄀㘀㔀㔀䐀䄀　㐀㔀䄀䌀㘀䘀㘀䐀㠀㄀䔀䈀㈀䐀䔀䈀㔀㘀㘀䐀㜀㜀㘀　䌀㠀㠀㘀䄀㜀㘀㘀㜀䐀㘀㌀䈀䌀㤀㜀㠀㘀㘀㌀㔀㌀㌀㤀䈀䔀䐀㈀㘀㠀㔀㐀　㐀䈀㔀㌀㔀䄀䄀　䔀㈀㈀㌀　㤀㘀䄀㤀䄀㠀㈀㤀　㈀㠀䘀　㠀　㐀㐀㜀㤀　　　㤀㈀㐀㠀㐀㐀㠀䐀䈀㄀㐀㠀㤀㐀䘀䐀㄀䈀䘀㠀　䌀㜀䈀㘀㘀㤀䄀㄀㠀㤀㐀㌀㔀䈀䈀䔀䌀㈀䔀䘀䐀䔀㤀㤀㜀㔀䈀䌀㘀　㈀㈀㔀䔀㄀　㈀　㘀䐀㄀㐀䌀䘀䘀䌀䔀㘀䌀䌀䈀䐀䔀㜀䔀㌀㜀㜀䌀䔀䈀㤀䔀䈀㜀䈀䐀㜀㔀㔀㌀㘀䄀㜀㘀㠀㜀㘀䘀䐀㜀㘀㐀㐀㔀䐀㜀䘀䐀䐀䄀㤀䐀㌀䈀䄀䐀䘀䔀䄀　㘀㘀䌀　䔀㘀㔀䔀䄀䘀㜀䔀䌀䄀㔀䈀㜀䈀㄀䐀䈀㌀䔀㠀㔀㄀䄀䄀㘀䐀䈀㘀䄀䐀㈀　㔀䐀㌀䄀䈀䘀䈀䘀㔀㈀㌀㤀　㜀䔀䌀㠀㘀䘀㜀䄀㜀㐀䄀㄀㘀䐀㠀㔀䌀䌀㔀㈀䈀㔀䔀㤀㠀㐀䐀㐀䐀䐀䄀䔀䄀㜀䔀㄀　㜀㜀㐀䐀䄀䄀㤀䈀㤀㐀䔀䐀䐀㜀㐀㘀㤀㘀㈀㄀㄀㘀㌀㜀䌀㄀㠀䄀㔀䄀㄀䐀䘀　䔀䔀䄀㌀㘀㘀䔀㠀䐀䄀㠀㘀㌀　㘀㌀㘀㘀䐀㜀䈀㤀㘀㄀䐀䐀　㠀㠀䌀㔀䄀㄀㔀㜀㘀㤀䐀㄀䄀㤀䐀䈀㔀䔀㘀㠀㄀䘀䄀　䄀㄀㘀䐀㔀㌀㜀䈀䄀㌀㘀㘀㔀䈀㤀㘀㘀䐀㔀㄀㌀㜀㤀㘀㔀㈀䌀䈀　䔀䔀䈀㠀㄀䐀㌀㘀㈀　㄀㜀㈀㄀䈀㤀㘀㄀䐀㤀㤀㠀䔀㄀䈀㐀䔀䄀䄀㠀㄀　㌀㐀㌀䈀　㘀　䐀㈀㈀㠀㌀　㈀䐀㜀䈀䌀㌀　䌀㠀䔀㔀　䈀䘀䘀㄀䄀䘀䐀㤀䔀㤀　㤀䘀㜀䌀㜀㌀㌀　䐀㜀䈀䈀䐀䔀䐀㤀䄀　㄀㄀䐀㔀䘀㜀㐀䔀䄀㠀㄀䌀䘀㔀䌀㤀䈀㔀㠀䈀㄀㠀㌀㤀　㤀㤀䐀㤀㌀㜀䈀㤀䔀㜀㘀䔀㌀䔀㘀㠀䈀㄀䈀䄀䄀㔀㠀㤀㄀㌀㌀㜀㄀䈀㤀㠀㄀䐀䌀㜀㔀䈀䄀㜀䔀㔀㐀㘀　㌀䐀䔀䐀㄀䘀㜀㔀㄀䌀㌀䄀䘀㌀㤀㄀䔀㈀䐀㌀㤀䘀㔀䄀㘀䔀䘀㤀䄀䄀㄀㐀㈀㤀㜀䌀䌀㈀㠀㜀　䔀䄀㠀䔀㐀㤀㈀䈀㈀㘀㠀䘀㌀㄀䄀㐀㜀㜀䐀䌀㜀䈀䌀䘀㤀䐀㔀䈀㄀㘀㘀㠀䐀㠀㘀䔀䈀㔀㔀䌀　㜀䐀㄀㌀㔀㜀䌀㈀䘀㤀䄀䄀㐀㘀䈀㜀䔀㤀䈀㘀䔀㤀㠀㔀䐀䐀䄀㐀㘀㤀䌀㄀㄀㘀㌀㤀㐀㠀㤀㘀㤀䔀㐀䐀㌀㜀䄀㘀　㤀䈀㤀㄀䄀䐀㔀　䌀䈀　㤀㔀䈀㘀　㔀㤀䄀㄀䄀㘀㘀㜀䐀㄀㔀㘀䔀　䔀　㘀䐀㄀䐀㐀㌀㘀䌀䐀䌀䌀䐀㤀　䈀㘀䔀䌀㘀　䌀㌀㠀㤀㈀㈀䄀㠀䄀䈀㜀㔀㌀㤀㤀䈀㌀䐀䌀䔀㈀㈀䈀䌀　　䘀㔀㐀㄀　䘀㌀㐀㤀㠀　㔀㠀㔀䐀䐀㌀㤀䔀㜀㔀䈀䔀䔀䈀㐀　㈀䐀䘀㘀䄀䐀㜀㈀㌀㠀㔀䈀㈀㔀䄀䌀㄀㔀䌀㠀㔀䌀䐀䔀㤀㄀㤀㐀　㘀　㤀䐀㈀㘀㈀㈀䐀䈀䔀㘀㔀㤀　㜀㐀㘀㄀䐀䄀䘀䔀䔀䈀㘀㈀䐀㔀㘀㔀㠀㌀䐀䔀䘀㜀䐀䌀䘀䔀䐀䐀㈀㜀㄀㘀㜀㈀㈀䌀䔀䐀䐀䈀㘀䔀㄀䐀　㜀　㌀䐀㘀䘀䔀㌀㔀㐀㌀㌀㌀䔀　㌀㌀䈀㘀㐀䈀䌀䈀㄀㌀㐀㔀䐀㌀㌀䌀　䄀㘀㘀䘀䔀㤀㌀䄀䌀　㄀㤀㄀㠀㜀㜀㘀　㈀㔀䈀㈀㌀㜀㔀㠀㐀䔀　㌀　㜀㔀㘀㈀䐀䈀䘀䔀㌀䈀㤀䈀䔀㘀㤀䘀㔀䈀㌀㘀㜀䌀㘀㔀㐀䄀㄀䌀㐀㄀　㠀䔀　䘀㔀㌀䈀㠀䈀㘀䄀㌀㄀㘀㐀䄀䐀㔀䈀㈀㔀㤀㤀㠀㘀䌀㐀䌀䐀㌀㜀㘀㔀䈀䘀䐀㠀䌀䄀㈀㜀䐀䈀䌀㘀䔀㌀㈀㤀䌀㈀㔀　㐀　䄀䌀㄀㐀䘀䐀㌀䄀㤀㌀㤀䘀　㜀㤀㌀㈀㤀䈀㘀㔀㠀㔀䐀㔀䘀　㔀䐀䐀㜀䔀㜀㈀㔀㤀　㔀　䄀䐀䐀　㤀䄀㄀㤀䌀㈀㔀㜀䐀䘀䐀䈀㈀䄀䔀㜀㔀䔀㄀㈀䌀㘀㤀䈀㔀㄀䐀㐀䐀䄀㌀䘀㌀㔀㘀㔀㜀䈀㤀㌀㄀䐀䔀㜀㠀㠀䐀㌀䈀㈀㈀䐀䌀㜀㤀䌀䘀㐀㠀㌀䘀㔀㈀㤀䘀㘀㌀㐀㠀㔀㤀㄀　䘀㈀㐀㠀㔀㌀䘀㠀㄀䘀㐀䘀㈀䈀㈀　㠀㤀㤀㘀㌀㐀䌀䌀䐀䌀䔀㤀䐀䈀䄀㔀㌀㠀㜀䘀䐀㌀㘀㄀㤀㔀㄀㘀㐀㈀㌀㔀䔀㘀㘀㌀㐀㄀䘀䘀㘀㄀㄀㄀㌀䄀㌀䌀㘀㌀䔀㘀䄀䈀䈀䔀㠀㌀䔀㐀䔀㜀㜀㜀䘀㈀䘀㌀㌀㈀䄀䘀䈀䈀䄀㌀㤀㤀䈀㔀䐀㘀㈀䌀㤀　㤀㜀㤀䘀㔀㈀㌀㘀䔀㔀　㘀　㘀㌀䐀㘀㜀䄀㘀　㠀㈀㄀㤀㐀䈀䄀㄀㠀䐀　　㤀䐀㠀㤀䔀䄀䄀㤀㌀㜀䌀䐀㘀　㄀䐀㌀㄀㌀㌀㠀䔀䌀㄀㄀㔀㌀㈀㠀䄀䔀㤀䐀㐀䄀䘀䄀㄀㈀㌀㌀䐀㐀㘀㠀䄀䌀㤀㔀㜀㤀㌀㔀䔀㤀䐀䘀䐀䘀䈀㔀㄀㌀　㠀㜀䌀䌀㌀　䘀㐀䐀㄀㌀㤀䄀䌀㌀䔀㈀䌀䈀䘀䐀䔀䐀䔀㐀　㐀㘀䌀䌀䈀㠀䔀㤀㄀䐀㄀㜀䌀䌀㠀䌀㌀㌀㠀䐀㜀䐀䐀㄀䐀㈀㐀䄀䈀㈀㤀䌀䈀䌀㌀䌀䌀㄀㌀䐀䈀㈀㘀䌀䈀㘀㄀䔀䌀㐀㜀㤀䐀㠀㜀㄀㄀䌀䔀䐀㌀㠀㔀㄀㤀㌀㠀㤀䈀㜀㤀㔀㤀䈀㤀㈀㤀㐀㄀䈀䘀㌀䈀䔀䘀㜀䐀䄀㜀㔀㔀　䄀㜀䈀㄀㘀䐀䄀㘀㈀䈀㠀㠀㄀㜀㔀㐀㔀㠀䔀　㐀䐀䌀㐀㈀㈀㔀㐀䔀㠀㠀㘀㘀䘀㌀㤀　䐀㜀㘀䈀㜀㌀㤀㈀㄀䄀䐀㌀㘀　㈀　䄀㤀䈀䈀䌀㘀㄀䄀㄀䈀䄀䐀㘀㘀㘀䌀䐀㄀䈀㌀㈀㘀㄀㔀㈀㈀㔀㠀㠀㜀　　䄀㠀㄀㠀㜀㌀㘀㔀㘀㘀㠀㘀㠀㘀　䈀㤀㐀䔀㔀㠀䐀䄀䐀㄀䐀㔀䈀㠀䔀㄀㘀㄀㌀㈀㘀䔀㤀䄀㠀㐀㘀㤀䔀䔀㐀㐀䄀㜀䔀㤀㘀䘀㔀䌀㈀㜀㐀㘀䐀㘀　㘀䔀䐀䌀　㠀㌀㌀㌀㌀㘀㔀㜀㘀　䘀㤀㔀㠀㜀㘀䈀㤀㈀䘀㠀㜀䔀䐀㜀䄀䐀㐀㈀䈀䈀　㘀䈀㜀㔀㠀䌀䔀㈀䈀㜀㄀䌀䐀䔀㜀㠀䘀䈀䔀㌀㄀㈀㌀㜀㘀䈀䘀䔀㔀㄀㜀䈀䐀䈀䄀㜀　㈀䐀㘀㌀䘀䐀㘀㌀㈀䐀䌀㄀䘀䐀㘀㘀㐀䄀䐀㘀䈀㤀㔀㤀㈀䈀䌀　䄀㤀䈀㈀㘀䄀㈀䄀䄀䐀㤀㜀䐀㤀䐀㘀䈀㘀䔀　䈀㌀㐀㘀　䔀㘀䌀㌀　㠀䌀㔀䌀㐀㄀㘀㔀䔀㌀㐀㘀䘀䐀䌀䔀㠀䐀㜀㈀㌀㠀　䘀㔀䐀䈀㠀㈀㐀㘀㈀䈀䔀㔀䈀㤀䔀䄀䄀䄀㘀䄀㘀㠀㔀㐀䄀䘀䐀　㈀㔀䄀㌀䈀䌀䄀㈀䌀䘀㘀䄀䈀㌀㜀㐀䈀㜀㔀䄀䌀㄀䘀㌀㘀䔀㠀㔀䄀䔀䔀䄀䐀㔀㠀㔀䘀㈀㜀㈀㤀㔀㘀㈀㠀㐀䄀㄀㤀㘀䄀䄀㘀䈀䈀㐀㌀䌀㐀㜀䐀㔀䐀㈀㄀䄀㌀䐀䄀㠀㤀㜀㘀㘀㄀㔀䄀䄀㄀䐀㔀䄀㌀㈀䈀㐀㐀䄀㠀㔀㤀㘀　䐀䄀䄀㈀䘀㈀䔀㄀㔀㜀㔀　䐀㌀㈀䈀䐀㌀㐀㔀㌀㔀䌀㤀䔀䐀㔀㐀䈀䘀㌀㜀㐀㄀䄀䘀㌀㐀䄀㘀㔀㜀䌀䘀㠀䔀㠀䔀㠀㐀㐀㈀㠀䄀䐀㤀㘀㈀㤀㌀㌀㤀㠀䄀㠀䐀㈀䈀㔀　䄀㔀㌀䈀㘀䄀㠀㄀㤀㌀㌀　䈀㜀㠀㔀㐀䄀㜀䘀㔀䄀㈀㔀䔀㔀䐀㔀㌀䔀㠀㤀䌀㔀䔀㈀䐀㌀㄀㤀䐀㜀㌀㔀　䄀䄀䐀㈀㈀㔀䐀㔀䄀㠀䔀䄀㌀㌀䌀䈀㐀㔀䐀㔀䄀　㐀䈀䌀䈀䌀㘀㔀㈀䈀㤀䄀㈀䌀㄀䘀䌀㈀䌀䐀㐀㤀㘀䘀㐀䐀㈀㤀䌀　㄀㈀䈀䐀䄀䄀㈀㔀㘀䄀䄀㐀䔀䌀㈀㈀䄀㘀㐀㔀㐀㔀䈀䌀㄀　㌀䄀䐀㈀䌀䄀㠀䌀㔀㈀㈀㌀㜀䄀㔀㈀䔀䌀㌀㜀䈀㠀㌀䘀䈀㌀㜀㔀㌀㔀䔀㔀䄀㌀㌀䘀㐀䘀㤀㠀㔀㈀䄀㔀䐀㈀㠀㄀㜀㘀㜀㌀㔀　㠀䄀㜀㌀㔀㜀㠀䄀㘀㐀䔀㄀㜀䈀㔀䐀㠀㄀㐀㠀㈀㤀䄀㈀㤀䄀䄀䘀䄀䄀㈀㐀㈀㘀㜀䐀㔀㐀㔀㜀㔀㔀䔀䔀㌀䈀㌀䌀䄀䐀　㘀㈀䘀　㘀㄀㠀㤀㜀㜀䄀䈀　䈀㄀䄀㄀㜀䌀㄀㤀䔀㠀䄀䘀䘀㌀㌀㔀㔀䈀䐀㔀䌀㘀㈀㘀㄀䌀䌀㤀㐀㐀䈀㔀㔀　㌀㠀䘀　䄀䄀㈀㌀㐀䄀䄀㔀䈀㔀㌀㔀㜀䘀㔀㠀䄀䄀㘀㔀　䐀㔀䐀　㈀䈀㠀䌀㤀　㌀㤀䄀㌀　䌀䘀㔀㠀䌀㐀䔀䌀䌀㈀㠀㜀㌀㈀㔀㤀㠀㔀㜀䐀㈀㘀㈀㈀䐀㠀䌀㘀䄀䐀䄀㤀㜀㄀㄀　䌀㘀㄀䌀䘀䌀䈀㄀㔀䔀䐀㤀䄀㈀䘀䈀㌀㤀䄀㔀䄀㠀㐀䄀䔀　䄀㤀䈀䈀䌀㜀䐀䘀　㈀㐀㜀䔀䄀䘀䘀㄀䘀㤀㄀䔀㠀㤀䔀䐀㔀㜀㌀䌀䈀䔀㄀㜀䄀㤀㤀㄀㘀䔀㈀䄀㠀䈀㄀䐀䌀㜀㘀㄀㌀䌀䈀䘀䌀㈀㜀㜀㐀䈀䈀䐀䘀㜀㤀㔀㘀㐀㜀䘀㘀㌀䘀㄀㌀䐀㠀㤀㈀㔀㤀䔀㄀㔀䈀䘀㈀㜀䘀䔀㔀㠀䘀䌀　㤀㜀䔀㜀䔀㈀㠀䘀䔀㐀㠀䘀䌀㐀䔀䐀䘀㌀㜀㐀㄀䘀䘀䄀㤀㘀䘀㤀䘀　㘀㘀㜀䔀䐀㠀㌀䈀㌀䘀㘀䌀㄀㔀㤀䘀䈀㜀䘀䘀䘀䄀䌀㌀䐀䘀䔀䈀䔀㜀㐀㜀　䐀䔀䘀䔀䘀䘀㜀㤀䐀䔀㄀䔀㘀㜀㘀䘀㜀　䔀㘀㌀䔀㌀㠀㜀㌀㄀䘀㤀䌀䈀㤀　䘀䌀䔀䐀䌀䘀䘀㜀㄀㌀㔀㄀䘀㤀䌀䈀䈀䘀㜀㤀䘀䈀䈀䘀㜀䐀㠀㄀㤀㤀䌀䈀䐀　䘀䌀䔀䐀䔀　㜀㘀㜀䔀䘀䘀䘀㘀㌀㘀㜀䔀䘀䐀䈀㜀㘀䈀　㈀㘀䘀䘀㠀䌀䔀㠀㌀䐀䘀䘀㠀䔀䔀䘀㘀㠀䔀䐀䈀䔀㄀䐀䄀䔀䐀䐀䈀㜀㠀㜀䔀㔀䈀䈀䐀㠀䘀㐀㜀䈀䐀㌀㜀㜀䄀㐀　䘀䄀㘀䔀㜀䐀㌀㄀䘀䌀　䘀㔀㔀䔀㠀䌀㌀㘀䈀㄀䘀㈀䈀㄀䐀䘀䐀㌀䔀㌀䘀㔀䄀䄀㤀㤀㜀䄀㈀䔀䘀㔀㜀㔀㤀㄀䘀　䘀㔀㤀㌀䔀䐀㘀䘀　㌀䘀䔀㔀㜀㘀　㐀䌀㐀㜀䘀㈀䘀㜀䔀㌀㠀㐀㔀䌀䐀䐀㐀䐀䌀䔀㤀　㤀䐀䘀䘀䄀㔀㤀㈀䘀䈀㌀㠀䘀䈀㘀䈀㘀䔀䌀䈀䘀㔀䐀㘀㄀㌀㜀䌀㘀㌀㄀㠀䔀㌀䘀䈀䘀　㜀㌀䄀䈀㄀䄀㘀䌀㜀㠀　䄀㤀䐀䔀㤀　㘀䄀䔀㐀㈀䔀㜀　㌀䘀䈀㠀㠀㐀㈀㠀䈀㘀㘀䔀㐀䄀㤀㠀㄀㔀㤀㔀㌀䔀㠀㌀䘀䈀䘀㘀㌀㈀㜀㜀㌀䘀㄀　㠀䄀䔀㜀䐀㄀㐀㠀䄀㐀䘀　䄀㐀䘀㄀㈀　㄀㤀㄀㄀㌀䔀㄀㜀㌀㈀㐀㈀㔀㜀䌀㔀䔀㜀㠀㠀䄀㠀㠀䌀㈀㔀㤀䔀㄀㈀䌀䘀　䐀㌀䌀㈀䐀㌀䌀　䔀㜀㠀㐀㜀㌀䌀　䌀䘀　㠀㔀䘀　㔀䘀䔀㤀䄀䘀　　㜀䔀　㌀㜀㠀㔀䈀㜀㠀㄀䐀䘀㄀㄀　䈀㈀㐀㈀㔀䐀䔀㈀　䐀䔀㐀　㐀㐀䘀㄀䐀䐀䔀㈀㄀䌀䘀　䈀䌀㜀㠀㄀　䈀㠀㈀㠀㜀䔀　㈀䘀㠀㠀㐀㜀㠀㠀㈀　㠀䔀㈀㈀㜀䌀㔀㐀䐀䔀　㈀䈀䔀㈀㔀䘀㠀　䘀䘀㈀䄀䘀䔀　䐀䘀㠀䄀䄀㜀㠀㤀㔀㠀㠀㘀㤀㤀㈀　䔀㐀㤀㈀䄀㄀䐀䄀㔀㈀㌀䔀　㜀㘀䈀䄀　䈀㜀䌀㈀䌀㜀䐀　䌀䘀㠀㜀㠀䘀䄀㠀䈀䌀　㔀䘀㐀䄀㜀䘀㄀㤀䘀㠀㔀㐀䘀䄀㄀㐀䘀　䔀㤀䘀㐀㘀㤀䔀　㌀㌀㐀㌀㜀㜀㤀㈀䐀㐀䐀　䐀䔀䄀㄀䈀䈀㠀㠀㌀㠀㜀㐀䘀㜀䐀　㌀䔀䔀　㜀䈀㠀㘀　䔀　　䈀䘀㌀䘀㌀㌀㐀䈀㔀㈀㄀㤀㈀䐀　㌀䈀䈀㤀㤀㘀㈀㘀㘀㄀㄀䈀㠀㤀㐀䄀㤀　　㔀㜀㌀㌀䌀䈀䌀　㈀䈀㤀㤀㔀㔀䔀　㐀㌀㤀㤀㐀㌀䌀　㘀䈀㤀㤀㠀䘀　　㜀䘀㌀㐀㄀㌀　㄀䈀㜀㌀㌀㘀䐀䔀　䄀㌀㤀㤀　䔀䘀　㠀㌀㤀㤀㐀㜀㠀㤀㤀　㌀㤀㤀㤀㜀㤀　䌀䘀㠀㌀㌀㤀㤀䌀㜀㠀㄀㤀䘀㄀㠀䘀䔀　㘀㐀㤀　䐀㌀䘀㌀䈀䘀䌀㈀䌀㄀㄀㠀㜀䈀䘀㌀㤀䘀䌀㜀䐀䔀　㄀䘀㐀㠀㈀䄀㄀㄀䄀㐀㘀㤀䔀㤀㈀㄀㈀㈀㐀䄀㄀䘀㤀㜀㄀　㤀䐀㜀㐀㐀㈀㌀䄀　㜀䘀䌀㠀䌀䘀㐀　㘀䘀　䔀䘀䄀㔀㐀䐀䔀　㈀䈀㈀㌀䈀　㌀㈀䈀㈀㌀㘀䐀㈀㈀㄀䔀㈀䌀㠀㠀㌀䘀㈀　㠀㐀㤀䌀㤀䔀䘀㤀㈀䈀㌀㐀㐀㤀㐀䌀㜀䔀㐀㜀㄀䔀　　㤀㜀㤀㈀䘀䘀　㔀䐀䘀㈀䈀㜀㠀　䈀䘀㈀䐀㜀䘀㄀㜀䘀㠀㌀㤀䘀㤀䄀㜀䌀　䔀㜀䔀㔀㄀㜀㠀　㔀䘀㤀㐀㜀䘀　䔀䘀䌀　䈀䘀㤀㤀㜀㐀㐀㤀　㜀䘀㈀㔀䈀䘀　㈀䘀䌀䄀䄀䘀䌀㌀䄀䔀㐀㘀䘀䌀㠀㤀㜀㠀㄀㌀㜀䔀㔀㌀䘀　㈀䈀䘀㈀㔀䈀䘀　㔀䘀䌀䈀㘀　䌀䔀㘀䔀㔀㜀㜀䔀㐀㌀䘀　㄀䘀䘀㄀㤀䌀㤀㄀㌀㐀㜀㔀㌀䄀㌀䌀䘀㤀㌀䐀㐀䔀㠀　䈀䄀㌀㈀䘀　㄀䘀䘀㘀䌀䘀㐀㄀㈀䘀　䔀㔀䐀㄀㐀䐀㈀㈀㠀䌀㔀䔀䌀㤀䔀㘀㐀㤀㈀䄀㔀䈀䌀㠀䔀䔀㈀㈀㘀㈀䘀㘀㌀䐀䐀㤀㄀㔀䔀　䐀㔀䔀䌀䌀㜀㠀　㄀䘀㄀㠀㠀㌀䐀䐀䈀㄀䘀㌀㘀㌀䔀㜀㠀㤀㌀　䘀㘀㜀䌀䔀䔀㘀㘀㤀㈀䌀䄀䔀䐀䌀䄀䐀䐀㐀㈀㠀㐀䐀䌀䄀䐀䈀㤀䐀䈀㠀㠀㤀㠀䐀䈀㤀䐀䈀䈀　䘀㤀㈀䘀䈀㜀㌀䘀㜀　㌀㜀䘀㌀　䘀㜀㘀䈀䔀　䐀䘀䔀㐀㔀䔀　㔀㜀䔀㈀䐀㜀㜀㄀㄀㘀㌀㔀䔀䌀䘀䈀䐀　㤀䌀㤀䄀㔀䐀䌀㘀㔀㐀㠀㌀㘀䘀㌀㈀㈀㐀㤀䔀㔀䐀㌀䘀㤀㌀㐀㄀㄀䘀㌀㐀㌀䘀㤀㈀㄀㈀㈀䔀㐀㌀㌀䘀㤀㘀㌀㤀　㄀䌀䌀䘀㄀䘀㠀㜀䔀㐀䄀㄀㌀䌀㜀㈀㤀㜀㌀䘀㤀䐀㐀㜀䔀䔀䘀㈀㘀㜀　䄀㠀䘀㤀㈀㔀㐀䔀㄀㘀㐀　㄀㌀㤀㈀䐀㤀䌀㈀䄀㐀　㔀䔀㌀㠀㔀䐀㌀㠀㐀㌀㠀㐀䌀㈀㔀㜀　䄀㄀㜀㔀　㠀㌀䔀㤀䄀㐀䌀䔀　㔀㜀㈀　䈀䄀䘀㠀㜀䈀㠀㄀㈀䔀㈀㄀䄀㐀㠀䈀㈀　䘀䔀㘀　䐀䘀　㔀䌀㤀㔀㤀　㐀䐀䔀㤀㤀　　㐀㤀䔀䄀㔀　䘀㐀䈀㠀㠀㐀㔀㌀㈀䄀㔀㌀䄀䄀䔀　䐀䄀㤀㠀㔀䔀䈀㔀㄀䄀㤀㠀䈀䔀䈀㌀㄀䔀㐀㠀㠀㘀㔀䔀㜀㔀㌀䈀㠀㌀䔀㈀䌀㌀䐀　䌀䌀㤀㈀㌀䐀㈀㈀㌀䌀　㤀䘀㤀㘀㐀䔀　㈀㌀䘀㈀㘀㌀䐀　䔀䘀䌀㠀㐀䘀㐀㔀㤀䔀　㈀䘀㈀　㠀㌀㈀䌀㜀㜀㤀㜀㤀㈀㐀䌀　㤀䌀㠀䐀㄀䔀䐀䌀　㠀䄀㌀䌀　㔀㠀㘀䘀㜀䌀㠀㜀䈀㜀㠀㄀㘀㔀䔀　㌀䈀䔀㈀㠀㔀䘀䔀㐀　䌀䈀䘀㠀㠀䔀䈀㠀㔀䐀㄀　䈀䔀　䘀㤀㈀㔀䈀　䌀䐀䈀㠀䈀䐀㄀㄀䐀㜀㤀䈀䈀㈀㌀㜀㠀㄀䐀㔀㤀䈀䈀㌀㘀　㌀㈀䈀䈀㠀䈀䈀㄀䘀䐀㜀㜀　㈀䔀㄀㌀䘀䌀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀　㌀㐀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㔀䈀㈀　㌀　㔀䈀㈀　㌀㜀㌀㔀㌀　㔀䐀㈀　㈀　㌀㌀㔀䈀㈀　㌀㈀㌀㜀㌀㠀㔀䐀㈀　㈀　㌀㄀㌀　㔀䈀㈀　㌀㄀㌀㤀㌀㄀㈀　㌀㌀㌀㌀㌀㌀㈀　㌀㌀㌀㌀㌀㌀㔀䐀㈀　㈀　㌀㄀㌀㔀㔀䈀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㌀㌀㌀㌀㌀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㔀䐀㈀　㈀　㌀㌀㌀㘀㔀䈀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㜀㌀㜀㌀㠀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㈀㌀㜀㌀㠀㔀䐀㈀　㈀　㌀㐀㌀㜀㔀䈀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㠀㌀㌀㌀㌀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㜀㌀㜀㌀㠀㔀䐀㈀　㈀　㌀㔀㌀㌀㔀䈀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㜀㌀㈀㌀㈀㔀䐀㈀　㈀　㌀㔀㌀㠀㔀䈀㈀　㌀㤀㌀㐀㌀㐀㔀䐀㈀　㈀　㌀㘀㌀㄀㔀䈀㈀　㌀㘀㌀㄀㌀㄀㔀䐀㈀　㈀　㌀㘀㌀㠀㔀䈀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀　㌀　㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㈀㌀㈀㌀㈀㈀　㌀㈀㌀㈀㌀㈀㈀　㌀㔀㌀　㌀　㈀　㌀㈀㌀㈀㌀㈀㈀　㌀㠀㌀㌀㌀㌀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㌀㌀㌀㌀㌀㈀　㌀㔀㌀　㌀　㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀　㌀　㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㔀㌀　㌀　㈀　㌀㔀㌀　㌀　㈀　㌀㔀㌀　㌀　㔀䐀㈀　㈀　㌀㄀㌀㜀㌀㜀㔀䈀㈀　㌀㔀㌀㔀㌀㘀㔀䐀㈀　㔀䐀㈀　　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀　㌀㔀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㔀䈀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㄀㌀㤀㌀㄀㈀　㌀㌀㌀㌀㌀㌀㈀　㌀㌀㌀㌀㌀㌀㈀　㌀　㈀　㌀　㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㌀㌀㌀㌀㌀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㜀㌀㜀㌀㠀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㠀㌀㌀㌀㌀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㜀㌀㜀㌀㠀㈀　㌀　㈀　㌀　㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀　㈀　㌀㤀㌀㐀㌀㐀㈀　㌀　㈀　㌀　㈀　㌀㘀㌀㄀㌀㄀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀　㌀　㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㈀㌀㈀㌀㈀㈀　㌀㈀㌀㈀㌀㈀㈀　㌀㔀㌀　㌀　㈀　㌀㈀㌀㈀㌀㈀㈀　㌀㠀㌀㌀㌀㌀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㌀㌀㌀㌀㌀㈀　㌀㔀㌀　㌀　㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀　㌀　㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㔀㌀　㌀　㈀　㌀㔀㌀　㌀　㈀　㌀㔀㌀　㌀　㔀䐀㈀　　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀　㌀㘀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㔀䈀㈀　㌀㈀㌀㈀㌀㘀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㘀㌀　㌀㘀㈀　㌀　㈀　㌀㔀㌀㈀㌀㤀㈀　㌀㘀㌀㌀㌀　㈀　㌀㐀㌀㠀㌀㠀㈀　㌀㐀㌀㔀㌀㤀㈀　㌀㘀㌀㌀㌀㜀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㐀㌀㈀㌀㌀㈀　㌀㠀㌀㜀㌀㐀㈀　㌀㘀㌀㔀㌀㤀㈀　㌀㘀㌀㜀㌀㘀㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㘀㌀㌀㈀　㌀㐀㌀㜀㌀㌀㈀　㌀㐀㌀㤀㌀㔀㈀　㌀㘀㌀㔀㌀㌀㔀䐀㈀　　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀　㌀㜀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㘀㌀㜀㌀㤀㌀㘀㌀㜀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㌀㄀㈀　㌀㈀㌀㜀㌀㠀㌀㐀㌀㠀㌀　㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䔀䌀㤀䐀　㤀㜀䌀㔀㌀㔀㔀䘀㘀䘀㠀䌀䘀㜀䐀㈀䘀㐀㤀㤀䈀䄀䐀㐀㤀䈀䄀䈀㜀㘀㤀䐀㈀䈀㐀㘀㤀䐀㈀㤀㘀䈀㐀䔀㤀㐀㘀㐀䈀㔀䈀㤀㘀㠀㘀䐀㈀㤀㘀㤀㘀㔀㈀䄀　䈀㐀䌀㄀㤀㐀䈀㔀㠀㔀　㈀㐀㔀㐀㔀㄀　䄀㠀㈀䌀䌀㈀㠀㠀㄀䈀㘀　　㔀㜀㄀㐀㜀㘀　㄀㐀䌀㐀㔀䐀㔀㐀䐀㈀㠀　㔀　　㐀㄀㔀㄀㄀㤀㜀㄀㤀㐀㔀㄀䐀㐀㔀㘀㜀䐀䌀㤀㜀䐀㄀㜀㄀䄀㌀㈀㌀㠀䔀䔀㈀㈀㠀䐀㠀䔀㐀㜀䘀䔀䔀㌀䈀㘀㤀㈀㤀　䌀䘀䄀㤀䈀㌀䘀䘀䄀䘀䈀䘀㤀㤀䈀䘀䘀㌀䘀㠀㜀㤀䔀㜀䌀䔀䘀㌀䐀㜀㜀㜀㤀䔀㜀㤀䔀㜀䈀䐀䘀㜀䐀䘀㜀䐀㔀㜀䌀㈀䌀㌀　　　䐀　䔀㌀㠀㜀　䌀䌀㘀㔀㔀㤀㘀㔀㜀㌀㐀㠀䔀䘀䌀㤀㌀㘀䐀㌀㄀䈀　䐀䌀　㌀　　㘀㄀䈀䄀䌀䄀䘀㈀䐀㄀㈀㌀䔀䔀㜀䘀䔀䘀䐀㘀䔀䈀㠀　㘀㔀㜀䈀　　䌀㐀䈀㘀䈀㄀　䐀㌀㤀䘀㤀㔀䈀䈀䔀㤀䄀䘀㤀㌀㔀　　㔀䈀㠀㌀䄀䐀㤀䄀㘀㜀䌀䌀㘀䐀㤀㤀㜀䘀㤀㄀䘀䘀㌀䄀㈀䐀䌀　㠀㔀䔀㌀　　䔀㐀㌀　䔀㌀㤀㈀㐀㔀㤀㘀䈀㈀䌀㜀㌀䌀㐀㜀　㄀㘀䔀㘀㠀　㐀㔀　䄀䌀㤀㤀㌀㔀㜀䘀䘀㘀䐀䌀㌀䈀䈀䘀㈀㠀㜀䘀　㠀䔀　㘀㈀㈀䌀㔀㜀㐀㘀䌀䐀䈀䔀㜀　䔀㤀䄀䌀㘀㜀㤀䄀㔀㘀㔀㐀　㄀㘀䌀㜀㠀　㜀㈀　䘀䈀㤀㈀䈀㘀㤀㤀㈀䐀䄀䐀　䄀䌀䘀䈀㈀㈀䔀䔀䌀㐀䘀㠀㌀䘀䐀㄀㔀䈀㔀䄀㄀㐀㄀䈀䈀㈀䘀䔀㤀㌀㔀䌀䌀㔀㜀㘀　㌀䔀䄀䐀㘀䐀䔀䔀䄀㈀㈀㔀䐀䐀䔀㌀䔀㌀　㜀㘀㌀䘀䔀㌀㌀㠀　䘀㌀䐀䈀㈀䔀㤀䌀㌀㜀䄀㌀㘀㔀㐀㈀㜀㌀䔀䐀㈀㘀㠀　㘀㜀䈀　䘀䘀㐀㄀㤀㄀㜀㌀㔀䈀㤀㘀䌀䌀䌀䘀㠀䌀㠀㠀㜀䈀㄀䈀䌀䈀䐀䈀䈀　䈀䔀㘀㔀䔀䔀䌀䌀㐀㔀㈀䐀㤀䈀䄀䔀䐀㠀㜀䄀　㤀䈀　㐀㄀䄀䘀㘀　䘀䔀䄀䄀㠀䈀㔀䄀䔀㘀䌀䔀㈀䌀㔀　䄀䐀䈀䐀㄀㄀䔀　㐀㜀㈀䌀䌀䘀㜀䐀㘀㔀䘀䔀䈀䌀㠀㔀㠀䈀　㈀㐀㘀㔀㠀㠀㔀䔀㌀㈀㤀䔀㘀䘀㔀䔀㜀㈀䘀㤀㠀㌀㤀䈀䘀㌀㠀㘀㤀䐀䐀㈀㄀㠀　㘀㔀䄀䐀　　䈀㄀䐀䐀䌀　㘀㌀䄀㄀䄀㠀㐀䌀㔀㘀㜀䌀䐀䘀䐀㘀㌀㠀㐀䐀㌀㜀䔀㐀㌀㠀㈀㐀㠀㐀　㌀㤀㜀㜀䐀㔀䘀㈀䔀㜀䘀㤀㄀䘀㌀㤀㌀䌀䄀㠀䈀㐀㘀㤀䐀㜀䌀䄀䈀䄀㜀㔀　㤀㔀㄀㠀㌀䔀　䔀䔀䈀㈀䄀㐀㄀　　㄀㈀㘀䌀䄀㜀　　㌀䘀䈀　㐀㌀䄀䄀䄀䐀㈀㜀䐀䘀㌀䄀䈀㄀㐀䄀㤀㔀㈀㠀䘀㔀䐀㐀㐀䘀㄀㈀㄀䔀䔀㈀㄀㘀䔀㌀㄀䄀㔀㠀　㤀㜀䄀㄀㠀㠀㈀䔀䐀　㐀㘀㐀　䔀㌀㐀　㌀㘀㠀　㔀䔀㤀䈀䄀　䌀㐀㐀䐀㤀㈀㠀㘀㄀㌀䘀　㘀㌀㄀㔀䌀䈀䔀㔀㄀㔀䔀㠀　㔀䐀㤀䄀㠀㤀䔀㈀㈀䈀䘀　㤀㠀　　䔀㄀㈀　䔀㠀䌀㈀　㐀㔀㄀㈀㘀㄀㌀　㔀䐀㤀䌀㜀䔀　　䌀㄀䌀㠀㐀䈀㐀㐀䈀䈀㄀㔀䈀㈀㔀䔀䘀䈀䈀䄀䔀䌀㄀㘀㈀　㄀　䈀㠀　䔀䐀㐀㔀䘀㈀㈀㄀䔀䌀　䔀䌀㄀㘀䔀　㄀㄀㘀䔀　㘀㔀䔀㈀　㄀㜀㤀　㐀㄀䘀㈀㤀㐀㐀䌀䈀㈀㈀㐀䔀㜀㤀䌀㌀㔀䔀䌀㘀䔀㤀㜀䔀㄀㌀䔀㈀䔀　㄀䌀㐀㐀㌀㘀　㐀䌀㘀㤀䔀䌀䐀㈀䔀㔀㜀䌀㌀䈀䄀䘀䔀㜀㤀䘀㄀䐀㌀䐀㌀䘀㌀㌀䘀㈀㔀䔀㈀㐀㌀䈀　㐀䔀㤀䔀　　㌀㔀䔀㜀䔀㈀䌀䈀䈀䘀䐀㔀䘀䘀䘀㐀䈀㌀䘀䈀䄀㄀䘀　䔀㌀㜀㔀㈀䈀䌀䘀㔀䔀㈀㘀㤀䘀　㌀䔀㌀䌀䔀䘀㔀㜀䄀䈀㈀䌀䈀䌀䘀㠀㠀䌀㌀䘀㌀㔀　㜀㘀㔀㘀䈀䘀䈀䔀　㌀䌀䐀㘀㤀䐀㜀㈀䌀㠀㄀䈀㔀䔀㜀㜀䄀䌀䐀䘀䘀㔀䈀㤀㄀㠀䐀　㐀䐀㔀䈀㤀䈀㐀㄀㌀㔀䘀㠀　㠀㤀㘀㜀䔀䐀䔀䘀　㘀䈀䌀䄀㜀䘀䄀䐀㜀㔀䈀㜀䘀㜀䄀䘀䔀㈀㜀䘀䈀䘀㌀䌀　㈀䄀䐀㤀䔀䘀䌀㄀㜀㌀㈀䔀䈀䔀䘀䌀㌀䈀㈀㈀䘀䌀㜀㠀㜀㘀㌀䘀㄀㐀䐀㔀㜀㠀䐀䐀䔀㜀䌀䔀㔀䔀㈀㘀㜀䈀　䈀䐀䌀䔀㜀㜀䄀㌀䐀㤀㤀䔀䐀㠀䌀㌀㠀䌀䌀㠀㌀㄀㄀㘀㜀䄀䈀㈀㜀㔀䔀　䄀䌀㘀䐀㌀䐀䄀㌀䐀　㐀㔀㜀㤀䐀䔀䈀㌀㔀䘀䘀䈀㜀㠀㤀䄀䌀㄀㘀㘀䄀㜀䘀㘀䈀㄀䘀㐀㈀䘀㈀䌀䈀㐀㔀䘀㠀　䈀䘀䌀䔀䔀䈀㜀䘀㘀䔀㄀㌀䘀㐀㄀㠀㐀䔀㌀㔀　㜀䄀㐀䔀䔀䐀䔀　䔀䌀㜀䈀㘀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀䔀㐀䈀㜀㄀㄀㘀㄀㌀㌀䘀䌀䔀䐀㈀㜀䌀䈀䔀㘀䌀　䌀䈀䘀䘀㤀㌀䈀䔀䘀䌀䄀㜀㠀㠀㜀㠀　㔀㈀䌀䘀䐀䄀䐀㜀䐀　㠀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㤀䌀䈀䈀䌀㠀㤀䔀㠀㈀㔀㤀䈀䘀䈀㐀　䘀㌀㄀　䄀䔀㈀㈀㔀䌀㘀㐀㈀䄀㌀㜀㠀　㄀㈀䌀㄀㄀䘀㘀䄀　䐀䔀　㠀㐀䈀䌀㐀䔀㔀䘀䘀䘀䄀㜀䈀㄀㔀㘀㄀㌀㘀㈀䌀㤀㄀㘀䐀䌀㈀㌀㈀㔀䔀㜀䔀䔀㜀䄀㤀㜀㈀㔀㄀㠀䈀㘀䐀䐀㘀㐀　䄀㤀䔀　　㔀䈀㌀䈀㠀　㐀㈀䔀䘀䄀䄀㔀㌀䔀㠀㔀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀䘀䔀㌀㌀䄀㔀䘀㜀㄀䐀䈀㌀㈀䘀㄀䘀㜀䌀䌀䘀㤀㐀䐀㈀䘀䘀䌀㔀㜀䈀䄀㘀㔀㐀䔀㜀䌀䌀㜀㜀䌀䐀䐀　㜀䈀㘀㘀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀䌀㤀㘀䘀㈀䔀㘀䌀䔀㌀㘀䘀䔀䐀㐀㄀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㠀　㈀㠀䘀䘀䐀䐀㘀㄀䔀㠀㐀㈀㐀㈀㐀㈀㄀㌀㤀㘀㜀㤀㄀䄀㄀㠀䄀䄀㠀㘀㤀䌀㄀䈀䘀㠀㈀㜀㔀㄀㐀㜀㌀㐀䌀䘀䄀㠀䈀㈀㈀㈀㈀䘀䘀䈀䈀㐀㌀䔀㈀㔀㘀䄀䌀䘀㄀㌀䌀䐀䄀䔀䐀㘀　䌀㄀㤀㐀　㈀㔀㌀㔀䄀㐀㠀㠀㔀䔀㄀㌀　㄀㈀䌀㘀㠀㈀㄀䈀㔀䄀㘀㄀　㄀㘀䌀㌀㔀㘀㔀㤀㤀䘀㈀㐀䌀　㔀䄀㘀㔀㈀䐀㌀㄀　䐀㌀㜀　㠀䈀䐀㈀䘀㘀㘀㈀㐀　䘀䄀㘀䈀㔀㘀㔀㠀䌀䘀㠀㈀䘀㔀㐀㘀䌀　㘀㠀㄀㠀䐀䘀㔀㜀㈀䘀㄀㜀䔀䈀㄀㔀㘀㌀䈀䐀䈀㈀㘀　㌀䐀㄀㘀㌀㠀㠀䔀㜀䈀䌀㠀䐀㌀㐀㄀㔀䘀㜀㘀䈀㌀䌀㐀䌀　㠀䌀㈀䘀㔀㜀㤀䘀䘀䄀䐀㜀㤀䐀䘀䔀䘀䔀䐀　䄀　㔀䘀䄀㤀㤀㈀㠀䘀㔀㤀㤀　䘀䘀㤀㌀㈀㌀㄀㄀䌀㔀㔀㄀䔀㈀　㘀㠀㠀㠀㐀㜀㠀㐀㠀㐀㈀㘀䘀䐀㌀㘀㄀㄀㠀㔀㐀㐀　㈀㔀䐀㐀䌀㈀㐀㐀㤀㠀㠀䄀䐀㜀㘀䘀　㌀　㔀㌀䈀㈀䄀䐀㔀䘀䈀䘀䄀䌀䌀䈀䘀䘀㜀㠀㔀㜀㤀㈀㄀䘀㠀䐀㜀䌀㄀　㐀䘀㠀㜀㤀㘀㄀䘀䐀䄀䔀䘀㐀㐀䈀㠀㐀㐀㜀䘀䐀㤀㐀䄀㜀䈀䐀䐀㈀䔀䈀㌀㄀㤀㜀㔀䔀䄀䘀㜀䘀䌀䔀㤀㤀䌀㐀㤀䘀㈀㤀䘀䈀㄀䘀䘀䈀䘀䈀㔀㐀䈀䘀㤀㈀㠀㠀䈀䘀㘀䄀㘀䘀䘀䘀䄀䘀䄀䌀㔀㤀䔀㤀䄀䘀㠀䔀䈀㄀䔀㘀㘀　䔀䐀䄀㐀㜀䔀㈀䐀㤀㤀䔀㐀㈀䐀㈀㤀㔀䘀䈀㔀㤀㘀䄀　䘀㈀㌀㠀䄀㘀㤀　㠀䄀䄀㌀㠀㈀㌀䔀䄀　㐀䄀䔀䈀㜀㔀㜀㠀㔀　䘀㤀䔀䄀㄀䈀㄀㄀䐀㐀㐀㠀䐀㐀㠀䄀䄀　䘀㈀䘀䘀㐀䘀㔀㜀㘀㔀㔀　䘀㤀䈀㔀䄀䄀㔀　㐀㜀㐀䄀㜀㄀　㐀㠀䌀　㠀䔀㤀㌀　䐀㐀㌀䄀䐀㐀㌀㄀䌀㄀㌀㘀㘀㌀㠀㌀䌀䄀㔀㜀䔀䐀䘀㠀䄀　䘀㈀䈀䘀㤀㔀䐀㌀㄀　䐀㐀䄀㤀䄀㠀㠀䐀㐀㄀㘀䐀㐀㔀㜀㔀　㜀䈀㔀㈀䐀㤀㠀㘀䘀　䐀䄀䔀䔀㌀　㔀䄀㐀䐀㈀䈀䄀䐀䐀㄀䄀㔀㐀㄀䌀㠀䈀㈀㤀㠀䈀㌀㐀㜀䌀㈀㜀㌀㈀㄀㜀㌀㔀　䘀䐀㌀㜀䈀㤀　　㔀䄀㐀䔀㄀㜀㠀䘀䔀㌀　㄀㔀䄀㌀㤀㘀㘀㈀䘀䄀㐀㤀䔀㐀㄀　䐀㈀㜀　㤀䌀㄀䘀㔀㌀㄀㤀㈀䄀㠀䔀㌀㜀䘀䌀㔀㤀　䌀㠀䐀㤀㈀㔀㐀㤀䈀䌀䈀䘀䘀䘀㘀㄀䔀䄀㤀㔀䌀䔀㤀䄀䄀㤀䄀㌀㘀㜀㔀䌀䄀䔀㐀㐀㤀㄀㌀㤀䈀㌀䌀䔀䔀䌀㘀㠀㘀䘀㄀䘀㔀䔀㌀䌀㘀㠀䔀䄀㤀㄀䈀㔀䐀㌀䈀䄀䄀䄀㘀㜀䄀㘀㐀㔀㔀㘀㔀䌀㔀㠀㠀䘀㈀䔀㄀䄀䔀䈀㈀㘀㄀㐀㌀㠀㜀　䌀㈀䔀㈀䐀㈀㤀㄀䔀㔀㐀㔀㐀㤀㠀䔀㌀䌀䌀䌀䔀䌀䄀䈀　䐀䈀䐀㈀䄀䌀䄀㤀䌀㤀䘀㄀䐀㄀　㘀䈀䐀㐀䔀䄀䈀㔀㘀㈀㤀䌀㌀䌀㌀㄀㐀㜀㈀㤀㤀㈀㠀㌀　䌀㠀䄀䄀䈀㐀㔀㘀㌀㔀㔀䈀䈀䌀䘀㘀㘀㘀䄀䘀䌀䌀㘀䔀䄀䐀䄀䔀䌀䔀䔀㘀㜀㤀㘀䈀　䈀㄀䄀㔀䄀䘀䄀㄀㤀㤀䄀䈀䐀㄀㘀㌀㐀㔀㔀㤀䐀㔀䔀䌀㜀㘀䈀㘀㤀㤀㘀䄀䄀㔀㤀㐀䔀䄀䘀䔀㤀䌀㈀㤀䄀䈀㌀䌀䔀䄀㠀䔀㤀䄀㈀㤀䄀䄀䔀䈀䔀㤀䄀㐀䌀㘀䘀㄀㤀　㈀㐀㌀䈀㈀䈀㌀㈀䌀㤀㔀㔀㘀㠀䈀䘀㜀㜀　㠀㔀䐀㔀䐀㈀䌀㔀㈀㘀䐀㘀㜀䈀㌀　䈀䐀䄀䔀䌀㈀䐀䄀㘀㐀䘀㄀㜀㘀㐀䈀䔀㤀㌀䄀㈀㤀㈀䐀䈀㌀㐀䈀㄀㤀㈀䐀㘀㘀㔀㈀㔀㈀䈀　㠀㔀䄀㔀㌀㈀䈀䔀䄀䐀䌀㈀䔀㈀㘀㔀䌀䐀㤀㘀㐀䄀㘀䘀䐀㔀㈀㔀㘀䐀㄀䐀㤀㔀䌀䐀㄀㔀䐀㠀㔀䘀䄀㜀㔀䄀㌀㔀䌀㈀㌀䄀㘀㈀䄀㘀㈀䄀㌀䈀　䈀㌀䄀㔀㔀㘀䄀㐀䌀䄀䄀㌀㄀䔀㔀䌀䐀䈀　䌀䔀䔀䘀㘀㐀㄀㤀䌀㌀㤀㠀㤀㐀㄀　㌀㈀㈀䄀㐀䈀㌀䈀　㔀　㠀䐀㜀䘀㈀䌀䈀㜀䄀㐀㔀㔀䈀㘀㔀㐀䈀䄀䈀㜀㜀㔀䌀䈀䐀䄀㜀䈀㈀䌀㈀㤀㠀㤀㈀䐀㈀㈀㐀䐀㤀㘀　㠀㐀䐀㐀㤀㜀㔀㜀㌀㄀䌀㈀㄀䈀㈀㘀䘀㔀㘀㔀㤀㤀䌀㌀㜀䐀㠀㘀㘀䈀㈀䐀㤀䐀㔀㤀　㜀㌀䄀䐀㘀㜀㘀䔀㤀㘀㄀㜀䄀䈀㌀㐀㌀䐀㌀㘀䄀㘀䐀㘀䐀㤀㤀䔀䌀䘀㄀㠀䄀㈀䐀䐀㠀䄀㠀㐀㌀䄀䌀䔀䌀䔀㠀㔀㠀䔀䐀㌀㔀㌀㠀䈀䌀㤀㤀䐀㘀　䄀㘀䘀䔀㘀䈀㈀㠀䘀䔀㌀㜀㄀䌀㠀㌀㌀䈀䐀㔀㤀䐀㘀㠀䄀㐀䄀䄀䘀䌀㌀㠀䄀㤀䐀䐀㔀㠀䔀䔀䘀䈀䈀　　䘀㌀䌀䄀㘀䐀㜀䄀䄀䈀䄀㔀䔀㌀㌀㠀䄀　䘀㌀䐀㘀䔀䔀䄀㌀䄀㜀㔀䈀㔀䄀㠀㈀㄀㘀㠀㔀㐀䐀㜀䘀㄀䌀㜀㠀㤀㈀　䘀䈀㄀㈀䘀㐀䌀㔀㠀䐀䔀㤀䈀　㘀䘀㐀　䐀㌀䐀䌀㐀䘀㄀䄀㔀䄀㐀㜀　㔀䘀䄀䔀䔀䐀㜀㈀䌀㄀㜀㐀䌀䌀㜀㠀㔀㜀䐀㘀㜀䈀㈀㠀㘀䘀㠀㄀䔀㤀㐀㘀㄀䘀䈀㠀㜀㈀㄀䌀㐀䐀㔀䔀䄀㄀㤀㤀㤀㜀㄀䌀䔀㠀㈀䐀㠀㤀㜀㄀䘀㌀㤀㈀㤀㔀䈀䐀㈀㔀㜀䐀䌀䐀㤀䈀䄀䐀㈀㤀㜀䌀䄀䄀㈀䄀㤀䈀㠀㌀㌀䘀㤀㜀䈀㐀䌀㔀㜀䈀㔀㜀㐀䔀䈀㜀㘀㐀㘀㜀㘀㄀䘀㐀䄀㔀㄀䘀㄀䈀䘀䔀㘀　䈀㤀䌀㔀㈀䈀䐀䄀㤀䈀䄀㜀䌀䘀㘀㠀䔀㌀㘀䌀㤀㤀䐀㤀㘀㄀䄀䐀䄀㠀䄀　䈀㠀㌀㔀㜀䄀䈀䌀䄀䔀　䄀㐀䌀䈀㠀㔀䄀㠀㈀㘀㌀䄀䐀䔀䌀䌀䌀䌀䐀䌀㄀䘀䄀㈀䐀䌀䐀㌀㠀㠀㠀㌀㤀㌀䌀　䌀䘀㔀㄀䔀㘀䘀㠀䔀㜀㔀䈀䔀㌀㜀䐀䄀㔀䄀㐀䔀㄀㔀䐀　㘀　䔀㄀㜀㌀㌀　䄀㜀䌀㄀㈀㌀㌀㔀　㤀㌀㘀䘀㌀㐀㘀㠀䘀䘀　㐀㈀䘀㌀㠀䌀㘀　㈀䈀㘀䘀㐀䔀㘀㔀　㔀䘀㜀䌀䈀㔀㈀䐀㤀䐀㄀㔀䌀㐀㄀　䔀䘀㈀䈀䔀䄀䌀䘀㔀㤀䔀䈀䐀㔀　㄀　䘀㠀䄀　㜀㌀䄀　䌀㔀䈀㠀䈀㌀　　　㘀㐀㈀㄀㌀䘀㜀䌀㌀㄀䈀㌀䈀　㈀㈀㜀䌀㔀㔀䔀䐀㤀䔀㄀㘀㤀㤀䐀䔀㔀㐀䐀㘀䔀㌀㘀䈀㘀䔀㈀䘀䄀㤀䌀㘀㔀䘀㄀㄀㠀㔀㌀䈀䌀䄀䔀㈀㘀　䌀㔀䘀㤀㌀䐀㔀㌀㌀䈀㌀㠀㤀䌀䘀㤀㈀㔀㔀䔀䘀䌀䐀䘀䌀　　㈀䘀㤀㜀㈀㈀㔀䐀㔀㄀㘀䄀㠀㔀㘀㌀㌀䈀䄀㌀㜀㘀㘀䘀㘀㔀㌀䔀䘀㈀㌀　㔀䈀䈀㠀䌀㔀㈀㌀㄀㠀䌀㔀㈀㘀㌀䔀㔀䈀㘀㠀䈀　㔀㐀䔀㄀㠀㜀䈀㔀㜀䌀　㠀㄀㘀䔀㠀㜀㄀䈀䄀䄀㐀㈀䌀㤀䘀䐀㄀䘀㈀㈀㄀㄀㘀　䘀㌀㌀㐀㈀㘀䘀㌀㔀䈀䌀㐀䄀䈀　　㘀㐀䘀㤀䐀䐀㘀　䘀㘀㘀㐀㐀䐀䈀㠀㠀㘀䄀㔀䔀㈀㐀䘀㈀䄀㘀㈀㌀䄀䄀㠀䐀㈀㤀㐀䐀㈀㤀㈀㐀㌀䘀䔀㌀㤀㈀㌀㄀䔀㠀㤀㌀䐀䌀䔀㘀　䐀䔀䘀䐀㜀㤀㜀㄀䔀　䐀㜀䐀㌀䔀䐀㄀㜀㔀㜀䔀䐀㈀㌀㔀䄀䄀䌀䐀㄀䐀䌀䄀䈀㐀㔀㐀䌀䔀䄀䌀䔀㠀䔀㜀䔀　㘀㤀㤀䐀䌀䄀㠀㌀　䔀　㘀㜀䈀㌀䈀䈀䈀㤀䘀　㈀㠀䘀㐀㔀䘀　䌀㈀䐀㠀㈀㈀㤀䌀㐀䘀㘀㜀㜀㔀㘀䘀㤀㄀㘀㠀䌀㌀㌀䈀㄀㜀㘀䐀　㈀㜀㘀㈀㌀㤀㤀䘀㠀㈀䌀䌀㘀㔀䈀䈀䌀㌀　䌀䔀䔀㈀䈀㄀䌀䔀䈀㐀㌀㘀㔀㤀㜀㄀　䐀䈀㤀䌀㘀㜀㤀䘀㠀䐀㠀㜀㠀䄀䌀䄀㔀䘀㤀䄀䐀㘀䐀䈀　䐀㘀䐀㘀㐀䘀䘀㐀㐀㠀䈀㌀㄀䐀㔀䌀㈀㔀㠀䐀䄀㜀䔀㔀䄀㠀䈀䌀㤀㠀㜀㈀㔀䔀㐀㠀䌀㄀䔀㈀䐀䔀㠀䌀㌀　　㈀䐀㜀㘀　㤀㔀䌀㌀䐀㠀㌀䈀䄀䐀㔀㈀㜀䔀䄀㐀㤀㐀䔀䘀䌀䈀㔀㘀㤀䘀㔀㄀㔀䌀䐀㌀㔀䈀㘀䌀䔀㤀　㠀䈀㜀䐀㘀㌀㘀㜀㐀䘀　䌀䔀䄀䐀䌀㄀　䔀䌀㄀㠀㈀㜀㜀㄀　　䔀㔀䄀㘀㄀䄀䘀㘀㤀䈀㤀䈀㘀㌀㠀㜀㈀㈀　䐀䔀㤀䄀㔀㔀䈀㠀䈀䈀㔀㤀䄀䈀㔀䄀䄀䌀㄀㘀䈀䐀䄀㔀䄀䄀䄀㌀䄀㔀㈀䈀䈀　㜀㈀㜀䄀㐀㜀䄀㜀䌀䈀䐀㔀㌀㄀䈀䘀䈀㈀䈀㤀䄀䐀㤀㐀䘀㜀㘀㄀䄀䐀㘀㤀䔀䐀䈀　㌀㘀㜀㠀㠀㘀㄀㠀㈀㔀㔀䘀䌀㜀㜀䈀㔀㘀㄀㠀㤀㜀䘀㄀㐀䈀㐀㔀㐀㈀㈀䐀䄀䈀㘀䐀㈀䌀䌀䘀䌀䔀䌀㈀䈀䐀䄀㜀䈀䌀䐀㌀䌀䄀䐀㘀䐀㐀㜀㜀䈀䄀䐀㠀㤀䄀㠀㘀㠀㤀㤀䔀䈀䐀㜀䄀䐀䌀䐀㜀䐀㜀㌀㐀㜀䄀㜀䌀　㈀㄀㌀㐀㘀㌀㐀㤀㜀㌀㜀㜀㔀䄀㘀㘀㄀㤀㤀㘀㜀㈀䘀㌀䔀　㤀㔀䐀㤀㈀㔀㔀䔀　㔀㘀㘀䔀䔀㐀㄀㤀　䈀䌀䘀䘀　㤀䔀䌀㘀㘀㌀㈀㘀㔀䌀䄀䄀㘀䘀䐀䌀䔀䈀　㈀㔀㠀㈀㤀㤀㔀䌀䄀㈀㐀㠀㌀㤀㐀㤀䘀䐀㄀䌀㔀㐀　䈀㈀㠀㔀䘀㜀䐀䄀㄀㠀䌀䌀䔀㠀㄀㈀䌀㠀䄀㘀䔀䘀䈀㔀　㤀㘀㠀㤀㌀㤀㄀䌀䐀㈀㔀䐀㤀䈀㠀䔀　㈀㐀䌀㔀䈀㜀㘀㄀㠀㠀㜀㄀䈀䈀䄀䐀䈀㐀䈀㐀䘀㈀䔀㤀㔀㤀䐀䔀䐀㐀䐀㘀䐀㄀䐀䌀䌀㐀㘀䘀㈀䔀㠀㠀䌀㔀䄀㤀䌀㐀㄀䘀䔀㘀㘀㔀䐀㘀㘀㄀䔀　㄀㔀䄀䌀䌀㌀㌀䄀㤀㤀䄀　䐀　㜀㠀㔀㔀䐀㘀㤀㤀䔀㔀㔀䔀䈀㔀䈀㔀㤀䌀䐀䈀䌀䈀䈀㠀䈀䐀㠀䌀䔀䌀　䄀㘀䔀　䘀䌀㌀㠀㔀䌀㄀㘀㈀㄀㤀　㘀㠀㜀䔀䘀㐀㤀㄀䐀䌀䐀㔀㘀䐀䌀䄀㜀㜀　㐀㄀㜀㤀䌀　䌀㠀㘀㠀㈀㤀㠀䄀䈀䌀㐀䈀㐀䈀㔀㜀㈀　䐀　䔀㠀㐀㤀㌀㤀㘀䌀䔀䌀㘀䔀㐀䄀䌀㄀䄀㔀㌀㘀㄀㤀㜀㔀䄀㈀䌀㜀䄀䈀㜀㐀䔀　䐀䔀㈀䘀䈀㜀㠀䐀䌀㈀㜀䄀㈀㌀䈀㤀㌀㘀䄀㌀㜀㤀䄀㐀㜀㜀䔀㔀㠀䌀㄀㘀䔀䔀　㜀䈀㠀㌀䐀䈀䌀㘀䐀㤀㠀䄀䐀㘀㘀㐀㘀㄀㌀㈀䔀䐀䈀䐀䔀　䔀䈀㄀㐀䄀㠀䐀㔀㜀㠀㤀㌀䐀㈀㠀㠀㌀㌀䐀㘀　㠀䐀㈀䄀䄀㤀　䐀㔀䘀㠀䔀䐀㠀㘀㠀　㘀䌀䔀　䐀㐀䔀䄀　䐀㐀㜀䔀㈀㔀㘀㘀䈀䌀㈀䈀㤀䈀䈀䌀㐀䐀　䔀㜀䔀㔀㄀䌀䘀㤀䌀㈀㘀㘀㤀㌀㤀䔀䈀䈀䐀㔀　㘀䐀㈀䐀䌀㔀㘀㤀䄀㜀㌀䔀䔀㔀㜀㘀㜀䔀䄀㄀㤀䌀䄀㘀㠀䔀㐀㠀㘀䈀䈀䔀㜀㐀㘀䘀䔀㈀䄀䐀䄀　䈀㈀䄀䐀䔀㘀㔀　䄀㈀㘀䘀䐀　䔀　㈀㄀㠀䈀㄀㄀䈀㌀㜀㠀䈀㄀㈀㘀　䄀㔀㈀㤀㠀　㘀㌀䐀㤀䘀㘀㄀䌀㔀䄀㈀㄀㤀䌀䐀㄀㘀㠀䌀䈀㘀　䌀㘀㘀㌀㐀䔀　㔀㈀䄀㜀䈀䐀㔀㐀㘀㔀㈀㐀䌀䈀㐀䌀䐀䌀㄀㈀㘀㔀䘀㘀㤀㤀㤀㈀䄀䄀㠀䌀䌀㄀㐀㈀䔀　䌀㌀㄀㈀㘀䐀㘀䄀䄀䐀䌀䄀䄀䈀㜀㐀㘀㈀㠀㜀䘀㠀䌀㌀䐀㌀㘀䄀㈀㜀䈀䘀㈀㔀䔀㔀䈀㘀䈀　䄀㘀㈀㘀㜀㈀㔀䔀䌀䄀䄀䐀　䔀㔀㘀䌀　㘀䈀䔀䈀䈀䐀㘀䄀䘀㐀䌀㠀䐀䔀㈀䘀㤀㐀䌀㄀　㘀㄀㠀㄀䐀㈀䌀䄀䄀䔀㄀䈀䔀䔀　䌀䘀㘀䄀㜀㐀㤀㔀㔀㜀㜀䐀㠀䄀㜀㜀㔀㌀䐀䘀　㔀䔀㌀䄀䐀㐀䈀㜀　㘀㜀䔀㄀㐀䔀㐀䈀㌀䐀㠀㔀㘀㄀䈀㄀㔀㜀㘀䈀䄀䈀㘀㤀䌀㄀䌀䐀㤀䘀䐀䄀䄀䈀䐀㄀㘀㈀㈀䐀䔀䔀㘀䐀㄀䌀䌀䔀䘀㜀　㠀㜀㔀䈀　㠀䘀㐀㌀㘀㐀　䐀䔀㌀㈀㌀䐀㜀㘀　䐀䌀㐀㔀㔀䈀㘀㌀㔀㜀䔀　㌀䔀䔀䈀䐀㈀㤀㐀㜀䔀㤀㈀㤀䐀㘀㔀䔀㔀　䘀　㜀䈀䔀㌀　䌀㄀䈀㠀㄀㜀㄀㜀㌀㘀㌀㐀㜀㔀㤀䌀㘀㤀䘀　㐀䔀㜀㈀㘀㐀㘀㜀㠀㔀㤀䘀㘀㤀䐀㔀㐀䄀䔀㘀㠀䔀㠀䔀㜀　䔀䐀䐀㤀㄀䈀㔀　䈀䌀䌀㈀䈀㔀㜀䐀㐀㐀㈀㌀䘀㠀㤀㐀䔀㈀㤀㜀䌀㌀㐀䐀䔀㈀　㠀㔀䌀䘀㈀㠀㌀䌀㔀䔀㄀䘀㠀㜀㤀䄀䐀㤀㠀　䈀㤀䈀㔀㄀　㔀㤀　㠀㤀㌀㤀䐀　㠀䄀䈀䄀　㠀䘀㔀　㠀䄀䄀㐀䌀䌀䌀㄀㘀　㜀㐀　㌀㄀㈀㐀㠀䈀㔀㤀㐀㄀㌀䄀䌀㐀　㄀䈀䔀䔀㈀䔀㐀䈀㐀㈀㜀㌀㄀㜀䈀㌀㜀䔀䄀㈀䔀㔀㐀㌀㄀㜀　　　㠀䐀䐀㘀䘀㐀䄀䄀䈀䐀㔀㈀㈀㈀䌀㤀㔀㈀㌀㔀㜀䌀㠀㘀㌀㠀　㐀㠀䄀䌀㔀䌀㄀䔀　㄀㘀㐀䈀㤀㄀㈀㔀䌀㠀㘀㈀䔀㐀㈀　㘀㐀㄀㄀䈀㈀㄀　㌀㤀㄀　㔀㤀㠀　䈀㐀㈀㈀㔀㌀㤀㄀㈀㤀㐀㠀　䈀㤀䔀㄀䈀㄀䐀㈀㈀䈀䘀㄀㔀㈀䘀䔀　㤀䘀䔀㈀㔀　㈀䄀䌀㌀䐀䌀㘀　䈀㐀䄀㔀㠀㤀㜀㤀䐀　㠀㠀㈀䄀㐀㠀䄀㤀㠀㄀䌀㄀䐀䌀䈀㜀䄀㠀㌀㈀㠀㠀㄀㘀䐀㌀䄀㄀　㈀䘀㔀㘀㌀㔀㐀㄀㄀䈀䐀㐀䔀䌀㜀㌀䄀㘀㐀㔀㤀㠀㐀㜀䄀㄀㔀䔀䄀䌀䐀䄀㠀㐀㜀㔀　䈀䘀㐀㔀　䐀㐀㜀䐀㜀㔀㌀䈀㄀䌀㜀㠀㄀㜀㠀㐀㔀㠀㘀㘀䐀㈀䐀㔀㠀䐀䈀㠀㈀䈀㔀㈀䐀䐀㠀䄀㌀　㔀㔀䈀㔀㠀䈀　㠀㔀　㔀㄀㐀䌀㈀　䘀㌀䔀䈀㌀㈀㤀䈀㤀㐀䈀䘀㠀䐀䔀㘀㜀㜀㘀㈀　䘀䔀䔀㤀㌀㌀㘀㜀㈀㄀䈀䔀㈀㌀㄀䌀㈀㜀㜀䌀㐀䈀㘀㔀䐀䘀㔀　䔀䔀㄀䘀㠀㐀䄀䘀　㤀䌀㜀　㠀㔀䘀㄀㄀䘀䔀㐀䔀㌀㔀䈀䈀　㤀㐀㜀䌀㤀䘀㠀㈀㔀䔀㄀　䈀䌀㈀䔀㜀㠀㐀䌀䘀　㠀㤀䘀㄀㈀䘀䔀㐀㘀䘀㠀㠀㐀䘀　䈀㄀䌀䘀䄀䌀㐀㐀䘀䌀㤀㔀㜀㈀㄀䘀㄀㄀㌀䔀䘀㐀㤀㤀㈀㈀㄀㄀㄀䘀䘀㠀㐀䌀　㤀㠀㠀䘀㜀㜀䐀䄀㘀㄀䌀䌀㐀㜀䈀㠀㐀㜀㜀　㤀䔀䘀㄀　䐀䔀䄀㘀㈀䄀㘀䘀㔀㄀䔀䔀㐀䐀䌀㈀㔀䘀　㠀㜀䘀㈀㘀䈀䌀㐀㄀㜀㠀㤀䐀㜀　㠀㐀䘀　㄀䄀䔀㄀㔀㔀䌀㈀㤀䘀　㠀䄀䘀㄀　㔀䔀㈀㘀䈀䌀㐀㐀㐀䔀㄀䌀㈀㘀䈀䌀㐀㠀㜀㠀㠀㄀䘀　㐀㜀䈀䄀䔀䌀㄀䘀䄀㠀䔀㘀䘀㌀㠀㐀䔀㜀　㠀䌀䘀㄀㈀㤀䔀㈀㄀㄀䌀㈀㈀㌀䌀㐀䐀㌀㠀㐀㠀㜀㠀㠀䄀㜀　㠀　䘀　㈀㐀䘀㔀䘀㤀　㐀䔀㄀㜀㄀㌀㈀䔀䔀㈀㜀䔀䌀㈀㌀㌀䌀㐀㘀䐀㠀㐀䈀䔀㠀㈀㈀䔀䌀㈀㄀䔀䌀㈀㘀㌀䌀㐀䄀䐀㠀㐀㔀䐀㠀㐀㤀䘀　㄀㄀㌀䄀㜀䐀㐀㤀䘀㤀　㠀㈀䘀㘀㄀㠀㜀㈀䘀䄀㤀　　䘀㄀　㠀䔀㄀㘀㄀䌀㈀㐀㌀㠀㐀䔀䐀㠀㐀　㜀㜀䐀㐀㤀㜀㤀㠀㠀　㜀　㠀䘀㜀㔀㌀䈀䈀䘀䈀　㠀䘀㜀㄀㈀䔀䔀㈀㄀䐀䌀㐀䐀䈀㠀㠀䈀䈀　㠀䐀㤀䄀䐀䘀㐀㤀䐀㠀㐀䄀䐀㠀㐀㈀䈀㠀㠀㌀㜀　㌀䈀䔀㄀䘀㜀䐀㐀䘀㔀㘀㘀䌀㈀㈀㘀㘀䄀䈀䔀㤀㄀㜀　㄀䈀㘀㄀　㌀䔀㄀㔀㘀䌀㈀㈀䐀䐀㐀䔀䔀㘀㘀䌀㈀㐀䐀㠀㐀㄀䈀　㤀㌀㜀㄀　䄀䔀㈀㜀䄀䌀㈀㜀㔀䌀㐀㜀㔀䐀䄀䘀䄀㌀䔀㘀㘀䈀　㤀䐀㜀㄀㈀㌀䄀　㠀䐀㜀㄀　䐀㘀㔀　㠀㌀䐀㔀㠀㐀㔀㔀㠀㐀䄀䈀　㤀㔀㜀㄀㄀䄀䔀㈀㐀㔀䌀䔀㄀㌀㌀　䔀㐀㐀㔀䌀㐀䔀㔀㠀㐀㤀䈀㠀㠀䌀䘀　㌀䈀䌀㈀　䄀䌀㈀㜀㈀䌀㈀䄀㔀㠀㐀㘀㔀㠀㐀䄀㔀㠀㐀㈀㔀㠀㐀䌀㔀㠀㐀㐀䈀　㠀䔀䐀㠀㐀㐀㔀㠀㐀㠀㔀㠀㐀　㔀㠀㐀㠀䈀　㤀䘀㌀　㤀䘀㌀㜀䌀㠀㤀㠀㔀㠀㠀㠀䈀　㠀㜀㌀　㤀㄀㜀㄀㈀㈀䔀㈀　㤀䌀㐀䘀㤀㠀㐀㌀㘀㠀㈀㌀䌀䌀㈀㘀䌀䌀㈀㈀䌀䌀㈀㐀䈀㐀㄀㈀㘀㘀㄀　䄀㘀㄀㌀㔀䄀　㠀䌀䐀㠀㐀㘀㤀㠀㐀䄀㤀㠀㐀㈀㤀㠀㐀䌀㤀㠀㐀㐀㤀㠀㐀㠀㤀㠀㐀㈀㘀㔀䘀䌀㈀㈀　㠀㐀㠀㜀㜀　㄀䔀㘀㄀　㈀䌀㄀㐀䐀㘀㠀㈀㐀㌀㐀㄀　䌀㘀㄀㌀䔀䄀　㤀䔀㌀　㠀㘀㌀　㤀㘀㌀　㠀㜀㔀㠀㐀䐀㄀㠀㐀㔀䄀䌀㈀㈀㠀㐀㈀　䐀䄀㄀㤀䄀㌀　㤀㈀㔀　㐀㔀䄀㠀㈀㐀㔀㐀㄀　㐀㘀㄀　䌀䄀　㤀䌀㌀　㤀㈀䔀㐀㈀㄀㤀㘀㄀㄀㠀㘀㄀㈀㠀㘀㄀　㠀㘀㄀㌀　䄀㄀㤀㐀㔀　䔀㈀㠀䈀㈀䘀㐀㄀㄀㐀㄀㌀　㘀㄀㄀㠀䄀　㠀㠀㔀㠀㐀㠀㄀㠀㐀　㈀㐀㈀㌀䔀㈀㄀㠀䘀㤀　㈀䈀㐀㄀㘀㐀䈀䔀㜀㠀㈀㜀䔀㘀㜀㈀䌀㠀䔀㠀㈀㐀㘀㐀㄀㌀䈀㈀　㠀　䔀䌀㈀　　㐀㈀㈀㘀㈀㄀㠀㌀㤀　㐀䔀䈀　㄀㌀㘀䌀䈀䔀䈀㠀䌀㄀㠀㠀㌀㐀㠀㈀䐀㔀㄀㜀䌀㜀㄀㜀㜀㐀䄀䄀㈀䘀䄀䔀㄀㐀㤀㄀㐀㈀㐀㘀　䈀㈀㄀㤀㤀㘀　㈀㘀㤀㠀　㠀㐀㤀　㐀㈀㌀㈀㄀㤀㄀㤀　㐀　㠀㠀㈀㜀䌀㐀㄀㄀㘀㈀　㤀㌀㄀㜀㐀㠀㔀㘀㠀䈀䄀㐀㈀㄀㐀㄀㤀㈀㌀　㤀　㘀㠀㈀㤀䔀䄀　㈀㌀㐀㐀㄀　䈀㐀　㐀　䐀㐀㄀㐀䐀㔀　㄀㄀㤀㐀䐀㐀㘀㜀㌀㠀㈀㄀㠀䌀㠀䌀　䄀㠀㈀㤀䌀㈀　㈀㌀㠀㠀　㐀㠀㄀䌀　　㠀㈀　㠀㄀　㔀　㠀㜀䔀㐀㈀　䘀䔀㄀㐀㜀䌀㈀㐀㤀䌀㈀　㤀䌀㈀　䘀㠀㐀䔀䘀　㤀䘀䘀㤀㐀㈀䔀䌀䈀䈀䔀㤀㌀㐀㘀䌀㐀㠀䔀㤀㌀䘀㄀㔀䈀䌀㈀㌀㜀㠀㐀㜀䘀㄀　䈀䔀㈀㘀㄀䌀㈀㌀㜀䌀㐀㔀䘀㠀㌀䈀䄀㄀㤀䈀㜀　㤀㐀䘀　㈀㔀䔀㄀　䈀䌀㈀䔀㜀㠀㐀䌀䘀　㠀㤀䘀䐀㈀䘀㔀䘀䔀䔀㘀㠀䈀䈀㔀㈀㈀㌀䔀㈀㄀㜀䌀䔀䌀㠀䈀䌀㔀　㔀䌀㘀䘀䔀㐀䄀䘀㠀䌀㠀㄀㜀㔀䈀㠀䌀䘀㠀㤀　䘀　㠀㄀㈀䘀㜀㘀　㐀䔀㈀㜀䐀㔀䘀㘀䌀　㔀䔀㈀㌀䐀䌀㈀䈀䈀㠀㐀㜀㜀㜀䌀䈀㄀㤀㔀㠀㠀䈀㜀㜀䐀䈀㄀㔀㔀㠀㠀䈀㜀　㠀㘀䘀㄀㈀䘀䔀㐀㈀㔀䐀䘀䘀㤀㤀䘀　　㘀㜀㔀䘀㘀㌀䄀㜀㔀㜀㘀㠀㐀䘀　㄀䄀䔀㄀㔀㔀䔀䄀䔀䌀㐀䘀䐀㐀䔀䔀㄀㔀䌀㈀䌀䈀㠀㐀㤀㜀　㠀㠀㜀　㤀㈀䘀㄀㈀㔀䔀䄀　㜀㘀㜀䘀䄀㐀䄀䔀䘀䘀㐀　㜀㠀㤀䔀㤀䌀㜀䘀㠀䔀䘀　㈀䌀㔀䐀䔀䘀㄀㤀㔀䘀㘀䌀㌀㤀䔀㈀㄀　㌀㔀㜀㠀㤀䄀㈀䔀㜀㐀㤀　䈀䌀㜀䔀㠀䄀㌀䄀㌀䈀㐀　㜀㠀㤀㈀䘀　　㐀䔀㄀㜀㄀䌀㈀㜀䔀䌀㈀㌀䔀䌀㈀㘀㌀䐀㐀䘀㔀㔀䔀䔀䄀䈀䄀㠀䈀䈀䄀䐀䔀㐀㌀㔀䐀䔀䘀㈀㘀㌀䌀㐀䄀䐀㠀㐀㔀㄀㜀䐀䄀㐀㤀䘀　㄀㄀㌀䄀䔀㤀䈀㈀㔀䔀䌀㈀　䔀䌀㈀㈀㌀䐀㐀䘀㔀䌀㌀㠀㐀㠀㜀　㠀䐀䈀　㤀　䘀㄀㈀㄀䔀䘀　䌀㔀䔀　䈀䔀䌀䈀䔀䔀䘀㜀䌀㔀　䌀㐀㜀䐀䌀㐀㜀䈀㠀䐀㜀㄀㜀㔀㌀㠀㜀䈀㠀䌀㜀㄀㜀㌀㌀　㘀㜀㄀䈀㜀㈀䘀㘀㘀㈀䌀䔀㈀㈀䔀㔀䘀䌀䌀㜀㠀䌀㐀㌀㘀㔀䘀㠀䌀　䈀㜀㄀㈀㜀㔀㔀䐀㤀㐀䄀㔀㔀䈀㘀㔀　㤀㔀㌀䈀䄀㠀䌀䄀䔀䐀㔀㐀䘀㘀㜀䈀䄀䄀䈀㤀㤀㤀㜀㈀㤀䈀䄀㠀䔀㘀㐀㘀䌀㈀㘀䐀䐀㐀㘀　　㌀䔀㄀㔀㘀㔀䘀䌀䌀㌀㠀䌀㐀㈀䐀䐀㐀䘀䌀㘀㘀䌀㈀㐀䐀㠀㐀㄀䈀䌀㤀䄀㔀㄀䈀䄀㠀䔀㘀䘀㔀㔀㐀㜀㌀㌀䐀䔀㄀㌀䄀㔀䘀㐀䌀㌀䐀㘀㈀㄀䐀䐀㔀㔀䌀㐀䈀䈀㠀㤀㘀䐀　䔀㄀㠀䈀䘀㘀㈀　䄀䔀䘀㄀㐀㔀㌀㜀㈀㄀䐀㘀䘀㠀䄀㈀㈀㜀㈀㌀㔀㘀䘀䈀䄀㈀䄀㜀㈀　㔀㘀䘀㤀䄀㈀㐀㜀㈀㄀䄀䔀䘀㘀㐀㔀㐀䘀㐀㈀㔀䌀㐀㔀㘀㔀㔀㜀㔀㈀䌀䐀㈀䈀䄀㠀䌀䄀䔀㔀䄀䔀㄀䐀䌀㠀㘀㌀䈀䄀䌀䄀䔀㐀䄀䘀㈀㈀䄀䄀㤀㌀㌀䘀䐀　㠀䌀㐀㤀㌀䔀㠀㠀䘀䄀㄀㐀䔀䄀　㄀䐀㐀㈀㜀䐀㔀㄀㌀㤀㈀㜀䐀䄀㠀㤀䐀䄀㠀㔀䔀䐀㐀㄀䐀䄀㠀㠀䘀䄀　㌀䔀㠀䌀䘀䄀㄀　䔀䄀㜀㘀䐀㐀　㜀㔀㄀㄀䘀㐀　䈀䐀㄀䘀䘀㔀㌀䔀䐀㐀㜀䈀㔀㄀䔀䘀㐀㄀䈀䐀㄀䈀䘀㔀㈀䔀䐀㐀㘀䐀䄀㠀㜀㜀䄀㈀㘀䔀㐀㔀䐀䐀㠀㈀㜀䄀㠀㜀䄀䄀㈀䐀㜀㤀㄀㌀䔀䄀㐀㘀䐀㐀䐀䈀㔀　㌀㜀䄀　䐀䔀㠀䄀㜀䄀　䈀䔀䄀䌀䐀䄀㠀㌀㜀䄀㄀䐀䔀㠀㠀㜀䄀　㌀䔀䄀䘀㔀䌀䄀䈀㘀䔀㐀䘀㔀䄀㠀䐀㜀䄀㄀䄀䔀㐀㌀㔀䐀㠀䈀㌀䄀㔀䌀㈀㤀䘀䌀㈀㠀㤀䌀㠀　　㤀㤀　㈀䌀㤀䌀㐀㐀䈀㘀㐀㄀㌀㈀䈀䈀䌀䌀㄀㜀䌀㔀㘀䘀䌀㜀䐀䘀䘀㤀㈀㈀䘀㤀䐀㈀㔀䄀㐀㐀㔀㠀䔀㠀㌀㌀䘀　䄀㔀䈀㔀㠀　㜀　㌀㄀㘀㄀㌀䔀㘀㄀㄀䔀䔀㄀㈀㈀䌀㈀㔀䌀䌀㈀㠀㔀㠀㐀　䈀　㠀䔀㜀㄀㌀㠀㘀㄀　　㘀䘀䈀䘀㐀㄀䌀䄀㔀㠀㐀㄀㈀㐀㈀㌀㄀㘀㄀㄀　䄀㄀㠀㠀㔀　㐀㠀㄀㠀㐀㠀㈀㠀㈀　䔀㐀䘀䈀㜀㐀㜀䌀㤀䐀䔀㘀㄀㄀㜀㈀　㤀㤀㄀　㐀　㌀㐀㄀㐀䘀䐀　㄀㄀㈀㈀　㠀㔀䄀㄀䘀㐀䔀㐀䄀㄀㜀䐀㌀㄀　䐀㐀　㐀㄀㔀㐀㄀㐀㤀　㠀㈀㜀㠀㐀䘀㤀䈀㐀㜀䌀䄀䄀㄀㔀䄀䔀㐀㤀䌀㠀䈀䘀䄀㌀㜀㘀䄀㌀㄀䔀㐀㔀䘀䐀㄀㈀䘀㔀　䈀䐀㐀䌀䘀㜀㄀㌀䄀䐀䘀㐀㜀㜀䐀　䘀䘀㔀㔀䐀䐀㐀㜀㜀㔀　䐀䘀㐀㘀㜀䐀　䈀䘀㔀㐀䐀㤀䌀㤀㘀䈀䘀䄀　䘀䔀㄀㤀䘀㔀　㤀䐀㐀䌀㜀㔀㄀䘀㜀䄀㌀䔀䔀㐀㌀㜀䐀　䌀䘀㔀㜀㘀㤀䌀㠀䄀䐀䘀䄀㌀㜀㘀䈀㄀㤀㔀㄀㐀䔀㤀㘀㔀㌀䔀　㌀㔀䘀䘀㈀㐀䈀㈀㤀㌀㠀㐀䈀　㠀㠀䈀　㤀㤀㜀㄀　䐀䄀　㤀㈀㌀　㠀䔀㔀㄀㐀㠀㜀䔀㄀　㐀㄀㜀䄀㄀㠀䌀㌀　㠀䌀㌀　㤀㐀㠀㘀㄀䌀㐀㌀㠀㠀㈀㘀㐀㐀㜀㄀䔀䌀㄀㔀㐀㔀㔀㄀䘀　䈀㤀㤀㈀䔀䘀㜀䔀㐀㈀㄀㐀䘀　䔀㔀㐀䔀㠀　㐀㌀䄀㠀䄀㈀　㠀䔀㐀䌀䈀䄀㔀㠀㐀　㘀㤀䄀䘀㔀䘀㄀䔀㐀㔀㤀㌀䐀㘀㄀㄀䌀㘀㄀㈀䌀㘀㄀　䌀䄀㄀㠀䔀㌀　㤀䄀㔀　㐀䈀㄀㠀㐀㔀䄀㠀㈀㄀㔀㐀㄀㌀㐀㘀㄀㈀䄀䄀　㠀㤀㔀㠀㐀　䄀㐀㈀㈀䄀㈀㄀㠀㔀㤀䌀䈀㜀㄀　㤀㈀　㤀㘀㘀㠀㈀㠀㤀㤀　㐀㐀㌀　㄀㈀㄀㈀　㤀　㤀㠀㐀㜀㠀㄀䄀㘀㘀㄀䌀㈀㄀䐀㘀䈀㔀㄀㤀䐀㤀㠀㌀䘀䄀㈀㌀䔀䄀㐀㤀䐀㐀㄀㌀䄀㠀㌀䘀䔀　　㐀㜀䘀㠀䘀䘀䄀㐀䘀䐀㐀䔀䘀㔀　㠀䘀䄀㌀㜀䔀㠀䈀䘀䄀　䐀䌀䔀䔀䄀㌀䘀㔀　䈀䘀㐀㘀䘀䐀㄀㐀䘀㔀㘀䘀䄀㠀㤀䘀䄀　㜀䔀㠀䌀䘀䄀㔀㜀䐀㐀㠀䘀㔀　㌀䘀䌀㐀䐀㤀㌀䐀㠀䌀䘀䄀㈀㈀䔀䄀　䈀䄀㠀㜀䘀㐀㐀䘀䐀　㌀䔀䄀䘀㌀䄀㠀䌀䘀䄀㄀㌀䔀㠀䈀䘀䄀　䌀䔀䄀㈀㄀䐀㐀䄀㜀㔀㄀䈀䈀㔀　䘀㜀䔀　㠀䌀䔀䘀㐀㘀㜀䐀㄀㐀㜀㔀㄀㜀䔀䄀㐀䔀䐀㐀䌀䐀㜀䌀䘀㘀㠀㔀㄀䔀㠀䄀䘀㄀　䄀䌀㈀㜀㈀䌀㈀㄀䌀㤀䘀　㄀㠀䘀㐀㈀䄀䌀㠀䐀㌀　㤀䈀䌀㈀㌀㈀㠀䈀㌀　㤀㌀䐀　㐀䄀㤀㠀㐀㄀㤀㠀㐀䔀㘀㠀㈀㄀㌀㐀㄀㌀䄀㘀㄀㄀䄀㘀㄀㈀䄀㘀㄀　㈀㘀㄀㌀㈀㘀㄀㄀㈀㘀㄀㈀㤀䄀　㠀㄀䔀䌀㈀㜀㤀㠀㐀　㤀　㐀㌀㜀䄀㄀㤀㄀㤀　㐀㌀㜀　㔀㈀䄀㠀䈀㌀　㤀㔀㤀　㐀　㜀㘀㄀　　㈀㄀㤀㌀㤀　㐀㄀㐀㠀㈀㜀䐀㠀　㤀㌀㘀㤀䄀㤀䈀㌀㐀㠀㈀㤀㔀㈀　㈀㜀䌀㠀　㠀㈀㈀㐀㄀㈀　㌀　䈀䄀㈀㌀䌀㄀䈀㔀　䐀㄀㤀㐀　䘀㔀䄀㌀㜀䔀㠀㘀㠀㄀㜀䐀　㌀䘀㔀㜀㔀䐀㐀㈀㌀䄀㠀䄀䘀䄀㄀䈀䔀㠀䄀䘀䄀㈀㜀䐀㐀㔀㜀㔀　㔀䘀㐀㘀㜀䐀　㤀　㌀䈀䐀㄀㜀䘀㔀㘀䄀䐀㄀㤀㘀㜀䌀㤀㔀䔀㠀㐀䌀䈀䔀㤀㈀㌀㤀㤀㌀䄀䘀䄀㠀㔀䔀䔀㤀䈀䔀㜀䌀䘀䈀㐀䄀䘀㜀㘀㔀䐀㔀㈀䈀䐀䌀䈀䘀䐀䈀䈀䔀䌀㈀䄀䐀㔀䔀㌀㄀㜀㠀㐀㔀䔀䐀　䄀㔀㄀䈀䐀䌀㈀㠀㠀䈀㠀㜀㐀䌀㔀䘀㘀㄀㔀㘀䘀䄀䘀㔀　㈀䌀䄀䘀㔀䔀䔀㘀䈀䔀㜀㐀䘀䈀㌀㈀䈀㜀㘀䌀㔀㤀䘀㐀㌀㈀㐀㄀䈀㔀䈀㐀㜀䄀䈀㄀㜀䈀䌀㤀䘀㘀䌀㔀㘀䔀䘀㔀㘀㈀䄀㘀䈀㤀䄀㐀䈀䄀䐀䐀䐀䐀䐀㠀䘀䔀㜀㄀䘀䈀䈀㜀䔀䐀㘀㈀㜀㐀㜀䈀㘀㌀㜀䈀㘀䈀䘀䈀䄀㈀䘀㘀㤀䈀䐀䈀㠀䘀䄀　㈀㄀䔀䌀䔀䔀䘀㘀㔀䐀䔀䐀㠀㜀䐀䄀䌀㔀䄀䔀䌀　　㄀㔀㜀㘀㐀㜀䈀䘀㄀䔀　䄀䄀㤀㔀䔀䐀䐀㜀䈀㜀　䈀䐀㄀㔀㠀㈀䔀㐀　㌀䈀䐀㌀㜀㄀㜀㌀㐀䄀䈀䈀㌀䄀䄀㈀㘀䄀㔀㄀䘀㔀　㈀䘀㜀䌀㈀䔀䐀　䈀䐀䌀䈀㈀　㔀　㌀㄀㜀　㠀㠀㌀䈀䘀㔀䐀䌀　㌀䔀㔀㠀䌀　㠀㐀䐀䌀　㔀㘀䌀䐀䌀㠀㈀䔀㘀　㔀　㈀䐀㘀䐀䄀䈀㤀㈀　㈀䐀䄀㌀㠀䄀䐀㜀㈀䔀㔀䌀㄀　㤀䈀㔀㠀䄀㔀㔀䘀㤀　䈀䈀䌀　䈀㔀㐀　䈀䌀䈀㠀㜀䄀㤀䔀㜀䈀䘀䔀䘀㘀㜀㤀䔀䔀䈀㄀䘀㌀䔀㘀䌀䐀䈀䈀㘀䌀䐀䔀㤀㘀㜀㤀㐀䘀䌀䔀㤀㌀㔀䘀㌀㘀㘀䘀䘀䐀㌀䌀㘀㄀　㜀䄀㘀　㐀䐀㜀㌀䌀䄀㔀䈀㘀䔀䄀䄀㈀䔀䄀䈀㤀䔀䔀䘀㜀䔀㜀㌀㈀䐀㠀㈀䘀　㐀㐀　㠀䘀㜀䄀㐀　　㠀䘀㠀㐀㐀䐀㔀䈀䌀㜀䐀㠀㈀㄀䘀㄀㠀㜀䌀㈀㔀䘀㠀㔀䐀　㄀㜀㘀　㄀　㘀䔀　㜀䌀　䌀䌀㐀㄀䌀䔀㜀㘀䌀㜀㜀䐀䈀䘀㘀䐀㤀䔀䔀㔀㤀䌀䔀㔀㘀䘀㜀䌀䌀䔀䐀䄀䐀䔀䔀䔀㐀䐀㘀䈀㈀㔀㘀㘀㄀㠀㘀㜀㌀䈀䄀䈀䈀䌀㔀䐀㤀䔀䌀㤀䔀䔀㘀㤀䌀䔀㈀㤀䔀䈀䄀㜀䐀㠀䄀㜀䈀䈀㈀㜀㌀䄀㈀㜀䈀䐀㈀䘀㘀㠀㤀䔀䔀䔀㐀㠀㤀㘀㔀㄀㌀㠀㔀㈀㘀䄀㜀䌀㜀㜀䐀㄀䔀䈀㘀㤀䌀䔀　㘀䌀㜀㐀䈀䈀䈀㜀㌀㜀䈀䄀㄀䈀㤀䌀䘀㔀䔀䔀䘀㄀䐀䈀䔀䈀䐀䐀㘀㌀㤀䐀㘀㌀䐀䌀㘀㌀䐀　㔀䔀䔀㜀䄀䌀㜀㔀㠀䘀䐀䔀㔀䔀䔀䈀㄀䔀䔀㔀䄀䌀㜀㘀䐀㜀㘀䌀䄀䘀㜀㘀㠀䘀䄀䈀㘀㘀㈀㌀㤀䐀㔀㔀䔀䔀㐀䄀䈀㄀㈀㠀㄀㤀㤀䘀㈀㔀㘀　䌀㘀㤀䘀䘀㤀䔀㘀㤀㔀䔀㘀㘀㌀㘀㘀㤀㤀䈀䄀䐀㤀㌀㐀䐀䘀㈀㐀䌀䌀㌀㜀㜀䐀㘀　㌀䄀㘀㘀㄀㈀䔀㜀㈀㜀㄀䐀㐀䈀㄀㈀㈀䔀㌀㌀㌀㈀㔀䐀䔀㈀㘀㔀㠀㤀䔀䈀㄀㌀㐀㔀㄀䐀㜀䔀　㠀䘀㐀㤀㄀㤀　㤀䌀䈀　㌀䔀㘀㄀㐀䈀䌀㈀㠀䔀　㐀䈀㤀㐀䔀㐀䄀㠀㠀㤀䄀䘀㤀㤀㄀㈀䈀㈀㌀㠀㔀䘀㤀㠀㘀㤀㔀　㘀㈀㄀䐀㜀䔀　㌀㈀䈀䌀㘀㈀䘀㠀䌀　㈀　　㌀䌀㌀㔀㘀㠀㌀䄀　㔀䈀䄀䘀䐀䈀䄀㈀䐀䈀䄀㄀㄀㌀䌀㜀䔀䄀䄀㘀䔀㤀䈀䔀䐀㈀　㔀㜀㐀䈀㈀㄀䐀㌀䄀䈀㘀㈀㌀䔀㈀䌀㤀㠀㠀㤀㜀㈀㌀䌀㐀䈀㄀㄀㄀䐀㌀㈀㈀䔀㘀㐀㔀㠀㠀䈀䄀　㠀㤀䔀㄀㜀㔀䐀䘀㔀㜀䄀㔀㜀㠀㐀㌀㌀䄀䘀㐀䄀䄀㜀㐀䐀䐀㘀䔀㘀㘀㠀䌀㔀㈀㄀㌀㤀䐀䄀㌀㈀䔀䐀㔀㠀䄀䐀䈀㠀㔀䔀䌀䈀㔀䌀㔀䄀㘀㜀㜀䔀㤀㔀㐀䈀㤀䈀㤀㘀㔀䔀㔀㔀䄀㘀㄀㤀䄀䈀㤀㤀䄀㘀㄀㄀䈀㜀㘀㠀㤀㠀㐀䈀㘀㌀䌀䘀䄀䌀䘀䄀㐀䄀㄀㔀㔀　　㤀㈀䔀㄀㔀㄀㘀㜀䌀䄀㔀　䌀㈀㠀㠀㔀㠀　㤀㈀㠀㄀䌀㠀㈀䌀㠀䌀　㄀䐀㌀㈀㌀䌀㐀㜀　㤀䌀䄀㔀㔀䐀㈀䌀㈀㘀䈀㤀㐀䄀㜀䌀㤀䌀䘀㄀䘀䘀㠀䌀㈀䈀　㜀䌀㘀䄀䔀㠀㜀㐀㘀㐀㜀㘀䐀㔀㜀㔀㠀㘀　㜀䌀䄀䐀㌀㜀㜀䌀䐀䌀㈀㐀㈀䘀㔀䈀䔀㌀䈀㔀㌀㔀䘀　㐀䘀㔀㜀䘀䐀㐀㐀䄀䘀㘀㈀㠀䐀㄀㜀䐀䌀㄀㌀㈀㜀㜀㤀㌀䄀㄀㤀䈀䈀䄀䔀䄀㤀㤀㌀　㤀㈀㌀㄀䄀䈀䐀䐀㄀䘀䌀䈀㜀䔀䌀㔀㈀䘀䔀䔀䄀㜀㔀䔀䈀䌀　㔀㐀㔀䔀䔀䈀㌀㔀㌀㔀㜀㠀㜀䌀䔀㈀䐀㘀䄀䐀䄀㘀䘀㈀䄀㘀㔀䄀䔀䘀㐀䄀㤀䔀㜀㘀䈀㤀䄀㐀㜀㐀㠀　䄀㜀　㄀䄀䈀㌀㐀㌀㤀䄀㘀㈀䔀㘀䌀㔀䘀䈀㠀㜀　㤀㄀㘀㌀䄀㄀　㌀㌀䘀㔀　䄀㜀㈀䔀㐀㐀䌀䈀䄀㈀㜀㘀䘀䌀㤀㄀䌀　䘀　㄀㌀䐀㤀䈀䔀㠀㠀㤀㜀㈀䌀㔀䄀　㠀㔀㠀䌀㔀䐀㄀㐀䘀㄀㘀㤀䔀　䔀䄀䌀䈀㌀㤀　䄀㌀㔀䐀㌀㈀㈀䐀㘀䌀㤀䘀䐀㘀㠀䔀䈀䐀㘀　　㄀㤀䄀㄀㜀㐀䄀㘀㘀㤀䔀㤀䈀㈀䄀㔀㔀㜀㄀䘀䌀㘀䘀㤀　㠀㔀䘀䘀㜀㔀㤀㔀䘀䘀㌀䔀㘀㄀䈀䘀䔀㔀䌀㔀䘀䘀䘀䘀㄀㘀䌀　䄀㔀䌀䌀䐀㜀䘀㔀䌀㈀䘀䔀　䈀㤀㄀㈀䘀　㘀㔀䌀䄀㜀　䈀䔀㌀䄀㜀㐀䐀㤀㔀䈀䔀㐀䄀㄀㄀㜀㘀　㜀㠀　䘀䘀䄀㘀㜀䔀䐀䘀䄀䐀䈀㠀㄀䌀䘀䘀䘀䐀㄀䔀䈀㘀䌀㌀䄀㌀䘀　㄀㠀㌀䌀　㔀㜀䘀㠀㐀䐀㜀䔀　㄀䈀䄀㘀㠀㈀㘀㘀䈀㠀㄀䄀㤀䔀㠀㐀䈀䘀䌀㈀㄀㜀䘀　　䘀㌀㠀㠀㤀㜀㜀㘀䔀㄀㠀㠀䈀㘀㄀㐀㤀㈀䌀䘀㌀㘀䌀㔀䘀䔀䈀㌀㠀㌀㜀䘀㄀㔀䘀㈀㤀㤀䘀　䈀㔀䄀䘀㄀　　㈀㠀㈀　　䔀㈀　㜀　㈀㈀䘀　䈀㤀䘀䘀㠀㄀䌀　䔀㜀䈀㠀㐀㄀㐀㐀䘀㐀䈀㌀䐀䌀㠀㐀䈀㤀㌀㠀㤀㤀䘀䐀㤀㐀㈀㔀㄀　㄀㤀䔀㠀㌀䔀䐀㌀䔀㘀䈀䘀䌀㤀䐀䘀䔀㔀㜀䘀㐀㤀䄀㄀　㘀䈀䐀䐀㐀㔀㘀㈀䘀䈀䌀㠀　䐀㘀㘀㌀䄀䌀㌀䈀㜀　㐀㈀㈀㠀䔀㌀䘀㤀㐀　㄀㄀䌀䘀　䈀䄀䈀㜀㤀㔀䄀㘀䄀㜀㄀㈀䌀䔀䌀　䔀䘀䘀　䔀䘀䘀㤀㘀䐀㌀䐀䌀㤀㤀　䘀　䈀䄀　㄀䐀㤀㘀䌀　㔀㈀㔀㠀　㘀㤀㜀䌀㈀　䄀䘀㠀㄀䐀㔀䌀　㘀㔀㜀䌀㈀㈀䄀㔀㠀　䐀㘀䈀䔀　㄀䄀㠀䌀䌀㔀㘀㔀㤀㠀䈀䔀㄀㘀䐀㘀䌀㈀㌀䄀䈀㠀　䔀䐀㘀䌀㌀䘀㔀㜀　　㌀䐀䌀　㠀㌀㜀䌀㄀䌀䐀㜀　　䈀䐀䌀　䄀㄀䈀䔀　㌀㘀䐀㠀　㠀㤀䈀㘀　㌀㌀䌀㘀䘀㄀㜀㘀䈀㠀　㌀䈀㘀　㐀䌀䈀㜀㠀䘀䔀　䔀䘀䌀㜀㜀䄀䈀㔀㐀䌀䄀㐀䈀䈀㘀䌀㄀䈀䐀䘀　　　㌀䌀㠀㐀䈀䌀　䈀䔀䔀㠀㘀㜀䈀䔀　㌀䔀䈀㠀㄀䘀䘀㌀　䘀㘀㈀䘀㐀㄀䘀㠀㈀㐀㜀䐀　㐀㘀㄀㘀䌀䄀㌀䘀㠀䌀㤀㘀䄀䐀㜀　㈀㜀㔀䄀䔀䘀㐀㔀㈀䈀䄀䘀䌀㔀㘀䐀㌀䈀䘀　㤀䘀㄀㜀㌀䄀䌀㄀　㜀㌀䈀㘀㄀㄀㜀䌀䔀㄀㤀䔀㔀㜀䈀㜀㌀㔀䐀㜀　　　㜀㘀䌀㌀㄀䔀䔀㐀㔀䔀㤀䌀䌀䐀㜀䐀䈀　㄀䘀㄀䔀㠀㜀㈀㜀㜀　㄀䔀　䘀䔀　䌀䌀㄀䔀㤀㐀㘀䌀䐀䌀䐀㈀㤀䈀䘀䘀䔀㤀㤀䄀䘀㐀䘀㤀㌀㐀㄀䌀㠀㈀㘀㜀䔀　㔀㤀㜀㠀　䔀㤀䔀㠀㜀㌀䘀䔀　䌀䄀㜀㠀　㄀㔀䔀㠀㐀䌀㌀䘀　㄀㈀䈀䌀㜀䌀㐀䔀㈀㔀䌀䘀䘀㐀㔀㤀㜀㠀䔀䔀㄀㔀䘀㠀㄀㌀䈀䌀㠀䄀㘀䈀䔀䐀　㠀䈀䌀　䔀㘀䘀䌀　㤀䘀䔀㄀㐀䐀㜀㠀㄀䈀䐀䔀㠀㌀䘀㜀䔀㄀　㌀䘀㠀　㠀㔀㜀䐀䐀䐀㄀㜀䘀㈀㤀䘀䘀　䈀䐀㘀㜀㠀　䈀䔀䈀䈀䌀㄀䈀䄀䌀䘀㔀㈀㄀䐀㘀䘀䄀　㐀㌀䔀䌀㜀㤀䄀䐀䐀㔀㠀㤀㌀䔀䄀㔀㄀㤀䐀㜀㜀䄀㐀䐀㈀䌀䘀䄀㐀㄀䔀㠀䔀㘀　䐀䈀　䘀䔀　㘀㌀㄀㘀　䔀䌀㜀㤀㤀　　㈀㜀㈀㄀㠀　㈀㤀㌀䔀㜀䈀䈀㜀㐀䄀㌀㌀䈀㐀㔀㄀㤀䄀㐀㜀㌀䔀㜀䈀㜀䌀㜀㘀䔀䔀㤀㘀䔀㈀䌀䌀䔀㜀㘀㌀　㜀䔀㘀䘀㤀　䌀䐀䐀䐀㜀㌀㜀㌀㜀　䘀㘀㌀㠀䌀㄀䘀䌀㘀䘀㤀䔀㐀㌀㤀㤀䔀䐀䔀㄀㐀㤀䌀㠀䐀㐀㜀䈀　㘀䔀㈀㜀㐀㘀䈀　㌀㜀㜀䔀㘀㜀㠀䘀䐀䄀㐀䈀䌀㄀䐀㤀䄀㄀㜀㠀䔀䘀䌀㜀㌀䄀㌀䌀㄀㘀䈀䌀䔀㐀㜀　㌀　㄀㘀䌀䘀　㔀㘀㜀㠀㈀䘀㜀䘀㌀㐀㐀㔀䘀䐀䈀㄀㜀䄀㐀㌀㈀㤀䘀䐀㐀䔀䔀㘀　㔀䘀䄀䘀䄀㜀㈀㈀㐀䄀㈀㌀㜀䌀䈀䐀㔀䘀㜀㐀䐀䔀䔀㤀㄀㜀䌀㌀㐀䘀䔀　㘀䘀㔀㈀㘀㐀㈀㠀㜀䄀㔀㐀㜀䄀㈀䄀㜀䄀䈀䌀䌀㘀䌀㜀㔀㠀㠀㜀㐀㜀㤀㤀䘀㜀㜀㄀㜀䄀㘀䌀㌀䘀䌀㈀䈀㘀㄀㐀㜀䐀䐀䔀㤀㘀䐀䈀䘀䈀䈀㜀䔀㄀㘀㔀㘀䘀㘀㄀䘀䔀㜀㌀䐀䌀㄀䐀㠀䔀㘀㈀䄀㐀㌀㤀䈀䘀㤀㐀㘀㘀䔀㈀㐀䈀䘀㠀䈀㐀㈀䘀䘀䐀㘀㤀䈀　䈀䌀㄀䈀䘀䔀　䔀㔀䘀䌀㄀㜀㄀䔀㤀䘀㌀㄀㠀㜀䌀㠀䐀䘀䈀䌀㤀㌀㜀䘀　㈀䐀䔀㘀䈀䘀㐀㌀䌀䈀㌀㄀䌀䌀䘀䐀䄀䈀䘀㔀㐀䌀䌀䈀㌀䘀䘀㄀䐀䘀䘀㜀䘀　　㌀㤀䌀䌀　㄀㤀䘀䌀㄀㄀㜀䄀䘀䄀䔀㔀㜀䄀䌀䔀㈀㠀䔀㤀　㄀㌀䘀䌀䔀㌀㄀㄀䔀㌀㄀㤀㠀䌀　㐀㐀䘀　㤀䘀㐀䄀㤀䐀䈀㈀㐀䄀㈀䄀㘀㌀㜀㈀䄀㘀䌀　㌀䐀㈀䐀㤀䌀㈀㤀㤀㤀㠀䄀㘀㤀㤀㠀㤀㘀㐀㔀㌀　㄀䐀㄀䔀㔀㠀䌀㈀䌀䔀㈀㠀㔀㄀䘀㜀㤀㔀㄀㠀䘀䔀䄀㔀㐀㐀㜀㌀㤀㘀㌀㈀䄀㔀㘀㐀㠀㤀㘀㐀㔀㄀㈀䌀㄀䄀䘀㜀䌀䈀㌀㠀㄀㘀䌀䘀㄀㈀㤀㤀㄀㄀䘀㜀㐀䐀㄀㌀㌀㌀䈀㌀㘀㐀㤀㘀䌀㈀㔀㈀䘀䈀㤀㔀㈀㔀䘀㐀㤀㔀㔀㠀䈀　䌀㐀䌀䄀䐀㈀㤀㠀㈀䐀㔀㠀㄀㘀㈀䈀䈀㔀㐀䌀䔀㠀㘀䈀㤀䈀㠀䌀㌀㔀䔀㈀䘀䄀䐀㔀䌀䐀㘀㐀䈀㤀㘀䌀㌀㄀㜀䔀㌀䄀㤀㠀㤀㌀䔀㔀㘀　㌀䄀㠀䘀　䐀㘀㐀㠀㔀㘀䌀㄀　㈀䈀㐀㄀㐀䈀㌀㘀䔀㘀䘀㌀㌀㄀㔀䘀㠀䄀㘀㔀䈀㤀㄀㈀䌀䈀㘀㄀㄀䌀㐀䌀㠀㜀　䈀䔀㄀㠀㐀䘀䌀㌀㌀䔀㄀㐀㔀䔀䌀㌀䘀㄀䄀㜀㜀㤀㔀䌀䔀㜀㌀䐀䐀䈀㔀䔀㔀　䘀㐀㈀　䌀㘀䌀　䐀㜀䌀㄀䘀㈀㠀䘀㜀㘀䘀䔀䈀䐀㤀㈀䘀䔀䔀㘀㘀㠀䐀䔀䌀㐀㔀㠀䌀㐀㠀　㐀　㐀㜀　䄀㘀㈀䔀㘀㈀㈀䔀䐀㠀㈀䄀㤀䘀　䄀㄀㜀䌀㠀䔀㜀　㜀䈀䔀㘀㌀䄀㤀㠀㄀䄀䘀䔀㔀㈀㌀　㌀㐀㜀㘀㔀㈀㜀　㈀㐀㜀㔀㤀㔀䔀䔀　㔀䈀㔀　㠀㤀㔀䈀䌀㔀㔀㤀㜀㠀㄀䘀㜀䌀㈀㠀㄀䈀　䐀䌀䈀䘀㄀㄀䌀　㠀䘀䔀㠀㔀䔀㈀䐀䈀䈀㠀㘀㌀㠀䈀㄀　　㘀㈀㔀㔀　　㜀㘀㌀䄀　㜀㄀㌀䘀㘀㠀䐀㤀䔀䐀䈀㠀䄀䐀㤀㜀䈀㈀㄀㜀㜀㘀㔀㔀㔀㐀㠀㐀㘀㜀㠀㜀㌀䐀㠀㄀㔀㤀　㄀㈀䌀䔀䌀　㔀　㠀䌀㜀䔀㤀䈀䈀䐀䐀㄀㔀㈀㔀㄀㌀䈀㐀㐀㘀㘀㌀㤀㤀䈀㔀㔀　䈀㄀㔀㘀䄀䌀㌀㜀䐀㐀㤀㐀㠀㔀䄀䐀㄀㔀㄀䄀䄀㄀䄀䌀䔀㜀䈀䐀㜀㜀㤀䘀䌀㔀㠀䘀䌀㌀㤀㄀㈀㔀㌀㤀㠀㜀㔀㤀䌀䔀䈀䈀䐀䐀㘀䘀㜀㐀䔀䈀㜀䈀㤀䔀㌀㔀㤀㐀䔀㐀㜀㐀㄀䘀䔀㤀䌀䔀䌀䐀㘀㌀㠀㘀㄀㐀㠀㌀䄀㐀䐀㄀㄀㄀㐀㈀㔀㠀㤀㠀㐀㈀㘀㄀㐀䐀㜀㔀　䄀㠀㔀䔀㤀䘀㘀䄀㈀㠀㈀㠀㈀䘀䌀㘀㄀㐀㈀䔀㄀㐀　䈀䈀㌀㔀㌀㔀㐀㈀㤀　㘀䌀　㌀㠀䈀　㘀　䐀㄀㌀　䈀䘀㈀䌀䐀㠀㈀㄀㠀䐀䐀㘀䈀㄀㤀㈀㘀䘀　㌀䌀㄀㌀䐀䘀䘀䔀㜀㄀䄀䌀㔀㠀䐀㤀㤀㌀㈀㘀㈀䌀㐀䐀㄀㤀䐀䌀㤀　㈀㜀㘀㜀　䔀㔀䈀㔀䌀㜀㈀㔀㐀㜀㠀䈀㠀㤀㠀㘀䌀䐀㘀䐀䄀　䄀㈀䌀䈀䄀䐀䄀㌀䄀㘀䈀㔀㄀㐀㘀䄀㈀㔀䌀㄀㘀䄀䔀㄀　䔀㔀䔀㄀㘀㄀䔀㤀㐀㔀䔀㔀㔀㘀䘀㜀䔀㈀㔀㄀䄀㤀㈀䘀䄀㤀䔀㈀䐀㌀㤀㌀㐀䌀䔀㤀䘀㄀㈀䄀䄀㐀㈀㤀　㤀䐀㤀㜀㌀㔀　㄀䔀㜀㄀䔀㈀㄀䘀䘀㈀㠀㠀㤀㌀䔀㜀䌀㤀㈀䄀㐀䔀䔀䔀㄀㜀㌀䔀㈀䈀䘀㄀　䌀㐀䈀㔀㌀㈀䌀䐀㔀䄀䄀　㔀䈀㤀㌀㈀䘀䌀䘀㘀　䌀㜀㌀㐀䌀㔀䄀㔀䔀䐀㈀䐀　㔀䄀䄀䐀㐀䔀㈀䈀㠀䘀㌀　䌀㘀㈀㔀㈀㘀㠀㔀㠀㔀㄀䈀㈀㈀㔀㐀　㌀䄀䄀㔀䈀㜀䄀㌀㘀㈀㘀䐀䄀䔀㈀㔀㐀䄀䄀㌀㠀㔀䈀㘀㈀㤀㈀㠀䐀䘀㜀㘀㔀䔀䈀㄀㤀㠀䌀㄀㄀㠀㤀　䈀㤀䌀㤀　㌀䐀㈀䐀㠀䘀㠀㘀㔀㐀䈀　䌀㌀䈀䈀䘀䌀㤀㐀䔀䌀䘀㘀䔀䌀㠀㔀䈀㐀䌀　㘀㜀䈀䈀䐀㐀㌀䄀㌀㘀䐀䄀䐀䄀㄀㔀䘀㠀䌀䌀㘀㔀䔀㈀㈀㤀㤀䈀㐀㘀㘀䈀㠀䐀䐀㜀㐀㈀㈀䌀㠀䈀㠀㠀䈀㔀䄀䈀㔀㔀䐀㘀㔀㐀㄀㔀䌀㠀䄀䌀䌀䌀㘀　䈀㔀䐀䈀䘀　　䐀䐀㐀㘀㔀㜀㘀䄀㤀㐀㄀䌀㌀㈀㈀㐀㔀㠀䐀㈀㘀䐀䐀㤀㐀㘀㘀䈀㔀㤀䄀㔀㔀䐀䄀㔀㠀䈀　䄀㘀䌀㘀㠀㜀㐀㔀㤀䄀䌀㘀㐀㜀䈀䄀䔀㔀㘀䔀㠀㠀㈀䘀㈀䈀㈀䈀㠀䈀㠀䌀㈀䈀㈀㤀㌀㘀㄀㐀㄀㠀㌀　䈀　䐀㌀䄀㘀㐀䔀㈀㤀㐀㠀䔀䌀䌀䔀㘀㜀　㤀㌀㤀㔀㌀䄀㜀䌀㐀㄀䘀䌀䔀㈀䘀㔀㠀䈀㄀䘀䄀䐀　㈀㄀㄀㘀㜀䘀㘀㠀䔀䄀㄀㐀㐀䄀䔀㘀䔀㘀䔀㄀㄀㤀䐀䄀㜀㠀䈀䄀　䘀㠀䘀䘀㈀䌀㐀㈀䘀䈀㠀㔀㘀㘀䔀㤀䔀䌀㌀䐀㄀㘀㐀㠀䈀㠀䐀䄀㔀㌀㤀㐀䈀㄀㜀㔀㌀䌀㈀㈀㈀㐀㐀㘀䈀䄀䄀䐀䐀㔀䔀㌀㐀㠀㠀䐀㄀㐀㐀䌀㔀㠀㔀㔀㤀䌀㔀㄀㐀㔀㤀䄀㜀㐀㘀㄀㄀㔀䈀㤀䌀㔀㜀㔀　㘀㈀䐀㘀䌀㠀䌀䔀䘀㌀㈀㜀㠀䔀㤀㜀㘀㤀㐀䐀㠀㔀　䔀䔀㜀䌀　㘀㠀㠀㔀㠀㘀䄀䐀㔀㜀䔀㠀䄀䐀䌀㌀　䄀　㘀㔀㜀䄀㔀㄀䈀㄀㐀　㜀䐀㤀㄀䔀㌀㘀㘀䘀㜀䄀䐀䄀㠀　㄀㠀䈀㤀䄀㠀䐀㐀㘀䈀㤀㤀䄀䌀㈀㜀㈀㈀㐀䄀㈀䐀㔀㌀䌀㐀　䐀䈀　䌀䄀㤀㘀㄀䈀㘀㈀䐀㐀䄀㈀䄀㠀㠀䔀㠀䐀㜀䄀䈀㘀䔀㜀㈀䐀㜀䌀㐀㄀㄀㤀㄀䈀䘀㠀㔀㈀䄀㘀㤀㄀㔀䈀㜀㄀㐀㔀㔀䔀㐀㌀㜀㄀䘀㔀㈀㔀㠀㄀䔀㌀　㤀䔀㄀㌀㤀㠀㠀㠀　㜀㠀䐀㘀　㈀㈀㤀㘀　　䘀㠀䔀䐀　䌀䔀㜀䘀㠀㜀㄀　䐀㔀㈀　䔀䈀㘀㈀㄀㌀䘀㜀㄀㐀䔀㘀䌀㘀㜀㌀㔀㌀㈀䔀䘀䘀㈀㔀㠀㌀㐀䈀㌀㤀　㄀㠀㜀㤀㌀䐀㠀䔀㌀㌀㠀䐀㈀㔀䐀䌀㘀㌀䘀㄀㠀㈀䔀㐀㌀　䌀㠀䘀㜀㄀䘀䘀㌀㤀䈀㘀䌀䘀䌀䐀㘀䈀䈀㈀㐀㔀㐀㜀䐀　䈀㈀㄀䐀㄀㠀㔀㤀㔀㐀㠀㐀　㌀㔀㜀䌀㐀　㐀㔀㜀㈀㠀㔀䘀䈀䈀㌀㄀䐀㄀㘀㘀㠀㄀㈀䘀㘀㔀㄀䔀㄀　㤀㤀㐀㘀㔀㐀䄀㠀㘀㈀䌀䈀㈀㘀䈀㔀㔀㜀㔀䌀䘀䐀䌀㘀䄀䐀䔀㌀㌀䌀㜀㜀䈀䌀㜀䈀㜀㔀㔀㄀䄀䈀䈀䈀䌀㈀䄀㠀㔀㈀㠀㠀㌀㈀㔀㔀㠀㐀㔀㈀䔀㜀䄀䌀㤀㤀㔀㤀㔀㔀䈀㜀䐀㐀㤀䐀㤀㔀㜀㌀䐀䔀䄀㔀㜀㔀㔀㔀䈀㌀㘀䄀㜀㈀䈀㐀㈀䄀㐀䐀䈀㠀䔀䌀㔀　㠀㈀㌀㔀㈀㄀㌀㈀㈀䔀㈀䐀㈀㔀㜀㘀䘀䌀㔀䐀䐀䘀㘀䔀䈀䈀㠀㜀䌀㄀㈀㌀㄀㌀㈀㌀㐀䐀㜀㘀㘀㌀㘀㐀㤀㈀㌀䐀䌀㤀㌀䌀㈀　㔀㄀㘀㌀㜀㔀㔀㠀䌀䈀䐀䄀䔀䘀㘀䐀㔀䈀㜀　䐀䘀㠀㔀㠀㔀㈀㤀㄀㤀㤀㘀䘀　㜀㠀　㜀䘀䘀䘀䔀䔀䐀㌀䄀　　䐀㤀　㄀䈀䌀㜀㌀㈀㌀㈀㄀㄀㤀䔀㘀㔀㄀㤀㐀㤀䔀㠀㐀㈀㠀㘀㄀㌀㌀䔀䔀　䘀㠀㤀䌀㈀㠀䐀䄀　㠀㐀䘀㠀䔀　㄀㠀䔀㌀䈀䈀㤀㠀䐀㌀䄀㔀㠀䌀䄀㠀㌀㜀㐀䄀䌀㌀㌀㌀䘀㈀䐀䘀㤀　䈀㠀䔀㐀㠀䐀㜀䌀㜀㠀䐀䐀㠀䔀䈀㈀㘀䔀　㜀䄀㌀㌀䈀㄀㐀㤀㜀䌀䐀䈀䘀䐀㤀　　㘀㌀䌀㄀㘀䘀㘀㌀㘀䈀㐀䄀䄀䄀䈀䐀䐀　㌀　䈀　䄀㠀㈀　　㔀䌀㜀㈀䌀㄀䘀㠀㠀㜀㄀䈀　㄀䄀㜀㠀　㠀㘀㐀　㜀䄀㘀㌀䌀䘀㈀䌀㌀㐀㌀䘀䔀㄀㜀㔀㈀䈀㈀䈀㌀㔀㌀䐀㠀䔀㠀㠀㜀䈀䘀䈀䔀㘀㜀㠀㈀䘀䘀㤀㠀㘀㌀䐀䄀㈀䐀㐀䈀䄀䘀䈀䔀䔀㘀䌀㈀㤀䈀㘀㜀䔀㐀　㤀㤀䈀㜀䌀㌀䐀㔀䈀㘀䈀䐀㌀䈀㌀㘀㐀㘀䐀㔀㤀䔀㤀䘀㔀㔀䈀䈀䔀䈀㠀㘀䈀䘀㈀㄀䐀㠀䈀㠀㘀䘀䘀㜀㠀㜀䐀䘀㄀䌀㔀䘀㜀䔀㌀䄀䌀䔀㌀㠀㠀䌀㐀䈀㔀㌀㠀䄀㈀㈀䌀㜀㠀㠀㐀䌀㘀䐀㌀㤀㤀㤀㠀䐀䔀㈀㔀䐀䌀䔀㠀䐀㈀㈀㤀䄀㌀㈀䌀㔀㄀㄀㘀㄀䌀㔀㄀㘀㈀䈀䌀㄀㘀㄀䐀㐀䄀㜀䌀　䌀㐀䘀䌀　㌀㠀㠀㄀䈀䈀䈀㔀䄀䌀䌀䔀㘀䔀㔀㜀㈀㐀㜀㐀　㔀䐀䐀㐀䔀㤀　䐀䌀䐀㘀䐀㘀䄀㜀㐀䈀㘀䔀䄀㜀䘀㌀䐀䘀䘀䐀䈀㠀㄀㐀䄀㜀䐀䌀䌀㘀㈀㔀䔀䐀䔀　䄀㌀䌀䐀㠀㤀㈀䌀㈀㤀䌀㤀䌀㤀䐀㄀䘀㌀㤀㔀㘀䐀䐀䌀䘀䐀㈀䈀䘀㐀㐀㠀㐀䈀䔀㌀䘀㐀㜀　㐀㠀㐀䈀㈀㌀䌀㔀㜀　㐀㘀㄀㈀　㜀䄀㜀䐀㈀㈀㤀㜀䈀㈀䔀䔀㄀㤀㄀㄀㄀㔀㘀㈀㤀㈀㌀㔀㐀㜀㈀㌀㤀㈀䔀　㠀㜀䘀㌀䔀㔀䈀䄀䐀䐀㐀䘀㄀䈀㐀㐀䔀䔀㤀㔀䘀䌀䄀㔀䔀䔀㔀䔀㤀䐀㤀䈀㠀㘀㔀䄀㤀㈀㤀㐀㠀䄀䄀㠀㐀㜀㐀㌀㌀㘀䔀㔀䌀㘀䄀䘀䘀㈀㄀㜀㔀㄀䌀㘀䔀㘀㔀䘀㘀㌀㠀㤀㔀䘀䘀㈀㘀㜀㔀㜀䌀㌀䄀䘀䘀㌀㘀䘀㘀䈀䄀䌀　　㤀㜀㄀　㘀䌀㘀㈀䈀㄀䐀䘀㘀　㐀䔀㌀㄀㔀㄀㘀䐀㔀㈀㔀䐀䌀䔀䌀㠀䄀䐀㔀㤀䄀䌀　㘀䌀　䄀䌀䈀䐀　䈀㄀䈀䄀䈀　㜀㠀㠀䐀㤀㘀㠀䐀　䔀䐀㌀䄀䈀㌀㄀䘀㤀㄀㠀㌀䈀　䘀䄀㈀　㈀䌀㜀㜀㘀㘀㌀㌀䄀㈀䄀㈀䄀㐀㄀䐀㄀㄀㔀䘀㠀㘀　㈀㜀䐀㘀㔀　㐀㠀㠀㌀㠀䐀㘀　䄀㌀㄀㔀㔀䐀㘀䌀䐀㈀㈀䔀㔀㜀㘀䄀㜀䐀㠀㈀䈀㐀㄀㄀䔀　　㠀㠀㌀䔀㌀㜀㌀䘀　㤀㠀㄀䐀㌀㈀㤀㐀㐀㠀　㄀㜀㌀㄀㤀㜀䔀䈀䐀㘀䔀䘀䈀䐀㘀㔀㄀䘀䘀㌀㠀䘀㔀䔀䔀䘀䄀䈀䐀㤀㄀䌀㐀　㄀䄀䄀㌀㄀㐀㘀㐀䐀㘀䌀㤀䐀㌀㈀㐀㈀㈀䐀㤀㜀䐀㈀　䈀㌀㔀䌀㤀䘀㤀䔀㤀䘀㘀　㈀䈀㌀㄀㘀䄀㌀䐀㠀䌀㈀䄀䐀䈀㈀㘀䐀䔀㘀䌀䌀㜀㠀㠀䐀䘀䘀㘀䔀㔀㔀㜀䌀㠀㘀䐀㤀㤀䌀㤀㄀䄀㠀䘀㘀㤀䈀䐀㔀㜀䄀䈀㔀㐀㈀㠀㄀㄀䘀䈀㈀㔀䈀䈀㈀䐀㈀䐀㔀　㤀　㌀㌀　㔀㘀㌀㔀㠀㄀㈀䘀㘀㐀㤀䈀䔀㔀㘀㤀㔀　　㘀㘀䘀㔀㈀䄀䌀㜀㘀㈀㘀㈀㔀䔀㤀䔀㈀䘀㤀㄀㜀㄀　㈀　㔀䐀䈀㜀㐀䘀䐀㠀　㠀　㌀䘀㤀䘀㈀䔀㜀㤀䔀䌀㜀䄀㌀䔀㜀㌀䈀䈀㔀㄀㈀㠀䘀䔀䐀䐀㐀㜀　䈀㈀䘀㐀㔀䐀䄀㤀䄀㤀㈀㔀㌀㤀䌀㌀䘀㘀䈀㄀㄀䌀㜀䌀㘀㈀䄀䄀㠀㈀㠀䈀㐀㌀㠀㔀　㌀㜀㌀㈀㤀㐀䈀㄀䄀䄀㈀䄀㔀䌀㔀㄀㄀䌀䐀㜀䘀㠀䈀䔀㤀䌀䄀㤀㤀㄀　㔀䌀㄀䌀㜀䌀䌀䘀䔀　㤀䈀㈀㠀㠀㔀　䘀䘀㜀㤀䔀㘀䔀䌀䌀䘀㐀䐀䔀㘀㐀䘀䘀㈀䐀㔀㜀䔀㤀㠀䐀䔀㘀㘀㤀㄀䈀㔀㈀䐀㄀㈀　　㌀䔀䔀䐀㔀䐀㈀㈀㌀㔀㐀㠀䄀㌀㄀㠀㘀㔀㜀䐀㘀䔀䘀䄀㄀㈀䄀䌀㌀㤀　㈀㠀䈀㔀㐀䄀㘀䐀㘀㤀䘀㌀䐀㔀㤀䔀䄀㤀䈀㜀㔀䐀㔀㠀㌀䄀䘀㠀䘀䌀㔀䈀㈀㘀㘀㘀㐀䐀䈀　㄀䐀㠀䘀㠀䌀䔀㘀　䈀㤀㌀㌀䐀䄀䄀㐀䘀㠀㠀㔀㈀䌀㔀　䌀㘀䘀㤀䔀㌀䐀䄀㜀㜀　䘀㌀䘀㄀　㜀㈀㜀㌀㘀㜀䈀㜀䘀䐀㠀䐀㠀䐀㠀㌀㄀䈀䈀䌀㈀䄀㠀㤀㄀㔀㔀㤀䄀　㘀㈀㐀䄀㠀䐀㈀　㘀䄀㐀　䐀㔀䘀㜀䌀䐀䘀䌀䌀㜀㤀　䘀㈀䌀㈀㠀㠀䐀㠀䔀㘀㘀㔀㤀䐀㤀㐀㔀㐀㤀䘀㘀㌀㠀䈀㔀㌀䄀㌀㘀㌀㤀䈀䄀䄀㜀䌀㜀㤀䌀㤀䐀㤀㠀㄀㐀䄀䐀㘀䄀㜀䄀䔀　㤀䈀㐀䐀㔀䈀㜀䄀㌀䄀䄀㜀䌀㘀䄀㔀䐀㠀㤀㌀　䄀㠀㈀䘀㜀㜀㜀㈀㌀㌀䔀㈀䘀㄀㌀䄀㄀䄀㘀䘀㜀㘀㤀㄀㤀㠀㌀䌀䈀㔀㔀　䐀㐀䄀䐀䐀䘀㠀㄀㠀㘀㤀㜀䌀㌀㄀䘀䌀䈀㜀䈀䘀䄀㜀㘀䔀㌀㄀㤀㘀㜀㌀㤀㠀䔀䘀㐀䌀䄀䔀㤀䘀㈀䄀㌀䘀䘀䐀䐀㘀䄀㌀䐀䐀㌀㜀㠀㘀㘀䔀䈀㔀㐀㘀䈀䌀㤀䐀㔀㐀㌀䐀㌀䈀㔀㈀䈀㈀䈀㔀䔀㘀　㈀㜀䈀㜀䄀䈀䔀㔀㤀䌀䈀㌀㘀䄀　㐀㄀㜀䔀㤀㄀㌀㤀䐀㌀䄀㠀䌀㄀㄀䈀㘀䈀㠀㌀㐀䄀䄀䘀㔀㈀㈀㠀䘀　䔀㌀䔀㐀㔀㜀䔀䄀㠀㐀㐀䌀䈀䄀㤀㜀㄀㐀㄀㜀䔀㌀䈀䐀㌀㐀　㐀䘀䔀㐀䌀䈀䔀䈀㤀䐀㐀䐀䄀䐀䌀䐀䌀䈀㠀㤀䌀㄀䌀㤀㔀㌀㌀㌀䔀㌀䔀䈀㄀㐀䈀㘀㠀䐀䐀㤀㔀㤀㘀䄀㜀䐀㄀䄀㠀㌀　䈀㄀　㜀䐀㈀㠀䄀䔀䄀㄀㌀㌀㐀䔀䄀䘀㠀㜀䐀㈀䌀㄀䈀㔀䌀䔀　　䌀㄀䌀䐀䈀䄀㔀䈀㜀　䄀䄀㌀䘀㌀㜀　㈀㈀㔀䐀㄀㘀㤀䔀㠀䄀䐀㌀䘀㌀㐀䘀㈀䐀㜀䐀䌀㘀䔀㄀䄀䌀㌀䈀㄀㔀䌀㤀㄀㤀䘀㔀䌀㤀䔀䔀䈀䔀㘀㜀㈀䌀㜀䘀䌀㠀䘀㈀㔀䘀　䄀䔀　䐀㌀㌀㔀㌀䘀㄀䘀　㜀㜀㤀䄀㐀㌀䈀䐀䘀㔀　䄀　䔀㜀㄀䘀㠀㘀㤀㈀䄀㄀㌀㤀　㔀　㔀㠀㘀　㈀㄀䌀䘀㐀䄀㌀䈀䘀䔀䄀㐀㔀㜀䄀㈀㌀㈀㔀䐀䐀㔀䄀㔀㘀䌀㘀㄀䘀䔀㄀䘀㠀㌀　㘀㜀䐀㘀䐀㌀䔀䔀㌀㜀䔀㤀㘀㤀䌀䔀　䄀䘀㠀㜀㌀㔀䐀㠀䄀䄀㐀䔀㈀㘀㈀䈀㔀㈀㤀䐀㜀㤀㘀㤀㘀㤀䈀䄀㐀㄀㄀䘀䌀䐀㜀䌀㠀㈀㈀㤀㌀㜀㌀㔀㌀㔀㌀㜀㌀㤀㌀㈀㌀㐀㔀䘀䘀䄀䐀㠀㈀䐀䄀㤀䌀㠀㌀㜀㘀㤀㌀䈀䄀㈀㠀䘀䈀㈀㄀㘀㜀㜀㤀䄀䔀㐀㔀䌀㌀䔀㈀㘀㔀㈀䌀㔀㔀㤀䈀㤀䌀㔀㤀㘀䌀䔀䈀㌀㐀䄀㘀㈀㜀㘀㠀䐀㌀㜀䄀䄀㌀㈀䈀㌀㌀㤀䐀䘀䌀㔀㠀㘀䈀㔀　㠀㤀㜀㈀㜀䔀㈀䘀㈀㘀㤀䐀䘀䌀㘀䈀㤀䘀䘀䐀䘀㈀㠀㈀㈀㈀㤀䐀䈀㔀㘀㐀䌀　㠀䘀㌀䐀㈀㈀㄀䈀㔀　㤀䄀䄀㘀㠀䈀䌀　㔀㘀䌀㄀㄀䐀㐀䐀䐀㘀㈀㔀㠀䘀㠀㐀䄀㄀䈀　㤀㌀㘀㘀㘀㄀㜀㜀䈀䄀㐀䔀䔀㔀䐀㐀䔀㤀䄀㈀䘀㤀䘀㜀㌀㈀䌀䌀䌀䔀㜀䌀䌀㐀㈀䔀㌀　㄀㜀㠀䘀䌀䘀䔀㐀㜀㄀㠀㠀䐀㐀䐀㤀㠀㔀䐀㄀㤀㤀㄀㤀䌀䔀㔀㐀㠀䐀㤀䔀䄀㜀㌀㐀㘀䄀㠀㔀䄀䔀㠀䈀䄀䐀䐀㠀㠀㌀㌀䈀㈀㘀䐀䘀㘀䐀㤀䌀䘀䌀㌀䘀㔀㔀䘀㐀㈀䔀㄀㔀㠀䌀㐀㘀㐀㤀㐀㤀䈀㜀䄀㄀䄀㐀䌀㐀㠀㄀䈀㜀㐀䈀㠀㤀㠀㌀㘀㈀㠀䔀㄀㄀䌀䘀㌀㄀㔀　䈀　㜀䐀䈀䘀䈀䌀䌀䈀䐀䔀　㠀㔀㌀㘀　䔀䐀䘀㘀㜀㐀㘀䈀㘀䌀㘀䌀䌀䌀䈀䘀㠀㘀㌀㜀䌀䄀㈀䌀䌀㘀㄀㔀䐀㠀䘀䈀㈀䐀㔀㜀㔀㤀㤀㜀䐀䔀㘀㠀㠀䈀㤀䄀㘀䘀㈀䐀㜀　㘀㐀㈀㐀䘀㠀㤀䘀㐀㠀㈀䄀㠀䐀㄀㌀㘀㐀㌀㈀䈀㔀䐀㄀㤀㤀㘀㘀㜀㔀㈀㘀䄀䄀　㘀㘀㔀䄀䌀䈀㌀　䘀䌀䌀㐀䌀㠀䈀䘀䄀㌀㄀䐀㘀㤀㄀㘀㄀㠀䘀㘀㐀䄀㈀䄀㠀㐀㤀㜀㈀䄀㘀䄀㔀㌀䄀㄀㌀㔀㐀㤀㌀䔀㌀䐀㈀䔀㈀䐀㔀㄀㄀䈀㘀䈀㈀㜀䌀㘀㄀㐀䄀䐀㄀㠀䄀䌀㄀䐀㔀䔀䈀㐀㜀䘀㜀㐀䌀㔀㈀䐀㄀㤀㘀䄀㜀㤀㈀㔀䐀㤀䈀㤀㌀䄀㌀㌀㔀㄀㜀䄀㘀䘀䈀䐀㌀㄀䐀　䐀　䐀䔀㌀㌀㈀䄀䄀㘀䔀䄀䈀㄀㐀䄀㘀䄀㤀䘀㐀㄀䄀䈀㤀㔀䌀䄀㌀㔀㜀䔀㄀䄀㤀㘀㄀㔀䌀䔀　㜀㌀㜀㤀㠀㈀䐀䌀　㘀㔀㄀䘀㠀䐀㐀䔀㠀㌀䈀㌀㔀㐀㐀　䈀　㜀䘀㄀䐀㐀㘀　䌀㘀㐀䘀㄀㔀㈀㐀㤀䌀㜀䄀䘀㘀㐀䐀䌀㘀㄀䈀䄀䘀䌀㄀㄀䄀㐀䘀㈀㜀㐀㤀㜀䔀䔀㌀䌀㤀㈀㜀㤀䌀䔀㔀䐀㐀䘀　㘀䘀㌀㘀䔀㠀䈀㜀㌀䘀䘀㔀㄀䔀䔀㤀䄀㔀㐀㌀㐀㌀䈀䘀䌀㌀㤀㌀㌀䌀㘀㄀䐀䌀㄀䐀㤀䘀㘀䘀䐀䌀䘀　䔀㄀䄀䐀䈀㔀䌀㠀㐀䐀㌀㜀㜀䐀䈀㠀䄀㄀䌀䔀㜀䘀䐀㐀㔀㈀䈀㜀䈀㈀䈀㤀䔀㔀㠀䄀㜀㄀㈀㤀㤀㘀䐀㄀㈀䈀㔀䈀㌀㠀㠀㔀㔀䈀䔀䘀䘀㐀㜀㜀㐀䔀㄀㤀䈀䈀䔀䐀䌀㐀䘀㘀䐀䈀㐀䘀㜀䄀䄀㜀㠀䔀䐀㤀䘀㘀䌀䘀䐀䐀䈀㌀䔀䔀㔀䈀㌀䌀䈀䌀㘀㘀䐀㤀㔀䐀㤀㌀䌀䔀㜀䘀㘀　㐀㤀㔀㤀䘀㔀䘀㈀㜀䈀䘀㠀䌀㤀　㠀㔀㜀㔀㄀㄀䐀䐀䔀䌀䈀㐀㔀㔀　　㄀㤀䈀㘀㤀㠀䌀䈀䈀䘀㐀㐀䔀㐀㌀䄀㘀㘀䄀㤀䘀䘀　㈀䌀㠀䔀㜀㌀㤀　䈀　䐀㤀㤀㜀㔀㤀㘀㘀㤀　䈀䔀㠀㌀䔀㘀䐀㐀䘀㜀㌀䔀䔀䈀䘀㔀㔀䐀䌀䌀䈀㘀䐀㌀䔀㔀㠀䄀㄀䈀䐀䄀㘀䈀㄀㠀䐀䄀䌀㔀㌀㈀㜀㜀䈀䈀㔀㈀䔀䄀䔀㌀㜀䄀䔀䘀䄀㠀㐀㐀䔀㤀㠀㤀䐀䘀䔀䐀㈀㠀䌀㄀䈀㄀䔀㜀㄀䘀䔀㤀㤀㘀䈀㘀䐀䔀㄀㈀　䌀㐀㄀䔀㜀㌀㤀㜀㔀䐀㈀䔀䘀㠀䔀㐀䌀㄀㜀㤀䐀䄀㈀䐀㔀㜀䄀䌀㘀䄀㌀㈀䘀㌀㘀䌀䔀㈀䌀䘀㈀㘀㜀㘀㈀㄀㠀㈀䔀㤀㠀䈀㠀䐀㠀㔀㠀㌀㘀䐀　㤀䔀㘀䔀䈀㜀䘀㜀㄀䔀䈀㄀䔀䄀䌀㈀䌀䐀䄀㔀䘀㤀　㌀䘀㈀㐀䐀㄀䄀䐀㤀䄀㈀㤀㠀㠀䌀㌀䌀䐀㜀㠀　䘀㄀㔀䄀䈀㌀䘀㐀㐀㠀䐀㐀䔀　㤀㄀㘀䈀㘀䌀㐀㄀䈀㤀㜀㄀䌀䌀㠀䄀䘀㌀㤀䌀㈀㤀䄀䔀䄀㤀㐀㌀㐀䌀　㔀䐀㤀㄀㤀㔀㄀㜀㌀㜀㔀㈀䄀䘀䘀䌀㌀䄀㔀䔀㔀䐀㄀　㔀䐀㤀㤀㜀䄀䌀㈀䄀㘀䔀㈀䌀㐀䔀㐀䄀㔀㔀䔀䈀㔀㐀䈀㠀䌀㘀　䌀㄀䄀㤀㘀㤀㈀㌀㜀䈀䄀㈀　䐀㄀㄀䘀䐀㔀㜀㜀㔀㜀㘀䔀䌀㠀㐀䄀㤀㜀㠀㤀䔀䄀䄀㈀䘀㌀㄀㘀䐀㜀　䐀䈀䘀䄀　㜀㄀㔀㠀㔀㐀㐀㐀㐀㘀㐀㤀㠀䐀㌀㌀㘀　䈀㜀㠀䄀䄀䐀㈀䔀㐀䘀䄀㐀㔀䌀䔀㄀䈀䘀䌀㄀㤀㠀㔀㜀䌀㄀䔀䘀䐀㈀䈀㈀䌀　䔀㜀㜀㠀㤀㐀䈀㄀㐀㄀　䐀䔀䌀䔀䐀䐀䐀䌀㜀㠀㜀　䈀㄀䈀㄀䔀㐀䐀䌀䈀㐀䘀䌀䈀䐀㜀㄀㠀䘀㤀㌀㜀　㌀㐀㄀䔀㌀䔀㐀䘀䈀䐀㘀㈀　㔀　䈀㄀䔀䌀䐀䐀㠀㘀㐀㄀䘀㠀㈀䘀㜀㘀㐀㠀㘀䘀㐀㐀㠀㘀㜀㐀䈀㄀㘀䌀㤀㜀㘀㘀䈀㠀㔀㄀㤀䔀䐀㤀㄀　㈀䈀䄀䐀㤀㐀㔀㠀䘀䔀㤀䘀䘀㌀㐀䔀䄀䐀㄀㐀㜀䔀㔀㜀㌀㤀　䌀㜀㐀㐀㐀䐀㌀㜀㜀䘀㌀㄀䈀㔀㔀㌀䄀䄀䘀㜀㔀㐀䈀㠀㜀㜀㜀䔀㜀䄀䘀䐀㌀䔀䈀䄀㤀䈀㔀㈀㠀䔀䈀㔀䐀㠀䈀䘀㐀㄀䔀䔀䄀㔀㐀　㐀䘀㌀㘀㜀㄀䔀䔀䔀㄀㔀䔀㈀䐀䄀䐀㄀㔀㜀㌀䌀㌀㈀㘀㌀䌀㐀㐀㈀䌀䘀䔀　㐀㐀䈀㔀　䌀㠀䘀㘀㠀㄀㄀　㔀䔀㌀䔀㘀䐀㔀䔀㐀㠀䔀㈀䔀㐀䌀䌀䄀䄀䐀㤀䈀䐀䔀㌀㘀䈀䐀㈀䔀䈀㜀䈀㈀㜀䐀㐀䈀㤀㌀㜀㌀䘀㈀䈀㠀㘀㄀䐀㄀㘀㄀㜀㈀㐀㄀　䌀䐀㌀䄀䄀䐀㔀䈀㤀㔀㔀㤀㌀　㜀㌀㤀㔀䌀㠀䔀㤀㠀㤀䌀䈀㄀䄀䐀㘀䐀䄀䐀㘀㌀㜀㈀䐀㤀㔀㔀䈀㌀㌀㘀䌀䐀㄀䔀㄀㠀㤀䈀㤀䌀㤀䄀㤀㠀䔀㜀㐀䌀㄀䔀㤀　䄀㠀㐀䔀䌀㤀㐀㠀㠀㤀㄀䈀㌀　䌀䌀㤀䔀㔀㔀㤀㘀䔀㜀䌀㠀㄀䐀䔀䄀㔀䔀㔀㐀㌀䘀㘀㔀䐀䐀㄀㐀㘀㜀㐀㐀䈀䌀㌀㤀㌀䄀㈀㈀䌀䔀㤀䄀㘀㠀䌀䄀㐀㠀䐀㐀㈀㐀䄀㔀㄀㠀㘀㌀㘀䌀　㌀㐀䐀　䔀㈀䄀㔀䘀㠀㠀㔀㄀䐀㜀䔀　㘀㤀䔀䘀　䈀㔀䌀䐀㔀䄀㤀䐀　㄀　㌀䌀䔀䐀㠀㄀　㈀㐀䘀㜀䈀㌀䈀䔀㌀　䐀㠀䄀䌀㠀䐀䔀㌀　㐀㐀㐀䄀㠀㜀㈀䐀㔀㌀䈀䐀䄀㘀䘀㜀䈀　㤀㔀䌀䘀㜀㈀　䔀䘀㔀㄀䌀䔀㘀㠀䈀䘀㐀䔀㜀㈀䄀㤀䐀㌀䄀㠀㤀䘀㔀䄀䐀䌀㄀㤀㐀䐀䔀䘀䈀㔀㐀㜀䄀㤀䄀㜀䔀㈀㄀㄀䐀㐀䔀䘀㜀䘀㌀㘀㜀㈀㤀㌀䘀㜀㠀䘀㤀䘀㜀䄀䈀䔀㠀䘀　䄀䄀㄀㈀䄀䘀䔀㜀䌀㜀㔀㔀䐀㤀㌀㘀㔀㌀㘀㘀㠀㈀䔀㘀㘀㐀㜀㜀䐀䘀㐀㈀㠀䄀䐀㈀㈀㐀㘀㐀㤀䄀䌀䌀　㌀㄀㈀䐀㐀䘀䌀䘀　㠀㔀䈀䔀䄀䘀　䐀㜀䌀㈀䔀㜀䈀㄀㠀㤀䘀䘀䌀　䔀㜀　㤀㌀䔀䘀䘀䈀䌀㄀㈀㈀㔀䌀㠀䘀䘀㜀㘀㈀䄀䌀㜀　㤀㌀㐀䈀䄀㌀䈀㈀㠀䘀䐀㜀㠀䘀䔀䘀㜀䈀䐀㤀㤀㠀䐀䌀㘀䘀䐀䄀䌀䄀㜀䄀䈀㜀㄀㤀㤀㜀䘀䄀䄀㜀䔀䈀䘀㐀䐀䘀㔀㤀㐀䔀㤀䐀　㈀㠀㈀㜀䈀㐀䄀䈀䘀㠀䐀䘀㘀䔀㄀䄀䄀㌀㔀䌀䘀㔀䘀䈀㄀䔀䌀䔀　䄀䄀㤀㄀䐀㈀䘀㤀㄀㄀㠀䘀　㐀䘀㘀㤀㄀㌀㌀㠀㘀　䔀㤀䈀㔀䔀㘀㄀䐀㌀䘀　㘀㄀䔀㔀㤀㤀㌀㔀䔀䌀䄀㌀䌀㔀䘀䈀䄀䘀䄀㠀㄀㠀䈀䄀㜀䌀䔀䘀㜀㈀䈀㄀䔀䘀㤀䔀䔀㠀㤀㄀䐀㔀㔀䐀㌀䌀䌀䄀㘀㘀䄀䘀䈀㤀䄀　㐀㈀㔀㐀䘀㜀䐀䄀䘀㠀䐀䈀㤀㜀　䄀䘀㜀㤀㠀㘀㄀䈀㈀㈀䌀㐀㠀㠀㌀　䌀䄀㠀㜀䐀㌀㐀㌀䔀㈀䔀㔀䐀㘀㌀䐀㜀㜀㘀　㤀䘀㔀㜀䈀䔀㈀䔀䌀㘀㠀㔀㄀䐀䈀䘀㄀䄀　䈀　䔀䐀㔀㄀䈀　䐀䈀㐀䌀　㌀䘀　䄀䐀㐀㄀䔀䘀㔀㈀㘀䄀㌀㐀㤀㄀䄀㘀㤀㤀㤀㄀㘀䐀䘀㈀㌀㘀䔀　㐀䘀㘀㘀䐀䌀　　㜀　䔀䘀䌀　䈀㜀䘀㠀䘀㠀㈀㌀䘀䌀　㤀㄀㈀㔀㤀䄀㈀㜀䘀㤀㜀㤀㠀㤀䈀㜀㜀䔀䄀㐀䐀㌀䈀䘀䐀䌀䌀㌀㜀㘀䐀㄀㤀䈀䐀㘀㤀㌀䈀䐀㐀䔀㄀䈀㄀㠀㌀　㜀䔀㔀㄀㔀㈀㜀䄀㤀㘀㔀䌀㌀䘀䐀䈀㌀㠀㘀䌀䄀䘀㤀㤀䈀㜀㘀㜀㘀㔀䔀㔀㐀㤀㠀㤀䄀㠀䐀㔀㄀㄀㠀䐀㈀㠀㘀㄀㔀㘀㐀　䔀䌀䔀㐀䌀㌀㐀䄀㠀㘀㐀䌀䘀　䄀㌀㜀㌀　䐀䈀㌀㐀㘀䈀　㘀䈀䔀㘀䈀㠀㜀䔀㤀䈀㐀㐀䘀㜀㐀㐀㔀䔀　㘀㌀㔀㠀㄀㄀㌀䈀㈀　㔀㔀䐀䌀䄀㠀㠀䘀㔀㈀䌀㤀㤀㠀㈀䌀㐀䌀㘀㌀䐀　䐀䌀䔀㌀㄀䘀䌀䐀㘀㜀㘀㜀㘀㈀䔀　㐀䈀䘀㄀㔀䄀䐀㤀㘀　㈀㠀㠀㐀䄀㄀䈀䔀㜀㠀㐀㠀䐀䘀㈀㜀䈀䌀　㘀㄀䄀㠀㠀㘀㔀㠀㔀䈀䈀㈀䌀㈀㘀㘀㘀㐀䄀㤀㔀䈀䔀　䐀㌀㌀㐀䈀䔀㠀㘀㈀㤀㄀䈀䈀㜀㌀䘀㈀䌀䄀䘀㈀㠀㐀䈀䌀䄀䌀㈀䔀㜀㘀㐀㄀㘀㜀䐀㠀㄀䌀㈀㠀䔀䈀㌀㤀㌀㈀䄀㔀㔀䈀䘀䄀　㠀䈀䔀㔀䐀䐀䈀䌀䔀㌀㠀㔀䐀䘀䔀䐀㐀　䈀䈀㈀㜀㠀䄀䐀䐀㈀㔀㐀㔀　㌀䐀䄀㤀䈀　䘀䐀䘀㄀㔀㔀䐀㔀㜀㔀䐀㜀㄀䌀㔀㠀䔀㐀㘀㠀㄀㠀㔀㤀㤀䌀䄀㐀㤀㄀㠀㜀㘀䈀䌀㌀㌀㔀㘀㤀䄀㔀䔀㌀㐀䈀㠀㘀㌀㔀　䘀㐀䘀䌀䐀䄀㠀㤀㤀㌀㤀㘀䌀㘀　㔀䐀㜀㄀䈀䄀㈀㘀　䌀㔀䘀㤀䈀䔀䘀䌀䔀䌀䌀㌀㔀㈀㔀䌀㔀䔀䈀㈀䄀䐀㘀䈀䌀䈀㠀㜀䄀䌀䐀䄀䈀䐀㜀䐀㔀㐀㐀䌀㐀㤀㤀㤀㌀䘀㈀䘀㈀㐀䐀䘀㘀㜀㠀㤀㔀䐀㄀㘀㈀䌀䌀㤀䈀䘀㠀䈀䈀䐀㄀㄀㌀䄀䘀㘀䌀㐀㠀㐀䘀㌀　㈀㔀㠀㐀䌀㜀㘀㘀䘀㈀㤀㤀㔀㤀㠀㔀䔀䘀䌀㔀䄀㔀㌀㈀䈀䈀䘀㐀㔀䔀㤀䌀䌀䔀䐀䘀㠀㠀䔀䘀㤀㈀䐀䔀㠀㠀㈀䘀䔀㌀㘀䘀䌀㐀㈀䌀䐀㜀㄀㜀䐀㄀㠀䄀䔀䈀㈀㜀䄀䘀㔀㌀㌀䔀㄀䈀䌀䄀䈀䄀䌀䈀䈀䄀㠀㌀䔀䈀䔀䈀㘀㜀䐀䘀㘀㜀㐀䈀䔀䈀㘀䘀㜀㤀䘀䐀㜀䄀䘀䘀㜀䈀䔀㘀䌀䌀㐀䌀㌀㌀㈀䈀䈀䐀䔀䔀䘀　㜀㔀䄀㌀䘀䌀䐀䘀䄀㔀㔀㐀㈀䘀㘀䄀䈀䔀䔀　　㈀䌀䘀㠀㈀㌀䄀䈀䈀㤀　㜀䄀䌀䈀㈀䈀㔀㜀　䌀㐀䔀䈀㌀㠀䈀㌀㜀䐀䄀䐀㌀㔀䌀㤀㜀㄀䘀䈀䌀䄀㘀㘀䄀㐀㤀㔀㌀㜀䔀㐀䘀㐀䈀䐀㘀㜀㤀㈀䈀㌀㄀䄀䔀䔀㠀㠀㤀㤀㠀㠀䐀㤀䔀㘀㐀䌀㄀㔀　䔀㤀㐀䐀䘀㘀䈀㈀㌀䐀㐀䄀㜀䌀㠀䘀㠀䐀　㈀㘀㔀㘀㈀㄀㜀㠀䈀䐀㠀䄀䐀䈀㜀㌀㌀䔀㤀㔀䐀㤀㌀㄀㤀㜀䌀䐀䄀㔀㘀㔀䌀㈀㔀㠀㘀㐀䔀　㔀䘀㤀㠀㐀䌀䈀䔀㌀㘀㈀㜀㐀䔀䌀㜀　䐀䘀㘀䈀䔀䄀㐀䘀䈀䌀㔀䔀䌀㘀㤀䌀䘀㤀㜀䄀㤀㤀䌀䐀㐀㌀䐀㠀㜀㌀㤀　㌀䈀㈀䄀㤀㐀㘀㈀㔀㈀㈀㘀䌀㌀　䘀䘀䘀䔀㔀䄀䌀㌀㈀㌀䌀㐀㈀㈀㤀㤀㌀㈀㤀㈀㌀䌀㈀䘀䐀䘀䈀䐀㠀㤀㔀㘀㠀㤀㈀䈀㜀㄀㠀㘀䐀㜀㄀㈀䄀䘀㈀㔀㤀㄀㤀㘀䈀㐀䘀㌀㈀䄀㘀䌀㔀䄀㤀㌀䔀䌀㘀㠀㐀㌀㄀䐀㄀㄀㘀䄀䈀䘀㐀䘀䈀㤀㔀㜀㄀㌀㘀䈀䔀㈀䄀㔀㘀䔀㄀㜀䔀䄀㌀㐀㈀䔀䘀䄀䐀㔀　䐀　㈀㤀䌀㜀䄀㜀䔀㔀䔀䐀㜀䈀㤀㈀䐀㐀㘀䄀㈀㌀㈀㐀㄀㤀䔀㔀䈀㠀㄀㐀㜀㘀㄀䄀　䌀㜀㄀䈀㈀㈀䔀㔀㘀䈀㠀䐀㌀䐀㈀㄀䄀䌀㜀䐀㜀㌀㐀㜀㜀䈀䄀㤀䈀䐀䔀㄀㌀䌀㤀㘀㜀㄀㘀䄀䐀㌀㠀䐀䐀䌀㌀㌀㌀㤀䔀㘀䔀䄀㈀㐀䄀㘀䘀䘀　䐀䘀䌀㤀㈀䄀䐀　㌀㔀䈀㤀㤀䌀䈀䈀䈀㘀㔀䘀㘀㌀䌀䔀䈀㜀䔀㌀㔀䐀䄀㤀㐀㄀䔀㜀㤀㌀　䌀㜀䄀䘀㄀䄀㤀㐀㈀䄀㜀㔀䘀㄀㔀㘀㜀㌀㌀㜀㈀㔀㜀䘀䐀㔀㜀䄀㠀䄀㠀㤀䄀㐀䄀䐀䌀㘀䘀㐀䘀䌀䈀䔀㘀䐀䔀㜀㤀䘀　㜀䐀䌀䔀㈀䌀㄀䈀㠀㈀㘀㜀䔀㌀㤀䄀㤀䐀㘀㘀㌀㌀㜀䘀㤀㌀䈀䈀䐀㐀　㜀㄀㤀䈀䄀㈀㜀㠀㐀䄀䐀䈀㠀㠀䌀䌀䈀㔀㠀㈀㐀䈀䔀㐀㈀㔀㤀㤀㤀㜀㈀㜀㜀　㈀㄀䔀㜀㘀㄀㈀㜀㈀㔀㔀䘀䌀㔀䈀㔀䈀䄀㔀䈀㌀䘀　䔀䐀㘀㤀㐀㠀㘀㜀䔀䔀㤀䌀㘀　㤀　䘀䈀㤀䔀㌀　䘀䌀䔀䐀䌀䌀䌀　䐀䘀䌀䔀䌀䔀䘀㘀䘀䔀㔀㐀㘀㠀㌀䐀䈀㔀㄀㄀䘀㈀䘀㌀㤀䌀㈀㈀㠀䌀䌀䔀䌀䔀㜀䐀㘀䘀㔀　㐀㘀䈀㤀㔀㈀䄀䐀㌀　㄀㐀㠀䌀䈀㤀䄀㠀䈀㘀㜀㘀㜀㤀㔀㌀㜀䔀䔀䔀㠀㐀㈀㔀㈀㌀㤀㌀䌀䈀㠀䐀䘀䈀䌀㈀㌀　䌀䄀㌀㠀㄀䈀㘀㄀㘀䌀㤀㤀㌀㤀㈀㔀㈀㘀䘀㘀䘀䘀䈀　䘀㜀㈀㔀䔀　㘀䐀㔀䐀㘀㔀䄀㈀䔀㜀㔀䔀䔀䐀䈀䈀㈀䌀㔀䈀䈀㈀䈀䌀㔀䘀䌀䈀䈀㘀䔀㐀㐀㔀㤀㘀䘀㜀㌀㔀㠀䔀㘀㌀䌀㜀㐀䈀䔀䌀䌀㐀㔀䈀䈀䐀㈀㐀㐀䐀㤀㜀䐀㐀䈀㈀㈀㐀䐀䈀㘀䄀㘀㐀㐀㤀㤀㔀䔀㐀㌀㠀㈀㤀㈀㄀㜀㄀㈀㤀䘀㐀䘀㄀㤀㠀䌀　㐀　㘀㤀㘀㤀㘀㤀㘀㜀㤀㠀　䔀㌀㌀㐀　㘀㄀㈀㠀䐀　䄀㐀㈀䐀㘀㤀㄀㌀㔀䄀䄀㜀　䔀㐀䔀㘀㤀䐀㌀　㘀㘀㠀㈀㤀㈀㤀㘀䐀㈀㄀䄀㔀㐀　䌀䈀㔀㈀䄀㘀㈀䐀䌀䌀㈀㌀　䘀㄀㈀䔀㜀䘀䐀䔀㜀䈀䘀䘀㜀䌀䄀䈀㈀㤀㌀㘀㘀㔀㈀䈀䔀㌀㜀㌀㌀㌀　䄀㌀䘀䈀䌀㜀㐀㜀䔀㜀㤀䌀㜀䈀䌀䔀㜀䘀䘀䔀䘀䐀䘀䌀䔀㜀㔀䔀䌀䈀㈀㤀㄀㠀䐀䐀䈀䔀䄀㌀䘀䌀䈀㘀㄀䘀䐀䌀㌀㤀㌀㐀㜀䄀䔀䘀㐀䈀㄀䘀䔀㤀䐀䈀㜀㌀㐀䐀㠀㌀㔀㤀㈀㌀䈀㤀㈀㔀䌀䘀㤀㄀㐀䔀　䐀䈀㠀䘀㈀㤀䄀䘀㤀䄀䈀䈀㘀㜀䔀䔀㠀㘀䄀䄀㜀㐀䔀䘀㜀㈀㌀䈀㔀䈀㤀㌀　㌀㌀䈀㌀䐀　䄀䌀㈀䄀䌀䔀㔀䘀㄀䔀䌀㠀㈀㠀㔀㈀䔀㠀㈀䌀㐀㘀㔀㔀䌀䘀䌀㜀㤀䔀䈀㤀䔀㔀䐀㘀䔀䘀䐀䘀䐀䔀㤀䘀㤀䄀㤀䐀㤀㌀㠀㘀㜀䌀㠀㌀㐀䐀䈀㄀䈀䘀㠀㜀䈀㠀㘀㌀䄀㔀䐀䘀䄀䄀㐀㤀㘀㔀䘀䘀䘀䔀㈀㄀䄀㈀䐀　䘀㤀㠀　䈀㄀䄀㘀　㜀䄀㔀㘀㠀㌀䐀䘀䌀㤀㄀䄀㤀㠀㠀㐀䄀䘀䘀䄀㈀㐀㌀㄀㄀䘀䈀䘀䈀㔀㐀䐀㌀䘀㤀䔀㔀䐀䌀㄀㈀㈀䄀䔀㤀䄀㈀䔀䄀㌀䌀㈀䐀䐀㌀　㔀㄀㈀㤀㔀䘀䄀㄀䄀㔀䌀㘀　　䄀㠀䘀䌀㌀㌀㤀㔀　㐀㘀　䘀㠀㌀䔀㜀㠀䔀䌀㌀㌀㄀㔀䄀䐀　䈀䘀㘀䌀㄀㄀䘀㐀䐀䘀㐀㠀㜀䄀㄀䔀㜀㈀㤀䄀䌀䈀㄀䐀㈀　䔀㈀䔀䐀㘀䐀㈀䄀㤀䈀䄀䔀㐀㈀㔀䐀㔀䔀㘀䔀䄀䈀㠀㔀　　㌀㜀䐀䐀㤀㘀㐀㈀㘀䌀㜀㔀䐀䔀㜀㈀㠀䈀㐀㘀㤀㈀㘀㌀䘀㜀䔀㘀㐀䌀㄀䈀㠀㔀䘀　㐀㘀㐀䘀㄀䔀㜀䌀㠀㘀㘀䐀㠀㈀䔀㌀　䌀　㠀䐀䄀㐀䄀䌀䘀㌀㘀㌀㐀㔀㔀㐀䄀㌀䌀㠀㈀　㠀㔀㄀䔀䔀㔀㈀㐀㜀㤀　䐀㐀㤀䄀㔀㐀㌀䌀㠀㈀㔀㠀䌀䌀䈀㈀㐀㔀㐀䐀㔀㘀㘀㔀㤀㄀䈀䐀㌀㈀㔀䈀䌀䐀㈀䔀㌀䘀㈀䘀㘀䐀䐀䌀䌀　㤀㔀㘀㜀㄀䈀㈀㐀䌀䈀㌀䘀㘀㐀䄀㄀䐀㜀㘀䔀䄀䘀䌀㠀㔀㈀䈀䈀䔀䌀㔀䘀㈀䘀㘀䘀㜀㌀䔀㔀㘀㤀㔀䘀㤀㈀䘀䔀㐀㐀㤀㜀㔀㜀䐀㘀䔀䌀㜀㠀䌀　䔀㄀䌀䌀㔀㌀䘀㌀䌀㘀䄀䔀㤀㘀㔀㐀㤀䐀㜀䈀㌀䄀䌀㔀㈀　㔀㔀㘀䄀㤀㔀㤀㈀䘀䄀㜀㌀䄀㜀䔀㈀䈀䐀　㜀㐀䈀㤀䌀㐀㘀㔀䈀㔀㌀䘀㄀䘀㤀䔀㌀㘀䌀㔀㌀㘀㤀㜀㌀㠀㄀䌀㄀㔀㤀㈀㈀䘀　㈀䄀㘀䐀　㜀䄀㤀䄀䔀㈀㌀䄀䔀　㜀䘀㌀㐀䐀䘀㐀䐀㜀䄀㤀䈀㌀䄀㔀㤀㔀䘀　䐀㄀䄀㘀㈀㌀䐀㤀䘀㔀㌀䔀㐀䐀㘀㤀㌀䄀㌀㔀㜀㌀䌀㤀㄀㐀㄀䘀䈀䌀㤀䈀䔀㈀䌀㜀　㜀㔀䔀䐀　㄀　䄀㌀㄀䐀㄀㈀㤀䄀䘀　䄀㜀䘀㄀㈀㜀䔀䌀䈀㔀䐀䌀㔀㠀㈀䌀䔀㤀㌀㔀㈀䔀㐀㤀䌀㈀㐀㘀䐀㐀㔀䔀㘀㘀䘀䘀㐀䔀㐀㤀䄀㔀䔀㤀䐀㔀䘀䌀䈀㘀㔀䌀㠀㘀㘀㔀㄀㤀㤀㔀䈀㔀䐀㐀㘀㘀㈀䈀䌀䘀㔀　䈀㤀䔀䌀䐀䘀㌀㔀䔀㔀㘀㔀㔀䄀㔀㐀㐀䘀㄀㜀㜀㔀㜀　㈀䌀䌀㌀㌀㈀㠀䌀㈀䄀䄀㌀䐀㐀㔀㘀㔀　㤀㘀䄀㄀㄀䄀㈀䈀㜀㄀䐀䄀㐀䈀㤀㤀䄀㔀䔀䔀㐀䘀䈀㔀䔀㜀㜀㘀䘀㜀㘀䌀䌀䄀㔀䐀㘀㘀㄀㌀㤀㤀㔀㄀䄀㔀䔀㘀䄀㐀㈀䐀㔀䘀㌀㜀㜀㠀㜀䈀㐀䘀䌀㄀䐀　䘀　㔀　㈀㄀䈀㌀㈀　㌀䔀㐀䄀㠀㈀㐀㠀㌀㠀　㘀㌀䔀䘀㈀㄀㄀䘀　㄀㄀㤀䄀䔀䈀㌀䈀㘀㠀㤀㘀䘀䘀㈀㔀䌀䌀䘀㈀䔀䘀䄀㜀㔀㤀㌀䔀㌀㠀㠀㐀㘀㄀䈀㈀㠀　䐀䄀㠀䐀䌀䌀㜀䘀㔀㄀㈀㐀䈀䌀㐀䌀㠀䔀㈀䔀䘀䐀䌀㠀䄀㘀㠀䘀㌀䐀㜀㌀䔀䈀㈀䐀䐀䘀䈀䔀䄀䐀䄀䈀㄀㜀㌀䔀䘀㜀㈀䔀㜀䔀䈀㐀㘀㜀䘀㤀䐀䐀䄀䌀㔀㘀㔀䘀㘀䘀䐀䘀䔀㐀㠀㘀䄀䌀䄀䌀㔀㘀㘀䘀䔀䘀䔀㘀䄀㤀䈀㘀㘀䌀㌀㘀䘀䘀䈀㘀䔀㜀㘀䘀䔀䘀㘀䈀䈀㤀䘀㔀㜀䈀㤀䘀䈀䔀䔀㔀䈀䈀㤀䘀䔀䄀㘀䘀䈀䐀䘀㔀䔀㐀㌀䐀㐀㌀䘀㌀䐀㜀㔀㘀㌀㘀䐀䌀䈀　䈀㜀㘀䈀䔀䌀䌀㌀䐀㜀㔀㘀㌀㐀䐀䌀㌀　㐀䘀䄀㌀㌀㐀㐀㐀㤀㜀㌀㜀䌀　䈀䄀㘀䄀䌀　㠀㌀㌀㜀㌀䔀㐀䄀䐀㐀䔀䌀㔀㜀㄀䔀䄀䄀㌀㈀㤀㘀䄀㔀䐀㐀䐀㈀㈀䘀䄀䈀䐀㠀䐀㜀䄀㔀䐀　䔀䘀㘀㘀㘀㐀㤀㜀䄀㔀㄀䌀㘀㘀㄀㐀㠀㜀䐀㘀䄀䐀㐀䈀㘀䘀㌀䄀䌀䌀䔀㠀㄀䔀䄀㘀㈀䄀䔀　　䐀　䌀㠀㌀㠀䐀㤀　㠀㔀㠀㌀㌀䄀㔀䔀㜀䌀㘀䈀䌀㔀䈀㈀㄀䌀㠀䔀㐀䈀䄀㐀䐀㈀㜀䌀　䌀㠀䄀㈀㜀䐀㈀䘀㄀䌀㠀㈀䔀㜀㤀㐀㌀䌀䈀㌀㔀㤀㜀㤀㜀䐀㔀㜀㈀㜀䄀㐀㤀䈀䘀㌀䔀䄀㜀䄀㠀䄀㈀㘀㠀㌀㌀㜀㠀㐀㘀㤀㄀䈀䐀㈀㘀　㜀㘀㈀㄀　㌀㌀䔀䄀䘀䈀䐀䈀䔀㤀䔀㘀䌀䌀䈀䄀㠀㄀䐀䄀㠀䌀䐀㈀㈀㈀㤀䈀㜀㄀㐀䌀䄀䐀㔀䌀㌀䔀㤀㘀㘀㈀㘀䘀䄀㤀䐀䘀㄀㔀䄀䌀䐀㤀㔀　㘀䄀㐀䔀㔀㔀䄀㠀㘀㔀㄀㈀㈀㤀㄀䌀䄀䈀㔀䔀㈀䘀㘀䔀䈀㈀㤀䈀㤀㘀䘀㜀䌀㜀㄀㔀䘀㈀㈀䐀㜀䈀䄀㄀䄀䐀㈀㜀䈀㐀䄀㔀䘀䔀㤀䄀㐀䐀㜀㔀㐀㘀㜀㔀㘀䔀䘀㤀㜀䄀䌀㜀㐀䈀䐀㤀㌀㤀䔀䌀㌀㌀䐀㤀㤀㔀　㔀㘀㤀䌀䈀䈀䘀㐀䐀㈀䈀䄀䄀䄀㔀䈀㘀䐀㘀㜀㄀䔀㄀㔀㜀㤀㈀㔀㈀䐀　䌀䄀㄀㘀㜀㈀䐀㔀䄀㌀㘀㐀㈀㌀䈀䈀䘀㜀㘀㄀㜀䈀䄀䐀䈀䐀㔀㘀㤀䘀㐀㌀䈀䘀㘀㘀㐀㌀䘀㐀㤀㔀㐀㜀㄀㠀䘀䄀㄀䔀㐀㘀　䐀㤀䈀㘀䐀㘀䄀㄀㌀㠀　䈀㔀䘀㔀㌀　䄀㌀㜀㤀㌀㠀䄀㜀㐀㌀㔀㘀㌀㘀㘀㤀䄀㔀㔀䈀　㐀䄀䘀㈀䌀䔀㄀䔀㐀㜀㤀㜀㄀㠀䄀㈀䌀㘀㠀㐀䘀㜀䔀䌀㔀㔀㤀㘀䐀㘀㤀㘀䈀䔀㠀㤀䔀䔀䈀䔀䈀㈀㘀㠀㘀㤀䄀㔀㈀㤀㔀㜀㈀㔀㘀䄀㈀䐀㐀䄀䄀䈀㔀㄀㔀㤀䈀䌀㘀㔀䈀㠀䈀㤀䄀㐀䈀䐀㌀㠀䈀㌀㜀㠀䔀㔀䔀㌀䐀䐀䄀㔀䔀䈀䌀㘀䔀䔀䄀䌀　㤀　㘀䈀㘀䈀㜀㜀䈀㔀㔀㄀㈀㄀㤀㌀㐀㠀㄀㐀㄀䄀㤀㔀䄀㘀㜀㐀䘀䐀㔀　㘀㔀㜀䔀㐀䐀䄀㄀䄀㤀䄀㐀㘀㌀㘀䌀䘀䈀䐀㠀䌀㘀㄀㈀㘀㘀㄀䐀㤀䌀㌀㔀㈀䄀㠀䌀㄀㤀㌀㤀㈀㘀㠀㌀㌀㤀䌀䘀㤀㈀㔀㜀㘀䌀㔀㔀㘀㜀䐀䈀䈀㈀㠀䌀㜀㤀䌀䔀㘀䌀㔀䈀㤀㔀㈀㌀䈀䘀䈀㠀㘀㘀㤀㌀㘀㜀䔀㌀䔀㘀䐀㠀㔀　䄀㤀䐀䔀㤀䌀㘀㄀䐀㐀䄀㜀䐀䈀㌀㈀㌀㈀䘀㌀䐀㌀㤀㐀䔀㤀㤀㤀䔀㤀䌀㘀㘀䌀㠀㜀䌀㔀㔀㘀㘀㤀䈀㜀㌀㤀䄀䄀㌀㜀䈀㤀㐀㄀㈀㈀㔀㤀㘀　　䈀䔀㌀㔀㈀䘀䄀㤀㜀㌀㌀䘀㈀㄀䔀㈀㐀㔀㈀䐀㠀㘀㤀　䔀㔀㤀　䌀㔀㈀㌀㠀㐀䄀㌀㔀㄀䌀䌀䄀䘀㈀䄀䄀㜀㄀㜀㜀㄀㄀䐀㌀㔀㠀䈀䄀䄀䈀㈀㐀㘀㠀䈀㜀㘀　㔀㔀㤀㈀㌀䄀㤀䔀㘀㈀䈀䌀䄀　䌀䈀䄀㤀䈀㘀㌀䈀䄀䄀㜀㈀㜀㐀㄀㜀㤀㐀㌀䄀䄀䄀㄀㄀㤀䐀㔀㈀䌀㈀㈀䄀䈀㔀㈀䄀䄀㤀䔀㐀㔀㠀㘀㌀䘀㤀䈀㤀䌀㔀䈀㠀㤀㘀䐀㘀䘀㌀㘀䘀㠀㔀䔀㠀㄀䈀㄀䐀　㜀䄀䌀䘀䘀㘀㄀䘀　㤀㌀㘀㈀䘀　䘀䔀㌀㈀㔀㈀㐀㠀䘀㌀䐀㈀䈀䐀㤀㠀㤀㜀䌀䔀㌀䘀䄀䌀䈀㘀䘀䈀㠀䌀䈀䔀䄀䌀㄀㔀㄀㜀䐀㤀䈀　䐀㘀㐀㔀㈀䔀㤀㜀㘀䌀㄀㘀䈀㜀䌀䔀㜀䐀㌀䐀㌀㈀䘀㌀䌀　䐀䌀㜀䄀㘀䐀㐀䔀㜀㔀㤀㄀　㌀䈀㘀䈀㔀䐀䌀䄀㘀㐀㄀㤀㜀䄀䈀䈀䘀㈀㄀㔀䈀㤀㌀㔀䈀㘀㤀㈀䘀䄀㤀䌀㠀䐀㄀㌀　䘀㜀䌀䐀䐀䔀㄀䈀㘀㠀䄀䔀㤀㤀䈀䌀䔀㜀㄀㘀䘀㘀㐀㘀㌀㄀䘀㘀㤀䔀䘀䘀䐀㈀䌀㠀㘀㠀㐀㌀㔀㘀㐀䔀䌀㌀䌀　㄀㘀䐀㘀㈀㜀䘀㘀㠀㄀䄀䘀㘀䌀㠀㄀䘀㌀䐀㘀㐀㤀䐀㤀　䌀䈀㄀㠀㌀㘀㔀㜀䌀㔀䄀㜀㠀㄀䘀䄀㈀䌀㤀㘀䄀㌀䄀䌀㈀䐀㈀䐀䘀㈀㔀䄀㤀㘀　㈀㌀㘀䐀䔀䄀䐀㐀䘀䌀㘀䔀㐀䐀㤀㌀㈀㌀㐀䈀䄀䄀㈀䘀㄀㔀㤀㌀䘀䌀䐀㈀䌀㌀㐀䌀㘀䘀㤀䈀䌀䄀䈀䄀䈀㤀㄀㘀㔀㌀䔀㘀㔀䄀㘀㠀㌀䐀䐀㐀䄀㘀䔀䘀㤀㜀䘀㔀　㤀㈀㤀㌀䘀㜀䐀㜀䄀㠀䐀㔀㄀㄀䄀㌀㠀䄀䄀㘀䔀䌀㈀㘀㜀㘀䌀㜀䘀㈀㘀㠀䄀䌀㐀㈀㜀㐀䈀㜀㔀䌀㈀㠀䈀㌀䐀㤀㐀㠀㈀㈀㔀㌀䐀㈀䔀　䐀㠀㠀㠀䔀㠀㤀㌀㄀䄀㐀㐀㄀㜀㈀㔀㈀㘀䐀㈀䐀䌀㤀䔀㔀㠀䄀㌀㌀㌀㐀㔀䐀㜀㜀㔀䐀㌀㜀䘀㤀䘀㄀䔀䐀䌀㔀㌀㔀㄀㌀䈀㜀䐀䘀䈀　䔀㔀䔀㘀㄀㘀䘀䄀䈀㠀䄀㤀䄀㠀㌀㈀㔀䈀䘀䈀䌀㜀㜀䄀㐀䘀㜀䐀䐀㔀䄀㘀㌀㈀䈀㌀䄀㤀䄀㐀䈀㌀㌀㘀䈀㌀䄀䄀䄀㘀㤀䔀䔀㌀㠀䘀䄀䌀㘀䄀㠀㌀䌀㘀䈀㌀㜀㤀㜀㠀䘀　䈀㘀㐀㌀㤀䔀䈀㤀䌀㜀㘀䘀䔀䈀㔀㤀䈀䘀㠀䔀㜀㤀㔀䐀㜀䌀䔀㠀㜀㄀䈀䔀䈀㘀䈀㌀䄀㜀㘀䄀䐀㠀㔀㜀䐀㜀㜀㠀䔀㌀㐀㠀䈀㔀䌀㄀䐀㘀㠀　䘀䈀䐀㜀䈀䔀　䈀㜀䘀㘀㐀㠀䘀㐀㠀㜀䔀　㠀㄀㄀㈀㘀㈀㠀㤀䌀㤀㜀䔀䌀㠀㘀䌀㌀䔀䌀㜀㠀㤀䈀㤀㘀㘀㐀㄀䄀䐀㐀㜀㤀䔀䄀　䄀䈀㔀㐀㐀㈀㜀㔀㄀䐀㌀䄀㜀䈀　㄀䄀䄀㘀㄀䘀㄀㈀㠀㐀㤀㄀㌀㘀㜀㔀㔀䈀䐀㤀㘀㘀䈀䈀䌀㄀䌀䌀䘀㔀㤀䄀㤀㄀㐀㔀㄀䄀䔀㠀㠀㄀䌀䐀㄀䈀㜀㘀㔀䌀　䘀䌀㘀䘀㜀㔀㘀㄀㌀㌀䔀䔀䈀㔀　䘀䘀䈀䈀䌀㌀䐀㜀㌀䌀㠀㘀㔀㔀䄀㐀㔀䌀㘀㐀㈀䌀㘀㘀㐀䌀䔀㘀䔀㔀䔀䌀㄀㄀䌀㠀䌀䔀䐀㐀䌀䄀䈀㐀㠀䌀㔀䌀㤀㌀䈀㤀䈀㐀䈀䌀㈀䄀㔀䈀㠀䈀䈀䌀䔀㜀㘀㠀䐀㔀㤀㤀㈀㔀㜀㤀㔀䌀㘀㤀䈀䄀䈀䄀䄀　䈀㔀䈀㄀㌀㄀㔀䈀㤀㜀䌀䈀㔀㤀㌀㔀㌀㈀㈀㤀㈀䈀䐀㤀㔀㈀䔀㠀䌀䄀㔀㐀㈀䈀㤀㐀㠀䄀㤀㐀䌀㈀㄀㘀䔀㜀䘀㤀㄀㜀䐀㐀㜀䌀㠀䌀㔀㜀㐀䈀䘀㘀㠀䄀䈀㔀㔀　㜀㔀䈀䈀䐀䐀㈀　㔀㄀䄀㠀䐀㐀㔀䄀㜀㌀㈀㤀㔀㠀㐀䌀㌀㌀㜀䈀㤀㐀䈀䐀㔀㜀䄀䔀㠀㄀䐀㌀㐀㤀㄀䐀䄀㤀㌀䔀䄀㠀䌀䄀䄀㠀㌀䈀䌀㈀㜀䌀　㌀㘀䌀䄀㔀㤀䌀㜀㤀䄀㠀䌀䐀㤀㠀㤀㈀㌀㜀㤀㌀䄀㄀㤀㈀㄀㐀㜀䘀䐀㔀㜀㈀㔀㌀䘀㔀　㌀䐀䄀㤀㠀㈀㐀㐀䄀䘀䐀　䈀䘀㌀䄀㄀㄀㔀㘀䈀䄀　㘀䔀㜀㘀䌀㔀䘀䄀䄀䌀㘀䘀㘀　䔀䘀䈀㔀㔀㔀㔀㠀䘀㌀䐀㈀㄀㐀䔀㔀䔀䔀㤀㘀䌀䔀䔀䈀㤀䈀㌀㈀䘀㌀䐀䈀䌀㘀㌀㜀䈀㠀䘀䄀㠀䄀㘀㠀㐀㈀㤀㤀㘀㌀䈀㜀䄀㠀㤀䔀䌀䌀䄀䐀䌀䘀䌀䈀㈀䄀䈀㘀㘀䄀㔀㐀䔀㤀㠀䔀䔀䌀䄀䌀䌀㘀　㈀䘀㘀㜀㔀䈀䐀㔀㄀䄀䄀䐀㐀㈀㠀䔀䄀䌀䈀㈀䈀䄀䈀䄀䔀　䄀䈀㐀䘀㐀㐀㐀㠀㜀䌀䈀䘀㈀䘀㌀㄀㤀㌀㌀䌀䐀䘀㌀㈀㔀㜀㈀䈀㔀㘀㈀㜀㤀㜀㌀䄀㄀㌀䐀䈀㌀䈀㐀㌀䔀㈀䈀䈀㜀䄀㄀㌀㐀䌀䈀㔀㘀㠀㘀䄀㜀㄀㌀䘀㘀䐀䈀䌀䌀㠀䘀㘀㔀䈀㤀䄀㐀㤀䌀䐀㠀　䘀䐀㤀㌀㈀㠀㤀䔀㄀㌀　䘀㌀㠀䐀㌀㘀㘀䐀䄀㘀䘀䄀㤀㠀䔀㌀㈀㘀㤀䈀䌀㄀㤀䌀㄀䈀㌀㘀㔀㌀　㘀㈀㠀䘀㔀㄀　　㠀䌀䘀㄀䘀㌀㜀㌀㔀䄀䐀㐀䔀䔀㌀㄀㐀䄀䈀䈀㘀　㈀䌀㠀㈀㠀㜀㠀䔀㤀㐀䈀㤀㤀㄀䘀䈀㌀㌀㈀䈀㔀㐀㈀䄀㄀䐀㘀䄀㔀䔀㠀㜀㐀䐀㘀䌀䌀䐀䌀㄀㐀䄀㔀䄀㔀㈀㠀㈀㜀䐀䈀㘀䔀㔀㄀㄀㜀㔀㐀㔀㐀䐀䄀㈀䌀㠀䔀㈀㈀㤀䈀㐀㤀㤀䘀㤀㌀䄀㘀㤀　㌀　䐀㈀㈀㜀㈀　㘀㈀㈀㤀㈀㐀㌀㈀䄀㤀䐀㈀㤀㐀㘀㜀㔀㤀䘀䔀㤀㘀㐀㈀㐀㌀㜀㌀㘀䄀㠀䐀㠀㈀㌀㔀䔀䈀䔀㄀㔀䄀　㜀㄀㌀㔀㐀㔀㈀㠀㔀䐀㈀䌀㐀㠀㄀䌀㐀㜀䘀㜀㄀䔀㄀㄀䐀㤀㘀䌀　䘀㘀㘀㐀㈀㘀㈀㔀㈀㐀䔀䘀㈀㠀䌀㐀㠀䘀䌀㌀㄀　䌀䔀䌀䌀䔀䌀㈀㜀㄀䔀䐀㄀䌀㠀㠀䄀䈀㈀䘀䄀㠀䐀䐀䐀㐀　䔀㐀䄀䈀䌀䘀㠀㤀　㄀㐀㐀㜀㠀䘀䌀㈀䄀㄀㄀䔀㔀㤀㤀䈀䄀䘀㘀㔀䐀䘀㜀㘀䈀㠀䌀㌀䄀䄀㌀　䌀䌀䌀㈀　㐀㌀䌀䐀㘀㐀㘀䄀䘀㌀䔀䄀㠀䄀㠀䈀㘀䈀䘀㌀㜀㐀㌀㈀㔀䐀㜀䔀㜀䐀㐀㤀㐀㤀　㌀䄀㜀䐀㌀㜀㄀　䐀㈀㔀㈀㔀䘀㔀䘀㤀㌀䄀䔀㘀㜀䔀䐀㄀䘀䌀㈀㔀　㜀㜀㐀㘀㤀㌀䄀䈀㤀㐀㈀㤀㜀䄀䄀䘀䈀䐀㌀㘀　㐀㤀䄀㌀䌀䐀㘀　䈀　㌀㔀㤀㘀㤀㐀㌀㘀㄀㔀㄀㠀　䌀　㔀㐀䐀䘀㐀㐀㐀㜀㐀䔀䄀䌀㈀㈀䘀㤀㤀䐀㌀䐀㈀㈀　䐀㈀䌀㘀㔀㄀䐀䄀㌀䔀㠀䘀䈀㐀㜀䐀䘀䔀㄀㄀㠀䐀䈀㄀㄀㐀䄀㠀㠀㌀䔀　䘀㘀䔀䄀㜀㌀䌀㘀䔀㌀㘀䈀䄀㌀㤀䈀㘀㐀㈀㔀䈀䄀䄀䐀䄀㄀䔀䔀㜀㄀㜀㔀㜀䄀　㤀㤀㜀㔀䘀㤀䄀䄀䔀䌀䄀㔀㐀㘀㔀䐀㜀㤀㔀㤀㔀䐀㔀䔀㐀䄀㠀䔀　　㐀䔀䐀䈀　䐀㜀䔀㐀䔀㤀㜀㐀㜀㤀㌀㔀㜀㘀㐀㜀　䐀㤀䌀䄀㐀㈀㜀㔀㔀㌀䄀㘀䄀㤀㠀㌀䄀㄀㔀䘀䈀㠀㈀㌀䔀㄀㔀㐀㠀䐀㌀䄀㘀䔀䄀䌀䘀䐀㔀㄀㘀㔀㔀㜀㌀㜀䄀㌀䐀　㜀㌀䈀㘀䌀㈀䐀䘀䐀䄀䌀　㔀䌀䄀䘀㘀㐀㠀䈀䌀䔀䌀㠀䘀㘀㐀㜀㌀䄀㈀䐀㐀䌀䌀䄀䌀㤀䌀㘀㠀㐀㠀㌀䔀㈀䈀㜀䘀䄀㐀㐀㐀㤀㘀㘀㔀䐀䘀㘀㐀䐀䌀　㐀㔀㈀㜀䈀㄀㘀㘀㈀䘀䘀㔀䈀㈀䘀㔀䔀㤀㈀㌀　䈀㄀　㜀䈀㈀㈀䘀㌀㐀㔀　㌀㌀䈀䈀䄀㠀㌀㈀䐀䈀㌀㈀䈀㌀　䄀䐀㈀㔀㐀㔀㘀㘀䐀㤀㘀㤀㌀䔀㌀㤀䌀㔀㤀䔀䄀䔀㔀㠀　㈀䄀䄀䐀㈀　㌀㌀䌀䈀㘀㘀㔀㘀㌀㈀䔀㤀　䌀䔀䐀㘀䌀䄀䘀㤀㈀㜀䌀㐀㈀㌀䌀䌀㠀㌀㌀㐀䘀㠀　　㐀㘀㔀㌀㈀㤀　䔀　㜀㈀䘀䈀䔀䄀㌀䔀䈀㌀㤀㤀㄀㠀䌀㤀㈀㐀䈀㤀㐀㘀㜀䄀䄀䐀㜀㐀㠀　㈀㠀㠀㠀㠀㄀䄀㐀䐀㌀䐀㌀㈀㐀䄀㤀㈀　　䐀㘀㐀　㌀䘀䔀㐀䐀䄀㜀㘀䐀䔀㐀　㘀㌀㈀㐀㔀㐀㈀㘀㐀㠀䔀䔀䌀㈀㜀㈀䘀䈀㘀　㔀㠀㜀䄀㘀　㌀䄀㌀㠀㄀䌀㘀䐀䐀㜀䈀㔀䈀䘀㘀㄀㘀㠀㜀㘀㌀䌀䔀㄀㠀㌀㜀䔀䔀㈀䐀䘀㐀㈀䄀㜀䈀䘀䄀䈀㐀㜀䐀䄀㐀䄀䐀㔀㌀䐀䄀㘀㤀䄀䌀䄀䌀㐀䐀䄀䈀　䐀䔀䌀㠀䐀㜀㤀䘀䈀㌀䄀㘀䈀㘀䈀㌀䈀䘀䈀䈀䌀䈀㄀䈀䐀　㄀㐀㔀䘀㘀䐀㔀䐀㜀㔀㤀䈀㌀㌀㜀㐀㜀㜀㘀　䐀䔀䌀䐀䄀㜀㠀䘀㌀䈀䔀䔀䔀㜀䐀䐀㔀㌀㜀　㘀䔀䈀㠀㌀㤀㤀䐀㜀䔀䌀䌀㠀䐀䐀㘀㄀㄀䄀䐀䔀㘀䄀䐀㤀䌀䄀㌀㘀䈀㜀䌀䄀㔀䈀䐀㔀䄀㔀㈀䔀䈀䐀㘀䈀䐀㜀䈀䔀䔀　㠀䔀䄀䐀䄀䐀㈀䔀㔀㜀䔀䈀䐀㘀㄀䐀䌀㄀㜀䐀䈀䈀㄀㐀䘀㘀䌀㤀　㤀㤀䈀㤀䐀㔀㐀㌀䌀㔀䈀䘀㄀㘀䌀㐀䄀㌀䄀䔀䌀䘀㤀㜀㠀䄀㔀䐀㐀㄀㠀㤀䘀䄀䐀䈀䔀㜀䌀䌀㄀䐀　㄀㤀䄀㘀䘀㜀㌀㌀㠀㌀　䄀䈀䌀䌀　㔀㘀㔀㜀㔀䈀㔀㌀䔀䐀㄀　㌀䔀㔀㌀㠀㔀䌀䘀㜀㐀䔀㄀㔀㌀䈀䌀䄀䘀㔀㠀䐀㌀㔀䔀䘀䈀䈀㤀䘀㘀䈀䔀䌀㈀䈀㈀䈀䄀㔀䐀䈀㐀　㘀䈀䘀䈀㠀㤀䔀䔀㐀㠀㔀䌀䄀䐀䄀䐀䄀䌀䄀㌀䈀㘀㠀䘀㄀㠀㜀㤀䄀䄀䄀㤀䄀䄀䄀㐀㈀㔀䄀㔀䈀㘀䔀䄀㠀㠀㘀䔀䈀㠀㄀㤀䄀䄀䄀䄀䄀㄀䄀㜀㘀㤀㠀㤀㘀䔀㜀㌀㌀㘀㤀　㜀㜀䈀㘀䈀㜀䌀䔀䌀䘀㤀䄀䘀㔀㔀䐀㘀㔀㘀㔀㜀㄀㜀㌀㈀㔀㔀䈀㔀䈀㔀㔀㔀䌀䌀　㤀㜀䄀㜀㌀䘀㤀㌀䄀㔀䄀䘀䔀㠀㄀㠀䔀䈀䔀㠀㌀䐀㘀㈀㐀㤀䘀㠀㄀䄀㈀㄀㈀㔀䄀䌀䈀㌀䘀䄀䌀䄀㤀䄀㤀䘀䄀　㤀㌀㐀㤀㠀䈀䈀䄀　䈀㈀㤀㔀㘀㈀䘀䈀　　㄀㐀䌀䌀䈀㜀䄀䄀㈀䈀䔀䄀䌀䔀䘀㜀㐀　䔀䐀䌀䔀䌀䄀䌀䄀㔀䄀㤀㘀㄀㌀　㘀㈀䐀㈀䈀䄀　䘀㈀㈀㘀㤀䐀䘀㘀㔀㈀㘀䐀㘀㔀䄀䐀　䈀㈀䄀㄀㜀㈀䔀㄀　㈀䈀㜀䈀㤀㈀䘀䐀㤀㌀䔀䌀㐀䐀㔀㘀㐀䔀䘀䘀㔀䄀㄀㐀㐀㐀䄀䈀㔀㄀㜀㘀㤀㄀㔀䐀㤀㐀䈀䐀　䈀㌀䈀㜀㔀䐀㌀䄀㄀䈀㈀㌀㈀㔀䐀䌀䔀㘀㄀䔀㘀㘀　㤀䈀㠀㄀䄀㠀　䘀㄀䄀㔀䐀　㜀㠀䈀㠀䐀　　㔀㘀䔀䔀㠀㤀䈀䄀䌀㌀䔀䌀㠀㔀㠀㌀䐀㘀㈀㜀㘀㐀㠀㜀䐀㤀㘀㔀䌀䌀䈀䌀㄀㌀㌀㈀䈀㤀䈀㜀㠀䔀㔀㜀䌀㌀㌀㤀㌀㐀㔀㔀㠀㠀䈀㜀䘀㐀　㄀䈀　㤀䌀㤀䔀㈀䔀㈀　䄀㜀䌀㔀㜀　㘀䈀䌀㄀䐀䐀䈀㌀㄀䔀　㌀㄀㤀䌀䐀㘀㠀䘀㤀㌀㠀㌀㈀㔀䄀䔀㌀㌀䔀㜀　䘀㔀䔀㘀䔀䈀㜀㌀　䐀㘀㤀㄀䄀䄀㤀䌀㤀䄀　㌀　㘀㤀㜀㐀㜀㤀㠀䔀䔀䄀䈀䌀㤀䄀䌀䐀㄀㔀㄀㘀䘀㜀㠀䔀䌀㈀㔀䄀㜀䈀䈀㘀㐀䔀㘀㌀㔀㈀㄀㠀㐀䌀㔀㈀㐀䐀㄀䄀䌀㐀㠀㔀䘀㈀㘀㘀䌀㜀㌀㔀㄀䘀䘀㜀䐀㐀㐀䄀㠀㜀䄀䘀䘀䐀㘀䌀㘀㠀㜀䐀㜀䔀㠀䄀䌀䄀㘀　䔀㄀㌀㈀㈀䄀㌀㤀䄀㔀㔀䌀㤀㄀㘀㘀䐀㈀㄀㔀㘀䐀䈀䌀䄀㘀㘀䔀䘀㘀㄀㘀㤀䐀㈀㤀㐀䐀㈀㤀㔀㜀㜀㈀㤀㔀㄀㤀㔀䌀䈀䄀㐀㄀䄀㔀㌀㈀㄀㤀㔀㐀䈀㔀㤀㌀㜀㜀　㈀㤀䘀䈀䈀䐀㤀䔀䘀㐀䄀㈀䌀䈀㈀㤀䘀　㄀㤀䘀䐀䘀㈀㐀㠀㐀㘀䘀䈀㌀㌀㜀㘀㄀䘀䈀㌀　䘀㈀䈀䐀㤀䈀㌀䐀䌀㔀㔀䔀㈀㔀䘀䈀㄀㤀䌀㤀㠀㈀㄀㌀㤀㐀㐀䌀㜀䘀㤀㠀䘀㤀㜀䄀㤀䈀㈀䔀㐀䐀䄀㔀㈀㈀㘀㤀䈀䄀㜀䘀㤀㄀䌀㤀㔀㈀䄀㐀㔀䘀䈀㌀㌀䔀　㘀䌀䌀䄀㘀䈀　㄀㜀㔀㘀㄀䔀㄀㔀㄀䌀㐀䘀㜀㠀㔀　㔀　㘀　㐀㘀㠀䔀㌀　䈀㜀䄀㌀　䌀㠀䈀　䘀　㤀䐀㠀䄀䈀㔀㈀䘀㔀㘀㜀㜀䘀䄀㜀㐀㤀㐀㤀䐀㄀䘀䌀䌀䔀䐀㄀䐀㐀㔀　䌀㈀㔀㤀㤀㤀㜀㤀㠀㌀㐀㤀㜀㘀㘀㜀㔀㤀䘀䔀㄀䐀䈀㘀㘀㈀㜀䈀䘀㄀䘀㈀㈀㤀䈀䐀㐀㄀䄀㜀㘀㜀䈀䘀　䐀䐀䔀㐀䐀㈀㤀㄀䄀㘀㌀㄀㜀㈀㔀㜀䄀䐀㤀䈀䈀㐀　䐀㄀㘀㌀㜀㄀　䄀㌀䈀㔀㄀㌀㌀㐀䘀　㠀䔀䐀㤀㌀㔀㈀㄀䈀㔀㈀䈀䌀㈀　䈀㘀㈀㔀㤀㤀䈀㈀㌀㜀䄀　㜀䐀㠀䌀䘀　䘀㌀㤀䘀㤀㐀䘀㐀䔀㄀䘀䌀㐀㔀䘀㄀㌀䔀䘀䈀㌀㈀㠀䔀㔀䘀㐀㈀　䔀㤀䈀㐀㄀䈀㌀　㌀䄀　䐀㤀　䔀䈀㈀䘀㄀㤀㄀䈀㈀㈀䘀䐀㔀㘀㠀䈀䘀㘀　㌀㈀䐀㄀䔀䘀㐀　䄀㐀䄀㔀䘀㜀䐀㐀䐀　䔀䘀㐀　䔀㠀　䐀䄀㤀㌀䐀㌀㔀䄀㘀㄀䄀㔀㌀㜀䄀䔀㌀㄀㜀䐀㜀㘀㜀䌀䄀䔀䌀䄀　䐀䌀㠀㌀䔀㤀㔀䘀　㄀㄀䐀㔀䘀㔀㠀㤀㔀䈀　㤀㜀㤀㔀䘀㄀䌀䘀㤀䘀䔀㌀䄀㄀　䈀　䔀㠀㘀㜀㐀㘀㌀䌀㈀㠀䐀㄀㐀㌀㈀䘀㔀䘀㠀䘀㌀㘀㠀㔀㄀䘀㤀䘀㄀㔀䌀㔀䐀䌀䄀　䔀㤀㐀㘀䐀㤀㤀㔀䄀䌀䘀㘀䐀㘀㠀㜀　䔀㤀㜀㐀㐀㘀㤀㔀㐀㐀䄀㌀㔀㔀䐀㤀㘀䄀䈀䈀㔀䐀䌀䐀㈀䐀㔀㔀䈀䐀㔀䈀㜀䈀䄀䈀㤀䌀㜀䐀㤀䔀䌀㘀䄀䌀㤀㘀㔀䄀㠀㜀㐀㈀㈀䄀㤀㜀㌀㈀　䄀䈀䐀㌀㈀䌀䘀䐀㔀㘀䌀䌀䈀䈀㔀䄀㜀䄀䈀䄀䄀㌀㘀㘀䘀䐀䈀㔀䌀㈀㔀㜀㤀䄀䌀䘀㔀䘀䄀䘀㔀㜀㤀㜀㈀䄀䐀㔀㄀䄀䐀㌀㈀㤀䄀䈀㤀㈀䌀㜀䈀㜀㘀㤀䄀㌀㔀䄀䐀㌀䌀䐀䘀㔀㘀㔀㘀㘀㐀㘀䘀㄀䄀㘀䈀㘀䘀㄀䄀㘀䈀䌀䄀㔀㘀䔀䄀㐀䐀㘀䄀䈀㤀㌀㘀㈀㔀㈀㌀䌀䐀㤀䔀㘀䈀㐀䌀㌀㔀䔀䄀㈀䐀㄀㤀㔀䄀㔀䈀㔀㤀㐀㄀㘀㄀䘀䐀　㠀㐀㠀㈀㄀㄀㜀䄀㐀㜀　㌀䈀㐀䄀䔀㄀　㐀㐀䄀㈀㔀　㠀㔀㈀㔀㈀䄀㌀㔀㐀䔀㤀㔀䘀䈀䈀㘀㌀㐀㔀䘀䈀㠀㜀㐀䌀䌀㌀㐀㄀䐀䄀䐀䄀䐀㈀㠀䈀㜀㐀㜀䄀䈀䐀䌀㔀䄀䔀䐀㔀㘀㠀㈀㐀㠀㔀㤀㤀㠀䔀㈀㈀䘀䈀㔀㄀㤀䐀㈀㌀㐀䘀䄀䈀㤀㔀䔀㜀䐀㄀䔀䘀㜀㘀䄀㐀㄀㈀㌀㤀㄀㔀㐀㘀　䐀㜀䐀䘀䌀㘀㤀㘀䄀䄀䄀㠀㄀㤀䌀㤀䔀䈀䔀䔀䈀䈀㐀㌀䔀㔀䈀　䐀䌀㈀䌀㄀　㈀䄀㐀㘀㈀䈀㄀　㠀㐀䌀䌀㜀㤀䘀㜀䔀䐀㈀㔀䘀　㠀㐀䈀㄀㔀㜀䔀䐀㄀㐀㠀㔀㈀䔀㌀㘀　䐀䘀㤀㄀䌀㤀㄀䌀㜀㔀䈀㘀䔀㈀㜀㐀䄀㔀䄀㐀㜀㈀㜀㤀䈀㤀㔀䌀䄀㈀㐀䄀䈀㌀䔀㜀㔀㔀䐀㤀䔀㔀䈀㈀㜀䘀㤀㔀㘀䄀䐀㈀㠀䈀　䈀䔀䌀䄀䔀㐀䌀㠀䐀䔀䌀㠀㔀㈀䘀　䔀㐀䈀㔀㈀䈀㔀䔀㤀㜀㈀䈀㌀　䄀䌀䔀㈀䈀䌀䄀㐀䘀㜀䌀㠀䌀㄀䔀　㈀㌀㐀㘀㤀䈀㈀㜀㐀㄀䐀䘀䈀䄀　㔀㘀䄀䘀㘀　㔀㤀䄀㔀㔀䔀䈀㜀䐀䌀㜀䘀㤀䔀䐀㈀㈀䔀䐀㠀㌀㐀㔀　䌀㘀㄀㄀䘀䈀㔀㄀㤀㈀䌀㘀䘀䌀　㐀㔀㠀䌀䄀㘀㈀㔀䔀㌀㤀䄀㐀䌀䄀㌀䌀䄀䄀䄀㌀　䄀䌀䌀㌀䄀㈀䄀㄀㜀㄀㐀䈀㠀䔀䄀㜀㠀㈀䌀㔀䄀㈀㠀䘀㔀㔀㄀㠀䈀㐀㔀㤀㄀㜀　䄀　䈀㐀㌀㐀　㐀䘀䔀㘀㄀䔀䄀㠀㠀䐀㔀㘀㘀䈀㌀㜀䔀䔀㜀䌀㘀㌀䈀㘀䄀㘀䄀䔀䈀㤀㜀㈀䌀䘀㔀䐀䈀㌀䈀㈀䄀䄀䈀㔀䈀䈀㘀㌀㔀㘀㘀㐀㤀㈀㜀㘀㜀䔀䔀㤀㤀㈀㠀䌀䘀䌀䌀㘀㔀䈀䘀㤀　㤀㌀　㤀䄀㄀䔀㌀㠀　䄀㜀㜀䔀㔀䈀　䈀䈀㜀㔀䌀㤀㠀䈀㤀䔀䔀㌀䄀䘀㐀㄀䔀䘀㐀㈀㘀㘀㈀㈀㌀㈀䐀　䘀䄀㘀䔀㔀㄀䐀㘀㘀㔀䔀㘀㤀㐀䈀㔀㌀㔀㠀　䐀㔀㘀　㌀㔀㄀䄀㐀㄀䐀㤀䐀䌀䘀䘀䐀㘀㐀㈀䔀㤀䈀㤀䈀㈀䈀㐀䐀㌀䐀䄀䄀䄀㄀㌀㐀䔀㔀㄀䐀㤀㔀㠀䄀㌀㐀㔀䐀䘀㐀䄀　㤀　㠀㤀㌀䘀䘀㘀㐀㄀䘀㜀㌀㄀䔀㌀㌀㌀㌀㠀㈀㄀㔀㠀㠀　㤀㌀㔀㄀㠀䘀䈀䄀䌀㤀㘀㐀㔀䄀䘀㘀㔀㄀　㈀㤀㤀䌀䘀㄀䄀㔀㌀㔀㌀㠀䐀䌀䈀㘀䘀䈀䐀㘀㤀㌀㈀䐀㄀㘀㌀䌀㘀㤀䈀㠀䌀䐀㤀㘀㐀㤀㈀䔀㐀㤀㘀䔀㜀䘀㌀㄀㐀䔀㘀㔀㔀㤀㐀㜀㌀㜀㜀䔀㐀㤀㔀䄀㜀䔀㜀䄀㘀䌀㠀㄀䘀䌀䌀䄀㜀䐀㘀㈀䘀㜀㠀㄀㜀㔀㤀㐀㜀䈀㘀㄀䌀䌀䄀䌀䄀䄀䄀䈀　　　㠀䐀　䘀㄀㔀㄀　㔀㈀　　䌀㜀䈀㐀㔀㜀䐀䈀㐀䌀㄀㔀㜀㤀㐀㜀㐀㠀䈀䄀㌀㄀㤀䐀㐀䐀㐀䘀䄀䘀㈀䐀㘀䐀㜀䄀㔀䌀䄀㈀㌀㤀㔀䐀㐀䈀㐀㤀㐀䐀㜀䐀䄀㤀㔀㐀㈀　䘀㔀䘀䌀　㜀㔀䘀䈀　䔀㈀㘀䘀㈀䄀㔀䌀㈀䘀　㐀㌀㤀㈀㌀䘀䘀䘀䈀㄀　䌀䌀㐀㔀䘀㄀　䐀㤀䘀䈀㠀㔀㄀䄀䐀　䈀䌀䘀䐀䈀㈀　䌀䄀䄀䐀䌀䄀㐀㄀㜀㌀㈀㔀㄀㈀㌀䐀㄀䘀䔀㐀䔀䌀㔀㔀䔀䈀　䈀䔀䈀䈀㜀䈀㘀䔀㘀䌀䘀㐀䔀㜀㄀䄀㔀䘀䄀　䘀㄀䄀㔀㈀㔀㌀　䐀㠀䌀㈀㈀㌀䐀㠀䘀㈀㘀　　䐀䈀㌀䐀䐀䔀㜀䈀㜀㜀㌀㘀䄀䔀　䈀㜀䐀㘀䔀㘀㈀䔀　㈀㘀㠀䌀㠀䄀䈀㈀䔀䈀䘀㠀㄀㠀㘀㜀䐀㐀㄀㘀䈀㐀㔀䐀䐀䈀䘀㠀㠀㄀㤀䈀㤀㔀䌀䄀䐀䈀㌀㤀㘀㜀㔀㤀㜀䔀㘀䔀㄀㘀㤀䌀䔀㤀䌀䐀㈀㤀㌀䄀㐀㔀㘀㘀䘀䐀䐀㐀㄀䐀㌀䈀䌀㘀䔀䘀　㤀㌀㐀䔀㜀㘀㈀㐀㐀㈀㐀㠀㈀㐀㘀㈀　㜀䄀㄀　㄀㌀䌀㤀㜀㤀㤀㐀㄀㠀㤀㠀㔀㜀　䔀㄀㈀　㔀㠀䄀䐀䘀㜀　㔀䄀㄀㐀㌀䘀䘀䘀䄀㐀㈀䐀㔀㄀䔀㐀㤀㐀㘀　㈀㠀䐀㠀㐀䔀㤀　䘀㄀䔀䐀㔀㘀㔀䈀㘀㤀㜀䐀䄀䐀㄀㌀䄀㐀㈀䈀䈀㄀㔀㔀㄀㐀㠀　㔀　㠀䘀䔀㤀㔀㌀㔀㈀䘀㐀䔀㜀䈀䘀䌀䌀㈀㄀㘀䔀㠀䌀㐀㐀㜀　䐀䔀㘀䌀㘀䈀㔀㌀䐀㤀　㠀䄀㜀㔀㜀䔀㘀䔀㜀㔀䈀䔀㐀㐀㜀㤀㠀㤀㜀䌀㄀䘀䌀㠀䌀䌀䌀䌀䈀䐀䘀䈀㐀䔀㐀㈀䈀　䌀㄀㈀㠀䐀㈀㌀㄀㌀㘀㔀㈀㠀䐀㄀䔀　㜀䄀㌀㔀㌀㔀㄀䈀㈀　䈀㘀㌀㐀䄀㄀㄀㤀㤀䄀䘀　䈀㜀　㐀㤀䄀㐀䌀㘀㈀䄀㘀　䔀䄀䈀㐀䈀䔀㐀㈀㠀㐀㠀㐀㤀㐀㈀䘀䌀䔀㐀㄀䘀㌀䔀㠀㤀㐀䘀䐀㈀䄀㐀䈀㘀䌀㈀䌀㘀㌀䄀䘀䈀㌀㄀㠀㔀䄀㌀䄀㘀䈀䄀㔀㐀䘀㘀䄀㠀䈀䐀䈀䔀䈀䔀䌀㠀䌀㄀䐀䐀㤀㐀㔀䈀㤀㘀㘀䈀㔀㄀䐀䐀䘀㌀㌀㤀㤀㔀㌀㤀䄀䈀㌀　㈀㌀㔀㘀㘀䌀㘀㌀㜀䘀㘀㌀㐀㠀㐀㤀㌀㄀䈀　䐀䄀䘀㌀䔀䘀㤀䄀䈀㐀　㘀　㌀㘀䈀㌀㠀䘀䘀㌀䈀㘀䌀㄀䘀䈀㈀㄀㔀㘀㠀㈀䌀㠀㔀䐀㘀䔀㔀㘀㄀䔀㘀㠀㄀㠀䌀㠀㈀㜀㐀㐀䐀㠀㄀㠀䐀㤀㜀　䘀㐀㘀㐀䘀㌀㠀㔀䘀㔀㐀㄀䔀㈀䄀㔀　㘀㔀㔀㐀㄀䌀㘀㄀䔀䔀㠀㜀㜀䄀㈀䄀㜀㌀䘀䘀䌀㌀㄀㤀㠀㘀㄀㈀㐀䈀㜀㔀　䔀䘀㔀㜀㠀㈀㤀䄀㐀㤀䄀䔀㠀䘀㄀㌀㔀䔀　䐀䐀　㈀䔀㔀　㈀䌀䐀䔀㈀㘀䈀㐀䘀㠀㜀㈀㔀䌀䐀㜀䌀㄀㄀䌀䐀䈀㤀㤀㈀㜀㐀㜀䈀㤀䐀䈀䐀㔀㘀㤀㐀䄀㤀㈀㐀䈀㌀㈀䌀䄀㜀㌀䘀䐀䐀㤀㘀㤀㌀㘀㤀㌀㠀㈀㘀㔀㜀㈀䄀䔀㐀㔀㈀䈀㘀䄀㠀䈀㘀㌀䔀䈀䘀㌀㠀㘀㜀㐀㜀㐀㘀㘀㄀㤀㘀㐀㔀㜀㜀㤀㜀㌀㘀㐀㔀䄀䘀㔀㔀㌀㈀㐀䌀㔀㄀㔀䐀䄀䐀㐀䐀䄀㈀䔀㌀㜀㈀䔀㄀㐀㐀㤀䘀䌀㌀䔀䌀䐀㐀㄀㠀䈀㔀㔀䄀䄀㔀䄀㔀㈀䌀㜀䐀䘀㤀㐀㘀䈀䐀䌀㤀䄀㐀㘀㜀㄀䘀䌀䈀䌀䈀㔀㌀䄀㘀㜀㄀䐀㘀䔀㔀㤀䘀㔀䈀䘀㈀䈀㈀㌀㈀㠀䐀㘀㤀㈀㘀㘀㌀㤀䔀㠀㘀　㤀㄀㠀䔀㄀䄀㈀㔀㄀㐀　㠀㠀䘀䈀㤀　䔀㌀䔀㔀䐀㄀㈀㠀㘀　㘀㐀䌀䔀㠀　㄀䄀䄀䌀䌀䌀㤀㤀㐀㌀䌀䄀䐀㐀䐀㌀㜀䌀㄀㐀㌀㠀㈀䐀䈀䈀㔀㐀㄀㐀㄀　㜀䔀䄀䘀䄀㘀㄀䄀　㈀㠀　㌀䐀㘀㄀㜀䈀㤀㘀䘀㐀㔀㔀䈀䈀㌀䘀䈀㔀䔀㌀䔀㠀䄀㌀㔀　䐀䔀䘀　䌀䐀㘀䘀㌀䐀㌀㔀㜀䄀㜀䐀㘀㔀㤀㜀䐀㌀㌀䌀㜀䌀　㌀㈀䐀䄀㔀㤀䔀㠀㤀㜀䈀㜀㜀㌀㘀㄀䐀㌀䘀㌀㔀䘀䔀䐀㤀㤀䐀㐀䐀㐀䘀䘀䔀㘀　㘀䔀㜀䘀㘀㄀䘀䈀䘀㘀䘀䄀　䘀䔀䔀㈀䐀䐀䌀㜀㠀㈀䐀䌀㘀㈀㈀䐀䌀㘀䐀㈀　　䘀䄀䔀　㔀　䘀㈀䈀㌀㐀䔀㘀䄀䈀䔀㤀㤀䘀　䘀㈀　䄀㐀㤀㐀䘀䔀䌀㄀㠀　䘀䌀㈀䄀㈀㌀㠀䐀　㤀㈀㤀㤀㘀䌀㈀䄀䄀䌀㜀㄀㘀　䌀䐀䘀㌀㔀㤀䌀㌀㄀㐀㠀　䌀㠀㘀䐀㐀䌀䄀䄀㌀㤀㤀㔀㐀䌀䄀㌀㈀㤀㈀䌀䄀㐀䈀䘀㤀㈀䐀䘀㐀㈀䘀䔀㄀䈀㤀㔀㠀　䐀䈀䔀㘀㈀㐀䄀䐀㠀㘀㠀䘀㠀䈀㜀䌀㜀㠀㤀䄀㈀䄀㘀䌀㄀　䈀㐀㈀㠀㐀䌀㈀㐀㈀㄀䘀㠀䈀㐀㤀㌀　㠀䄀㐀㄀䈀　䄀㠀㘀㜀㔀䘀㤀㘀㤀䈀㐀䈀　䈀㜀㌀　䈀䐀㌀㔀㐀㤀㈀䔀䔀䘀㐀䔀䄀䘀㈀㘀䌀㐀㜀㜀㌀䄀㌀䌀㌀㘀㘀㜀䐀㈀㄀䈀㜀䌀䌀䔀㠀㠀䔀㘀䌀䐀䔀䐀㐀㔀䄀䈀䄀㔀㄀㈀㌀䘀䈀䄀䐀䄀㔀䄀㠀㌀㈀䄀㌀㘀䄀㔀䐀㐀㌀　㜀䘀䈀㈀䈀㌀㠀　䐀㐀㤀㈀㔀㐀䄀䄀䐀䘀㈀㠀㄀䔀㘀䄀䄀䔀㔀㔀䘀䄀㈀䈀㤀㄀䌀䌀䈀䌀㤀㘀㐀㔀㤀㜀䐀䔀　䘀䄀㜀䔀㔀䘀㘀㘀㤀㄀䘀䈀䈀㌀㄀㤀㘀㘀㔀㘀㤀䄀㘀䐀㐀䈀㔀㔀㄀䌀䌀㐀䘀㜀㠀　䌀㈀㘀䔀㐀㈀㈀䌀㠀㐀㜀䈀㤀　䌀㠀㠀　䄀㜀㠀㜀㠀䐀㄀䄀䄀㤀䘀㘀㜀㐀㈀䄀䌀䐀　䔀㤀㐀㜀䌀㜀㘀㠀　㠀䘀㜀䄀㠀䔀䌀㜀㄀䘀䘀㔀䘀　䘀㐀䄀䔀㠀㐀　㐀䘀㘀䘀㘀㔀㐀䔀㌀㌀㜀㄀䐀㐀䐀㠀䐀䌀㔀㠀䘀㤀㠀䔀　㘀㈀䌀䈀㠀䐀䄀㤀䈀㈀㌀䈀䌀䄀　䈀䌀䘀㜀䘀㄀㤀㤀㜀䐀䔀㔀㘀㔀㠀㔀䔀䌀㤀㔀㄀　䘀㄀㌀㜀㘀㈀㤀㤀㈀㐀㌀㠀䄀䔀　䈀䌀䌀㌀䈀䌀㠀㈀㠀䔀䘀㔀䌀䄀㐀㄀㘀㔀䄀㘀㄀㘀㜀䐀䔀䄀䈀㐀㐀㐀㔀　㘀㠀㐀䐀㔀䌀䄀㄀䘀㈀䌀㐀㐀㌀㘀㈀　䄀㐀㘀䄀㈀䈀㠀䘀䐀䄀㤀䈀䘀䘀䔀㐀䘀䘀䐀㌀㜀㠀䘀䈀㤀䌀䄀䔀䄀㘀䄀㤀䐀㜀䐀㤀䐀㔀䐀䈀䐀䔀　䐀㜀䄀㔀㔀㈀䌀䐀㌀䘀䐀䔀㘀䘀㄀䘀䐀䄀㌀㌀䌀䄀㄀䌀䄀㜀㘀䔀䈀䐀䈀䌀㘀㄀䘀䈀㤀㘀䈀䔀㐀㄀䔀㘀㘀㤀㔀䄀㈀㜀䌀䌀㠀㔀䌀㜀㄀㐀　䘀䈀　䐀䐀䌀䄀㈀䄀㈀㈀㈀㄀䌀䄀　㜀㐀㄀䈀㔀㄀㔀㌀㔀㤀㔀㔀㔀㤀㈀㜀䌀㜀㌀㜀䔀㌀㜀㜀䈀䔀　㜀䌀㐀䌀㔀㤀䘀㔀㘀㄀䘀䌀㄀㔀䔀䔀䌀䘀䘀㄀䌀　㘀䌀䈀㤀　䌀䈀䌀䈀䄀　㈀㘀䌀䈀㜀　　㌀䘀䈀䔀㄀㠀㈀㐀㌀㄀㘀㤀䘀䐀䘀䈀㠀㈀　䘀䄀䘀㠀　㘀䌀㤀㌀䔀䌀䔀䌀　䄀䌀㠀㘀䘀䈀䌀㄀䌀㈀㠀㌀㈀　㔀䘀㠀䌀㄀　䄀㈀㠀㘀䈀　㐀䘀㠀䈀䈀㌀䘀　㜀㔀㐀䔀䌀㘀㔀䌀　㤀䘀　　㔀䘀䔀㌀㐀㄀䄀䐀䈀䈀　㐀㔀䌀䄀㜀㌀䔀䘀䐀㜀䔀㐀　䄀㌀㐀䈀㠀　㔀䈀㌀㔀䈀䘀㔀䐀　㄀㘀䐀䌀䈀㘀㔀䔀㄀㔀㄀㄀䔀㜀㐀㄀䈀㄀㌀䔀　㐀㌀　㈀㜀䌀䘀䘀㌀䘀　㌀䘀㐀㌀㌀䘀䘀　㌀䔀　䐀㜀㜀䘀㜀㤀㘀　䈀㠀䔀䄀㌀㈀䘀　䌀䘀㐀㤀㐀㠀䌀㈀㜀䘀㄀㌀㜀㠀㌀㜀㄀㄀㠀䌀㄀䈀䘀䔀㠀㈀䔀　㄀㌀㐀㤀㐀㠀䌀㈀㜀䘀㘀䘀㐀㠀䈀㤀䔀䘀䐀䘀㠀㔀䘀䈀㔀㌀䔀䔀㌀㜀䄀㔀㤀㤀䈀㈀㐀䐀㠀㔀㈀㘀㤀䘀㘀㤀㈀㘀　䔀䈀㌀䄀㘀　䘀㤀䄀㌀䔀㘀㈀䘀䄀㌀㠀䌀㈀㤀䐀䄀㤀䌀㘀㔀㐀㈀䈀䘀䐀䈀㈀㐀䌀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀䘀䘀㠀㌀㘀㄀㤀䘀　　㠀䈀㘀㤀䘀㐀㌀䄀㄀　㠀㜀䌀㜀䌀䌀䐀㤀䔀㘀㔀䈀　　㠀䔀㔀㌀䈀　㌀㐀㔀㠀㜀㘀㔀䄀䈀䔀㤀㈀㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀㈀㐀㈀㐀㈀㄀　㤀㐀㤀㐀㠀㐀㈀㄀㈀㤀㈀㤀　㠀㐀䘀䘀㜀㈀㌀㠀㤀㈀㠀㐀㈀㐀㈀㐀䔀㄀䄀䘀㄀㄀䘀　㌀䈀㜀㄀䔀㔀䄀䌀　䐀㐀䄀　㤀䄀䐀䈀㈀㘀㤀䐀㠀㈀㌀䌀㄀㘀䘀䐀䔀䔀䈀䈀㄀㈀㔀䌀㄀䔀䘀㤀䈀㈀䈀䄀㔀㌀䘀㄀㈀䔀䄀㄀㈀䔀㈀㤀㈀㌀䔀㈀㐀䐀㐀䄀㔀䌀㐀㈀䄀㜀䐀㔀䄀䄀㠀䌀䈀䄀　䘀䔀㔀㌀䄀㄀㈀䔀㠀㜀䘀䄀㄀䘀㠀㔀䈀䄀㠀㈀䔀䌀㤀㈀㤀㤀㠀㐀䈀䄀㤀㈀㤀㐀䌀䄀㌀䔀㈀㌀䐀㐀㔀㔀㠀㐀㔀㌀䐀䌀㈀㜀䐀㐀䐀㔀䔀䌀㜀䐀䘀㄀䈀㔀㌀㐀㘀㐀䄀䘀㘀㈀㐀㄀䄀㠀㘀䈀㐀㤀䄀㤀䈀㈀㐀㔀䄀㠀䔀䈀䘀㐀㜀㈀䔀㔀䄀㐀㔀　䐀㜀䔀㌀㄀㠀㠀㘀䘀䘀㔀䘀㔀㤀㄀㠀䈀㔀㈀㔀㈀　䐀㐀㄀㤀䄀㈀㐀㠀䐀䘀㈀㔀䐀㐀㔀㤀㈀㈀䈀㔀䈀䔀㈀㐀䐀㐀㈀㔀㈀㐀䐀䐀䈀䄀㈀㐀䐀㐀䄀㔀㐀㐀㘀䈀䘀䐀㤀䔀㔀　㤀㜀㐀㄀䘀䐀㔀㔀䄀㄀㈀䔀㠀㜀䘀䄀㈀䘀㠀㔀䈀䄀㠀㈀䄀䌀䈀㌀䘀䔀㤀䈀㔀　㔀㜀㄀㈀䈀㌀㈀㔀㈀䄀䐀㐀㔀㔀䌀㐀㤀㠀㔀㄀㈀㤀䐀㐀䐀㔀䌀䌀㔀　㜀䌀㈀䐀　䐀㘀㤀䌀䐀㘀㠀㄀㌀䔀䄀㔀䄀㘀㈀䌀䔀䐀㠀㈀㜀䐀㐀㜀㔀　䄀㐀㤀䌀㘀䄀㜀㠀㔀䈀䄀㄀䔀䌀㜀㐀㠀　㠀㈀㌀㔀㔀　㄀㜀㄀㔀㘀䐀㤀㐀㜀㠀㔀㌀䄀㈀䘀㘀㜀䈀䔀䌀䔀䌀䈀㤀㤀䄀䘀䘀㌀㜀㈀䔀㘀䔀䈀䈀䌀㤀䌀䘀㤀㌀䄀㈀䘀㘀㜀䈀䔀䌀䔀䌀䈀㤀㤀䄀䘀䘀㌀㜀㈀䔀㘀䔀䈀䈀䌀㤀䌀䘀㤀㌀䄀㈀䘀㘀㜀䈀䔀䌀䔀䌀䈀㤀㤀䄀䘀䘀㌀㜀㈀䔀㘀䔀䈀䈀䌀㤀䌀䘀㤀䈀䄀㐀䔀㘀䘀䔀㔀䌀㐀䈀㤀䈀䌀㤀䌀䈀䘀㐀䌀㌀㠀㔀㈀㐀䐀㈀䄀䔀㄀䄀㜀　䔀㘀䄀䘀䐀䌀㐀㐀䘀㌀䌀㈀㐀㐀㈀㐀㈀㈀㐀　䄀㌀䘀㤀㌀㈀㐀　㘀㜀䐀㄀䐀㔀　㠀䈀㤀　㌀　㤀㘀㘀䔀䔀㠀䘀㄀㐀㌀㈀䐀㐀㠀㔀䌀㜀　䄀㜀㤀䐀　㐀　　㌀㠀㌀㈀　䌀㜀䐀㔀㌀㘀㐀㄀䄀䔀䔀㐀㔀䈀㄀䔀㔀㠀㌀㐀䘀㄀䘀㠀䌀䐀䔀　㔀䄀㔀㄀㜀㐀㜀䔀䄀　　㜀䄀䄀　㌀㔀　㄀䈀䐀㌀䔀㌀㈀　㜀㌀䐀㠀㌀㠀　䐀㄀　㜀㜀㠀㐀㘀䌀㤀㄀䔀䄀䌀㜀㄀䄀㐀　䘀䈀　䔀䘀　㄀䐀䌀䈀㌀䈀㠀㘀䄀　　㘀䄀㔀㌀㐀㠀　䐀　㜀㌀䘀㈀㄀㄀㠀䈀㌀　㜀䔀㘀㠀䄀䔀䈀㜀　㜀㄀䈀䄀㈀䈀㐀㤀　䐀䘀䐀㐀䈀　㌀䘀㄀㔀㘀　㌀㜀㄀㈀㈀　䐀㘀䔀䌀　㄀　㠀㘀䈀㄀㄀䌀䄀䌀䔀䈀㠀㘀㜀㔀㈀㠀　䔀　䘀䐀㤀㈀㤀㠀䌀䐀䐀　䌀䄀䐀㘀㤀䔀㠀䄀㔀㜀㜀㘀㜀㠀㄀䌀㘀㘀㠀㤀䌀䄀㜀㔀㄀䔀㠀䘀㜀㈀㌀㄀䘀㠀㄀䘀㜀䄀㐀㘀㜀㄀㈀㘀㔀䌀㄀㤀㄀㠀䐀䐀　䄀㘀䘀䘀䘀䘀㄀　䔀䐀㜀㔀䄀㌀㈀㐀㔀㘀䘀㌀䌀㠀䔀㌀　㤀　㤀㤀䌀㜀㈀䈀㠀䌀䄀㈀䌀䐀䌀䘀㔀㈀　䈀䘀䄀㈀㠀㐀䔀㜀㘀　㘀䔀　㐀㜀䈀㘀㘀㘀㄀㤀㐀㄀㜀㈀㔀䌀㜀㐀㄀䘀䘀㌀㐀䘀㘀䘀㔀㤀㌀㔀䔀䄀　㠀㤀㐀䄀䌀㜀㠀䘀䘀㌀㠀㈀㈀㠀䐀䈀㜀㔀㌀㠀䐀䘀㠀㜀㈀㌀㜀䌀㘀㐀　㘀䐀㘀䄀㐀㤀㈀䘀㘀㘀㈀䌀㤀　㤀㄀㐀㠀㤀㘀㌀㌀㤀䔀䌀㠀䘀䄀㈀㔀䔀䘀䐀㐀　㠀䈀䄀㠀䌀㄀㄀㔀㌀䔀䔀㠀䘀䐀㄀㠀㔀　䔀㄀㠀㜀㤀㤀㔀㄀㤀　㐀㈀　㜀㜀㈀䔀㌀㐀㜀㐀䔀䘀䌀㜀㄀㌀䔀䐀䌀䘀　㌀㌀　㌀㌀㌀㜀㠀　䄀㜀㤀㜀䔀䐀䌀䈀㠀　㘀㈀㜀䔀㠀䐀䈀　䘀㄀㠀㈀㤀㔀㘀㌀㜀㠀䌀䄀㌀䈀㠀䘀㘀㐀　㘀䈀　䔀㘀䄀㌀㄀䐀㐀㐀㌀㄀㐀䘀㠀㤀䈀㠀　㜀䄀　　㘀㤀㠀䄀䄀　㈀䌀㈀㠀䈀䘀㜀䔀㈀㠀䄀㜀　㐀㐀㤀䘀㄀㔀㠀㘀㌀䌀㠀㄀㌀䈀䘀㘀㘀㄀　㌀㤀䘀㈀㈀　䄀㔀㐀㄀㔀䌀㈀㔀㠀䄀㜀䄀䔀䄀㐀㔀䄀䐀㐀䌀㐀㈀　䘀䈀㔀䌀㤀㔀㤀㤀㐀㘀　㄀㐀䘀㄀䘀䄀　㐀㔀䐀䘀㠀㤀㄀㈀㜀㔀䔀㄀㘀㔀㄀䈀㐀㠀䄀㈀㠀㘀　㜀㔀　䈀㌀㘀㐀䈀㌀㔀㄀㘀㄀㘀䘀䄀䌀㔀㔀㔀㘀㘀　　㐀䘀　　䔀㔀㄀㌀㄀㘀䄀㠀　䌀㐀㈀䌀䘀　䌀䄀䔀䌀䄀䔀㌀㠀䌀䄀㈀䄀㐀㔀㘀㈀㠀䄀　㈀䈀㠀㘀㤀㄀㄀㜀䐀䔀㌀䘀㐀㐀䐀㤀䘀㈀䈀㐀　㜀䐀　㘀䄀䄀㠀㈀㔀㐀䌀　䈀㤀㘀㐀䈀䄀㤀㤀䄀㠀㄀䈀㄀㘀䔀㔀㠀㌀䘀㠀㘀䄀䐀㈀　䔀䄀㔀䄀䈀㐀㘀䈀㔀䔀㘀㘀䘀䌀㈀䄀䈀䌀㄀䔀㠀㌀　㈀㔀䘀㈀㄀㤀㐀䔀䐀　㐀㠀䔀㔀䌀䄀㄀㌀㠀㤀㄀㈀㌀㈀䄀䈀㔀䐀䐀㌀㠀㠀䘀䔀㜀㜀䄀㈀㜀䈀㐀㔀䐀䔀㠀䈀䘀㠀㤀䐀䄀㜀㐀㈀　䈀㘀㄀㤀䌀㐀䈀　　㜀䔀㔀㌀　㈀䈀㜀㠀㘀䄀䄀㈀䈀䌀㐀㔀䔀䈀　䈀　䄀㤀㘀㐀䌀䘀㤀䔀㜀䘀㔀㄀㈀㐀㄀㘀䈀㄀　㘀䐀䐀㐀㠀㜀䈀䄀䄀㘀㤀㘀㄀䈀㠀䔀㜀㌀䌀㌀䐀㌀㌀㠀㈀㔀㠀䌀㠀㤀㐀㈀䔀䈀㘀㘀　㄀㜀䈀　䌀䈀㠀䔀　㌀㔀䈀㐀㈀䈀䄀䔀㈀㔀㌀㜀䐀䄀　㠀䘀㔀㠀　㤀㤀㔀㔀㜀䌀㠀㤀䐀㄀䌀㜀　㌀㤀㐀䈀㠀㜀㄀㜀䐀㠀䘀䈀　䈀䔀䔀䈀㄀㈀㔀㄀䄀䄀䘀㤀㈀㈀㌀䔀䄀㤀㜀㜀㠀㘀䄀　䔀䐀㈀㔀㔀䈀　㔀䄀䈀㄀㄀䄀䐀䈀䔀㄀䔀㌀　㔀㐀㐀㌀㤀䌀㔀㠀㌀䐀䈀䔀㌀䌀㌀䔀䘀䔀䈀䐀䄀䐀㌀䘀㠀㘀㜀㐀㜀㠀䐀㄀㌀䄀㈀㤀㐀䐀㌀䈀䔀㌀㜀䄀㔀㤀䘀㄀䐀㘀㠀䈀䔀㌀䔀㜀㤀㐀㘀　䔀䈀䔀㄀䘀㠀㘀㠀㘀䄀䌀䐀䈀䌀㄀㔀　㐀㘀㄀䈀䌀　䘀䔀䐀䔀㤀㌀䘀㈀䈀　䔀䄀䈀䘀㄀㈀㜀㄀㤀㠀䈀䘀䘀㔀䄀㘀㈀㜀㄀㄀䘀㔀　䔀㈀㈀㄀䌀㔀䔀㠀㜀䘀㈀㔀䌀㈀㜀䐀㠀䔀㘀䌀㐀㈀䐀䈀　㠀㈀㄀㘀㔀㌀㄀　　㄀䄀䌀㤀㤀䄀㐀㤀　㔀㐀　　　㌀䐀㈀䈀㠀㈀㄀㈀㤀䌀䈀㤀䌀㠀㠀䄀㔀䌀㠀㈀䔀䐀㔀㔀㈀　㐀㔀䔀㔀㠀　㌀䈀　䄀䘀㔀㄀㠀䔀䄀㌀䐀㠀㐀㤀㘀䔀䄀㐀㘀㐀䐀䔀䐀㠀㄀䐀䔀㐀㤀䄀㐀㈀䌀　㘀䄀㌀　㈀㈀㠀䈀䐀㄀㠀䘀㐀㜀㤀㔀㘀䘀㤀㠀㘀䈀㠀䈀㘀䈀㠀䘀㈀㈀䌀䐀䔀㠀䘀䌀㘀㘀㜀㐀㘀䔀㌀䔀䈀㔀䐀䌀䄀㤀䔀䄀㌀䔀㠀㄀㌀㘀㄀䌀㐀䌀㜀䌀䈀㐀䄀㤀䌀㐀㜀㜀㔀䈀䘀㄀䐀䘀㔀䌀㌀㐀㜀䄀䄀㌀䐀䄀㠀　䘀㔀䔀㜀䔀䈀㄀䈀㠀㐀䐀㠀㠀䄀㌀䌀㔀䈀㠀䔀㈀㄀㄀㘀㈀㌀䘀㠀䐀㄀㈀㐀䔀㤀㐀㄀㐀㄀䐀㄀㜀㄀㘀㘀䌀㈀㜀㌀㄀䌀䔀㠀㜀㤀㄀䘀䄀䄀　㄀　㔀䘀㜀㠀㈀䌀㌀䔀䄀㄀䔀䐀㄀㘀㘀㈀䈀䄀　䘀㈀㌀㤀㈀㄀䘀㌀㤀䔀㐀䄀㤀㤀䈀㐀　㌀䄀㐀㐀㔀䈀㔀㠀䄀䈀䐀㜀㤀㠀㌀　㠀㌀䈀㜀䈀㈀䌀㠀㐀㔀㌀䐀㤀㌀㜀㄀㄀䔀㤀䌀㔀㜀㄀㐀㌀㔀䘀㠀㔀䐀䌀㔀㠀䈀㌀㈀㠀䐀　㤀䈀䈀㄀㜀䔀䘀䌀䈀䘀䌀䈀䄀䌀䔀䘀㠀㌀䄀㘀䈀㌀㤀䔀　䄀㌀䘀　㄀䌀䌀䄀䌀㤀㠀㌀㔀䔀㜀㜀㈀㤀㤀㤀䌀䐀　㤀㤀䌀䘀䄀䐀㄀㄀䘀　㌀䔀㠀㜀㤀㘀㈀㤀㐀㔀㠀㈀䈀㜀䈀㌀䄀㠀㜀䐀䘀㤀㤀㠀䄀㘀㄀㜀䌀䌀㤀㈀䄀㌀䈀䈀䘀㌀㐀㜀㘀㤀䔀㠀㘀㌀䘀㔀㜀䈀㘀㠀㤀㔀䔀䌀㐀㘀㜀　㜀㤀䌀䈀　䈀䘀䌀㜀㔀　㜀㌀㤀䔀㔀㔀䘀䈀䔀䌀㔀䄀　䔀㔀㘀㜀㘀䐀㔀䈀㔀㜀㐀䄀䐀㐀䈀䈀　　㄀䌀䄀　㤀䌀䘀　䈀㤀䘀㘀䐀㠀㠀㜀㄀㌀㔀㄀㈀䌀䘀㔀䌀䈀䌀䈀㠀㜀㜀　㜀㌀㄀䐀䄀䈀㠀䐀䘀㤀㌀㔀㌀䐀䔀䘀㘀䐀䌀䄀䈀䄀䌀㠀䄀㠀䘀㄀䄀㈀㄀䄀㄀䔀㐀䈀㤀䔀㈀䔀䈀䈀㌀䔀㠀㈀䘀㜀䌀㄀㐀䘀㌀䔀㈀㌀䔀䔀㠀㄀㜀㈀㈀㄀　㠀䘀㠀㜀㠀䔀　䌀䔀　㐀䔀䘀㄀䐀䔀㌀㘀䌀䄀㐀㜀䘀䌀䄀　䄀　㤀㤀㄀㔀䔀䌀䄀㈀㠀㜀䘀㠀㄀㌀䈀㈀㤀㈀㘀㤀䘀㐀㔀㔀䈀䘀㈀　㘀㜀㄀㜀䔀㘀䔀㄀䄀㌀㠀㈀㤀㐀㈀㜀㜀㄀䈀䘀䔀㌀㌀㌀㄀㐀㔀㄀䌀䄀䄀䈀䄀䐀䐀䄀㠀㤀㤀䄀㜀㄀㘀㌀䐀䐀㐀䈀䌀㐀䘀䌀㘀䌀㘀䐀㌀㐀㔀䌀䔀䈀　㤀䌀㔀㘀䈀䔀㈀㠀㈀　䘀㘀㌀䐀㄀㄀䌀㘀㘀㈀㐀㜀䔀䐀㐀㌀䔀䐀㔀䄀䄀㄀䈀䘀䄀䄀㠀㠀㐀䄀㘀㘀　㠀㐀㜀㠀䄀䘀㐀㈀䌀　㜀㤀䌀㌀㤀䄀　㠀㔀䈀㈀㈀㜀㠀䔀䘀㐀䄀䈀㐀㔀㠀䌀㤀㈀㘀㐀㐀㘀䄀䐀䔀䌀䘀㄀䔀㜀㘀㠀㔀㜀䈀　㘀㤀㜀䈀䐀　㘀㐀㜀㤀䘀㠀㠀㠀㌀䌀䈀㠀㤀㔀䈀䘀㌀㠀䐀䐀　䌀㜀䔀䈀㐀㤀䈀㐀㄀䄀㌀䔀䈀䈀　㤀　㠀㜀䈀䌀䐀㠀䄀㜀㔀㔀䘀㘀䔀㄀䘀㄀㐀䄀䐀䘀㈀䈀䐀䘀㜀㐀㈀䄀䄀䈀㤀䄀㄀䈀㠀䔀㜀㐀㐀㄀㌀䘀㈀㄀㤀㔀䔀䐀䘀䈀䌀㄀㔀䘀㠀㠀㐀䈀㔀䘀㠀㐀㠀㄀䔀㄀㐀䘀㐀䔀䔀㐀㐀㤀䔀㈀㌀䌀㈀㄀䔀㈀㔀䔀㘀㈀　㜀䌀㔀䔀㌀㔀㈀㔀䔀㠀㔀㤀䈀㐀㘀㌀䐀䔀䄀䔀䌀㈀㐀㈀䌀䔀䌀㐀䄀䘀㄀　䌀㈀䈀䌀䐀䐀㠀䐀㜀䌀㠀䄀㤀㘀䔀㈀㈀㘀㈀䈀䈀㤀䌀　䐀䄀㜀㠀䘀㘀㄀䘀䄀　㠀䈀䈀㠀㠀㐀䐀䌀䌀㠀㌀䈀㤀㔀㤀䈀㔀䘀㠀㠀䘀㔀㔀䔀䌀㄀㔀㜀㌀䐀㐀㈀䄀䔀㄀䔀㐀㐀㔀䄀㄀㌀㜀㜀㔀㘀㌀䘀䔀䔀㠀䄀㔀㄀䈀㐀㐀䐀㠀㄀䌀㘀䘀㜀䐀㘀㈀䐀䐀㐀㐀㜀㔀㘀㘀㜀　㌀䄀　䔀䐀㤀㈀　㐀㄀㤀㜀㤀㄀㌀㐀䔀㄀㠀㠀㤀䘀䔀㜀　䌀㔀䘀㠀䌀㠀䌀䄀䄀㤀㐀㠀㄀䌀㜀䐀䔀㤀䔀㠀䔀㘀㔀䌀㄀㌀䐀䐀㐀㐀䐀㤀䄀䘀㤀䐀㄀䐀䌀　㔀㌀㠀㔀㜀䘀　䐀䐀䘀㈀㈀㔀䐀㈀䈀㤀㤀䐀䄀㠀䄀䐀㜀䄀䌀䔀䌀㐀㐀䄀㈀　䔀㤀䐀㐀㐀㌀䌀䐀䐀䐀㄀㔀㌀㤀䌀䐀㠀䘀㘀㈀㔀㔀㠀㐀㠀㄀㠀䌀䘀㘀䘀㜀䌀㈀䔀㌀　㤀䐀䈀　䌀㌀䘀㈀㔀㐀㐀䘀㈀　㈀䐀㌀䔀㘀㄀䄀㜀㤀䄀㠀䐀䔀䈀㌀㈀㌀㄀㤀㘀䘀　㌀䄀䄀䌀㄀　㌀㐀㄀䔀㐀㔀㈀䘀　㤀䌀㐀㘀㤀㄀　䘀䐀㜀䄀䈀㔀㈀䐀㔀䐀䈀㤀㔀㐀㄀㌀㜀㜀㜀㠀㤀䔀䌀䈀䌀㐀㤀䐀㘀㘀䈀㔀㐀䐀䄀䘀㐀㠀㘀㈀　䔀䔀㔀㌀㠀䘀㌀㘀㜀䔀䄀㔀㄀䐀䌀　䐀㘀㘀㌀㄀䔀㌀䔀㈀㈀㔀䔀㌀㐀䈀䄀　䌀　㠀䈀㈀㔀㔀䐀㜀㌀㐀㔀㈀䔀㌀㜀䌀㈀　㠀㐀䘀䌀㈀䐀䔀㄀㄀䈀䈀㐀䌀㌀䌀䔀㘀㈀㌀䈀䘀㄀㜀㌀㤀㄀　㜀㜀䈀䌀䔀㘀㔀㔀㔀㄀䐀䌀　䐀㄀㠀㐀㌀㄀㠀㜀㄀㈀䔀㤀䐀㤀䈀　㜀㜀㄀㠀䘀㄀　㜀㜀㤀㤀䌀㐀䘀㌀㤀䐀䈀㠀㐀䘀㔀䌀㈀䄀䄀㘀䄀䌀㤀䔀㄀㔀䌀㔀㔀㠀䌀㄀䔀䈀㘀䄀㐀㈀䔀　䘀䈀䐀㈀㜀䈀䄀䔀䘀䈀㌀䐀㌀㐀㄀䄀㠀㤀㜀㌀㄀䘀㐀㔀㈀䈀　䐀㈀㈀㜀㘀䐀䔀㠀䈀㈀䔀㌀䔀㌀㤀䘀䘀䈀㤀㄀㘀㈀　䔀䔀㘀䘀㌀䐀䄀㐀　䈀䔀䘀　䔀㤀㈀㘀䔀㘀㠀㘀䐀㠀㌀䐀䐀㜀㈀㄀㠀㜀䈀㜀䄀䄀㄀㠀䘀㠀㌀㈀㠀㌀䄀　䌀㜀㜀䈀㘀㐀㈀䄀䈀㄀㌀㜀䄀㌀䈀䄀㄀䌀㜀　㄀㈀㌀㐀㘀㠀㐀䘀䈀　䔀䐀㐀䐀㐀㌀㘀䐀䌀㠀㜀㜀䄀㘀　䐀䌀㄀㠀䔀䔀㜀㄀㌀䌀㠀䔀㘀㄀㈀㠀　㜀䄀　䈀䐀㄀䐀㘀㌀㔀䌀㌀㜀䔀㄀䈀　㐀䐀㔀䈀㔀䈀㘀　䘀䌀　　䔀　䄀㈀㜀㌀䈀䈀䌀㠀䐀㔀䈀㠀㐀㘀㄀㜀㘀　㄀䈀䌀㄀㤀㄀䌀㌀㠀㠀䈀䈀㄀䘀㜀䄀䘀䈀䔀　䈀㌀㐀䈀㄀㠀㐀㜀㘀㜀㜀㐀㐀　䌀䘀㄀㠀䈀㐀㘀㤀㜀䐀㄀㌀㐀㘀㐀㄀㜀䔀䈀䐀　㄀㤀㠀䌀㔀㤀䘀㌀㐀㜀䄀㠀㔀㌀䐀㤀㄀䄀㜀㜀㐀㄀㐀䘀䄀䈀㤀㌀㠀㠀㜀䄀䈀䄀㤀䔀䄀䌀㔀㄀㔀㐀㔀䌀䄀䘀䄀䄀㄀㌀㔀　䌀䘀㠀㜀䈀㠀㐀䈀䈀䔀䐀㠀　䈀䈀㄀㜀䘀㄀㔀㄀䘀䄀䔀㤀䘀䄀䐀䐀㔀㠀㄀䘀㠀㠀䐀㌀䐀㤀㈀䐀㔀　䐀䄀㠀䔀㌀㈀䄀㈀㤀㠀㈀㤀䌀䔀　䔀䄀　䄀㠀　䘀㔀䈀䈀㐀㜀㜀　䌀㌀䔀㠀㜀㘀　䐀䌀　㠀䄀䔀䐀䘀㠀䔀㌀䌀䘀㌀䐀㐀　䔀㈀　　䘀䐀䐀㜀　㤀䘀䔀㜀䄀㔀　䈀㈀㤀䄀　㈀䈀䈀䈀　㐀㔀䔀䘀㤀㜀㄀㔀㐀㌀䔀㔀䈀㠀㔀㌀䈀㔀㐀㐀㜀㤀㐀䈀䔀㌀䔀㠀　㄀㔀䄀䔀䐀䄀㔀㄀　㘀㌀䐀㐀㠀䌀䐀㠀䄀䘀䌀㌀䄀䔀　㜀㌀　㠀㈀㠀䄀㜀䘀㠀㌀㜀䌀㄀䐀䐀㔀㄀䐀䌀㈀㄀　㘀㘀㄀㘀㘀㈀㜀㜀㈀㌀䄀㠀㈀䐀㈀䔀䈀㄀㈀㘀㐀㐀㘀䈀㤀䔀䐀䌀㌀䐀㘀　䄀㔀㜀䈀䌀䄀㘀㌀䄀㤀　㄀䈀㈀䄀㔀㔀㈀䄀㠀㌀㐀䔀䄀㠀䘀㜀䌀㌀䌀䘀䄀㘀䈀㠀䔀䌀㠀㘀䈀㄀䔀㐀㘀㤀㄀㤀㐀䔀䌀　䈀㘀㔀䄀㜀㘀䐀䈀䘀　䘀䔀䌀䄀㈀㠀㤀䔀䈀䘀㜀㘀䄀㄀䔀䌀㐀　䌀㤀　䐀㘀㈀㠀䈀䐀㜀㐀㘀　㜀䈀㘀㐀㘀㔀㄀㔀㜀䘀㐀䄀䔀㔀㌀䐀　䔀㔀㌀　䘀㈀䈀㄀㜀㘀䐀㔀㘀䐀㘀㠀㠀㤀㔀䐀㌀㠀䄀䄀㄀䐀㌀㤀㄀䔀㠀㤀㔀䈀㐀㠀㌀㜀㔀䄀㈀䘀㐀䘀䈀䐀㘀㠀㤀䐀䘀䌀㄀䄀㠀㌀　㤀㤀㐀䘀　䔀䈀㔀㄀䐀䐀㈀㘀䐀㈀㈀㈀㔀䄀㌀㔀㜀㜀㄀㤀㄀䘀䔀㄀䈀㄀㠀㠀䘀㜀䌀㜀　㐀㐀䐀㔀䘀㈀䌀㄀㜀㈀䄀䘀㔀㜀㘀㤀㐀　㤀䄀㔀㘀䈀㈀㐀䈀䔀䘀㈀㜀䈀㘀㄀　㘀䐀䘀䘀䌀㌀㈀㔀㜀㔀䐀㔀㤀㔀䐀䌀㜀䘀㔀䘀䈀㌀䐀㤀㄀㔀　㌀㐀㌀㐀㄀㤀䔀㌀㌀䄀㐀㈀㤀㄀㜀　㈀㠀䔀㈀㠀䔀䘀㤀㐀㌀㐀㄀㄀㜀䐀㜀㄀䔀　㠀㜀　䌀㌀䘀䔀䄀㤀䔀㤀㔀㠀㤀㐀㄀䈀䘀㘀㐀㔀㜀䐀㤀㄀㔀䐀㌀䔀䄀䘀㠀䈀䐀㌀䔀㤀㜀䄀㜀䌀㄀㌀㄀㄀䐀䘀㄀䌀㌀㜀㄀㠀䘀㘀　㔀㐀㜀䘀㜀㠀㐀㜀䐀㔀䌀㤀䘀㜀䈀㐀䘀㘀㠀㌀㘀䌀㘀　㔀㐀㈀㔀㌀㜀䔀　䘀䔀㜀　㤀㠀㔀䘀㜀㐀㐀䔀㠀㄀䌀㠀䔀䔀㈀䄀䔀䄀䌀䔀㄀䔀䌀䘀㐀䄀㌀䌀㄀䌀㤀　䐀䈀䈀　㌀䔀㄀㘀㤀䄀䔀䌀㜀㄀䐀䘀㐀㠀㐀㌀䌀㌀䈀䄀㄀㜀㜀㜀㌀㘀㠀㌀䄀䌀㠀䘀㔀䌀䌀㜀䄀䄀㌀㜀㐀䄀㔀䐀㄀㘀㤀㜀䘀㤀㐀　䈀㈀㐀䔀㈀㤀㤀　䌀㐀㔀䈀㠀㠀䐀䘀䔀㠀㤀㠀　䐀䘀䔀㌀　䔀㜀　䌀㈀㠀䄀㌀　㈀㘀　㐀㠀䈀㜀㈀䐀㄀䐀　㘀䌀䌀㐀䔀㌀䔀㌀㈀㠀䌀㄀㜀㌀䔀䔀㠀㠀㠀䘀㤀䈀　䐀㜀䄀㜀䐀㄀㄀㈀䔀㌀㘀䔀䐀䔀㌀䘀䄀㜀䈀㐀㜀䈀㤀㌀䔀䈀䘀䌀㜀㄀㜀㠀䌀䘀䄀䐀㘀㜀㄀㔀㄀㤀䘀㠀䘀䘀㌀䌀䐀㐀䌀䘀㠀䈀䌀㔀䔀㤀䘀㤀㜀　䈀䘀　䈀䐀㤀䌀䐀㜀㄀㜀䘀㔀㐀㐀䘀䌀㘀㄀䌀䄀㈀　䄀䔀䔀㄀䘀㔀䌀㔀䐀䌀䘀䔀㐀　䐀㐀䐀㔀䔀㄀　䔀䘀㠀㈀㜀㈀㈀㜀䔀䈀䄀㠀㘀㤀䈀㤀䈀　㤀　㄀㐀㈀㔀㠀䌀㜀㄀䐀㠀䌀　㈀㤀㘀㠀㠀㜀䘀㤀㈀㤀䈀㜀㐀䌀䘀䘀㠀　㌀㜀䈀䈀㠀㌀㤀㜀䘀㘀䌀㤀䄀㠀䈀䌀䔀㐀䔀䌀㐀　㈀㌀䔀㈀䔀㄀㈀㠀㈀㜀㔀䘀䐀䌀㄀㈀㤀㈀　　䄀㠀㘀䌀㘀㜀䌀㌀㌀㌀　㌀㌀䔀㠀　㔀　㄀㐀㐀㠀㈀䈀䔀㐀㠀䐀㐀䌀㔀䘀㔀䌀㘀䈀㠀㐀㤀㤀䘀㌀䈀㌀㘀㄀䈀䘀㄀㐀㔀䈀㤀㠀㠀　䘀䈀㠀䘀　䌀㜀㘀　　䐀㐀䘀䐀㐀䌀㤀㐀㔀㘀㜀䐀䌀㈀　㔀㤀㠀䘀㌀䈀　䌀㜀㔀㌀䄀㘀㔀㘀㘀㌀㘀㄀　䘀㌀㠀㜀　㄀㘀㔀㜀　㜀㘀䌀㘀㄀㜀㠀㄀㤀㄀㔀㄀㔀䘀　䌀㄀㄀㐀㐀䈀㤀㜀　㈀㐀　㐀䘀䄀䄀　䐀㐀　㈀䘀㘀㐀　㈀　㌀㐀䌀㜀㐀䐀㠀㌀㜀　㌀㤀䘀䘀㐀䌀䐀㠀䔀䐀㠀㤀㜀㄀䘀䔀㈀　㄀㜀䄀㌀䈀㈀　㘀䌀䄀㘀　　䄀䘀　㄀㠀㠀㐀䈀㔀㐀㈀㤀㌀䐀䌀㠀㐀㜀䘀　䄀㄀㄀䘀㌀　䈀䌀㔀㜀䌀䈀䈀㘀㌀㌀　䐀㤀䈀䘀䐀㌀䔀㜀䔀㈀　㐀㌀㘀㄀䐀㔀㄀㘀䔀䌀㘀㄀䐀䐀䌀䌀㌀㜀㤀㘀㘀㐀㄀䄀㤀㌀䌀䐀䐀㔀㐀㜀䌀㐀㄀㄀　㜀㈀䌀㐀　䐀䈀䌀㐀㐀䘀䌀㔀㄀㈀䄀㔀㄀㤀䘀㜀䈀㠀㘀㤀䈀　䐀䐀㌀㘀㔀　　䔀㌀㄀㐀䘀㐀㐀㐀䘀䐀㌀㜀䌀㌀䘀　㔀㠀　㠀㄀㠀䐀䄀㐀㔀㔀㤀㜀㈀㜀㌀䄀　㠀　㄀㤀㜀䔀㈀䐀㘀䄀㌀䔀㤀䔀㘀㤀㜀㜀　㐀　㠀䘀㌀㐀㔀㔀䌀㜀㄀㤀㌀㘀䄀㄀㘀䐀㜀䔀㐀㌀㘀㠀㘀　㈀䐀䔀䄀䐀㈀　㄀䄀㈀䄀䘀䄀㜀䄀㔀㜀㜀㔀㠀㌀䐀　㔀䘀㐀䔀䘀䈀㔀㜀㠀㤀㌀䘀㄀㘀㜀㄀㜀䈀㜀䐀㌀㌀䔀䔀䌀㠀㐀䔀䌀䄀　䈀䄀䄀㌀㔀㘀䔀㤀䘀㔀㌀㈀　䘀㔀㌀　䔀䐀䘀㘀㠀㐀㐀　　㐀㐀㄀䈀䘀㈀䘀䔀䄀䔀䄀㤀䈀䘀㔀㄀㐀䈀䈀䄀㌀㈀㔀䄀　㐀㤀㘀䔀㔀㌀㈀㐀㄀㐀㠀䄀㐀䐀䌀㜀㘀㈀䔀㄀㘀㠀㜀㌀㐀㔀㐀㔀䌀　䔀㜀㠀䔀　㐀㔀䐀㌀㌀䔀㈀㔀㐀㄀㜀䌀䌀䄀㠀䘀　　㔀䌀䈀㘀㜀䄀㌀㄀㔀䈀㄀㌀䐀䔀㄀䐀　㔀㐀䌀㐀㄀䐀㤀䔀䐀䔀㔀㌀㌀㄀㄀㤀　䄀䌀㘀䌀䄀　㌀䘀䔀㘀㠀䄀䌀䌀㈀䌀㌀㔀㌀㐀　㘀㜀䐀㌀䌀㤀䈀㌀㄀䔀㜀㜀㤀㐀䐀䔀㠀䌀䐀㈀㜀㤀㈀䈀䔀䈀㐀㜀㘀㜀䌀㌀䔀㄀㠀　㄀䘀䔀䌀㠀㤀䐀䔀㜀㌀㜀㄀䐀䈀㐀㌀䈀㌀㈀　䌀㠀㌀䐀䐀䌀㈀䌀㔀㠀㔀㘀㠀䌀䐀䄀㌀　䔀䐀䄀㘀䘀㈀䘀㄀㠀　䌀㘀㘀㌀㌀䔀㈀㜀䔀㜀䘀㔀㐀㜀䌀㌀㘀　䐀㜀䈀䌀㤀䔀䌀㌀㄀㄀㌀䘀䐀䌀䘀㔀䌀　㄀　㄀䘀㜀䌀䈀䄀㐀㄀䈀䈀䈀䔀䌀㠀㠀䌀㌀䘀㄀㘀　㌀㜀㐀㄀㌀㜀䈀㤀　㔀㄀䐀㄀㐀䄀㐀㄀㠀㈀㘀　㐀䔀䄀㄀㠀㠀㔀㠀㤀㤀䄀㐀㈀䈀㌀㠀㈀䘀㄀㘀　㜀㤀㠀㠀㜀㜀㜀䐀㘀㄀㌀㜀㌀㔀㈀㈀䈀䐀䐀　㔀㜀㌀㤀䐀㜀㐀㠀䔀䈀㠀　　䄀㠀㘀䐀㘀䔀䐀䄀䔀䘀㤀㤀㐀䔀䄀　㘀䌀　䔀㄀㘀䘀㔀　㜀㌀䐀㠀㄀㔀㤀㈀䘀㜀㔀㘀㔀㤀㄀䘀䄀㔀　㄀　　䌀䄀㠀䐀㠀㔀䘀䌀㈀㜀䈀㐀䈀䌀㈀㜀　䌀　㜀　㌀㤀㘀䄀㜀㤀䔀㜀　㈀㄀㜀　　㜀㌀㠀㠀䌀㘀㈀㈀㜀䔀　䘀㘀䘀䄀㜀䔀㈀　㈀㘀㠀㤀䔀㈀㈀䄀䔀㜀㔀㈀㠀㠀㄀㘀㈀㌀䘀䄀䌀　㈀䄀䔀㐀㈀㘀㌀㐀䌀㠀㐀㌀䄀㤀㐀㌀㜀㌀㐀㄀㜀　䌀㠀㐀䐀䌀䐀䔀䐀㔀䐀㈀㜀㌀䘀㌀䄀㈀　㈀㠀㌀　㌀㜀㘀㐀　䄀㌀䈀㐀㌀㈀㄀䈀　䈀㐀㌀㜀　䘀　䘀䄀㈀㠀㤀䈀㜀㐀䌀䌀䈀㐀㈀䘀㄀　㔀䔀㈀䐀㔀㄀　㠀㔀㠀㘀　䐀㈀䘀䌀㜀　䄀䄀㄀　㌀䘀䈀䄀䌀䘀䈀㐀㜀䘀䌀㈀　䘀㌀㐀䈀䈀㜀㐀䈀䄀㔀㄀㈀　㜀㤀㌀㈀㐀㐀㤀䐀㠀㠀㤀㈀㈀䌀㠀㠀䐀䄀䌀㤀㐀䐀䈀㠀䄀㌀㐀　㘀䈀㈀㠀㄀㠀　䘀㈀　䄀㈀㄀㈀㠀䄀　㔀㔀䈀䘀　　㔀㔀䐀㜀㌀䘀䔀㤀䐀䘀䔀䈀　䌀䘀䔀䈀㜀㜀䈀䈀㐀㈀㤀㄀䄀㤀　䄀䐀䄀䄀䄀㠀　㤀㄀㌀㜀　㠀䄀㄀䄀㘀　㐀䐀㐀㠀䈀㘀㘀㠀㄀䄀䔀㐀㄀䐀㄀㔀䌀㌀䄀㌀㘀㔀䔀㈀䄀䄀㘀㜀䐀㔀䘀㄀㠀䐀㄀㐀㜀㐀㜀㌀䌀㐀䘀䌀㔀㜀䌀㘀㌀　㠀㜀㠀䄀㈀䄀㈀　㄀㄀㜀　䈀㐀　䈀䌀㐀㌀㜀㄀䄀䘀㠀䔀㤀䔀㔀㐀㤀㐀䄀䈀䔀㈀䄀㜀㐀䔀㌀㜀㐀㐀㤀㔀㄀㌀㐀㔀䐀䘀　㈀䈀䔀㐀㄀　㐀㌀䔀㤀㠀　㔀㐀㘀　䔀㤀㈀䘀㄀㌀䄀䈀㤀䌀㤀　㠀䌀㐀㐀㈀䔀䄀㌀㔀䔀　㤀䘀㔀㌀䌀　㌀㌀㤀㔀㌀㄀䌀㠀　䄀㌀㐀　䄀䐀㌀䈀㤀䐀　　㐀䌀㐀䌀　㈀　㄀㔀㠀䄀㄀䈀䔀㌀䈀㜀㘀㠀㘀㜀㔀㜀䌀䔀　㔀㈀㔀䌀㠀㄀䐀㠀䐀㠀㘀㌀䌀㜀䔀㌀㜀䈀㔀　䘀㘀䘀䌀㠀　㌀㤀㄀㈀䌀㄀㠀㜀㌀䘀㌀㘀㄀䐀㘀㄀䘀　　䌀㤀㄀㐀㔀㌀㠀䌀䄀䈀䈀㠀䔀㔀㐀㘀㠀㐀　　䘀䔀㜀䌀　㤀㔀㈀䔀㐀䌀㔀㈀　䌀㤀䔀䈀䔀㄀㤀㈀䔀㌀㌀　䘀䌀䐀㈀䔀䔀　㐀㜀㌀㜀㌀　䄀䔀㘀㐀㘀䄀㤀㄀㜀㘀䘀　㜀䘀䌀㘀　䄀㜀䘀䌀䐀䄀㄀㐀㔀㜀㠀㐀䐀䘀䌀㈀㘀　　㔀㜀㐀㈀㈀䌀䄀䄀㄀㤀㌀㠀㘀㜀㠀䘀䘀㈀㐀䘀䐀䘀㐀䄀㄀㐀　䌀㈀䈀㌀䌀　㔀　㜀㐀㄀䄀㄀䐀㄀㘀㔀　㐀䘀䌀䌀㔀㈀䔀㜀㠀䐀䐀㈀㐀䔀䌀㄀㐀䄀㠀　䌀㌀　䄀㘀　㌀䌀䔀䄀䄀㌀㤀㄀㌀䈀㄀㐀䘀㘀䘀㌀㠀㄀䘀㘀㌀䐀㐀㤀䔀㔀㄀䐀㄀䔀㤀㘀䔀㐀㤀䐀㐀㘀㤀　㌀㐀㄀㈀㌀㄀㌀㜀㄀䐀㤀䄀䈀㤀　䌀㠀䘀䐀㐀　䐀㘀㘀㈀㌀㐀㄀㈀　䌀㘀㠀㜀　㠀䈀䌀㈀㄀　㠀䄀䐀㐀㠀䌀䈀㠀䐀㌀䔀㐀䘀㐀䌀㌀㐀䈀　㄀㔀㌀䈀　㘀䔀㌀䘀㜀䘀䄀䐀㄀䘀㄀㤀䄀㜀㤀㄀㌀㜀㜀㐀䘀㠀㐀㜀㘀䘀㤀㄀㈀䘀㘀䔀㄀㘀　㈀㠀㐀㘀㔀䐀㠀㘀㠀䘀䘀㄀㜀䔀䌀㄀㠀䐀㜀㤀㐀䈀㄀㄀㘀䔀㐀㔀䄀㜀䔀㤀㌀㘀㌀㄀䔀㄀㔀䈀䔀㔀䈀㤀䔀䔀　㐀㐀㘀㈀㌀㜀㐀䘀㤀㘀㠀　䌀㠀䌀䌀㤀　䘀㈀䄀㠀䄀㘀䘀㐀㠀㤀㜀㄀㌀　　䘀㔀䈀㜀㤀䔀㈀䔀㘀䔀㘀㐀䈀　㜀䈀㜀㐀㔀䈀䘀䈀㜀　㄀㜀䐀㜀㌀䈀䌀㈀　䐀　䐀　䘀㘀䔀䔀䐀䔀䐀䔀䌀䔀䄀䔀㐀㄀䌀䔀䐀㈀㌀䐀　㜀㘀㌀㠀䈀㤀㘀䐀䈀䐀䄀㌀㌀䐀㠀㌀㘀㌀䄀㌀㄀䌀㠀䌀㄀㠀㘀䔀㄀䘀㄀㠀䐀䐀䌀䔀　䐀㜀㘀㜀㌀䔀䐀　㌀䐀䈀䈀㤀㈀䐀䈀䐀　㌀㤀䐀㐀䔀䄀䔀䔀䈀䔀䄀䄀㄀䔀㄀䄀䔀㤀㄀㄀㄀㘀䔀㜀　㤀㠀䔀䈀䔀䐀㄀䘀䔀䄀䔀䈀䔀䐀㠀㈀䈀䔀䐀䔀㠀㄀㠀䔀䈀䔀䈀㄀䌀䔀䐀䔀㠀㄀㐀䐀䐀䌀㐀㘀㤀㠀㌀㜀㌀　　㠀䐀䈀㜀䐀㈀䘀㜀㠀㈀㈀㈀　㄀䐀㄀䐀䔀㐀䔀㠀㠀㈀　㈀䄀䄀䐀䔀䄀䔀㄀㄀㠀䄀䄀䌀䈀䘀㘀䈀䈀㠀䄀㌀　㜀㤀䄀䔀䐀㄀䈀㜀䈀䘀䈀㜀䄀㐀㜀䈀㜀㌀䈀䈀㤀䔀䔀䐀䔀䐀㄀　㄀㠀䄀䈀㌀㄀䈀㤀　䈀㘀㜀㌀㐀㌀䔀䐀䌀㌀䄀㌀䈀䐀㄀䐀㘀㌀㜀䐀䔀䐀䌀㌀䐀䌀䐀　䐀㠀䘀　䐀　䔀　㐀㠀㄀㜀㈀䌀䐀䘀　㤀㘀㠀　㜀㜀䄀　㜀䈀䄀㠀㜀㘀㄀㤀㔀䄀䔀䘀䔀䄀䔀㠀㄀㔀㄀䐀㠀㠀㤀　㜀䄀　㠀䘀䔀䈀䐀䄀　䄀　䐀㘀䔀䄀㐀䄀㜀䈀䐀䄀䘀　䘀㤀㜀㘀䄀㄀䘀　㌀䔀䄀㠀㜀㤀㄀䈀䔀㠀䔀䌀㄀䄀㄀䔀䐀䌀㌀䈀䐀㤀䈀㜀䄀㐀㘀䈀㤀㤀䔀䌀㄀䈀䔀䌀䔀㈀䔀䔀㠀䐀䌀䐀㠀　㔀㤀㐀䈀㔀㘀䘀䔀䌀䔀䈀䔀㈀㤀㜀　㈀䄀㘀㌀䄀䘀䄀䐀䄀㜀䈀䘀䈀㤀䐀㔀䌀㘀㜀㜀䈀㜀䘀䘀䈀䄀㘀㈀䔀㤀䌀㌀㔀　㠀㔀㠀㠀㘀㜀㄀㤀㠀㐀　䐀䐀䈀㘀㤀䔀㈀䔀䔀䌀㠀㈀䘀㔀䐀䄀䔀㄀㔀䘀䌀㜀㘀㠀䔀䘀䔀　　　㘀㔀䄀㌀㘀㌀㜀　㘀　㜀㐀㄀㠀㤀䄀㐀䔀䔀　㜀㈀㜀㠀㌀㐀㌀䔀㜀㔀㔀䈀䔀䘀㐀㠀㤀㜀㤀㌀㘀䈀㄀䘀䔀䔀㄀䐀䄀㄀　㈀䔀㤀㄀䔀㄀䔀　㐀䘀㐀㔀㐀㤀䌀㌀　㘀㌀㄀　㤀㄀䌀　䈀䌀㠀㄀㈀䔀㄀䔀　䈀㄀㔀㌀㔀䈀㜀㐀䄀㈀㌀㌀　㠀㐀䈀㘀䌀㜀㐀㘀䈀䄀㔀㘀㘀㠀䔀㤀䔀䌀㘀䄀䔀䘀　㌀㔀䌀㈀㌀㜀㐀㜀㈀䔀㈀㘀　㤀㜀㈀䔀䘀㤀䈀䔀㈀　䘀㤀䈀䔀䔀　㜀䐀䌀㠀㌀㘀䘀㤀䈀䔀䔀　㌀䘀䔀䔀㜀䐀　㄀䘀䘀䈀䔀㌀㠀䘀㤀䌀䔀䔀　䄀䘀䘀㌀㤀䐀　㄀䄀䘀䈀䐀䔀㐀㜀䈀㠀㌀䔀㐀㜀䈀㠀㌀䔀㐀㜀䈀㠀㌀䔀㐀㜀䈀㠀㌀䈀㔀䐀㄀㌀䌀䘀㤀䔀䔀㘀　䘀㔀䈀䈀　㌀㔀㄀㌀䄀䌀㤀䘀㜀　㜀䌀㤀䘀㜀　㜀䌀㤀䘀㜀　㜀㜀䘀㜀㄀䔀䘀　䘀䌀　㌀㜀㈀㔀䘀䌀䈀㜀　㈀㈀䔀㔀㠀䌀㤀㘀䐀䔀㐀㔀㈀㄀㜀㈀䈀䘀䌀䈀㘀㌀䘀㘀㄀㠀䄀䔀㄀㜀㌀㄀䌀䈀䘀㌀㔀㜀　䈀㤀㐀䈀㈀䄀䈀㤀㐀䈀䄀䈀㘀㔀㘀　　䌀䘀㌀䐀㄀㈀䈀㄀䐀䄀䘀䐀㌀䔀㄀䘀㠀㌀㜀䄀䘀㜀㐀䈀䌀䌀㄀㐀　䌀㜀䈀㌀㌀䐀㔀㜀㌀䄀䐀䔀㘀㠀䌀㐀䘀㄀䘀㜀㔀䘀䔀㤀䘀㠀㤀㐀㄀㐀㌀䄀㔀䔀䄀㈀䈀䌀䐀㈀䘀㄀䄀㤀䄀㤀㌀　㄀䔀㌀䔀　㤀䘀䐀䘀㘀㠀㌀㄀㐀䌀㜀㐀䈀䔀㄀䌀㜀㈀㐀㤀㐀㌀䄀㘀㈀㈀㔀㤀㤀㈀㐀㄀䈀䔀㈀㤀㠀㤀䐀䐀㐀㘀㈀㘀㐀㘀䈀㐀㔀㈀䘀䈀䐀㄀㘀㜀㐀㄀　㠀㘀㌀㠀䘀㔀㐀㄀㜀㈀　䐀䘀㤀㄀㠀䐀㤀㐀㄀䔀䔀㠀㈀䌀㠀䘀䐀䌀䘀㄀　㘀㔀㄀䘀㘀㐀㌀㈀䌀㤀䔀㌀䌀䌀　㄀䘀㈀㠀䌀㘀㐀㌀㌀㜀㤀㄀㄀䈀　䈀䔀　䔀㔀㠀㜀䔀䈀䐀　㘀䘀䘀䈀䘀䘀䔀㜀䘀䌀　㜀䘀㄀㈀䘀　䘀䘀㄀　䈀　䘀䔀㄀䌀䈀　䈀䌀䈀㔀㄀䄀㌀䘀䘀䔀㔀㜀㔀㐀㈀㈀䘀䔀㜀㐀䌀　㔀䘀　㐀䘀㠀㘀䈀　　㜀䘀㌀䈀䔀　㄀䘀　㐀䘀䌀䐀㜀　㌀䘀䔀㤀䐀㠀　䘀䘀㐀㌀㠀　䘀䘀㤀㌀㠀　䘀䘀㜀㌀㠀　䘀䘀䄀䈀㠀　䘀䘀㌀㄀䌀　䘀䘀㄀㐀䔀　㜀䘀㄀㄀䘀　䘀䘀㄀䌀䘀　䈀䘀㈀㌀䈀㤀㠀䈀㤀㈀䌀䈀䄀㠀㔀㘀䔀㌀㘀㜀㜀䘀㤀䔀㠀　㌀䘀　㌀䘀　㄀㜀　㌀䘀䔀　㘀䌀　䐀䘀　䐀䘀㠀䌀㜀　　䈀䘀㄀㜀䘀　㐀㜀　㄀䘀䘀　㄀䌀　䘀䘀　㔀䌀　䘀䘀㌀㠀䔀　㜀䘀㄀㘀㜀䄀㔀䘀　㄀䘀䌀䈀䘀　㘀䘀䌀㜀䘀㘀㐀　䔀㌀　㘀䄀䌀㤀㘀㘀䌀㘀　㈀䘀㠀䔀䐀㠀　䈀䘀㘀㈀㌀㔀㜀䔀㘀㤀㔀䄀　㈀䘀䔀㈀䌀䌀　㔀䘀　㘀䘀㠀䈀䈀　㄀䘀䘀㔀㘀䌀　㌀䘀　㤀䘀㠀㘀䘀　㄀䘀䌀㤀䘀　㈀䘀䌀㔀䘀　㔀䘀䌀㈀㜀　　䘀䘀㐀䘀　㄀䘀䘀䈀䈀䌀㐀䌀䈀䈀　㘀㐀㤀䄀㌀㄀㌀㄀㤀㤀㐀䌀㌀㤀䔀　㘀䘀　㔀䘀䌀㔀䈀　　䘀䘀㜀㔀㠀　䐀䘀䈀㜀㄀䄀䈀䘀㘀䌀㐀䘀　㈀䘀䔀㄀䌀䌀　䐀䘀　䌀䘀㠀䈀㜀　㄀䘀䔀㘀㤀䌀　䈀䘀　㜀䘀　㜀䘀　㘀䘀　㜀䘀　㤀䘀　㄀䘀　㜀䘀䌀䄀䘀　㄀䘀䔀㘀㔀䈀㈀㠀㌀䌀㤀　㈀䘀䌀㐀䔀䌀　䈀䘀㄀䔀䘀　㔀䘀　㌀䘀㠀　㌀㠀　䘀䘀㘀㘀䌀　㜀䘀　　䘀　㜀䘀㠀㘀䘀䄀㤀㤀㔀㈀㜀㄀㐀㄀䄀㤀䈀　㔀䄀㔀䈀　䄀㈀㜀䘀㜀㐀䐀㐀䔀㈀䄀㘀㔀㐀㐀㈀㤀　䘀㌀䘀䈀㔀　　䐀㜀㔀㌀㘀㄀䄀㔀㠀㈀㈀㠀㤀㔀㘀㜀㐀䘀㈀䔀䌀㄀㜀㔀䘀㈀㈀䌀䐀䔀㌀㤀䈀䈀䈀　　　䘀䘀㄀㘀㔀㘀㌀㔀㄀㘀㜀　䐀㠀䐀䔀㈀㜀㄀㜀㄀㘀㤀䔀㔀䈀㔀䄀䐀䄀䄀䈀㤀㐀㄀㈀䄀㔀㘀䌀㠀㄀䈀䘀䐀䔀㔀㘀䄀䄀㠀㠀㔀㈀㜀䐀㘀䌀䘀䔀㜀㔀㠀　㌀䘀䌀䌀䘀䘀㘀　䘀䔀䐀㔀䘀㤀䔀䘀　　䔀　䘀　䄀㔀㔀䘀䘀䌀䔀㈀䌀㔀㄀㜀㤀䘀㜀䈀㘀䔀㠀㤀㤀䘀䈀䈀㠀㐀䐀㜀㔀䔀䄀㔀㄀䌀㠀㠀㌀㤀㜀䈀䘀㈀䔀㐀䐀㤀䐀㌀㈀㜀㐀䘀㤀䔀㄀㐀㈀㤀㜀㤀㜀䈀䈀㜀䘀㔀䔀䔀㌀　䈀䐀㈀㌀㌀䘀㔀㜀䌀㤀㔀䘀㌀䌀　㈀㜀㄀　䔀㄀䐀㘀㘀䈀㔀䔀䔀㌀䔀　䐀䐀㜀㘀䔀䈀㤀㠀㐀䌀㠀䄀㔀㘀㜀㜀　㘀䐀㈀㔀䌀䈀㈀㠀䄀㔀㔀㠀㈀㌀　䈀　䈀㄀㈀　㤀䄀㌀㤀㐀䐀䐀㜀㜀䐀䘀㜀䐀㌀㠀䈀㌀䈀㄀㌀㄀㄀　　㠀㈀䌀㈀䘀㈀䐀㈀㤀䔀㔀㠀䌀㔀㈀䈀㄀䘀䈀㌀㠀㄀䐀㜀㈀㜀䌀㌀㜀㘀䐀　　䄀䈀㜀㠀　㄀㜀㜀㐀䌀㈀㈀䄀䈀㐀䌀　㈀䄀䈀㜀㐀㄀㠀㤀䐀䘀㌀䌀䄀䌀㤀㤀㌀㜀䈀䘀㄀㠀䔀䌀　䔀䄀㔀㤀䄀㔀㠀䄀㔀㄀㘀䄀㈀䔀㘀㘀㤀㔀㔀㄀䄀䄀㔀㘀㔀㠀㠀㔀䌀㘀　䄀䄀䈀䌀䌀㄀㔀䈀㄀㐀䄀䐀㜀䔀㌀䄀㤀㌀䄀䈀㤀㔀䈀㈀㔀㈀㜀㈀䄀㠀㔀㔀㘀䄀䈀䐀䐀㐀䈀㔀䈀㜀䈀䔀㔀㔀㈀㈀㈀㤀㜀䈀䐀㠀䐀㠀䈀䄀䈀㔀㠀㐀㘀䌀㔀䘀㌀㠀䄀䌀䌀䌀䄀㠀㠀㐀䄀　䔀䐀㈀㔀　䄀㤀㠀㠀㐀䄀㤀㔀　䐀㄀㘀㔀㈀　䘀䔀　　㄀䐀㠀㐀䘀㠀䔀䌀䐀㄀䘀㤀䈀㔀㜀㈀㤀㄀㠀㤀㔀䈀㈀㘀㔀　㈀㐀㜀㐀䘀䈀㐀䐀　㤀㘀㠀䄀㔀㜀㌀㄀䔀㠀㔀㠀㈀㔀㘀㜀㔀㐀㠀䄀㜀㌀　䈀㌀䌀䈀㌀䔀㜀㔀㘀䈀㔀㄀㘀㔀㐀㐀䄀㐀㘀䄀㔀㘀䔀㜀㔀㈀䘀㈀䌀㤀䌀㔀䄀㔀䌀䘀㐀䈀㐀䄀䄀㘀㐀㠀䌀㐀䄀䔀㐀㜀䐀䔀㄀䄀䌀㐀䄀䌀㌀䄀㠀㜀㐀㘀㜀䔀　㜀䄀䔀㜀䌀䌀䘀㜀䌀㘀㔀䘀　㘀㜀㠀㜀䄀䘀䌀㌀㤀　　㤀䌀䈀㈀䘀㠀䘀䄀䔀䘀㤀䔀㜀䘀䘀㤀㤀㤀㔀㌀㈀㜀㄀㘀䈀㄀䐀㔀㌀㈀䈀㤀㐀㠀䄀䘀䌀㤀㄀㘀㠀䄀㄀䌀　㔀㠀䔀㄀㈀䄀　䔀㠀㄀㐀㈀　㠀㄀㌀㌀䔀㄀㐀㘀㄀　　㄀㌀㈀㈀䄀㠀䄀䄀　㤀㈀䌀㜀䈀㈀㈀㠀䌀䌀㔀㌀䌀䈀㄀㤀䈀㔀㔀㈀㄀㐀䌀㈀䌀㤀䈀䐀　䄀㈀㤀䄀㌀㄀　䄀㐀䈀　䄀　㘀㘀㄀㤀䈀㔀㘀㠀㜀䄀㈀　　㜀䄀㤀㠀䌀㔀㄀㈀䈀䄀㠀㔀㤀䄀㠀䐀㔀㐀㐀䄀䐀䐀㘀㤀㈀㔀䌀㠀　㄀䄀　　䘀㜀䘀䌀㜀䔀　　㤀䌀䄀　　　㔀䌀㈀䐀䘀䈀㜀䔀㐀䄀䔀䈀㌀䘀䐀䐀䐀㜀䄀㈀㔀㘀㌀㈀㘀䄀䘀㔀䈀㤀䔀㔀㄀㌀㜀㐀䄀㄀㄀㌀䌀䈀䔀㜀㜀　䄀㔀㜀㌀䌀　䘀䘀㔀㤀䔀　䘀䘀㄀䌀㌀㘀㄀㔀㘀㈀㄀㌀䔀㘀䐀㈀䌀㄀䄀䐀䘀䈀㔀䘀㔀䈀㌀㠀㜀㔀㘀䄀䘀㄀䘀㔀䘀䐀䄀䐀㜀㠀㔀㜀㤀㐀　㜀　䌀䐀㘀㌀㈀㘀䄀䘀䐀㤀㤀䘀　䐀䈀㜀　䈀䐀䘀㐀　䐀　䄀䄀㜀㈀䄀㐀䘀㔀㔀㈀䔀　㄀䄀㠀㔀㔀㠀䌀㔀䄀䘀㌀䐀䄀䘀䌀㌀䈀　　㈀䘀　㄀㌀䌀　䈀㜀　　㈀㘀　㜀㄀㄀䔀㘀䘀䈀㐀㠀㈀㠀䔀㔀䔀㤀䘀㌀䘀㈀㘀䌀　䔀䈀䘀㌀䘀䈀䌀㄀䄀㜀㈀㤀㤀㄀䄀䄀㜀㌀㘀　䄀䘀䔀㜀㐀　㔀䄀㐀䈀㐀䈀㐀㠀䐀㔀䔀䔀㜀㌀䌀㜀㄀㜀䌀䔀䔀䔀䐀㔀㄀䔀㌀㠀䈀㜀㔀䈀䄀䐀㈀㐀㘀䄀䔀㔀㠀㔀　䈀㔀㘀䔀㄀㐀㈀䄀䄀　㐀㔀㤀䈀䐀䈀㄀䄀䘀㐀㔀䄀㌀㘀　㌀㐀㈀䄀㌀㤀㔀䌀䈀䈀㘀　䘀䔀䐀㈀䘀㈀㈀䔀㠀㔀㠀䌀㔀㄀䌀㠀㐀䘀㈀㌀䘀䐀　䈀㄀䄀㤀㘀䐀㄀㠀㠀䐀㈀㄀㈀䌀㐀䄀㔀㐀㄀㜀㄀㘀㤀㔀㐀㐀㐀䄀㌀㄀㘀䔀䐀䄀㘀㄀䔀䔀䐀㠀㘀䈀㜀㤀䌀㘀㌀䘀㌀㄀䄀㈀㔀䔀　䄀㌀㐀䌀䐀㌀䔀䈀䈀㔀䘀䐀䄀䐀㄀䄀㄀㔀䄀㌀䐀㄀㈀䌀㤀㌀　䈀㘀㐀㌀㄀㐀䔀䘀㐀㌀㄀䔀　䔀㔀　㈀　㐀㄀䔀䈀䄀䈀㐀㜀㈀㜀㤀㤀㤀　䄀　㌀䌀㘀㈀䔀㈀䘀㘀䈀䔀㐀䐀　䌀㘀㌀䄀㄀㘀　䈀㌀㠀㜀㔀　㌀䐀㤀㌀䘀㜀䘀㘀㘀㄀䔀㔀㘀㈀㜀䄀㜀䔀㘀㐀䘀䌀㄀䐀㐀䐀㜀㐀　㌀㄀㄀䈀　㠀㄀䐀㄀䄀㤀㜀㈀㔀　䌀䐀㜀䔀㠀㄀㠀㠀䐀䔀㄀㐀䌀䔀㌀㤀㤀䌀㘀䈀㜀㜀㜀䈀䘀㠀䐀㜀䔀䘀䔀䔀䌀䐀䐀䌀䘀䐀䔀㜀䐀䔀䄀䔀䔀㄀㌀䐀㘀㄀㌀㔀㘀䌀㐀䈀㈀㈀㈀䌀䔀䔀䘀㈀㐀　㠀㔀㐀䄀㌀㘀㘀㌀㐀㔀䄀䈀䄀䌀　㘀䈀　䈀㈀䈀䐀㜀㘀䈀　䈀䈀㠀　　䈀　䄀㄀䄀㘀㈀㈀㔀䐀㌀䄀㜀㜀㘀䔀㘀㤀㘀㤀㜀㄀㄀㄀㘀㤀䄀㌀㌀㈀㌀䐀䈀㌀㌀䈀㤀䈀　䄀㔀㔀䄀㌀㠀㐀㈀㄀㈀䈀㐀㈀䔀㔀㔀㜀㌀㤀㌀㘀䈀䘀㄀䄀㜀㠀䔀䐀㘀㠀㄀㔀㠀䌀㜀㘀㐀㔀䌀㈀㈀　㘀㈀　䌀　䄀䄀㜀䌀䘀䘀㈀㐀㄀㐀㠀䌀䈀䈀㈀䐀䄀䈀㠀㤀㜀　㠀㐀㈀䐀㘀䄀㈀㤀　䈀㔀㄀䄀䄀㈀䐀㔀䔀䄀㠀㤀㄀䔀䈀㘀　㤀　䄀㔀㔀䘀㌀㔀㔀䘀㌀䘀䈀㄀㜀䘀㘀㈀䘀㠀䌀㈀䘀䌀　䈀䘀㜀㄀䄀䐀㠀䄀䐀㄀䄀䄀䘀㌀㠀　䘀㐀㜀㄀㤀㐀㠀䐀　㠀䔀㌀㈀　㤀䐀㌀䌀䄀㈀㔀㔀㌀㌀㔀䄀㈀䐀䌀㠀㄀䌀㐀㠀㐀㠀㘀　㘀䌀䔀㄀䐀㠀䘀䌀㠀㔀䘀㤀㘀㔀㤀䔀㄀䌀㈀䄀㜀㔀㔀㄀䔀䌀㘀䈀㌀䄀㠀　㈀㐀㌀䄀㌀䐀　䘀㄀㘀㄀䈀㘀䘀䄀㌀㌀㠀㐀䘀㈀䌀㤀䌀䌀　䔀䔀㜀㄀㔀㠀㌀䌀㘀䘀㤀䔀㠀䔀㔀㘀䄀䔀䔀　㠀㐀䔀㤀㜀䄀㐀㘀㤀䈀㜀㈀㈀㘀䘀䈀㐀䌀䘀㘀䐀䈀㈀䐀㘀䘀䈀㜀㤀䌀　䔀㤀䌀　䔀㔀　䄀㜀㌀䈀㜀㄀䔀　䌀㐀㠀㄀㐀㔀䔀䐀䄀㈀㔀㘀䄀䈀㘀㄀䈀㐀䈀䄀㌀㌀䔀㌀㘀䘀　㌀㤀䌀㄀䔀㜀䘀㘀㔀䘀䌀䔀㐀䘀㠀䐀㈀䘀㠀㠀㤀䘀㄀䌀㔀䘀㄀㘀㌀㘀㜀㠀䔀㤀䐀㔀㤀㌀㠀㠀㌀㌀㜀㠀㄀　㜀㠀㄀㈀㔀㄀㄀㜀　㄀䐀㐀㈀㄀㤀䔀㐀䔀䐀　㘀㘀㄀㤀㤀㤀䌀㈀㌀㐀䈀㔀㠀䄀㌀㠀㈀㐀㔀㤀㈀㔀䈀䘀㘀㌀䐀　㤀䐀䄀㘀㠀䐀㄀䌀䈀㘀䘀㌀䈀䈀㜀㔀䈀䄀䈀㠀㐀　㤀　㤀䔀䄀䈀　㈀㈀　䘀　䈀㄀㜀㔀䐀䈀䌀㜀㈀㜀㔀㐀䄀㐀㘀䄀㜀㤀㘀䌀　䈀㔀㘀䔀䘀䘀㄀䈀䐀㐀　䈀䘀㘀䄀䘀䌀㌀䔀　㈀㈀䄀䄀㘀㐀㐀㄀䌀㜀䈀㈀䈀䄀㄀㔀㤀䐀㔀　䄀㔀䌀㠀㘀㐀㠀䌀㐀䔀㐀㤀㤀㔀㜀㈀㤀䄀㈀㐀䔀㐀㔀䐀㌀㐀䔀䘀㘀㐀䈀䐀㠀㄀䔀　㤀㐀㔀　㜀㜀㐀㔀䘀㤀䘀䄀㔀㘀㔀䄀㘀䘀㠀䘀䈀㠀㈀㜀㤀䌀㔀䌀㜀䈀㘀㐀㈀㘀䔀㠀䔀㐀㌀䄀䘀㘀㐀㐀　㈀㐀䔀㘀䔀㤀㌀㈀䘀䈀㐀㄀㌀䌀䈀　㠀㤀㐀㄀㄀㄀䘀䐀㐀䔀㤀㐀䈀㐀䔀㈀㜀䐀㜀䔀㜀㠀䔀　㔀䐀䘀䐀䘀㘀㠀䄀㐀㐀　㈀䐀䌀㤀㐀䔀㌀䈀㐀㠀㄀㐀㘀䔀㤀㠀㐀㤀㤀䌀㘀䔀㤀㠀䌀㤀䔀㐀㜀䄀㘀　㈀㘀䐀㌀㌀㘀　㔀㜀㌀㤀㠀㌀㌀㔀㌀㌀　㠀㜀䘀㤀䌀䐀㌀㐀䌀䌀㘀㄀䈀㤀　　䌀䌀㘀㄀䈀䈀䌀㄀㔀䘀䄀㔀䐀䐀䔀䐀䌀㌀㄀䌀䐀㤀䐀䌀䐀䘀䈀㜀㄀䐀䌀䔀䌀䐀㈀㌀　㌀㤀䐀㄀䌀䘀㤀䐀䌀䐀㠀㌀　㤀㐀㐀䈀䘀㠀㜀䘀㔀㌀䄀㜀㄀㄀　㔀䔀㐀㈀㌀㔀㤀㤀　䄀㤀㔀䘀㐀㔀㘀䔀㈀㈀㜀䘀㐀㌀㌀䔀　䈀䐀㤀䐀㌀　㠀㌀㤀　㈀㜀㜀䈀䘀㐀䘀㜀䔀㐀䌀㜀䔀　㔀䈀㤀䐀䐀䐀䈀　䌀䌀㌀䌀㠀䌀㄀䄀㘀䔀㤀㘀㠀㄀㌀䔀㐀㄀䌀㐀䔀䌀　䐀㤀㠀䘀䌀䘀　䐀　䘀㤀　㜀䈀䌀㠀㌀䘀㐀　　䔀㜀䘀㄀㐀䈀㈀㤀㘀䔀㜀䌀㤀㐀䘀㈀　㄀㜀㘀㈀㄀㤀　㔀䐀㤀㈀　㠀䌀㔀㐀㤀㄀㜀㈀䌀㠀㐀㘀　㘀䘀　䈀䈀㜀䘀㄀䘀㈀㜀䘀㜀㤀㈀䘀䈀㈀　㤀㜀䘀䄀㄀㘀㜀㤀㠀䄀䈀䌀㐀　䌀䔀㤀　䐀䘀㌀　䈀　䘀㔀㤀㈀㌀㘀㄀䌀㤀㤀　㈀㜀㤀䈀䘀　䈀㠀㈀䘀　㈀　㌀䔀㤀㔀䘀㠀　㐀䘀㤀㌀䈀䘀㈀㠀䘀㈀　䌀䐀䔀䘀㤀　㄀䘀㐀　䄀䔀䘀㈀㄀㘀㈀㌀㠀㔀㘀䌀䄀䐀㄀䐀䌀㜀䄀㔀㄀㈀　䐀䄀㤀㈀　㜀㤀㜀㠀㜀㘀䘀㘀䌀㌀㠀㤀䘀䘀㘀䘀䌀㤀䐀䘀㤀㌀䌀䘀㐀㌀㤀䔀䘀㌀㌀㠀㜀㤀㤀䄀䈀䌀　㠀㌀㤀䐀㌀㘀䘀㄀㤀㠀㠀䔀䌀㜀　㄀㈀䄀㌀㜀㤀㄀　㄀䐀䄀䘀㠀㔀㄀㤀㜀㔀㜀　䈀䔀䈀㤀㤀䔀䔀䌀㠀㈀㐀㠀䘀㔀㐀㤀䌀㠀䄀䔀䄀䔀㈀㘀䔀䘀㤀　䘀䘀䌀䈀㘀㠀㘀　㔀䐀㜀㘀䔀㌀䔀　　㠀㐀㜀㠀䌀㈀㌀䌀㌀㄀䈀䔀㤀㌀㌀　㘀㌀䄀䐀䄀　䌀㤀㈀䐀　㐀㈀㔀䌀䄀㌀䔀㜀䐀㔀㄀䐀䔀㐀㐀㘀㌀㈀㐀㜀䔀㘀㈀㄀㈀㜀㜀䈀㠀　䐀　㘀䘀㐀䈀㜀䘀　㄀䈀㈀䈀㄀㌀䘀㤀㈀㈀㜀䌀㠀㌀㌀䔀㐀㠀㜀䔀㐀㜀㔀㐀㘀㈀䈀㠀䌀㌀㜀㐀㌀䄀䔀䐀䈀　　㔀㤀㔀㔀㌀䔀䈀㤀　㄀䈀㈀䌀䘀䐀䐀㤀　䌀㔀䐀䐀㐀䔀䈀䔀㐀㘀㄀䔀　㘀㌀䐀㜀䐀㤀㄀䘀䌀㠀䔀䘀䌀　㤀䈀䌀䔀㠀㈀㐀㌀㤀㐀䐀㜀䔀䌀㘀䔀㠀㠀㐀䘀㄀㄀㘀㜀　䔀䈀㐀㘀䌀㠀䘀䈀㘀䌀㤀　䌀㜀䐀㌀䔀㜀䌀㈀㄀䘀㈀㈀㤀䘀㈀㘀㔀䘀㈀㜀㠀䘀㐀　䄀䔀䘀㔀㈀㔀䘀㈀㜀䈀㌀　䘀㔀㘀㌀㤀　㔀㌀䈀䔀㐀㐀㜀䔀䌀䔀䔀㠀䔀㌀㄀䌀㌀　䄀㐀㈀　㔀䔀㌀㜀㐀㌀䔀㘀㘀䈀㈀　㐀䐀㜀　㤀㘀㈀䄀㈀㐀䘀㐀㌀䈀㜀㤀㌀㜀㤀㌀㔀䈀䌀㤀㄀䐀䔀㐀㄀䈀䔀㐀㤀䈀㜀　㘀㘀䈀䄀㤀䘀䘀䌀㄀䈀㌀㤀㐀䘀㤀䔀㈀㐀䌀䘀㤀㄀㄀䘀㤀㄀㔀䘀㌀　　㘀㤀　㈀㜀䐀㌀䈀䈀　䐀㜀㐀㘀䔀䌀㔀㤀㤀㔀㈀㔀㈀　㤀㄀㤀㜀㌀㤀　䘀䌀㤀㌀䐀　䄀䄀㠀㈀䌀䌀㌀　　㐀䈀㤀䈀㜀㠀㔀㐀㠀㜀䄀㠀㜀㠀㘀㜀䄀䌀㠀䔀㘀䔀㄀䌀㄀㜀䔀㠀䔀㐀䌀㠀䌀　䔀㘀䘀䔀㄀䌀㠀䐀䐀㌀㠀㠀㘀䔀㘀䐀㠀㐀㘀䌀㠀㈀㈀䄀䈀䔀㄀䄀䌀䔀㘀㈀　㄀㌀䔀㐀　㌀䔀㐀䌀㌀䔀㐀䄀㌀䔀㐀㐀䔀䘀㈀㈀　㌀㤀　䌀䘀㌀䈀㜀㤀㌀㈀䘀㤀㌀䘀䘀　㌀䌀䔀䈀㤀㐀㠀㐀䔀㤀㄀㤀㜀䌀㤀㄀䈀㠀䌀㄀㄀䔀㜀䄀㠀䌀㠀㌀䄀㌀㠀䔀㄀㄀㔀䌀㌀䈀䔀䈀　㤀㜀㜀䌀　㐀㌀㈀䌀䔀㘀䈀㤀㠀㄀㐀䔀䌀䈀㜀㐀㈀㐀㘀㤀䐀㐀㈀㔀䄀㘀　㠀㌀䐀䐀㐀䌀㐀䄀㈀　㘀㜀　䔀䌀㌀　㤀䔀　㌀㘀䘀㈀䈀䘀㈀㄀䘀䘀㌀䘀㐀㠀㄀䔀㈀㔀㌀㈀㌀㠀㄀㜀㜀䌀㠀㔀䘀䌀　㄀㔀䌀䘀䔀㌀㠀䘀㤀㈀䔀䔀㐀䐀㌀㘀䘀㌀㈀㈀㘀㠀㄀㠀㈀㐀䌀䈀　䄀　䘀㔀䘀㐀䘀䘀䘀㔀㈀㔀䄀㔀䌀㐀㐀㜀䘀㘀㤀㄀䘀䘀　㔀䄀㜀㠀㘀䈀䈀䌀㤀㈀㄀䌀㠀䔀㤀䔀㔀䔀㐀㌀䄀䘀㈀㈀䘀䔀㐀㈀䌀䈀㠀䌀㌀䈀㜀䌀㤀䘀㜀䌀㠀䄀䈀䔀㐀㤀㜀㐀䌀㈀䄀㤀㌀䔀㘀䄀㤀㠀䔀㜀䄀䔀㐀㌀㜀㘀㌀䘀㤀㈀㄀㈀䌀㌀䘀㠀㘀䔀㔀䔀䐀㔀㠀䐀䔀㠀㌀䔀㔀䔀㜀䈀㄀䘀䌀㠀䄀䌀㜀㄀䐀㠀㠀䌀㤀　䘀㘀㈀䘀㤀㈀䈀㔀䄀㈀䄀㐀䌀㔀㠀㌀㘀㘀㌀㌀㤀㠀㄀䔀㔀㘀㜀䈀　䈀䌀　䘀㐀䈀㄀䌀䄀䘀㜀㠀　㠀䌀䈀䌀㜀䈀㄀㜀䌀䔀䄀䘀䘀䈀㄀䘀㜀㈀㔀䐀　㔀㄀㄀㐀㔀䐀䐀䈀䈀㜀䄀䄀䈀䄀䄀㜀㘀㘀䄀㘀㜀䈀㈀䄀　䈀㤀　㌀䐀㄀㄀䌀㈀㈀㈀㤀䈀㘀㄀㌀㄀㈀　㤀䈀㄀㄀㄀㄀㄀㄀㌀㄀㐀㘀㐀㐀㔀㐀㐀㐀㠀䌀㈀䌀㈀㄀　㘀　䌀　㄀㈀㄀　㐀䔀㐀䌀㔀㠀　䌀㠀㄀䄀㌀㄀㈀㈀㘀䈀㘀㐀　㤀㠀䈀㄀　㄀　㌀㄀㈀㈀　㈀䄀㈀㈀㈀　㈀㘀㈀㐀　㐀㐀㐀㐀㤀㘀䈀　㈀㜀䌀㠀䈀䔀　㘀　㠀㠀䈀㠀㠀㄀　䘀䔀㤀䄀㤀䈀㐀㈀䐀㌀　䐀䘀䄀䘀㤀䄀㈀䔀䘀㜀䘀䘀䔀䘀㌀䘀䐀䔀䘀㤀㤀㜀㌀㤀䔀㌀䈀䌀䘀㔀㐀㔀㔀㜀㜀䐀㔀䐀㌀㔀㔀䘀㜀䐀䔀䔀䄀㤀䔀㐀㤀㄀　䈀㜀㜀㘀䔀䈀䐀㈀䄀䘀㌀䈀䐀䘀㠀㜀㜀㠀㄀　䘀㄀㌀㠀㘀㈀㄀㄀䔀㈀㐀㔀䌀㐀䄀䈀㔀䔀㜀㐀　㈀䄀㈀䄀㌀㔀䈀䈀㜀㔀䔀㜀䐀㤀䌀㈀㘀㘀㈀　㐀㘀㈀㜀㔀䌀㐀䘀䄀㠀㠀䌀䐀㄀　䔀㌀㄀　㌀䈀㈀㄀䘀㘀㐀㐀㄀䌀㠀㠀㤀㠀㠀䔀㌀㠀㄀㘀㜀㄀㈀㔀䔀㈀㘀㤀䌀㐀䄀䈀㔀䔀㜀㐀㌀㤀㄀㄀　㌀㄀㈀㤀㈀㜀䈀䈀䌀䔀㐀㠀䄀㐀㐀䄀䌀㠀䐀䐀㠀㄀　䈀㄀㌀㤀㘀㈀㄀䈀䌀㐀䘀㘀㠀㠀㄀䐀㄀㄀㌀䈀㈀㌀㈀㘀㈀㈀㈀㘀㈀㜀䄀㐀䘀㐀䔀䔀䔀㔀䔀䄀㠀䈀㌀㠀㄀　㌀㄀㄀䐀㜀㄀㌀㠀㘀㈀　㘀䔀㈀㌀㠀䌀㐀䌀㤀㠀㠀䐀㌀㄀㄀䔀㜀㈀㐀䘀㘀㐀㠀䔀㤀䔀㈀㔀䄀㠀　㤀㠀㠀䈀䈀㠀㄀㐀䘀㄀㜀㌀䌀㐀䐀㔀㠀㤀㜀䐀䈀䈀㜀㐀㜀㌀䔀㔀㈀㄀㘀䔀㐀㄀䐀䌀㠀㌀㜀㠀㄀㠀䈀㄀　㠀䘀㄀㠀䄀㄀㜀䐀䐀㄀㐀䐀㄀㐀㐀　䌀䔀㠀㤀㄀䐀㈀㈀㌀䐀㔀㔀䐀㄀㄀䈀㄀㄀䄀㘀㈀㘀䐀䌀㐀䘀䄀㠀㠀㠀䐀㜀䄀䘀㐀䔀䈀㤀䐀䔀䌀㠀䔀㐀㄀㘀䌀㈀㤀㌀䈀䐀䔀䌀㔀䐀䐀　㘀㜀㄀㌀　㘀㈀㈀䔀䔀㈀　㄀㈀䘀㄀䄀䘀䔀㠀㠀㔀㠀䌀㜀䌀　㌀䄀㐀㘀㔀䈀䌀㐀㘀㜀㄀　㌀䈀㈀㔀䄀㜀䘀㐀䔀䘀㘀㔀㜀㐀㐀㔀㐀䌀㐀㈀㐀䌀㐀㄀㐀䌀㐀㔀㄀䌀㠀㐀㌀㠀㄀㐀㜀㄀㈀㐀䔀㈀㔀㠀䌀㐀䘀㄀䌀㤀䈀䐀䈀䈀㈀㔀㄀䈀㔀㤀㠀㠀䐀㤀㠀㠀㜀㌀㄀㄀㄀㜀㈀㈀㈀䔀㐀㘀㔀䌀㠀㄀䈀㠀　䄀㌀㄀　䘀㜀㄀㄀㌀䔀㈀㔀㘀䌀㐀㔀䐀䈀䐀䈀䄀㈀㜀䘀㐀㌀　　䄀㄀　　䘀㈀㌀㤀䔀㐀㘀㈀䌀㐀㘀䈀䌀㈀㈀㐀䘀䐀㈀䐀㜀㈀㠀䘀㄀䄀㈀䄀㤀㈀㄀䈀䄀㄀㄀㜀䐀㄀㄀　㌀㄀　䌀㌀㄀　㈀㌀㄀㄀䄀䈀㈀㌀㐀㘀䘀㔀㤀㘀䌀㘀㠀䌀㐀㘀㘀䌀㠀㈀䐀㠀㄀䌀䈀㄀㄀㔀㘀㈀㈀䌀㘀㈀㌀䈀䌀㐀　䔀㠀㠀䘀㄀㠀㠀　㤀䈀䐀䔀㔀䐀㔀㌀㘀㜀䈀㈀㈀䘀㘀㐀㄀㐀䌀䔀䈀䔀㌀䘀䐀㜀䌀㌀　䔀㈀㌀　䌀㐀䐀㄀㠀㠀㤀㤀㠀㠀㄀㌀㄀㄀䄀㜀㈀㈀䌀䔀㐀㈀䌀䌀㐀㄀㔀䌀㠀㐀䈀㠀　㐀㜀㄀　㔀䔀㈀㈀䄀䌀㐀㜀㔀㠀㠀㄀䈀䘀䈀㜀㘀㐀䈀㐀䔀㌀㔀䈀㜀㜀㠀䐀㄀䔀㌀㐀㐀䄀䌀㠀䈀䐀㠀　㄀㜀㄀㘀㠀㔀䘀㜀㤀㌀㄀㌀䌀㐀䈀㄀㄀䐀㜀㈀㄀㘀䔀㐀㜀㌀䌀㠀䌀㜀㠀䐀㄀㠀䈀㐀㈀㐀㌀㜀㐀䘀㜀㤀㌀㈀䈀㐀䔀䘀㠀㈀㈀　㘀㈀㄀㐀㘀㈀　㔀㘀㐀㌀䄀䌀㠀䐀㔀㠀㄀䘀䈀㄀㐀㤀䈀䘀㄀䔀㈀㤀㠀㤀䄀㈀㌀㤀㘀㈀㈀䈀䌀㐀㔀㠀䌀㐀㜀㘀㠀㠀㄀䐀㄀　䔀㌀㄀㄀㄀㌀㄀　㜀䈀䘀㘀䔀䈀䐀㔀䄀䐀㠀䘀䔀㠀㠀㌀㌀㠀　㠀㜀㄀㌀㠀㘀㈀㈀㘀㘀㈀㄀㘀䔀㈀㄀䌀䌀㐀㐀㔀䘀䐀䘀䄀䐀㔀䄀䐀㈀㜀㤀㘀㈀㌀䄀䔀㐀㐀㔀䌀㠀䈀䈀㠀　㄀㜀㄀㌀㌀㘀㈀㌀䔀㘀㈀　㄀䔀㈀㔀㄀䌀㐀㈀㈀䌀㐀䌀䈀㠀㠀㈀㔀㄀㈀䔀䈀䘀䈀㌀㠀㄀　㐀䐀㐀㐀㜀䘀䌀㐀㈀　䌀㐀　㠀䌀㐀㈀䄀㠀㠀䈀㔀㄀㄀䄀㌀㄀㄀㤀䈀㈀㄀䈀㘀㐀㐀㠀䌀㐀㔀㘀䌀㈀䘀䘀㄀㔀䔀㤀䘀㐀䔀㠀㠀㔀䐀㄀㄀㤀㌀㄀　㔀㌀㄀　㔀㌀㄀㄀　㜀㈀㄀　䔀㐀㌀䌀䌀㐀　㄀䌀㠀䘀㌀㠀㄀㔀㜀㄀　䔀䔀㈀㐀㈀㠀㤀䐀㄀㌀䔀㐀䈀㄀　䐀㜀㈀㈀㘀䔀㐀㔀㌀䌀㠀㠀㔀㠀䔀䌀㐀㔀㔀䘀㠀䄀䔀㠀㐀㐀㄀㐀㠀㠀䔀㔀㄀㄀㐀㌀㄀　㈀䈀㈀㈀㔀㘀㤀㌀䐀㠀䌀　䈀㜀㌀㘀㘀㈀㌀㌀䌀㐀㔀㠀䌀㐀㐀䔀㠀㠀䌀㤀㄀㈀㄀䈀䘀䄀　䔀㤀㘀䐀㠀䌀㠀㜀㜀䈀㠀䘀㜀㠀䈀㌀䘀䈀䔀䔀㌀㄀㄀䈀㌀㄀　䈀㌀㄀㄀䔀㜀㈀㈀㈀䔀㐀㐀㔀䌀㠀䌀䈀㠀㄀䌀㜀㄀㘀㔀䈀䘀䘀䔀㜀䐀䘀䄀䘀㤀䄀䔀㐀㔀䐀䌀㠀　䈀㠀㄀㤀㜀㄀㌀䈀䔀㈀㄀䔀䌀㐀　㌀㠀㠀㐀㜀㄀㄀㐀䘀䘀㜀㄀䈀䐀　㈀䘀䌀㤀䈀㜀䐀㠀㠀䈀㜀䔀㄀㐀䐀㄀㄀䘀㌀㄀㄀㈀䈀㄀㜀䔀䄀䄀㤀䌀㤀㌀㜀䔀㈀䐀㄀　㔀䈀㈀㌀䌀㘀㈀㄀䈀㘀㐀㜀䔀䌀㠀㠀䐀㠀㄀㤀㌀㄀㄀㄀㌀㄀㄀㤀䈀㄀㈀䘀䔀㈀㐀　䌀㐀㜀㐀䌀㐀䔀㄀㠀㠀㄀㤀㠀㠀䔀㌀䈀䌀䐀㤀䄀　䌀䌀㌀㌀䌀䄀䐀䘀㠀㄀　䐀㤀㄀䈀㄀䄀䘀㤀㌀䌀䌀㐀䔀䔀㈀㘀㔀䘀䔀䐀　㄀㤀㤀䘀䐀㔀㜀㐀䌀㌀㈀㜀㈀㘀㠀㤀䘀㠀㜀䌀䄀㘀㠀㜀䌀䌀㐀㄀㔀䔀㤀㘀㜀㤀㐀㈀㈀䘀㜀䌀䐀䔀䐀㈀㐀㜀䔀㘀㘀㘀㜀䐀㘀㔀䐀䌀㤀䌀㠀㈀䘀㜀㜀㠀㜀䔀㘀䘀㜀㜀䈀㌀䌀㔀䌀䐀䘀䄀㌀㜀䔀䈀䘀䔀㈀㜀䔀䄀　㔀䘀䐀㘀㄀㜀䘀㘀䘀䐀㜀䐀䈀䐀㈀䈀䔀㌀㈀㌀㤀䌀䄀㔀　㤀㤀㈀䘀䘀䔀䈀䐀㜀㜀㐀㐀㘀㘀㄀㜀䘀䘀　䔀㜀㈀㤀㤀㘀㔀䈀㔀㤀㘀䐀㤀㐀㠀㄀䈀㤀㤀㌀䐀䌀㐀䌀䄀㔀䌀䐀㔀㜀䈀䄀䌀䐀㈀㐀䘀㘀䔀䘀䘀䔀䔀䐀㘀䘀䄀䈀䄀䌀䌀㜀㌀㜀㐀㤀㤀㘀㤀㜀　㜀　䘀䔀　䘀㠀䌀䌀㠀㘀䌀䐀㔀䘀䔀㔀㤀㠀　䌀䌀㤀㄀䔀䘀㤀㄀㌀㤀㘀䐀㄀䐀㤀㤀㜀㤀䐀㔀㤀㌀㔀㤀䐀㐀䈀䐀㌀㈀㠀䘀㘀㤀㈀　㜀㌀䌀䈀䘀䈀㘀㐀䘀䔀䐀㜀㔀㠀䔀㘀㔀㔀㐀䐀㘀㔀㌀䔀㜀㐀䈀䘀䌀䌀䄀㠀㄀䘀㤀　㤀㤀䔀㠀㠀㌀㜀㜀㔀　䘀䘀䄀䘀䘀㜀㐀䔀㐀㌀㔀㘀䘀䄀㤀䔀䌀㤀䄀䌀㈀䌀㐀䈀䔀㘀䘀㜀㜀䘀䘀䐀㄀䐀㤀㄀䈀㤀䐀㜀䔀䘀㜀㠀䐀㜀㈀䐀䔀㠀䈀㤀㈀㌀㜀䌀䘀㈀㐀䘀㤀　䌀㤀䐀䌀㔀㔀㘀䔀㠀㄀䘀䘀　㌀䔀䘀㠀㠀䐀䌀䄀㜀䘀䌀㄀㤀䈀㘀䘀䐀　䐀　㌀䔀㔀㜀䔀㘀㄀㠀　䌀䌀䔀㜀㔀䘀㤀㔀㌀㤀䘀㘀䈀䘀㘀㐀㌀㘀䘀䈀㤀䄀䌀䌀㌀䔀㠀㜀䌀㠀䐀䐀䌀　䔀䈀㌀㈀㘀㌀㜀䘀㐀㌀㘀㘀䌀㈀㈀㌀䔀㐀䐀䌀㄀䔀㈀㔀䘀㌀䔀㄀㌀㄀㌀㈀㈀㌀㤀䐀㠀㐀㌀䄀䘀䐀㘀䘀㘀㤀㐀㄀䔀㐀䐀䔀䌀㜀㠀䈀㄀㄀㜀䘀㠀　䘀䔀㜀㜀㠀㐀㈀䐀㄀　㄀䘀㐀㈀㘀䌀㠀㤀䘀㠀㌀　㜀䄀㐀㄀䄀䄀䘀䔀㔀㈀㄀㔀䈀㔀㌀　䈀䌀㐀㄀㈀䘀㜀㜀　䄀䈀䘀㈀㌀㈀　䈀㘀䌀㌀㔀䄀䐀䔀䔀㜀㜀㠀㌀㜀㤀㤀㄀㔀䐀䐀㜀㜀㠀㐀㜀䔀㜀㜀㠀㐀䔀㄀䈀㜀㘀　䐀䌀㤀䘀䄀㈀䔀䘀㄀䐀䔀　䘀䘀　䘀䐀㄀䌀㄀　㄀㐀䘀䌀䈀㤀䐀䘀䔀䈀㌀㜀㈀㔀䘀䘀䔀㄀䌀㜀㐀䘀䌀　㜀㌀㠀㠀㄀㔀䄀䈀䘀䄀㄀㜀㜀㌀䔀㔀㔀㐀㈀㔀㘀䔀㤀㄀㘀㜀㘀䘀㌀㌀㌀䈀　㜀䌀㈀㘀䘀䔀㈀䐀㘀㐀䈀㠀䄀㌀　䘀䈀䄀䔀㌀㜀㜀㠀㄀䘀㠀㠀䔀䌀　䐀㐀䐀䈀㈀㈀㠀㔀㐀㠀䈀㤀䘀㜀䘀䘀䘀㜀㈀䐀㠀㄀䔀㤀㜀䘀㠀㈀㄀㐀䄀䄀㐀　䐀㔀㌀䈀䈀　㐀㐀䄀䐀䈀䄀䐀䈀㈀㌀㠀㔀㘀䄀㜀　䘀㜀㄀䐀㔀㠀　㜀䈀䌀　㤀㘀㌀䔀㄀㈀䐀㄀㠀　㜀䔀䘀䌀　䘀㠀㜀䘀㠀　㄀㌀䈀䌀㄀䘀䘀㜀㔀㜀䐀　䐀䈀㌀㈀㄀㌀䐀䔀㤀㘀㈀䐀㈀㜀䌀　䌀㐀㜀䘀㠀　㔀㌀㤀㠀　㤀䈀㌀䌀　㄀䈀㜀䈀㄀䘀䌀㄀䔀䘀䈀　䘀㐀㠀㜀㘀㤀㜀㜀㌀　䄀㌀　㠀　㐀䘀䘀㔀䈀䘀㠀㐀䘀㠀䘀㠀㈀䌀　㄀㌀㜀䘀㠀䄀㌀䔀䘀䘀㈀䔀㤀㈀㤀䄀䘀㐀㄀㤀㤀䄀㐀㠀䐀㌀䔀㠀㐀㠀㌀䄀㤀㤀䔀㘀䐀　䔀㔀㌀㐀㠀䘀䔀㘀䐀㌀䄀㌀䘀㐀㌀㈀㜀㌀䈀　　　㔀㘀㠀䐀㌀㔀㘀㐀䄀䐀䐀㠀㌀㌀㈀䌀㤀㄀䄀㔀䈀㄀㤀㄀㘀䌀㌀㈀䌀䈀㘀㄀䌀䈀㔀㤀㄀䔀䌀䈀㘀㜀㐀㜀䐀㤀㘀㔀䌀䐀㔀㜀㠀䈀䐀㄀㤀㈀䈀㔀䌀㄀䐀䄀㔀㠀㘀䐀䈀䄀䈀㘀㐀㠀㔀䈀䄀㤀㘀䐀䐀㈀䘀㘀㘀㤀䄀㜀䈀㔀㘀䈀䈀䄀䄀㤀㠀㜀䔀㤀䈀㔀䘀㔀㘀㘀㜀䄀䄀䌀䐀䔀㐀㤀䌀䘀㜀　㈀䌀㜀㄀䄀䌀㜀㔀㘀䌀㜀㔀㄀䌀㜀㐀㄀㐀㜀㌀䌀䄀䘀䐀㜀㤀㈀㐀䄀䘀䌀䘀㔀䈀䘀　㜀㘀䈀䌀㈀䈀䔀䘀䌀䈀㠀㜀㌀㤀　㜀㌀䄀㐀㜀㌀䈀䈀㌀㔀䌀㠀㤀䄀䔀䄀㄀䄀䔀㜀㄀㘀䔀䌀䐀㔀䐀䐀䔀㔀䐀䌀㔀㄀䐀䔀䐀㘀䔀䔀㤀㘀䔀䔀䘀㐀䔀㜀　䄀㜀䈀䄀䈀㌀䐀䌀㜀㤀䔀䔀　㌀䔀䔀㜀㌀㠀㘀䐀䈀　㠀㌀㄀㘀䄀㄀䄀㐀䐀㠀䌀㌀㘀㐀㘀㐀㜀䄀㌀䄀㜀㌀㄀䌀㠀䌀㠀㌀　䔀㘀㄀䄀㐀䈀㠀䐀㜀㔀㐀㘀㠀㄀㔀㄀㘀㐀㤀㐀㤀㠀䌀㈀㠀䌀㌀　㔀㌀䌀䐀　㈀䘀㌀㠀䄀䌀㜀䐀䘀㄀㌀䔀㤀㘀㤀䔀㘀㠀㤀䘀㔀䘀㐀䘀㄀㐀䌀䘀㐀䌀䌀䘀㔀㘀䌀䘀㔀㔀䌀㄀㘀䈀䔀㈀㈀㔀㄀㈀䌀㄀　㈀䈀䌀㐀　㘀㜀㄀㔀　㄀㐀䘀䈀　㐀䘀㠀䌀㐀䘀㤀㈀㐀䘀㤀　䌀䘀㐀㤀㤀䔀䔀䈀㌀䌀㠀㘀㜀䄀㔀㘀䘀㤀㠀㘀䘀㜀㌀䐀䘀㠀䔀䈀䔀䄀㤀䈀䔀䐀䈀㜀䐀　䘀䘀䈀㔀䔀䘀㐀㘀䈀䔀㌀䐀㜀䐀㄀䄀䘀䄀㜀䐀䘀㈀　䈀䘀　䌀䈀䘀䄀㤀㜀䔀㐀䈀䘀䐀䐀㘀䘀㤀㘀䐀䘀㜀䄀䘀䔀㠀䐀䘀䌀㄀㜀䘀䄀㐀䘀䘀㔀㘀䘀䘀㠀㌀䘀䔀䌀㔀䔀㔀㘀㠀㌀㤀䘀䘀㜀㈀㤀㄀䔀㔀䔀䄀㤀㜀㔀䈀㔀㜀㘀䔀㜀䈀䘀㤀䌀㐀䘀㈀㘀㤀䔀㔀䌀㜀㤀㔀㤀䘀㔀㔀䌀㄀㔀䐀䄀㄀㐀䄀㠀㔀䔀㠀　䄀㈀䐀㈀䈀䈀㐀䄀䘀㌀　䈀㘀䌀㈀䈀䄀　䄀　㔀㄀㔀㠀䄀㈀䄀㤀㐀　㐀㠀㠀㠀　㠀㠀㠀　䄀㠀㠀　㤀㠀㠀　䈀㠀㠀　䘀㠀㠀　㤀㐀㠀　䘀㐀㠀　䌀䌀㠀　䔀䌀㠀　䐀䌀㠀　㔀㔀　㄀㤀䈀　㌀　䄀　㈀㠀䄀　㈀㐀䄀　㈀㐀㔀㘀　㐀㐀㘀　㔀㐀㘀　㐀䌀㘀　㔀䌀㘀　㜀䌀㘀　㐀䄀㘀　㜀䄀㘀　㘀㘀㘀　㜀㘀㘀　㘀䔀䔀　䄀䄀䌀　䌀䐀㠀㄀　㔀㠀㄀㐀㔀㠀㄀㈀㔀㐀㄀㈀㈀㈀㠀㈀㈀㈀㠀㈀䄀㈀㠀㈀㘀㈀㠀㈀䔀㈀㠀㌀䔀㈀㠀㈀㔀㈀㠀㌀䐀㈀㠀㌀㌀㈀㠀㌀䈀㈀㠀㌀㜀㘀㠀㔀㔀䐀　䔀㘀䄀　㠀㈀䄀　䄀㈀䄀　㤀㈀㘀　㄀㄀㄀䌀㄀㄀㄀䌀㄀㔀㄀䌀㄀㌀㄀䌀㄀㜀㄀䌀㄀䘀㤀䌀㄀㈀㤀䌀㄀䔀㤀䌀㄀㤀㤀䌀㄀䐀㤀䌀㄀䈀䈀䌀㈀䄀㜀㠀㜀㌀㜀　㐀㄀㜀　㔀㄀㜀　㐀㤀㠀㠀　㠀㠀㤀　㠀㠀㤀　䄀㠀㤀　㤀㠀㤀　䈀㠀㤀　䘀㐀㤀　㤀㐀㤀　䘀䌀㤀　䌀䌀㤀　䔀䌀㤀　䐀㔀㤀㄀㔀䈀㈀㌀㤀䄀㐀㈀　䄀㐀㈀㠀䄀㐀㈀㐀㔀㐀㠀㐀㐀㘀㠀㐀㐀㘀㠀㔀䌀㘀㠀㐀䌀㘀㠀㔀䌀㘀㠀㜀䄀㘀㠀㐀䄀㘀㠀㜀㘀㘀㠀㘀㘀㘀㠀㜀䔀㘀㠀㘀䄀䔀　䄀䐀䐀㄀䌀㔀䄀㄀　㔀䄀㄀㐀㔀䄀㄀㈀㈀㘀䌀㈀㈀㈀䌀㈀䄀㈀䌀㈀㘀㈀䌀㈀䔀㈀䌀㈀䔀㈀䌀㌀㔀㈀䌀㈀䐀㈀䌀㌀㌀㈀䌀㌀䈀㈀䌀㌀㜀㈀䌀㌀㔀㘀㠀㔀㘀䐀　䔀㈀䈀　㠀㈀䈀　䄀㈀䈀　㤀㄀㜀䔀㄀㄀㄀䔀㄀㔀㄀䔀㄀㌀㄀䔀㄀㜀㄀䔀㄀䘀㄀䔀㄀㈀㤀䔀㄀䔀㤀䔀㄀㤀㤀䔀㄀䐀㤀䔀㄀䈀㤀䔀㄀䄀䈀䌀㈀㌀㜀㠀㜀㄀㜀㠀㐀㄀㜀㠀㔀㤀㜀㐀㐀㠀㠀㠀㠀㠀㠀㠀㠀䄀㠀㠀㠀㤀㠀㠀㠀䈀㠀㠀㠀䘀㠀㠀㠀㄀㐀㤀㤀䌀䐀㜀䄀㘀㜀㤀㜀䈀㌀㌀㐀㔀㜀　㠀䄀䈀㘀㠀䔀㌀䐀㄀㌀㘀㄀䔀㘀䘀䔀㌀㤀䐀䌀䈀㜀　䌀䐀㔀㘀䔀䔀　　　㠀㔀䘀　㠀㤀䌀㤀㐀䔀㄀㤀㔀㄀䐀㔀㘀㔀䔀㌀㔀䐀㔀䐀䄀䘀䔀䔀䔀　䐀䐀㘀䔀㌀䐀䘀㔀㌀䐀䈀䌀㘀䈀㜀㔀䄀㠀䘀㜀䘀䌀䘀㔀㄀㄀䈀䈀䘀㘀㈀䄀䐀㄀䘀㄀㔀㘀㈀䔀㌀㔀㄀㌀㘀㘀䔀㄀䈀㐀䘀䐀㐀㌀䄀㈀䈀䄀䘀㄀㌀㘀㤀䔀㌀㘀䐀㘀䌀䈀䌀䄀䘀䈀㔀䘀䘀　䐀㤀㘀㔀㠀䌀䈀㄀䈀㘀䔀䈀㘀䘀㈀㤀㠀㄀㠀㄀䈀㘀䘀㔀䔀㠀㘀䌀䈀　㠀㄀䄀䐀㌀䌀㈀㔀㘀㌀䔀㄀㄀㌀㤀㤀㔀䘀㤀㤀㔀㜀䘀䔀㤀　㠀㤀䈀㜀㜀㈀䐀䈀㔀　䘀㔀㘀䌀㌀㄀㈀㐀䐀䘀䄀䈀䄀　　㤀㤀㐀䘀㔀㘀㔀㌀㤀䘀㄀䔀㔀㐀䘀㘀䈀㐀䈀㈀㤀㜀㐀䈀㘀䐀　䈀㜀䄀䈀䈀䐀䄀　䘀䈀㔀㔀㈀䈀㘀䄀䐀䈀㈀㄀䐀㤀㔀㐀䐀䈀㐀䘀㘀䔀㈀䄀㄀䔀㤀䐀㘀㔀㄀䈀㘀㘀䌀㘀䐀䔀㔀䄀䐀㜀䐀㘀䐀䈀䌀䄀㜀䈀㔀㜀䐀䔀䈀㈀䌀㈀䈀㘀䘀㌀㌀䐀䄀䌀䄀㄀䘀䔀䈀㘀䈀䔀㌀䄀㤀㔀㘀㄀䔀䔀䈀㘀䈀䔀㌀䘀䔀㌀㘀㘀䔀㤀䈀㈀㔀䈀㄀䈀㘀䄀䈀㄀䌀䐀䈀㐀䔀㜀㈀䘀㈀㜀䈀䘀䘀㘀㈀㠀㜀䐀㤀㜀㠀　㘀㜀㈀㤀䈀㌀䄀䈀㄀㤀㤀䌀䄀㘀㘀㈀㤀㌀䈀㔀㜀䐀㤀䌀㔀㔀㠀㌀䈀㔀䌀䔀䔀㄀䔀㔀䈀䌀䈀㄀䐀㐀䔀　㜀㤀㤀㤀䘀㈀㔀䌀㤀㈀䌀㘀䌀䄀　䐀䌀　䈀㠀䌀㤀㘀䐀䔀㌀䘀㐀䈀䌀㘀䄀䔀　㔀䈀　㄀㠀㔀㘀䌀　㘀䄀䐀㠀　　㔀䈀㘀　㄀㜀㄀䌀㠀　䔀㌀㜀　䌀䔀㜀䈀㠀㜀㤀䐀㌀㠀㠀㤀㈀䘀　㤀㈀㈀㄀㔀㐀䈀㠀䘀䘀㌀㌀㠀㔀㔀䐀㘀㔀㜀䐀㤀㤀䈀㤀䘀䐀㜀㔀㔀䈀㘀㠀㔀䈀㈀㜀㄀䌀䄀㜀㘀㔀㈀䈀㘀䄀㜀䈀㈀㠀㌀㤀㐀䌀䐀㔀　㜀㘀䈀䄀䈀㈀㠀䈀㤀㐀㔀䐀䄀㔀䔀䌀㐀㘀㘀㔀㜀㜀㈀㤀㜀䈀㔀䌀䐀㤀㈀䈀䄀㔀㌀㘀䌀䔀䄀㄀㘀䌀㠀　䈀㈀䐀㔀㤀㔀㘀䐀䄀㈀㘀䌀㘀䈀㘀㔀㌀䈀㈀㠀㤀䈀䄀㐀䔀䌀㐀　㘀㔀䐀㔀䘀㤀䔀㌀䐀㐀䘀㤀䔀㌀㄀㘀㈀䈀䈀䈀䐀㘀㜀䄀㄀㔀䐀䄀㌀䄀䄀䐀䄀䄀䈀㜀㜀㔀䐀㠀䈀㠀䈀䘀㠀䐀㌀㜀䈀㐀䘀㄀䌀䔀㘀㔀䈀㠀㌀䌀䘀䔀㤀㌀㔀㜀䄀䌀䔀㔀䔀䐀䄀㈀㘀䌀㌀䌀䌀㘀䌀䄀䈀䈀䈀㠀㘀䐀㜀䌀㤀㄀㤀㔀㜀㜀㘀䈀㘀䐀䔀㌀㈀㤀㘀㔀䈀㠀䔀䌀㜀䘀䈀㜀㌀㐀䔀㐀㐀㄀䐀　㄀　㘀㈀䄀　㤀㔀䐀䌀㠀䈀㌀䌀㈀㌀䈀㌀䘀㌀㐀㐀㤀㤀㠀㌀䄀㜀䌀㤀㤀䐀䔀　㐀㠀㄀㤀䘀䈀㈀㜀㐀㌀㌀㘀䔀㐀㐀　㈀䔀㈀䌀㠀㜀㔀㔀㤀　　㜀㤀䈀㈀㄀㄀䘀　䄀䔀　㈀㠀㄀㐀㤀㔀䘀㘀䈀㘀㤀䈀㔀䄀㘀䈀䐀䐀䐀䄀㈀㤀䐀䈀㔀㤀䐀㤀㌀䔀䌀䄀　䔀㔀㌀㜀㘀㤀䌀䈀㈀䈀㌀㤀㐀㔀䐀䄀㈀㘀䌀㤀䔀䈀㈀㔀䈀㤀㔀㌀䐀䄀　䔀䌀䈀㤀㔀㈀㤀䈀䄀　㘀㘀㔀㌀㠀㈀㤀䄀㐀䐀　㤀㄀㄀䌀䄀㐀㘀㈀㤀㄀䈀䄀㌀䄀䌀㔀䄀䔀䈀　㤀䌀䄀㠀䘀㈀㐀䄀㐀㈀㤀䄀䈀䄀䔀㘀㈀䌀㈀㘀㐀㘀㔀䐀㔀㘀䌀㐀䘀㔀㠀㘀䌀㔀㔀䈀䐀䘀䈀㄀㈀䄀䈀㐀䄀䐀䐀䈀㜀㈀　㈀䘀　䘀㔀㄀㜀䘀㔀㄀㤀㜀䐀㈀䄀㌀㜀䌀䄀䔀䄀䌀㤀䄀㤀䈀䐀䐀䐀㔀䐀䌀䔀䌀䄀䔀䔀㘀㘀㘀㜀㜀䔀㔀䈀㜀㄀㈀䐀㔀䐀䌀㐀䌀㈀䌀䄀䘀㘀䌀㄀㔀㘀㔀䔀䈀㈀䈀䄀䈀䐀㘀㐀㠀䄀㈀㄀䄀㔀㔀䄀㈀㔀㈀㌀㔀㌀㄀㐀㔀䐀㤀㜀㐀㘀㔀䌀㜀㈀䄀䄀䈀䔀㘀㘀㠀䔀㈀㐀㈀㘀㔀㔀㔀㌀䘀㄀㈀㌀㜀㈀㠀䈀䈀　䈀㐀㜀㔀㌀䌀㘀䐀䘀䈀䔀㜀㐀㔀㐀䐀㤀㜀㌀䐀㘀㜀㄀㈀㜀䄀㔀㈀㌀㌀㜀㈀　㐀䌀㘀㘀䘀㔀䈀㔀㈀㄀㄀䄀㤀䄀䌀㤀䐀䐀㜀㠀㈀䌀䈀㐀㤀㜀䈀䈀䈀㘀　㐀㐀㠀㈀䔀㘀䐀㤀㌀䄀㐀䌀䔀㤀䔀䄀㐀㌀䌀㐀㤀㔀㈀䈀㘀䈀㈀㘀䄀㠀㔀㈀㘀䄀㤀䈀㌀㈀㜀䄀㤀䈀㌀㈀㜀䔀㔀㈀䈀㜀䈀㔀㠀䐀㤀䔀㈀㔀㈀䐀䈀　㌀㤀㐀㄀㔀䘀㈀㤀䌀䄀䔀䐀䘀㘀㜀㘀㐀䌀䘀㔀㘀㌀㘀䐀䔀䌀䔀䌀㘀䐀䈀䐀䈀㜀㠀䈀㘀㜀㔀　䌀㌀䐀䌀䈀㔀䔀㔀䈀㄀㤀㜀䐀㔀䔀䐀䔀㘀　䄀䐀䘀䘀㜀㈀㌀䔀㜀㈀　㘀䄀㘀䈀䌀䈀䔀㘀㄀䄀㔀㜀䐀㜀㠀㔀㤀䘀㔀䔀䐀㘀㔀㌀㔀䄀䘀㔀䘀䈀䔀㠀䄀㜀㔀㘀䌀䈀䔀㌀㌀㔀㤀䘀㤀㠀䔀䔀㐀㤀㘀䌀䄀䄀䄀䔀䈀㤀㌀㄀䌀㘀䘀䐀㜀㌀㜀㌀㤀㐀㜀㔀㤀䐀䈀㌀䌀㐀䈀䈀䔀㠀䌀䌀㜀㈀䐀㔀㌀䈀㌀㤀㜀㤀䄀䌀㄀䈀䐀㘀㈀䄀䐀㜀䔀䄀㔀䐀㜀㈀　㄀䈀㔀䘀㘀䐀㄀䐀㐀㔀　䄀䐀㠀䈀㠀㘀㤀䔀㔀㜀䐀䐀㈀䄀䐀䈀䌀㘀䘀㐀䐀㄀䈀䄀䘀㔀䔀㠀㘀㐀䈀䐀㔀䘀䄀㘀䐀　㜀㐀䔀㈀䐀㘀㌀㐀㠀　䐀㔀㈀䈀㘀㘀㈀㤀㤀㤀䄀㔀䔀㤀䔀㘀㌀䔀㌀㘀䈀㘀䘀㘀㤀䄀㤀䔀㘀㜀䈀䔀䄀㐀㔀䔀䈀㌀㤀䘀䄀㘀㜀㔀䄀㔀䈀䘀㘀㌀䘀㘀㤀䔀㔀㘀㤀㘀䐀䄀䐀㘀䄀䄀㔀䄀䐀䌀㈀㈀㌀㌀䈀䐀㔀㌀㔀䘀㠀㜀䐀㈀䐀㤀㘀㤀㘀䔀䔀㔀㄀㔀㘀㔀䐀䈀䈀㌀㐀㜀㔀䔀䐀䐀㈀䄀䔀㤀㘀䐀䄀　㄀䐀㜀㐀䄀䔀䐀㐀　䈀㔀䐀䄀　㘀㈀䄀㄀䘀㌀㈀㌀　　㈀䌀䘀䔀㈀㠀㘀㄀　䈀㤀㄀䘀䄀䔀　㤀䘀㔀䄀㄀　㤀䈀㐀㠀　㌀㘀䐀　　䔀㌀䄀㠀㈀䘀㈀㄀䔀㠀㌀㔀㐀䌀䐀㐀㄀㈀㄀䌀䄀㐀㘀㈀䄀㔀䈀㔀㌀䐀㤀䔀㠀㔀㈀㌀䈀㔀㠀䌀㔀䈀㐀䌀㄀㘀䄀㔀䔀　䌀㔀㘀䘀㌀㘀㈀䈀　䔀䄀㘀㄀㜀䄀㜀䐀䘀䈀䐀㔀㐀䔀㘀䘀䄀㌀㘀䌀㜀䈀㜀䈀䌀㤀㄀　㄀㔀㤀䘀㠀㘀䐀㐀䈀㜀㘀䄀㌀㈀㜀㐀䈀㈀㔀䐀䐀䐀䄀㄀㘀䄀䘀䐀　䌀㈀䐀䈀㄀䐀㘀㄀䌀㔀㘀㜀䌀䔀䈀䈀䌀㜀䔀㘀㌀㤀䐀䈀㈀㤀䈀㤀㐀䐀䐀㜀䄀㘀䈀㤀䐀㄀㄀㘀䄀䈀㐀㈀㌀㤀㐀㈀䘀㄀䘀㌀㄀　䌀䌀䘀䘀㠀䐀䈀㜀㄀㐀㜀㈀䌀䈀䔀䐀䐀㔀䄀㄀㠀䄀㤀㔀㘀䘀㤀䌀㠀䈀㔀䄀㔀㜀㘀㤀㐀䘀㈀䐀䌀䄀㌀㠀䔀䐀䘀㜀䄀㠀㘀䐀㄀䔀䄀㠀䄀㠀䌀㔀㄀㈀䈀㜀䔀㐀䌀㤀䄀㜀䐀䘀㐀㘀㌀䔀㘀㈀㠀䈀䈀䔀　䌀䘀䄀䔀㜀㠀㠀㘀䔀䄀㔀㄀㠀㘀㔀　㔀㘀䌀䐀䐀　　䌀䔀㔀㌀䘀䐀䘀㔀䌀䄀　㘀䌀䄀䔀䈀㈀㈀䈀㤀㐀㤀㔀䘀㤀㈀䘀䘀㌀䈀䔀䘀㌀㈀䘀㜀㌀䌀䐀䈀㄀㈀㐀㔀㌀㘀㔀㈀㜀㤀㤀䈀㔀㤀㔀㘀䐀䄀㠀䄀䌀䘀㈀䌀　㤀㤀䔀䄀䌀䌀㤀㤀㤀䐀䄀䌀㔀䄀䈀䘀㤀㌀㘀㄀䔀㌀㠀䈀䔀䌀㈀㌀㜀䄀㐀㜀䌀䐀䈀䔀䘀㄀㤀䄀䈀㔀䔀㘀　㐀䈀㠀㔀㔀㤀䘀　㤀㈀䄀㐀䄀㐀䐀㔀　㔀㄀㜀㈀㐀㈀㄀㘀䌀䔀㔀　㄀䐀㜀䌀㘀㔀㔀䌀䘀㘀䘀䔀䔀䔀㐀䌀䌀䐀䈀㌀㠀㤀㈀㜀㐀䈀䔀䐀㈀㐀䌀㔀㈀㜀㘀䘀㔀㘀㔀㘀㐀㔀䌀䈀㈀㤀　㄀㜀㘀㌀䘀㌀㐀㐀㔀㔀䐀䄀䐀㈀㤀㐀䐀䄀䌀䄀䈀㜀䘀㐀䄀㔀䘀䄀䌀㘀㤀䔀㤀䌀㔀㄀㐀㄀㔀䈀㌀䄀㜀䄀㠀㤀㠀㌀䐀㈀㔀䌀䈀䔀䄀㔀㜀䈀㌀㤀㘀㔀䈀㔀㜀䘀㌀䈀䈀䐀㄀㜀㠀䄀䐀㔀䌀䈀䘀䘀㔀䈀㄀䐀㄀㘀䘀䈀㤀㈀㌀䈀㘀㜀䘀㔀㜀䌀㔀㠀䈀䄀㤀㘀䄀㔀㔀㐀䌀㔀㔀䐀䔀㜀㈀䄀䄀䌀䄀䘀㠀䄀㘀㘀䈀䄀㔀㜀㘀㠀㘀䈀䄀㠀䄀㌀㌀䘀㘀㈀㤀䄀䈀䈀䌀䌀㜀　䌀䔀㤀㌀䐀㌀㐀㔀䈀㄀䘀㘀㜀㤀䄀䌀䄀䄀䄀㈀䈀㌀䈀㈀䈀䌀㄀䄀䔀䘀䈀㘀䌀䈀㔀䐀䄀㘀㜀㌀㜀䈀㤀䄀㔀㐀㐀䌀䐀㠀䔀䐀㤀䔀㜀䈀　䔀㐀　䘀䘀䈀㌀䐀㐀㜀䌀䐀㠀㤀㌀㤀䄀䄀㤀䘀㜀㌀㔀㘀㈀䄀㔀䈀㔀㈀㘀䄀䐀䘀㔀㌀㜀㌀䔀㜀㌀䐀㤀㔀㘀㌀䈀䌀䄀㜀䄀㈀䘀䐀㔀䌀㜀㔀䔀㘀䈀㤀㈀䐀䄀䌀㔀㜀㜀䌀㘀䔀䈀㈀㠀䐀㠀䘀㐀㜀㔀䐀䘀䘀㘀　㠀䔀䌀䘀㔀㔀䈀㄀㜀䌀䄀䔀䔀䄀䔀䐀㌀䌀㤀㔀　䘀䌀䘀㄀䈀㔀㤀㘀䄀㜀㌀㔀㐀㈀䘀㜀㌀㄀㈀㤀㐀䔀䐀䄀䈀㘀䌀䈀䄀䘀㔀㈀䌀　䈀䘀䌀㘀䐀㌀䌀䐀㘀䌀㘀㜀䈀㔀䄀䘀㤀䘀䈀䈀㘀㜀㠀䘀　䘀䔀㘀㘀䘀䈀㄀䔀䔀䐀㐀㌀䈀㔀䌀䄀㌀䔀㤀㐀㔀䔀㔀䈀㈀䘀䔀㌀㄀䘀㜀㈀㜀㌀䄀䐀㔀䔀㌀䈀䘀㜀㈀䄀䌀䔀　䈀㠀䔀㔀㜀䔀䐀䘀㜀㈀䌀䄀㈀䈀㐀㐀䌀㘀㤀䘀㠀㤀㄀䄀䄀䘀䈀㤀㄀䌀䄀㠀　㄀㘀䄀䈀㈀㠀䈀㠀㔀㠀䐀㔀㔀䈀䄀䌀䐀㐀㔀㠀䐀䌀㄀㄀㔀㜀䔀䔀㈀䐀㈀䈀㘀㄀㠀㤀䌀䄀䔀䄀㤀㜀㈀㠀䌀䘀䈀䌀㐀㐀䄀䐀䐀䘀㈀㔀㠀䐀㤀㐀㘀䐀㜀㤀㌀䈀㤀䘀䈀㔀㐀䌀㐀㔀㠀䄀㘀㔀㈀䄀㔀㈀㈀䌀㔀㌀㜀䔀㘀㤀䈀㤀䔀㌀㠀䘀㜀䈀䈀䌀㔀㈀䔀㤀䘀䈀䄀㔀䘀㈀㌀㤀㔀䘀㈀䄀䔀䘀䈀䈀㘀䄀㘀䄀䄀㤀䘀䐀㐀䄀㜀㤀㠀䄀䄀䘀　䄀㐀䄀䔀䐀䔀䄀䌀㐀㌀㈀㌀䄀䌀䄀䔀䌀㘀㌀䘀㔀㔀㔀㈀䈀䐀䘀䈀　䐀㘀䌀䄀㌀㜀㜀䄀䔀㌀䈀㈀䘀㌀㜀㜀䘀䔀㘀㌀䈀㄀㜀㔀䔀䘀䈀䘀䄀䐀䄀㌀㜀㔀䔀㔀㘀䔀㈀䘀䐀䐀㐀䘀㠀㠀䐀䈀䌀㐀䄀䔀㤀䔀䐀　㄀㜀　㘀䌀㄀㌀　㔀　䐀䔀㘀㐀䈀䈀䘀㈀䔀㜀䐀䈀㘀㌀㤀㔀㄀䐀䄀䄀䄀䌀䌀䄀㄀䄀䈀㜀䄀䈀䐀㄀䔀䘀㔀　䘀㌀㜀㘀㠀㜀㄀䄀䔀㤀　䔀㤀㔀䐀䘀䔀䐀㔀　䈀䈀䔀䐀㄀䐀㘀䄀㐀㜀㤀㔀䄀䘀䐀䄀䔀㜀䄀䈀䘀㘀㌀䈀㤀㔀㈀㈀㌀䈀㐀㌀䄀䌀㌀䐀䐀䌀㤀㤀䘀㌀㔀㜀㜀䈀䈀㠀㔀㌀㐀㔀䘀　㤀䐀㈀䄀㜀㘀䔀䌀㔀㈀䈀㌀㘀㄀㤀㜀㔀䄀㠀㄀䈀䈀㔀㐀㠀㘀䈀㤀㐀䈀㘀㤀䈀䐀㔀䈀䘀㔀㜀㐀䈀㜀㤀䄀㤀㄀䈀䈀㔀㔀㠀䘀㜀㘀䄀䈀㄀䔀䔀䐀㔀㄀䔀䐀䘀㜀䄀㠀䘀㘀㜀䈀㔀㐀㔀㐀䐀㤀㈀㌀㘀㜀䄀㠀䄀㌀䌀䌀　䌀䐀䐀䐀䈀䌀㐀䔀䔀㈀㜀䘀㜀䌀㘀㈀䈀㘀䈀㔀䈀㄀㔀㜀䈀䐀㜀䘀䔀㐀䘀䈀㤀䌀㈀㔀䔀䐀㔀䘀㜀䈀䐀㐀䄀䄀䐀㜀䐀㈀䄀㌀㜀䐀㠀䄀㜀䐀㐀䐀䘀䄀㜀㌀䌀䐀㔀㌀䔀㜀㔀　䘀㘀㌀䘀䘀㜀㠀㘀㔀䐀㔀　䔀䄀㠀㐀　䔀䐀㤀䌀　䄀　㘀䐀䈀䘀䈀㔀㐀䄀㠀㌀㈀㠀㈀䌀㈀㈀㠀䄀䈀䈀䔀㠀㔀䈀㈀䘀㜀䈀䌀䌀䌀㘀㠀　䄀㌀䈀䐀㠀䌀䄀䘀䈀㈀　䈀䘀㘀㔀䌀䐀㄀㐀䄀䄀㄀䐀㜀㘀䄀㄀䘀㈀㔀䈀㠀㔀䌀㌀㤀㔀㤀䐀䄀㠀㘀䌀䌀䔀㄀䘀䈀㐀㔀㌀䈀䈀㤀㠀㐀㈀䈀㔀㜀䄀　䄀䐀㔀　䄀㌀㠀䄀　䘀㘀㘀㘀　㜀䌀䄀㔀䈀㌀䌀䄀䐀㤀䌀䌀㌀　㜀㘀㈀㐀䈀䔀䐀㐀䘀䌀䈀䄀䐀㄀㄀䔀㐀䄀　䔀䐀㠀䔀䌀䄀㐀㄀䐀䈀㄀䐀㠀䔀㠀㌀䐀㄀㘀㔀䔀䔀䄀㌀䌀㤀㌀㜀㐀㜀㄀䄀䐀䄀㜀㠀　㜀㘀䈀䘀䐀㈀㌀㄀䐀㘀䐀䐀䌀㔀䔀㤀䔀㘀䌀䔀㌀䈀㘀䘀䈀㠀㈀㐀㜀䘀䄀㠀　䔀㔀㌀䔀䐀㔀䘀㄀㘀㐀䔀䈀䐀䔀䘀㠀㐀㐀㔀䈀㄀䈀㠀䘀䈀㌀䘀㄀㔀㠀䔀䈀䘀㠀㐀䔀䈀㐀䈀㄀䘀㄀䈀㈀㜀䈀㜀䈀㜀㤀䘀䌀㄀㌀㐀㤀㌀㘀㜀䔀䐀䄀䌀䄀㐀䘀㠀䔀䈀㔀㔀䔀䌀㤀䈀㌀㘀㄀㌀㘀㌀䔀䐀㠀㔀䄀䘀䘀䔀䌀㌀䔀㈀䈀㌀䘀㔀䘀䌀䐀䔀䄀㔀䈀㠀䄀䘀䈀㤀㐀䌀㤀䔀㐀㘀㐀㜀䘀㠀䄀㌀㌀㘀䐀䔀㔀㜀㌀䄀䐀䘀䌀㠀㈀䈀䈀㐀䌀㜀䐀㜀㤀䈀䔀　䈀䈀㘀㤀㤀㜀㔀䄀㄀䄀䌀㈀䘀䐀㈀㔀㐀㜀㤀䐀㤀䘀䄀㤀䐀㘀䐀䔀䐀䔀㌀㘀䐀䈀䌀㤀㌀䄀䐀㜀䔀㐀㜀㈀䈀䈀䘀㘀㠀㈀䈀䈀䘀㜀㠀䌀　㜀䄀䘀䔀㠀䈀　㜀㘀䐀䐀䌀㔀㘀㜀䔀㈀㤀䄀㘀䌀䌀䘀㤀䔀㐀㜀㠀㈀䔀䐀㤀䘀䄀㜀䘀䄀㤀㤀㌀㠀䐀䄀㜀㔀㤀䌀㜀㜀䘀㜀㤀㠀䘀㤀㔀䘀䘀㄀䌀㘀㄀䔀㔀㔀㜀㌀㘀㔀㤀㠀䘀㜀䘀䐀㔀㤀㘀㔀㔀㔀䐀㌀䈀㘀䐀䔀㔀䐀㜀㠀㜀㔀㤀㜀㤀㐀㤀㤀　㠀䐀䈀㜀䈀㐀䘀㄀　㐀䄀䈀㔀䔀㈀㔀䈀䈀䄀䌀䘀䌀䌀㘀㘀㐀㠀䌀㠀㘀㌀㜀㌀㤀㠀㄀㠀㘀㤀㘀䘀㘀䐀䔀㈀㜀䔀㜀㔀㘀㘀䔀䐀䐀㌀㤀㄀㌀㌀䄀䌀㠀䌀䄀㔀㤀䈀䌀㤀㔀㘀䈀㈀䐀㈀䌀䘀㌀㠀㤀䔀㠀䐀㔀㘀䌀㌀䌀䐀䄀䌀㘀㌀䈀䐀㠀㜀㠀㈀㜀㄀䈀䌀䘀䈀㈀㔀䌀㐀䘀䄀㈀䔀㜀䐀㠀䌀䄀䔀㜀㔀䄀䘀㐀㈀㐀㜀䄀䈀㄀㤀㔀㌀䈀㤀㜀㔀䈀䈀㤀㌀㄀䌀㠀䌀䄀㠀㔀䘀㔀㜀䄀㄀㌀㌀䘀㠀䄀㄀㤀䔀㌀㘀䘀䈀䌀㔀䌀㤀䔀㤀㔀　㜀㘀㐀㔀㠀㜀㤀㜀　㤀䌀䔀㔀䘀䄀㤀㈀㌀　㜀䘀㄀䈀䄀䘀㘀㈀䔀㔀㄀㄀㜀㘀㤀䔀㘀䘀䔀㔀㜀㜀䐀㔀䈀㔀䘀㄀䌀㤀㔀㘀㔀䔀䌀㤀䌀㘀㈀㌀㌀䘀䈀㜀䘀㄀㜀㌀㔀㘀㔀䔀䈀㤀䄀㜀㤀㔀㔀㜀㄀㤀㘀㜀䔀㔀㔀㔀㘀䐀䔀㜀䄀䘀㘀㘀䐀䄀䈀㠀䄀䘀㠀䐀㐀㜀㔀㠀䘀㔀䄀䘀㄀㘀㘀㤀䔀㔀䐀㔀㠀䘀㔀䄀㜀㤀䄀䐀㠀㔀䐀㘀䘀㘀㔀㄀㈀㤀㔀㘀㔀䔀䌀㜀㘀㄀䔀㌀㔀䐀䄀䐀䈀䌀䄀䔀䐀㌀䔀㈀䔀䘀㐀㤀䐀䐀㘀䄀㔀㘀㌀䔀䄀䔀䄀㠀㐀䌀㈀㘀㈀㤀㔀䘀䔀㜀㤀㜀㔀䈀䔀㜀㐀䈀䈀㄀䐀㔀㄀䘀㤀㄀㘀㈀䄀㜀㠀䐀䈀䈀䄀䐀䔀䈀䄀㄀䐀㠀䔀䄀㈀䘀㐀㤀㜀㄀䈀䄀㜀㔀㜀䔀㄀㐀㈀䘀䈀㔀䘀㈀㐀䈀　㌀䄀䐀䘀䌀㐀䄀㌀㌀㈀䈀䘀䘀㄀㔀䄀䌀䘀䌀䘀䄀㌀䄀　䈀䄀㜀㌀　䐀䄀䌀䄀㔀㤀䄀䌀㘀㔀㜀䌀䐀㐀䔀㄀㘀䈀䐀㄀㤀㌀㈀㘀䄀㐀㔀㤀㜀㤀䘀㜀㤀㄀㔀㘀㤀䔀㌀㈀䐀䔀䌀䄀　㜀㘀㐀㔀䈀䘀㤀䐀　㠀㔀㔀㘀㌀䔀㘀㘀䈀㤀㤀㔀㠀䘀㔀䘀㘀䈀䔀㔀䐀㌀㌀㘀㔀䈀䘀㤀䘀㐀　㈀㈀䈀㤀䘀㜀㜀䐀㈀䌀䄀㜀㌀㈀䘀㔀䈀䘀㤀　䄀㘀䄀䔀㔀㘀䈀㠀㐀㤀㔀㘀䘀　䌀㈀㤀㤀㌀㔀㜀䌀㤀㐀䘀䈀㘀㤀㔀䘀㔀㄀㜀㜀㈀䘀䌀䐀䈀䄀䄀㔀䈀䄀䔀　㜀䐀䐀㄀㘀㘀䐀㈀䈀䄀䘀㘀䘀䔀㌀㌀㄀㌀㘀䐀䔀䐀㘀䌀㘀䔀㜀䐀䄀䘀㠀㘀㄀㘀䈀㜀䘀䈀㘀㌀㜀㈀䄀㤀㌀㄀㤀䌀㤀㐀䘀䈀㘀㔀䈀䘀䐀㈀㄀䐀䐀䐀䔀䌀䄀䌀㘀㔀䈀䌀䄀㔀㘀䐀䔀㔀䘀㔀㈀㜀㐀㈀㌀㤀㌀㈀　㤀㄀㐀䌀䌀㜀㘀䘀㠀　㜀㐀㤀㔀㈀䘀㈀　㄀㌀㠀㤀䌀䌀㠀䄀㜀㐀㔀䘀䐀䐀　䘀䄀䘀䈀㌀㌀䘀㌀㠀䌀䌀㐀㜀㐀㔀㤀䔀䐀㤀㔀䄀䄀䌀㄀㌀䄀䈀䌀㔀㔀䄀䘀㤀㠀㤀㠀㌀㤀䌀㈀㄀㘀㜀㘀㐀䈀䐀㜀㌀㐀㐀䔀䔀䈀䐀㐀㤀㌀㄀㈀㤀　㘀㐀䄀㈀䔀㤀㄀㐀䈀䌀　䌀㐀㠀㌀䔀㈀㐀㄀䐀　䌀㐀㐀㌀䔀㈀㈀㄀㤀㤀㐀㤀㜀㤀㜀㌀㈀㈀䌀䄀㄀䔀㘀㘀䄀䐀䈀䐀㘀㜀䄀㌀䘀䔀䈀㐀㠀㈀䘀䌀㐀㐀㤀䔀㤀䈀㜀㤀㌀㌀㘀㜀䌀㈀㌀䌀䈀㈀㘀㔀㄀㐀㜀㠀䘀㜀㠀㄀㜀㔀㘀㔀㔀䔀㌀䌀㄀䐀䘀㈀䔀　　　㔀䌀㈀㔀䐀䔀䘀䘀䐀䔀䔀㘀㤀㐀䈀䐀㈀䄀㘀䘀㌀䔀　㤀䐀㐀㘀䌀㘀䐀䈀㘀㤀㌀䘀㠀䄀㠀䘀㤀㤀㐀㐀㐀㘀䘀㜀㘀䘀㄀㜀䈀㘀䔀䐀㘀㄀　㤀䄀㠀㤀䔀㌀䌀　䄀㠀䄀䘀䔀䌀䐀㌀　㤀䈀㐀㜀㤀䔀㈀䄀㐀䈀㐀㄀㔀㈀㐀㌀䘀㠀㔀㌀㘀㐀䘀䔀㐀　㌀㤀㔀㘀䌀㤀㜀䌀㐀㌀䌀䈀㄀㐀㜀䔀㈀　㘀㌀㤀㔀㘀㜀㜀䔀㤀㔀䐀㄀　㜀㄀㐀　䘀㘀㜀㔀䈀㔀㈀䌀䘀䐀　㤀㘀䐀㤀䔀㌀㠀㈀㠀䔀䐀㔀䄀䌀㤀　䘀䄀㄀䌀䐀㈀䈀㔀㌀䘀㌀䈀　䄀䄀㜀㤀㐀㐀䐀㔀㌀䌀䄀䄀㘀䄀㄀䔀㔀㌀㌀㔀㘀䘀䘀㘀䘀㜀㌀㄀䔀䌀㘀䘀㈀䌀䘀㘀䘀㜀㜀㄀䔀䌀䔀䘀䌀䐀㤀㈀㌀㠀㈀䌀㜀㤀　㈀㐀䈀䐀䄀㤀㘀㈀䐀㄀㄀㄀䈀䈀㄀㠀㜀㤀䈀䈀　㠀㜀㤀䈀䈀㄀㠀㜀㌀㜀㐀䈀䈀㘀㘀　䌀㤀㔀㘀㈀䌀䐀㤀㠀䔀㈀㔀㜀㈀㌀㘀㔀㈀䘀㤀㤀㈀㤀䈀㔀㈀㠀㌀㄀䄀㌀㈀㤀䄀䘀㤀㔀㈀㔀䘀䄀㤀㘀䄀　㔀䄀㤀㈀䄀㌀㌀㔀䈀㤀㤀㠀䘀㐀㠀䐀㔀㔀㜀㠀䈀䐀㔀䔀　㤀　㜀䐀䘀㈀䄀䔀　㌀　㘀䐀䔀䔀䘀㤀㘀㄀㄀㄀㘀㠀㤀㈀䈀㔀㈀㘀䔀䐀䘀㘀㔀䘀䈀㘀㄀㜀㈀㔀㐀䌀㌀㈀㐀䘀㔀㈀㄀㌀䔀㌀　㠀㐀㠀㐀㤀　㜀　㄀㠀㐀䄀䄀䄀㤀㌀䔀䄀㌀　㤀䌀㜀㐀㈀㐀㤀䐀㘀　　㐀㐀㤀㈀㘀䈀䐀㘀　㌀㐀䔀㤀㐀䐀㜀䄀㐀㌀　㘀㜀㤀㠀㔀䄀㐀䌀㈀㤀䈀㈀㐀㠀㌀㘀㐀䌀　䐀䈀㈀㐀㠀䈀䈀䌀　䈀䔀㌀䌀㠀㜀㤀㜀㈀㄀䔀䌀㘀㤀㌀䌀䈀䔀㐀㌀㈀㐀䌀㈀　䈀䘀㐀䄀䔀㜀㌀　䐀㄀㌀䈀㌀㔀㘀　㄀㈀㜀㔀㔀　　㜀㐀䌀䄀㘀㈀㘀㌀㔀㘀㄀　䄀䘀㔀䄀㌀㜀䔀㤀　㐀㔀　㌀㘀㠀　　䈀䌀㐀䈀㐀㌀㘀㤀㈀㠀㐀䌀䄀㔀㤀㔀㘀㤀㘀㔀㤀㠀㐀㘀㘀䈀䐀　㄀䄀㌀　㤀䐀䐀㘀䄀㔀㘀䐀㘀㄀　㘀㐀䐀䄀㔀䘀䐀㘀㄀㄀㔀㄀䐀㐀　　㜀䌀　㘀䄀㌀䄀㐀㠀䌀㘀䔀㐀㌀㔀䘀㐀㌀㔀㤀䄀　䔀㘀䈀䔀㤀㜀　㌀䄀㄀䌀䐀㘀䐀㄀㔀㄀㜀㐀㄀㐀㜀䌀㐀㌀㈀㜀䐀㈀㠀㤀㤀　㐀㜀䄀㜀䐀　㈀㤀䈀　㤀䔀䌀䔀䄀㔀㌀䈀㘀㄀　㌀䘀㌀䌀㠀㔀㤀㜀㌀㠀䐀㐀㔀䈀㌀㘀㠀㈀㠀㘀㄀㈀䐀㔀㠀㐀䈀䈀㠀䌀㄀㄀䔀㘀㔀㠀䘀㄀㈀䌀䄀㘀㘀䈀　㄀㤀㠀㐀㘀㤀䄀㤀䐀䄀㘀䌀䄀㈀䔀㤀䐀䐀䘀㐀㘀䔀䄀㐀䈀䔀䐀䔀㔀䐀䔀䘀㐀䔀䔀䔀䐀㔀㔀䘀䐀㈀㔀䘀㈀㈀䐀㄀㜀䄀　䘀䈀䐀　㜀㘀㤀䄀　䘀㜀䐀㌀䘀䈀㤀㄀㠀㘀㜀䄀㜀䘀䈀䐀㌀䘀䈀㤀㐀䘀㄀䘀䄀　　䘀㈀　㠀䐀䘀㐀㘀䐀㠀䔀䐀㄀䄀㐀䈀㄀䘀䈀㈀㤀㜀㜀㄀㜀㜀㈀䐀㘀㌀䐀䌀䄀㈀　䄀㐀䌀㐀䘀㐀㌀㔀㄀䘀䄀㘀䄀䘀㤀䄀䌀䘀㤀䈀䐀㤀䘀㐀㈀㌀㐀䘀㠀㈀䄀㜀㈀㜀䈀䐀䔀　㄀㤀䔀㈀㄀㤀㐀䈀䄀䘀　䄀㈀䄀㤀䌀䌀䌀㈀㤀㈀䄀㠀㤀㐀䄀䌀䌀㐀㜀㔀㐀㄀㘀㤀㔀㤀㤀䄀䘀䄀㠀㈀䄀䄀䄀㌀㈀㌀䘀㜀㄀䈀㜀䈀㠀㤀䈀䘀㤀㠀䈀㄀䄀䄀㈀　㘀㈀䈀㈀㜀㘀䄀㠀㤀㔀䄀䄀䌀䈀䌀䈀㠀㐀㜀䐀䌀䌀㌀㈀䄀㠀㠀㌀䄀䄀㈀　䔀　䈀㄀　䘀㔀㐀㐀㌀䐀㄀㘀㈀㠀䄀㈀㐀㔀㌀㐀　䈀㄀㈀　䐀㐀㔀㐀㌀㄀㘀㈀䌀㄀䄀㠀㤀㐀㘀㈀䌀㐀㐀㌀㐀㄀㄀㐀䐀㔀㠀䄀㠀㘀㠀㈀㘀㤀䄀䈀㄀㌀　㄀㄀㈀㌀㘀㈀㔀㠀䈀㠀㘀㠀㈀䔀㤀䄀䈀㌀　㠀䐀㄀㐀㈀䈀㐀㘀　㜀㜀㠀㤀㤀㘀䄀㈀㈀㔀䄀䈀㈀㠀㔀䄀㠀䈀䐀㘀䄀䌀㤀㈀㠀㠀㄀㜀䘀㄀㈀䌀㔀㈀㈀㐀㠀㠀　㐀㔀㘀㔀㤀㈀㐀㠀䄀㐀㐀㔀㘀㐀㔀㈀㐀㠀㤀㈀㐀㔀㘀㔀㔀䘀㐀㄀㈀䈀䐀㔀㠀㌀㔀䐀㄀㔀䈀䘀㐀㘀㘀㜀㜀㠀䈀㔀㜀䌀㐀㈀䈀䄀䌀䈀䄀䔀㠀㈀䘀䘀䄀䈀㌀㄀䄀㘀㈀㠀　㄀㠀䌀　㘀䄀㠀䄀㔀㜀䌀㔀䄀䈀䄀䌀㤀㘀㄀㠀㈀㈀㠀㘀䈀　䐀䄀䔀㈀㜀㔀䘀㄀㌀䄀䈀䈀㐀㜀㠀䌀㄀　㈀㌀㔀㠀㤀㐀㄀㠀㈀䐀㐀㘀䈀㌀㌀䄀㈀㈀㐀㌀㘀㐀䈀　䈀䄀䔀㈀㈀䐀䘀㄀㄀㘀䄀䈀㈀㜀䐀䔀㄀㘀㘀䘀䈀㌀䘀䄀㘀㈀䈀䌀㄀㠀䌀䘀䔀䔀㄀㔀㄀㌀䌀㔀㐀㐀㄀㘀㈀䐀㈀㘀㠀䈀䌀㤀䄀䌀㠀㄀䌀㠀㄀㈀㔀㤀䄀䌀䄀㄀㤀㠀㈀䄀䄀㘀䈀㈀䘀䈀䌀㐀㜀㐀㌀㄀㤀䐀㌀㔀㄀㈀䐀㤀㈀㈀㤀䈀㌀㔀㄀㘀䈀㌀䌀㐀㈀䌀䐀㘀㐀㐀䌀䌀㄀㄀㜀㌀㔀㠀㔀㌀㌀㄀㔀㜀䌀䌀㘀㔀䌀䐀㐀㐀㠀䔀䌀㠀㘀㄀䘀㜀㠀䈀　㔀㘀㈀　㄀㠀䈀㄀㄀　䈀䌀㔀㐀㈀䘀㘀㠀　㔀㠀㈀㐀㄀㘀䈀㄀䔀㘀㈀㈀㔀㜀䔀㐀䈀㈀　㜀䌀㔀䌀㜀䔀㈀㘀㌀䐀㘀㐀㈀㜀䌀㈀㈀㌀䔀㘀㄀　䘀㠀㤀㘀㔀㘀㈀㄀㤀㘀䈀㈀㤀㌀䔀㄀㔀㤀䘀䈀㈀㠀㜀䌀㔀㘀㜀䔀㈀㌀㌀䐀㘀㐀䄀㜀䌀㈀㄀䈀䔀㘀　㠀䘀㠀㠀㔀㔀㘀㈀㄀㔀㘀䈀㈀䐀䐀㘀㠀㠀㌀㔀䔀䌀㔀㄀䘀㄀䈀㔀䘀㠀㤀䄀䈀㔀㄀㄀䐀䘀㠀㠀㘀䘀䐀㠀㘀㌀㘀㈀䈀䐀㔀㠀䌀䘀㘀㈀䌀㔀䈀㜀䔀㈀㔀䈀䘀㘀䈀㠀䘀㠀㐀䔀㜀䌀䌀㜀䔀㈀䌀㐀䘀㜀䔀㈀㜀䈀䘀㘀㠀㐀䘀㠀㐀㄀䘀䌀䌀　䐀䄀㠀䄀㄀䘀䌀㔀㠀䘀䔀䌀㐀㤀䈀㄀㐀䐀㘀䌀㘀㌀䔀䐀䌀㐀　䔀䈀㄀㠀㌀㌀䐀㈀㔀㜀㘀㠀䄀㤀䐀䄀䌀䈀䐀䐀㠀㈀䐀㜀㘀䈀㌀䄀㜀䌀㔀㔀䔀䈀㄀㤀㜀㌀䐀㈀㌀　䄀㐀㔀㈀㄀㜀䈀㔀㘀㤀䌀㄀㄀㘀㜀㔀㠀　㜀㜀㄀㐀䔀㤀䌀㘀㌀䌀䘀㠀㤀㘀㈀㔀㄀䌀䌀㌀䄀㠀䄀㠀䈀䔀㈀㈀㈀㜀䈀㔀䔀㔀䌀㄀㘀㌀䘀䈀㌀㐀䔀㜀㈀䘀㈀㜀㘀㐀㄀䘀䘀　㔀䔀㠀䈀㤀　㠀䈀㤀㐀䄀䄀䔀㐀䄀㈀䘀㜀㘀㠀㌀䐀䌀㤀　䐀䔀㐀㌀䄀㜀㌀䄀㘀㠀䈀㠀䌀䔀㜀㐀㔀䌀㘀㜀　䔀㔀䌀㘀㜀㤀䌀㠀㘀䐀　㄀　㜀　䐀㈀㐀㠀㄀䄀　㤀㈀䔀㔀䄀㤀䐀㔀㘀　㜀䈀㜀㜀㜀㄀㘀㠀㈀䄀㄀㜀㜀䐀㔀䈀䈀㠀㈀䄀㤀㈀㜀䔀㠀　㤀䔀　䐀㄀㄀㌀䘀㔀㐀㐀㄀　㜀䄀㤀㈀㤀䔀　㐀㌀䔀㜀䄀㔀䘀䈀䐀㈀䘀䘀㠀䔀䄀䄀㤀㜀䄀㈀䄀䘀㠀䔀㤀㘀㤀㜀䄀㄀䄀䘀㠀㠀䈀㠀䄀䄀㈀㈀㈀㤀㐀㄀㌀㤀㄀㈀㈀㔀㈀䄀䔀䘀㄀㈀䄀䄀㈀　䄀㔀㐀㄀　䐀㔀㐀㐀㌀㔀　㠀㄀　䐀㔀㐀㔀㜀㔀　㠀㄀㐀㌀㔀㐀㔀㐀䐀　㠀㄀㈀䈀㔀㐀㔀㘀䐀　㠀㄀㘀㔀㄀㈀㈀　䄀㐀㈀㐀㐀㔀䐀㔀㄀㄀㜀㐀㈀䌀㔀䈀䐀䔀㈀㔀䔀　㠀㄀㌀　䐀㐀㐀　㌀　㠀㄀㜀䘀㜀㠀㤀䘀䈀㈀　㐀㈀㌀㐀㄀㘀㠀䐀䔀㄀㈀䔀䐀㄀㔀㐀㌀㐀㠀㔀㠀䄀䔀㈀㜀䔀㜀㄀㌀䘀㔀㐀㄀㈀　䘀㠀㠀　㜀䄀㐀䈀㜀䘀㈀䘀䄀䐀䘀䌀䄀䔀㠀㜀䘀䄀䈀㠀㠀㐀㜀䌀㐀㈀㌀㔀　㔀㔀䈀䌀㈀　㔀䔀㠀　㘀䄀䄀㈀㤀䈀䔀㠀　㘀㜀㜀㠀䈀䔀䔀䄀㈀㌀䈀㔀㐀㄀㜀㈀䘀㠀㤀㤀㜀䄀　㠀㘀㐀㠀㄀㘀䌀㤀㔀　㔀㌀䄀㐀㠀㠀㄀㐀䄀㠀㈀㔀䘀䄀㠀㠀㌀䔀㔀　㔀䈀䄀㐀㠀䄀㔀㐀䈀㠀㐀㜀䄀㐀㠀㤀㌀㐀㠀㠀㄀㈀　㌀䌀㔀㐀　䄀㠀㈀㌀䐀㈀㐀㔀㌀䄀䐀㐀㄀㔀㐀㌀䌀㔀㔀　䄀㠀㈀㜀㠀㘀㠀䈀䔀㄀㔀　㔀䘀㠀䌀㄀㈀䄀㌀䔀　㔀䔀㌀㄀㐀㘀㠀䌀㠀㄀㘀㠀㌀㄀㔀㘀㠀䌀㠀㔀　㘀㈀㈀㔀㌀㘀㐀㐀㈀㐀㌀䘀㄀㠀䔀㜀㠀　㜀䔀䔀㄀㌀㄀㌀䌀㐀　㐀㘀㠀㈀㐀㈀㘀㠀㤀㐀㤀䐀　㔀㠀㐀䌀㄀㄀㔀㌀䄀　㠀㤀㜀㠀㔀㜀䈀䌀　䈀㐀䐀䌀㔀㌀㐀㌀㄀㐀䐀䘀䄀䔀䈀㄀㤀㘀㈀　㘀䐀䌀㈀䘀㘀㘀㠀䄀㤀㤀㄀　㈀㌀㘀㘀㠀䈀䐀㤀䘀　㠀　㜀㠀㐀䘀䈀䌀　㜀䌀䐀䌀㔀㌀䌀㌀㄀　䘀㄀䔀㄀㐀䘀㌀䌀㔀㜀䌀㘀㠀㈀㄀䐀䔀㄀㜀䔀䘀䌀㌀㐀㌀䔀㈀　㌀䘀㄀　㄀䈀㐀㄀㐀㄀䘀㠀䄀　䘀䔀㄀㘀㄀䈀㄀㔀㠀㈀䌀㠀㘀㔀㘀㘀㈀㠀㤀㔀㠀　㈀㠀䘀㠀㠀䄀㔀㘀㈀㈀㤀䈀㐀㄀㘀䌀䈀䌀㔀㜀㈀㜀㠀㔀㐀䄀䌀㄀　㈀䈀䄀　㠀䐀䘀㠀㔀䌀㜀䌀　䔀㠀䘀㠀㤀㈀䘀䌀㔀㤀㜀㄀　㠀䈀䘀䔀䔀䘀㜀㄀䘀㐀㜀䘀㜀㄀䐀㈀㜀㜀䄀䔀㠀㌀㈀㜀䄀㐀䔀䘀䌀䌀㠀㌀䈀㘀㘀㈀㠀㌀䘀㐀㤀䔀㐀䘀㠀䄀㠀䐀䐀㈀䐀䈀䈀㘀㄀㌀㤀䈀䄀㐀䈀㜀㜀䐀㐀䄀㘀䌀㤀㘀䐀䔀䈀㘀䈀䐀䐀㠀㈀㈀䈀䐀䔀䌀䐀㌀㘀㈀䄀䈀䘀㐀䈀㈀䌀䘀㠀㠀䔀䐀䐀㈀䌀䈀㌀䔀㈀䈀䘀㈀㘀㔀䌀䌀䔀㠀㈀　㜀㘀䌀㤀㤀㠀䘀㄀㤀䌀䐀㠀㈀㌀㘀㌀㐀㘀㐀㜀㔀㄀㈀　　䄀䔀　㜀㤀㜀㄀㔀䄀㤀䌀㠀㘀㐀䔀䔀㈀䄀䌀㌀㠀　䈀㈀䘀㠀㠀䘀㌀䔀㈀㌀䌀䌀㐀㠀䈀　䈀䔀㈀　㈀䈀䌀㈀㠀㈀䔀㠀㤀㐀䈀䐀　㔀㤀㜀䐀㈀䈀䐀㜀䈀䈀䘀䈀㠀䘀㐀㘀㔀䘀䘀䈀㤀䔀㤀䌀㔀䈀㌀䄀㜀㤀㠀㄀䈀䌀㈀　㌀䘀䔀䔀㐀䔀䈀䄀䌀䈀㤀䐀䌀㔀䄀㜀䐀䄀䄀㜀㌀㈀㄀䘀䈀䄀䔀䔀䈀㠀　䔀䌀䌀㄀㤀䔀㌀㠀䌀䘀㄀㐀㘀䔀䘀䘀䘀䌀䔀䈀䔀䘀䘀䌀䔀䈀䔀㜀䘀㜀㠀䘀㘀㠀㔀䔀　䔀䌀䘀㌀㌀䔀䔀㌀䄀㜀䄀㐀㠀㜀㘀㌀䔀䘀㜀䘀䔀㜀䐀㠀㜀䘀䔀㜀䐀㠀㌀䘀㌀㐀䌀㜀㠀㠀䐀䔀䐀㌀㜀䈀㘀㜀㤀㐀㐀㐀䐀㈀㘀㠀䐀㘀㐀䄀䔀䈀　　㘀㄀㜀䘀㜀　㔀䘀㜀䈀㌀䌀㐀䌀㤀㔀㤀㤀䔀㘀㐀㈀㔀㠀　㈀㤀䘀䌀㌀㔀䄀䐀㠀　㠀㔀䈀㘀㄀　䘀㄀䌀㠀㐀㤀㌀䐀䔀䐀䘀㠀㘀䌀䈀㤀㐀䐀䘀㐀㄀㐀䌀䐀㜀㐀　㘀　䄀䔀㜀䔀䄀䔀㔀㐀䐀㜀䄀䈀㘀㠀䘀䈀䈀䈀　㘀䄀㄀㐀䐀㜀㌀䘀䐀　䈀䔀䐀　　䐀㜀㘀䈀䐀㈀䄀㘀䌀䄀㜀㜀䔀㤀㘀㠀㔀㌀㔀䐀㐀㌀䐀　䘀㘀㜀㜀　䐀㐀㔀㤀䈀䔀㘀㜀䄀㄀䐀䔀䐀　　䐀㜀㄀䈀䐀㈀䘀㘀㤀㜀䘀㔀㠀㘀䄀㌀㐀䐀㜀㔀㠀䐀㐀　䐀䈀䐀䘀㌀㔀㄀㈀㘀䐀㤀䄀㘀䈀㄀㐀䐀䄀　㄀䄀䔀㌀㄀䐀㈀䄀㘀䌀㤀㜀䄀㄀㤀㘀㠀㔀㌀㔀䐀㘀䘀䄀㈀䔀䐀䔀䘀㄀䄀㠀䈀㌀㘀䌀䐀䘀㔀㄀㘀䐀䄀　㄀䄀䔀䈀㜀䄀㔀㄀䐀㈀　䔀䈀㠀䐀㐀㌀㤀䈀䔀䄀㜀䄀　㜀㘀䐀㜀䘀䐀㜀㜀㠀䈀㐀㘀㤀䄀䔀　㤀㘀㠀　㜀䈀㠀　㘀　㌀㤀㔀䄀㔀䌀㌀㈀㐀䘀㘀㜀㜀㠀䐀㤀㘀㤀㠀䔀㘀䌀䄀㤀㐀㌀㠀䔀　㘀䘀㈀㠀㌀㈀　㤀㐀㜀䐀䔀䌀䘀㌀㔀㔀㤀㈀㤀㌀㌀㐀㔀㈀㤀㤀㌀䄀㔀㤀㐀㜀㤀㔀㜀㈀㤀㌀㌀㔀㔀㈀㤀㌀㌀㐀䐀㈀㤀㌀㈀㔀䐀㈀㤀㌀㈀㐀㌀㈀㤀㌀㈀㔀㌀㈀㤀㌀㈀㐀䈀㈀㤀㌀㈀㔀䈀㈀㤀㌀㈀㐀㜀㈀㤀䘀㈀㤀䔀㔀㈀㘀㐀㤀䔀㔀㈀㈀㐀㐀㜀㈀㤀㌀㈀㔀䘀㈀㤀䈀㈀㐀　㈀㤀䘀㈀䈀䔀㔀㈀䔀㐀　㌀䄀㔀䌀㠀㈀㈀䄀㔀䌀㠀㠀㜀㐀䄀㤀㄀㔀䌀䄀㔀䌀㠀㐀㜀㐀䄀㤀㄀㠀㤀㜀㈀䘀䌀䘀䐀㔀䌀䐀㤀䄀㠀䌀㠀㔀䌀㔀㐀㘀㐀䔀㄀䐀䘀㔀㐀䔀㐀㘀㌀䄀㔀䌀㠀㄀㈀䄀㔀䌀㠀㈀㜀㐀䄀㤀㄀䄀㔀㐀䄀㤀㄀㘀㔀㐀䄀㤀㄀㐀䘀㤀㔀㈀㈀㈀䈀䐀㐀㔀䌀䘀㤀㐀䌀㈀㤀䘀㌀䈀㤀㔀㈀䔀㘀　䈀䄀㔀䌀䌀㐀䄀䄀㔀䌀䌀㤀㜀㐀䄀㤀㤀㔀㔀㐀䄀㤀㄀䄀䘀㤀㐀㈀㈀㘀䈀㤀㐀㈀㈀㘀䈀㤀㔀㈀㈀㔀䘀㈀䈀㐀㔀䐀㘀㈀㤀㐀㔀䈀䔀㔀㄀㠀䄀䄀䌀㔀㜀㠀䄀㘀䌀㔀　㠀䄀㜀䌀䄀䈀㄀㐀䐀㤀䄀㠀㄀㐀䘀㤀㐀䔀㈀㤀䈀㈀㄀㠀㄀㔀㔀㤀㠀䔀㌀㌀㘀㔀㌀㔀㈀䄀㤀㈀䘀㜀㌀㜀㄀㔀䘀㤀㔀䔀㈀㤀䈀㈀㔀㤀㈀㤀䘀㈀㠀㌀㔀㈀㘀㐀㠀䈀㔀㈀䔀㐀㐀㜀䄀㔀䌀㠀㌀㘀䄀㔀䌀㠀㜀㘀䄀㔀䌀㠀　䔀䄀㔀㐀㠀䈀䔀㔀㈀㘀㐀䄀㜀㔀㈀㘀㐀䈀㜀㔀㈀㘀㐀㠀䘀㔀㈀㘀㐀䄀䘀㤀䄀㈀䈀䘀䈀㤀㐀㌀㈀䘀䈀㤀㔀㌀㈀　㔀㐀䄀㤀㤀㐀㈀䄀㔀䌀䌀　㄀䄀㔀䌀䌀㐀䘀㐀䄀㤀㄀㐀㌀㐀䄀㤀㄀䌀㌀㐀䄀㤀㄀㈀㌀㐀䄀㤀㄀䄀㌀㐀䄀㤀㄀㘀㌀㐀䄀㤀㄀㐀䐀䄀㠀䌀㠀㔀㘀㔀㐀㘀㐀㄀㜀䌀䔀㤀㐀㠀㌀㜀䘀㔀㌀㤀㄀㄀㌀㐀䄀㤀㄀㤀㌀㐀䄀㤀㄀㔀㌀㐀䄀㤀㄀䐀㌀㐀䄀㤀㄀㌀㌀㐀䄀㤀㄀䈀㌀㐀䄀㤀㄀㜀㌀㐀䄀㤀㄀䘀㌀㐀䄀㤀㄀㘀㈀䄀㔀䌀㠀　㔀䄀㔀䌀㠀㈀㔀䄀㔀䌀㠀㘀㔀䄀㔀䌀㠀䌀䘀㐀䄀㤀㄀㈀䈀㐀䄀㤀㄀㔀䘀㤀㐀㈀㈀䈀䘀㈀䄀㐀㔀䄀䔀㈀㤀㐀㔀䄀䔀㈀䈀㐀㔀㐀䄀䐀㐀㔀䌀䈀㤀㔀㄀䄀䄀㠀䌀㄀䈀㐀䄀㤀㔀㜀㄀㤀㌀㔀㈀㘀㔀䐀䌀䈀㐀㔀㐀㄀㤀㌀㜀㔀㌀䌀䄀㄀䌀㐀㜀㐀㔀㠀䄀㔀　㤀㄀㠀䈀䄀㠀䌀㠀㔀㔀䔀䘀㐀䌀䘀㄀䐀䔀㘀㜀䘀㌀䘀㘀㄀䈀㤀䘀㌀䐀㜀㜀㠀　㄀䄀㘀㐀㈀䈀㤀䐀䌀㤀㘀㈀䐀㤀㄀㌀㈀䌀㤀㄀䈀䐀䌀㐀㜀䄀䈀㈀㤀㜀㔀㤀㌀䘀䐀㘀㤀䘀　䐀㘀　䄀䘀䈀㈀䐀㜀䐀㠀㘀㠀㌀㘀㠀㘀㘀㔀䈀　㌀㜀䐀㤀㔀㠀䘀㘀㤀㘀䐀䌀　㔀㄀䘀㘀㐀㠀㜀䐀㠀㘀㄀㜀㘀㠀㐀㄀䐀㘀㔀䌀㜀䐀㠀㜀㄀㜀㘀㠀㈀㤀䐀㘀㐀䄀㜀䐀㠀㘀㤀㜀㘀㠀㘀㄀㔀䈀㄀䈀㌀䔀䌀㄀䌀㌀䈀䌀䘀㠀䄀䐀㤀　㔀㜀㘀㤀㄀㔀䐀䘀㈀㌀㐀㤀㐀䌀㜀䘀㔀㈀㄀㔀䈀䌀㠀㄀㘀㜀㤀㠀㈀㘀䌀㤀䄀　䐀㠀㐀㌀䐀䌀㘀㄀䔀　㌀䌀䄀䔀㈀㔀㠀㄀䌀㌀　㤀㘀䌀　䈀䌀㜀䘀㌀㜀㈀䐀㠀㤀䘀㔀　　　㜀䔀䈀䌀䈀䘀䄀㠀㈀㤀㌀䄀㔀䈀㈀㔀㐀㜀　䈀㄀㌀㐀㤀㘀㈀㘀㌀㌀㠀㄀㠀㄀㘀䌀㈀　㄀㠀㘀䌀㌀　㄀䈀　䌀㈀㘀㐀䈀㘀㜀㘀䘀㠀　㠀㜀㐀䐀㘀㌀䐀㌀䄀　㄀䌀䘀䈀㤀䌀㜀䐀　䘀䔀㔀㌀䐀　䐀㌀䌀　䐀䄀　䈀䄀㌀䌀㜀䄀　㠀䈀㠀䈀㔀　㠀䔀䐀㈀䔀䄀䐀䄀㈀㔀㘀㐀㤀㠀䈀䐀㐀㈀䄀㘀䈀㔀㔀䈀㐀䄀䄀㔀䄀㌀㔀䔀䐀㘀䔀䔀䘀䌀㠀㘀㐀㠀䘀㈀䔀　㄀䐀䌀䈀䌀㌀㜀䄀㄀㜀䔀䈀㜀䔀䄀䘀䐀䐀䈀㈀㄀䈀㈀㐀䌀䈀㘀䈀㤀㄀䈀㌀㤀㘀㄀䌀㤀䈀䘀䐀㔀䄀㠀䄀䔀㘀䄀䔀㐀㜀㠀䔀䘀㐀䐀䈀㄀㘀㐀㔀㤀　㈀㔀䄀㜀㤀㈀䐀㔀䌀䐀㘀䄀䔀䄀䔀㔀㔀　㜀䄀㌀㐀䌀䈀䈀䐀㈀䘀㌀㤀㘀䐀㜀㈀䄀㘀㠀　㄀㔀䄀䄀　㄀㘀䄀㐀　㔀㘀䈀㈀㄀㔀䄀䄀㠀㄀㘀㈀㘀䔀䈀䘀䔀㜀䔀㔀䔀䔀䘀㘀䘀㜀㔀㜀䌀㌀㐀㜀䘀䄀䐀㤀䌀䄀㘀㘀䈀　䔀㠀䐀㘀䈀㐀䔀䌀䐀䄀㔀䈀㤀㌀㔀㐀㌀㌀㌀㌀㔀㠀䘀㈀㘀㌀㐀㄀䘀䌀䐀㔀㜀䘀㌀䐀䔀䔀䘀䐀㈀䔀㐀䐀㠀㠀㘀䌀㠀㐀䔀㜀䄀䐀䈀㔀　䔀䐀㜀䔀㈀䐀　㘀㐀䌀䔀䐀㐀㄀䔀䐀㐀㄀㄀　䈀㈀䄀䌀㄀㤀㠀㐀䈀㈀㄀䌀䈀㘀㠀　㈀䐀㘀㈀㄀䘀䈀㄀㜀㔀䔀䌀㄀䈀㤀㘀䌀㜀䐀㘀䈀㌀　䐀䔀䌀㔀䈀䈀㘀㤀㄀㜀䐀䌀㜀㌀㘀䈀㄀䔀䘀㘀䘀䄀㜀㜀㠀䘀　㄀㜀䄀㄀㘀䘀㠀㐀㠀䔀㤀㐀㘀䐀㔀䐀㘀䌀㄀䔀㤀䈀㈀㜀㠀䘀㌀䈀㤀䘀䌀䐀㤀㜀㌀䐀䘀䄀㠀　㜀䐀㈀　㔀㔀䌀䘀㘀㔀䐀㈀㤀䈀㐀䄀䘀䐀䈀䔀㤀㘀㘀㜀㌀䐀䌀㠀㐀䔀㠀㄀　㠀䘀䔀㌀䌀䘀㠀㜀㌀　㠀　䄀㄀䐀㄀㘀㌀䄀　䌀㠀㈀㐀㌀㐀㜀㠀㐀㠀䔀㤀　䄀㌀䄀㈀㜀㈀㠀䐀㠀㐀䌀㠀䈀㘀䘀㌀㘀㔀㤀䈀㔀䌀㔀㤀䘀㜀　䈀䈀㘀㤀㈀㜀䐀䌀㤀㔀㘀䈀㄀䄀䘀䐀㠀㘀䄀䈀㘀㠀㘀䄀䐀㘀㔀㔀䘀䐀䘀䔀䔀䐀䄀䌀䈀㈀㌀㠀䌀䘀　䐀䔀㘀䐀㤀㌀䈀䐀䌀䐀㤀㄀䔀㜀㔀䌀䌀　㄀㘀䌀㠀㜀㌀㈀䔀㘀㈀㠀䈀䔀㐀㌀㤀㌀䘀㘀㈀䐀㈀㜀㌀䌀䈀䐀䔀㜀䘀㈀䘀䌀䘀䔀㤀㄀䐀䄀㌀㤀　䘀䐀㜀䈀㐀㌀㤀䔀㜀㌀䄀㐀䔀䌀㘀㔀䈀　㘀䌀㄀㌀　㔀䔀㔀㘀䘀㜀䈀㤀㘀䐀䈀㠀䌀㄀㜀䈀㔀㌀䐀䄀㠀䈀㐀䘀㔀䈀㘀䘀䈀㠀䈀䈀㌀㄀　䐀䈀㜀㤀㘀㜀㠀䐀㘀䌀䄀㜀䄀㜀䐀㈀㐀䘀㘀䘀䘀㤀䄀䐀㘀㔀䔀㤀䄀䘀㤀㘀㐀䄀㜀䘀㜀㤀䔀㌀䘀䐀䔀㔀㤀㈀䘀㜀䐀㜀㌀㜀㤀㌀㘀　㌀㈀㐀䌀䌀㄀㔀䘀䐀䐀㐀䔀㠀㔀㘀㤀㌀　㄀䐀㘀㘀㐀　㌀㘀䘀䔀䄀㘀㘀㠀䈀㘀䘀㐀㄀㐀䔀䘀䌀㤀䄀䌀㜀㜀㤀䔀㤀䌀㈀㔀䘀㌀㘀㄀　㄀䈀䌀㈀䘀䘀䐀䌀㘀　㜀䈀　　㠀㌀䔀㠀㐀㔀䌀䘀㠀　㠀㄀㘀䌀㌀䌀㜀䐀㈀㠀䈀㜀䌀　㈀㐀䈀㘀㄀㄀㤀㈀䌀㠀㜀㐀䘀㘀㄀　㔀㜀䌀㈀㘀㜀䐀䌀䄀㄀㜀䈀　㄀㈀䈀䔀㠀㐀㔀㔀䘀　㄀㔀䄀䌀㠀㘀㌀㔀䐀㈀䌀㌀㜀䌀　䐀䔀䈀䔀　㄀䈀䌀㠀㠀㌀䘀㔀䈀　　㄀䈀䔀㤀㔀䘀䔀䔀㘀㌀䈀䐀㠀　㐀䐀䘀䌀㌀㘀㘀䘀㠀　㄀䈀㘀䌀　㠀䘀䐀㈀䘀䈀㘀䌀㠀㌀䔀䐀䈀　　㌀䘀㈀㘀㄀㈀㜀䔀䌀㠀㈀䐀䐀䐀㈀㄀㜀䔀䐀㠀㔀㜀䐀䈀　㄀䘀　䄀䄀　㄀　　䔀䌀　㐀䘀䐀㈀㌀㌀㄀䐀㠀㈀䌀㌀㜀　　㐀㠀䔀䌀㈀㌀㄀㌀㠀　䔀㈀㜀䄀㐀㤀䘀㌀䄀　㔀䄀㜀䔀㄀　䌀㄀㐀㜀㤀䘀䘀㌀㈀㄀　㤀䌀㤀㜀㔀䔀䔀䈀　㈀㔀䌀㠀㐀㐀䈀㜀　㄀㤀㜀䔀㠀㘀㈀䈀䘀　　䈀㔀䌀㠀㔀㔀䘀䔀㄀㄀䄀㔀䌀㠀㜀㄀㈀䈀㠀㈀㄀䄀㜀㌀䈀䄀㄀㐀䘀䐀㈀㜀㘀䘀㐀㈀㤀䐀䄀㤀䔀㌀䔀㐀䐀㤀䘀䄀㄀䌀䘀䐀㈀　䔀䘀㐀㌀㤀䐀䄀㤀㄀㌀䔀㐀䘀㌀䈀䐀㄀㄀㜀㘀㠀㌀䌀㜀䐀㤀㄀㜀㘀䄀㘀㔀䐀㘀㠀㔀㜀䐀䄀㠀䐀㈀㘀䐀　䔀䔀㌀㐀㤀㄀䈀䔀㐀㐀㤀㌀㘀㠀　䘀䐀䄀㤀㌀䈀䔀㐀䌀㤀㌀㘀㤀㈀䘀㤀䄀㐀㈀㜀䈀䐀㌀㌀䔀䘀㐀㄀㔀㌀䄀㠀䈀䔀䔀䄀㈀䈀䈀䔀㤀㄀䔀䈀䄀㤀㜀䔀䔀䄀㌀䘀䈀㘀㤀　㄀㈀䐀䄀㐀　㜀䔀㠀㐀䘀䘀㐀㈀　㌀䐀㐀㐀　䘀䐀㌀㈀㌀䘀㐀㈀㠀㌀䐀㐀㘀㠀䘀䐀㌀㄀㌀䘀㐀㈀㐀㌀䐀㐀㔀㐀䘀㌀㌀㌀㜀㌀䐀㐀㌀㠀䈀㤀㠀㐀㄀䌀䘀䐀㈀㜀㌀䘀㐀㌀䌀㈀䐀䄀㘀㄀㜀䔀㠀㐀㔀㜀䄀㠀㤀㔀䔀䄀㘀㌀䘀䐀㌀㈀䈀䘀㐀㄀㜀㜀䄀㤀㔀䘀䔀㐀䄀䄀䘀䐀㄀䔀䈀䈀㐀㠀㐀䐀䔀㤀　䄀䔀㠀䄀㌀　䌀䄀㄀㠀䐀㌀㤀㠀䌀䔀㄀䌀㠀䌀㌀㌀㈀㜀㜀㌀䈀㄀㈀㜀㔀㤀㌀䈀䘀㘀㄀㐀㘀䈀䌀䘀㌀䄀䈀㄀㄀㜀㔀㠀㘀㜀䐀㘀㠀㔀䘀㔀㘀㈀䄀䘀䈀　䔀㄀㘀䌀　㐀㄀䈀䌀㤀㐀㘀䈀㄀　㤀䔀䌀㔀䐀㌀㘀㤀䐀㈀䐀㘀㘀㄀䘀䈀㌀㐀䘀䐀㠀㔀㈀䈀㘀㠀㈀㜀䐀䌀㘀㌀㘀䈀㌀㄀䘀䐀㠀㄀㘀䘀㘀㈀㌀䐀䈀䌀䄀䈀㘀䈀㄀䔀䐀㘀䌀　㜀䌀䈀㘀㜀㌀䈀䐀㤀㈀䔀䈀㘀㤀䈀䔀䐀㘀㄀㜀䈀䐀㤀㌀䔀䈀㘀㤀䘀㄀㔀䈀　㐀㈀㜀㘀㠀　䘀䐀䄀㐀㌀㔀䐀㔀㤀䄀㘀㤀㔀䈀䈀㔀㘀䐀䐀䄀㜀㘀㘀䐀㠀㜀㤀㘀䄀䘀䔀䐀䐀㐀㜀㘀㘀㤀䈀䈀䈀㔀㌀䐀䐀䄀㔀䔀㘀䐀㤀䘀䈀㘀㔀䘀㈀䈀䐀　　䄀䈀㔀　㌀䐀䄀㐀䘀䐀䄀㐀㄀䔀䐀㤀　㜀㘀㔀㠀㌀䈀䄀㈀㄀䐀䐀㔀㠀䔀㘀㤀䌀㜀䈀㔀㄀㌀䐀䄀㐀㤀䔀䐀㤀㐀㜀㘀㔀䄀㌀䈀䄀㌀㄀㔀㘀㤀㘀㜀䈀㔀㜀㌀䐀䄀㜀㤀䄀䐀㔀㠀䈀䈀䄀　㔀䐀䐀㐀㈀䔀㘀㤀㤀㜀䈀㔀㤀䘀䈀㔀㈀䈀䐀䄀㈀䘀䐀䄀㔀㔀䔀䐀㔀㜀䔀䐀㤀䄀㜀㘀㔀䐀㈀䈀䐀㄀㘀䔀䔀㠀㄀䔀䐀䐀㤀䘀㌀䘀䌀㠀㔀䈀䘀　㠀㜀㜀㠀㐀䈀䘀䔀㌀　㘀䘀䌀㔀㄀䘀䔀㄀䄀䐀䘀㤀䄀㌀䈀䌀　䐀㜀䘀㠀䌀䌀㜀䘀㈀䌀㜀㜀㤀㄀䌀㜀䘀㠀㈀䈀㜀䔀㔀㐀䘀䘀㈀㜀㘀䘀䌀㈀㤀䐀䔀㤀䔀㌀䘀䌀䐀㤀䘀䔀㄀䌀䘀䘀㈀　䔀䘀䌀㌀㤀䐀䔀㤀㄀㌀䘀䌀䘀㌀䈀䘀㄀㄀㜀㜀㠀㌀䌀㜀䘀㤀㄀㜀㜀䔀㘀㔀䐀㜀㠀㔀㜀䐀䔀㐀䐀䈀䔀䈀䄀䌀䈀䐀㜀㐀䈀䘀㈀䐀㔀㠀㌀䘀㜀䔀㐀㈀䘀䘀㌀㘀㐀䐀䔀㠀䈀䄀㜀䘀　䐀䔀䈀䌀　䘀㜀䘀㠀㔀䘀㜀䔀㔀䘀䐀㜀㠀㈀䄀䔀䘀䌀䘀䐀㌀䘀㠀　　㌀䔀㤀　䈀䘀䌀䄀　㜀䌀㤀䐀㜀㘀　䘀䔀㄀䄀㐀䘀䔀㜀㐀㌀䘀㠀㔀　䘀䔀㌀䄀㄀䘀䌀㘀䐀䘀䔀　䌀㌀䘀㤀　㠀㌀䔀㤀㈀㠀䘀䔀㈀䄀㌀䘀㤀㄀㠀㤀䔀䌀㄀䐀䘀䔀㐀㘀㌀䘀㤀㔀䈀㌀䌀㤀㌀䈀䘀䌀䐀䌀㜀䘀㄀㜀㜀䘀㠀㜀㠀㌀䔀㠀㄀㐀䘀䔀㐀㤀㌀䘀㠀㘀㐀㌀䔀㠀㔀㘀㜀䘀㄀㜀㜀䘀㤀㔀㐀㌀䔀㠀䐀㐀䘀䔀㜀㌀㌀㜀㠀㌀㘀㤀䘀䌀㤀㘀㜀䘀㄀䐀㤀㜀䌀　䔀㜀䘀㠀䘀䌀䘀䔀㔀㄀䘀䘀　㐀㔀䘀䌀㐀㌀㤀䔀䌀䈀㌀䘀䔀㈀㠀䈀䘀㤀䌀㜀㜀䌀　㤀䘀䘀㠀㐀㈀䘀䔀㔀䌀䈀䘀㠀㜀㈀䘀䔀㈀㤀㔀䘀䌀㄀㌀䘀䔀㌀㤀䘀䘀㌀㈀䘀䘀㠀㐀䄀䘀䔀㈀㔀㔀䘀䌀㔀䈀䘀䔀㈀䄀䈀䘀㤀㄀䄀䈀䔀㤀㘀㜀䘀䌀䐀䐀㜀䘀㄀㘀䘀㜀㠀㄀䔀㔀䘀䌀䘀㌀㜀䘀　㘀䘀䘀㤀㐀㘀䘀䔀㄀䐀䐀䘀䌀㐀䈀䘀䔀㜀㤀䈀䘀㤀　䘀㜀䌀　䈀䘀䘀㤀㄀㘀䘀䔀㔀䐀䈀䘀㠀㜀㘀䈀䔀㠀㌀䔀㜀䘀㌀㤀䐀㜀䌀㄀㜀䐀䘀䌀䐀䘀㜀䘀　䈀䐀㜀䌀㄀䘀䐀䘀䌀䘀　䈀㜀㠀㈀㄀㌀䘀䌀　㜀䘀䔀㈀　㜀䘀㤀㈀㄀㜀䔀㤀㠀㄀䘀䔀㄀㐀㜀䘀㤀㌀㄀㜀䔀㤀䌀㤀䘀䔀　㈀㜀䘀㤀㈀㤀㜀䔀㤀䄀㤀䘀䔀㄀㐀㔀䘀䌀㈀䌀㌀䘀䌀㜀䌀䘀䘀㌀㘀㈀㜀䔀㠀㔀䘀䘀䌀㈀䄀䘀䘀㈀㔀䘀䘀㤀㌀㔀㜀䔀㤀䐀㤀㜀䘀　㄀䈀㐀䔀㜀　㄀㈀㌀䔀㠀䘀䔀㜀䘀　䘀㤀㜀䌀　㄀㜀䘀㤀䘀㈀䘀䔀㐀㄀㜀䘀㠀㐀㔀㜀䔀㠀㤀㔀䘀䔀㘀㌀䘀䈀䈀　㜀䈀䄀㔀䘀㜀㔀　䘀㜀㈀䘀䘀䌀䈀㌀䐀䐀㠀䘀䐀㤀䄀㌀䈀䐀䐀㌀䐀䌀㐀㌀䐀䐀㐀䘀䐀䈀䄀㜀䈀㤀㠀䘀䈀　䐀䘀㜀㜀　䘀㜀　㠀䘀㜀㐀㠀䔀㌀㔀䘀䌀㘀㘀　䔀㌀㌀㔀㈀㌀䐀䐀㄀㠀㘀㈀　䌀㌀㔀㔀䔀㌀㜀㠀㘀㄀㤀㘀䘀㄀㠀䌀㌀㠀䐀㤀㄀䌀㘀㈀㠀㘀㌀䈀㐀㌀㄀䌀㘀䌀㠀㌀　䐀䔀㌀㐀䌀㘀㄀䄀㘀䘀㄀㤀㤀㤀䌀㘀䐀䈀䌀㘀㌀㠀㘀㌀䄀䄀㌀㄀䌀䐀㤀㠀㘀䔀䌀䌀㌀　䈀㈀㠀䐀㤀㤀䌀㘀㈀䌀㘀㌀䈀㘀㌀㄀䌀㜀㜀㠀䌀䘀㤀㠀㘀䈀䌀䌀㌀㌀㜀㈀㠀䌀䘀㤀䌀㘀　㈀䔀㌀㜀䐀㘀㌀䄀㄀䘀㄀㠀㄀䘀㄀䄀㄀㤀㄀㘀䈀㜀䌀㘀㐀㈀䌀㌀㘀㌀䔀㌀㘀㤀㘀㄀㠀㤀䘀㄀㠀㐀䈀㠀䐀㘀㔀䌀㘀㔀㜀䌀㘀㘀䄀㘀㌀㠀䐀䈀㄀䐀㘀䘀㠀䐀䄀㔀㠀㘀㜀㜀䌀㘀㌀䔀㐀㄀㤀㄀䈀㠀䐀䔀䘀㠀䌀䔀䘀㠀䐀䌀䐀䌀㘀　䘀䌀㘀㄀㘀䔀㌀㐀㜀㘀㌀䄀䈀䈀㄀䌀䐀䐀㠀㘀䔀䔀䌀㌀　䘀㈀㠀䐀㔀䐀䌀㘀㐀䘀䌀㘀㈀㄀䔀㌀㠀㠀㜀㄀䌀䌀㌀㠀㘀㄀㤀䌀㌀㈀䌀䔀㄀䄀䔀㜀㠀䐀　䈀䌀㘀㐀㔀䔀㌀㤀㈀㜀㄀䐀㤀䘀㠀䐀㤀䈀㠀㘀㈀䘀䌀㘀㈀㔀䌀㌀㔀㜀䔀㌀㔀䄀䔀㄀㤀㈀㔀䌀㘀　䐀㄀㌀㐀䌀㘀㈀㔀㈀㤀㌀㤀㤀㤀䄀䄀㤀㤀䈀　䔀䘀㌀㤀　㜀㤀䐀㠀㌀䌀㘀㈀㄀䔀㌀㔀㠀䘀㤀㤀䌀㜀䌀䐀㄀㌀䔀㘀㐀㤀䘀㌀㤀㐀㜀㤀䐀䄀㌀䌀㘀㌀㄀㘀㤀㤀㘀㜀䌀䐀㜀㌀䔀㘀㜀㤀䈀㌀䐀㠀䈀䌀㘀　㔀䔀㌀㐀㈀䘀㤀㤀㤀㜀䌀䐀㤀䘀䌀䐀㈀䈀䔀㘀㈀䘀䔀㘀㔀㔀䘀㌀㔀㜀䘀㌀㤀䄀㜀㤀䐀䐀㈀䌀㌀㄀㘀䘀㜀㠀䌀　㐀㌀㌀䌀䐀㐀䌀㌀㌀䌀㤀䄀㐀㜀䘀㜀㌀㠀㌀䌀䐀䌀䔀㌀䘀㐀䈀㠀㌀䌀㘀䔀㠀䘀䔀㄀㌀㄀㌀䐀㄀䔀㠀䘀䘀　䘀㠀㜀㠀㜀䌀㌀䐀㜀䔀㄀䔀㜀䘀㐀䘀㌀㤀㐀䘀㜀㤀㐀䘀　㔀㐀䘀㠀　㈀㜀䐀　㄀㌀䔀㐀　㤀䘀㘀㠀㐀㜀㠀㐀㈀㌀䐀㘀㄀㤀䔀㜀　㐀䘀㠀㐀䔀㜀㈀䔀㐀䘀㐀㔀㐀䘀㈀㔀㐀䘀䄀㐀䄀㜀䈀㈀䄀㜀㠀䄀䄀㜀䄀䄀䄀㜀㤀䄀㘀㜀㤀䄀㘀㜀䈀䄀㘀㜀㠀㘀㈀㜀䐀䈀㌀㌀䐀㌀㌀㌀䌀䈀㌀㌀䐀䈀㌀㌀䌀㜀䘀㌀㤀䔀㘀㜀䄀䔀㘀㜀㤀䔀㈀㜀䌀㜀㌀㌀䐀䘀䈀㌀㈀　㌀㐀㈀㤀㜀㐀㜀㠀䔀㠀㈀㠀㠀䌀㠀㌀䘀㠀㈀㐀　　䔀䘀䌀㠀　䘀䄀㄀㌀㌀䄀㤀䘀㐀䄀㌀㜀㠀㤀䘀㜀䐀㌀㘀㘀䈀㈀㌀䈀㌀㠀㄀㄀䐀䔀䌀㜀㄀㤀㤀　䐀䔀䌀㘀㐀㄀䐀䐀㤀䘀㌀䈀　㤀䈀䌀㔀䈀㌀㄀㜀㘀㄀㈀䘀䌀㘀䐀䔀䘀䐀䄀䌀　䘀䔀䈀　㌀　㔀㌀㈀㌀䔀䈀䔀　䔀㠀㔀㘀䌀㌀䌀㄀䈀　䘀㠀㜀㔀㠀㄀㘀䌀䈀㠀㈀䌀㌀㤀㠀　㜀㄀䌀䌀㄀䘀㠀㜀㘀㄀㐀䔀㌀䐀䈀㌀㄀㠀䌀㘀䘀䌀㜀㌀㄀䈀䔀㤀䐀㘀　䌀䈀䐀㤀䄀㜀㜀　㄀㈀䔀㌀䌀㐀㘀㤀䄀䐀䈀㄀䐀㘀㠀㐀　　䐀䔀䄀䘀䄀㜀䈀䄀㔀䈀㜀㜀㤀㌀䈀䄀䈀䄀䄀䘀䔀䔀㐀䈀䔀䄀䔀㄀㄀䐀䘀㤀䘀䄀㠀䔀㤀䘀㄀䌀㐀㜀䌀㤀㜀㄀㔀䔀㤀㜀㐀㜀㤀㌀㈀㈀䈀䌀㌀䈀㜀䘀䌀㄀㌀䐀䌀䄀㌀䐀㠀䐀㔀㈀䘀㜀㌀䌀䘀㜀㔀㜀㌀㐀䐀　䘀䐀䄀䐀䘀䈀　䄀䄀䐀㠀䘀䘀㜀䔀㠀䈀䈀䔀㈀䐀䐀䘀㤀㄀䌀㤀䘀㐀㠀㤀䘀㐀㠀䈀䄀䐀㐀㄀䈀㈀䐀䔀㤀㌀㈀㘀䘀䈀㐀䄀㐀䌀䈀㘀㔀䈀㘀㔀　㠀䌀䐀䘀㘀䐀㠀䌀㠀㐀䐀䄀㄀　㈀㜀㌀㌀䄀㠀䄀㤀㌀㈀㌀㈀䄀䌀㤀㈀㔀䔀㔀䈀㤀䔀䐀㐀㤀　㄀㄀㔀㄀㜀䌀㠀䈀䔀䘀㄀㘀䔀㄀㌀䈀䔀䘀㌀㌀㄀䔀㔀䘀　㠀㠀　㌀　㘀㌀䈀䐀䔀㐀㌀䈀㠀䐀　䐀㄀㈀㜀㜀㄀䈀䐀䘀㐀䄀䐀䌀㘀䈀㘀䌀䘀䄀䄀䐀䔀䔀㐀䔀䘀㤀㘀䔀　䐀㌀㠀㘀㔀㌀䔀㄀㈀　㐀㄀㄀㔀㈀䈀㤀㤀䄀䄀㔀㐀䘀㤀䘀㠀䌀䐀䐀䐀䔀䌀䘀㠀䐀䈀䐀㄀㈀䈀䘀㌀㌀䘀㘀㐀䈀䘀䌀䐀䔀㈀㠀㤀㐀䘀㠀㠀㌀㜀㄀䌀㘀䐀䈀㔀㈀㔀㐀䘀　㄀䔀㔀㄀　㐀㜀㠀㠀䘀㈀㠀　㈀䈀䐀㐀㜀䌀㐀㘀㌀㔀䐀䌀㜀䄀㌀䐀䔀㜀䌀䌀㘀䔀㌀㤀㈀䔀䌀㄀䈀䔀㄀㤀㘀䈀㠀㔀䔀㄀㠀㤀㘀㄀㈀㄀䘀㈀䌀䘀㄀䌀㔀㄀㈀㌀䘀㐀䈀㐀㤀㄀　㤀㘀　㐀㘀㌀㐀㤀　㠀㤀㘀䌀㠀䌀䌀㐀㈀㔀䔀䌀㜀䈀䄀䘀㈀㘀䄀㌀㘀䄀㈀㠀䐀㠀　䐀　䄀㘀䈀㐀㈀㤀㔀　䐀䄀㠀䄀䈀㘀　㈀㐀㘀㄀䘀䄀㔀㠀䘀㠀㈀㐀㘀㤀䘀䄀　㐀䘀㠀　䔀䔀㤀䔀䔀　㤀䔀　　　䔀䘀㜀䄀㜀䔀䔀㐀䘀㠀㄀䈀䈀䌀䘀䈀㤀䌀䘀䌀㤀䔀㌀㔀㄀㜀䐀　㄀䘀䐀䘀㄀㌀䘀㄀㐀㜀䈀䄀䐀㤀㄀䘀㜀㜀䘀㜀㜀䐀䌀䘀䐀䈀䘀㄀㌀㜀㤀䈀䐀䈀㄀䘀㔀䄀䘀䌀㘀䐀㌀䘀䘀㘀㐀㈀䌀䘀㔀䔀㜀　㤀㌀䌀㤀㄀㈀㜀䘀㄀㜀䘀䌀㤀䌀㠀䔀㐀㠀䐀䄀㠀　䘀䌀䈀㔀㠀㄀䄀㠀䈀㔀㄀䔀䔀㐀㤀㄀㤀䈀㄀㌀㈀㌀㄀㜀䔀㜀㘀㤀　䈀㄀䐀㌀㄀䈀㌀㔀㐀䈀㘀㌀㘀㘀䘀㜀䈀䘀㄀㠀㈀䐀　㜀䘀䘀　䘀㜀㄀䘀㈀䐀㘀㈀㠀䘀㤀䄀䔀㠀䌀㠀䘀䈀䘀㐀㜀䌀㘀䈀㈀㔀㄀䔀㜀䘀䘀䈀㔀㈀㠀䘀㤀㔀䈀㄀㐀㤀㐀䘀㄀㌀㈀㐀䈀䌀㘀䘀㔀䈀㈀䐀㄀䘀㈀㐀㄀㤀㤀㤀㔀㜀㠀㜀㌀㤀㈀䐀㈀㠀䌀䌀㐀㤀䈀㠀䘀䈀㐀㤀㔀㄀㤀䌀㤀㈀䘀㈀䄀㄀䘀䘀㤀㔀㔀㘀㘀㈀㌀䌀䘀䌀㤀㐀䌀㈀㐀㄀䈀㜀㌀㤀㄀㤀㤀㌀㈀㄀㌀䈀㤀㈀䄀㘀㜀䔀䐀㌀㌀㜀㈀䄀㘀䈀䔀䔀㠀㤀䐀㤀㜀㌀㜀㘀㌀㈀䄀䔀䐀㘀㔀㠀䐀䄀㜀䄀㘀䄀䘀䔀㤀㘀㜀䘀䄀㤀䈀䔀㔀䌀䌀䘀㈀㘀㘀　㔀㌀㌀䌀　　䌀㌀㐀㠀㌀䌀䌀㘀　㌀㌀䌀㐀　䌀㌀㔀䌀㌀䌀䌀㜀　㌀㌀䌀㈀䈀䌀䌀䈀䄀䌀㘀㠀㔀㘀㌀㈀㈀㌀䌀䐀䌀䄀㘀㘀㄀㔀䈀㌀䄀䄀㔀㤀䌀䐀䈀䌀䐀䈀䄀䌀㘀䔀䐀㘀㌀　㘀䈀䐀䔀㌀㘀　䄀㠀䘀䈀㠀㜀䐀㄀䌀㄀㘀㈀䔀䔀㄀㄀㘀䌀㘀㔀䘀㠀䄀䌀㘀㠀䈀㘀䔀㠀䐀䌀㜀䌀㈀㐀㜀䘀㠀　䄀䈀䘀㔀䈀䄀㈀䘀㈀㜀䄀㘀㌀㠀㌀䘀㄀㈀䐀䌀㘀䔀㘀㐀䐀䈀㜀㠀䐀䌀䔀㌀䈀㘀㔀㜀䌀䐀䔀㘀䐀䔀䌀㌀㔀䘀㘀㄀䈀㠀㔀㌀㜀䔀㌀䈀㐀　㠀㄀　㠀㄀㄀㠀䄀䈀䌀䘀䘀䌀㘀㄀䈀㐀䈀䔀㜀䔀㘀䈀䈀䌀㄀㘀㐀㄀㈀㈀㔀㠀㠀㐀䐀䌀㔀㄀䐀㐀䈀㘀䌀㐀㘀䌀䘀㌀䘀䄀㜀䘀㌀䄀㘀䄀㐀䈀　䘀㄀䘀㐀㜀㈀㠀䄀㤀㈀　䈀㜀䌀㈀㈀㄀䄀㐀㌀䄀㤀㐀㈀㜀㘀䐀㐀㤀㜀䈀䄀㠀㠀䌀䌀䘀䔀䌀䄀䈀㤀㌀㜀㠀䐀㈀㄀䐀㘀䄀㤀㄀㤀㜀䌀㠀㐀䈀㜀　㈀䘀䔀㤀㐀㄀㜀䄀㐀　㌀㐀㜀㤀㤀㤀䘀㐀㠀㈀　㘀䄀㐀㌀㜀㄀㤀　㐀㠀䐀䌀㠀㘀　㌀㈀　㤀㔀䄀㤀㈀䄀㤀㘀㐀　㘀䌀㐀㤀㌀㘀㔀䔀㐀　㜀䔀㠀㐀䄀䘀䈀䐀㈀㔀㐀㜀㠀㠀䐀䄀㘀䐀㄀䐀㜀㘀　㈀㠀㄀䐀㐀㈀㔀䘀㠀㜀䐀㄀䘀㐀　䐀㌀䄀　䄀䐀䔀䄀㐀㘀㌀䔀㠀㔀䈀㌀　㠀䔀䈀䔀㐀䐀䌀㜀䌀㌀㈀㐀㜀䌀䘀䄀䘀䔀㈀䔀㤀䐀㐀䌀䄀㔀䈀㜀䌀㜀㜀䈀　㐀䐀㤀䌀䌀㘀㐀䘀䔀㌀　㤀㌀㤀㔀㘀㜀䔀㔀㈀㄀㠀㜀　㔀䈀　㤀䄀㌀　㤀䘀䐀㔀㘀㘀㜀㔀㘀　㈀㔀䄀䈀䌀㜀㔀䄀䌀㈀㘀䄀䌀䌀　㄀䈀㘀㘀㌀　䔀䈀　　㌀㜀㜀㜀㔀䘀㤀䐀䄀㄀䌀䔀䐀　㜀㌀㠀䄀㤀䘀䈀䔀㤀㜀䔀㈀㐀㐀㠀䈀䘀䄀䌀㔀䘀㈀㘀䌀㄀䘀䄀㄀㔀䘀䐀　䄀　㤀䐀㄀䄀䘀䔀䄀㔀㜀㐀㤀䄀㠀㐀㌀䌀䄀㐀㔀䌀㈀㄀䌀㘀㌀㄀䌀㘀䘀㤀㄀㜀　䌀㜀䐀䈀㠀䔀　㤀㈀㐀䐀㈀㌀㄀䌀㤀㤀㄀㐀㔀䔀䔀㜀㘀㐀䌀㜀㔀䌀䌀㈀　䈀㔀㄀䌀㌀㌀㄀䐀　䈀㐀㤀㄀䐀䌀㜀㈀㈀䌀㜀㔀㈀䐀㈀䐀㐀䈀㄀䐀䌀㤀㄀㐀㜀㔀䄀㌀䄀㌀㘀㌀㠀䈀㘀㤀　䄀㜀㄀䐀䘀㤀㠀䔀㜀䌀㄀㈀䔀䘀䐀㠀䔀䐀䐀㠀㐀䈀㔀䔀㜀㐀䔀䌀㜀㜀㄀㐀㤀㈀䄀䔀㌀㈀㔀䈀䈀㠀㐀䔀䈀䄀㌀䈀㘀䔀䌀㠀㘀䌀㘀㄀㄀㠀㘀䘀䌀㠀㤀䈀㤀㈀㄀㔀䘀䌀㜀䔀䘀䔀　　㔀㤀䔀㔀䄀䌀䔀㄀䄀䌀㐀㤀䐀㘀㌀㠀㘀䈀㌀䈀䔀䈀㤀　䄀䘀㤀䐀䘀㔀㤀䌀䘀㔀䌀㠀㜀䄀㘀㜀㐀㌀㘀㜀㐀㌀䈀㈀䌀㄀䐀㤀䐀㠀䐀㤀㤀㠀㜀䌀䔀䈀㜀䐀䘀䔀㐀㘀㌀㘀㌀䄀㤀䈀㌀䈀㤀䈀㤀㌀䔀䘀㤀䌀㈀䐀㤀䌀㈀䐀䌀㠀㈀㘀㘀㜀㈀䈀㘀㜀㈀䈀䘀㈀䈀䐀䘀㌀㔀㄀䔀㜀䄀㌀㘀㐀䈀㌀㌀㌀䐀㘀㄀㤀㐀䈀㜀䔀㜀　䈀㘀㜀㜀䈀㘀㈀㜀㔀䈀㤀䌀䌀䘀㌀䄀㤀䘀㈀㔀㌀䘀㌀䄀㌀䈀㌀䄀㌀䈀㤀㈀䄀䐀䌀䔀㄀㜀㤀䐀䐀䐀䌀㠀㌀㘀㘀㜀　䘀㘀㜀　䘀䈀㈀䌀䈀䄀㔀䈀㤀㌀㐀䈀㈀䐀䈀䐀䐀䐀㔀䐀䐀㠀䐀䔀䌀㜀㄀㜀㜀㜀㜀㈀㜀㤀㄀㜀䐀䔀䔀㤀䔀䔀䔀㔀㐀㜀㈀䌀　㤀䐀䔀㘀㐀䔀㈀㌀䄀㜀㘀㐀㤀䌀㤀䐀㐀㘀㐀䔀䌀䈀㌀㠀䘀䈀㄀㔀䈀㤀㈀㐀䔀㌀䔀䌀㄀㔀㔀㈀㘀㈀㔀　䔀㌀㜀㤀䌀䄀㠀䐀㄀㜀㠀䌀㐀㄀䈀㐀㠀䈀㌀㤀䐀㌀㌀䌀㐀㠀㠀㜀㜀㠀䐀䔀䘀㈀㐀䌀䄀㔀㔀䘀㤀㜀㜀䔀㌀䘀㐀㘀䔀䔀㔀㈀㜀㌀䘀㄀㠀㤀䌀䐀　䈀㈀㐀㔀㄀㜀䐀䈀㈀䈀䌀䌀䌀㈀㜀㐀㐀䔀䔀䘀䔀㄀䐀㈀䄀䘀㜀䄀㠀㠀㘀䐀䘀䌀䐀䄀㜀㌀㈀䐀䄀䌀䔀㐀㌀䌀䌀㤀㔀㔀㤀䌀㄀㌀䌀䈀㐀㔀䔀䘀㘀䄀㔀㘀㈀㔀䘀㐀䄀䈀㘀㔀䘀䈀䔀䈀䌀䐀䘀䐀㈀䄀㤀㐀㔀㘀䄀䌀㤀㔀㤀㄀㌀㐀㔀䄀㈀㘀㐀䈀㠀㘀䈀㐀㐀㄀䄀䌀㤀㘀㌀㌀䔀㐀㈀㄀䔀㤀㄀䌀㄀䔀㔀㌀㄀䘀㈀㄀㠀㘀㠀㈀㐀㠀䈀㘀㐀䔀㄀䈀㜀㜀㐀㌀㘀㐀　㄀㜀㌀䐀㐀㐀　䘀䐀㔀䌀㌀䘀㐀㜀　㌀䐀㐀㈀䈀䘀㐀䈀䄀䘀䄀㠀㔀㜀䐀㈀㈀㌀䘀㔀䌀䄀㜀䄀㄀㔀䈀䐀䄀䄀㔀䔀㐀䐀䈀䘀㔀䈀䄀䘀䄀䔀䐀㜀䐀　㘀䈀䔀䄀䈀㔀䘀㐀䐀䄀䘀䄀㌀䐀㜀䄀㤀㐀㔀䔀㐀㜀䄀䘀䄀䈀䐀㜀䐀㌀䔀䈀䔀䈀䘀㜀㤀㈀㘀䐀㘀㐀㌀䈀䐀㤀㐀㄀䘀㈀䌀㤀㐀䔀䈀㈀㠀䈀䔀䌀㈀㘀㜀䈀䌀㠀㔀䔀䈀㈀㠀䘀䔀䌀㈀㜀　㔀䄀㐀㤀　㄀䌀㈀　㌀䘀㤀㄀㠀㌀䔀㐀㄀　㌀㤀㐀䌀㠀䔀㤀　䄀㌀䔀㐀㄀㠀㌀㤀㐀䔀㐀䔀㤀　㤀㌀䔀㐀㄀㐀㌀㤀䄀䐀㌀㄀㐀䐀㘀㌀㤀㜀䐀㤀䌀䘀䔀䌀　䄀䘀䈀㠀㔀㔀䐀㘀㔀䈀䘀䈀㈀㘀䈀䔀䌀㌀䄀㈀䈀㘀㄀㌀㜀䘀䔀䌀䔀㘀㜀㤀䄀㄀䌀㠀䄀㐀㘀䘀㄀　䔀㠀㐀㠀㘀㜀䘀　䈀䐀㘀　䘀䔀䘀㄀䐀　㔀䌀㤀㄀㜀　㌀䔀䘀㔀䘀䔀㌀䐀㘀䘀　䄀䘀䄀㤀䔀㠀㔀㈀㌀䐀䔀䘀㌀㜀䄀䔀䈀䐀䘀䘀㔀䈀䌀䐀㈀㤀㔀㔀㘀䐀㈀㈀䘀㌀䌀㐀㘀㘀䘀㈀䔀㔀㠀㘀㄀㠀䘀㤀㌀㈀䘀　䈀䘀㜀㄀㤀㠀䘀　㤀㠀㜀䌀　㤀㜀㠀㔀㘀䈀䔀㜀䌀䘀　㈀䘀䔀㘀䘀㠀㐀㈀䈀䌀㜀䌀䘀㤀䔀㌀䘀䘀䐀㔀㈀䈀　㜀㐀㤀䘀㈀㔀㔀㄀䔀䘀䘀㜀䔀㐀㤀　㔀䘀䌀㤀䈀㔀㄀㠀㄀䘀㠀㄀㜀䈀䔀㠀㌀䔀㔀䔀䄀䄀㐀㄀　㐀㈀㜀䌀㠀㠀㈀䘀㠀㐀䌀䄀㌀㔀㄀䄀　㈀䔀㄀㈀㐀㠀㈀㐀㐀㐀　　㐀㜀䔀䈀䈀䔀㘀㈀䔀䈀㤀㔀䔀䐀䈀㐀㈀㐀㔀䈀㤀㔀䔀㌀䈀㐀㈀㈀㔀㜀䌀㈀䄀㄀䌀㠀㤀㈀䈀䈀㔀㌀㈀㐀㤀㈀㘀䌀㤀㔀　　㔀䈀䘀㘀䘀㔀㌀㤀㔀䘀㐀㈀㜀㘀㤀㔀　㠀䐀䈀䌀㐀㘀㔀䔀㤀㌀㘀䈀㜀䄀　䌀㄀㤀　㌀㌀㔀䌀㠀㤀䈀㘀㐀㈀䌀䐀㐀㈀㐀䔀㌀䌀㠀㌀㠀䄀㠀㈀䐀㔀㜀䘀　㔀㐀䈀㠀㐀㜀䄀䔀䔀　㘀㔀㄀　㐀㔀㔀㘀㤀㌀㌀㔀㔀　㠀㜀䔀㐀㤀㄀䘀㔀㔀　㠀䘀㘀䌀㈀㈀㤀䈀䔀　㔀䔀䈀䌀㔀䘀㄀㔀㠀䐀㈀䈀䄀䘀㈀㄀㘀㘀䐀㤀㘀䐀䘀　䄀䔀㔀㔀㌀䌀䐀䔀䈀㔀䔀䄀䘀䌀䐀䈀䈀䐀䈀㐀㜀㔀䔀䄀㔀䔀䐀䄀㜀䌀䄀㤀㔀㐀㌀㠀䄀䐀㐀㜀䔀䈀䌀㤀㠀䌀䈀㄀㈀㄀㘀䐀㈀㠀㌀㌀䌀㘀㤀㘀䈀㐀䄀㔀䌀䌀㄀㠀䐀䈀䐀　㌀㘀㌀㈀㘀㌀㘀䌀㐀㜀䐀䈀䌀㤀㠀䌀䘀㄀㔀㤀䘀䄀㈀䌀䔀㠀㌀㈀䔀䘀䔀㤀　䔀　䔀㤀㤀䘀㄀䈀䌀㈀䌀㌀㌀䌀㘀䐀㄀䔀䔀　䌀㜀　䈀䄀䌀㜀䈀䄀䌀㜀㠀㄀䔀㄀䌀䔀㜀㄀䌀䘀　㜀㔀䘀䘀㜀䘀䈀䔀䔀㐀㔀䔀　䔀䘀䌀䔀㜀㜀䔀䘀㠀㐀　　䘀㜀㘀䔀䘀㜀㌀䔀　㠀㜀㈀㄀㜀䈀䄀　䘀䌀㤀㔀䌀㜀䄀䈀　㤀㄀　䔀㤀㔀㘀㐀䘀㐀㄀㠀　䔀㔀㔀䈀䌀㤀㄀　㄀㘀䄀䌀㠀䌀㠀㌀　㄀䈀㘀䄀㜀㤀䘀䐀㌀㠀䐀㐀㤀㄀㜀䔀㌀䌀㄀䘀䔀䄀㐀㤀䔀䘀䈀䐀㄀䘀㄀䄀㐀㠀　䘀㔀䔀　㠀　䐀䄀㔀　䘀㌀䘀　㐀䘀㜀㐀㤀㌀䘀㜀䔀　㐀㄀䄀䌀㤀㌀䐀䐀㜀㌀㄀㘀㠀㈀䌀㜀䐀䘀㤀　㤀㘀㠀㈀㈀䘀䐀䘀㤀㈀㤀㘀㠀㈀䄀㜀䐀䘀䄀㄀㤀㜀㤀㠀䐀䈀䌀䐀䘀㄀䘀㘀䈀㐀䄀㌀䈀䘀䐀㌀㘀㤀㘀㠀䐀㘀䄀㈀䌀㔀䔀䐀䘀㄀㠀㘀㄀㄀㤀㐀䈀㘀㌀䐀䄀㔀㠀䐀㘀䘀㔀㠀䔀㠀㠀䐀㄀䈀㘀㜀㈀㜀㜀䄀㌀䔀㄀㠀㠀㜀㐀㄀䌀㤀㄀㐀㌀䔀㘀㜀㜀㄀䐀䔀㄀䘀䘀䈀　䘀㜀㈀㔀㜀　㔀㈀㄀㔀䐀㜀䐀䔀䄀㜀㘀䔀䌀䘀䐀㈀䐀㌀䐀䐀㌀㌀㜀㌀䈀䈀䄀䄀㘀䔀䌀䘀䔀䐀㘀㄀㄀㄀㜀　㄀㠀㘀　㄀㠀㠀㘀㘀㄀㄀㠀㠀㘀㜀䐀㠀　㘀㄀㄀㔀㄀　㘀㄀㐀　㤀㘀　㄀　㐀䐀㤀㐀㔀䘀㘀㐀䐀㐀㐀㐀㄀㐀㐀㠀㈀䌀㐀㈀　　䄀㈀㈀㈀䄀䘀䈀㈀㘀䈀㈀㠀䈀㠀㠀㘀䌀䈀㈀㠀䈀㠀䄀㐀䈀㠀㠀㌀㄀䌀㘀㈀㠀㈀㄀㘀䄀㠀䌀㈀㄀䌀㘀㄀㠀䈀㜀䔀㜀㔀㌀㌀㐀㈀䌀䐀䘀䄀㤀䘀䘀㌀㐀㐀䐀㔀䘀㤀䘀䐀䘀䌀䈀㐀䈀䈀䔀㈀㔀䔀䘀䘀㜀䘀䈀㌀䔀䘀䄀㌀㜀㔀㔀㤀㜀䘀㌀䔀䘀㜀䈀䄀䈀䔀䄀㤀䌀㔀㌀㘀㜀䄀㤀䈀䄀䘀㜀㜀㘀㈀䄀䌀㘀䔀㔀䔀㜀䔀㠀㘀䐀㌀㈀䄀㔀㘀㄀㔀䌀　㄀㠀䌀㈀䈀㄀䐀䔀㌀㤀㈀㄀㠀㤀㜀　䔀䔀䌀　䄀䔀䌀䔀㘀㄀㄀䔀䐀　㤀䔀䌀䄀㌀㈀䄀㄀㠀㘀㌀　䐀㠀䌀䈀㄀㔀㘀䔀　㐀䘀㠀㄀㌀䘀㔀㌀㘀䔀䔀　㈀䘀㠀㄀䌀䘀㜀㤀㔀䌀㘀㘀䄀㐀　㔀㄀㠀㘀㤀㈀㌀㠀䌀䈀㐀　㐀㈀㌀㘀䐀䌀㘀䘀䔀䔀䘀㐀㤀䌀䔀　䘀㤀䔀䔀㈀㈀䌀䄀㌀　䐀㐀㘀䐀䐀㄀㄀䄀㌀䔀䔀䌀䌀㜀䔀䔀㤀㄀䈀䔀䄀䌀㘀㔀䔀䔀㤀㄀㈀㤀䔀㜀㘀䈀㈀㌀㠀㌀䄀㄀䘀㄀䈀䐀䈀䈀䐀䔀䐀䌀䔀䘀㌀㜀㌀　㐀㐀㘀䈀㐀䐀㔀㠀䌀㔀㄀㤀㐀㘀㌀䐀䔀㔀㌀㤀䌀㐀㈀㔀㠀　䈀䈀㔀䌀㐀㄀㠀䐀㄀㌀㘀㐀䔀䈀㌀㐀㐀㄀䘀㘀㄀㤀䔀䘀䈀䐀㄀䘀㄀䔀䘀䘀㄀　䌀䘀㠀㄀㄀㔀䔀䈀㐀䈀㈀㔀䄀㌀㄀㈀䘀　䌀㐀㜀㤀㈀㈀　䔀㌀㘀㐀䘀　㈀㔀　㔀㜀䌀㐀㤀　㔀㔀䘀䘀䌀䔀　㐀䈀㄀䄀䌀㜀䈀䐀㠀㌀㈀㤀　　䔀䔀　㐀㈀㄀䘀㔀㄀　㜀㠀㤀㐀㄀䔀㄀㠀㄀　㄀㠀㐀　㄀㤀㤀䌀䈀㄀䌀䘀䄀㄀㐀䌀䌀䔀䌀㜀㤀㘀䈀㈀䔀䌀㤀㜀　㔀㔀㘀㔀㈀㔀㔀䌀䔀䌀䄀䘀㘀㔀㄀㐀䔀䔀　㐀　䔀　㄀㠀㤀㔀㜀　㘀䔀䘀㘀㌀㤀㤀㔀　㘀䈀䔀　䌀㔀䌀䄀　㤀㄀㄀䌀㐀㌀䐀䌀㐀䘀䔀㌀㌀㤀㔀䄀㜀㠀㤀㠀㘀㘀㜀㄀㜀㐀䈀　㠀㌀䔀㘀䈀㄀䔀䘀㜀䘀㠀䔀㄀䔀㘀㔀㔀䘀䘀䘀㈀䔀䄀䐀㠀㘀䔀䌀　䘀㐀　䘀㘀　㜀䐀㤀㠀㌀䘀䘀㤀䔀　䔀㐀㄀　㌀㤀䔀㠀㜀　㘀㄀䌀㠀㘀　㘀㄀䌀㠀㄀　㘀㄀䌀㠀㔀　㘀㄀䌀㠀㌀　㘀㄀䌀㘀㜀䌀䘀䘀䔀㌀㤀㤀䐀㘀　䔀䘀䘀䔀㈀㔀㤀䐀㘀㐀　䘀㜀䘀㠀㤀㔀䔀㘀　㜀䘀㤀䔀㐀㈀㘀㜀㌀㠀䌀㘀㜀㄀䔀㤀㘀䐀㠀䔀㘀䈀㘀䄀䐀㈀㜀䈀㄀䌀䌀䈀䔀㐀䐀㄀㜀㤀㠀䔀㐀䄀㠀㈀䘀㐀㄀㤀㐀㜀㄀㜀㘀㄀䘀䄀㤀㈀㜀䐀㜀䌀㌀㘀㘀㜀　　㘀䌀　㤀㌀㤀㐀㌀㤀䄀㐀䌀㘀㐀㜀㈀㐀䄀㈀䄀㌀㌀䄀䈀　䘀䐀㐀䌀䈀䐀䌀䘀㜀㐀㔀䈀䐀㠀㌀㜀㜀㠀㔀㌀䄀䐀㈀㄀㤀㌀䔀䄀㜀㤀䄀㜀㠀　㈀㜀㜀㐀㔀䘀䄀䄀䔀㐀㤀　㐀䌀䘀䈀㠀㄀　㘀㜀㌀㐀㐀㘀䔀䈀㜀䄀㈀㘀㐀㠀㘀㐀䐀䈀㌀㔀㠀㤀㔀　㄀䘀㈀䄀㠀䐀䐀㌀㈀䌀㘀䄀㐀䈀㜀㤀　㤀㄀㈀䐀㤀㘀㘀㔀㘀䄀䐀　㌀䄀䈀　㈀㤀䈀䈀㠀䔀㔀䔀㌀㠀㄀䐀㌀䄀䌀㘀䐀䐀䘀　㔀㠀䐀䘀䔀㌀㈀㄀㔀㤀㤀㜀㜀㘀㔀㜀䘀㘀䄀䄀㈀㈀㜀㠀㔀䈀㄀䐀㘀䈀㄀䐀䄀䘀䈀䌀䘀㔀㠀㔀㘀㌀䔀䐀㌀㠀㄀㄀䐀㈀㈀䐀㠀㈀㄀　㄀㌀䈀䔀㐀㠀㌀㄀䐀㐀䄀㠀㈀㄀䐀㐀䄀㠀㘀㄀䐀㐀䄀㠀㄀㄀䐀㐀䄀㠀㔀㄀䐀䘀㈀䌀㌀　䔀䄀㔀䌀㄀　䔀　㔀㘀　㠀㜀㠀㈀䈀　㐀㌀㈀㄀䐀㠀䄀㄀　䌀䐀㠀䄀㄀㐀䌀䐀㠀㈀㄀㄀䈀㜀㘀㐀㠀䌀㈀　䔀㈀㤀䐀㠀㈀㄀　䐀㌀䈀䔀㐀䌀　　䔀㘀㔀䌀㄀　䔀㐀㔀㐀㤀䘀㠀㐀䔀㤀䄀䔀㜀㄀㔀䄀䐀㈀䔀䈀䔀㐀㌀䌀䌀㠀㤀䈀䘀䈀㜀㠀䘀㘀㌀㠀㤀　　㜀䔀䈀㤀䄀㔀㤀㘀䌀㠀㄀㌀㐀㔀䄀㈀㠀㔀㈀㠀㄀㌀㔀䐀㐀㔀㌀㤀䘀㜀㘀䔀㤀㠀㄀㠀㈀䈀㈀㘀㠀㤀㄀㤀㄀䌀䈀䈀䌀䌀㄀㌀　䈀䌀㔀㘀㈀䈀㄀㠀䌀㔀䈀㔀䐀㈀㜀㌀㘀㠀䈀㄀䐀㘀㈀㠀䘀㌀㠀㈀　㠀䔀㠀䄀㔀㌀䔀㈀㔀㔀䘀㄀　㘀䘀㌀䔀㘀㄀䌀䘀㌀䔀㄀㘀㌀䘀㄀㤀㤀䘀㠀㔀䄀㜀䌀䌀䘀䌀㘀㌀䘀䌀㔀　䄀㔀㤀䐀㈀㜀㈀䄀䐀䔀䄀㔀㘀㠀䔀㤀㔀䌀㜀䐀䌀㈀䐀㄀㄀㜀㤀㌀䌀䘀䄀䈀䄀䌀䌀㠀䈀　㘀䄀㠀㈀䈀䐀㠀䘀䈀㤀㤀㜀䄀䈀　㘀㠀㠀䔀䘀䄀㄀㘀䐀㄀　㈀䘀㔀㄀　䐀㄀㄀㈀䘀㔀㔀　䐀㄀　䄀䘀㔀䄀䐀䄀㈀㌀㔀䔀䄀㘀㄀䄀㈀㄀㐀䘀㔀㜀　䐀㄀　㘀䘀㔀　㠀㤀䔀㜀㤀䄀㘀㄀䔀㈀㤀䐀䄀䄀㄀㄀䔀㈀㔀㌀䄀䄀　䈀䔀㐀䐀㜀㐀㐀㈀㌀䐀㠀䔀㌀䐀䄀䄀䄀㤀㈀㜀㠀䄀㤀䈀㔀　䄀䘀㐀㠀䌀䔀㌀㈀㜀㔀䐀㈀䈀䔀㘀㐀㄀㜀䘀㔀䘀䔀䔀㐀䄀㠀䄀㤀㌀㌀䘀䔀䔀㘀　䘀㤀䄀㌀䄀㔀㤀䘀㤀㐀㌀䄀㘀㐀䔀䐀㤀䔀㐀㐀䘀㐀㜀㜀䐀䌀㐀㤀䘀㠀㄀䘀䄀䄀㠀㌀䘀㄀㌀䘀㔀㈀㔀䈀䘀㠀䐀䘀䄀䈀㈀㌀䘀㠀䌀䘀䄀㠀䄀㔀䘀㤀䄀㤀䄀䄀㌀㄀㜀㠀㔀䈀䄀㐀䐀䄀㘀㐀　㌀䈀㘀㌀㐀㔀㌀䐀䈀㘀　㐀㤀㤀䔀䌀䔀㜀㈀䐀䘀䔀㔀䘀㌀䔀㤀㜀㄀㔀䔀䌀䔀䐀㐀䐀䔀䌀䐀　㤀　䌀䈀㔀䈀㐀㐀㈀㄀㤀㜀㐀㌀㐀㐀㈀㌀㈀䔀㠀㜀㠀䄀㈀㈀㈀䔀㘀䘀㄀㔀㠀䐀䈀㤀㄀䌀㈀㘀㌀㠀㠀䔀䔀　䈀㄀㌀㔀䔀㄀㜀㈀㠀㐀㈀㠀䔀㄀㜀㈀䄀㐀㘀㠀䌀䄀䔀㔀㈀㠀㔀㄀㘀㘀䔀䔀㄀䐀㄀㄀䔀䐀䈀㤀䈀䌀㔀䐀㜀㐀䔀㐀㜀㈀㄀䌀䌀㜀　䈀㄀㘀㠀䘀䄀䄀　䈀㤀㜀㤀㌀䌀㐀　䐀㔀䌀㐀䔀㄀㘀㔀䐀䈀㤀㤀䌀㈀㈀䈀䄀㜀㌀䈀㤀㐀㈀䐀䌀䌀㠀䔀㔀㈀䄀䐀㄀㠀㌀䌀䈀㤀㔀䌀㤀㤀䄀㈀䌀㄀䔀䄀䘀䌀㌀䔀㔀䘀䔀㘀㐀䈀㌀䘀㈀䘀㄀㌀㜀㌀䘀　䈀㠀㘀㐀㜀䌀䄀㔀䄀䌀䐀䔀㌀㌀㐀㜀㜀㠀㐀㄀䘀䘀㄀㜀㌀䈀䌀䌀㄀㘀㌀㐀䌀㌀㄀㜀㜀㐀㌀䘀㤀㔀㌀䈀㤀䈀䌀䔀䌀䘀㜀㜀㌀㜀㤀䌀㔀㤀䘀㐀㘀㄀㘀㠀䘀㠀䐀䄀㌀㄀䘀㜀䘀㄀䈀䄀䄀㄀㜀㜀䘀䔀㌀䌀㈀㌀㐀䈀䄀㤀䈀䔀㘀䐀㌀㈀㈀㔀䄀㐀㘀䄀䈀㘀㠀㄀㌀䔀䐀䄀　䈀䐀㜀㐀㤀㠀䘀䐀䐀㠀䔀䈀䘀㐀㄀㘀㤀䐀䔀㌀䌀䌀䘀䘀㔀㌀㤀䔀䐀䈀䈀㄀䘀䐀㐀　䐀㘀㈀㐀㤀㜀㜀㔀㌀䐀㠀㜀㜀㔀䄀㤀㔀　㤀㐀㠀㠀㔀㘀䄀䌀㐀䐀㔀䐀㐀㐀　䘀䈀㘀㤀　㄀㔀㌀䌀䔀䔀㔀㄀㌀䌀　䄀㤀䔀㤀䘀䐀䌀䐀䈀䈀䄀㘀㈀㌀䈀䔀䄀䌀㄀㘀㈀　㜀䔀䄀㔀䈀䌀㐀㐀䔀䐀㐀㐀㌀䌀㐀㈀䔀䐀㐀㐀㌀䌀㔀䐀㌀䄀㠀㠀㜀㠀㤀䐀䐀䄀㠀㠀㜀㠀䈀㘀㜀㔀　䐀䘀㈀䄀䘀㘀䄀　㄀䔀㈀㄀㤀䔀㐀㔀㌀䐀㔀㈀䔀䌀㐀㔀㌀䐀䌀䄀㔀䘀䌀䐀䐀㐀㌀䌀䌀㘀䔀䄀䄀㘀䔀㘀㔀㄀㔀䔀㠀㜀䘀䄀㠀㠀䈀䘀　㘀䔀䄀䄀㌀䘀䔀㤀䄀䄀㠀㈀䘀䘀㤀㘀䈀䄀㄀䈀䔀䔀䌀䈀䘀㄀䔀䘀㔀㄀㔀㜀䘀㠀䔀䄀㤀㜀㤀䌀㐀䈀㔀㔀㄀䈀㜀㄀㄀㘀䈀㈀　䈀䘀䈀㔀㤀　䐀䌀㌀䄀㐀㠀㘀䔀㌀䐀㈀㐀䈀㜀　㄀㤀㈀䐀䈀　㠀㤀㤀㘀䐀㠀㈀䌀䌀㤀䔀㠀㐀㄀㐀㌀㜀㐀㌀㜀㈀㐀䘀㐀㄀㜀㈀㔀䈀㈀　䈀㤀䄀䐀㐀㘀㄀䔀㜀䔀　䐀㠀䔀㌀䈀䔀　㜀㠀　㐀㄀䌀䌀䘀　㈀䌀㜀㔀䐀㜀　㌀䌀　䄀㠀䔀㘀㜀㠀㌀䔀㌀㔀㔀䌀　䘀㄀䄀䄀䔀　䈀㠀䄀　䄀㐀㐀䌀䌀㈀㔀䐀䔀㐀㌀䔀䐀㠀　䄀䌀㈀㐀䌀㄀㜀㤀㤀䔀㘀㌀㔀㘀㔀䔀㘀㌀㤀䈀㜀㄀䔀㜀㠀㤀㘀䈀㐀㈀䔀㄀㔀䈀㄀㈀䘀㠀䔀䄀䐀㐀㐀㠀㤀　㠀㜀㐀㈀䐀　䈀㌀䄀䔀㈀㤀䄀䈀㘀䌀䐀㔀㔀㐀㐀㌀㐀㜀䔀㌀㐀䌀㘀㘀㠀㤀㈀䈀㄀䈀䐀㘀䌀㐀䘀㤀㘀㐀㌀㔀㜀㔀　㤀䄀㄀䐀㌀㘀㘀㄀㤀䈀㌀㜀䔀㈀　䈀㠀㜀㜀㌀㄀䄀　㄀㐀䈀㘀㐀䌀㄀䈀䔀㄀㠀㌀䈀㔀䈀㠀㈀㄀㠀㌀㠀䘀䘀䐀䄀䐀䄀㔀䌀䘀㘀㘀㐀䈀㈀䈀㈀　㜀㘀㜀㐀䘀䔀㄀䈀㈀㜀䈀䘀㘀㔀㐀㈀䔀䌀䈀䈀㌀䄀㜀㜀㌀䐀㤀䌀㜀䈀㐀㤀㄀㌀䐀䌀䐀㘀　䄀㘀䐀䘀䐀㤀　㌀䈀㌀㐀㜀䘀㈀㔀㔀㔀䌀䘀䄀䄀㤀䈀㠀㔀㤀䘀㐀㄀㌀　㌀㐀㐀㜀䘀䐀㄀㔀㜀㠀䌀　㤀䘀㐀㘀㜀䐀䘀㔀㔀㔀㄀䈀㤀䐀䄀㘀䌀㐀䐀䈀㜀䔀㘀㔀㠀　䈀䄀䐀㐀㜀㜀䐀㈀䈀㜀䌀㔀䈀㜀䐀㜀䈀㌀㈀㈀䔀㘀㘀㔀䌀䌀䄀䈀㠀㤀䌀㜀㄀㠀㔀䄀䐀䘀㌀䔀䄀䌀　㤀䄀䌀　䐀䄀䌀　䈀䄀䌀　䘀䄀䌀　㠀㘀䌀　䌀㘀䌀　㈀㘀䈀㘀䐀㐀㈀㜀　㈀㈀㜀　㌀㈀䘀　㐀㐀䔀　㔀㔀䔀　䌀䈀䌀㄀㐀㜀㠀㌀㤀㜀　㌀䄀䔀㌀䐀䈀　䌀㈀䈀䌀㌀㤀㜀㤀㄀㤀㐀㤀㄀㤀䌀㤀㄀㤀㈀㤀㄀㤀䄀䔀㄀　䘀㜀䌀㄀㜀䘀㠀㌀䔀䘀　䈀㜀䌀　䌀㔀䌀　䄀㔀䌀　䔀㔀䌀　㤀㔀㈀　㄀䈀䌀䐀䔀　㤀㈀䔀　䐀㈀䔀　㈀㌀䌀㄀㘀㔀䌀㄀㐀㜀㠀㌀䌀䈀㠀㌀㠀䘀　㔀㄀䘀　䘀㌀䔀㄀㄀䐀䌀㄀㜀䐀䌀㄀䘀㌀䌀㄀　㌀䌀㄀㠀㌀䌀㄀㐀㜀䌀㌀䔀㜀㠀㌀㠀㜀㠀㈀㐀㜀㠀㌀㐀㜀㠀㌀㘀㜀㠀㈀䔀䘀㠀㔀䔀䘀　㠀㌀䔀　㠀㜀䌀㄀㠀䘀㠀㈀䔀㜀㠀㌀㄀䘀　㜀㌀䘀　㤀㜀䔀㄀䄀䘀䌀㈀䌀䘀㠀㐀㔀䘀　䄀䈀㔀　㘀䄀䌀㠀㄀䘀㐀䄀　䈀　㔀㐀㈀䌀㄀㔀　㈀㠀㤀㐀㄀䔀䌀䄀　㠀㘀㔀㠀㘀䔀䄀㠀㜀䘀㈀㐀㌀　䐀㐀㈀　㔀䄀㄀㠀㘀䄀㄀䌀㈀㔀　䄀㌀㔀　㔀㄀䄀㠀㜀㄀䄀㠀㌀㠀䐀㐀㈀㐀㔀㐀㄀㈀㘀䄀㄀䄀㘀䄀㄀㘀㘀䄀㄀䔀㘀䄀㄀㄀㘀䄀㄀㤀㘀䄀㄀㔀㘀䄀㄀䐀㈀䄀　䐀䈀㔀　㤀䈀㔀　䐀䈀㔀　䈀㤀㔀㠀㔀䐀䄀㠀㜀㌀䄀㠀㐀㌀䄀㘀㘀㠀㐀㌀㈀䐀㈀㌀㌀㌀㈀㌀㈀㘀㐀㠀㘀䌀䄀䐀　㄀㤀㄀㜀㌀㈀䈀䔀䌀䈀䘀㠀㌀䔀䄀㌀㐀䄀㐀㘀䐀㔀　䌀䈀㌀　㌀㤀䄀㠀䈀㤀䌀㤀㄀㤀　㈀㜀㈀㘀㜀㌀䐀䌀䐀㄀㠀䐀㌀䐀䔀㈀㔀㠀㘀䈀㄀䌀䘀䈀䘀䌀㘀㤀㤀䌀　䘀㠀㘀䄀䌀䐀㤀㤀䌀　䘀䄀㘀䔀㌀䐀䔀䔀䈀　䌀㘀㐀㜀䘀㤀㤀䌀㠀䔀㤀㘀䌀䄀䌀䔀㔀㠀㘀㜀䐀䌀䘀䘀㠀㤀䔀㈀㄀㤀㤀䘀㈀㜀㐀䌀䄀㘀䔀㔀㈀㈀㤀䘀䈀㔀㌀䘀㘀㤀㌀㤀㌀䘀㈀㘀䐀䌀䄀䈀㜀㄀䌀䘀㔀㜀㄀䄀㘀㐀㌀㔀㤀㈀㘀䐀㌀䔀㄀䔀㠀䔀㠀䈀䐀䌀　㄀䘀䄀㤀㤀䔀䌀㤀㜀㜀㌀㠀㄀㘀㔀䄀䌀㠀㤀䔀䈀䘀　㔀㘀㜀䘀䌀䌀䘀㔀㄀㜀䈀䌀䔀䐀㔀䐀䘀䄀㔀䔀䔀㤀䌀䄀䘀䘀䘀㤀㘀㘀䔀㠀㐀䔀㜀䔀䘀　㄀䌀䘀㜀䘀㄀㌀㌀䌀㜀䘀㐀䘀㜀㠀䘀䔀㔀䔀䘀　䘀䌀䔀㔀䘀　䘀䌀䈀䐀䔀㄀䘀㤀䘀䈀䌀　䘀㌀䐀䘀　䌀䌀䘀䐀䘀㄀㜀㤀䔀䈀䘀㄀䘀㌀䌀㜀䘀䘀䘀䔀　㘀㔀䘀㘀䘀㤀　㌀㐀㈀㌀㘀䘀䈀䘀㤀㘀㄀䘀　䘀㌀䈀㌀䔀㄀䔀㜀䔀㜀㘀㘀㌀㠀䔀䌀䔀㜀䔀䘀䔀㌀㜀㄀㄀䔀䄀㈀㠀䄀䘀䘀㠀䄀㐀㐀䘀䘀㌀㤀　㤀䘀䔀㄀䘀㤀㄀䐀㌀㔀㔀　㤀　㔀䌀　㐀䐀　㈀㌀㜀䐀㌀䌀　㐀㜀　㤀㌀䔀㔀㘀　㄀㄀䘀㜀㌀㌀　䘀㈀　㘀㄀㠀㜀㤀　㤀㐀㘀䐀䔀　䈀㈀㌀䔀䘀㠀㌀　㠀䄀㜀㔀䘀㘀㔀䐀䔀㤀㠀㄀䌀㐀㠀㐀䔀䌀㜀㄀䌀䔀䔀㐀䄀㘀㘀㔀㔀䈀㠀㠀䌀䄀䄀㈀㜀䔀䄀䘀䘀　䘀䈀㔀䘀㠀㜀䘀䄀䔀㠀䘀㤀㔀䈀䄀䌀㌀㔀㜀　㠀㐀㌀㔀㌀　㠀㤀䄀䔀㈀㠀㌀㠀㐀㔀㌀㈀　䌀䘀　䌀䌀㠀㌀㌀㄀㌀䘀㈀䈀㐀㈀㄀䌀䘀㌀　䔀㐀㈀㤀㈀㄀㐀䘀　㔀㜀㤀㘀䄀䌀㠀䐀㌀㠀㄀㌀䌀㈀㌀㤀　㘀㜀㄀㘀䔀㐀䔀㤀㐀㈀㤀䔀㔀㄀䌀㠀㌀㌀㤀䈀䔀㔀㤀㘀㐀㔀㔀㔀㘀㈀䈀䐀　䘀㈀㘀㘀㜀㈀㐀䘀㐀㌀䔀㠀㌀䄀㌀䐀㔀䐀㠀㠀䌀㌀㔀㄀㘀　㌀㜀䄀㐀䄀䐀　㔀㌀　㄀㌀䐀䈀㔀䄀　䄀㜀䈀䔀䐀㠀䈀㤀䄀㄀䔀㐀䌀䌀㠀㐀㜀㌀㔀䐀㠀䔀㘀㤀䔀㈀㔀㘀䔀　䔀䄀㐀䌀㠀㜀䐀䐀䌀㄀㈀䌀㠀　㈀㘀㈀㜀㐀㌀㤀㌀㔀㌀䄀㄀䌀㤀䔀䌀㠀㄀㌀㠀䘀䔀㜀㈀䘀䔀䄀䈀䄀䈀䄀䈀䘀㘀　䈀㜀㠀䐀䄀　㤀䘀䈀䐀㜀䔀㤀䐀䐀䐀㈀䈀䈀㤀㄀㠀䔀㘀㔀㈀㔀㜀㠀㈀䔀䌀㜀㌀䔀㐀㄀㤀㘀㘀䐀䐀䔀㈀㔀㈀㄀䔀䌀䄀㄀㠀㠀　㔀䄀䘀䐀㄀㜀䐀䔀㤀䌀㔀㜀㄀䄀㐀㌀㈀㠀㈀㌀㐀㜀㤀㐀　㄀䘀䌀㐀㠀䄀䐀䈀㘀㌀㤀㐀㔀㘀㜀㠀㐀䔀㘀㌀䄀㄀㠀㜀㘀㘀䔀㈀䌀䌀　㤀䈀㐀䌀㄀㐀㌀㘀㌀㌀䈀䌀䘀䐀㤀䔀㤀䈀㈀㄀㠀䌀䐀㔀䌀㜀㌀䄀㘀䔀㄀㠀㔀㤀䐀㘀㌀䔀㜀㄀　䐀㤀䘀㔀䔀䌀㜀䄀㐀䌀㈀㤀䈀　㌀㤀㄀㈀䈀　㤀䈀䐀㠀㄀䌀䔀㤀䐀㠀䄀䐀䔀䐀䐀㘀㤀㐀㘀㘀䈀㜀䈀㜀䈀䈀䘀㄀㜀㜀㜀䄀䐀㠀㌀䐀㐀㠀䐀㤀䈀䐀䔀䐀䐀䔀䄀㐀䔀䐀㠀㄀䘀㘀㐀　㜀㈀䔀䌀㈀㄀䘀㘀㄀　㠀䄀䔀　㈀䄀䐀䐀䌀䐀㜀㌀㈀㘀㜀䘀䔀㜀㈀䄀䔀㘀䌀䌀　　䌀䔀　䌀䔀㈀㤀䌀䈀㘀㈀㠀㄀䈀㄀㠀㘀㤀㔀㠀㠀㜀䄀䐀㐀䘀㔀㠀㐀㈀㔀䘀䘀　䐀䘀㌀㜀䔀㠀䐀䈀　䔀㄀㌀㔀㄀㔀䈀㤀䈀䘀㤀䘀㌀㄀㘀䐀㌀䌀䔀䘀㈀䐀䘀　㜀　㤀䘀㐀䌀㔀䈀䔀㜀䌀䔀䈀㌀　䐀㌀㐀䔀䘀㈀䐀䘀䔀㤀㌀㠀㌀䐀䌀㤀㤀䄀㘀㄀䌀䐀䘀　㘀㤀㘀䈀㄀㌀㔀㌀䈀㜀䘀㄀䐀䘀䔀䔀㌀㠀㈀㈀㜀䌀䔀䌀㠀䐀䄀䌀㠀㜀䈀㤀䘀㘀䌀㜀㘀㤀㤀㘀䐀㔀䌀㔀䘀䄀㠀䌀䄀㤀㜀㜀䘀㌀䐀䘀䐀㜀䐀㜀䈀䔀㘀㤀䈀䐀䌀㌀㜀䘀䄀㌀㔀㠀㐀䔀㔀䐀䄀䌀䄀㈀㠀㐀䔀䘀㔀㘀㐀㔀㔀䈀㌀䐀㤀㤀㔀䔀㘀㐀㔀㔀㐀䐀䘀㠀䈀㘀㘀㤀㠀㜀㈀㌀㐀㐀㔀䘀䈀㘀䄀䘀㠀㘀㈀䘀䘀㜀䐀䄀䘀㜀䌀㔀䄀㜀䐀㘀㔀㈀㐀㘀䐀㠀㤀䈀䘀䈀㈀䌀㤀䘀㄀䘀㐀䘀㈀䔀㔀䐀㌀䐀㘀㌀㈀㘀䘀䘀䄀㔀䘀　㄀㠀㌀䔀䈀㘀㌀䔀㌀㌀䌀㜀䘀㄀㌀㌀　䔀㔀㤀㈀䌀㜀㜀䘀㄀㄀㤀㈀㌀㘀䘀㔀㠀㘀䘀㤀䈀䔀㌀䘀㠀㄀㤀㌀䌀㐀㈀㘀㄀䈀㠀䐀　㌀䐀㠀㄀䈀㘀㤀㜀㘀㤀䌀㜀䈀㤀㔀䘀㄀䈀䌀㐀䄀㈀　㐀䔀䄀㄀䄀䄀㘀㜀㈀䌀㐀㘀㈀㈀䐀䈀㈀㤀㘀㜀䄀㜀䄀䈀㤀㠀　䔀㤀㐀䈀㤀㤀㌀䔀䌀䐀㤀䄀㘀㔀䌀䐀㐀䐀㘀㠀䈀㌀㤀㌀㌀㔀㠀㄀㤀㄀㔀㤀䔀㘀㔀㤀䄀䌀　㐀㘀䄀䄀㄀䐀㔀㄀䘀㜀㤀䄀㔀㘀㔀㜀㔀㄀㈀㠀㔀　㤀㜀㐀䐀㜀㘀㈀㠀㤀㜀㄀䘀䌀䔀㘀䈀㌀　䄀䄀䌀㘀㈀㜀㄀䘀㐀㄀䄀㐀㈀㤀㜀㈀䐀㄀䔀㌀䈀䌀㜀㠀㤀㌀䔀㐀䈀㔀䈀䐀㤀㔀㘀㠀䐀　㐀䈀䔀㜀㄀㘀䌀䌀䐀㠀㠀䘀㤀䄀䈀㜀䔀㐀䐀㜀䔀䔀㈀䄀㈀䘀㠀䌀㈀䈀㈀䌀䌀㔀㘀　䄀䘀䘀䘀㤀㄀㌀䔀㠀䔀䘀㜀　㜀䔀㘀㈀䐀䔀䐀㘀㘀㈀䘀䔀䈀䔀䈀㠀㐀㘀䄀㜀㌀㔀㤀䌀㈀㤀㤀㠀㜀㜀㤀䐀㤀㤀䈀䘀㜀㜀䄀䔀䌀㤀㤀䈀㄀㘀䐀　　㈀䈀㄀㔀㜀㤀㠀㜀㜀䔀䄀㤀㠀䈀䘀䔀㌀　㤀䌀㠀㌀㠀㠀䔀㄀䈀㄀㘀　䈀䘀㌀䐀䔀㌀㐀䘀㌀䈀㜀㌀㤀㠀䔀㈀㐀㤀䈀㔀䘀䔀䐀㄀㔀㜀㌀䌀㔀㌀㐀㘀㄀䐀䔀　䌀㘀㈀䘀䔀㄀㘀㈀㔀㤀䌀㔀㔀䌀㈀㌀㌀㜀䘀㠀㐀㌀　㐀䘀䘀䌀㤀䈀䈀䘀㐀㤀　㤀㘀㜀㔀㔀䄀㔀䄀䄀䄀㈀㤀㐀㌀㌀㠀䐀㤀䔀䈀㄀㤀䌀䄀䔀㘀䘀　䌀䄀䈀䐀㐀䘀䄀䔀䔀䄀䌀䘀㔀㘀㘀㜀㘀䐀㐀䈀㌀䌀䈀㔀㤀䌀㜀䘀㌀䔀䌀㤀䈀䔀䐀㤀䈀㈀㤀䐀䘀䄀䔀䈀　　㜀㔀㌀　㌀䌀䌀㤀㄀㐀㘀䘀㘀㈀㈀㜀䈀㄀㄀㄀㔀㐀㄀䐀䘀㈀䈀㘀㜀㌀㈀㐀㜀䐀䌀㘀㐀㈀㜀䄀㜀㈀㔀䄀㜀䘀㄀㤀㤀㐀㌀䌀䐀㠀䌀䈀㜀㠀㜀䐀㤀㄀䌀㠀㤀䐀㠀䄀㌀䔀䐀䈀㄀㤀㐀㘀㈀㠀䘀䈀㌀䌀㜀䘀㌀㐀䌀㤀㤀㘀㠀㐀䘀䄀㘀㤀　㌀䐀䐀㔀㤀䔀㐀䄀㤀㤀䘀㘀㜀㐀䘀䈀㐀䔀䈀㈀䔀䐀䈀䈀䔀䌀䈀䈀㜀㠀䐀㘀䌀䐀䈀㘀䔀䘀䄀㄀㠀㠀㜀䐀䄀䘀㌀䐀㠀䘀䄀㈀䘀㘀㜀䌀㜀䈀㌀䔀㔀㔀䈀㄀㄀㜀䐀㠀　䈀䄀㤀䄀䄀䘀䐀䄀　䈀䐀㤀䌀䄀䔀䈀㌀㔀㜀䐀㠀㤀䈀䈀㠀㄀䘀㤀䈀䐀㤀㘀䔀㤀㠀䄀㜀　䄀㈀䌀䔀䔀䐀㄀䌀䐀䘀㄀㄀㤀㄀䄀㠀䔀䈀㔀㘀㠀䐀䄀㄀㈀㘀㠀㈀䈀㄀㤀㘀䐀䄀㔀䄀㄀䄀䐀㈀　䐀䄀䌀䄀㐀　㔀䈀㤀㤀㘀㠀㐀䈀䄀㌀㈀䐀　㜀㘀䐀䈀㤀㘀㠀㈀䈀㄀䈀㘀䐀㔀㔀䈀㄀㜀䘀㘀㘀䘀䘀㠀䌀䄀䄀䌀㜀㔀䈀䐀䌀㠀㠀㄀㘀䈀㜀㔀㌀㘀㌀㜀䈀㈀㜀䈀㜀䐀䈀㌀䌀㘀䔀䌀㔀䈀㠀　䐀㤀㐀䔀㔀㈀㠀㘀䘀㐀㐀䐀㤀㄀䘀䔀㔀䈀䌀䌀䄀㘀㜀䘀䄀䐀㠀㈀䔀㤀㠀䘀䘀㌀㔀䔀㄀㌀㈀㄀㈀䈀㜀㜀㠀　䘀㔀㈀㄀㈀㔀䈀䈀䌀㜀㄀㜀㘀㔀㜀㘀　䔀㘀㜀䐀㌀㠀㜀㤀㜀㠀㤀䘀㐀䐀㠀㐀㘀䄀　　䈀䘀㠀㤀㐀㜀䐀㔀㄀䈀㐀㜀㌀䐀䔀㌀㐀㜀䈀䐀㜀　䌀㐀䘀䄀㘀㐀㜀㜀䈀　㌀䈀䌀㄀䐀㈀㄀㔀䔀㈀㄀䌀㤀㜀㜀㈀㘀㈀䔀㜀㄀㠀㈀䈀㜀䄀䘀㔀䄀䌀㘀䈀䌀㜀䈀䐀㘀㈀䌀㜀　㤀㘀㜀㠀䄀　䐀䔀㠀㐀㤀㘀㌀㄀䄀㠀㌀䐀䘀䌀䈀㤀䔀㐀㔀㜀㌀㔀㤀㐀䘀㄀㘀㜀㄀㐀䔀䘀䄀㌀㠀䄀䐀䔀㄀㘀䌀㘀㈀㄀䈀䔀䐀䄀㘀㜀䐀㤀䌀㐀䘀㤀䌀䄀㐀䐀㌀㜀㐀㠀㘀㌀㌀㠀䄀䈀㌀䘀㐀　㄀㤀䐀䔀㜀㤀䌀䔀㈀㈀䈀䈀䄀㐀　㤀㜀㐀㔀㄀㈀㘀㜀䄀㜀䈀㘀㠀㠀㠀㠀䄀䄀㤀䌀㤀䘀䐀㘀㄀㔀　㔀䄀㈀㤀㠀㌀㌀䐀㐀䈀㘀䄀㈀㤀㌀䔀㠀䌀䔀㌀㤀㘀䄀㜀䘀㠀䔀䌀䔀㐀㜀䘀䌀㌀　㐀䈀㘀㔀㠀䈀㘀㤀䈀㄀　㘀䐀㔀䔀㘀䈀㈀䈀㘀㤀䐀䌀䈀㘀㔀䄀䔀㔀䐀㠀㜀䌀䈀㌀䄀㌀㘀㔀䈀㘀䘀䈀䈀㈀䔀㔀䈀㔀㈀㠀䈀䔀䐀㘀㤀㄀䔀㤀㜀㜀㤀㌀㘀䔀㜀㘀䄀㜀㘀㜀䐀䄀㌀㌀㤀㜀㘀㌀䔀㔀䈀㐀䐀䌀䈀㘀䔀　　　䈀㔀䈀㘀　㜀㌀䌀㘀㘀㘀㌀㜀䈀㐀㌀㤀㘀㌀䈀㌀　䈀㘀䐀䌀䔀䐀㠀䔀䌀㐀㘀㌀㘀㘀㜀㘀䌀㜀㘀㤀㄀䌀䐀㄀㤀㤀䈀䐀䐀䐀㠀䔀㘀㠀䌀䌀䐀㈀䔀㘀㘀　䔀㄀䈀㔀䈀䌀䌀㔀㄀䈀㈀㔀䐀㘀㈀㜀㌀䌀㘀㘀㘀㌀㜀䈀㔀㤀䈀㜀㄀䐀㤀䌀䌀㘀䔀䌀䔀㘀㔀㜀㌀䈀㘀䐀㄀㤀㘀䐀䐀䌀㈀㘀䔀䌀㤀㘀㔀㐀䈀㤀䈀㌀䐀㠀㤀䐀䐀㠀䄀䔀㔀㘀㈀䈀㄀䐀㔀㈀䔀䔀㔀䈀㈀䐀㐀㘀䔀䌀㌀㘀㔀㄀䈀䈀㘀䐀㘀㤀㘀䐀䐀䐀㘀㘀䔀䌀㜀㘀㔀㌀䈀㤀䈀䈀㌀㌀䐀䈀䈀䌀䌀䔀㘀㘀䌀㠀䘀㌀䐀㐀㌀　㜀㈀䔀㌀䈀䐀㠀㤀䌀䘀㌀䐀㤀㄀䐀㤀㤀㜀䘀㤀㘀䐀䐀䌀㤀䔀㘀䌀䌀䌀䘀䔀䔀㘀䌀㜀㌀䔀㘀㘀㜀㜀㜀䈀㄀㌀㤀䘀㌀䈀㌀㘀䘀㘀　㐀㤀㔀䄀㜀㘀㔀㜀䘀㘀㈀㄀㤀㘀䐀䐀䌀䐀䔀㠀䄀㄀䐀䐀㤀䐀䔀㜀㠀䄀䌀㔀㌀㌀䄀㘀㄀䌀䘀䄀䐀㤀䐀䈀䌀㠀㠀䔀䈀㔀䐀㐀䔀㈀㜀㤀㔀㌀䌀㄀㘀㔀　㔀㜀䈀　㠀㠀䈀䘀䐀䌀㐀㈀　㈀䔀　㜀䘀㄀㄀䌀䈀㈀䔀䌀䌀㄀㌀䌀㠀㜀㈀䌀㤀䔀㐀㤀㠀䈀䈀㠀㌀㐀䘀㌀㔀㔀㈀㐀䄀㜀㈀㔀㌀䌀䈀䘀䔀　㘀㈀㈀䔀䔀䔀㠀䌀䄀䘀㠀㐀䘀䌀㘀㌀㌀㌀㌀㈀㄀䈀䐀㈀㐀㘀䈀䔀㘀㄀䐀䘀䌀㈀㌀㄀䌀㄀㐀䘀㐀䌀㤀㤀㔀䔀　䌀䐀䐀㤀䈀㐀㄀㈀㈀䄀㌀㠀㈀䔀䔀䔀㌀㌀䌀㌀㄀㤀㜀䄀㔀㔀㠀䌀㄀㔀㘀㘀㌀䈀㄀䐀㠀㈀㈀㐀䔀㠀䄀㜀㌀䔀㈀㄀䈀䌀䈀䈀㘀䘀㈀䄀䌀　䔀䐀㘀㈀䐀䐀㘀㐀䌀䈀㘀䈀㔀㌀䈀䄀䌀㤀㜀䄀䌀　䘀䄀䌀䔀䘀㜀䐀䐀䄀㔀㜀䔀　䔀䈀䔀㈀㄀䈀䔀㘀䈀䈀䐀䈀䈀㜀䐀䌀䈀㜀䐀䈀䘀㜀䄀䄀䔀䘀㈀㌀䐀䘀䔀㔀㈀㐀㌀㜀䄀㤀㈀㠀䄀㤀㜀䈀䐀㈀䄀㠀䄀㐀䈀㤀㐀㤀㈀䈀㤀㈀䘀㘀㈀㘀㤀䐀㐀㤀䘀䄀㌀㠀䐀㤀㐀䄀䄀䔀㤀䄀㔀䌀㤀㈀䐀䌀㌀㌀㜀㤀㘀䌀䘀㈀䘀䌀䔀㐀㌀㔀䌀㤀　㜀㤀㈀䐀䘀㐀䌀䘀䔀㌀㐀㈀㔀㈀㔀䄀㔀㐀㘀㐀䄀㠀䈀㤀㐀㌀䔀㈀㤀㄀㌀㔀㈀㄀㘀䄀㘀㘀䌀㐀㠀㌀㤀㤀䌀䘀㈀㜀㘀䌀䄀㄀㜀䄀㤀㠀㄀䐀㐀㤀䌀䐀㐀䐀㈀䐀㐀䘀䔀䄀㤀㔀㌀㔀㈀㄀㜀䄀㔀㘀䔀㐀䔀㌀䐀㤀䔀㜀䄀㌀㘀䘀㔀㘀䈀㜀䘀㠀㘀䈀䘀䄀䔀䈀䘀䌀䌀㌀䘀䌀㠀㌀䘀䌀㌀䘀䘀䈀　㜀䘀㤀䈀䘀䘀㤀㐀䘀䘀㌀䐀䘀䘀㠀㔀㌀㐀㤀㤀㤀㘀㤀䘀䐀㘀㈀㤀㘀䐀㘀㠀䐀䄀䄀䌀䈀㐀㘀㔀㘀㤀䈀䈀䐀㈀㐀䔀䄀㜀㜀䐀㤀㠀㜀㘀㌀㄀㄀　　㤀㄀㐀　㘀䈀䄀　㘀㐀㘀㜀　　㐀䘀㜀㜀㠀㘀　㐀䘀䔀　䘀㔀䌀　㜀㤀㠀䔀㔀㘀䈀㌀㠀㌀䌀㔀䌀㄀㄀䔀䌀㄀㌀㄀䌀㄀㜀㤀䌀㄀㔀㔀㄀䌀䄀㔀䈀䔀㄀㄀䘀䌀㈀㐀㤀㐀㄀㐀䄀䄀䌀䔀㄀㄀㘀㜀㜀㤀㘀㠀㔀䌀㘀㠀㐀㄀㘀㠀㔀䐀䔀㠀㔀　䔀㠀䄀䐀䐀　㘀㜀䔀㤀㜀䔀䈀䌀㤀㌀䈀㤀㘀䘀䘀䄀䄀㐀䘀㐀　㜀䐀㈀㌀㜀䄀㔀㄀䘀㐀䐀㜀䘀㈀㜀䘀䐀㈀䈀㠀䔀㌀䌀㜀㌀㌀㌀䐀䄀㔀䔀䌀䐀䔀　㤀㠀䘀㜀䌀䌀㈀㔀㔀㌀䄀㘀㄀㜀䄀㌀㘀䌀㜀䌀㄀㔀㌀㄀䈀䄀䌀䌀䘀䌀䌀䈀㌀㄀　㠀䌀䄀㘀䈀㐀㠀㘀䐀㈀　䈀㔀㠀㄀䐀㐀䘀㘀㈀　䈀㤀㐀　㜀㈀㠀㄀䔀㐀㜀䄀㤀　㌀䄀㐀　䔀䄀　　䄀㤀䔀㌀㐀㄀䔀䄀　㈀䄀㤀　䈀䄀㐀䄀䔀　㜀䄀㤀　㜀䄀㐀㄀䔀㤀　㜀䄀㄀䔀㈀㐀　䘀㐀㠀㄀䔀㤀　㌀䌀　䘀㔀㈀㄀䘀㐀㠀㜀䐀㈀　䘀㔀㌀䐀㐀㠀㌀䔀㤀　㜀䌀㈀　䘀㤀㄀䔀䄀㐀　㄀㤀　　㘀㐀　㄀䄀㜀㠀㤀　　㈀㈀　　㔀㐀　　䄀㌀䌀㐀㠀㐀㌀㈀　　䐀㠀㄀㌀㐀䘀㐀㈀　㠀㔀㐀　　䄀㠀㄀㄀㐀㜀䄀㤀　㐀㘀㐀　㄀䄀　㄀㘀㤀䔀㐀㐀㄀㠀䄀㠀　㄀㐀　㄀㈀㤀䘀㈀㈀　㠀䐀㠀㄀㌀㐀　㘀䐀㈀䐀㠀㠀㌀㄀㐀　㌀㈀㤀　㘀㔀㈀䔀䌀㐀㄀㤀䄀　　㘀㤀　㈀䄀㐀㠀㤀　㜀㈀㤀　㄀㔀㈀　㈀䄀㐀䌀㐀㠀㌀㌀㐀　㔀䐀㈀㄀㐀㐀㠀㔀㌀　䘀䐀㈀　䌀㐀㠀㌀㌀㈀　䌀䐀㌀䌀㐀㠀㜀㌀㈀　䌀䐀㠀㄀㌀㐀䘀㜀㈀　㈀䐀㠀　䈀㐀　　䐀㈀䌀㈀㠀㌀䈀㐀　㐀䐀㈀㄀㈀㐀㠀㐀䈀　䘀䐀㈀　䄀㐀㠀㈀䈀㈀　䄀䐀㌀䌀㐀㠀㘀䈀㈀　䄀䐀㠀㄀䈀㐀䘀㘀㈀　䄀㔀㐀　㐀䄀㠀㄀㤀㐀㜀䄀㤀　㌀㘀㐀　䐀䄀　　㘀㤀䔀㌀㐀㄀䐀䄀　㈀㘀㤀　䈀䄀㐀䄀䐀　㜀㘀㤀　㜀䄀㐀㄀䐀㤀　㜀㘀㄀䔀䄀㐀　䌀㐀㠀㄀㤀㤀　㌀㈀　䘀䐀㈀㄀䔀㐀㠀㜀䈀㈀　䔀䐀㌀䐀㐀㠀　㜀㈀　㄀䐀㠀　㜀㐀䘀　㈀　㄀䐀㠀㄀㜀㐀　㐀䐀㈀䐀㄀㠀㌀㜀㐀　㈀䐀㈀　㤀㐀㠀㈀㜀　䘀䐀㈀㄀㤀㐀㠀㘀㜀㈀　㤀䐀㌀䐀㐀㠀㄀㜀㈀　㔀䐀㠀　㜀㐀䘀㄀㈀　㌀㜀　　䈀㤀　㄀䌀㠀　䐀㄀䔀䄀㐀㈀䈀㤀　䄀䔀㐀　䈀䄀㜀䄀㤀　㘀䔀㐀　䈀䄀　㄀䔀㤀䔀㘀㐀㄀䈀䄀　㌀䔀㤀　䔀䄀㐀䈀䈀　㜀䔀㤀　㄀䄀㐀　㜀㤀　㄀䔀㄀䔀䄀㐀㄀䌀㐀㠀㌀㤀㤀　㜀㈀　䘀䐀㈀㄀䈀㐀㠀㘀䘀㈀　䈀䐀㌀䐀䌀㠀䌀䐀㐀　㘀䔀　㘀㜀㈀䈀㌀　㜀䄀㤀　　㔀㈀　㄀䄀㐀䌀㈀㠀㌀　䌀　㐀㌀㈀㄀　䌀㠀㐀　　䘀㌀㈀　㠀䌀㠀㈀　㈀　㠀㌀㌀䌀䌀㠀㘀　㈀　㠀㌀㠀㄀　䌀䘀㘀㈀　㐀㌀㠀　　䌀　㄀㌀㈀䌀㐀㠀㌀　䌀　㔀㌀㈀㄀㐀䌀㠀㔀　　䘀㌀㈀　䌀䌀㠀㌀　㈀　䌀㌀㌀䌀䌀㠀㜀　㈀　䌀㌀㠀㄀　䌀䘀㜀㈀　㈀㌀㠀　㠀䌀　　㌀㈀䌀㈀㠀㌀㠀䌀　㐀㌀㈀㄀㈀䌀㠀㐀㠀　䘀㌀㈀㄀䄀䌀㠀㘀㠀㈀　䄀㌀㌀䐀䌀㠀㄀㠀㈀　㘀㌀㠀　㠀䌀䘀㄀㈀　䈀㜀　㄀䈀㤀　䐀䌀㠀㘀䐀㄀䔀㘀㐀㈀䌀㤀　䈀㄀㐀　䌀㘀㜀䄀㤀　㜀㄀㐀　䌀㘀　㄀㄀㤀䔀㜀㐀㄀䌀㘀　㌀㄀㤀　䘀㘀㐀䈀䌀　㜀㤀㤀　㠀㘀㐀㈀㈀㤀　㠀㤀㄀䔀㘀㐀㄀㈀㤀　㐀㤀㐀　㈀㘀㜀㤀㤀　䌀㤀㐀　㈀㘀　㌀㤀㤀䔀䌀㐀㄀䄀㘀　㈀㤀㤀　䄀㘀㐀䄀䄀　㜀㤀㤀　䔀㘀㐀㌀䄀㤀　䔀㤀㄀䔀㘀㐀　㘀㤀　㄀㤀㐀　㘀㘀㜀㠀㤀　㌀䈀㠀　䐀䌀　㄀䔀㐀　䔀　䘀㌀㈀㄀㌀䌀㠀㐀䌀㈀　㌀㌀㌀䐀䌀㠀㤀䐀㐀　䔀䔀　㐀㜀㈀䄀㜀　㜀䈀㤀　䈀䌀㠀㔀䐀㐀　䔀䔀䘀㈀㈀　䈀㌀㠀㄀䌀䌀　㘀㌀㈀䐀䈀㠀㌀䌀䌀　㄀㌀㈀　㜀䌀㠀㄀䌀　䘀㜀㈀　䘀㤀　㜀䈀㠀　䐀䌀䔀㌀㐀㄀䔀䔀　㔀㜀㈀㈀䘀㤀　㜀䈀㌀䐀䌀㠀㌀䌀㈀　䘀㌀㠀　䌀䌀䘀㌀㈀　䘀㌀㠀㄀䌀䌀　㜀㌀㈀䐀䘀㠀㌀㈀䌀　　䈀㈀　　䌀㠀　㈀　䘀㜀㈀㌀䘀㤀　䘀䈀㠀㄀䐀䌀䔀䘀㐀㄀㄀㘀　㈀㔀㤀　㠀㘀㐀䄀㄀　㜀㔀㤀　㐀㘀㐀㄀㄀㤀　㐀㔀㄀䔀䔀㐀㐀㄀㈀　　䘀　㈀㜀㤀䐀　㠀㌀㈀䌀　㘀䈀㈀㄀㠀䌀㠀㘀㈀　䘀䘀㈀㄀　㤀　㠀㜀㠀　㌀䌀䔀㐀㐀㄀㄀䔀　㘀䘀㈀㌀　㤀　㠀㜀㌀䐀䌀㠀㄀㈀㈀　㐀䈀㠀　㈀䌀䘀㄀㈀　㐀䈀㠀㄀㈀䌀　㔀䈀㈀䐀㐀㠀㌀㌀䌀　㈀䔀㐀㄀㄀㈀　㠀䘀㜀㠀㤀　㘀㔀㐀　㤀㘀　㄀㔀㤀䔀㘀㐀㄀㄀䔀　㔀䘀㈀㈀㠀㤀　㐀㜀㌀䐀䌀㠀㜀㈀㈀　䌀䈀㠀㄀㈀䌀䘀㜀㈀　㈀䈀㠀　䄀䌀　　䈀㈀䌀㈀㠀㌀䄀䌀　㐀䈀㈀㄀㈀䌀㠀㐀䄀　䘀䈀㈀　䄀䌀㠀㈀䄀㈀　䄀䈀㌀䌀䌀㠀㘀䄀㈀　䄀䈀㠀㄀䄀䌀䘀㘀㈀　㘀䈀㠀　䄀䌀　㄀䈀㈀䌀㘀㠀㌀䄀䌀　㔀䈀㈀㄀㘀䌀㠀㔀䄀　䘀䈀㈀　䔀䌀㠀㌀䄀㈀　䔀䈀㌀䌀䌀㠀㜀䄀㈀　䔀䈀㠀㄀䄀䌀䘀㜀㈀　㄀䈀㠀　㘀䌀　　䈀㈀䌀㄀㠀㌀㘀䌀　㐀䈀㈀㄀㄀䌀㠀㐀㘀　䘀䈀㈀　㤀䌀㠀㈀㘀㈀　㤀䈀㌀䌀䌀㠀㘀㘀㈀　㤀䈀㠀㄀㘀䌀䘀㘀㈀　㐀䘀　㄀㜀㤀　䄀䌀㠀㔀㌀㄀䔀㘀㐀　䈀㤀　㈀䐀㐀　䈀㘀㜀㠀㤀　䄀䐀㐀　䈀㘀　㈀䐀㤀䔀䄀㐀㄀䈀㘀　㄀䐀㤀　㘀㘀㐀㤀䈀　㜀䐀㤀　䔀㘀㐀㌀䈀㤀　䔀䐀㄀䔀㘀㐀　㜀㤀　㄀䐀㐀　㜀㘀㜀㠀㤀　㤀䐀㐀　㜀㘀　㈀䐀㤀䔀㤀㐀㄀㜀㘀　㄀䐀㤀　㔀㘀㐀㤀㜀　㜀㜀㤀㄀䄀䌀㠀䐀㌀㐀　㤀䔀䘀㘀㈀　䈀䈀㠀㄀䔀䌀　㘀䈀㈀䐀䈀㠀㌀㌀䌀　㌀䔀㐀㄀㤀㈀　䌀䘀㜀㠀㤀　㌀䐀㐀　䘀㘀　　䐀㤀䔀㌀㐀㄀㤀䔀　㔀䘀㈀㈀䌀㤀　㘀㜀㌀䐀䌀㠀㔀䔀㈀　㜀䈀㠀㄀䔀䌀䘀㔀㈀　䌀䘀　㄀㜀㤀　䔀䌀㠀㜀㌀㄀䔀㘀㐀㄀䘀㤀　㜀䐀㐀　䘀㘀㜀㤀㤀　䘀䐀㐀　䘀㘀　㌀䐀㤀䔀䘀㐀㄀　䔀　　㌀㤀　　䔀㐀㠀　　㜀㌀㤀　㠀䔀㐀㈀　㤀　㠀㌀㄀䔀䔀㐀㄀　㤀　㐀㌀㐀　　䔀㜀㤀㤀　䔀㜀㠀㄀㌀䌀　䘀䔀㐀㜀㤀　䘀㜀㈀㄀㠀䌀㠀㘀㄀㈀　㠀㜀㌀䐀䌀㠀㄀㄀㈀　㐀㜀㠀　㄀䌀䘀㄀㈀　㐀㜀㠀㄀㄀䌀　㔀㜀㈀䐀㐀㠀㌀㄀䌀　㌀㜀㈀　䌀䌀㠀㌀㄀　䘀㜀㈀㄀䌀䌀㠀㜀㄀㈀　䌀㜀㌀䐀䌀㠀　㤀㈀　㈀㜀㠀　㤀䌀　　㘀㈀㤀㄀㄀㌀㔀䈀㠀䐀㌀㄀䐀㤀䄀䄀㐀　䈀㘀㤀䄀㠀㜀㘀䌀䈀㔀㌀䔀䈀㈀䐀㔀　㘀䌀㠀㔀㘀　䈀㌀㠀㔀䈀㄀䐀㐀䄀㐀㔀㔀㠀䈀㄀㈀㤀䌀㘀㠀䄀㐀䐀㌀㌀䄀䌀䐀㠀䈀㐀䌀㈀㠀䄀㐀䐀㈀㤀㔀㘀㘀䌀䐀䄀㘀㄀䌀㔀䄀㘀　䌀㈀䈀㌀㘀㤀䐀䈀㄀㘀㈀䐀㌀　㔀㈀䈀㌀㘀䐀䐀䈀　㘀㈀㜀㌀㈀㌀㔀㘀㘀䌀㜀䄀㜀　䈀䔀䈀䈀㤀䌀㜀䄀㘀㄀㜀㔀㘀㠀㄀　㔀㘀㠀㜀䌀䌀䌀䄀䌀䌀　㘀㐀䄀䄀㜀㄀䄀㤀㐀㐀㜀䌀㔀㔀㐀㐀䄀㔀䐀䄀㠀㤀䌀　㘀䐀㄀㈀㠀㤀䄀㐀㐀䈀㌀㘀㠀㌀䔀㈀䐀䄀㘀䌀㜀䈀㄀㌀䔀㠀㈀㄀䌀㄀䘀㐀㜀䌀㠀䘀㌀㜀㄀㠀㐀㔀䌀㄀䘀㐀㜀䌀㠀䘀㜀㜀㄀㠀㐀㤀䌀㄀䘀㐀㜀䌀㠀䘀䈀㜀㄀㠀㐀䐀䌀㄀䘀㐀㜀䌀㠀䘀䘀㜀㄀㠀㐀㌀㔀　　㄀䌀㘀㄀㄀䐀　　㐀㜀㌀㜀䘀㈀䐀㄀㠀䐀㌀㠀䌀㈀䄀䄀　　㠀䔀㤀　䔀䘀㤀䈀䘀㔀㜀㈀䈀䈀㌀䐀㔀㌀　㠀㌀㤀㜀䈀㠀㠀㠀㐀䄀㠀䄀　　㠀㜀㘀㄀㌀㜀䈀䐀　㔀　㤀䄀㄀㈀䔀䈀䔀㜀　㘀䐀䄀㐀㄀䘀䈀䔀㠀㌀㐀䈀䐀㐀㤀䔀㜀䔀㠀㌀䌀㜀䐀㐀㄀䐀䘀㜀㌀䈀䔀㄀䔀㄀㄀㌀㔀㐀㐀㤀䔀䄀㠀䔀䌀䌀㜀　䄀䈀㌀䌀䄀㄀　䌀䈀䘀　㔀㜀㘀㈀䌀㔀㘀㄀㤀㔀㔀㤀㘀䈀㠀㠀㔀㄀㔀㘀㠀㌀䈀㈀㈀㘀㠀㄀䈀㈀㄀㘀㤀㐀㜀㔀　㤀㤀㐀䘀㔀䄀　㘀䌀　　䌀㔀㔀䌀㜀㄀㈀㌀䄀䔀㘀㠀㠀䔀㌀㘀䌀㜀㠀䘀㤀䔀㠀䄀㄀䘀㘀䐀㠀㤀㄀䘀㘀䐀㐀䐀㘀㠀㜀㤀　㜀䄀䔀䈀㄀㌀㌀㜀䔀㠀䐀㔀䐀䘀㄀㘀䘀㌀䐀㄀㌀㌀䘀䐀䄀㄀㌀㌀䘀㜀䄀㌀㘀㜀䔀䈀㐀㌀㜀䔀㄀㄀䄀䌀䘀䔀㄀㄀䄀䘀䈀䔀㈀䐀㜀䐀㠀㄀䘀䘀䘀䐀㘀㠀㄀䘀㠀䐀㄀㐀㄀㄀䌀㔀㔀䔀䄀㔀䐀䌀㐀䌀䌀㄀　㌀䔀䔀㌀　㠀䘀㤀䔀䌀㜀䔀㔀䌀㄀䘀䔀㔀䈀䄀㜀䘀䘀䌀㘀䄀䌀㜀㠀　㄀䐀㠀䘀㠀䐀㌀㌀㄀䐀䔀䈀㤀　䐀㜀䐀㘀　㘀䌀㜀㔀　䈀㈀㌀䐀㤀㘀䘀㔀㈀䐀㄀㔀䘀䄀䔀㘀㘀㜀㜀䐀㤀䈀㐀㐀　㄀䔀㠀㔀䈀䌀㠀㤀䔀䌀㄀䘀㄀㔀　䈀䄀㜀䐀㘀㜀㜀䌀㤀䐀䐀　䈀㘀䔀㜀䈀　䐀㘀㠀㔀䄀㄀㜀㔀　䄀㔀䄀䔀㜀㜀　㔀䘀　䄀䈀　䌀䈀㔀㈀㌀㔀䐀㘀㄀䄀䌀䘀㐀㠀䔀䔀　㌀䌀䘀㌀䔀䈀䈀㜀䘀㠀䌀㜀㈀　㐀㤀㐀䄀㌀䄀　㤀㠀㤀㔀䌀䄀㜀㤀䘀㘀㈀㄀䌀䘀㠀䔀䌀㠀䄀㘀㤀㠀㠀㘀㤀㠀㔀㔀䌀㐀䌀䄀䐀㔀䌀㈀䔀䔀䈀㄀㜀㔀㐀㐀䈀㌀䘀㘀㘀㌀㔀㤀䌀䐀䌀䌀㜀䄀䈀㐀䐀㔀　㤀䄀䈀㌀䘀䈀䈀㘀㈀䈀㐀㄀䌀㠀䈀䘀㌀㜀㐀㘀䈀㔀㔀㘀䌀䔀䐀䘀䔀㈀䄀㌀㔀䌀㌀㠀䄀㤀　䌀䘀㔀䄀䌀　㤀䘀䄀䄀㠀㤀㜀㐀䘀㄀㠀䐀䈀㠀㐀䌀㐀㤀䐀㘀　㐀㜀䌀㤀㈀㌀䌀䌀㠀㌀㤀䘀㄀㄀㄀㤀䘀㌀㜀䌀㤀㤀䄀䔀㄀䄀㄀䈀䔀㈀㐀䌀䔀䘀　㜀㔀㐀䄀䄀䐀㠀䄀䐀㠀䘀䄀䘀䌀㔀㔀䘀䄀㈀䔀䈀㄀㠀䘀䄀䘀㤀㌀䌀䈀㤀䘀㌀㈀䄀䈀㠀䈀　㜀㔀㤀㈀㘀㔀㘀㔀㄀䈀㈀㜀㤀䌀䈀㄀㔀㜀䘀䔀䄀㔀䄀　㔀㄀䔀㘀䌀䄀㘀㤀㠀䌀䈀䘀䐀䄀䘀䔀䈀䄀㄀㠀䐀㄀　䔀㌀㐀䌀䔀䈀㤀㘀䘀㘀㔀　㜀䈀㠀㠀䈀䔀䔀㐀䔀㌀䐀㘀㔀䘀㄀㈀㤀㜀㌀䐀䘀㐀㄀㈀㔀㄀㐀䄀㐀㤀䐀䌀䈀䄀䘀㤀㤀䌀䘀㜀㈀　㔀㔀㐀㔀　䔀㤀㜀䈀䈀䈀㄀㘀䄀㜀䔀㠀䐀㤀䄀㈀㈀㌀㈀䈀　䄀㌀㜀䔀㌀㈀㤀㄀㘀䄀㜀䔀㠀䘀㠀㘀䄀䘀㌀䔀㐀㘀䌀䌀㄀㜀㤀䈀㌀䐀㜀㐀䘀㌀㘀䈀㌀㔀㌀䔀䐀㄀㔀㌀㠀䌀㄀㌀䌀䈀㌀䌀㜀㐀䘀㌀㔀䈀㌀㘀㐀㤀䔀㘀䈀䔀㔀　䐀㄀㐀㜀㜀㠀䘀㠀㠀㌀㔀䘀䘀㘀㐀㠀㌀㈀䘀㜀　䔀㠀㤀㄀㘀㘀㈀㤀㠀　㜀㌀㄀䘀㜀㘀㈀㈀㐀㠀䈀㈀㐀㜀䌀㘀䄀㠀㠀㌀㈀　䘀㘀㘀㜀䔀㈀䘀㈀㜀㤀㤀㌀䔀㌀㘀㄀䘀㐀㘀䘀㌀㌀䐀㤀㠀䈀㤀䄀㌀㐀㌀㠀㠀㠀㠀㠀㜀㘀㘀䐀䔀㌀䈀㘀䔀　㤀䈀䘀䐀㤀㌀䐀㐀㠀䄀　㤀䄀䘀㜀　䌀　䈀㔀㄀䌀㌀㐀㌀㌀㌀㘀䘀䈀㄀䈀㘀䔀㠀㌀䐀㄀㄀㠀䄀㔀㄀㠀䐀㤀㘀㐀䐀䈀㈀㜀㜀䘀䐀㔀䘀㔀䘀　䘀䈀㜀㔀㠀㤀䈀㜀㌀䔀䌀㌀㈀㘀䔀䌀㤀䔀䌀㠀㄀㔀䐀㘀㜀　䘀㘀㐀䌀䈀㔀䔀　㌀㈀䈀㤀　䐀㜀䌀㜀䐀㘀䌀䄀㈀䐀㤀䔀㤀㤀䔀䐀䔀㌀䄀䈀㤀㘀　㄀䐀㠀䈀䈀䌀䄀㔀䐀䈀㈀㄀㔀㈀㠀㌀㜀䄀㄀䐀䌀㄀㠀䐀䘀㌀䈀䘀㠀㐀㜀㜀㜀㄀䐀䐀䄀㤀㄀　䘀䘀䌀㌀　䈀㌀䈀㄀㔀㘀䘀䌀䘀㤀䔀㠀䄀㜀㠀㄀䈀㔀㐀㜀㌀㤀㈀㜀䈀㘀䄀䔀㘀䄀㠀䔀㌀䈀䘀䘀㘀　㔀䐀㜀㐀㄀䈀䔀䌀䘀　䘀㘀㤀㠀䔀䐀㄀㘀䌀䌀㈀㄀䈀㌀㄀䘀䘀㐀䈀䄀䘀㠀㄀㠀㌀䈀㔀㘀㘀㘀㜀㜀㘀䌀　䌀䄀䔀䈀㜀㄀䈀䘀㐀䈀䐀䔀㈀　䐀䄀㘀䈀䘀㠀䐀㜀䐀䈀㐀㘀䈀䐀㐀㌀㔀䐀㘀㤀㐀䌀䄀㌀䐀㈀䈀䘀㄀㤀㤀䐀㔀㈀㈀㠀㄀䈀䔀䌀　䄀䄀㘀　䘀䄀㄀㘀䔀䌀䄀㌀㔀䐀䄀㌀㐀䔀䈀㈀䈀䄀㘀㈀䌀䘀䌀䄀㄀㈀䌀㜀䄀䐀㔀　　㈀䈀䐀䈀䘀㤀㤀䐀㤀㘀㘀䌀㜀䌀䄀　䄀㈀㐀㔀　䌀䈀䄀䌀㔀䄀㤀㔀㌀䈀㔀㘀㘀㈀䄀㤀㜀㠀㈀䘀㠀㄀㤀䔀㘀㜀䈀䔀㈀㔀䌀䌀㔀䐀㤀㈀䔀㜀㄀㈀䄀㠀㔀䄀㜀䌀䌀䘀㤀㐀㄀㈀䌀䌀䈀㘀䐀䐀䐀㜀䔀㠀㜀㐀㔀㄀㜀䌀㔀㠀䈀㤀㐀䘀㈀㔀㜀㘀㈀㔀㔀　䌀䘀㤀䈀㌀㤀㈀㐀䘀䌀㤀㠀㘀䐀䘀㌀㄀㈀䔀㠀㘀㜀䈀　䔀䘀㘀㐀䐀䔀㘀㌀㌀㠀㌀㜀㠀㄀㜀䄀㐀　㤀㠀㔀䘀㤀㌀㌀㤀　䈀䘀䐀䔀䌀㤀㌀㐀　㔀䘀㈀㜀䌀䌀㄀䈀䄀䌀㐀䘀䌀㘀䔀䔀䐀㄀䈀䌀㐀䄀㜀䐀　　㔀㜀㌀㐀䈀䈀㐀㠀㘀㜀㐀㔀㘀䔀　㈀㜀䐀　䄀䘀㘀䄀　㜀㠀䐀㘀㠀㤀㤀䌀　㐀䔀䄀㈀　㘀㄀㜀䔀㤀㌀㠀䈀䘀㌀㐀　㌀䔀䔀㌀㐀㈀　㈀䈀䐀　㌀䔀㘀㤀㌀䔀㄀䘀㔀㌀㜀　㤀䐀㐀　㈀㘀㄀㈀㐀䐀䘀㤀㌀㠀䘀䔀㘀䐀　䄀䈀　㤀䘀㐀㠀㠀㌀　㤀㈀㌀㔀䈀䌀㌀䔀㄀䐀䄀㌀㄀䄀䔀䐀䌀㐀䐀䔀㠀㜀䐀䐀㠀㔀䔀㔀䔀䈀㠀㌀㐀䔀䄀㔀㐀㈀㠀㌀䘀　䌀㘀㐀㜀䈀㌀　㈀䘀㄀　䘀䔀䐀䔀䐀㔀䄀䄀䌀㌀㄀䌀㌀䔀䐀㄀㄀䘀䌀㘀䐀䔀㌀㐀㔀㈀䌀㤀䔀㔀㄀䔀㌀䈀㠀㠀㔀䐀㤀㤀䌀䐀䈀㈀㘀䐀䈀䘀㜀䘀　䘀䌀㐀㤀䔀㄀䘀㤀㜀㌀㈀䘀㔀䘀㜀㄀㌀㔀䘀䈀㔀䔀䈀䘀䈀䐀㤀㘀䘀䐀㘀䐀㤀䄀䈀䐀㤀㄀㜀㔀㌀䈀䌀　㜀㌀㘀㘀㌀㌀䌀䘀䈀䄀㈀䐀䔀䌀㐀㄀㐀㌀䘀㘀　㄀䘀㘀㘀㐀䔀㤀䈀㄀㜀㤀䐀㄀㈀䐀䄀㘀䔀㤀㘀㤀䔀㠀㤀㔀䈀㤀䐀㜀㌀䐀䐀㤀㄀䔀䌀䘀㔀䄀㐀㠀㌀䌀㌀㜀䄀㜀㜀㌀㜀䘀㠀䌀㈀㜀䈀㈀䔀䌀䄀䐀䄀䌀䄀㄀㌀䔀㜀䈀㈀䘀㜀䈀䌀䌀㄀㐀䘀㐀㜀䈀㌀㔀㔀䐀䐀䈀㠀㄀䄀䄀㤀䌀㌀㤀䔀㌀㔀　㘀䔀䈀㤀䈀䄀䈀㘀䌀䘀䔀㔀㄀䔀㤀㐀㘀㌀㔀　㘀䔀㘀㘀䘀䔀䘀㠀㈀㠀㤀㜀㌀䘀㠀㘀㤀㜀㌀㌀䌀㠀䘀䌀㌀㌀㄀䌀䐀㌀䐀㠀㠀䐀㄀䘀㄀㄀㤀䈀㌀㌀䌀䘀䘀䌀㈀䘀䔀䘀㤀㜀㔀䈀䘀　㜀㔀䘀㌀䘀㠀䘀䌀㐀㌀䈀㘀䐀㤀㐀㔀䈀㔀䘀㠀㠀䌀䈀䘀㜀㜀䈀䐀䘀㘀㜀䌀䈀䐀䄀䔀㄀䌀㐀㌀　㔀㜀㄀䈀䐀㄀　䄀䔀㘀㜀䔀䔀䐀䄀䄀㠀㐀䄀㔀㜀䐀䘀㈀　㤀䔀㘀㐀　䘀䌀㈀　䔀㐀㠀㄀㈀㜀㘀㐀䌀　㘀䌀㄀䐀㘀㔀㔀䐀㠀㠀㌀䄀㠀㜀㈀㤀䘀䔀㐀㄀䈀䈀㘀䌀䈀㌀㌀䌀㔀㄀䔀䘀䔀㔀㐀䔀䔀䘀㐀䔀䔀㠀㤀䐀㄀䐀䘀㘀㌀䘀䄀㔀　㜀㌀䐀㜀㤀㘀䘀㠀䌀　㐀㌀㜀䘀㠀㤀㈀䐀㜀䘀㄀㜀㜀㄀㈀㘀䔀㘀㈀㤀䄀䔀㔀㈀䌀䐀䐀䐀㘀䐀㐀㔀䔀㈀㠀　䐀㠀䔀㌀䄀㄀䄀䔀㘀　㘀䄀㔀㔀䈀㄀㐀㔀㈀䌀䘀㜀㔀　䔀㜀㌀㌀㌀㔀㠀㔀䔀㜀䔀㌀　㈀　䘀㜀㔀　㈀䐀㜀㔀䘀㠀㠀㜀㤀䐀　䔀䘀㘀䈀䐀㐀䘀䔀㔀䌀㤀䘀㘀㔀㌀䘀㔀㌀䔀㄀䄀㄀㤀㘀㜀㄀㜀䐀㐀䄀　䌀㠀䄀㜀㤀㤀㈀䄀䈀䐀㐀㜀䌀䄀䔀㜀㜀㠀㤀㐀䔀䈀㄀㜀㤀㜀㐀㤀㔀䌀䄀䘀䔀㤀䐀㄀䔀㄀㜀㠀㔀㌀㄀䌀䘀䈀㈀䔀㜀䈀䘀㐀㄀㜀㐀㘀䐀䄀㐀㌀䄀㤀䌀䔀㜀㐀䔀䔀㔀㈀䌀㄀　㤀㠀　㔀㌀䔀䈀䔀䐀㘀　䌀㤀㘀䐀　㘀䄀㠀䔀㌀㜀㔀㌀䄀　䘀㌀㜀䔀䔀㠀㜀䌀㄀䄀㜀㐀㌀䔀㘀　䔀䘀㘀㄀㜀䐀　䌀䘀䔀㘀䘀䈀㤀㄀䘀䔀㌀䔀䄀䈀䐀㄀㔀䄀㘀䔀䌀㠀㔀䘀㈀㈀㘀㤀㐀㌀䐀㔀㄀䘀㘀㐀㘀䐀㤀㄀㄀㘀㔀　㜀㤀㐀㤀䐀䌀䌀䄀䌀㈀㔀㤀䘀㌀䈀䐀㐀䈀䐀䐀㔀㄀䐀㘀㘀㌀㐀㌀㐀㌀䌀㌀㘀㌀䌀㤀㘀㈀㠀㌀䌀㌀䈀㌀䌀　㜀㄀䄀䌀䄀㜀㌀䌀䔀㄀䐀䔀䔀㤀䄀㜀䈀䌀䐀䄀䐀䘀　㘀䐀䔀㄀䘀㄀㠀㐀䘀㜀㘀㘀㄀㠀㐀䄀㜀㠀㜀䘀㜀㐀㘀䘀㜀㠀䄀㘀㌀㌀䐀㤀㤀㤀䄀䔀　䘀䔀䄀䘀䐀䌀䔀㤀䐀䔀㘀䈀䈀䘀䌀㠀䐀䐀䈀䘀㠀䐀䌀䘀㄀䘀䌀㌀䐀㄀㄀䈀䔀㌀㌀䌀䌀䈀㐀䘀　䌀㈀䘀　㐀㈀䘀㈀㠀㔀㄀䘀　㠀㌀䘀㐀　㐀㤀䘀䄀　䔀㜀䐀　㜀㈀㔀䔀䈀䘀䈀䘀㐀㜀䐀㤀㐀䄀㈀䘀㜀䔀䈀䘀䐀㤀㐀䌀䄀㘀㜀㄀䔀㈀㐀䈀䘀䐀㌀䐀㈀㘀㤀㠀㤀㌀㜀䔀㈀䈀䈀㤀㐀㄀㘀䌀䐀㠀䈀䐀㘀㠀䘀䔀㘀㐀㜀㄀䈀㐀㐀　䈀䄀㈀　䐀䄀㌀㠀㔀䐀㄀㐀㘀䐀㄀㈀㈀䈀㌀㐀㌀㄀䈀䘀䔀㐀㤀䘀㠀㐀㄀䔀䌀䐀　㐀䄀䘀䌀䐀㘀㔀㘀　㄀㐀㜀　㈀䔀㔀㌀䌀㈀䘀㘀㜀䐀　㐀㈀䈀㘀䄀䌀䄀䘀䐀㌀㌀㜀㈀㈀䔀㘀䄀䘀㈀㐀䌀䘀　　㤀㤀㈀㔀㌀㤀㜀䘀㤀　䐀㤀㌀㄀㐀䄀㌀䘀㔀　㘀䔀㐀䐀䄀　䘀㐀　㜀㠀㔀㜀䐀㠀㘀䄀䌀㄀㈀䄀㌀　䌀　　䔀㔀㤀㘀㠀㐀䔀䘀㔀㐀㠀　㌀㈀㌀㐀㠀㄀㌀㈀㄀　㤀㐀䔀㄀㌀㠀㈀䈀䈀㔀䘀㈀㐀䔀㐀㌀䘀㠀䐀㌀　㈀㈀䄀㐀㘀㄀䈀㄀㈀䐀㜀㔀㔀䈀㠀㤀㘀䌀㘀䘀㤀　䔀䌀䔀㠀㤀䌀㠀㐀㄀㔀䌀䔀㘀䄀㈀㘀㜀㘀㄀㌀㌀㐀䈀䔀㔀㌀　㔀䌀㌀㔀㤀㤀䈀㤀㄀䔀㜀䈀㐀㈀㄀㠀㈀䐀㘀䈀䘀㐀㌀䄀㠀䌀㌀㘀㄀䐀䘀㐀㔀㜀䔀㈀㤀䈀㘀䔀䄀䌀䘀䐀䔀㄀䈀㠀㤀㘀䔀㤀䈀㔀䌀㈀㔀㔀䌀䌀㔀㔀䈀㌀㠀䌀㤀㔀䔀㐀㜀㌀㔀䌀㈀㈀㤀㤀䌀䐀䘀䐀䘀㈀㜀㌀㌀䈀䈀㤀㄀㐀䌀　䄀䌀䈀　㜀　㌀䘀䄀㐀䔀㤀䈀㌀㐀㈀㘀㤀䈀㐀䌀㌀㤀㈀䘀䐀㐀䐀㤀䘀㠀䌀䈀䌀㜀䐀䈀䐀䌀䌀㤀䈀㄀㠀䌀䌀䘀㤀䈀䔀䄀䔀䈀䔀䄀䔀㘀䌀䔀䔀䌀䌀䘀㌀䐀䄀　㈀䌀䘀㘀䈀㤀䈀䈀㜀䘀䄀　䄀㌀䌀㐀㌀䐀㄀㈀㄀㘀㘀䘀㤀㤀䔀㠀㔀㌀㔀䔀䌀㐀㄀㐀㘀　䈀㠀䄀㄀㈀㘀㠀㌀䔀㌀䌀㄀㔀㘀㌀㌀㐀䄀䈀㜀䄀㤀䌀㘀䄀䘀㐀䔀㐀䐀䔀㘀䌀䐀㌀䔀䈀䌀䄀䈀㜀㠀㔀㔀　㜀㠀㐀䄀䘀㠀㈀䔀䐀㘀㠀䌀䘀㤀㈀䌀㐀㄀䌀䐀䐀㈀㈀䐀㐀㈀㘀㐀䔀㘀　䈀䘀䘀㈀㤀㜀䌀㠀㔀㈀㠀䐀䄀㌀㄀㜀䄀㈀㌀㐀㔀䄀㌀䘀䈀䄀㌀䘀䈀㤀㤀㤀㜀䄀䌀㠀䐀䔀㄀㜀䈀䐀㄀㜀㘀㤀䘀　㐀䄀䈀䈀䈀㄀㜀㘀䐀㐀䘀㈀　㌀㌀䈀䘀䌀䈀㄀㌀㘀㠀㌀䔀䄀䄀䔀　㠀䘀㠀㤀䄀䈀㐀䈀㄀㌀䄀㠀㐀㤀䐀䌀㘀㜀䘀㌀㌀㄀㌀䈀䌀㌀㜀㔀䔀㌀㜀㐀䄀㌀䐀㔀㠀㌀䌀㌀㠀㌀䈀㤀㈀䘀㐀㌀䌀㌀䈀㜀㐀㈀䄀䈀䘀䘀䘀㌀䈀䔀㤀䐀　㤀㤀䘀䔀㜀䈀䔀䈀㔀㠀䄀㜀㘀䔀　䈀䔀䔀䐀㠀䈀䔀䔀䔀㌀䈀䔀㤀㤀㔀䔀㄀㤀㌀䘀㔀䐀㄀　䈀䈀䔀㘀㜀㌀䔀㠀㔀㔀㌀㌀䐀䌀㠀䘀㔀㔀㌀㔀㐀䔀㌀㌀㘀㌀䈀䘀㈀㔀㌀䌀䔀㐀㤀䘀䈀㠀䈀䔀㤀㄀㠀䐀㤀　㔀㘀䌀䌀䔀䈀㤀㐀㈀㐀㠀䌀㘀䄀㤀䘀䘀㄀㜀㤀㤀䔀䄀䈀㈀䐀䔀㐀䈀㤀㔀㐀㜀㤀䈀㔀䄀䌀䔀㠀䐀䔀䔀㠀㔀䔀䐀䌀㄀䈀㘀㄀㠀㔀㠀㜀䌀㤀䔀㐀䘀䘀䈀㐀䐀䐀㐀䄀㘀䈀㔀㤀䌀　㜀㔀㈀㤀㌀䔀䔀㘀䐀䄀䘀䈀㘀㌀㔀㐀㤀㜀䘀㤀㔀㘀㌀㜀䘀㘀䄀㤀䄀㐀䘀䘀㐀㜀㠀䔀䘀䐀㔀㠀䄀䘀㐀䐀㐀㐀㔀䔀㈀䐀㜀䌀㈀　㜀䌀㌀　㜀䌀㈀㠀䘀䌀㜀䌀䘀㠀㜀　䘀㠀㐀㠀䘀㠀㘀㠀䘀㠀㔀㠀䘀㠀㜀㠀䘀㠀㐀㐀䘀㠀㘀㐀䘀㠀㠀㔀䘀　䄀㤀䘀　㠀䈀䔀㄀㤀㜀䌀㈀㈀䘀㠀㜀㐀䘀㠀㜀㔀䘀　㤀䈀䘀㄀䄀㜀䔀㈀䐀䐀䄀㌀㠀㔀䄀㄀䌀㘀䐀㄀㈀㈀䐀㠀㤀㌀㘀㠀䐀㌀㘀㠀䈀㌀㘀㠀䘀䈀㘀㠀㠀䈀㘀䌀㐀㔀㔀㐀䐀㐀䘀　㤀㌀䐀　䐀䄀　䄀㜀㌀䄀㜀㘀䐀㔀㈀㤀䔀㄀䄀㤀䔀㄀㘀㤀䔀㄀䔀㤀䔀㄀㄀㤀䔀㄀㌀䈀䌀㈀㌀㌀䐀㤀㤀㘀䌀䌀　䄀䐀䘀䌀㔀䐀䘀䘀䄀㐀㤀㜀㠀㐀㄀䘀㠀㜀䔀䔀㘀䌀　㐀䘀䐀㤀䄀㈀䘀䌀㈀䌀䈀䌀㈀㠀䘀䌀䔀　㠀䘀䐀䄀　䈀㠀䈀䘀䈀䘀㐀㄀䄀䘀㜀䈀㔀㌀㄀䈀㜀䄀㄀㈀䈀䘀㔀㔀䐀㄀䘀䐀㌀㐀㜀䘀㐀㔀㄀㠀㌀䔀㤀㤀䐀㜀䄀㈀㜀㤀㄀㌀䔀䄀㤀㔀䘀㌀　䔀㌀㄀㈀䄀㜀䔀㠀㜀䐀㌀㤀㔀㄀㐀䔀㤀㈀㤀㌀䔀㔀㄀㐀㌀㤀㔀㔀㐀䔀㤀㌀䐀㌀䔀㔀　䌀㜀㤀㠀㜀㤀䌀㈀㤀　䘀䌀㠀㠀㌀䘀㈀㤀　㜀䌀㔀䔀㄀䔀㤀㘀㐀㜀䔀㐀㔀㄀㜀㤀㐀䌀㄀䔀㤀㜀㈀㜀䔀㐀㐀㤀䘀㤀㠀㈀㌀䌀㈀㔀㔀䘀㤀㐀㈀䘀䌀㤀㤀㜀䔀㔀㘀㤀䘀㤀㠀䄀㜀䌀㔀㔀䈀䔀㈀㘀㔀䘀㔀㜀㌀䔀㤀㔀䄀㐀㤀㈀㔀㔀㠀䄀㐀䄀㔀㔀㜀䔀㤀㔀䄀㘀　㈀㈀䄀䄀㠀㐀㈀㈀䄀㔀䐀㘀㔀䄀㠀㐀䌀㘀㔀䄀䈀䈀　㤀㈀㐀䄀㈀㤀䄀䐀㜀㈀㔀㐀㘀䐀㤀㔀䄀䈀䔀䄀䄀㠀䈀䄀䄀䄀㤀䔀䌀䄀㔀㌀䘀㔀㔀㔀䈀䔀㘀䄀䄀　　䄀㔀㐀㐀㌀㔀㔀䄀㠀㄀䄀䄀㤀㈀㈀䐀㔀㔀㄀㜀㔀㔀㈀㤀䐀㔀㔀㄀㜀㜀㔀㠀㌀䔀䄀䄀䄀䈀䄀䄀㤀䔀䔀䔀䄀㐀㘀䐀㔀㐀㌀䐀䐀䄀㐀㜀䄀䄀䄀㔀䔀䄀䄀㔀䌀䘀㔀㔀㘀㜀䐀䐀㐀䌀䐀䄀䄀䄀䘀㤀䄀䄀㤀䔀䔀㔀㐀䈀㌀䐀㐀㔀䐀䔀䄀㘀䔀㌀㔀㔀䈀䌀䐀㔀㄀䘀㜀䄀㠀䈀㤀䔀䄀㔀䔀㌀㔀㐀䘀㌀䐀䄀䄀㤀㘀䄀䈀䌀㜀䐀㐀䔀㌀䔀䄀　㤀䈀㔀㐀㈀㌀䐀䄀㔀䈀㘀䄀㠀䄀䐀㘀䄀㤀䈀㜀䄀㐀㄀㤀䐀㔀㈀㈀䘀䄀䄀㤀㜀䐀㐀䌀䈀䔀䄀䈀㐀㜀䄀㐀㔀䈀䐀䄀䄀䘀䔀䄀䌀㌀䔀㔀㄀㜀䘀㔀㄀㤀䘀䄀䄀䈀䘀䄀䄀䌀䘀䐀㐀䔀㜀䔀䄀　䈀䘀㔀䄀㔀䘀䄀㐀䄀㔀䈀䐀䄀䄀㜀㤀㌀㜀㐀䈀㈀㐀䔀䐀㄀䔀䐀㜀㔀　㜀䐀䐀㔀㄀㜀㜀䐀㈀㤀䐀㜀㔀㄀㜀㜀䐀㠀㌀䔀䔀䄀䄀䈀䈀䔀㤀䔀䔀䘀䄀㐀㘀䐀䐀㐀㌀䐀䘀䄀㐀㜀䈀䔀䄀㔀䔀䈀䄀㔀䌀䘀㜀䐀㘀㜀䐀䘀㐀䌀䐀䈀䄀䄀䘀䄀䔀䐀　㤀㌀䘀㐀㘀㐀㌀䐀㐀㔀㐀䘀䐀㔀䐀㌀䘀㐀㜀㐀㌀䐀㠀㌀䄀䐀䘀㠀㜀䌀䘀䐀㄀㌀䈀䐀㐀　㘀䘀䐀　㄀䈀䘀㔀㈀㘀䘀䐀䄀㐀䐀䔀䄀䌀㤀䘀䐀㈀㔀䈀䘀㐀㔀㘀䈀䐀㠀䐀㈀䐀䘀䈀　㄀䈀㘀䔀䈀㠀㜀䘀㐀㜀㄀㜀䐀㐀㈀㤀䘀䔀㈀䈀䘀䔀㌀䘀䄀㘀䐀䘀䐀㄀䈀䘀䐀㠀䔀㜀䔀㔀㜀㤀䘀䐀㔀䈀䘀䐀㔀䔀㜀䘀㐀䔀䘀䘀㐀㜀䈀䘀䄀㜀䐀䘀䐀㠀㄀䘀䔀䈀䐀䘀䔀㔀　䘀䘀㐀㄀㜀䘀䄀㐀䘀䘀䄀㠀䌀䘀㌀䈀䐀㤀㐀䔀㄀㔀䄀㜀䄀䄀㔀㌀䌀䐀䄀㤀䔀䔀㔀䌀䔀㜀䐀㐀㜀　㘀䄀㌀䄀䈀㔀㤀䌀䔀䈀㤀䐀㄀䌀䄀㜀䈀㘀㤀㌀䔀䈀䐀㐀㜀㄀䔀䄀㌀䄀䘀㔀㤀䌀㌀䌀㈀㜀䐀䘀㘀㤀䔀㠀㄀㐀㌀䄀㐀䐀㤀䐀㘀㘀䐀㄀㄀㜀䄀㌀㈀䘀㐀㔀㔀䘀㠀䔀䈀䔀㄀㈀䘀䐀㜀㤀䘀㐀㤀㜀䐀㄀㔀䘀㐀㜀䐀䘀㘀㔀㤀㤀㔀䔀㈀㜀㐀㜀䌀䄀　㤀㘀䌀　㌀䔀䘀㤀㐀䄀䌀㐀㔀䘀㈀䔀㜀䘀㈀㌀䐀䈀䄀㐀䔀㌀㤀䔀䄀㜀䄀㘀䄀䄀㐀㄀䄀䄀䈀　䔀䐀㐀㔀㘀䘀㔀㔀㌀䈀㜀㔀㈀䈀㤀䈀䄀㐀䘀㈀䐀䄀㐀䌀㄀㘀䄀䄀㔀㔀䄀㐀㌀䌀㌀䐀㔀㜀㘀䈀㔀㠀㜀㐀㘀䄀䈀䐀㜀䐀㐀㔀䈀㌀㐀㔀㄀䘀䐀㤀䈀䘀䄀㤀㘀䔀䔀䐀㐀䄀㤀㌀䄀㤀䈀䔀㘀䔀㠀㜀䔀䈀䄀㄀䘀㈀䐀䐀㔀　㌀䘀㔀䄀䐀䘀㐀　㠀㜀䈀䄀䈀㔀㤀䈀㐀㐀㈀䐀䘀䄀䘀㄀䘀䄀㈀㌀㔀㜀䄀䈀䈀䐀䔀㐀㔀㐀䘀䔀㤀䔀㜀䘀㔀㘀㄀䐀䄀䌀䔀㤀䄀㜀㐀㠀䌀㜀㘀㐀㈀㜀䘀㜀㘀䔀㤀㄀㜀䘀㔀䄀䘀㘀㤀䈀㜀䘀䔀㤀㌀䘀䔀㤀㘀㐀䔀㌀㠀䘀㔀㤀䐀䘀䄀䘀㐀䄀㘀䐀㌀䌀　㈀㤀䄀　㔀䘀㌀㤀㠀䐀㤀䌀㈀㈀䘀䄀㜀㔀䘀㐀㜀　䘀㐀㈀㠀䘀䐀㈀㘀㜀䄀㌀䄀㜀䄀㤀䄀䌀䔀㐀㘀㔀䘀㠀䐀䈀䔀㐀䄀䈀䘀㠀䐀㤀䔀㠀㤀㤀䔀䄀㄀㜀㌀䐀㄀㌀㜀䄀㌀㘀䘀䐀㈀䔀䘀䄀㈀㘀䘀㐀㜀䌀䐀㘀䘀㠀㌀㔀䄀䄀㈀　㔀䄀䐀㤀　㄀䈀䔀㔀㈀㘀䘀㤀䄀㐀䐀䌀㈀䌀㤀䘀㤀㈀㔀䈀䔀㐀㔀㘀䈀㤀㐀䐀㘀䔀㤀㜀㌀䈀䔀㐀㐀䔀䈀㤀㐀䈀㌀䔀㈀䐀㜀㜀䌀䈀㘀㜀䔀㐀㄀䔀䘀㤀䄀䌀䐀䌀㈀䈀㤀䘀㤀㌀䘀䈀䔀㐀㜀䔀䘀㤀䄀㔀䘀䌀㐀䄀䘀䔀㤀䈀䘀䌀㔀䄀䘀䔀䈀䈀䘀䌀㐀㘀㜀䔀㈀䈀㈀䘀䌀㠀䔀䘀䔀㐀䘀㜀䘀㈀㘀䘀䘀㈀䄀㈀䈀䌀㈀㐀㈀䘀䌀䈀㈀䈀㠀䄀㤀㐀㔀　㤀㘀㄀䄀䄀䘀㈀㘀䄀㠀㠀㤀㘀䄀㤀㈀㤀䄀䄀䌀䄀㘀䄀㠀䄀㤀㘀䄀㤀䄀㤀䄀䄀䔀㘀㘀䄀㠀㌀䈀䐀㐀㐀㌀䔀䄀㘀㄀䈀㔀㐀㐀㈀䐀㔀㔀㠀䘀䄀㠀㘀㔀㘀䄀䄀㌀䐀䄀䄀㐀㤀䔀㔀㐀㤀䈀䐀㔀䘀㌀䔀䄀䈀　㌀䄀䄀㈀㠀䔀䄀䄀㘀㌀䔀䄀䈀㠀㌀䄀䄀㄀㐀䔀䄀䄀䘀㜀䐀㔀　㜀䔀䄀䘀㜀䔀䄀㐀㌀䘀㔀　㜀䘀㔀㤀㄀䘀䄀䄀㌀㌀䄀䄀䘀䘀䔀䄀㐀㌀䔀㔀㘀㤀㜀䐀㐀㘀㔀㜀㔀㠀㔀㐀㌀㘀㄀䄀㄀㄀䈀䔀䄀㐀㈀䐀䐀㐀㠀㄀㜀䔀㤀䌀㘀䈀䄀㔀㠀㌀㜀䐀㄀㈀㔀䈀䄀䄀㤀㘀䔀䄀㘀㤀䈀䔀䈀㄀㘀䈀䄀䄀㔀㘀䔀䄀㔀㔀䈀䔀䈀㔀㈀䐀䐀㐀㘀䈀㜀䐀㔀䔀䐀㜀㐀㤀㤀㄀䔀䄀　㘀䘀䐀㌀㘀㌀䘀㔀䔀䐀㜀䄀㤀䌀㄀䔀䄀䘀㈀㜀䔀㠀㠀㤀䘀䄀㄀䔀㌀䐀㔀㜀䐀䘀䄀䈀䔀㜀䔀㤀㈀㜀䘀㐀　䄀䈀䐀㔀㈀䄀䘀䐀㈀䄀䈀䘀㔀㄀䄀䈀䐀㔀㘀䄀䘀䐀㌀䔀䈀䘀㔀䈀㌀㜀䄀䄀䘀㜀䔀㐀䔀䔀䘀㜀㌀䐀㈀㤀䌀㠀　㄀㌀㜀㐀㐀㈀㐀䔀䈀䄀㤀㌀䔀㄀㘀㐀㌀䄀䈀㘀㄀㌀㜀㘀䄀㐀䄀㌀㄀䌀䔀䐀㌀㠀㐀䔀䌀㐀䌀㤀㜀㈀㔀䌀㈀㜀䔀䄀㌀㐀㜀㄀㐀䄀䄀㈀㈀㜀䄀㌀㈀䘀㐀㐀㐀䘀㐀㔀㔀䘀㠀䘀䈀䔀㄀㄀㜀䐀㈀䈀䘀䄀㠀䔀㠀㤀䘀㐀㈀　㜀㄀㠀㈀䌀㐀㄀䐀㐀㠀䈀㤀　䔀䄀㐀㔀䌀　㐀㈀㤀㌀㜀㠀㌀㤀㐀㔀䈀㐀㄀䌀䄀㄀䐀㈀　䔀㔀㄀䔀㤀　㜀㈀㘀䘀㐀㠀㜀㤀㌀㐀䄀㐀㌀䌀　㘀㔀㈀㤀䔀　㠀㈀㤀㐀䘀㠀㔀㤀㐀䔀䘀㠀㘀㌀㐀䔀㜀㐀㈀㠀㈀㐀䈀㈀　䌀㄀㐀㜀㈀　䈀䈀䔀㔀㤀　䐀䐀㘀㌀㤀　䐀䐀䔀㌀㤀　䐀䐀㄀㌀㤀㔀㘀䈀㔀㌀䔀䔀㄀　䔀㌀䈀㤀䘀㐀䈀㌀㌀㄀㐀㤀㈀䔀㤀㘀　䘀䌀㤀㠀㜀䔀㔀㄀㈀䈀㤀㔀㐀㌀䔀㈀㈀㤀㜀䌀㤀㐀㜀䔀㔀㜀㈀䘀㤀㤀㠀㜀䌀㔀䌀㌀䔀㈀㄀㔀㜀䌀㠀㤀㔀㜀㈀㤀㔀㔀䌀㈀䐀䐀㜀䌀㠀䈀㔀㜀㈀㤀䐀㔀䌀㈀䘀㌀㜀䌀㠀䘀㜀䔀㔀　㜀䘀㈀䘀㜀䘀㈀㐀㌀䘀㤀　㜀䘀㤀㤀㄀䘀䌀䄀㌀㌀䌀㈀䘀䘀䘀㈀㐀㌀䘀㤀㘀㜀䘀㤀㘀㤀䘀䌀㠀䈀䘀䌀㠀㐀䘀䔀㔀㔀䘀䔀㔀㘀㜀䘀㈀㜀㌀䘀㤀㠀㔀㄀䄀䄀㘀㠀㘀䄀䈀㄀㄀㘀䄀䄀㐀㄀䄀䄀㔀㐀㘀䄀䈀㌀㄀䔀䄀㌀㘀㌀㔀㔀㘀䐀䐀䄀䔀䌀㘀䄀㤀㤀䘀䄀䄀　㜀䐀㐀䌀䘀䐀㐀㈀㈀䘀㔀䄀　㔀䄀䄀䌀䐀㘀䄀䄀㜀㔀㘀䄀䈀䐀䐀䄀䄀　㤀䔀㔀㔀㜀䈀䐀㔀㜀㌀㘀䄀㤀䘀䐀䄀䄀䘀　䔀䄀㠀㠀㌀䔀䄀㤀　䘀䄀䈀㔀㜀䄀㔀䈀䘀䐀㐀㘀䈀䐀䄀㌀䐀䔀㔀㔀㘀㜀䐀㔀㘀䘀䐀㔀㌀㤀䘀㔀㌀䈀䘀㔀㤀䔀䈀䄀䄀　䈀䔀㔀㌀䐀䘀䄀䈀䈀䘀䄀㤀㠀䈀䈀䄀㠀䄀䄀䔀䄀䄀䄀䈀䔀㤀䔀䄀䘀䄀㌀䄀㔀䐀㐀㌀䐀㜀䐀㐀䈀㔀䘀㐀䘀㔀㌀䄀㐀㜀䐀㜀䐀㘀䈀㤀䈀䄀㠀䔀䄀䔀䄀䈀䔀䈀䔀㤀㌀䌀㔀䐀㔀䘀䔀㜀䔀䈀　㘀䈀䄀㐀　䘀㜀䐀㜀䌀㌀䘀㐀㜀　㌀䐀㐀㈀㠀䘀䐀㐀䄀㌀䘀㐀㘀㠀㌀䐀㐀㘀䐀䘀䄀㔀䔀䘀䐀㘀䈀㌀䘀㔀㄀䌀䘀䐀䈀　㔀䔀䄀㈀㤀㜀䔀䄀㐀㜀䘀㐀㌀㈀䘀䐀䄀㠀㔀䔀䄀䔀㄀䘀䐀㌀㠀䘀䔀䈀䄀㜀䘀㔀㘀䔀䔀㜀㘀䔀䈀䐀㐀㜀㔀䘀䐀　䐀䘀䔀㤀䔀䘀䘀㔀䐀䘀䘀㐀㐀㔀㜀䐀㐀㤀㔀䘀䐀㘀㔀㜀㄀䌀㜀㈀㠀㐀㘀㌀㌀㤀㌀䔀㈀㜀䌀㤀㐀㤀㜀㘀㔀㈀㤀䌀㔀㐀䌀㜀䔀䘀㌀㐀㜀㘀㠀䄀䄀㌀䌀㜀䄀㈀䌀㜀䄀㌀㈀㜀䄀㈀䄀䘀㐀㔀㜀䘀㄀㄀䘀䐀㔀㔀䘀㐀㌀㜀䘀䘀　䐀㈀㐀㘀㤀䔀䔀䄀䌀䘀䔀䌀㄀㜀㌀㈀㐀㐀䔀㌀㤀䘀䈀䔀㐀㠀㤀㐀䔀㘀䘀㈀䔀㈀㜀㌀㤀㜀䐀䈀㠀㤀䌀㤀䌀㜀㔀㤀㄀䄀䌀䄀䌀䐀㔀　㤀䐀䘀䔀㠀㠀䈀㘀䘀䘀㐀䌀㌀㌀㜀䘀䄀䔀㌀㄀䈀㤀㜀䘀　　䐀䘀㘀㈀䈀䌀䌀䈀㜀䐀䈀㘀㈀㘀䈀㔀㄀䈀㔀䘀　㠀䌀㔀䘀㈀㄀㜀㈀㐀䄀䘀㌀㜀䘀䘀㌀㈀䈀　㄀㤀㔀䈀䔀䘀䐀㐀　䘀䌀㤀䈀䄀䌀㐀㄀㜀㈀　䄀㘀㌀㐀䄀䄀㘀䌀㠀　　䘀㌀㈀㄀㈀㐀㌀㌀㈀㤀㤀㤀㈀㌀㌀䈀㐀㤀㘀㤀㄀䌀㄀㤀㌀䄀㄀㐀䔀㐀　㠀㈀䔀㤀䈀䐀㈀㘀㔀㌀㔀㔀㤀㤀㌀䌀㈀䘀㈀㜀䄀㤀㤀㐀㌀㄀㄀䌀㐀㜀䄀䄀䔀㘀䌀㈀　㄀䈀㔀㄀㔀㐀㌀㘀㤀㘀㐀䐀䄀㠀䈀䄀㘀䌀㈀䄀㤀䈀㔀㄀㐀䐀䐀㤀㔀㈀䈀㘀䄀㈀䔀䈀㘀㔀䄀㤀㘀䌀㐀㌀䈀㔀㘀㔀㘀㜀䐀㤀㠀㔀䔀䄀䌀㠀㘀䔀䈀㈀㌀䈀䐀㔀㤀㌀㌀䐀䔀㐀㐀䐀㔀㐀㔀䘀㤀㘀㜀㌀㔀㐀䐀㤀㈀　㜀䄀㈀㄀㜀䄀㤀㄀㐀䄀䄀㌀㤀㜀䈀㌀㤀㌀䄀㤀㌀䐀㔀䐀䈀䈀㤀䘀䄀䔀㄀㘀㜀䄀㜀㔀㄀　㔀䔀㜀㈀䈀㠀㄀䔀䌀㌀㔀䔀㜀㈀䄀䌀㤀䔀䌀㠀䐀㄀㈀㜀㐀㜀䔀　䔀䌀㈀㌀㘀㜀䐀㈀䈀㔀㌀㜀䘀㄀㔀䐀㠀䐀䄀䐀　䔀㄀㤀㄀䘀䌀䔀㈀㌀㄀㠀䌀㘀䐀䘀䈀䐀䌀䐀㠀䌀䌀㌀㤀㤀䔀　㐀䌀㌀㐀䔀㜀㄀䈀䌀䔀䌀㠀䌀㤀㌀䌀㤀㈀䄀㤀㜀䌀㤀䔀　䘀䔀㜀㄀㤀㈀䔀㤀㠀䔀䌀䄀㐀㜀㈀㤀䐀䘀㐀㜀㤀䌀㐀㌀䄀䌀㔀䌀㠀㔀䄀䌀䌀䌀䄀㔀䘀㜀㄀㠀䌀䘀䄀䔀㌀䐀㜀㌀㌀䘀㄀䐀㄀㤀㠀㜀䘀㄀㤀㠀㜀䌀䌀㔀䐀䈀䘀䔀㘀㜀㤀䄀㘀㄀䄀㄀䌀䘀䐀㜀㘀䄀㠀㠀䌀䌀㜀㔀䐀㄀䔀䈀㤀㤀䌀䔀㈀㜀㈀㜀䘀㤀䐀㜀㄀㌀㄀䌀䄀㔀㄀㔀　㠀䔀㈀㔀㔀　　䔀㠀㌀㜀㈀㈀㐀㠀㄀㜀㈀㄀䌀㤀㐀㄀㌀㌀㄀䌀䄀㠀䘀㠀䐀䘀㐀㈀䄀㠀㜀㈀㜀䌀㔀㌀㠀䌀䌀䐀㜀䄀　㐀䌀䘀㘀㘀䘀䌀䌀㜀䐀䘀㘀㘀㤀㜀䐀㐀㤀㈀㌀㜀㌀䔀䄀㠀䈀䌀䌀䄀㤀㄀䘀㜀䈀䄀㐀㄀㌀䐀㐀㤀䘀䈀䐀䔀䌀㜀㤀㄀䄀䌀㈀䘀䔀䄀㜀㠀㠀䔀㘀䈀㄀㠀㜀㘀䌀㐀䔀　䘀㌀㠀䄀䐀㤀䌀䌀䔀䘀㐀䄀　䐀㌀䌀㌀㄀㤀㐀　㐀䘀㌀㠀䄀㌀䈀㤀䄀䐀㈀㜀㤀䐀㠀䐀䌀䔀㜀㘀䐀䄀㤀䔀䘀㔀㐀㠀䐀㘀　䄀䐀䄀䔀䈀㄀䔀㜀㈀㔀䘀䄀㌀䌀㌀䔀䔀䔀㜀䐀㄀䐀䄀㜀㐀　㘀䈀㘀㘀䈀㜀䈀㐀䌀㌀㌀㌀㔀䐀㘀䘀䔀㈀䄀㔀㜀㔀㈀㠀䘀　　䌀㄀㌀䄀㘀㄀䐀㠀䔀㐀　㤀㤀㤀䔀㠀㄀䈀㜀㄀䐀䔀䐀　㠀䈀㈀䌀㔀䘀㌀䘀㄀䘀㘀㜀䔀䔀㤀䌀㐀㄀㠀䌀䔀㜀䐀㠀㜀㐀㌀㈀䔀㜀㄀㄀㈀㤀䈀䔀㔀㤀䈀䔀㔀㤀㤀㐀㠀䄀㈀㜀䌀䈀䘀䐀䔀㄀㐀㄀䔀㄀㐀㄀䌀㠀　㔀䌀㜀㔀㈀㄀　䈀㤀㘀　㜀䄀㜀㠀㘀㈀㜀㠀㄀㈀㘀㔀㈀　䄀㜀䈀㐀䌀㌀㜀㌀䌀㌀㜀㌀㐀㤀㠀㘀㤀䘀　䌀㘀䘀㈀㘀䔀㔀　䔀㜀㈀　㜀㤀㌀㤀㌀䄀　㠀㄀㤀㔀㜀㜀㜀㐀㄀䔀㠀䐀䈀㜀㤀䄀㄀䌀㤀㜀㜀㘀㈀䔀㄀䘀㌀㜀㤀　㘀䐀䄀㤀　㘀㐀䈀㘀䌀　㐀㄀㔀㐀㜀㈀䘀㘀㐀㤀䈀㌀䈀䈀䄀㜀䘀䘀㠀㔀㐀䌀㐀㌀㄀䘀　䄀䘀　䌀䘀㤀　䈀䌀㔀㈀㤀㈀㘀㔀㈀䐀䘀　㔀　䐀䈀䌀㐀㘀䘀㌀㔀㄀　䔀㜀䘀㔀㘀㈀　㔀㜀䈀䄀㐀䄀㌀㔀䈀㌀㜀　㈀㐀㜀㐀㈀䐀㘀䌀䘀㈀䈀㔀㜀䘀㠀㤀䄀䔀䈀㄀㜀䐀㔀　㄀㄀㤀㔀䌀㔀䐀㈀䌀䔀㔀㘀㤀䌀㤀䘀䄀䄀㘀䄀䄀䄀㈀㘀㈀㔀䄀㤀㘀㈀㔀㔀㐀㈀㘀㤀䄀䄀䄀㔀㈀䄀䄀㔀㤀　㘀䄀䄀䈀䌀䄀䌀㠀㔀㘀㄀䐀㌀㠀䈀㈀㔀㄀㄀䌀㌀㜀㜀㘀㈀㄀䌀䐀䘀㄀㘀㈀㐀䘀䌀䄀䔀㈀㔀㠀䈀㄀　䘀㔀㔀䔀㄀㐀㠀䈀㄀㈀䘀㔀㔀䔀㜀䈀㠀䔀㐀㐀㔀䈀䄀㐀䔀䈀䘀䄀䌀㐀䘀㔀㌀　䐀䘀䐀㤀䄀䘀䔀㄀㔀䐀㔀䔀㈀㄀㠀䔀䌀㘀䐀䄀䄀㘀䘀䄀㈀㌀　䌀䄀䔀㜀㄀㠀䔀䌀㈀㌀㈀䄀䔀　䈀㠀䔀㐀㄀㔀㘀䄀㄀䄀䔀㌀㘀　㌀㤀䐀㘀㘀㈀　䌀㄀㜀㠀䔀㠀㌀㠀㌀㤀䐀㌀　㔀㜀㈀㤀㐀䔀䘀㄀㌀㄀㌀䘀䌀䈀㘀　䄀䘀　䄀㄀㈀䄀㠀㐀㤀㜀㠀䌀㌀㐀㐀㌀䔀㤀䔀㌀㐀㜀㄀䔀㌀㜀㐀䌀㌀䌀㔀㠀㤀㜀㄀㈀䔀㔀䔀㤀㔀䔀㐀䈀䘀㠀㘀㤀㜀䄀䐀㠀䐀㌀㜀䔀㘀㔀㘀䐀㤀㄀䈀㜀㌀㜀䘀䐀㠀㄀䈀㜀㌀䔀㘀䘀䌀䈀㠀㜀䌀㤀䌀㔀㈀䐀㠀㄀䈀䄀䘀䄀㐀㔀㐀䔀㌀㠀䘀㌀㤀㘀䈀㔀䔀㈀㜀䐀㜀㜀㄀䐀䌀䈀㠀㐀㄀㘀䔀䔀　䐀䔀㜀　㄀䌀䌀㘀䐀㤀㌀㘀䌀㜀㘀㄀㤀㐀㘀㄀䔀㈀㌀　䈀㈀㌀㤀　䔀䐀䈀㐀㤀㤀㈀䔀㌀䈀　䐀䐀㌀䌀　㘀㠀䔀䌀㐀㐀㠀㜀㌀㈀㐀䘀㘀㄀䌀䘀㜀㜀㈀䈀䘀䐀䌀㐀䘀㔀㤀䔀䌀　㤀㤀㜀㤀㄀䌀䈀㌀䔀㜀　㌀㔀㔀㔀䔀㌀㤀㠀㘀㘀㌀䐀䐀㔀㘀㘀䘀䘀㜀㜀㤀㄀䔀䄀䔀䄀㈀䈀䘀䄀　䄀䔀㔀䈀㌀䔀䘀㄀㌀䐀㐀䌀　䘀㠀㌀䔀㈀䄀㌀　䈀䔀㠀䘀　䄀㌀㤀䌀䔀㐀㤀䄀㜀㈀㈀㠀䔀㜀　㘀䌀㈀䄀䔀㄀㄀㠀㐀㜀㔀㈀㔀㌀㄀㌀䔀㌀㔀　㌀㌀㄀㌀䔀㌀㔀　　䈀䘀㘀㠀䐀㈀㔀䐀㐀䌀䄀㜀㤀䌀㜀㜀㤀㠀㜀䐀䄀㌀䄀䔀㜀㤀䌀㜀㌀䐀㐀䌀䔀㜀㤀䌀䘀㜀㤀㤀䘀䌀䄀㤀䌀　䘀㤀䐀㠀䘀䄀㠀㠀㌀㜀㌀䐀䔀㌀㤀㐀䘀㤀䐀㤀䐀㠀䘀㤀䐀㐀䘀䄀㠀㠀䈀䘀㌀㔀㜀䔀㜀䄀䘀䐀㐀䌀䐀䘀㤀䌀㈀䘀㤀㤀㈀䈀䄀㌀䈀䘀䘀䔀㘀㜀䌀㐀㌀㌀䐀㤀䌀䔀䘀㤀䌀䔀䘀䄀㠀䐀䌀䈀㤀䔀㐀㔀䌀䄀㈀䐀䔀䌀䔀㄀㔀㔀㘀䔀䄀㌀䔀㄀㄀㔀䘀㈀㐀㤀㤀䘀䄀㐀㘀㔀㈀㈀㌀䄀㤀㌀㐀㈀　㤀㈀㄀㘀　㤀㔀㈀㐀㔀㈀㐀㈀㌀㤀㈀㐀㄀㠀㌀㈀㌀䔀㄀㠀㠀䄀㐀㔀䈀㈀㈀㌀䄀㤀㈀㐀㔀㐀㌀㈀㌀䐀㤀㤀㄀㘀䌀㄀䄀㄀㄀䄀㤀㄀䔀䄀㤀㐀䔀㈀㌀㈀㌀㌀㔀㈀㈀㌀㔀㘀㤀㔀㐀㈀㐀㈀㜀㤀㈀㐀䈀㘀㌀㈀㈀㜀㔀㈀㌀㜀㔀䔀㤀䘀㘀㐀㠀㔀䔀㈀㐀㤀䘀䌀㘀㐀㔀㄀䄀㐀㘀㄀䄀䐀㈀䌀㐀㐀㠀㔀㄀䄀㐀㌀㄀㐀䐀㠀䄀㌀㐀㠀㤀㌀㐀䄀㌀㈀㤀䔀䌀䈀䘀㐀䘀䐀㄀　䌀䘀㘀䐀䐀㘀䘀䐀㄀䐀䐀䐀㄀䐀䘀㜀　㈀䌀㌀㘀㈀㜀㜀䄀㈀䔀䘀䄀㄀㄀䌀䐀㠀㔀䔀䔀㤀㠀㈀㜀㈀㐀䌀䌀㔀䄀䘀㔀䐀㜀㜀㐀㌀㄀䈀㘀㠀䔀䘀䄀㄀㔀㜀䔀㄀䐀㜀㐀㔀䌀㘀䌀㔀䐀䈀㔀䐀㈀䐀㘀㤀䈀㜀㔀䌀䄀䈀㌀䈀㄀䘀䘀㤀䈀䐀䘀㄀㜀䔀䐀㄀䔀䐀㌀㤀䘀㄀㌀㌀㄀㠀䐀㘀䌀㐀㄀㐀㈀㈀䌀㠀䔀㔀㄀䐀㠀㜀㘀㤀䄀㌀㠀㠀㜀䔀㜀　㐀䌀㜀䄀䐀䔀䌀㤀䈀䄀䄀䔀㠀㈀䄀㤀㐀䌀㐀䐀㄀㘀㠀㐀㌀㐀䄀㠀㘀　㔀㐀䐀㠀㄀　㔀㐀䐀䘀䐀㤀㜀㜀㤀　㜀䈀㌀㜀䄀㤀㌀㠀㔀㌀䄀㔀㜀㌀㘀㌀㔀㔀㤀䈀㠀㄀䌀㈀㠀　㜀㄀㈀䈀㤀䈀㘀㘀䈀㜀㌀㜀䌀䐀㠀䐀㌀䔀䐀㐀㤀㤀㘀㔀䈀䔀䔀㤀㘀㠀㌀㄀㜀䐀㔀㘀㈀䈀㘀㜀䌀㄀㔀䌀㜀㌀㔀㤀䄀㘀㌀䈀㜀　䐀㌀䌀㜀㌀㌀㜀䄀㤀䌀䐀㤀㐀䌀䐀䐀㤀䐀䈀㌀㘀䐀㘀䄀㄀㜀㐀㔀䐀䌀㘀㜀㌀䘀㘀　㘀㔀䐀䌀㄀㌀㘀㜀䔀㄀㠀㜀䈀䐀䘀㌀㄀㘀䌀䈀䘀䌀㜀䐀　㠀䌀䌀㠀㤀㔀䄀䌀䄀㔀㌀㐀䐀㌀䈀㔀䐀䌀㄀㐀㄀㄀㜀㈀䘀䐀㘀䔀㔀　㠀㐀䐀䐀㜀㐀㌀㜀㐀㌀㌀㠀䐀䌀㐀㘀㔀㠀㘀㐀䈀㤀䌀䄀㠀䐀㠀㠀䄀㠀㄀䈀㜀㔀䄀䈀㠀㤀㘀䄀䔀䔀㜀㔀㘀䔀　䐀㔀㄀䌀䈀䔀㔀㠀䘀䌀㠀㜀㄀䔀䈀䈀㤀　䐀㐀㐀㘀䐀䈀㜀䄀㄀䐀䈀㐀㠀䔀㐀䈀㤀㠀䐀䐀䐀㘀㈀䐀㄀䌀　㘀䐀䔀䄀㌀㘀㄀㌀　䐀䐀䐀㄀㘀㘀䔀㐀䈀䐀㄀䌀㠀㈀䐀㜀㔀䐀䈀㠀㠀䌀㘀㘀䔀㤀㤀䐀䈀㔀䔀㌀㐀㜀㄀㌀䈀䈀䄀㤀䐀㐀㐀㔀㌀䘀㜀　㘀㜀㜀㠀　㘀㠀㤀䔀㤀䐀㤀㈀㄀䐀㄀　㔀䐀䈀㌀㐀㌀䐀㤀㐀䄀䐀䌀㘀㐀㜀㠀㘀䄀㔀䄀䔀㔀䐀㄀㜀　䄀䈀㤀㐀㘀䌀㔀䄀䄀㔀㌀㐀䐀㌀㈀䄀　㔀㐀䐀䄀䈀㤀㐀㘀䔀㔀䄀䄀㔀䈀　㘀㤀㤀㔀㈀㈀䄀㘀㔀㔀㜀㈀㐀䐀䄀䈀㄀㐀㌀㔀䄀䐀㔀㈀㜀㔀䐀㌀㈀䄀䐀㔀㌀㐀䄀䐀䐀㈀䘀㔀䄀㘀㔀㔀䄀䄀㘀䐀㔀䄀䄀㔀㌀䄀䄀㘀㔀㔀䄀䄀㘀㜀㔀䄀䄀㔀䘀䄀䄀㘀㔀㔀㘀䄀㘀　㔀䄀䄀㔀㔀㈀䐀㌀㈀䄀㘀㈀㄀㈀㐀㄀䔀㘀䈀䔀　㄀䘀㌀㠀㘀㤀䈀㔀㜀䈀㤀䄀䌀䐀㐀㤀㌀䈀㜀㘀　䔀㜀㈀䈀䘀㔀䔀㐀㘀㐀㜀䌀䄀䐀㔀㠀䌀㐀㤀䔀㠀㐀㌀㈀㄀㐀㠀㄀㔀䐀䄀　㐀㈀䄀䔀䌀䘀䌀㜀㘀㠀㈀䌀　䐀䌀䔀　㈀䘀䈀䈀㈀㤀㜀㜀䐀㤀㄀䈀䐀㘀㐀㠀䔀㜀䈀㤀㈀㜀䐀㔀䘀㈀㜀䐀㠀㌀䔀䈀㌀㐀㌀㘀㈀㐀䈀䘀䔀䈀　䈀䔀㈀㠀䈀㌀䄀䄀㈀㘀㈀㌀㌀㈀㘀㈀䐀㘀䘀㜀㘀㐀㔀㔀䘀㈀䌀㤀㔀䄀䈀㈀㄀㘀㘀䈀㔀　㘀䐀㔀㤀㤀䈀㘀䐀㐀㔀㤀㄀㈀䌀㘀㈀㔀䈀㔀㄀㈀㈀㐀䈀䐀㠀㔀㘀㌀㐀㤀㜀㈀䐀㔀㠀䄀㜀㔀䄀䌀䈀䐀㘀䄀䌀㔀㌀㘀䐀䐀㤀㄀䘀㠀㔀䔀㐀　䐀䈀㈀㈀䈀㘀䈀䐀㘀㠀䐀䘀㈀㐀㘀䘀㘀䐀㌀㌀䐀㘀㔀㈀䘀䈀䔀䔀㘀㜀　䘀㘀㔀　㌀㈀㜀䄀㈀㤀㜀䄀　㤀䄀䈀　䘀㐀㤀㄀䌀䈀㤀㠀䌀䔀㔀㌀㘀䌀㘀㜀㄀㠀䔀㘀䄀㌀䌀䘀䔀㐀㠀䐀㘀㔀㜀㠀䔀䄀㔀䈀㄀㤀䈀㔀㄀㄀㌀㄀㄀㈀䘀㈀㤀㤀䘀䐀㈀䐀䌀㠀㤀䌀㘀㄀䌀䘀㜀䔀㘀㜀　䄀㘀䈀䘀㤀　㜀䄀㜀㌀㘀㘀䈀䘀㠀㈀㐀㘀㈀　䔀䔀㄀䐀䌀䈀㄀㤀䘀䐀䄀䈀㌀㐀㠀㔀㌀㌀䔀䐀㘀䐀㌀㐀㠀䈀㐀㜀䘀㄀㈀䐀䐀䐀䌀㜀䘀㤀㜀㈀㄀㄀䔀䐀㌀㌀䐀㤀㌀　䘀䐀䌀㈀㤀㤀䔀㔀䐀䌀㐀㔀䈀䘀㜀㐀䔀䔀㜀㔀㌀㘀䐀　䄀䘀䈀㈀㄀䔀䌀䈀䘀䄀㤀䔀䘀䔀䐀䐀　䐀䈀㤀㈀㄀㌀㄀䌀　䌀䐀㜀㐀㌀㌀㐀㔀㠀㔀㈀䈀㔀䐀㈀㤀　㘀䈀䄀㔀㤀䄀䔀㈀䈀　㘀䈀㤀䐀㔀䐀䐀䔀䄀䔀㈀㄀㘀䈀㜀䄀㘀㔀䈀㔀㌀　䌀㜀㄀　䈀䐀䌀　㈀㌀㄀䐀㐀㈀䐀㜀㈀㠀䈀䌀㐀䄀䐀㘀䔀㄀㌀䈀㜀㐀㐀　䌀㜀㌀㤀䈀䈀䈀䌀䐀䌀㔀　㠀䈀㜀㤀㔀䐀䈀㐀䄀㠀䌀㜀㐀䐀䈀䈀䄀䔀䐀䌀㐀㈀㠀䈀㜀㠀㌀䐀䈀㐀㄀㠀䌀㜀㄀㌀䈀䈀䈀㔀䐀䌀㐀㘀䐀㘀䔀㠀㔀㌀䈀㔀　䐀䌀䌀䔀㔀㤀䘀㜀㈀䈀㘀㈀㌀䌀㘀㜀䐀䐀䈀䘀㄀㘀㄀㌀䄀㈀䔀䘀㐀㘀䌀䘀㠀䄀㠀㤀䐀㤀䌀㄀䔀䌀䄀　㌀　䘀㘀䐀䐀㌀㘀䄀䐀䈀㈀㤀㘀㜀　䄀䈀䄀䌀䘀㌀䐀䌀㈀䄀䔀䈀㌀䌀䈀㜀㐀䄀㌀䔀䐀㌀㈀䄀䔀䈀　䐀䈀㜀㐀䄀㈀㤀䄀㘀㔀㔀㐀䄀㌀㔀䄀䐀㤀㈀䐀䘀䈀㐀䌀䄀㤀䄀䌀㐀䄀䐀䈀㈀㈀㘀㜀㄀䄀䈀㄀䌀㄀䐀㜀㄀䄀䈀䄀䌀㐀䘀䐀䌀㈀䄀㘀㔀㤀䄀㔀㘀䘀㤀㤀䄀䐀䌀㈀䄀㐀㤀䐀㌀　㘀㜀㘀㘀㈀㈀䌀㠀䔀䘀㄀䔀䘀㠀㌀㜀䘀㘀㤀㤀䔀㄀　㌀㌀㔀㐀䘀䔀㠀䄀䌀㔀　䈀　㤀㜀䔀䐀䈀䄀䄀㤀䌀㘀㌀㤀㠀㌀㤀㌀䄀䘀㘀䌀䐀䐀䌀㔀㠀㤀䌀㐀㤀㜀㐀㠀䄀䄀䔀㌀䐀㄀㄀䈀㤀㈀䄀䈀㘀㐀㌀㘀㘀㜀䔀䘀㜀㔀䐀㌀㠀㜀㜀㈀㌀㄀㌀㤀㤀㈀㠀㌀㤀䘀㘀㤀㈀㔀㌀㐀䌀䈀㐀㈀㤀䄀㜀䌀㤀㘀㤀䔀㐀㔀㌀㌀㤀㈀䄀㌀㜀㘀㘀㘀䘀㔀㈀㌀㤀䔀㜀㘀䐀㐀䄀㜀䔀䌀䔀㜀㘀㔀䈀㔀㌀㤀䄀㘀䔀䄀䘀䐀䈀㔀㌀㐀　㜀㜀䐀㌀䐀䐀㈀㠀䄀㠀㜀䈀䔀㤀㔀䔀㄀㐀㌀㈀㜀㤀㈀䘀䄀㔀㜀㌀䌀䔀㌀䈀㠀㄀㌀㈀䌀䐀㜀䄀　㤀䐀㤀㜀䄀䈀䄀㤀䔀㐀䔀䐀㈀䄀㤀䔀㈀㔀㐀䔀㄀䘀　䔀䐀㌀䄀䄀㜀　㘀㘀㤀䄀㜀㤀㘀㔀㌀㠀䈀㈀㈀㐀䔀䈀䔀㤀㌀㐀䘀㔀㤀㘀㘀㐀䐀㠀㌀㔀䌀䌀㠀㌀㄀䐀䈀䔀㤀䌀䈀䐀㄀㤀䄀䐀㤀䐀㔀㐀㤀㤀㔀㄀䈀䔀㔀㔀㌀䐀䌀㠀㌀㄀䐀㜀㈀　㜀䐀䈀䈀㜀㈀㜀䘀㐀㄀㌀䄀䌀㈀䘀㈀䈀㌀㔀㜀䈀㈀䈀䘀㘀㄀䐀　㄀䘀㈀㤀䈀　䌀㤀㤀䐀㈀㌀㠀㐀㌀　䔀㘀㌀䌀㜀㈀　䌀㤀䄀䌀㄀䔀䈀㄀　㘀䘀㔀㔀　㤀䌀䌀㄀䈀　㠀䔀㘀䌀㘀　㄀䐀䐀䈀䄀㐀㌀㜀䈀㄀㘀䘀䘀㘀㈀㄀㐀䔀㌀㜀㈀䈀㠀㤀㄀㘀䔀䔀㤀㜀䄀㤀㤀䌀㐀㌀㤀㔀䘀㄀䈀㘀䐀㤀㤀㜀䈀䘀㄀䈀㈀㌀㜀䘀䐀㄀䌀㐀㜀㔀䘀㄀㄀㤀䘀㈀㄀㘀䔀㔀㜀　䄀㐀䘀　㐀㜀䈀䌀㌀㔀㈀䄀䌀㠀䈀㤀㈀䌀㤀䘀㘀㔀䈀㈀㔀㠀䔀㘀䘀㠀㘀㌀䘀㈀㌀㄀䈀䔀䘀㈀㌀㈀䘀㘀㜀㘀㐀㤀䔀䌀䔀䐀㤀㘀㜀㌀䌀䘀㤀䔀䐀㄀䌀䘀㜀　䌀䘀㈀䔀䔀㠀　䈀䌀䌀㤀㔀䌀䈀䘀䄀㌀㈀䘀㜀㠀䌀㐀㌀㌀㤀䔀䔀㤀㤀䔀㔀䄀㐀㔀　䌀　㘀㐀㜀㤀㠀㠀㄀㤀　㔀䔀㜀䈀　䔀㌀㄀　㔀䐀㔀䄀㄀㠀㈀䐀㘀㄀䈀㐀㈀㘀㐀㌀䌀㠀䔀㔀㜀㄀䔀䔀䔀　䔀䈀㄀䈀㘀䘀㄀䄀㤀　㔀䘀䌀䄀䄀䘀䈀㤀䌀㔀㘀䘀䔀㐀䘀㜀㌀䌀㠀䈀㈀䔀㈀䈀㤀㘀　䔀䐀䈀䘀䄀㈀㜀䌀㤀㌀㔀㈀䈀㄀㐀㄀䌀䐀㔀䈀䌀䄀䘀㜀䔀㐀䘀䐀㔀䐀㐀㄀䘀䐀㐀㄀䘀䄀㠀㠀㘀䈀䄀䄀㐀䄀䔀㔀　㐀䐀㐀㠀㈀㌀㐀㜀㄀㜀䔀䈀㘀㈀䘀㘀䈀㠀㐀䐀㜀㔀　䈀䌀䄀㠀㔀㐀䌀䘀㈀䘀㐀　　㌀䐀㠀　䔀㌀㄀䌀㈀㌀㠀㜀㜀䌀䌀㠀䄀㄀㐀　䐀䘀䄀㌀䔀䘀䄀㄀㠀㘀䔀　㘀㌀㈀㄀䘀㠀䐀㠀㐀㠀䄀䘀㘀㘀㘀䘀㔀䐀　㐀㘀䘀䐀䐀䐀㠀䄀䌀㐀　䈀　㈀㜀㐀䔀㘀㌀䌀䔀㌀㘀　㌀㘀㜀㔀䈀㠀　䈀㌀䄀䐀㄀䌀䔀㔀㘀㐀㔀㄀㘀䈀䈀㌀䔀䄀㐀　㘀㔀㤀㄀䐀䈀㈀㌀䐀㌀䄀㠀㐀㌀㘀㐀㜀㘀㘀㐀㌀㘀䘀㔀㠀㠀䌀䌀㠀䐀䌀䌀䄀㔀㤀䈀㈀㈀䘀㌀㈀㈀䘀㌀䄀㠀㘀㜀㘀㐀㜀䔀㘀㐀㌀䔀䘀㔀㠀䄀㈀䌀㠀㠀㌀䌀㐀　䔀㔀㤀㄀䌀㔀㤀㄀㠀㜀䄀㠀㔀䘀㘀㐀㐀㤀㘀㐀　㤀䘀䈀䐀䄀㐀㜀㈀㈀㠀䘀䈀㄀䄀䘀㔀䐀㄀㄀㔀㤀㐀㤀㐀㌀䌀　㜀㌀㄀䐀㠀䈀㐀㤀㘀䘀　㄀䌀㜀㔀䘀㌀㈀㌀㈀㘀㘀㠀䔀㤀㜀䈀㄀䐀㐀㌀䄀㜀　䌀䌀㘀㘀㈀㌀㘀㘀䄀䈀　㤀䔀䔀䐀㜀　㈀䘀㜀㠀䈀㌀　㤀䈀䌀䈀䐀㠀㔀㘀䈀䐀㐀㐀㈀㌀㈀　䔀㌀㘀䌀䌀㔀㌀㤀䄀㌀䄀䄀䌀㤀䈀㄀䄀　㔀　䘀㔀㔀㐀㌀䐀㠀䔀　䈀　䈀㔀㔀㈀㄀䘀䌀㠀㤀㠀㔀㄀㔀㈀㜀㐀㈀㤀㘀㔀䈀䈀㤀㜀䔀㤀䌀㘀㜀㤀䔀㜀䌀䈀㐀㘀㐀䌀䌀㐀䔀䈀䔀㠀䌀䔀㠀㈀䐀䌀㈀㄀䘀䈀㘀㤀㈀䔀㈀㜀㈀㤀䌀䘀䄀䘀䘀㈀㌀䈀㈀䘀䘀㌀㜀㈀㈀䈀㈀䌀䄀㘀㠀䘀䌀㠀㜀䔀䘀䌀㄀㌀㈀䈀䘀　䔀㔀㠀䘀䐀㌀䘀䌀䔀㘀䘀䈀㌀㐀䔀䌀㔀䘀㈀㔀㠀㈀㔀䐀㜀䈀㈀㌀䌀䐀㘀䌀䈀㠀䐀㈀䌀㠀㌀䄀䐀㜀㈀㄀䈀䔀䈀㠀㈀䈀㄀㐀㔀㤀㤀㜀㈀㤀㜀䐀䌀䌀䈀䐀䌀䐀䘀㘀㜀䈀㠀　䌀㠀䈀㄀㄀䐀㔀㐀䈀䘀㐀㄀㈀㘀䄀䌀䐀㔀㘀㘀㄀㌀㤀㤀㔀䔀䄀㄀㔀㜀䄀　㔀䈀㔀䔀㌀䈀㤀䈀㔀㤀㘀䌀䄀䔀　㘀䈀㌀䈀䌀㈀㌀㘀㠀䌀䐀㘀䐀䘀㌀㌀䘀㜀䌀㜀䌀　㐀㈀䐀䌀䌀䔀㄀㘀㈀㈀㠀䐀䌀㘀㌀㤀㐀㄀䔀㘀䘀㠀　䌀㈀㜀㤀㌀㘀㜀䐀䈀㤀䐀㌀䌀䐀䈀䄀㈀㌀㐀　䈀㔀䌀䈀䔀䌀䘀䘀㤀㤀㘀㐀㜀㜀㈀䈀䘀㔀㤀㄀䈀䄀㈀㔀㜀䌀䌀㔀䄀㄀䘀䈀䐀　㘀㌀䘀䘀䐀㜀㌀㠀䌀䔀㜀㄀㜀㄀㠀䌀䘀㈀䘀䔀㄀㐀䘀㐀㜀䌀䈀䐀㄀䐀䌀䔀䘀䐀䈀䔀㔀䔀䐀䐀䌀䔀䘀䌀㤀㤀㈀䈀䐀㠀䘀㤀䌀㈀䔀䄀㜀㐀㌀䌀䘀㈀䈀㤀䘀䘀䘀䈀㐀㠀㐀㄀㐀䈀㔀㘀㈀䔀䈀㈀䐀䌀㠀㘀㜀㘀㌀䘀䘀㌀㌀䘀㜀㜀䔀㄀㠀㌀䔀㔀㐀䘀㈀䌀　㌀䌀䘀㤀㔀䘀䘀䈀㐀㜀㜀㤀䈀　㤀㘀䐀䈀㔀㠀㘀䘀㜀㐀㐀䘀䈀㤀㌀䌀䔀䘀䐀㈀㔀㔀㔀㔀㔀㔀㤀㔀㘀㜀㘀㤀㐀䐀㜀㔀㌀䐀㠀㔀㔀㔀㌀㌀䐀㔀㠀䌀㘀䐀㔀㌀　䈀䐀㔀㠀㈀㄀䌀䘀㔀㜀㌀㜀㔀㠀㘀㈀㈀䔀䄀　䐀䘀㔀　㘀䐀䈀䄀㤀㌀㜀䐀㔀㔀䈀㄀㐀㌀㔀㈀䈀㘀䔀㔀㐀㔀㔀㤀䐀㔀㔀㘀㜀䄀㤀䈀䄀㌀䄀䄀㜀䌀䌀㌀䄀䘀㐀㐀㔀㜀㔀㤀㄀㘀㜀㜀㔀㜀㔀㔀䐀㤀䐀䄀䔀䐀㜀㌀㔀㜀㐀　䐀䈀㘀㔀㤀䈀㔀㜀㐀㈀䐀䐀㘀䌀㤀㌀䄀䈀䄀　䔀䐀䈀䄀䌀㜀䌀䐀䐀㠀　䔀䄀䔀㠀㔀㄀㜀䄀㄀㐀䐀㔀䐀㌀䈀㌀䘀㔀㘀䌀䈀㘀㔀䘀㠀㘀䄀㌀䘀㔀䌀㄀䐀㄀㜀䌀㔀㠀䐀㠀㠀㘀䔀　㘀㈀㈀㄀䈀㠀䐀㠀　㠀㔀䌀㈀䌀㘀㘀㈀䔀䘀䄀䄀㤀　㤀㈀䌀㘀䌀䄀㤀㌀㌀䐀㔀㤀㤀䌀䄀㤀䄀㜀㤀㌀㜀䘀䈀䄀䔀㜀㘀䔀　㔀䌀㔀㤀䘀㐀䈀㔀䔀㠀㘀䈀䘀㐀㌀䘀䐀㠀䈀䈀㄀㈀䘀㠀㈀䄀㠀䄀䄀㐀㔀䘀㌀㌀䔀䘀䌀䐀　䈀䔀㐀㠀㔀　㘀䐀䔀䐀䌀䔀㄀　䔀䌀㠀㈀㔀㈀　　㠀㜀㈀䌀䈀㈀㄀　㠀䌀㠀㈀䄀　㄀㐀㈀䈀㠀㠀㤀㄀　㈀　㄀㜀㄀　㤀㌀　　㠀㄀　㔀㘀㔀㤀㄀㘀㔀㠀㄀䔀　　㄀㈀㈀㈀㠀㈀䄀　㈀㠀䄀　㐀䐀㜀㔀䈀㘀䔀㘀䘀㔀㐀㜀㐀㔀㤀㄀㜀㔀㤀㔀㜀䘀㄀㔀䌀㐀㐀䌀㄀㔀䈀㔀㄀㈀䔀　䘀㐀㐀㠀㄀䄀䘀䘀䄀䘀䘀㌀䄀㠀䘀䌀㜀䘀㔀㈀䐀㄀䔀䐀䘀䔀㈀䔀䔀䔀䘀㘀㌀㜀䔀䐀㐀䌀䌀䔀䈀䘀㐀㜀㐀㔀㜀㔀㜀㔀㜀㔀㜀㔀㔀㔀㜀㔀㜀䘀㜀㜀㐀㘀㔀㤀䄀䈀䐀㐀㤀㤀㜀䌀㈀㤀㌀㈀㌀㘀㔀㈀㄀㐀㄀㄀㘀䔀䄀䄀㜀㤀㄀䌀㈀　㘀䐀䈀㄀㈀㌀䌀㈀䘀㠀㘀㌀䔀䄀䄀㠀䌀䈀䘀㐀㔀䘀　㌀㜀㠀䈀䘀㔀䘀䈀䐀䈀㔀㠀㐀㜀　䌀㤀䔀䄀䄀㄀䐀䐀　㈀䘀㔀䐀䔀㌀㜀㐀㜀　㌀㐀䈀䔀䔀䐀㈀㔀㤀㤀䐀䈀㜀䔀䌀㌀㜀䔀㠀㌀䌀䈀㤀㌀㘀㌀㐀㔀䔀㌀㔀㄀䘀㈀　㄀䔀㤀䐀䌀㜀㌀㌀䈀䘀　　㔀㌀㌀㄀䐀㜀㘀　䔀䌀㄀㤀䔀㠀㤀䌀㐀䈀䐀㄀䐀䘀㔀䘀䐀䘀䌀　䐀䐀㠀䈀䌀㘀㤀䈀䘀䌀㤀㘀䘀䈀䘀㘀䐀䘀䘀㤀㌀䐀䘀㜀䔀䐀㜀䐀䔀䌀㔀䔀㔀㜀䐀䌀㐀㘀㌀䄀㤀䈀䌀䘀䘀䄀䔀䈀䘀㄀㌀㈀㜀㌀䘀㤀䌀䄀㤀㠀䌀䄀㠀䔀䘀㘀䄀㈀䈀㔀䄀䘀㠀　㘀䈀䘀㐀㄀㔀䌀䔀䈀㐀䔀䄀䄀㈀㔀㌀㄀㠀㈀㠀䌀㈀㜀㘀䈀䈀䐀䈀㔀㤀䔀䄀㤀䈀㄀䐀㄀䐀䄀䌀㠀㜀䄀䔀䌀㜀㄀䔀䈀㜀㄀㘀㠀䌀㠀㌀㈀㌀䈀㘀　㤀䘀㄀㘀䘀㔀㌀䌀䌀㠀㈀䘀㄀㐀䐀㐀㘀㄀㤀䔀㤀　㄀㈀㘀䄀　㔀䌀䈀㤀䐀　　㐀䈀㤀㌀䘀㤀䄀䌀䔀㔀䄀㐀䘀㘀㐀㠀㘀　㌀㤀䘀㈀㌀䐀䔀䈀䘀䔀㈀㌀䐀䌀　㜀䔀㔀䄀㄀㠀䈀䌀㌀䐀　㄀㠀㐀㤀㘀㠀䈀㄀䈀　䈀䘀䈀　䈀䘀䄀　㠀䄀䘀㘀㜀㜀䘀㘀㜀㜀㔀㐀䌀㤀㐀㤀㜀㈀㤀㈀䄀㠀䈀㈀䔀㌀㌀㤀㄀䔀㐀㔀㤀䌀䌀㘀㐀䔀㘀㌀㌀㈀㤀䐀䈀㘀㐀䔀㜀䈀䈀㈀㤀䌀㔀㐀㈀㜀㤀㔀㔀䌀㘀㜀㤀　㌀㌀㠀㠀㌀䌀㘀㜀㤀㠀㤀㌀㐀㄀㌀䔀䔀䈀㤀㘀㜀㄀㔀㐀　㔀㔀䄀䄀㔀䈀䄀㌀㌀㤀㜀㌀㔀㐀㤀　䐀㘀㠀㤀㈀㤀䄀䌀䔀㄀㈀㘀㜀　㤀䄀㔀㌀㠀㠀䘀㌀䄀㠀䘀㔀㈀㘀䐀䔀㜀㈀㤀䔀㜀㈀㤀䄀䄀䔀㌀䈀䌀䔀䄀䈀䌀㐀䄀䔀㜀㌀㤀㌀䈀㤀䐀㤀䐀㔀㐀䐀㜀㌀㤀䔀㠀㄀䌀䄀㐀㜀䄀䔀䔀㌀㈀㜀㜀㄀㤀䐀㔀㜀㜀㔀㜀䈀㤀䄀䈀䄀㠀㠀㄀䘀䈀㠀㠀䘀䈀　㠀㌀㔀㜀㐀㌀㜀䈀㠀㄀䈀䔀㠀㜀䌀㜀㜀㤀㌀䈀䈀㠀㤀㄀䄀䈀㤀㔀䈀䐀䌀㈀䐀䐀㐀䐀㠀䘀䐀㠀㜀䘀䈀　䘀㘀䄀䔀㈀䈀䔀䔀㔀䈀䔀㐀㔀㄀㜀䌀㠀㜀㤀㄀㐀㈀㐀㌀䌀㐀㔀　㘀㘀㄀㠀㔀㌀䄀㈀㌀㤀㈀㐀㄀㐀㄀䐀㠀䘀㈀　㘀䌀䘀㔀㈀䘀䄀䈀　㘀㔀㤀㘀䔀䔀䄀㔀䔀㌀㠀䈀䄀䘀㜀䄀䄀㐀㤀㤀䐀㜀㔀㠀䐀㄀㐀㜀䄀䔀䘀㌀㐀䐀䐀㄀䔀䄀䌀㘀䌀㘀㤀㌀䄀㐀㜀㘀㌀㐀㠀䄀㘀㌀㄀䈀䘀䘀㐀㔀䘀䌀䔀䘀㈀㌀　㠀䘀䌀㔀䌀　㄀䘀䌀㈀䌀䌀　䌀㤀㤀㔀䌀㄀䌀㤀㄀㄀㜀　䈀㈀　䐀㐀䔀㜀㘀䌀　䌀㤀㌀㔀䌀　䈀䐀䈀㔀䌀　䈀㜀䈀㔀䈀㤀䐀䌀䄀䄀㤀㔀　䈀㈀䈀㐀䈀䘀䘀䄀㄀䈀㐀䌀㘀㌀㐀䈀㘀䌀㘀䐀㠀　䔀㠀䈀㄀㐀䈀㌀㔀㔀㄀㜀㠀䄀㘀䌀㠀䌀㘀䌀㘀㔀㐀䐀䈀㔀䐀䘀㘀㐀　㤀䌀㘀㤀㘀䐀㤀㠀㔀䐀㐀䐀㐀㄀䌀㘀㜀䌀䔀䄀　㠀䔀䔀㘀㌀䌀䈀㘀㤀㠀䐀㌀䐀㤀㘀䄀䈀㠀㠀䘀㐀㘀䈀　䐀㔀䘀　㄀䌀䔀㔀䈀㈀䐀㔀䘀　　㄀㄀㔀㤀䄀㄀䘀㤀㤀㄀䘀㔀㄀䈀㄀䘀㤀㠀㤀䘀㤀㈀㔀㐀䐀㌀㈀䘀㜀㤀䄀㜀䈀㘀㤀㤀䄀㔀䌀　㄀䄀㌀㌀䘀㤀㠀㐀㜀㈀䌀㠀䐀䄀䔀㘀㔀㌀䈀䄀㈀㌀䘀䌀䐀䔀㈀㌀㄀㌀㈀㤀㘀㄀䔀䔀㈀㌀㄀㔀㈀㐀䌀䄀䈀䐀㤀㔀䔀㤀㠀㐀㔀㐀䘀䌀　䌀䈀䘀㘀䈀䌀䈀㔀䌀㤀䐀䄀㐀䌀㤀䈀㘀㄀㤀㤀䘀䐀㄀㔀䐀㘀䔀㐀䌀䈀䘀㘀㐀㐀㜀䈀㌀㈀䘀䐀䐀䐀㜀䈀䐀䄀㜀䈀㤀㘀㔀䔀䘀㌀㔀䘀䘀　䘀䘀㐀㈀㘀䘀㤀䔀㌀㈀䄀㘀䘀䔀㄀㔀䐀㔀䘀䔀　䔀䄀䄀䄀䐀㘀　䔀㤀㐀䄀㤀　䄀䔀㄀䄀䄀㐀㘀䈀　　䐀㈀㌀㔀　㠀䔀㤀㄀䄀㠀㘀㈀䌀䄀䐀　　㔀㤀㈀䄀䐀㠀㌀㘀㈀㤀䌀䘀㈀㌀㔀㌀䌀䄀䌀䌀　㠀㘀㐀䄀㘀　䐀㤀㤀䔀㤀䌀　㌀㘀䄀㤀　㄀㌀㤀㔀㤀䌀䈀㜀䘀㠀䈀㈀㔀䔀㐀㜀䘀㌀䄀䐀㔀䄀㈀㤀䔀䌀㜀䌀㄀䌀䄀㐀䈀㐀　㄀㐀㌀䐀㔀㌀㘀䘀㈀㠀㘀㠀䘀㘀　䄀䔀㜀㈀㠀䌀䘀㌀㐀䐀䈀䌀　㈀㌀㌀䘀䐀㌀㤀䌀䌀㐀䈀㈀䈀㜀䌀㐀㔀䌀䌀㠀㜀㈀䘀㈀㌀㘀䐀㘀䔀䘀䄀䐀㤀㠀㐀㈀㌀䔀䌀䈀㐀　㐀㤀㠀䘀㌀䔀㐀䌀㠀䘀䌀䐀㤀㐀䔀㘀㘀䘀㘀㜀㌀䐀䐀㠀㄀䘀㔀㐀㄀㤀　　㤀㤀㜀㄀䄀㤀㤀㐀㘀　㜀㈀䘀㘀㠀㈀䐀㌀䘀㐀　䌀㌀㔀䔀䈀㤀㈀䈀㌀䄀䈀㠀㠀䈀䐀㠀㈀䄀㔀㐀㔀䈀㈀㜀䈀㠀㜀䘀䈀　䌀䔀㔀䘀䈀䘀䘀㘀㐀㤀㤀㜀㄀㜀㌀㔀䌀㠀䘀㐀㔀䄀㌀㠀㘀䄀㔀䐀㘀䐀㄀㈀　䘀㤀䔀㠀䄀䌀䐀䘀㤀㘀㘀䐀㘀㤀㜀㤀㐀㈀䔀䘀䘀㜀㐀㐀㔀㤀䄀䘀䌀㈀䔀䘀㔀䈀㠀㔀㘀㜀䘀㤀㘀㐀㌀䘀㘀㘀㌀䘀㐀䐀䘀㔀䔀䐀㤀㜀䔀䌀䈀䘀㈀㌀㘀㈀䘀䄀㔀䘀㐀䈀䔀㈀㜀㈀㔀㄀㈀䘀㌀䌀䄀㠀㤀䘀䌀㠀䐀㐀㈀䘀㘀㘀㈀䈀㔀㘀䐀㈀䈀䐀㄀㌀㘀㠀䐀䐀䌀㌀䌀䔀㘀㄀㔀䄀㔀䘀䔀䔀㤀䄀㘀䔀㔀䐀䈀䄀　㈀䈀㐀㄀䔀䄀㄀㘀䄀㤀㜀㌀㔀䌀䘀㔀㐀䘀㘀䘀䘀䔀㈀㌀㠀䐀䘀䔀㠀㘀䈀䈀　㄀㜀䘀㜀䔀㄀䐀㐀䐀㠀㠀㘀㜀㄀㘀㤀　㄀䐀䄀㐀㄀㌀䈀㄀　㘀㜀䔀㔀䌀㐀㔀㈀㤀㤀䘀䔀㔀㘀　㔀䄀䈀㠀㤀䌀㈀㌀䄀䌀㔀䐀䔀㘀䌀䘀䘀㤀㔀䔀䄀㌀䈀䌀㜀䐀䌀　㠀㌀㔀䘀㄀㜀㘀㜀㠀㌀䈀䐀㠀㔀䄀㌀䐀䔀㈀㄀䐀䄀㄀㈀䔀䈀䔀䔀䈀䈀䈀䄀䌀㜀䐀　㘀䘀㤀㠀㌀䔀㠀㔀㈀㌀䘀䐀䘀䌀䘀䄀㜀㘀䔀㘀㜀䐀㔀䈀㈀䌀䄀䌀䄀㈀䈀䌀㈀䌀㠀䈀㌀㜀㘀㤀㔀䐀㘀䄀䔀㘀䐀㔀㘀㌀㌀㘀䈀䈀　㜀㘀㤀㔀㌀㘀䄀䘀㘀䘀㔀䔀㘀㐀䈀㘀䄀㐀㘀㐀䈀㌀䈀䐀㜀㤀㌀㄀㘀䈀㔀㜀䔀㤀䘀䘀䄀䌀　䔀䘀䘀㘀㜀㈀䐀䈀㌀㄀䘀䐀䈀䌀䘀㈀㤀䈀　㤀䘀㘀䈀䐀䈀㜀䐀㤀㤀　㘀㜀㔀䔀䌀㤀㔀䘀㘀㐀䄀䈀㘀䘀㈀㔀㘀䐀㤀䄀䈀㔀㠀䘀㘀㄀䐀㜀　　䘀㌀㈀㜀㘀㠀䘀㌀㌀㈀㔀㤀䄀㐀㈀㘀㌀䈀㔀㌀䔀㘀㜀㔀㘀㘀䘀䘀㤀㤀㠀　㜀䈀䘀㌀㘀䈀㜀㐀䘀䔀䄀䐀㌀䐀䄀䈀　㤀㄀䈀䄀　㌀䔀䈀㔀䌀㜀㠀䔀㜀　䈀䐀䐀䘀䐀㠀䌀䔀䘀㄀㐀㜀㠀䔀㜀䄀䘀　㄀䈀䔀䘀㌀䔀㈀䘀䄀㘀䘀㤀䄀䔀䄀䈀䘀　㔀㜀㄀䘀䐀䈀㜀㄀䐀㔀㄀䄀䐀㐀㈀㤀䈀㄀㤀䐀㜀㜀䘀䐀䈀䐀㄀㜀䘀㠀㜀䔀㤀䈀　㔀㘀㄀　䐀㜀㜀䘀䐀䈀㈀㔀䘀㜀㌀　䐀䘀㌀　䐀㜀㔀㤀㤀㜀㌀㄀䘀㜀㔀㠀䔀　㤀㈀㄀㐀㘀䘀䄀㜀䈀㜀㤀㌀㔀䄀㜀䄀䌀㜀䈀䌀㘀㌀䐀㐀䌀䄀䔀㜀㜀䘀䐀㐀䐀䄀㄀䘀䔀㈀　䘀䄀㄀㌀㘀㜀䔀㠀㄀㔀䘀㐀　㘀䐀䌀䘀䄀䄀䔀㜀㔀䌀㜀㠀䄀㤀䌀㠀䐀䔀䌀㈀䘀䌀㈀　䔀䌀䔀䐀䘀㘀䔀䈀㔀㐀䌀㤀㈀㔀㤀㜀㌀㤀䐀䔀　䐀䈀㠀　㄀䄀䔀䌀㜀㜀　　䐀䈀㈀䐀䐀䘀㈀㘀䔀㈀㈀㌀㤀㘀䔀　㔀䔀㘀㄀㘀䌀䘀䈀㔀㔀䌀㤀䈀䄀䄀䈀䈀䘀䌀㠀䘀㘀䄀㌀㈀䈀㌀䘀㠀㔀㐀䌀䈀䄀䐀䔀㘀㔀㘀䄀㜀㄀㐀䈀㜀㄀㘀㘀㌀㔀㐀䌀㜀䔀䐀䔀䐀䘀㘀㘀㄀㌀䐀㤀㘀䔀㘀䄀㘀䈀㄀　㘀㐀䈀㜀㜀䐀㌀䈀㤀㄀㜀　㜀䈀㤀㠀㌀㔀㤀㠀㌀　䐀㜀㌀㌀㌀䄀㤀䄀㤀㌀䈀䌀䄀㄀䐀㐀䐀㈀䐀䐀䐀㘀䌀㌀㜀㤀䈀㔀䄀䈀䈀䈀㤀㘀䔀㈀䔀䈀㔀㜀㄀䌀㜀䈀㤀䘀㤀䐀㐀䐀㘀㈀䐀㜀㐀㠀䈀㜀㄀㄀㈀䐀㈀䈀㤀䔀㤀䐀䐀䘀㌀㔀㤀　㜀㐀䄀䌀㤀䈀㐀㠀㘀䔀㔀㘀㜀㐀㌀䘀㌀㜀㔀䘀㌀㔀㌀㘀䄀㘀䈀㄀䔀㘀㈀㌀㤀䐀㤀　䈀䈀㐀㄀㤀㘀㠀㐀䐀䈀㔀㘀㘀㔀　㄀㘀㔀䈀㄀㈀㜀㜀㔀㄀䈀䔀䘀㔀䈀　䈀㔀㤀䄀䄀㘀㔀䈀㠀㜀㔀㠀㘀㈀䌀䐀㠀㐀䐀㔀㔀䈀㘀䄀㔀䘀㘀㌀㐀䘀䄀㌀䘀䈀䔀䌀䐀㔀䘀㘀㐀㘀㜀䄀䌀　䐀䔀㘀㐀㌀䘀㐀䈀㘀䈀㐀　䌀䈀㜀㔀䘀㘀㜀㘀䔀㜀㈀㠀㘀䐀㤀　䈀㐀䐀㐀㜀㘀㐀䈀㔀䄀㘀䄀㄀䘀㐀䄀㔀䄀㘀䄀㄀䘀㐀㤀㔀䄀㘀䄀㄀䘀㐀䈀㔀䄀㘀䄀㤀䘀㐀䄀㔀䄀㘀䄀㔀䘀㐀㤀㔀䄀㘀䄀䘀䈀㈀㐀㈀䐀䈀㔀䘀䐀㤀㈀㤀㘀䐀䄀　㄀㐀㤀㐀䈀䔀䐀㘀䈀㐀㤀㐀䈀䔀䐀䈀　䄀㐀䄀㔀䘀㘀䄀㌀䄀㐀䄀㔀㜀㘀㐀㐀䐀㈀㔀㈀㌀䈀㈀䄀㘀㤀䌀㤀㄀䐀䌀㜀䈀㐀䐀㐀㐀㌀㤀㈀㤀㘀㜀䄀㌀㤀㐀㤀㐀䈀䈀䐀䈀䌀䄀㐀䄀㔀㤀䔀㈀㠀㘀㤀䄀㤀㈀㜀䈀㄀㘀䐀䘀㄀䈀䔀㄀䔀㜀㄀䈀䘀㜀㜀　䘀䔀䈀䘀䐀䔀㐀䐀䌀㐀㈀䔀䘀䌀䘀㜀㘀䔀㔀㔀㘀㜀䐀䄀㠀䘀䘀㜀㜀䘀䘀㄀㔀㌀䐀㐀㌀䌀䔀㌀㌀䘀㐀䔀㄀䐀㈀㈀䔀䐀㜀㌀㌀㔀㤀䔀䄀㜀䐀䄀㜀㠀䘀㠀㈀㈀㐀㤀㤀㠀䌀䘀㤀䌀㘀㔀䌀䌀㔀㜀㌀䄀䘀㠀㌀㔀䘀㘀㔀㄀㐀㘀㠀㜀㄀㔀䌀㠀䄀㐀䔀䐀䘀䔀㈀㘀䌀䄀㄀㔀㄀䘀㄀㘀㤀㔀䄀㐀䘀䄀䐀㠀㠀㘀㐀䌀䌀䘀㈀䘀㄀䈀㐀㠀　䐀㘀㔀㈀㐀䘀䌀㄀㄀㤀㐀㄀䔀䐀䔀㌀㜀㌀䔀䄀㠀㜀　㌀㐀㄀㜀㠀㜀㌀䌀䄀䐀㈀䐀㠀㔀㘀䘀㄀䘀䔀䔀䌀䌀㤀㤀㌀㔀㌀㌀㔀㠀䌀㜀㐀㌀䄀㘀㔀㐀䔀㈀䌀㜀䐀㌀䄀㘀㜀㤀㠀㌀㄀䈀　㜀䐀䔀䘀䄀㤀䐀㤀䈀㔀　㄀㐀㤀㄀㌀㌀㈀䔀䈀㤀㤀䘀㔀㜀㠀㜀㘀㈀䔀䔀㜀䐀㠀䔀㔀㌀　䌀㜀㈀䔀㠀䘀㤀㤀㜀䄀㈀㈀㘀㘀䔀䄀䌀㤀㤀　㌀㐀䔀㜀䌀㌀㄀㈀㘀䔀　㐀㜀䐀䐀　䐀䔀䔀䔀㘀㜀䘀㜀䔀㌀䘀㤀䐀䔀㐀　㜀䈀㈀　㔀䐀䌀㄀䈀㌀䘀㘀㄀㔀㌀䌀䔀䈀㤀㌀㄀㈀䄀㠀㄀　㄀㈀䄀㠀　㠀䐀䔀䌀㘀䘀㄀㘀䄀䘀䌀䔀㜀㘀㌀䘀䌀䈀䈀㔀䌀㔀㘀㄀㔀䈀㌀　䄀䌀䘀㈀䄀䄀䄀㤀㤀㌀㔀㜀㤀䌀㐀䘀㐀䈀㔀䐀㌀㜀㠀㐀䌀䄀㔀䐀䈀䔀㤀㌀䌀㔀㘀䔀䔀㜀　㤀㜀䘀　㔀㠀㤀㄀㔀㈀䌀　䔀㔀䈀㘀㌀䌀㠀㔀㘀䘀㜀㤀㤀䐀䄀䐀䄀㜀䔀　㘀䘀䘀　㄀㐀㠀㐀㘀㈀䐀䔀䄀䈀　㤀䐀䌀㐀㘀䄀㤀䘀㤀　䐀䐀㘀　䄀䈀㤀㔀㐀䌀䔀㄀䔀㘀䈀㠀䘀䄀㔀㐀㐀䘀㜀㐀䔀㜀㜀㈀㤀䈀䌀㐀㘀㌀㔀䐀㤀㘀㘀㜀䐀㤀䈀㈀㤀䘀㐀㈀㄀䌀䘀㘀㈀㠀㌀㌀䌀㠀䈀䘀䐀㠀㐀䘀㌀㜀䐀㘀㄀䔀䘀䄀㄀　㐀䘀䈀㈀䈀䘀䈀　　㔀䈀䈀㜀䐀䘀䐀㠀㠀㜀㐀㤀㌀㠀　㘀䌀䘀㔀㘀㈀䐀㤀䔀䄀䐀㤀㘀㈀㌀㤀䈀㈀䐀䐀䄀　䄀㘀䌀䈀㤀㔀㘀㜀㐀㐀䌀䈀㘀㔀㤀㄀䐀䄀㜀　䄀㔀䈀䄀䈀㜀㔀㜀㤀㔀㘀㔀䄀㠀㜀㘀㜀䄀㔀　䐀䐀㠀㈀䄀㘀䐀䔀䌀㌀㐀䄀㄀㜀䄀㐀䔀㔀㌀䄀㜀　㔀㌀㔀㜀　㔀䄀䘀㄀㈀䌀䄀䔀　㤀䐀䈀䄀䘀䌀䈀䄀㠀䄀㤀㜀㌀㤀䘀㜀㌀㄀䘀䈀㔀㜀　㄀䔀㜀　㄀䔀䄀㐀㠀䈀䐀㠀㤀㘀㔀䐀㐀䐀䄀䐀㤀䌀䈀㔀䌀䔀㐀㘀㘀䄀䔀㌀㌀䌀䔀㄀㘀䌀䄀㈀　䔀䌀䔀䐀䘀㄀䌀㤀䔀䄀㤀㌀㠀㈀䘀㌀䈀䐀䈀䔀㠀㔀㈀䈀㘀㘀䔀㔀䘀䄀㌀䔀䔀䌀䔀䔀䈀䌀䔀䐀䈀㜀㐀㤀㤀䈀㌀䌀㌀䐀㤀㐀㔀䈀䐀㤀䌀㌀䐀䌀䔀㄀䔀㤀䔀㌀㄀㜀䘀䔀㔀䔀䌀䄀㔀㜀㐀䈀㘀㜀㜀䈀䘀䄀㘀　㄀䌀䔀䈀㜀䌀䔀㘀㄀㤀䔀㌀㜀㄀䘀䔀㄀㜀㄀㤀㄀䌀㄀㘀䐀䄀㠀㄀㜀㤀㤀㄀㜀䈀㤀㤀㤀䐀䈀㜀䄀㐀䈀䔀㐀㄀㘀㄀䔀䔀䈀䐀㈀㘀㌀㄀　㠀㈀䈀㔀㤀䔀㘀　㈀䐀䈀　㄀㘀䈀　䈀㐀䈀䈀䐀㔀㔀䄀䌀䌀㌀䄀㐀䈀䐀䄀䔀䌀㘀㄀䈀㘀䐀㤀㠀䘀䈀　㤀䐀䈀䔀䌀㈀䘀䔀㌀㌀㔀㔀㘀　　䈀䘀䐀㌀　䈀㜀㐀䄀䈀㘀䌀䐀㐀㌀䐀䈀㜀䌀䈀㐀䄀䐀　䄀䐀䄀㔀㘀　䐀㘀䐀㐀䈀㐀㄀䐀䈀䔀䄀䄀㌀㘀䐀　䐀䐀　䈀㘀䘀㌀䐀㄀䈀㘀䌀㘀㘀㠀䐀䈀㠀㔀㐀䔀㌀䈀䄀㜀㈀㌀䈀㜀䔀䄀㄀㈀䔀㜀㄀㈀㘀䔀䌀㤀䔀㔀䌀䔀䔀㔀䐀㐀㄀㘀㜀㘀㜀䐀㌀䈀䄀㜀㠀䘀䐀㌀㠀㜀䐀䄀㌀䈀䘀䐀㤀䐀　㄀㜀㐀㌀㄀㘀䌀䘀䌀㠀䔀㘀䌀䔀㌀　䘀䄀㌀㐀䔀㘀䌀䈀䘀㘀䘀䄀㈀䌀䔀㘀㠀䔀䐀䄀㔀㘀㠀㘀䐀㌀㜀䈀㐀䈀㘀　㜀㔀䄀䐀䈀㄀㌀䄀䐀㐀䐀㐀㔀㘀䈀䐀㌀䐀㄀䐀䄀䘀䔀㘀㠀䔀䐀㐀　䈀㐀㜀㘀㌀　㔀䄀㜀䈀㈀㔀㔀㘀䔀　㐀㜀㐀䈀㈀䘀䈀㈀䔀㐀㈀㔀㜀　㈀䐀㠀㄀㘀䈀㌀㔀㜀　䄀䐀　䔀䄀䔀　䐀㠀　㘀䈀㠀㌀䔀　㔀䄀㠀㌀䐀䈀䈀䄀㠀㈀㐀㈀䔀　䌀㔀　㐀䘀　㘀㈀䈀㤀㤀㠀　䘀㈀　㐀㔀㠀䐀㤀䐀㌀㜀㌀　㌀䈀㔀䌀䌀㌀䈀㌀㈀㈀䘀㈀䄀䔀䘀㐀䄀䔀㠀䌀䌀䔀䐀　㐀䔀㘀㌀䌀㤀䌀䄀㜀㜀䄀㈀㌀㄀䐀㜀䐀㈀㘀䄀㐀䈀㠀䌀䌀䄀㌀䄀㐀㠀䈀㌀㠀㘀㤀　㘀㌀䔀䐀㈀㄀䌀㜀㌀㈀䔀䌀㌀㜀㤀㠀㌀㘀㤀㤀㈀䌀㌀㜀㤀䔀䄀㄀㄀㜀䔀　㠀䐀䘀㠀㄀㠀䐀䔀㠀㠀㌀䐀㤀㠀䈀䐀㜀䘀㠀㔀䐀㤀䘀䈀㌀䔀䐀㠀㘀㈀䐀㈀䔀䔀㈀㐀䘀㜀㤀　㜀䈀　㠀䈀㄀䐀䈀䈀㈀㠀㘀㌀䄀㤀䌀㤀䔀䌀㄀㤀㘀㐀㤀㔀㐀䌀㌀㌀䐀䄀㤀㌀䌀㘀㘀䐀㄀㄀䐀㐀䌀㘀䘀㄀䐀䈀㜀䘀䌀㘀　䔀䐀䐀㤀䈀　䘀㘀䄀䄀䌀㌀䐀䄀䈀䈀㠀　㘀㜀㔀㠀䄀䐀䄀㤀㄀㤀㘀䌀䈀䔀䈀䔀䈀　䘀㤀䐀㈀㘀㄀䘀㌀䘀㔀䘀㜀㜀㜀㜀㌀㘀䐀　㌀䔀㈀㘀䌀䌀㘀㜀㄀䐀㈀㘀㘀䌀㐀䘀䈀㌀㔀䘀㄀㜀䔀　㌀䈀䌀䐀䘀㄀㘀㔀㠀䈀㐀䌀㜀䘀䈀㄀㜀䔀㌀䘀䐀㐀䔀㜀㠀䈀䘀䈀㌀䐀㐀㤀㘀㔀㄀㤀䈀㄀㄀㔀䔀䘀㜀　㠀䈀㐀㘀　㄀㔀䐀　䄀㘀㄀㄀㘀㠀䐀㌀　㐀䈀㘀㘀㐀㔀㌀䔀㤀　㤀䔀㜀䘀䄀䄀㔀㈀䔀㠀㐀䘀㜀　䐀䈀㘀㈀㤀䌀㄀㌀㘀㜀㔀㔀　㜀㘀㠀䄀䌀㈀㘀㄀䄀䈀䌀㈀䈀䔀㈀㄀㘀䄀㘀䘀㠀䔀䐀䄀䈀䈀　㈀䘀䈀㘀䔀㔀䌀䘀䈀㔀䘀㈀㠀㄀䈀䈀㔀㠀䘀㐀㌀䔀䐀䘀㤀䌀　䘀䔀䄀䄀㤀㠀䔀㜀㔀　䄀䔀㘀䌀㐀㜀㔀㜀䌀㈀䐀䔀㔀㘀䘀㐀䈀䘀㄀䈀䘀㐀㔀䘀䌀䌀㈀䐀㌀䄀䌀㐀䘀㌀䄀㜀䔀䄀㤀㠀㌀䘀㔀䐀䌀　䘀㐀㜀㜀䄀㤀㄀㤀䔀㠀㌀䘀㤀䔀䔀㤀䘀䘀㈀䌀㈀䐀㘀㐀䘀䄀䈀䘀㐀㘀䈀㜀㘀㈀㐀㘀䈀㔀㤀㠀䔀㤀䈀䘀　䈀㄀㄀㐀䈀㌀䘀㤀䘀㤀㘀㌀䄀䔀㘀㄀　　㐀䘀䈀䈀䐀㘀䌀䌀䐀㔀䔀䔀䔀㌀㐀㄀㤀㄀䈀䈀㌀㜀㈀㘀㔀㌀䘀㈀䔀䔀㔀㄀䔀㠀䈀䘀㘀䔀㌀㠀䘀㔀㄀䘀䌀䈀㔀䘀㘀䌀　䘀䐀㤀䐀㔀䘀㔀㐀㜀㜀㘀㈀䐀㐀䘀㈀䌀㔀䌀䌀㈀㔀㄀㄀䘀㘀䄀䘀　䘀䘀䈀䈀㜀㌀㌀䘀㌀䔀䘀䔀㌀㤀㐀㠀䄀㄀㤀䌀㜀　　㤀䔀㐀䈀䐀䘀㐀㄀㐀㌀㜀㤀㠀㘀㜀䌀㤀㐀㘀䔀䘀　㌀䘀䘀㜀䈀䘀䄀㈀㠀㜀䘀䌀㘀䘀䘀䌀䔀䘀㘀㠀䌀䐀䈀䘀㤀䐀　䘀㜀䔀䔀㤀㄀㠀㐀㤀䘀㠀㄀㜀㜀㐀㤀㈀㘀䐀䔀䈀㠀䈀䈀㘀　䐀㔀　㄀㄀䌀㌀㌀㈀䈀㘀䄀㘀㤀䈀㄀䄀䐀㜀䘀㈀㌀䈀䐀䔀　㄀䈀㘀㜀䄀㈀䌀䌀䌀䘀㌀　㜀䈀㄀䔀㐀㄀㠀㠀㈀䄀㠀㘀䘀䔀㤀䌀㤀䌀㤀㌀㐀㐀㜀㠀㈀　䄀䘀㤀㌀䌀　䔀㐀䈀䌀䌀䈀㤀㤀䌀㌀㈀䌀䘀㤀䌀㠀䘀㔀䐀㌀㌀䐀㄀䈀㔀䌀䈀㔀㠀㘀㤀䐀䄀㜀䌀㔀㔀䐀䄀㠀䔀㌀㌀㤀㘀䐀㘀㠀䔀㔀䈀㜀㤀㄀㌀䘀䌀㈀㐀䄀㔀㌀䌀㘀䘀㜀䐀㈀䘀䈀㈀㠀䈀䔀㜀㈀㜀䘀䈀㈀㌀　㜀㈀㤀㠀䌀䈀㔀㔀䄀㠀㄀䈀㔀䐀䄀㐀䄀㌀㈀㈀䔀㠀䐀㈀㈀䘀　䔀㈀㔀䈀㘀䌀㄀㤀䈀䐀䌀㤀㄀㘀䈀䐀䘀㐀䔀㔀䘀䈀䔀㘀㈀㄀䘀㌀㌀　䐀䈀䘀㈀䐀㈀㤀㜀㔀䘀　㌀䔀䈀䈀㤀㈀㤀䘀　䔀㠀䐀㜀䌀㘀㜀䄀㘀䔀㄀䐀䄀䌀䔀㜀㤀䔀䌀㜀㜀㘀䐀㌀㔀㐀䄀䄀　䈀䘀䘀㜀䐀㌀䐀㐀㠀䘀㘀䘀䄀䘀　䌀㌀㌀㐀㘀　㄀䈀䔀䄀㘀㄀䄀㘀䔀䈀㄀䄀㘀䈀　䐀䔀䈀䔀㈀㜀㔀䐀㘀㌀䄀䐀㘀䌀㔀㔀㈀䌀䄀㌀㜀㠀㘀㘀㜀䄀㘀　㤀㌀䌀㌀㌀㐀䐀䔀㄀㤀㤀㘀㤀　㘀䌀䘀㐀䌀㜀㌀㜀㠀㘀㘀㔀䄀䌀　㌀㌀㜀㌀㄀㄀㌀䌀㌀㌀㈀䐀䔀㄀㤀㤀㘀㤀　㔀䌀䘀㐀䌀㘀䈀䄀㜀䄀䐀㜀㌀㌀㄀䌀䈀㜀㄀㈀㤀䌀㄀䄀㌀㔀㈀䈀䈀　㌀㌀䌀㌀㌀㄀䐀㤀㤀㤀䈀䘀㈀㔀㤀㘀䄀㐀䈀䌀䘀䌀䌀䄀㔀䘀　䌀䌀㜀㐀㠀㌀㘀㜀䄀㘀㌀䈀㌀䌀㌀㌀㤀㜀䌀㄀㌀㌀䐀㌀㄀㌀䐀䔀㤀㠀䐀䘀䌀㄀㄀䈀㜀㌀䈀㤀㜀㌀䌀䌀㌀㤀㐀㘀㔀㜀䈀　㔀䐀㘀䐀㔀㈀㈀䘀䈀㜀㤀䔀㔀䈀㠀䘀㔀㈀䐀䐀㜀㘀㘀䔀㌀䈀䔀䄀䔀䐀䄀㘀䈀䄀䄀㤀䐀㐀䌀㜀㄀䐀䔀㤀㠀䔀䄀㐀䈀䔀䘀　䐀㠀䄀㐀䌀㄀㘀㌀䐀㌀　䘀㄀䔀㤀䈀㜀㐀㜀㠀㘀䌀䘀䄀䈀䈀䈀䈀䐀䌀㔀䐀㌀㐀䌀　䘀䐀䌀䌀䘀䐀㠀䌀　㘀㐀䄀㤀䈀㠀䈀　㘀㐀㄀㈀㈀　䘀　㄀䔀䐀䄀㔀㤀䐀㐀䄀㘀䌀㤀䈀䈀㘀㘀㈀　䈀䄀㜀䈀㤀䐀㜀㤀䌀䌀䄀䄀㈀䌀㐀䄀䈀㘀㈀䌀㐀㐀㔀㜀䈀䔀㤀㔀䐀䘀㐀䄀　䔀䐀㔀㔀䌀㘀㈀䄀䐀㤀㜀䌀　㜀㜀䈀㌀䔀䐀㠀䄀㘀㈀䐀㤀㌀䘀㤀㘀㔀䐀㄀㄀㤀㜀㈀㜀㔀㔀㐀䄀䈀䐀　　㈀䔀㔀㈀㘀䈀㌀㐀㔀㐀䌀㤀㄀㄀㘀㤀䌀㐀䈀㠀䈀㘀㐀㐀㐀㠀㘀䄀䈀㈀㠀䄀䐀䔀㠀㠀䄀㔀䄀㌀㐀䘀㜀㜀䈀㈀㠀㌀㔀䌀㌀㐀䈀㠀䘀䘀㈀㠀㜀㈀㜀䔀㌀䔀　㐀㌀㌀䌀㠀䈀䔀䄀㐀　㔀䐀㜀㤀㐀䔀䐀㈀㄀䈀㄀㄀㈀㌀㄀㤀㈀䄀䔀䘀䘀䈀㈀㐀㐀䘀㐀䈀㔀㐀㌀䈀㈀㈀䈀　㜀䈀䔀　㤀㈀䐀㠀䘀䌀䘀㤀㜀䐀㘀　㈀㌀㘀㔀㤀㤀㘀㘀䌀䔀䌀㌀䈀㌀䐀䌀㈀㔀䄀䌀㜀㄀䈀䘀䌀䄀㜀㈀㤀䈀㜀䄀㠀䐀䘀　㈀䈀㄀㌀㜀䘀㘀㤀㐀䌀䐀㠀㜀㌀㘀㈀䔀䐀䈀㄀㘀䈀䄀　㈀䐀㔀䘀䐀䄀㌀㔀㄀㄀㘀㤀㈀㈀䔀䈀䔀䈀　䘀㘀䘀㐀　㈀㘀䘀䘀㤀䔀㐀䈀䘀㌀䔀㤀㄀㘀䌀㠀㄀㤀㠀㌀㤀䄀䐀㈀　䌀䘀㤀㜀䐀㌀㔀䐀㐀䐀㜀㠀㌀㜀㌀㄀㘀䈀　䈀䐀㌀㤀㠀㌀䄀䔀㠀䔀㐀㤀䄀㔀㠀㘀㌀㄀䌀䘀䌀䈀㈀䔀㠀䄀䌀㘀䐀㤀㤀㔀䐀㔀㔀䐀㔀㘀㘀㜀㠀䔀䈀㐀㤀䌀䄀䌀㐀䘀䄀䐀㐀䘀㜀㤀䌀䌀㐀㤀㐀䔀䐀㈀䌀　㐀㌀㌀䄀㔀㘀䔀䐀　㈀䔀　㠀㤀㈀　㌀㠀䌀　㐀　㘀䔀䔀䌀䈀㌀㌀㄀䔀䈀䔀　䘀䐀㈀㜀㔀㐀䌀䈀䐀㠀䄀㈀䘀䄀䈀䘀㔀䈀㐀㤀䌀㘀䌀䄀䄀䄀㠀㔀㤀㔀㔀㔀㄀䈀㈀䈀䄀䈀　䔀㔀㘀㔀㘀㔀䐀䄀䌀䄀䌀䘀䄀㔀㠀㔀㤀㐀䐀䌀㘀䌀䄀㘀䄀㄀㔀䄀䌀䄀䌀㔀㘀䌀㔀䌀䄀㘀䄀㌀㔀䄀䌀䄀䌀䐀㘀䌀　䌀䄀㘀䄀㐀䐀䄀䌀䄀䌀䐀㘀䌀㈀䌀䄀㘀䄀㘀䐀䄀䌀䄀䌀䐀㘀䌀㄀䌀䄀㘀䄀㔀䐀䄀䌀㔀㄀䐀㜀䌀㜀䘀䄀㘀䄀　㌀㘀䔀㠀㤀㠀䌀䐀㐀㐀䈀㘀㈀　㤀㈀㘀㜀㜀㘀㔀䌀㤀䔀䘀䐀㜀㔀㔀䈀㔀　㜀㔀㌀㔀　䌀㘀㈀㜀㔀䄀㄀䈀㘀㈀㐀䘀㤀䈀㘀㌀㐀䘀㠀䘀㤀㔀䔀㔀㐀䄀䘀㘀㌀㤀㈀㔀㔀㜀䔀㘀㠀䄀㌀䐀㘀䐀㠀䔀㌀䐀㐀㔀㜀㌀㔀㔀㈀㈀䌀䘀㄀䔀㐀㈀　㄀㤀㐀㄀㐀䈀䐀㘀䘀㔀㘀䘀㜀䌀㜀䌀　㠀䈀㌀㤀䐀䌀　㜀䌀㐀䘀㈀䔀㄀㜀㔀䐀㤀㈀㜀㤀㘀䐀䌀㠀㜀㄀㐀䐀䐀䌀㄀㤀㠀㠀㠀䐀㌀㄀䌀䄀㌀䈀㔀㈀㐀䌀㜀㘀䄀㐀㤀㠀䔀䐀㔀㤀㈀㜀䌀㐀䄀㈀䐀䌀㌀㔀㐀㈀䐀䌀㌀㔀㐀㈀䐀䌀㌀㔀㐀㈀䐀䌀䌀㐀䈀䔀㘀䔀䈀㔀㘀㘀㘀㐀䌀䄀䈀䌀䄀㌀㤀㐀㠀㜀㐀䐀㜀䘀㌀㘀䔀䄀䌀㈀㤀㈀䌀㠀䄀㈀䌀䔀㈀䐀䔀䈀䈀㐀䘀䘀䄀䔀㌀䈀　䌀䄀䄀㤀㘀㌀㤀㔀㌀　㜀　䔀䔀㌀䌀　㘀䄀㜀䐀㄀㌀䈀㜀㈀㄀㘀㠀䔀㌀㠀㜀㠀㘀䄀　䌀䔀䐀㜀㌀　㄀䈀㐀㐀䘀㌀㌀㘀㠀㤀䘀　䈀䄀㄀㜀䐀㤀䄀䌀㜀䘀㘀䔀䔀䌀㠀䐀㤀㜀䘀㌀㐀　㘀䔀㈀　㌀䄀䌀㜀䌀㈀㐀㐀㔀㜀䐀㘀㤀㔀䄀㠀䈀䈀㠀䈀㐀㔀䔀㄀㠀㌀㄀㘀㔀㜀㄀㌀㘀㄀䘀䌀　䌀㌀㈀㐀㔀㜀䔀㄀　㠀㈀䈀㘀䘀㄀䄀㔀㘀䐀㠀㜀㐀䄀䌀䄀䄀　㔀䔀　䌀㜀　䐀䌀㈀㈀䘀㘀㤀䈀　䔀㘀㜀䄀㠀㘀㐀㈀䄀䌀㈀䐀㤀䘀㌀䈀㘀㜀㌀㄀㌀㜀㌀䘀㤀䘀㌀䔀㌀㈀㤀㘀㘀㠀㤀㐀䌀㤀䈀㌀㐀䘀㌀㌀䐀䈀䌀䌀䔀㘀㜀㄀㜀䌀㤀㔀㜀㤀㄀㔀㜀㌀㐀㘀㤀㄀㔀㤀䌀㐀䐀㘀䐀䈀　䐀䔀㘀　䐀䄀䌀㄀㄀㘀䘀㌀㘀㘀䘀䌀㘀㔀㜀㠀䔀㄀㈀䄀㈀㌀㔀䄀　䔀䌀　㠀䌀䄀䄀䔀㠀䐀䈀㈀䔀䈀䄀　䔀䌀䈀䄀㈀㠀䈀䈀㌀䔀㐀䄀㘀䐀　　㤀䐀䈀䘀㈀䘀䈀㈀㠀䘀㐀䈀䐀㔀㐀䐀䈀㤀䔀㘀䈀䐀䐀䔀㔀䌀䌀䘀䄀㔀㌀䔀㘀䐀㌀䔀䌀䐀䄀㔀䈀䔀㘀㔀䈀䔀䌀㔀䄀㔀䔀䔀㌀㐀㜀㜀䘀㈀㄀䌀㜀㌀䈀㜀䈀㤀㤀䈀䔀䈀䘀䘀䐀㐀䘀䌀㤀㐀㐀䈀㤀㜀㈀䈀㐀㌀䔀㔀㈀䌀䌀䐀䐀㈀䈀　䘀㜀䔀䐀㔀䘀㜀㤀㔀䄀䌀䄀䘀㠀㔀㘀䔀䔀㘀㐀䐀䐀㠀䐀䘀䔀䘀䄀㄀　㜀䔀䔀㐀䄀㔀㤀㄀䄀㔀㐀䌀䘀䈀㌀㔀㤀㄀㌀㔀䌀䌀䈀㜀㜀㈀㔀䐀㔀䔀䈀㜀㤀㘀㔀㤀䌀䈀䈀㠀䈀䘀䄀㐀㤀㜀㌀䐀㠀㠀䐀㔀䌀䔀　㐀䄀䌀㜀㘀㤀㘀䌀㌀㘀䄀㘀㜀㈀㈀䘀䌀䌀㠀㐀㤀㔀㠀䔀㜀䄀䌀㠀㠀㜀㔀䌀䔀㐀䄀㔀㠀䔀㜀㠀䌀䌀　㌀䔀䈀㄀㘀　㠀㜀㜀㠀䘀䘀㜀㄀㜀䐀㔀䄀㐀㘀㤀䈀䄀䄀䌀䄀㌀䘀㐀㘀䘀㐀㄀㄀㌀㐀䌀䈀㤀䐀㤀㄀䐀㔀䘀䘀㤀㄀㘀䐀㠀㤀䔀䔀䈀䐀㠀䈀㤀䔀㘀䐀㐀䌀㌀䌀㠀䄀㘀㔀䐀䄀䘀䈀㐀䄀㘀㘀㜀䐀㜀䄀㌀䌀　䐀䔀㜀㈀　㜀　㤀䈀䈀㔀㐀㐀㤀㔀䌀㘀㘀䐀䘀㘀㌀㜀䘀㤀䌀䘀䘀䘀䌀㜀䈀㔀㔀㤀䌀䄀䔀㘀㈀䌀䈀㌀䘀　㈀㜀㠀䔀㌀㤀䐀㤀䌀㌀㤀䘀㐀㔀㜀䔀䘀㠀　㤀㘀㌀䔀㜀㌀㠀㜀䘀㜀䌀　㈀䐀䈀䄀㈀䄀㄀㈀㔀㘀㌀㘀㌀䌀䔀㐀㔀㜀䌀䐀䈀䌀䘀䌀㄀䘀㤀㔀㌀䔀　䐀䌀䌀㠀䔀䄀䘀㐀㄀䘀㠀㐀䘀㌀㘀㜀䌀　䈀㤀䈀㄀䐀㔀䘀㤀㌀㜀㠀䌀䘀㌀㠀㤀㜀㄀㘀㐀㤀䘀㠀㌀䄀䘀䔀䔀㘀㌀䐀䐀䘀䘀㔀㌀䐀䔀㠀䐀㤀䔀㐀㔀䘀㌀　㔀㌀㐀䄀㠀㔀䌀㌀㜀䄀㘀䌀㠀㈀䄀㘀㠀㐀䐀㌀㤀㠀㌀䈀㌀㌀　㠀㌀䄀䈀㠀㘀㄀㤀㔀䌀㄀㌀䌀䌀㌀㄀㤀䈀㘀㈀㠀䔀䐀㤀㄀䌀㜀㌀䌀䌀㄀㘀䈀䘀㐀㠀㔀㘀㤀䌀䈀㠀䘀䄀䈀䐀　㜀䘀䔀㤀㔀㤀㄀㌀㈀䐀䔀䌀䄀䌀䌀䔀㜀㤀㤀㘀䔀䔀㈀㐀䘀㄀䌀㔀㄀㈀㜀㤀㜀䘀㜀㈀㔀䌀䄀㤀䈀㘀䈀䐀䔀䌀㠀䔀㔀䌀䐀㌀㜀㄀㜀䘀䔀㘀㐀䄀䐀㜀㠀㜀㈀㜀㤀㔀䘀䐀㄀䄀㤀㌀䈀㐀䈀㜀䔀㈀䄀㠀䐀䘀㜀㠀㈀䌀㘀㌀㜀䄀䄀㄀㠀䄀㈀䈀䈀䈀㄀㐀㈀䈀䘀㤀㠀㈀䌀㜀㠀㐀㈀䄀䄀䌀㄀㄀㌀䐀㈀　㐀䐀䔀㠀䘀䄀㘀䘀　㜀䔀㌀㐀㠀㜀䘀㜀䄀㌀䌀㔀㐀䘀䄀䄀㈀㜀䈀䄀　㜀㜀㘀㄀䘀䔀䌀䐀㈀䘀㜀㈀㈀䔀䘀㜀㄀㌀䐀䈀䈀㈀㈀䘀䈀䐀㤀㄀䄀㌀䄀㘀㠀䔀䄀䐀㄀䐀㔀䌀㌀䈀㌀㈀䔀㈀㤀䐀䄀䔀䄀䘀䐀䄀　䄀㈀㠀䌀䘀㐀㈀㔀㐀㐀䘀䄀　㘀㜀䔀㐀㘀㄀㤀　㜀㔀　䌀㘀㔀䄀䘀㌀㜀㄀㈀䔀䔀㌀㐀㤀㌀㌀㘀䄀㜀㜀㤀䐀㜀䐀㄀㤀䐀㄀㔀㌀㔀㜀　䔀䌀㈀䘀㘀㤀㄀䄀䈀㄀㌀䌀㐀䈀㌀䔀䘀㐀㌀㌀䌀㄀䘀㌀䘀㘀䌀㄀䔀㈀㄀䐀䈀㌀䌀䌀㘀㄀㘀㠀㠀㈀䘀䈀䐀䘀䈀㔀㐀㔀㔀㜀䄀䘀㜀䈀㄀㐀㜀䘀㤀䄀㜀䔀㈀䘀㜀㌀㔀㜀䄀䈀㘀䄀䄀㔀䌀㄀䘀䈀㐀㤀䄀㔀䄀㤀㜀㤀　䘀㤀㌀㌀䌀䄀䘀㠀　㘀㘀㔀㔀䌀㘀䐀㐀䐀䔀㌀㌀㈀䄀㘀㔀䈀㌀㌀㜀䔀㈀㈀㤀䐀䄀㈀䘀㄀㄀䈀䐀䘀㘀㈀㔀㘀䈀㘀䘀䄀㘀㜀㠀䌀䘀䈀䔀䘀㈀　䄀㤀䐀㘀䐀䈀㌀㈀㜀㈀㌀䐀㜀㠀䌀㈀䈀䈀㔀㌀䔀䐀䄀㤀㄀㐀䌀㄀㔀䈀䔀㘀㈀㤀䘀㔀㄀䐀㐀㈀㜀䐀㠀䘀㤀䔀䌀㘀㜀㌀䄀䄀䔀㌀䈀䈀䐀䘀䌀㜀䈀䐀㌀㈀䐀䘀䄀䈀㌀㠀䈀䌀㜀䈀䈀㄀䈀䈀䔀㔀䌀㈀㔀㠀䄀䄀㜀䌀䈀䘀㔀㐀䈀䔀䔀㄀㘀㔀㜀䈀㠀䘀㄀㄀䘀㤀䘀㔀䘀䐀　㘀㤀㐀㤀㘀㘀䌀㈀㔀䈀䈀㤀㐀㜀䔀䌀䔀䘀㐀㜀㠀㠀　㘀䈀㘀㔀　䈀㤀㤀䔀㔀䘀㔀㄀　䈀䄀䐀㈀㌀䘀䌀㐀㤀㈀䘀㐀㌀㄀䌀䌀㤀㄀㐀䄀㈀㌀䄀㔀㤀䌀㈀䄀䘀㄀䐀㐀㠀　㘀㜀㌀䘀䔀　䐀㤀䘀䘀㌀㐀䄀䐀㌀䐀㜀䌀䐀䄀䐀㘀㄀䔀㐀㘀㘀䈀㔀㜀䘀䌀㄀㜀䈀㐀䈀㘀㄀䘀䌀䔀㐀㈀㤀㠀䄀㈀䐀䄀䘀㔀㠀㌀㔀䄀㌀㌀䐀䘀　䐀㜀䔀䌀㠀㠀䄀㐀䈀䐀㔀䔀㤀䄀㠀㄀㘀䄀㈀䔀㌀㈀䈀㔀䈀䐀㄀㤀䌀㤀䘀䐀㌀㐀㘀㌀䄀㐀　䌀㜀㔀㜀䈀㘀㜀䔀　　䔀㜀䐀䘀㘀䈀䐀䐀䌀䈀䘀䌀䐀㌀䌀　㤀㘀䘀䔀㠀䄀䐀䘀㄀㈀㠀㔀㘀㐀㤀䘀䐀䐀䘀䈀㌀㌀䔀㠀䌀㐀䄀䐀㐀　㘀䈀䔀㐀㤀䔀㠀㜀㤀䈀䔀　㈀㤀㤀㐀㌀㤀䈀㔀䌀㠀䘀䈀㤀㄀䘀㜀㔀㤀䌀㌀㄀䔀㠀㠀㄀䌀㠀　䈀䘀㌀䌀㤀㌀䔀㜀㐀㘀䔀㌀䌀䌀㜀㄀㌀䌀㌀㜀㈀䄀㌀㄀㐀䈀㔀㠀㌀䔀䌀䐀㌀㌀䔀㜀䈀㄀㠀䔀㔀㤀㘀㘀㈀䔀䄀㌀㜀㈀䔀㘀　䄀㜀㌀　㔀䔀䈀䌀㘀㌀㔀䔀㘀㄀䄀㐀䄀㌀㐀㤀䘀㌀　㤀䘀䄀　䈀　䘀㤀䈀䐀䘀㤀㌀䐀㈀㔀㤀㤀㐀㜀䌀䐀䄀㌀㔀㐀　㄀㔀䔀㐀㌀　㄀䄀䘀㘀㄀㐀㔀㘀䈀䄀　㌀㔀㠀㠀㈀䄀䌀㄀㜀㌀㄀　㠀㄀䔀䘀䐀　㠀㐀䔀䘀䐀　㠀㈀䔀䘀䐀　䈀㘀㄀䔀䔀㘀㄀㄀䔀䄀㔀㠀㘀䈀䄀䌀㜀㔀䔀㐀㘀㌀㤀㜀㔀䐀㔀㔀䌀㐀䌀䈀㔀㔀㠀㜀㠀䘀䄀䐀　㘀㌀　䄀䘀　㤀䌀䌀䌀㜀　㌀䘀㌀㠀㤀㌀㄀㌀䘀㔀㠀　䈀䐀㔀㌀䘀㌀䘀㐀䄀㜀㤀㄀㈀㘀䐀㈀㜀㌀　䐀㘀㠀　䈀㄀　䔀㠀䌀　㌀䌀　㌀㠀　㠀䔀䘀㜀䘀㌀㜀䈀㌀㄀䘀䔀㜀㤀　㘀䈀㜀㐀㄀㔀䄀㄀　㜀㈀䈀㤀䐀䔀㈀㜀䘀㌀䈀㈀㈀䄀㤀㄀㤀䌀㄀㜀㠀㤀㜀㌀䈀䔀㜀㔀㤀䐀㈀䄀䐀㘀㐀㤀䐀䄀䘀㐀㌀䄀䈀㄀䘀㔀䘀䄀㄀㔀㤀䄀䐀㜀㈀㄀䘀䔀㔀㜀䌀䌀㤀䈀䘀㐀㄀䐀䄀㔀䐀䄀㌀㘀㠀㔀㜀㔀㌀䌀㤀䌀䄀䔀䄀䌀䌀䈀㜀㌀㔀䈀㤀䄀㜀　䐀㐀㠀䌀䌀㐀䄀㤀　㤀㔀㤀㔀㘀㌀䄀䐀㈀㤀㔀㔀䄀䐀㤀㄀㔀䘀㔀㐀䘀㈀㜀䔀㈀㌀䄀䐀㔀㤀䄀㌀㔀䄀㤀㌀　䌀䌀㤀䐀䐀㌀㐀㈀㘀䈀㤀㌀㔀㜀䌀㔀䈀䄀㠀㄀㘀䘀㔀䄀　䌀㄀㌀㐀㤀㌀㘀䔀㘀㄀䘀㤀䘀㔀㄀㈀䔀䐀䐀㄀㠀㐀㌀䌀㔀䘀㐀㠀䔀䈀䄀㜀㘀㔀㘀㤀㤀㌀䈀㔀䈀㤀䐀䄀㄀㈀䔀䐀㈀㄀㘀䐀㤀㌀䘀㘀䄀䄀䘀㘀䄀㄀䘀㘀䄀䐀㔀䔀㐀䔀㐀䘀䐀㘀㄀䈀䔀㤀㄀䐀䘀㐀䐀䔀㜀䄀䄀㘀㌀䔀㔀㘀㈀䘀䐀㘀䄀㜀䔀䈀　䈀䘀㐀㜀䈀䘀㐀㠀㜀䘀㐀㠀䐀㄀㐀䐀䐀䔀䘀䘀㤀㌀㈀㤀㜀㔀䔀䌀㌀䐀䈀㈀䈀䈀㔀㐀㌀䘀䌀㠀㤀㈀䘀䐀䔀㜀㌀㌀㈀㈀㘀䌀㤀䘀䈀　䈀䌀㌀㜀㐀㘀䘀㈀䈀㠀䘀䘀䐀㜀䈀䈀䌀㘀䐀䌀㠀䈀㤀　䘀㌀㤀䄀㌀䔀䘀䈀䔀㠀㈀㤀㐀䘀䐀㜀㄀㈀㤀䘀䘀㐀　䌀䄀　㄀䄀㐀䌀㐀㜀㘀㈀㄀㜀䈀䌀䘀䄀㌀䄀䌀㈀䐀㈀㠀䔀䈀㔀㔀䔀㐀㌀㠀㜀㠀㔀㈀㠀䔀䌀䐀䌀㠀䘀㄀㔀㜀䔀㐀㜀㠀　䐀㌀㤀䈀䔀㌀䔀㈀㤀䌀㜀　䈀䌀㠀䘀㄀㄀㈀㜀㈀㘀䌀㐀㜀㠀䔀㘀䘀㐀䔀䌀䄀䘀㄀㈀㈀㜀㈀䘀䌀　䐀㌀㤀㔀䔀㐀㜀㠀䔀㘀䘀䔀㌀㌀　㜀䈀　㌀㈀㤀䐀䘀䌀㔀䄀㔀䈀䌀㠀㤀㤀㐀㐀㌀㜀㄀㈀㤀㘀䘀㈀㄀䔀㔀䘀䈀䈀㠀㤀㐀䈀㜀㤀㄀㜀㈀㌀㠀㈀䔀䔀㔀㄀䐀䄀㐀䘀䌀㄀　㤀㜀䘀㈀㐀䘀䄀㐀䘀䌀㄀㠀㤀㜀䈀㈀　㌀㈀㤀㐀㜀䔀㈀㔀㈀㜀㘀㈀㈀䔀㔀㔀㠀㔀䌀䌀䄀㤀㜀㌀㈀䌀㔀　䘀䌀㜀䄀㔀㜀䌀㠀㔀㤀㐀䄀㐀䈀㠀㤀㐀䘀㜀㤀㄀䄀㈀䌀㔀䄀㔀䔀䌀㐀㘀㐀䄀㈀　㈀䔀䔀㔀㐀㌀䄀㐀㄀㠀㜀㄀㈀㤀㄀䘀㈀㄀㈀㔀㄀㐀㤀㜀䘀㈀㌀㄀㔀㈀㄀㈀䔀㈀㔀㈀㌀䔀㐀㌀㐀䄀䈀㤀䔀㌀㈀㤀䈀䔀䘀㐀㈀㘀㔀䘀䔀　䐀㜀㤀㔀䔀㤀䌀䌀㘀㌀㐀㄀䔀䘀㤀㌀䐀㠀䐀㌀䔀㜀䈀㄀䄀㜀㌀䐀㜀㠀㠀䄀㤀㘀䈀　　䈀㈀㔀䔀㠀㜀㄀㘀㔀㜀䔀㠀　㤀㐀㈀　㔀㈀㌀㠀㜀㜀㔀䌀㔀㤀䔀䘀䌀㘀㤀䔀㌀䔀㔀㔀㈀㔀㔀㐀䘀㤀㠀䐀㠀䌀䈀㈀㤀㌀䔀㐀㈀䐀㔀㘀㐀㔀㘀䄀㈀㠀䌀㤀㄀㄀䐀䐀㠀䈀䄀㈀䈀㌀㘀䐀㈀　䘀㜀㠀㌀䔀㌀㤀䈀㔀㈀㤀䄀㔀䌀䐀䐀　䔀㜀䄀㤀䄀䄀㜀㐀㄀㤀䘀㔀䌀㐀㌀㤀䄀䘀㜀　㜀䔀䘀㘀㘀䘀㈀㈀　㤀㔀㄀䈀㐀㌀㈀㜀䌀䔀䘀㌀䔀㘀䘀㄀䐀䘀㄀㘀䌀㘀㜀㐀㐀䐀䈀䐀㜀㌀㘀㘀㌀㔀䔀㠀䌀　㈀㈀䄀䄀㤀䘀䔀䈀㤀䔀䈀㘀㌀㔀䐀䄀䌀䘀㘀䈀䌀䐀㌀㤀㤀㤀㈀㔀㤀䘀　䔀㤀㜀㌀㈀䘀㤀䄀䐀䌀䔀㌀㜀䐀㈀䔀㐀㤀䄀㤀䘀㠀㘀㔀䐀䔀㌀䈀㈀㤀䘀㄀㈀䈀䐀㔀䈀䈀䌀䌀㔀䘀䌀䌀㘀䔀䐀䐀䔀䔀䐀䘀䌀䘀㘀㔀㈀㘀䘀㌀㤀䈀㜀䘀㔀㘀䔀䔀䘀㘀䔀㐀䄀䘀　䔀䔀䘀㜀䔀䔀䄀㜀㜀㈀䐀䔀㠀㌀䐀䔀㠀㌀㠀䌀䘀㤀䌀㌀䐀䔀䌀㌀㤀䌀䘀㌀㔀㄀䔀䘀㔀㄀䌀㘀㜀䘀䄀䐀䈀㜀㤀㘀䘀㤀㜀㠀㠀㌀䈀㜀㤀㄀㈀䄀㤀䌀㘀䌀㐀㜀㘀䈀䈀㈀㈀䔀㈀䔀㔀䈀䐀䄀　䌀䐀䔀㔀䄀䈀䘀㜀䔀䌀䌀　䈀䄀㘀㜀㐀㠀㜀㄀㘀㠀㐀㈀䐀䈀㔀㐀㐀㤀㌀㘀䘀㈀䌀㠀䌀㐀䈀　䈀䐀　㄀䌀䈀䔀䔀㐀䐀㤀䄀㠀䐀㌀㘀㌀䄀㤀䘀䘀䈀䔀㘀㠀㐀㈀㠀㤀䔀䐀　䔀㈀㤀㠀㤀䌀䔀㄀㄀　䘀㤀㘀㐀㌀㌀䌀㈀㄀㈀㄀㤀䔀䈀　㈀㈀䔀㈀　㤀㤀䈀　㌀䔀䘀㜀㐀䌀㐀㄀㌀　䔀㐀㌀㈀㐀㔀㄀㄀㘀䔀㈀　㤀㜀㌀㠀㄀䘀㄀䐀㐀䈀㠀㜀㠀䌀㈀䔀㄀㘀䄀㤀㔀㜀䔀䌀㈀㜀㄀㌀䈀㔀㐀㌀㌀㐀䔀㠀䐀　㜀㐀㔀䐀䄀㈀㤀䘀㄀䄀　㤀䄀　㄀㤀䔀㤀㄀䐀㄀㠀㌀㠀㐀䔀㠀㐀㄀　䐀䐀㄀㠀㌀㘀㜀䈀㜀㤀䘀䔀　䘀䘀㈀㌀　㘀㘀㔀㐀㐀䐀䄀㤀㤀㈀㈀　㘀㘀㔀䄀䌀䔀　㐀　㐀㐀　䔀　䌀㐀㜀䄀䌀㘀　㄀㄀䔀㈀　㜀㠀䄀䔀㄀㤀䘀㔀䘀㠀䌀㔀㠀䌀㄀㈀㔀㠀㠀㄀㔀㔀䌀㠀䄀㔀㠀䌀㄀㤀㔀䘀㘀㄀䈀䌀䔀㔀㄀㔀䄀㈀㔀䄀㌀䘀㔀䈀㐀㔀㜀㄀　䄀䐀㄀㜀㐀㄀䈀㐀㤀䔀㠀㔀㘀㠀䈀䐀㘀㐀㐀㐀䔀䈀㔀㔀㐀㔀䈀㐀㔀䔀㜀㔀㐀㐀䔀䈀䐀㔀㐀㐀䈀㐀㔀䔀　䄀䘀䄀㜀㤀㄀㐀䐀㘀㄀㈀㔀㐀㘀䌀㄀䔀䌀䘀㔀㈀㈀㐀㌀㜀䌀㠀㔀㌀㄀㈀㌀㈀䔀㌀㔀㈀㜀㐀㄀㘀㔀䘀㄀㤀䌀㜀䔀㜀㈀䘀㈀䄀㘀䐀㌀㈀䈀䔀䄀䘀䐀㜀㌀䔀㈀䔀㈀䐀䄀　㠀䐀䐀㈀䈀㜀㘀㄀㜀㜀㐀䐀䘀䐀㔀㠀䔀䄀䔀㤀㈀㈀䘀㌀㤀㈀䈀䌀䈀䐀㌀䌀䌀䄀䌀㤀䐀䈀䌀䘀㜀㘀㠀䐀䔀㘀㄀䐀㤀㐀㤀㘀㠀䄀䘀㜀　䐀䐀䈀㄀䄀　㄀䔀䘀㌀䈀䈀㘀㄀䔀㠀㈀䐀䔀䘀㜀㘀䌀㄀䘀㄀㠀䐀䔀　䘀㘀䌀　㄀㠀㐀䈀䌀㈀㌀䐀䔀㔀㄀㐀䄀䘀　㌀㔀䐀㘀㠀㈀䔀㔀㜀䐀㠀㌀㜀㔀㜀　䐀㠀㐀䘀㘀　㤀䐀䌀䄀䈀䄀㤀㐀䘀㔀䈀䄀䔀　䈀㈀䄀䌀㜀䘀㔀䈀㔀㐀䐀䘀䐀䐀䐀㐀㠀䈀䌀㜀䐀㈀䈀㜀㔀㐀㠀　㌀㠀䈀䈀㘀㈀㤀㈀㜀䈀㈀㌀䌀䘀㄀㐀䌀䘀㈀㜀䔀㌀䄀䔀㈀㈀㤀　㄀䈀㈀㘀䔀㐀䌀㘀　㤀㔀㄀㜀䐀䔀䔀㠀䘀䔀䔀㠀䘀㤀㐀䔀䌀㄀䔀㜀㔀㠀䘀㘀㈀㈀䘀䌀䈀䘀䘀㐀䐀㘀䌀䐀䘀㐀㔀䈀䘀㜀䌀䐀䘀㈀㘀䘀㐀㜀㔀㘀㔀䌀㐀　㠀㐀㘀㄀　㈀㌀䔀㠀㈀　㐀㘀䐀　㐀㔀㠀䌀䄀　㠀䘀㄀㠀䌀㄀㈀䄀㠀㠀㄀㄀䄀䌀㠀㤀㌀㠀䈀䄀䈀䄀㠀㠀䄀㌀䄀䈀㠀㜀㌀㠀䈀䄀　㘀㠀㠀䄀㌀㌀䈀㄀䘀㜀㄀㜀㐀㐀䐀㄀㄀㐀㜀䐀㜀㄀㈀㜀㄀㜀㐀䄀䐀㄀　㐀㜀䐀㜀　㘀㜀㄀㜀㐀䔀䐀㤀䌀㔀㘀㐀䔀㔀䈀䔀䄀䔀㐀㜀㐀㜀㈀㌀䄀㔀㌀㔀㜀䄀㜀㠀䈀䐀㌀㠀㔀䈀䄀㌀㤀㘀㤀㐀䔀㄀䄀㜀㔀㜀㜀䐀㈀㤀䐀㜀㐀䔀䄀䔀㄀　䌀㜀㐀　㘀䐀㈀㘀㔀㐀䔀㠀㘀㤀㌀㐀㄀㌀䐀㤀䐀䔀㄀䌀䔀㜀　䘀䄀㤀䐀㤀㌀䔀㤀㘀㐀䐀㄀䔀㔀㐀䔀䄀䔀㤀㌀㐀㜀㜀䐀㄀　㔀㤀㤀㠀㠀㘀䌀㠀䌀㈀　㄀㠀㠀㈀䌀㄀䌀㠀㠀䌀㠀䌀㈀䌀㄀㠀㠀㈀䌀㄀䌀㠀䄀䌀㠀䌀㈀㄀㄀㠀㠀䈀㔀䌀䈀㐀㘀䄀䌀㔀䐀　䔀㘀㈀䔀䐀䘀㈀㄀　㘀䈀㌀㜀㄀㘀䈀㄀㜀㘀㠀㔀㠀㠀䈀㔀㤀䈀㠀㐀㔀㠀䈀䈀䌀㤀㠀㠀䈀㔀㤀䈀㠀㈀㔀㠀䈀䈀䄀䈀㄀㄀㘀䈀㜀㜀㈀䐀䌀㤀㤀䐀䄀㤀㌀䘀㌀㔀䈀㈀㔀　䌀㘀㄀㐀㔀㘀　　㈀䐀㈀䄀㠀㌀㄀㘀㄀㄀䐀　䌀㈀　㈀㈀䐀㄀䌀䐀　䄀㈀　䄀㘀㠀㔀㄀　䈀䈀㐀㐀㠀　㄀㈀䐀䔀䄀㠀　㄀㘀㜀㔀㄀㄀㔀㌀㜀㠀㌀䔀㘀㈀　䄀㄀䈀㈀㌀䄀㘀䘀　㐀㈀䌀㐀㄀㐀㌀㘀㐀㜀㐀㐀㐀䄀　䈀䌀㐀㄀㐀㔀䔀㠀㐀㤀㠀䌀㈀㤀㘀㠀㠀㐀㐀㘀㠀㠀䐀㤀㠀䌀㈀㌀㘀㠀㠀㈀㤀㘀䌀㠀䈀㜀㘀㜀㘀㐀　㌀䈀㌀䈀䄀㈀㤀䐀㤀䐀䐀㄀䌀䔀㈀䔀㘀㠀㘀㜀　䘀䈀㐀䈀㌀㄀㜀䐀䄀㤀㤀㠀䄀㜀㘀䘀㘀㐀㄀㌀䈀䐀㌀䐀　䌀䔀㠀㄀㄀㠀䔀䘀䈀䐀㔀㠀䄀䐀㈀䘀㔀㘀㈀㌀㌀㘀　㄀䘀㄀䈀㔀㘀䈀　㌀㐀䈀䘀　䐀䐀䐀　䈀㠀㌀㐀䄀㌀䄀㔀䈀㄀㤀㤀䐀㌀㠀䄀㐀䔀㐀㠀䐀䈀㄀㤀㄀䄀䌀䌀㘀㤀㄀㤀䈀㄀㌀㐀㤀䐀㐀㘀㤀䌀㘀㘀㈀㜀㤀　䐀䌀䔀㔀㄀㈀䌀㐀㈀䔀㄀㜀　㌀䈀䈀㔀䌀㄀㈀䔀　㔀㄀㈀䐀㈀㜀㐀䘀䈀䌀㘀㈀㌀㤀䘀䈀㐀㤀䔀㐀㔀㌀㄀䔀㐀㤀㜀䈀㈀㈀㔀䘀䈀㈀㤀䌀䐀䐀㄀䈀䐀㤀㐀䈀㄀㔀㈀㌀䘀䈀㈀㌀䘀䈀䄀㤀㤀㈀㌀䌀䐀㤀㠀䌀㘀㔀䔀䔀䘀㜀㤀㄀䌀㌀㈀䌀㤀䐀㠀䘀㐀㘀㠀䔀䈀㄀䘀㘀䐀㘀㐀䌀㠀䐀㔀䌀䄀䌀䐀䈀㜀䄀㔀㠀䈀㄀㤀㔀㌀䈀䔀䐀䐀䔀䔀㐀㤀㄀䈀䈀䌀䈀䐀䌀㐀㔀㔀㔀䈀　䄀䘀䄀䔀䄀䄀䐀㔀䐀㠀㘀䄀㐀䌀䐀㔀䈀　㈀㌀䈀㠀䈀䄀䐀㔀䐀㤀䔀䄀㐀䌀㌀㔀䌀　䘀㔀㌀㔀䌀㄀䘀㔀䈀㔀䈀　㤀䄀㤀䘀㠀㈀䈀㔀䐀㄀䐀䄀㄀㠀　㄀㜀㔀㄀　䘀㤀㜀㠀㄀䔀䌀㘀㐀㄀　㌀㠀䌀㠀㌀㠀㘀㄀㠀　㜀䔀㜀㘀㌀㄀䌀㌀㐀䌀㈀䄀䔀㤀䈀㘀㘀䐀㠀㘀䘀㜀㌀㈀㄀㜀㘀　㐀㌀㜀䌀㜀㠀䔀䔀　㄀㘀㤀　䌀㌀㘀䐀㌀　㌀䔀㈀䔀䈀㘀㤀䘀㘀㔀　㤀䐀䌀䌀㄀㜀䔀䐀䔀㜀䔀㤀䔀㌀䄀㘀㈀䄀䌀㜀㐀䌀㈀㔀㠀䔀㤀㠀䄀䈀㄀㜀㈀㈀㤀䌀㘀㐀䄀㜀㜀㠀䌀㤀㔀䌀䈀㌀　㔀㘀㜀䄀㠀㄀㌀䘀䘀䄀㠀㄀㌀䘀䐀㈀䌀㄀㄀䘀　㌀䌀　㄀䘀㠀㌀䌀　㄀䘀㄀㤀䔀　㠀䘀㔀㄀䔀　㠀䘀䐀㄀䔀　㠀䘀㘀䌀䘀　㐀㜀㈀䔀䌀㘀㐀䄀㌀䔀䌀㘀㐀䄀㄀㄀䌀㘀䌀䄀　㐀㠀䌀㤀㔀㠀㤀㄀㠀㈀䈀䌀㔀㄀㠀㈀䈀㤀㌀㌀　㔀㘀㈀㘀㘀㌀䄀䌀䘀䌀㄀䔀㘀㌀㘀㔀　䄀㠀䘀㤀㔀㌀㄀䘀㐀　㜀䄀㜀䐀　㈀㤀䄀㈀㄀㤀䌀䔀　㐀㘀㜀　㈀䌀䐀䌀㐀㘀䔀䔀㔀㌀䘀㌀㤀䈀㌀㤀䌀㔀㤀㌀㐀䌀䈀㈀㤀㜀㄀㐀䄀㘀㠀䈀㘀㌀㌀䌀䘀㤀㤀㐀㜀㜀㌀䈀　㘀㜀䈀㤀　㐀㜀䈀㤀㘀䔀㜀㌀䄀䈀㜀䘀㌀䐀㠀㤀䄀㠀㜀䈀㄀䈀㔀　㠀㘀㌀䔀䈀㄀㘀㠀䌀䄀䐀䌀㔀㄀㠀㔀䈀䈀㜀㘀㌀㘀䌀㈀䐀　㌀䌀䘀䄀䐀　㐀䌀䘀㤀㔀㠀㈀䔀㜀䔀䔀　㔀䌀䘀䐀䐀　㜀㤀䔀㜀䈀㄀㠀㌀䌀䈀㜀　䔀㌀䌀䈀㜀㄀䔀㌀䌀䈀㜀㄀㄀㌀䌀䘀㜀㌀㠀㜀㠀䔀䔀㄀㤀䈀㜀㤀㄀䐀䈀㠀㠀㤀䔀㜀㔀䐀䈀䈀㠀㘀䐀䔀㠀㌀㤀䈀㜀㤀㌀䐀䈀㠀㤀㤀䔀㜀㜀䄀䘀㜀　䄀䘀䄀　䌀䐀䐀㄀㠀㠀㌀㠀䌀䌀　䌀㌀䔀㤀㘀㜀㈀䐀㄀䐀䈀䌀㜀㌀㌀㘀㄀䘀㈀　䔀䘀㌀䐀䌀㔀　䘀㌀㜀䔀㤀㐀䈀㌀㌀䘀䔀䘀㤀㠀䌀䘀䘀㘀㠀䄀㄀䘀䔀　㄀㤀㤀　䔀㄀㠀㜀㜀㠀䘀䔀㤀㔀䔀　㤀㜀䘀㜀䌀䈀䔀㌀㤀䌀䘀㈀㄀㌀䘀㘀㤀㄀䄀㌀䘀䘀䌀㌀䐀㠀䘀㌀㤀㠀㠀㐀㌀䐀㠀䘀　㈀㌀㄀㘀㌀㄀㔀䈀㄀䘀㌀䈀䈀㄀㈀䈀㠀䄀　㌀㈀㜀㘀　㔀㐀㜀䈀　䔀㜀䐀䈀㐀㘀㤀䌀㤀㠀㠀䈀㄀䔀䘀㘀䐀㄀䌀㌀䌀㤀䐀㄀㜀䐀㔀㔀㠀䔀䌀㜀㜀䐀㔀㈀　䈀㜀䐀㜀㈀㄀䔀䘀䄀䄀㐀㈀䔀䘀䄀䄀㐀㌀䔀䘀䄀䄀㐀㈀㄀䌀㘀䔀䌀　㔀䐀㠀㄀㜀䐀䔀　䌀䘀䈀䌀㈀䐀䈀㈀㄀㐀䔀䄀䌀㌀䐀䘀㘀㠀㔀㔀䘀　䌀㐀䄀㜀㜀䌀　䈀䔀䘀　㠀䔀㠀㠀㄀㤀䔀䈀　䄀㄀䄀㜀㜀　㌀㠀䐀䈀䈀㘀㌀㔀䘀䘀㠀䔀㔀䌀䔀䌀䔀㔀㠀㠀䌀㜀㌀㔀䘀㔀　㈀䈀　䐀䐀㐀㐀䄀　㜀䈀㔀　㘀㠀　㔀䄀㐀㌀㔀䐀䌀䘀䘀㔀㈀㠀䌀㌀㜀䐀㠀㐀㘀㤀㈀㌀㈀㌀㠀　䈀䈀㤀䘀䌀䐀䘀㠀　㈀䌀䘀㤀㜀　㌀䌀䘀㤀㜀㐀㜀㘀䈀㄀㌀䌀㄀䘀㌀㘀㄀䘀　㜀䌀㄀㈀䈀㠀䈀䐀　㈀䈀㠀㔀䐀㠀　䐀䈀㈀䈀㠀㈀䐀䈀㈀䈀㠀㄀䐀䈀㘀䐀㜀　䈀䈀　㌀㔀䄀䈀㠀䄀　㠀㔀　㜀㘀䔀䄀䘀　㘀㘀䔀䄀䘀　㔀　䔀㐀䘀　㄀㠀㜀䐀㜀　㔀㠀㜀䐀㜀　㌀㠀㜀㌀㜀　　㠀㜀㤀䘀　䘀　䔀㘀䘀　䄀　䔀㘀䘀　㤀　䔀㘀䘀　㔀　䔀㘀䘀　㌀　䔀㘀䘀　㜀　䔀䔀䘀　㐀㘀䄀㜀㘀　㌀㌀㔀䈀䈀㠀㌀㤀䄀㤀㜀㠀㄀㤀䄀䈀䘀　㌀㠀㜀䘀㜀　㘀㠀㜀䘀㜀　㌀㠀㜀䘀㜀　㜀㠀㜀　䘀　　㠀㜀　䘀　㐀㠀㜀　䘀　㈀㠀㜀　䘀　㘀㠀㜀　䘀　㄀㠀㜀　䘀　㔀㠀㜀㠀䘀　　㠀㜀㠀䘀　㈀㠀㜀㘀㜀㠀㄀䔀䔀䐀㤀䔀　䘀　㄀䌀㜀　㜀㠀㈀䔀㌀㠀㌀䌀　䘀䐀㐀㄀䘀　㌀䔀䄀㠀䘀　㔀㠀㜀㄀㜀㠀㈀䌀㌀㈀㜀㠀㄀䌀㌀㈀㜀㠀㌀䌀㌀䄀㜀㠀　䌀㌀䄀䘀　㘀㠀㜀㔀䘀　䈀　䔀㤀䘀　䐀　䔀㤀䘀　㌀　䔀㤀䘀　䈀　䔀䈀䘀㄀䔀㄀䌀㜀䔀㄀㌀䘀䄀䔀䌀㔀㘀䘀㐀䐀㤀㘀㈀䘀㐀䐀㤀䔀䐀䔀㠀䈀㌀㈀㔀䔀㠀䈀㌀䈀䈀䐀　㔀䈀䐀㈀䌀㌀䔀䐀㤀䔀䄀䄀㐀㌀䐀㠀䌀䔀䐀䈀䌀㤀㌀䄀䘀䘀㤀　䘀㤀㈀㌀䘀㌀㘀　㄀㔀䄀䈀　㤀䌀䘀㤀㄀㌀㌀䄀䐀㄀䌀㘀䄀䌀㠀㌀㘀䐀䘀㌀㐀㘀䄀　㘀　䐀㜀㌀㄀㄀㌀㐀㐀䌀㐀䈀㘀㠀㤀㠀㔀㘀䐀　㌀　㘀䐀䄀　㘀㄀䐀䄀㐀㈀㌀䘀䈀㐀㠀㌀㜀䔀䔀㠀　㐀䘀䐀䐀　㄀㤀䘀䄀䔀㄀㄀㈀䔀㠀㠀㜀㈀䔀䐀　　䘀㔀䐀䄀㄀㄀䘀䈀䄀㐀㄀㌀䘀㜀㐀䌀㜀䌀䔀䄀䌀㄀䔀㘀䌀㄀㄀㜀䔀㐀䘀㐀㌀㜀䘀䈀㈀䄀㔀㘀㄀㤀䐀㐀㘀䘀䘀㘀㔀㔀䄀㈀㌀㤀㤀䈀䈀䈀㈀䄀䐀㘀䌀䔀㘀㈀䈀㌀㤀䈀䄀㄀㈀㌀㄀䈀䄀㤀㈀㠀　㜀㔀　㔀㘀　㈀䐀㠀　㜀㔀㐀㔀㘀　㔀䐀㄀㤀㔀㠀㐀㜀㠀　䈀㔀　㤀䄀䌀㌀䐀㘀　䔀䐀　㌀䔀䈀㘀㐀㘀　㔀䐀　㔀㔀㠀㔀㜀　㔀䐀㘀䐀㔀㠀㄀䈀㔀䘀㐀㔀䐀㈀㐀㤀䌀䌀㤀䄀䄀㠀㌀㐀䐀㄀㘀㠀㐀㐀䐀㘀㘀䌀　䄀㘀　䄀䌀㔀㘀㘀䄀㠀䔀䄀㐀䌀㈀䄀㤀䌀　㈀㄀䐀㠀䌀㐀䌀㠀䘀䘀　㔀䌀㌀　䘀㈀㐀䌀䔀㐀㄀㤀䐀㈀䄀䌀䔀䈀䄀䌀䔀䈀㐀㠀䈀㜀㐀䄀䄀䐀䐀㈀㜀㌀㄀㘀䌀㤀㔀㔀㠀㘀㘀㌀㤀㤀㤀䐀㈀䐀㘀㌀㜀䐀㈀䄀㐀㔀㘀㘀㐀㔀㔀㠀䌀㌀㐀㘀㘀䔀㠀㠀䐀䌀䌀　㘀䐀㜀䌀㈀㄀䘀㈀　㈀䈀㜀㜀㄀㘀䈀㘀㐀㈀䈀㔀䈀䄀䔀㠀㌀䌀䌀㐀㄀㘀䌀䈀㤀　䔀㌀㔀㠀㜀䈀㈀䔀㔀㌀䄀䌀㔀㤀䌀䌀㈀㌀䌀㜀㌀㠀䐀㜀㤀　䐀䘀㜀䐀䔀㘀䌀㜀㌀㌀㘀㔀䈀䄀䔀䈀㜀㤀㤀䈀㜀䈀㄀䔀㔀䈀䄀䌀䐀䐀䌀䌀㘀㌀㘀䔀㜀㜀㘀㜀㌀㌀䈀㠀㔀䌀䐀㌀䐀䔀㘀㄀䔀㐀䄀㌀㈀　䘀㤀㠀　㜀䄀㠀㠀㈀䘀䘀䄀㐀䘀䘀㈀㐀　㤀䘀䘀　㔀䘀䘀　㔀㤀䌀䈀䈀㜀㄀㈀䔀䐀䈀䐀䄀㔀㘀䈀㔀㌀㔀㄀㄀㈀䈀㠀䔀䐀䘀㤀㤀䐀䘀㄀㄀㔀㤀㈀㄀㠀䈀㘀㜀　㐀䐀㘀㄀䌀㘀䈀　䔀䘀㜀䌀㜀　䄀㘀䈀　㔀䌀䈀㜀㈀㠀㤀㘀䘀㄀　䘀㠀㄀䄀䈀䘀㄀㄀㜀䌀䌀㌀䈀　䈀㈀㐀䈀㈀㈀㈀㔀㠀䌀䌀㜀㤀㘀䌀㠀㄀㘀䌀㘀䘀㜀　㘀䔀䈀　㘀䌀㘀䘀㜀㔀䈀䔀䈀㌀䈀䌀㘀㔀㜀㤀䔀㄀㐀㘀㤀㘀　㄀㘀㄀䈀㌀䄀䌀㜀䘀㠀㤀㘀䘀㄀㜀䈀㤀㈀䔀㐀䘀㜀䘀㠀㜀㔀㈀㌀䔀　㄀㠀　　㠀䔀䌀㄀㜀㌀㠀䌀䄀㌀㠀䄀㈀㄀䐀㘀䔀㐀䈀㜀　䄀䘀㐀䌀㠀㤀䌀䌀㠀䈀㤀㌀䄀㜀㄀䔀㐀㘀㐀㤀䄀䌀㤀㤀㤀㘀㌀䐀　㄀䌀㘀㈀　䔀㘀㄀㘀㤀㜀㠀䈀㔀㜀㤀㌀㔀䐀㌀䔀䌀㈀㤀䘀䘀㈀㤀䐀㈀䘀䐀㄀㜀䘀䐀㄀㜀䌀䘀㤀㤀㠀䌀䐀　㄀㈀䘀䄀䐀㌀㘀䔀䔀䐀㈀㔀䔀䐀㄀㔀䔀䐀　䐀㘀䐀㠀㜀䘀㘀䈀䔀䘀㘀䈀㄀䈀㘀㐀㜀㌀䈀䄀　㄀䐀䐀㘀㐀㤀　䘀䔀㤀㐀㤀㜀䄀㐀㐀䘀㜀䘀㐀㤀䄀㜀䄀㔀䐀䈀䐀㠀㤀䐀䔀㔀㈀㘀䘀㈀䘀䈀䘀㌀㌀䄀㐀䘀㜀䐀㘀䘀䈀䔀䈀㐀㌀䘀㔀㐀䌀㌀䐀㐀䈀㄀䘀䄀䈀㄀㜀䔀㤀㤀㌀䘀㔀䔀㤀䘀䄀㈀䌀䘀䐀㜀䄀㜀䐀㠀㄀䈀䔀㔀㠀㔀䘀䄀䄀㤀㜀䔀䄀　䘀䔀㠀㘀䈀䘀㔀㈀㜀䘀㔀䔀㜀䘀㐀㈀䐀䘀䄀㌀㘀䘀䐀　䐀㜀䐀㠀㜀䘀䔀䈀䔀䘀䔀䈀㄀䘀䔀㤀㔀䘀䔀䈀㔀㜀䔀㤀㠀䄀㜀䔀㤀䄀㄀㐀　㔀㈀䌀　　䄀㈀㐀　㜀䄀䄀　㜀䔀䄀　㐀㄀䄀　㔀㈀䔀　䌀䈀㐀　䔀㜀㐀　㠀㜀㐀　䐀䘀㐀　䌀䘀㐀　䐀　䌀　䌀　䌀　䐀㘀㐀　㘀㜀㈀　㈀　㔀㠀㄀䔀㈀䌀　㤀㐀䌀　䘀㐀䌀　䄀䌀䌀　㠀䐀㠀㄀　㔀㠀㄀䌀㔀㠀㄀䄀㔀㠀㄀㜀䈀　㈀䘀㜀　㔀㄀䔀　㤀䄀䌀　䘀㌀䌀㄀㤀䐀㠀㄀㐀㜀㠀㌀㄀䈀　㌀㔀䘀　㘀䄀䔀　䄀䐀䌀　䌀䔀䌀　㠀㜀㠀㄀㌀䐀㠀㄀䄀䘀　㌀㌀䘀　㘀㠀㌀䌀㄀䄀㐀㘀　䄀㔀䄀　㄀㌀䄀䌀㄀䄀㐀䌀　㤀䐀㘀　䘀㌀㘀　㤀䈀㘀　㠀䈀㘀　䐀㜀㘀　㠀㜀㘀　䐀䘀㘀　䌀䘀㘀　䔀䘀㘀　䘀　䔀　䐀㘀㘀　㘀䘀㌀㠀㈀㐀㔀䌀㄀㈀㤀䌀㄀㄀㤀䌀㄀䈀㤀䌀㄀㄀䈀㠀㌀　䈀㠀㌀䈀㜀　㜀㤀㜀　㜀㐀䈀㠀㌀　䘀　㐀㔀㜀　㜀䐀㜀　㜀㤀䘀　䌀㌀䔀㄀㜀䐀䌀㄀㈀䐀䌀㄀㘀䐀䌀㄀䔀㜀䌀㈀㜀䘀㠀㜀䔀䘀　䐀㌀䔀　㤀䔀䔀　㠀㄀䔀　㘀㄀㠀㌀㠀䌀㜀㈀㐀㘀㈀㔀䌀㌀㌀㌀䄀䄀㄀䈀㜀㔀㠀䐀㠀㘀㐀㘀㔀㌀䄀㌀䈀㔀䐀㄀䌀㄀䔀㠀㘀㘀䘀㐀㌀㈀䘀䄀㄀䈀㐀㌀㠀䐀㐀䌀㈀㌀䌀㜀䌀㠀㌀㜀㈀㘀㄀㠀㤀㌀㠀䐀㘀㤀䌀㘀㐀䌀㘀㌀㠀䔀㜀㄀䄀㌀䈀㄀䐀　䈀㠀䐀䐀㔀㠀㘀䔀㤀㐀㄀䄀　䘀㄀㠀㘀䈀㠀䐀㈀㜀㠀䐀䔀㜀㠀䌀㈀䐀䌀㘀㌀㘀㘀㌀䈀䈀䘀㄀㠀䔀䈀㄀䐀㌀䘀㠀䐀　䘀㠀䐀䌀䘀㠀䌀䄀䘀㠀䐀䄀㌀㠀㄀䌀䄀㈀㔀　㈀㠀㤀㐀㄀㐀㠀䄀㠀㐀㤀㈀㐀㌀㈀㤀䄀㄀䘀䄀䄀㄀䄀㘀䄀㄀㤀㘀䄀㄀䘀㘀䄀㄀㐀䈀㐀㈀㌀䐀㐀㌀䈀䐀㐀㌀䘀䐀㐀㌀㠀㌀㐀㌀䌀㌀㐀㌀㔀㤀䄀㄀䈀㄀䄀㄀䄀㈀䐀　䔀㐀䐀　䈀㐀䐀　䄀䌀䐀　㠀䐀䄀㄀㔀䈀㐀㈀㐀䈀㐀㌀䄀㔀䄀㄀　㜀㐀㈀䄀䈀㐀㌀䔀䈀㐀㌀㐀䘀㠀㘀㤀䔀　䈀㘀䐀　㤀㘀䐀　䈀㘀䐀　䘀䈀䐀㄀㌀䐀䄀㄀䐀䘀䄀㌀䌀㜀㐀㈀　㜀㐀㌀㠀㐀㄀㐀䘀㐀㠀㐀䌀㠀㠀㈀㐀㜀㠀　㤀㌀㔀㄀㌀䔀䄀㈀㜀㌀㐀㐀㤀䈀㠀㌀　䄀㄀㘀㔀㐀㈀䐀䈀㠀㐀　䔀　㤀㤀㜀㈀㐀㜀㐀㐀䈀䔀㠀䌀㔀㜀䌀䐀㐀䌀䈀㔀䈀　㠀㤀㠀　㌀䌀㠀㌀䄀䌀䌀㠀䘀䄀㘀䌀䔀　㐀䌀䌀　㔀㔀䌀䌀䄀㘀㌀㤀㐀㜀㌀㜀㠀䔀䈀䘀　㘀䈀㈀䌀䔀　㜀㈀䌀　㜀䌀䌀　䈀䈀　㄀㘀䘀㐀㌀䄀䔀㌀㄀䄀䄀䈀䌀㘀㔀䔀䄀㤀䐀䔀㠀㌀䐀䐀䈀㔀䈀㠀㐀䐀㐀　㜀　㄀䄀㜀　㌀䐀䔀㠀䘀䈀䘀㔀䌀㠀㌀䘀䌀䄀㤀　䄀䔀㘀　　㐀䄀㈀䌀㔀㈀䘀㄀㌀㐀㄀㌀㌀　㄀㜀㔀　㘀㈀㤀㄀䄀䄀䈀　㐀㠀　㔀㄀㘀䄀㤀䌀　㈀㈀㄀㔀㔀㠀䄀㐀　㈀㠀䈀㔀㐀㘀　㤀㄀䄀䄀䈀　㐀㠀㐀㔀䔀䐀䄀㤀　䄀㠀䈀㔀㐀㠀㔀㐀㔀㈀䄀䈀　㐀㠀　㔀㄀㘀䄀㤀䌀　㈀㈀㔀㔀㘀㄀䐀㄀䌀䘀䌀䈀䔀㘀㤀䄀䘀䈀䔀㄀㘀㤀㈀㄀䄀㜀䘀㌀㘀䘀㤀㔀㌀䔀㄀㄀㜀　㌀㤀䔀　㘀㐀䌀　㐀㔀㠀　䌀䈀㤀　㘀䈀㈀㈀㜀㈀䄀㔀䔀㌀䔀䐀㜀㐀㌀䌀䌀㤀䈀㜀䐀㌀䐀㔀䐀䈀䔀㤀㜀㠀㌀䈀㄀䐀㘀䘀䄀㜀䔀㌀䔀䐀㜀㐀䈀䌀㤀䐀㠀䔀䈀㜀䐀㌀䐀㔀䐀䈀䘀䐀䈀㤀䔀䐀㤀䄀䐀䘀㄀䘀㐀䘀䐀㤀㠀　㘀䌀㐀㌀䌀㠀㔀㐀䔀䘀　䔀䘀䔀㌀㔀　　㜀䘀㄀䐀㠀　䄀㜀㘀䌀㐀　䘀㤀䐀㜀　㄀䘀㠀䄀䈀䔀㘀　䘀䔀㐀㤀㐀㠀㄀䐀䔀㔀㔀㠀　㔀㌀　　㤀㜀　㌀㄀㘀　㄀䌀䄀䐀㈀　㜀㜀㤀㜀㤀㠀　䌀䈀㌀㤀䘀㜀㈀　㌀䌀䌀䐀　㌀㈀䌀　㐀㤀䌀　㐀䈀㠀　䌀䈀　　㐀㜀　㌀㘀㤀㜀䌀䔀㤀　㜀㌀㐀㔀䔀䘀㄀㌀䐀㐀㜀䐀㤀㄀䈀䄀㈀䘀㔀㔀䘀㜀㐀㤀㔀䌀䐀䔀㘀　㜀䔀㘀㌀㌀　㘀䄀㄀䘀㠀䌀䐀䄀　㜀䄀㌀䘀㘀䌀㄀䄀㠀㜀䐀㌀　㘀䄀㄀䘀㠀㈀䐀䄀㠀㜀䄀　䘀㘀㈀㄀㜀㠀㤀䄀　㜀㔀㠀　㠀㌀㠀　㤀㜀　㄀㤀㘀　　㤀䄀　䄀䌀㜀䐀㠀㠀䄀䄀㜀䐀㠀㠀䄀䄀㜀䐀㠀㠀䄀䄀㜀䐀㠀㠀䄀䄀㜀䐀㠀㠀䄀䄀㤀䐀䄀䐀㐀㔀㌀䘀䐀㌀䈀䈀㄀㘀䘀　㈀䄀㐀　㐀㤀䔀䐀䄀㄀䌀　㘀㄀䄀㠀㜀㜀㄀䐀䔀　䘀㔀㤀䌀㘀䘀㄀㠀㌀䘀㠀䐀㐀㐀䈀䔀㤀㄀䌀㠀㌀㜀㄀㈀䘀㤀㠀㘀㜀㤀䄀䈀　　䄀䘀　㌀䈀䌀㤀䔀㘀㄀　㘀䐀㌀㌀㜀㈀　㈀㄀㈀㠀㤀䈀㠀㄀㤀㐀㤀㤀㈀䄀㘀㔀㄀䐀㜀䔀㠀䐀㔀㄀䈀䘀㄀㘀䔀㄀㜀䔀㤀㔀䘀㜀㈀㜀㜀㔀㤀㜀㘀㔀㔀䘀㠀㤀䈀㜀䄀䘀㔀㐀㘀䘀㔀䘀㠀㤀㤀㐀㤀㤀㈀䄀㘀㔀㄀䐀㜀䔀㠀䐀㔀㄀䈀䘀䔀䔀䌀㐀㌀䐀䘀䄀䘀㘀㤀㔀䔀䄀䔀䐀䔀㄀䐀䔀　㘀䌀　㘀䈀　　㘀㜀　　䔀㘀　　䌀䄀㄀㄀㌀㄀㄀䌀㐀䘀㠀䈀　　䄀㜀䌀㔀㜀䔀㐀䘀　㜀㔀䌀　䄀䈀㠀㄀䌀㜀　㌀䔀䔀　㐀䐀㠀　㠀䘀㜀㄀䔀㤀㔀䌀㄀䔀㜀　㄀䐀䄀䔀䘀㠀㜀䘀　㐀㘀䄀㄀㤀㠀㄀㔀䄀㐀㘀䄀　㤀㘀㄀㄀䄀㠀㘀㔀　㐀㘀䄀㄀㤀㠀㄀䄀㜀㌀䈀　㄀䄀㜀䌀㔀㜀䔀㐀䘀　㜀㔀䌀　㤀䈀㠀　䄀㜀　㌀䔀䔀　㐀䐀㠀　䈀㈀㄀㘀㈀䔀　䘀㘀䐀㄀䄀㠀㄀䈀㘀㤀䐀㌀䄀㠀㈀㤀㘀㤀䘀㘀㄀䐀㐀㠀䌀　㘀㘀䘀㠀䌀　㘀㘀䘀㠀䌀䌀㘀䐀㌀㌀䌀䌀　㐀㈀䌀　㐀㤀㠀　䌀䈀　　㐀䈀　　㈀㔀㘀䘀㠀䌀㔀㘀䈀䌀㌀㄀㔀䄀䘀㄀䌀㘀㘀㠀䌀㔀㄀䈀䄀㌀㄀㔀㘀䘀㠀䌀　㘀㘀䘀䔀㠀㜀䔀㄀㘀䌀䄀䌀䔀㐀㈀䐀㤀㔀㤀㜀㠀㤀䄀　㜀㔀㠀　㠀㄀㠀䌀䐀䈀㄀　䌀䈀　　㐀㔀　㤀㘀㤀䐀䄀㔀䌀䄀䌀䔀㔀㈀㘀㔀㘀㜀䄀㤀䈀㈀䈀㌀㔀㐀䐀㤀㔀㤀㈀㠀㤀䈀㈀㔀㔀㜀䈀㈀㠀㔀㄀㘀䌀䄀㌀䈀㘀㐀㘀㄀䈀㈀㈀䐀㈀㔀㠀㤀㐀䄀㐀䐀㔀㔀䄀㤀䄀㤀㤀䌀㈀䄀㈀㔀㠀䄀㤀㐀　䈀㜀㈀㜀㐀䌀䈀㌀㄀㈀䌀䈀㤀㐀䄀䘀㈀　㘀䘀㜀㐀㠀䈀㈀㠀䈀䈀㈀㐀㜀䔀　㜀䔀䘀䌀㔀㐀㜀㄀䈀㤀㘀䘀䐀㄀䌀㘀䔀㤀䔀㄀　䐀䌀䐀䌀䘀䐀㠀㄀䄀㘀䐀㘀㄀䔀㤀㔀㘀㌀㈀㜀㔀䈀㄀䈀䄀㔀㠀䘀䐀㘀㤀㈀㠀㐀䔀　䘀㈀䘀䈀　　䄀䄀䌀㘀㈀㤀䄀㠀㐀䐀㌀䌀㌀䄀㜀㈀㄀　䔀㜀㌀㌀㘀㐀䔀　䘀㤀䘀㠀䘀䐀㔀㠀䌀䈀䈀䔀䌀　㜀䔀䌀㐀㜀㘀㤀䈀㔀㌀䈀䌀㤀㔀䐀㐀　㄀䈀㜀㄀㤀㈀䘀㠀䘀㘀䔀㠀㈀㤀㈀㘀㌀㠀㐀䘀䘀䌀㄀䐀䘀䘀㘀㔀㜀䘀㄀䈀䘀䐀䐀㌀䘀䘀　㜀㐀䔀䘀㔀㜀䘀㤀䐀㈀䐀䈀　䘀㜀㘀　㠀㄀䔀䐀㈀㈀㐀䐀䌀䈀䄀㐀㄀㐀䈀㔀㔀㌀㈀䄀㤀㌀䘀㈀㘀㠀　㈀㐀䐀䄀㌀㔀㤀㜀㐀㈀㌀䐀䐀㐀㈀㐀䈀䄀㤀㤀㐀㄀䔀䄀　䈀㔀䘀㐀㌀㐀䈀䐀㐀㠀䄀䘀䐀　㌀䈀䈀㐀㤀䈀㌀䔀䄀㜀　㌀㜀㐀㔀㠀㤀㌀㔀䘀　䘀䄀䈀䄀㐀㜀㤀㤀䄀䘀䌀㠀㘀䔀㔀㠀㔀㔀䄀㘀䈀䄀䐀㤀㌀䐀㘀㐀㌀䔀䈀䄀䐀㐀㤀㠀㤀䐀　䐀䈀㔀䘀䌀䔀㈀䐀䔀䈀䔀䐀㠀䐀䔀㄀㜀䈀㤀　䔀䘀䌀䌀　㜀㈀䄀㘀㔀䈀㤀㐀䄀㄀㤀㄀㌀䘀㜀㔀㐀䘀㘀䈀㜀㜀䌀㜀㔀䌀䘀㔀㔀䘀㜀㔀㤀䔀䄀䈀䔀㐀　䐀䐀㘀㜀䘀㠀㤀㈀䄀䄀㜀䐀䘀䌀䈀䈀䘀㠀㔀㜀㄀䘀㈀䔀䘀䈀㈀䔀㜀䔀䈀䘀　䘀䌀䄀㠀䔀䄀㘀㈀䌀㔀㜀㈀㤀㘀㌀䔀㈀㤀䔀䌀䄀䘀䔀㤀㘀䄀䘀䔀䔀䈀㤀䔀䄀㌀䔀㐀䈀䐀䐀㄀㜀䄀㠀䘀䈀　䌀䈀䔀䔀䈀㜀䔀㔀䘀䐀㐀䐀㐀䐀㜀䌀䈀㔀㘀䘀㜀㐀㔀䔀䄀㄀䔀㘀䐀㐀㜀䐀䘀㔀㠀㌀䈀䘀䄀　㈀㜀䈀䐀䐀㐀䘀䌀㌀䄀䘀㌀㐀㤀㔀㌀䘀㐀䐀䔀㔀㐀䘀㔀㌀䘀㤀䐀㌀㘀㈀䘀㤀䐀㌀䄀㈀䘀㤀㜀㤀䌀䔀㈀㐀㐀䘀㠀䈀㈀㜀㤀䌀㤀䄀㄀㤀䌀㘀䄀㤀㤀㤀㔀㔀䘀䘀䐀䘀㤀䔀䘀䄀㈀䘀䈀㈀䄀㜀䄀㈀䘀㈀㈀䔀㄀䈀㄀㈀㌀㔀㄀䈀㄀㈀㌀㔀㄀䈀㐀䘀㌀㌀　㄀㜀㌀　㄀䄀㔀㄀䌀䌀㤀㔀㘀㤀㘀㐀䌀㌀㘀㈀䌀㤀㤀㘀䌀㐀㠀㠀䈀㘀䌀㔀㠀㌀㈀䐀㤀䈀　㘀㐀䈀㈀㘀㄀䌀㤀㘀㐀㈀䈀㐀䈀㈀㘀㄀䈀㌀㈀㌀㌀㔀䈀㔀㤀㌀㈀䐀㤀㐀䄀㤀㈀㘀㜀䌀㌀㤀㈀䌀㤀㠀㘀㜀㐀䌀䔀㠀㘀㈀㔀㤀㌀䄀䐀㈀䌀㤀㤀㄀䌀　㔀㜀㌀　　㈀㔀㄀㘀䐀㄀䄀㜀㤀㤀㠀　䈀㤀㠀　㄀㈀㠀䈀㄀䌀㠀㔀㐀㔀　䔀䈀　䌀㠀　㄀㄀㘀㌀㤀䌀　㈀㈀　㜀㔀㠀䔀㐀　　㠀䈀㄀䌀㠀㔀㐀㔀䈀㐀䘀㘀㄀䌀䄀䘀䔀䌀㄀䔀䌀㔀㈀㈀　㜀㔀㠀䔀㐀　　㠀䈀㄀䌀㘀　㤀㄀䄀㌀䈀　䌀㠀㠀㔀㐀㔀㤀㐀㠀䈀㈀㜀㈀㤀㄀㔀㜀㌀㤀㔀㌀㘀䌀㠀㠀㔀䔀䔀䌀䐀㐀㔀㘀䐀䈀㤀䈀　㠀㠀㜀㈀㔀㄀㔀㈀㈀䔀䌀䄀䌀䐀㔀㔀㤀䄀㈀㄀　䘀㘀䘀䔀㜀䔀㄀㐀㤀䈀䔀㤀䐀䄀㜀䐀䔀䌀䔀䌀㌀䐀䈀㜀㤀㜀㠀㌀䈀　䘀㘀䘀䔀㜀䔀㄀䔀䐀㌀䌀䈀䌀㤀䐀䄀㜀䐀䔀㄀䔀　㌀㠀䈀㘀㤀　䌀㤀䔀䈀㈀　㄀䄀㔀䌀㔀㌀㐀㐀㘀䐀㤀㔀㌀㘀㌀䘀㄀䐀㜀䈀㄀㜀㠀䌀䄀　㘀㤀㐀㜀䘀㄀䐀䄀䈀䔀䌀䄀㤀㜀㄀㤀䌀㌀㈀　䔀㔀㘀䌀㈀㌀㠀㔀㠀㌀㐀䔀㌀㔀　䐀㜀㌀㠀㔀㠀㌀㐀䔀㌀㔀　㜀䄀㌀䔀㌀㐀㐀䈀㌀䔀㌀㐀㐀䈀㌀䔀㤀䔀䔀㘀　㄀㄀㘀　㈀㐀䔀　㈀㔀䌀　㘀㔀㠀　㈀㈀㠀㌀㔀㐀䈀䈀䔀䐀㈀㈀䌀䘀㤀㐀䄀䈀㌀䔀㐀㈀䈀䌀䐀㤀㈀䄀䘀㌀㐀㐀䈀䈀䔀䈀㈀㘀㠀㘀㐀䈀䐀㔀㜀㜀㤀㔀㄀㌀㠀　㔀㜀　㌀㤀㘀　㄀㄀䄀　䄀䌀䈀䐀　　䈀㔀㄀㜀䄀　䘀㘀　㈀㌀䌀䌀䐀　㌀㈀䌀　㐀㤀䌀　㐀䈀㠀　䌀䈀　　㐀㔀　䐀㘀㔀䔀䄀　㘀䄀㈀䘀㔀　䈀㔀㄀㜀䄀㠀䐀䄀　䈀㔀㐀䔀䐀　㔀䄀䄀㜀㘀㔀㤀䌀㘀㈀㐀㔀㠀㈀㌀㤀㌀㠀　䌀㌀㈀㐀㔀　䈀䈀㄀　㌀㠀㄀㐀䌀㈀㐀䔀㈀䄀㠀㐀㌀䐀㈀㔀䈀㄀㤀㤀㠀䌀㜀䌀㤀㌀㤀㄀㘀䘀㌀㈀䘀㈀㄀㔀䌀㄀㌀䄀㈀㠀㐀㈀䈀䔀㈀㈀䐀㠀㔀㌀䔀㌀㘀㄀㄀㄀㠀䐀㔀㜀㄀㘀䐀㄀㜀㠀䄀㐀䌀䌀㔀㐀㈀㤀䔀䈀䘀　㘀䈀㠀䌀䘀䄀䈀㔀　㠀䘀㜀䄀㠀㐀㔀㌀㐀㔀䔀㔀㤀㐀㐀㄀㌀䘀　䘀㘀　㐀䘀㔀䘀㘀　㐀䄀㐀䌀䌀㔀㐀㈀㤀䔀䈀䘀　㘀䈀㠀䌀䘀䄀㜀㔀㈀㜀䔀䔀䐀㄀䈀㜀㈀㜀䄀㠀䈀㜀㈀㜀䌀㈀䐀㈀㤀㤀　㠀㐀䈀㘀㜀㈀㈀㈀䌀㤀䐀㠀㤀㄀㠀㄀㄀㄀㌀㌀㄀㈀㈀㈀㘀䔀㈀㘀㤀㄀㄀䔀　䈀㐀䐀㠀䔀䘀䔀㤀㠀　㐀䈀　㄀㤀㜀　㌀䌀䔀　㜀䈀䌀　㤀㔀　㔀䄀㌀䄀㄀㌀㤀㔀㌀䐀㌀㔀㔀㄀䘀㄀㜀䘀㌀㄀㘀䄀㈀㤀㐀㘀㈀䐀䌀㔀䄀㠀䄀㔀㄀㠀䈀㔀㄀㐀䄀㌀㤀㘀㘀㈀㌀䌀䐀䐀　㤀㌀㠀㈀䐀䘀㘀㜀䈀㌀䄀䔀　㐀䄀䌀　㔀㔀㠀　䘀㌀　㄀㘀䘀　㈀㤀㐀䈀㔀㄀㐀㈀䈀㜀䈀䄀䄀㔀㠀䐀㤀㔀㌀㈀㜀㠀䘀䄀　䔀㔀㘀㜀㄀㠀㌀㔀㔀㌀䌀　㄀䈀㔀㌀䌀　㄀䈀㔀㌀䘀　㌀㐀　䘀䈀　㄀　㜀　㄀㈀䔀　㌀㈀䌀　㄀㈀㐀　䌀㤀㄀䈀㔀㌀㄀㐀㘀䘀㐀䌀㔀㄀䈀䌀㌀㄀㐀㔀䘀㄀䌀㘀㄀㐀䌀㔀㄀䈀㔀㌀㤀㐀㌀䐀㌀㔀㄀㔀㘀㔀㐀䘀㐀㔀䐀㤀㔀㌀䘀㄀㌀㐀　䘀䈀　㄀　㌀　㤀䄀㘀㌀㄀㤀㘀　　㤀䄀　㈀䌀㜀䈀䄀䄀㈀䄀㜀䈀䄀䄀㈀䄀㜀䈀䄀䄀㈀䄀㜀䈀䄀䄀㈀䄀㜀䈀䄀䄀䈀㈀䄀㜀䈀㈀㤀㔀䔀㔀㤀㐀䄀䐀㈀䌀䄀㜀㘀䌀䐀㠀㔀㌀㌀㤀㈀䄀㌀㔀㐀㜀䄀㔀䔀㘀䌀　㤀䔀䌀䄀㠀㔀㔀䌀㤀　䄀㌀㔀䈀㠀䔀㘀㄀䌀㤀㔀㔀㤀㈀㌀㜀䈀㠀㐀㜀㤀㐀㌀䐀㔀㔀䘀䌀㔀䘀㘀㤀㐀䘀㤀㔀㈀䄀㜀䈀䄀䄀㌀㐀㘀㘀㐀䘀㤀㔀㈀䄀㜀䈀䄀䄀㌀㐀㘀㘀㐀䘀㤀㔀䌀㘀䔀䌀䄀㤀㔀㈀㘀㔀㐀䘀㤀㔀㈀䄀㜀䈀䄀䄀㔀㐀䐀㤀㔀㌀䄀㔀䌀䄀㤀䔀㈀䄀㔀㔀䘀㘀㔀㐀㈀㤀㐀㤀㜀䈀㘀䄀㤀㔀䈀㈀䄀㜀㔀㘀䌀㔀䔀䌀䄀㤀㔀㔀䌀䄀㤀䔀㔀䄀㄀㔀䈀㌀䄀㜀㔀㘀䌀㔀䔀䌀䄀㤀㔀㔀䌀䄀㤀䔀㔀䄀䄀㔀䔀䌀䄀㤀㔀㔀䌀䄀㤀䔀㔀䄀䄀㔀䔀䌀䄀㤀㔀㔀䌀䄀㤀䔀㤀㈀㤀䌀䐀䐀㄀㜀㌀㔀㐀㤀㜀䈀䄀䄀㔀㐀䐀㤀㔀㌀䄀㔀䌀䄀㤀䔀㈀䄀㠀䐀䐀㤀㔀㌀䄀㔀䌀䄀㤀䔀㤀㈀䈀㠀䄀㐀䔀㄀㔀㜀㤀䄀䌀䄀㤀䘀䄀㘀䘀㈀䄀㜀䄀㤀䘀䌀㘀㤀䈀㄀䘀䌀㘀㤀䐀㄀䘀䌀䄀㜀䈀㔀䄀㜀㠀䔀㐀㜀䈀㜀䌀㤀㌀䐀䘀㘀㄀䈀䔀㄀㐀㜀䄀䈀䘀㠀㈀䘀䄀㈀䐀䈀㐀䔀㠀䌀㠀䘀䘀䈀㘀䐀㐀㐀䔀㤀䌀㤀㘀䘀㄀㠀䐀㘀䘀㄀䄀䘀䘀㘀䄀䘀䘀㄀䄀㜀䘀㤀㜀䘀䘀　䄀㜀䘀䈀䐀㜀䘀䄀㌀㌀䘀䌀㌀䘀䘀䄀㌀㌀䘀䐀㌀䘀䘀㤀䈀㌀䘀䌀䐀㤀䘀䔀㄀䌀䈀䘀䌀㐀㤀䘀䔀䈀㔀䘀䔀㜀㔀䘀䔀䘀䐀䘀䔀　䐀䘀䔀㠀䌀䘀䘀㌀䔀㜀䘀䈀㌀㜀䘀㤀　䈀䘀䌀㤀䈀䘀䐀㠀㔀䘀䔀㈀㈀䘀䘀㄀㘀䘀䘀㔀㘀㜀䘀䈀㄀㜀䘀㤀䈀㜀䘀䈀䈀㜀䘀㠀㜀䈀䘀䌀㐀䐀䘀䔀㠀㌀䘀䔀㘀䐀䘀㠀㤀䐀㈀䈀㜀㜀䄀㔀䘀㜀㄀䔀㤀㜀㔀䘀䐀䈀䄀㔀㐀㔀䈀䌀㔀㔀㘀㔀㔀㔀㜀㌀㄀㌀　䐀㄀㔀䘀㤀㔀㤀㐀䐀㜀䈀㄀㤀㈀㠀䌀㠀㈀䔀㄀㤀䄀䔀䘀䄀㐀䔀㠀　㤀㠀㈀㜀㄀㤀㄀䘀㐀㠀㠀㌀䘀㜀䘀㐀䌀㘀㈀䄀㠀㈀㔀䘀㤀㠀㜀㤀㈀㔀䐀㐀䐀䌀　　䘀㔀㤀㌀㜀䘀䔀　䈀㠀䌀㔀䄀㌀㐀㤀䄀㔀䄀䔀䔀㐀䌀㘀䄀㄀䄀㐀䈀㌀㤀㜀䐀㐀㐀䈀䔀䐀䌀　㌀㜀䄀䄀䈀㜀䘀　㜀㘀㈀㔀㐀䌀䔀䘀　䔀䐀㄀㐀䔀䔀䈀㔀㄀　䘀㔀䘀㔀䌀䄀㜀㤀㈀㤀㌀㐀䐀　㘀䈀䔀　䈀㔀䄀㜀䘀㄀㔀䔀　㜀㈀䔀㘀㄀㌀㘀㌀　㔀㤀　㤀㔀䄀㄀䐀㤀㈀㤀㠀㘀　㄀㜀㐀㜀㄀㤀㈀㘀㤀㜀䄀㠀㜀䄀㈀㌀㌀㄀㐀䌀㤀䄀䌀㐀㔀㈀䌀䔀㠀㐀　㤀䈀㜀䘀㠀㔀㜀䌀㜀䄀㌀㠀䌀㈀㈀䔀㘀㈀㤀㄀㐀㌀㄀䘀䘀㄀㜀㠀䄀㔀䌀䔀㌀㔀䘀䘀䈀䄀䈀㘀㌀㔀㈀㄀㘀䘀䈀㘀　䌀㔀㌀　䔀㤀㄀㤀㐀䈀㌀㤀䐀㌀㘀䔀　㤀㠀㌀㌀㤀㘀䔀　㘀㜀㌀䌀䌀㐀䌀㜀䘀㈀㘀㔀㌀㘀㜀䄀䔀㌀䘀㤀㜀㜀㄀䈀䈀䐀䔀䈀䘀㤀䔀䌀㜀䐀䘀㠀䐀䘀䔀䌀䐀䘀　䐀㤀䘀䘀䈀䄀㌀㠀　䔀㔀㐀㄀㠀䐀㤀㌀㄀㄀䌀䈀䈀䌀㘀㔀㈀䌀䔀䈀㠀䄀㌀㠀㌀㐀㜀䌀㜀㜀㐀䌀㘀㜀㄀㠀䔀㌀䘀㠀㜀䘀㄀㔀䄀䔀㠀㈀䘀䔀㐀㤀㐀㈀㔀䌀䌀䈀㤀䌀㘀䄀䘀㠀䔀㔀䐀㤀䔀䌀㈀䌀㔀㠀㤀㘀㄀䐀㜀㌀䘀㤀㘀㜀㈀㈀㘀䔀䌀㄀㈀㜀㠀䌀㐀䘀䔀㤀㄀䈀㄀䘀䈀㤀㌀㌀䘀㤀䈀㈀㤀㔀㠀䔀㈀㤀㜀㌀　㜀㘀䐀㜀䘀㤀䐀㜀㌀㄀㘀㔀㘀䘀䘀　㘀䘀䄀　㤀　㄀䌀䄀䈀㤀䌀㘀㜀䈀㄀㜀䘀㌀䈀㜀㘀䐀㔀䘀䘀㄀䄀䘀㠀㤀䔀㌀䈀䄀㤀䔀㄀䘀䔀㐀㈀䄀㤀䔀㄀㤀䐀㌀㈀㐀㘀䈀䌀㜀㌀㈀㐀㌀㔀䘀䌀㔀㌀䄀㐀㠀㘀㜀䘀㐀䔀䄀㐀㐀㘀䘀㈀㈀㤀㄀㐀㐀㤀㌀䔀㐀㜀㔀㈀䄀㌀䌀䄀㈀㤀㔀㈀䄀㌀䌀䄀㘀䘀㐀䔀㘀䄀㔀㐀㌀䐀㐀㔀㘀䄀㔀㐀䘀䐀　䐀㐀㤀㠀䐀㘀䄀䄀㜀㐀㠀㠀䐀㘀䄀䈀䘀㈀㄀䄀㤀㜀㄀䘀㈀䈀䄀㘀㌀㜀㔀䐀㠀㐀䈀䔀䘀㜀䄀䔀䘀㌀㈀㘀䔀㐀㜀䈀䐀䄀㌀䐀㈀㌀䈀　䈀㄀䘀䔀䄀㄀㐀䈀㘀䘀䌀㠀㌀㠀㠀㤀㔀㤀䐀䌀䐀㔀㘀䈀䔀㄀䌀䘀䘀㐀㄀䔀䌀䄀㔀㘀䌀㄀㤀㄀䈀㌀䘀䐀㄀䈀㐀䈀㈀䔀䘀㐀䐀㐀㜀㐀䈀㤀㌀䘀䈀㌀䐀㌀㐀㔀㌀㤀䔀㤀䌀䄀　䐀㤀㔀䘀䐀　䘀㄀㔀㌀㠀䐀䔀㐀㠀㤀㔀㄀䔀㔀䌀䘀㠀㠀䈀䐀㄀䔀䌀㌀㜀䔀　　䈀　㈀䘀　㈀䘀㘀䈀㌀㐀　䄀㔀㜀䈀㐀䔀㔀㤀　䐀㤀㜀䈀䈀䈀䈀㐀㈀㌀㠀㤀䘀㤀㈀䔀䌀䘀䔀䘀㈀㈀䈀㠀㜀䐀䔀㄀㌀䐀䔀㄀㌀䐀䌀㠀㘀䄀㜀䈀䌀䄀㜀䌀㠀䘀　㤀䔀䘀㄀㤀䔀䄀㄀㤀　䘀㜀䄀䌀䘀㜀㈀䌀㈀㔀㔀　䘀㐀䈀䈀㘀㤀㘀㜀㠀䈀㜀䈀㈀䐀㘀　㌀䄀㄀㔀㘀䘀㄀䐀䄀　䐀㠀㔀㤀㐀䌀㘀㘀㄀䐀㌀䄀䈀䈀䔀䘀䈀䐀㈀㔀䄀㠀䐀㌀㤀䔀㔀䄀㔀㈀　䘀㤀㘀䌀䌀䘀㈀㜀㐀䈀䌀䌀㄀䄀䄀䄀㘀　㐀㔀㔀㐀䘀㔀㔀㤀䌀㐀㄀㔀㔀䐀㘀　䔀㜀䌀㔀㤀㌀䄀䘀㈀㄀䔀㘀䄀㈀䄀㤀　㄀　㈀䐀䐀㔀䔀䌀㐀㄀㄀㐀㌀䈀　㄀䌀䄀䐀䄀䘀　㠀䈀䔀㠀䌀㘀䔀㘀㌀㈀㘀㔀䐀㄀㔀㠀㈀䄀䄀㈀䌀㤀㌀䌀㈀㌀㤀㤀㐀䌀㌀㌀䐀㔀䘀㤀㔀㐀㐀䈀䔀㠀䔀䔀䈀㠀㔀䘀䘀㜀㤀㈀䔀䌀䄀㌀㐀㜀㄀㐀䄀䔀㈀㘀㌀　䔀䌀㐀㐀䐀䐀䔀㠀㜀㈀䘀䔀䐀䘀㤀㜀䌀㜀㔀䌀　㘀㠀䐀㘀㈀䐀䔀㈀䔀㠀㠀䘀䈀㔀㔀㔀䌀䘀㘀　䐀㌀㘀䄀䐀䈀㘀䌀㐀䐀㈀䌀㄀㌀㜀䘀㤀䌀䌀㜀㄀䌀　䘀㠀㠀䘀㜀㄀㈀䐀㄀㤀㐀䌀䐀㄀㔀㌀䄀䌀㘀㈀䔀䐀㌀㄀䘀㄀㠀㔀䘀㜀䌀㠀䘀䈀䌀㜀䄀㤀㘀䈀䌀㤀㘀䘀䈀㐀䔀㤀㠀㠀䈀䄀䘀䄀㘀㔀㈀䐀㄀㔀㌀㄀䔀䌀㌀㈀㠀　㘀䐀㌀㄀䈀㜀㌀㠀　㌀㘀䐀㈀䌀䔀　㔀㘀㘀䄀䔀䄀㔀㐀㈀䔀㤀㤀䄀䘀㠀䌀㄀㌀㔀䄀㜀㈀㔀䘀䌀㤀㤀䔀䔀䄀䌀䘀㐀䘀㐀㌀㜀㤀䐀䔀䐀㘀㠀㌀㜀㈀㔀㐀䄀䈀㜀　㠀㘀㤀㘀㔀㤀㈀㈀䄀㄀䈀㜀䘀䈀䔀㐀䘀㘀㤀㠀㘀䈀㠀　㜀㜀㘀䔀　䌀䔀䘀㘀㠀㌀䘀㐀㤀䘀㠀㈀㈀䘀䔀㤀䔀䄀㤀䔀㠀䘀　㘀䈀䘀㔀㔀䌀㄀㄀䈀㜀㐀㐀䈀㘀㘀㌀　㄀㌀䘀㈀䐀䔀㘀㄀㤀䔀㔀㌀䐀䔀䄀䔀㤀㌀䔀㐀䔀㜀䐀㠀㐀䔀䈀㔀䄀㜀䘀㐀䄀䌀䘀㜀㔀䔀㈀䈀䔀㤀㌀䐀㐀㄀㠀䌀䔀㐀䘀䐀㄀㔀㈀䄀㈀㐀䘀㤀㌀㌀㤀㜀㔀㤀䄀㘀䄀䔀㌀㜀㤀䈀䘀䄀㐀㠀䐀䘀㠀㄀䄀㘀㄀㔀㤀㤀䘀䘀䔀㌀䄀䔀䐀㠀䐀䐀䄀㄀䄀㜀㔀㐀䔀䈀㄀㌀㔀䔀䄀　㈀㈀䈀䐀㐀㘀㄀㠀䘀䔀㐀㌀䄀㌀䌀㈀䄀㘀䘀㄀㜀䐀䄀㐀㔀䘀㘀㜀㠀㜀䈀㠀㈀㌀䐀䐀㄀㈀䔀䈀㘀㈀㜀䐀㤀㤀㌀䔀䐀䐀䘀㐀䈀䘀㤀㠀䄀䔀䘀䄀䌀㤀㈀䘀㔀㐀㜀㘀䈀㄀㘀　㔀䔀䐀㜀㘀㜀㘀㌀䈀䔀䌀㔀䈀㤀㔀㘀㔀㐀㠀䄀䈀䈀㜀㘀䄀㜀㐀㈀䘀䈀䘀㔀㘀㠀䘀䔀㈀䈀䔀䐀㘀䔀㐀㐀㔀　　㈀䘀㈀㈀㤀䌀䔀䌀㠀㘀㘀䘀㌀䔀䌀䄀㈀䘀㤀㘀䌀䈀㈀䘀㐀　㐀㘀㐀䘀　䐀㤀㘀㔀䘀㘀㄀㔀䌀䄀䔀䘀　䄀㠀㠀䘀䘀䐀㈀㘀䄀㌀䘀㠀㤀㈀㈀㜀　㜀㔀䘀㄀䘀㤀㜀㄀䄀㘀㐀㄀䔀㤀㈀㤀㜀㄀䌀䌀㌀䌀㔀㜀㄀䔀㤀　㘀䘀㌀㔀㔀䘀㐀㠀䄀㌀䈀㠀䘀　䔀㜀䘀　㤀㌀㄀㌀䔀㘀㔀㔀㜀㠀㜀㌀㠀㈀䐀㔀㘀㤀䘀䌀䔀䔀㘀㤀䈀䔀䄀㔀䄀䔀㔀㔀㈀䌀　㤀㔀䄀䄀㜀䐀㤀㌀䘀㤀䄀䐀㘀㤀䘀㈀䐀䈀㌀䄀䘀䌀䄀㌀䔀䌀㘀䌀　䈀㜀㤀䔀䔀㜀㄀㄀䔀㔀䘀䐀㜀㤀䘀㤀　䐀䄀㠀䈀㜀㄀䔀䐀㠀㜀䄀䈀䘀㠀㠀㐀䘀㐀㤀㘀㠀䌀㘀䈀㜀䈀㜀㔀㘀㔀㤀䌀䘀　㤀㜀䄀䄀㠀䌀㘀䈀㐀䄀䔀䌀䔀䄀䄀䄀䘀䔀㄀㘀䌀㔀䔀㄀䄀䌀㜀　䘀㔀䔀㐀䌀㤀㜀㠀䘀㈀　䈀㄀㤀䔀䐀䐀㔀㘀㠀䔀䈀䌀㜀㔀㈀㜀㄀㜀㠀㤀䌀㔀㐀㠀䄀㤀㜀㐀㤀䘀㜀䐀㈀㐀㌀䈀㐀㤀㘀㄀䔀䄀㜀㐀䐀䘀㐀㈀㈀㘀䐀䄀㔀㔀㜀㜀㄀䌀㘀㘀䄀䌀　䈀䘀㠀䘀䘀㐀㐀㠀㄀㘀㘀　　䔀㘀　㈀䔀㘀　　㄀㘀　㄀㄀䔀　㜀㠀䌀　㔀䐀䘀䔀㐀㌀䄀㐀㤀䈀㠀䔀䘀䘀　　䌀㌀㌀䄀䘀䔀㠀㌀　䌀㤀䈀䔀㌀䘀㤀㔀㈀䌀　㈀㜀　　㔀䘀䘀㜀䔀䘀㘀㜀㜀㠀㐀㠀㐀㈀㈀䈀㔀㌀䈀䔀㘀㔀䄀㄀㌀㐀㘀䈀䈀㘀㜀䌀䐀㜀䐀䄀㈀　䘀㌀㔀㠀㈀䘀㐀䄀㘀㠀䘀㜀㤀㘀䔀㤀㜀㘀㄀䘀䌀　㜀㐀䘀㤀㔀㜀㌀䈀㐀䘀㌀䔀㌀䈀㐀㤀㠀　䄀䘀㐀䄀䔀㠀䐀㘀㤀㌀㌀㤀䌀㤀　㌀㘀㜀㔀　㈀㐀㈀䈀㤀㈀㈀㔀䄀㔀㔀䐀㈀㐀㔀㜀㘀㈀㄀㜀㈀㤀䄀　䄀　䘀䌀㜀㈀㌀䈀㠀䘀㠀㌀㔀䐀㤀㄀㔀䐀㤀㐀㘀　㌀䄀䄀㘀㐀㌀䔀㔀䌀䌀㌀䄀䄀䌀㐀䐀䔀㐀㄀䔀㠀䘀䔀㘀㤀㐀㘀㠀㔀䔀䌀䄀䐀㈀㌀　㠀䌀䘀䐀㠀䌀㐀㤀㌀㠀㘀㄀䄀䔀　㈀㐀䔀䈀䘀㄀　䐀㠀䈀䐀㔀㠀㄀㄀䈀䈀㄀㜀㈀䈀㔀㤀䈀㌀䄀䐀䐀㤀㔀㐀㄀㤀㔀䘀㈀䘀㠀㠀㔀㠀㈀䘀䘀㈀䐀㠀㌀㌀䔀䐀䐀䔀㜀㘀㄀䘀䈀㈀㜀　㈀䔀䈀㌀㘀㌀䔀㜀䐀㤀㜀㤀䔀㐀䔀㈀䔀㐀㐀㠀　䘀㔀䘀䔀㄀䘀　䈀㄀㤀㌀㌀㄀㄀㤀㌀䄀㈀䔀㠀㐀䔀䘀䘀㤀䌀䄀㘀䘀䘀䌀㔀䔀䌀㠀㔀㈀㈀㄀㄀　䐀㤀䔀䘀㌀䘀䔀㐀㌀䘀䌀䌀䘀㜀㠀㌀䐀㄀䈀䈀㤀㤀䄀㤀䔀䔀䔀㌀䄀㈀㜀㜀㌀䘀㠀㌀䔀䘀㠀䘀㐀㠀㠀䘀㈀䌀䐀䘀㄀䘀㐀㔀䈀䌀㤀㤀㠀䌀㜀㤀䄀㜀䌀㠀䌀㄀䌀㠀㐀㄀㜀䌀㈀䈀㈀䈀㄀㌀㈀㜀䔀㐀㠀䔀㐀㌀䌀䔀　䌀䈀㘀㔀㈀䌀㘀䘀䈀䔀㌀㜀㄀䔀䔀㘀　㄀䐀㠀䌀㄀䔀㜀㤀䘀㘀㘀　䐀　㔀䘀䌀㌀䔀㔀㌀㜀䌀㔀㜀㤀㠀䄀㐀㄀㜀䘀㌀㔀䈀㜀䐀䘀䘀㄀㜀䄀䔀㌀㔀㐀㐀㈀䐀䐀㄀䔀㘀　　䘀㔀㌀㔀䄀㔀䌀㤀䔀㤀䌀㄀䐀䄀䌀䘀　㌀㈀䔀㤀㜀䄀㔀㠀䘀㈀㠀㜀㈀䔀㌀䐀㄀　㔀䈀㘀㠀㠀㐀䈀㘀㔀䘀䘀䈀㔀㘀䘀䈀㐀㄀䄀䐀㠀㐀㔀㔀䐀㘀㄀䐀䈀䐀㠀䄀㔀䔀㔀䈀㘀䘀㄀　䈀㠀䌀䌀㄀㠀㘀㤀㠀䌀㌀㘀䈀㈀㠀䐀㔀䌀㘀㌀䈀䌀㌀㄀䐀㄀㤀㠀㈀㐀㘀䄀㠀㤀䐀䄀䔀㈀㌀䌀㔀㄀㐀䘀㌀㐀㄀　䔀㜀㠀䈀䌀㘀䔀㈀　㈀䐀㄀㐀䌀䈀㐀㄀　㈀䐀㐀㔀㘀䈀䐀㄀㔀㘀䈀㐀㄀㜀㄀䐀㐀㐀㈀㜀㜀㄀㠀㤀䔀㠀㈀䄀㜀䄀㠀㠀　䌀㌀㄀㐀䄀㘀㐀㠀㤀㄀䌀㌀㄀㐀䔀㔀䌀㈀㔀　䄀䌀㔀㐀㐀㌀㄀㐀㤀䘀䌀㔀䔀䘀䌀㐀㄀㔀䌀㈀䈀䘀䔀㈀㐀䔀㘀㠀㠀䈀㤀䔀㈀　㘀㌀㄀㐀䘀㈀䌀㄀　　䈀䌀㔀㈀䐀㘀㈀䈀㄀䈀㠀㔀䐀㈀䌀㄀㄀㐀䈀䌀㔀㜀㈀㜀㄀䈀㜀䈀㠀㐀㜀㤀㐀㠀䄀㜀䈀䌀㔀㜀䐀䔀㈀　㄀䘀㄀㤀　㜀㠀㔀㐀䄀䌀㄀㄀䔀䈀䌀㐀　㘀䘀㄀㤀㠀㜀㠀㐀㈀㌀䌀㈀䐀㤀䔀㄀㔀䌀䘀㠀䈀㄀㜀䌀㐀㔀䘀䌀㐀㔀䘀䌀㔀䐀䘀䌀㐀䌀䈀䔀㈀䔀䘀䔀㈀㄀䘀䔀㈀㌀㔀䘀㄀䈀䄀㜀㠀㔀㌀䈀䌀㈀䐀䘀䔀㈀㤀䐀䔀㄀㌀㔀䘀㠀䄀㜀䐀䔀㈀㠀　䘀㠀㔀䄀㜀䌀㈀䈀㜀㜀㄀䄀㘀㠀䘀䈀䈀㐀㜀䐀㌀䌀㐀㈀䈀䔀䐀㄀䈀䔀㈀㄀㐀䐀㌀䈀䄀䌀䘀㄀㄀䌀㐀䐀㌀䈀䄀㘀㄀䐀䄀㌀㠀　㘀䔀䔀㠀　㘀　㔀䘀㔀㌀　䈀㜀䐀㤀䐀　㈀䈀㜀㄀㤀䈀㐀㌀䈀䄀䄀䐀䐀䈀㤀㐀䄀　㈀㜀䔀䈀䌀㤀㔀㐀㐀䔀㐀䘀䐀㄀㔀㌀䄀㠀䈀䌀㔀䔀㔀䘀䄀䘀㐀䘀㠀㤀㠀㄀䌀䈀　㈀㤀㜀㔀㄀䐀㠀䌀㠀㌀㐀㌀㈀㈀㤀䌀㤀㄀㠀㘀㔀㠀䌀䄀㈀　䄀㐀㘀㤀㘀㤀㄀㐀㔀䌀㈀䌀㠀㌀㄀㜀㈀䄀㠀䄀㈀㔀㄀㘀㐀㄀㐀㔀㄀㈀㔀㘀㌀㠀㈀㌀㄀㠀㄀㈀䄀㄀䈀䌀㔀㐀㘀㌀㄀㐀㔀㐀㐀㐀䐀㔀㄀㤀㌀㐀䌀㤀㄀㈀㈀㔀㈀䌀㠀㄀㈀㜀㔀㐀㐀㄀䐀䈀㈀㐀㔀㔀䐀㔀㄀㤀㜀㄀䌀㔀㄀㔀䘀䐀㐀㈀㜀㔀㜀㌀㐀㄀㐀　䐀䌀㤀㄀㌀㠀䐀㐀㐀㈀㌀䘀㈀㐀㔀㄀㌀䐀㄀㠀㐀㤀㈀㐀㔀㔀㌀䐀㄀㤀㐀䄀䄀㠀㠀䔀㘀䄀㈀㌀㤀㔀㔀㄀㔀㄀㜀㠀㤀㠀䈀䄀㠀㤀䄀㘀㠀㈀㔀㔀䄀㔀㄀㜀㔀䐀㄀㐀㘀䈀㐀䄀㄀㄀䄀䄀㈀㤀䐀㘀㠀㐀㜀㌀㔀䌀㔀䌀㔀䔀㈀㘀㈀䄀䄀㈀㔀㌀䄀㠀䄀㠀䔀㤀㐀㈀㈀㌀䄀㠀䈀䌀䔀㔀㐀㔀䈀㜀㐀㄀㄀㔀䐀䄀㠀㠀䔀䔀㠀㈀䔀䈀䄀䐀㌀㜀㤀㘀㈀㤀㠀㄀㠀㐀㘀㜀㔀䌀㔀㐀㠀㌀㄀㤀㈀䔀䄀㠀㤀䐀㄀㘀㈀㌀㐀䐀㔀㄀㜀䐀㤀㈀㈀㤀䈀㄀䄀㠀㠀䈀㄀㘀㈀㈀䌀㌀㔀㄀㐀䘀㤀㈀㈀㤀䘀䌀䔀㄀㜀　㔀䄀㈀㠀　㄀䄀㠀㤀　㤀㘀㈀　㈀㌀㔀㄀㘀䌀㔀䄀㈀㤀㠀㤀䄀㠀㠀䌀㤀㘀㈀㌀㈀㔀䐀㈀　䄀㘀㠀㤀㘀㤀䐀㐀㔀㐀㐀䌀㄀㜀䐀㌀䄀㤀㤀㤀㤀㠀㈀㤀㘀㘀䐀㈀㠀㔀㘀㈀䈀㘀㤀㠀㐀䐀䌀䐀㐀㔀㠀㤀㈀㠀䄀㄀㄀㘀䔀㈀㜀䄀㜀㄀㌀䐀㔀䐀㈀㐀㘀䔀㄀㐀㌀㜀㔀㈀㐀䈀㜀㄀㤀㌀䈀㠀㠀㤀㔀䄀㠀㤀㤀䈀䌀㔀䌀䐀䐀㐀㔀䄀㈀䌀㄀㈀㠀䈀䄀㠀㠀䐀䈀㠀㔀㔀䐀䌀㐀䄀㘀䐀䌀㔀㘀䐀䔀㈀㌀㘀㘀䄀㈀㜀䔀䔀㄀　㜀㜀㔀　㜀䈀㜀㄀䄀㜀䈀㠀㤀㌀㈀䔀㄀㘀䌀䈀䌀㐀㌀㈀䔀䄀㈀　䔀䔀㄀㈀㜀㜀㔀㄀㐀㜀䈀㄀㐀㈀䄀䌀䄀　㐀䔀㘀㈀䄀㔀㔀㠀㐀㤀㤀䐀䌀㔀㈀䄀䈀㄀㠀䄀㈀䔀㄀㄀㜀䘀㄀㘀㜀䘀䄀㘀㈀䔀䔀㈀㜀䔀㜀㄀㌀䘀㜀㔀㄀㔀　䘀㠀䄀　㜀䔀㤀㔀㈀䘀㄀㠀㠀㜀㠀㠀㐀䈀䄀㠀㤀䐀㔀㘀㈀㌀㔀㜀㔀㄀㜀㘀䈀䌀㔀㔀䄀䔀䄀㈀㄀䐀㘀㠀䈀䘀㔀㜀㐀㤀㤀䐀㠀㈀㠀㌀㘀㔀㈀㐀䘀䘀㄀䈀㠀㜀㠀㤀䌀㜀䔀㈀㜀㤀䔀㄀㈀㐀䘀䐀㄀䔀㔀㘀㈀㤀㌀䐀㠀㐀㐀㔀㜀㠀㠀䔀㜀䌀㐀㜀㌀䐀㐀㐀䈀㘀䌀㄀㘀㤀䈀㈀㤀㔀㔀䈀䌀㈀㠀㔀䔀䄀㐀䐀䔀㘀㈀㠀䈀䐀㠀㐀㈀㜀䐀䌀㐀㐀䈀䔀㈀㈀㔀䔀䄀㈀䈀䈀㘀㠀䄀䄀䐀㤀㐀㈀㘀䈀㘀㠀㤀㘀䐀䐀㐀㐀䘀䈀䌀㈀㈀㔀䔀䄀㄀㜀㐀䘀㄀䄀䄀㜀㠀㤀㔀䘀䄀㠀䈀䔀䐀㘀㈀㌀䈀　䐀㄀　㘀䘀㠀㠀㌀㜀㘀㠀䄀　㜀㠀㐀䈀䈀䌀㐀㔀㠀㌀䌀㐀㌀䈀䔀㈀㄀䐀㄀䄀㈀䌀㜀㘀㠀䄀㤀䐀㌀㐀㐀㐀䔀䌀㄀㄀㜀䈀㘀㠀䄀㠀䐀㠀㈀䈀䘀㘀䐀㈀㌀　䈀㄀㔀䘀䔀䌀䄀㜀　䌀㜀㄀㔀　㄀䌀䄀㐀㈀䈀䌀㔀㌀㜀䔀㈀㄀䈀㤀㘀㠀䔀㌀䄀㘀䈀㌀䘀㐀㌀䌀䈀㌀㈀㐀䌀䘀㄀㐀㌀䔀㠀㘀㠀䈀㤀㠀䔀㔀㈀䐀㈀㘀䄀䌀㌀䈀㐀㘀㄀䌀䌀㔀㤀䄀㌀㌀㔀䐀㘀䈀䌀䌀㄀　䐀㐀㄀䈀㘀　䈀㐀㌀㐀㜀㐀㈀㐀㜀㈀㠀㔀　䄀䔀㐀㌀䈀㤀　䔀㤀㠀㘀㤀䈀㄀　㘀䐀㌀䘀㈀㐀㈀㌀䈀䔀㐀㘀㠀䐀㌀㜀㈀㐀㌀䘀㈀䄀䌀㔀䐀㄀䔀㘀㤀㐀㄀㌀㤀　䈀䐀㄀　㈀䘀㈀㤀䈀䌀䔀䌀㤀㤀㐀㄀㠀䈀㐀㠀㈀㜀㘀䐀　　㤀䈀䄀㐀㄀㈀䘀䔀㠀　㜀㤀㌀㠀㌀㔀㔀㠀㈀㔀㔀㠀㌀㜀㈀㘀㘀䄀㈀　㔀䄀䈀　㜀䔀䈀㘀㄀㈀㘀䌀䘀㘀㔀䔀㠀㄀㜀䔀䈀㔀㈀　㌀䔀㠀㜀䄀㌀䈀㜀䐀䄀㠀㐀䄀䘀㤀㤀䐀㌀䔀㄀㘀㈀㤀㤀㜀䔀㤀㜀㤀㔀䌀䘀㘀䐀㜀䘀㐀㤀䐀䐀䔀㔀㐀䈀䘀㐀㠀㘀䘀䌀䐀㌀㤀䈀䄀㜀　㔀䄀䄀䄀䐀䔀㐀㜀䔀䘀䄀䘀　䘀䐀㈀㠀㜀䔀䄀䄀㌀䘀㐀㌀䌀䈀䐀㈀　㜀㄀㘀　䔀㈀㌀㔀䘀䌀䘀㜀䐀㌀㔀䔀㠀㤀㌀㜀㤀䘀㜀㠀㜀㄀㈀㤀㈀㜀㔀䔀䄀䐀㐀䘀䈀䐀㄀㈀㌀㜀㤀䌀㜀㠀㜀㄀䄀䐀䄀㜀䈀䘀䈀䄀㤀䌀㜀㐀㜀㔀㘀㌀䐀䌀㐀䔀䈀䌀㔀㈀㐀䘀䈀䐀㄀㈀䘀㜀㤀䐀㜀㠀㜀㄀㔀䈀䌀䔀㜀　㠀㔀䔀㜀㤀䌀㜀㠀㜀㄀㤀䈀㐀䘀䈀䌀　㘀㤀䐀䔀䔀　䄀㌀䘀㜀㠀䔀㈀䌀㔀㔀㐀㌀䄀䘀㄀䌀䄀䌀　㜀㔀䘀䌀䘀㜀䄀㠀㤀㌀䄀䔀㘀䌀䈀䔀䘀㈀䌀䔀㜀　㄀㔀㤀䌀䔀䔀　䄀㄀䘀㌀䐀䘀㄀㐀䄀䄀䄀㜀㐀䐀㈀䔀㔀㤀䘀㜀㐀䄀㔀㤀䌀㜀㠀䄀㤀䘀㘀㐀㔀䘀㄀㐀㔀　㤀䌀䌀　㔀㐀䐀䘀㐀㘀㘀㜀䄀㌀㌀㘀㘀㤀　㤀㘀㜀䄀㐀䈀㤀㘀䐀㠀㘀䐀䘀㐀㌀㘀䌀䌀　䐀䔀䐀䘀㔀䘀㘀㈀䌀䐀㜀䈀䄀䔀䄀㔀䐀㔀㤀䄀䔀䘀㔀䐀㐀㜀䈀䈀㈀㔀䌀䔀䈀䄀䐀䘀㜀㘀㘀䈀㤀䐀㘀㔀㜀䔀䘀䌀䈀㜀㈀㘀䐀㠀　㌀䔀㠀　䔀㔀䐀䄀㘀　㜀䐀㌀　䌀䈀䈀㔀㘀㄀䘀䄀㌀　㐀䄀䐀㐀㐀㜀䔀䈀䄀㌀㈀㤀䄀䌀㠀䘀䐀㄀䌀㜀㔀　㤀㈀㔀䔀䄀㠀㄀㜀㔀㈀㠀㔀䌀㐀㐀㄀㠀㤀㠀㌀㐀㠀㈀㐀㐀䔀㐀䈀㤀䌀㐀㘀㄀㔀㄀㌀㘀㜀㈀㜀㈀䔀䄀　㐀䄀㠀㤀　䈀㄀㌀䔀䘀䄀　䄀䄀㠀㤀㈀䈀㄀㌀䐀㜀㔀㌀㤀䐀䌀㐀㠀䐀㠀㤀䌀䘀㔀　䌀䈀䌀㐀䈀䘀㈀㘀䔀䔀䄀㔀　䔀㠀㤀䘀䈀㄀㌀　䘀䐀㄀䔀㠀䘀　䐀㐀䘀　㘀䌀㄀䄀㄀㜀㈀䔀　㤀䌀䘀䄀㜀㈀㤀䔀㄀䐀䈀䌀㌀　䘀䐀　㠀䌀䘀　㐀㌀䔀㄀㜀㔀䈀㐀㈀㠀䘀䌀㐀䌀䘀㠀㘀䐀䈀䄀㌀㌀䘀䌀㘀䔀䘀㠀㔀䐀䐀䄀㄀㠀㜀䔀㈀䘀䘀䌀㄀䔀㌀䐀㄀㘀䐀䔀㄀㔀䐀䔀㐀㔀㠀䘀㠀㜀㌀䘀　㠀㜀䘀㐀　㐀䘀㠀㐀㌀䘀　䄀㜀䘀㐀㐀㐀䘀㠀㘀㌀䘀　㤀㜀䘀㐀㈀㐀䘀㠀㔀㌀䘀　䈀㜀䘀㐀㘀㐀䘀㠀㜀䈀䘀　㠀㜀䘀㐀㄀䌀䘀㠀㐀䈀䘀　䌀㜀䘀㐀㤀㤀䈀䌀㈀㜀䈀䌀㌀㜀䈀䔀㤀䐀㤀䘀　䘀䔀䘀　㜀䔀㜀䄀㈀䔀㜀䌀㌀　㜀䌀㠀㐀㤀䔀　䘀㄀䘀㐀䈀　䄀䐀㄀䈀㘀䄀㐀䌀䄀㐀㤀䘀䘀䌀㌀䐀䔀䈀䐀㠀　㐀㤀㔀㄀䐀䌀㜀䈀㄀䘀䄀䘀㤀䄀䔀㄀䈀㘀䌀䈀䈀㈀䌀䌀䘀㐀㘀䔀㔀㜀㜀㔀㠀䘀　㠀㠀㠀㠀㠀㠀㠀㔀䌀㄀㔀㤀㔀　㠀䄀㈀㐀㄀㐀㔀　㔀㐀㐀㠀㌀㠀　㜀㠀㐀㌀㘀㈀㄀㈀㈀㔀㔀㄀㔀　䄀㌀㄀㠀䄀㌀䄀　㠀㠀㄀䔀㠀㌀㠀㘀　㠀㤀㠀㄀䔀㘀㌀㄀䌀㘀䈀䈀䄀㐀㔀㠀㈀䌀㘀䘀䈀㔀䐀䄀㌀䌀㘀㄀㠀㘀㌀㠀䌀䌀㤀䌀㤀㌀㄀㘀䄀㠀䌀㔀㄀㠀㌀㠀㠀㐀㘀㠀䐀㌀㄀㔀䔀䘀㄀㄀㈀䘀　㠀㈀䄀㜀䔀䄀䈀䈀　䐀㔀㤀㤀㐀䌀㜀㤀䌀㤀㌀㌀䌀䔀㜀㌀㔀䔀䘀㌀㤀䌀㔀䘀㌀䘀　䄀䈀㤀䔀䐀㤀㤀䔀䔀䔀䐀䔀䐀䔀㐀䘀䐀㜀䘀㐀䌀䌀䘀㐀䐀㐀㌀䘀㄀㈀㠀䘀㌀㜀㔀㔀㤀䄀䈀㘀㄀㈀䄀䈀㤀䄀䈀㘀㘀䔀㄀䄀㈀　㔀䔀㘀䌀㘀䔀㘀㠀䔀䔀㈀䄀㔀䔀㘀䈀䔀䔀䐀䔀㔀䌀㄀㘀㘀䘀㌀㘀㐀㜀䌀䐀㄀㔀䘀㄀䘀㘀㌀䘀㜀㜀㔀䔀㘀㌀㠀䘀㠀㜀㤀㄀䘀䘀㐀　㠀䔀䘀㠀㠀㜀䘀㈀㠀　㜀䘀㈀㐀㐀㔀䈀㄀䘀㄀䐀㈀䌀㘀䔀㔀㐀㈀㌀㐀䐀䔀䐀䈀䘀㠀䄀　㘀㠀㘀㠀㔀䌀䐀㜀㔀㔀㌀㈀䌀䄀㤀㠀䔀䐀㔀㔀㐀䄀㘀䔀㔀䌀㔀㘀㔀㤀㌀䄀㌀㔀䈀䘀㌀㔀㤀㈀㔀䈀　㌀䐀䈀㘀䔀㜀㔀㘀䌀䐀㠀䘀㠀㔀䄀䄀㈀㈀㜀䘀䐀　㜀㘀㜀　㌀䄀㔀䔀䈀㐀㔀䄀㄀㌀㐀㠀㄀䄀㤀㄀䈀䘀㈀䄀㤀㐀㈀䔀㤀㠀㐀䐀㈀㜀㔀䔀䐀䌀䘀　㤀㐀䄀䘀䈀䐀㠀䘀䈀䘀㘀㜀㄀㠀䘀㘀㘀㄀㤀㐀㜀㠀䈀㈀㘀㌀㜀㈀㈀䌀㤀䌀㘀㔀㜀㘀䈀䔀䐀䘀㜀㜀㈀䄀㄀䐀㐀䈀㜀䐀䈀㌀　㤀䈀䐀䈀㤀㄀㠀㌀䌀㤀㤀䐀䌀㠀㤀䐀䌀㤀㔀䐀䌀㠀㄀㄀䔀㐀䔀㜀䌀㠀㔀䐀䌀㤀䐀䐀䌀㠀㠀㌀䌀㠀䌀㌀㔀䌀㠀䄀䌀䔀䄀㔀䈀䔀㈀㔀䘀䈀㤀䄀䄀㌀䈀㐀㔀䐀䌀㤀㤀䔀䐀㔀㤀㘀　㘀㤀㜀　㘀䈀䈀㈀㔀㤀㔀䔀䌀䘀㤀㔀㈀㘀㤀䈀㜀䐀㈀㘀䔀䄀㈀䄀㄀㜀㐀㔀　䔀㤀㈀　䐀㄀㔀㠀㌀䄀䄀䌀㜀㐀㤀㠀䔀㠀䌀䄀䐀㤀㜀䐀䘀㌀䌀㘀㤀㄀䄀㐀㌀㜀䈀䌀㐀㘀㘀䔀䘀䘀　䄀䘀㤀㤀䘀䐀䈀䄀䔀㌀䐀䌀㤀㜀㄀㤀䘀䐀㠀䌀㘀㠀㘀䈀䘀䈀㌀㠀䐀㜀䈀㤀㘀䘀㘀䈀㐀䐀䈀㌀㠀䄀䔀㌀㐀㐀䔀㜀㐀㘀㔀㜀䈀㤀䈀䐀㠀䐀䔀㘀䔀䄀䔀㔀䘀㄀㜀㘀㜀䌀䈀㈀㘀㄀㤀䌀㠀㐀㠀䘀㘀㤀㐀㜀䐀䔀㔀　　㌀㤀㔀㐀䔀䔀㈀䌀㐀㜀䌀㤀㌀㄀㜀㈀㔀䘀㌀㤀㔀㄀㐀䔀㤀㘀㠀㜀䌀䄀㄀㤀䘀㈀㘀㠀㜀㤀㤀䌀䘀䌀䈀䄀㌀䌀㔀㔀㤀䔀㈀㄀䌀䘀㤀㄀䔀㜀䌀䈀㈀㔀䘀㈀㈀㈀㜀㤀䄀㤀㔀䌀㈀㘀䄀䘀㤀㐀䐀㜀䌀㤀㔀䈀䔀㐀㤀䐀䘀㈀㔀䔀䘀㤀㠀　䘀䌀䈀㔀㜀䌀㔀㐀㌀䔀㈀㄀㔀㜀䌀㤀䔀㜀䔀㔀䌀䈀䘀㘀䔀䌀䔀㘀㔀䐀䘀㤀㐀㄀䄀㄀㔀　䔀㠀㔀㈀㘀㠀㈀䔀䈀㐀䐀䄀㜀㌀㄀㜀㜀㜀䈀㔀䐀㈀䌀　䌀㈀　䔀㔀㘀䐀㤀㘀㠀䐀䈀㄀㌀㠀䌀䐀䈀㜀㠀䈀䐀䐀㈀䌀䌀䌀㈀䔀䌀䌀㈀䌀㤀㠀㔀䐀㌀㌀㘀䈀㤀㔀䔀㘀㤀㜀㤀䔀㄀䄀䄀䌀㈀　䐀㠀㔀䐀䈀㌀㘀㔀䔀䈀㄀䘀㐀㔀㠀䔀㄀㈀㤀䄀䔀㔀㠀㜀䄀䄀㔀䈀　䄀㘀䈀　䈀㘀䈀　䈀䔀䐀㠀䄀㄀䐀㠀㔀㠀㈀䌀㄀㔀㔀㔀䈀㄀㐀㜀䈀㄀㐀䘀䈀㄀㜀䘀㜀㄀㜀　㜀㄀㜀㠀㜀㄀䐀㜀䔀㈀㄀䔀䌀㔀䈀㄀䌀㔀　㤀㔀䌀䈀㌀㌀㐀䈀䐀䘀㠀䔀㔀䔀㈀䐀㜀䈀㠀㘀㘀㘀㤀㘀䔀㜀㄀㐀㄀㜀㄀㘀㄀䘀㄀㠀㈀㘀㈀㔀㈀䈀䌀䄀㐀㤀㠀㄀㔀㔀㜀㄀㐀䄀䘀㈀㤀䐀䔀㔀㐀䈀䌀䄀㌀㜀㠀㐀䘀䘀㄀䘀䔀䔀㈀䄀䘀㠀䄀　䘀㄀㜀㄀䘀㈀䘀䄀䔀㈀䌀㌀䔀㔀㜀㜀䌀䄀㤀䘀㠀㔀䄀䘀㄀䔀䐀䔀㈀㜀䈀㄀䐀㐀㐀㠀㜀㐀䔀㄀䐀㤀䄀㌀䄀　㐀㄀䐀㈀㈀㔀㄀䔀㠀䐀㠀䐀　㘀䐀㈀㠀㜀䘀㄀䘀㤀㜀䐀䈀㤀　䘀䐀䌀㠀㘀䐀䌀㤀䘀䔀䔀㐀㜀㘀䔀㐀　　㜀㈀㜀䈀㜀㈀㈀　㌀㤀㠀㠀㄀䌀㐀䌀　䔀㈀㄀㠀㜀㤀㈀䌀㌀䌀㠀㄀䐀䌀㠀㄀䐀䌀㤀䔀㄀䔀㐀㐀䔀䔀㐀䌀䔀䔀㐀㈀䔀䔀㐀　㠀䘀㈀㜀㌀䔀㐀䄀䔀䔀㐀㐀㠀㜀㈀㄀㐀䈀㤀㄀䈀㌀㤀㤀䄀䐀䌀㤀䐀䐀䌀㠀㌀䘀䌀㌀䌀㌀㤀㠀㘀䐀䌀㤀㌀䐀䌀㠀䈀䐀䌀㤀䈀㄀䌀㐀䈀䔀䔀㐀㌀䔀䔀㐀䈀䔀䔀㐀㜀㠀䔀㈀㌀䌀㜀㤀㌀㄀㌀䌀㠀㠀㤀䔀㐀㈀㐀䘀㈀㈀　㜀㈀　䄀㜀㤀㈀㠀㜀㤀㄀㠀㜀㤀㌀㠀㜀㤀　㐀㜀㤀㈀㐀㌀㤀㠀㌀㌀䌀㠀䄀䘀䌀㄀㈀䘀㤀㘀㔀䘀㈀㈀䈀䔀㐀㌀㄀䔀㐀㐀䌀䘀㈀䄀䈀䔀㐀䐀㜀䌀㠀䔀㌀䌀㠀㔀㤀䔀㐀䘀㄀䔀㐀　㤀䔀㐀㠀㤀䔀㐀㐀㤀䔀㐀㄀䌀䘀㈀㄀㐀䘀㈀㄀䈀䔀㐀䄀㤀䔀㐀㌀㜀䌀㤀䐀㌀䌀㤀㜀㤀䔀㐀㄀㤀䔀㐀㤀㤀䔀㐀㔀㤀䔀㐀　㈀䘀㈀㄀䌀䘀㈀㔀䌀䘀㈀㔀䈀䔀㐀㐀㈀㜀㈀㄀㄀䘀㤀㄀䐀䘀㈀　㈀㜀㈀㌀㄀䈀㤀㠀㐀㔀䌀㐀䄀㔀䔀㐀㠀㜀䔀㤀㜀㐀䌀䌀㠀㈀䄀㜀㤀㄀㄀㜀㤀　㤀㔀㤀㈀㌀㈀䘀㈀㔀　䐀㔀㤀㈀㜀㔀㌀㌀㈀㈀㌀㈀䘀㈀㌀㤀㜀㤀㄀㤀㜀㤀㌀䌀䈀䌀㤀㄀㔀䔀㐀㄀㔀䔀㐀㤀㔀䔀㐀　䘀䌀㤀䄀䈀䌀㠀䄀䈀䌀㤀㘀䈀䌀㠀㘀䈀䌀㤀䔀䈀䌀㠀䔀䈀䌀㤀㄀䈀䌀㠀㄀䈀䌀㤀㤀䈀䌀㠀㤀䈀䌀㤀㔀䈀䌀㠀㔀䈀䌀㤀䐀䈀䌀㠀䐀䈀䌀㤀㌀䈀䌀㠀㄀䘀㤀㄀㜀㜀㤀㈀㜀㜀㤀㄀㜀㜀㤀㌀㌀䘀㈀㘀䔀䘀㈀㄀㜀䘀㐀㈀䐀䔀㐀䈀䘀䔀䐀㐀䄀㔀　㠀㌀䈀㌀㘀䐀㠀㤀䔀㔀㘀䐀㠀䐀䔀䌀㔀䘀㘀䌀㜀䄀㔀㠀㤀䄀㔀㠀㤀㘀㈀㐀　㘀㤀㤀㈀䔀䐀㌀䘀䈀㘀㈀䘀㐀䐀㈀㤀㐀䐀㄀㄀㠀㌀㐀䄀㠀㜀㤀㘀㠀䔀㄀　㠀㌀㐀䈀㐀㜀㤀㘀㘀㘀㠀㠀㄀䐀㐀䄀㐀㜀㤀㔀䈀䔀㈀㈀㠀㘀㤀㜀㠀䔀㈀㤀㜀䐀㐀䐀㠀䌀㈀㠀㄀䐀㔀㜀㤀䄀㈀㔀㐀㘀㤀㔀㠀䔀㈀䘀㤀䐀㈀㠀㐀㘀㤀㜀㐀䔀㈀䄀㤀䐀㈀㐀㌀䔀㔀䘀㤀䄀㔀㌀䘀䄀䄀㘀㄀㠀㔀㌀㌀䄀䈀䐀㜀㐀䈀䄀䐀㠀䄀㜀㌀㐀䄀䘀㜀㐀䄀㘀䐀㠀䈀㜀㜀㐀㔀㘀㘀㤀㠀㄀㄀㠀㔀䘀㌀䄀䄀㜀㜀㐀㠀䔀䐀㠀䈀䘀㜀㐀㘀䔀㘀㤀䄀㄀㤀㠀㔀㠀㔀䄀㔀㐀䈀䄀㐀㠀㜀䌀䄀㄀㜀㐀㐀㤀㘀㤀䈀㤀㌀㠀䈀䌀䈀㐀䄀㈀䘀㐀㔀㌀㜀㄀㠀䌀㜀　䄀㌀䐀㔀㘀䐀㔀䈀㜀䔀䈀㜀䘀䌀䐀㜀䘀㈀䐀䄀䘀㈀䈀䄀䘀㈀㜀䈀䔀㔀䘀㜀䌀䈀㄀䘀㤀㐀㌀䘀㈀䌀䄀䘀㈀䘀㜀䘀㔀㐀䘀䔀㔀㌀䘀㤀䄀㔀䘀㈀㤀䘀䌀䈀㈀䘀㤀㜀䘀䘀㔀㈀㜀䔀䄀㔀䘀䌀㘀䄀䘀㤀䈀㔀䘀㈀䔀䈀䔀㔀㌀㜀㌀㘀䐀䔀䘀㜀㘀㘀㜀㤀㐀䐀䘀㤀䄀䐀䈀㘀䘀䈀䔀㈀䈀䐀䔀㌀䈀㄀䘀㄀㌀䔀䘀㄀䈀䔀䘀㄀㜀䔀䘀㄀䈀㠀㜀㠀㜀䌀㌀䌀㈀㄀䐀䔀䐀䘀䈀䐀㤀㜀䈀䐀䌀㤀㜀䈀㄀㈀䔀㜀㤀㐀䈀䘀㤀㌀䈀䘀㈀㜀䐀㄀㌀㌀㔀䘀䐀䘀䐀㌀䔀㔀㔀㔀䔀㔀㘀㜀䌀䄀䄀䈀䌀䈀䌀䘀㤀㘀㤀䘀㈀䈀䘀䘀䈀㄀䘀䌀㜀䌀䘀㤀㠀㔀䘀㈀㠀䈀䔀㔀㠀㜀䌀䄀䈀䘀㈀㤀㌀䘀㔀䌀㜀䔀䄀㐀䘀䌀㘀㠀䘀㤀䈀㜀䔀㔀䌀㜀䌀䄀䈀䘀㈀䈀㌀䘀㔀䔀䘀䔀䘀䐀䌀㘀䘀䈀㤀䔀㈀㠀㌀䘀㔀㤀㜀䔀䄀䄀䔀䐀䈀䔀㜀㠀㔀㐀䈀䌀㔀䈀㌀䌀㌀䄀䐀䔀㌀䐀䐀䔀㈀㌀䘀䔀㜀䌀㌀䌀㈀㘀䐀䔀㌀㌀䐀䔀䔀䈀㔀㌀䐀㜀㈀㜀䔀㔀㘀㠀䈀㄀䔀䐀㜀䘀䘀㌀䈀䌀㘀　㤀㔀㜀㠀㔀䔀䈀䌀㈀䌀䐀䔀㄀　䔀䘀㠀䄀　䘀䈀㠀㐀㘀䄀㐀㔀㤀䈀㘀䌀䄀㠀䄀䔀䌀㈀䐀䘀䈀䌀㤀㠀㄀䔀䔀㌀䄀㄀㄀㔀㄀　㠀　䄀䔀㔀䄀㜀䌀㤀㔀㔀䔀㐀㌀㌀䔀㐀㘀䄀䘀㈀㔀㤀䘀㈀㌀㤀䘀㈀㠀䘀䔀㐀䘀㌀䔀㐀　䈀䔀㐀㠀䈀䔀㐀㐀㌀䔀㐀㘀䘀䌀㠀㠀㜀䌀㤀㐀㜀䌀㠀㐀㜀䌀㤀䐀䘀㤀㈀㠀䘀㤀㄀䈀䘀㈀㌀㄀䘀㈀㜀㜀䘀䘀䘀䄀㤀㠀䘀㜀䐀㠀㈀㜀䌀㤀㈀㜀䌀㘀䄀䘀㌀㠀䘀㠀䐀㐀㜀㤀㄀䈀䈀㤀㄀䄀㌀䌀㤀䐀䐀䌀㤀㌀䐀䌀㠀䌀䘀㤀㌀㘀㌀䌀㠀㌀䐀䌀㤀䌀䘀㘀㈀䌀䘀㜀㘀㈀䌀䈀䔀㐀㈀䈀䔀㐀䄀䈀䔀㐀㘀䈀䔀㐀䔀䈀䔀㐀㄀䈀䔀㐀㤀䄀䔀㈀㄀䐀䘀㈀㈀䐀䘀㈀㘀䐀䘀㜀㄀㔀㤀䘀䔀㌀䄀㜀㤀㄀㈀㜀㤀㌀㈀㌀㤀㠀㜀㌀䌀㠀㔀䘀䌀　㘀㜀㤀㈀䄀䘀㤀㐀䐀䘀㈀㌀㐀䘀㈀䘀㐀㐀䘀㜀䐀䔀䌀㐀㈀䘀㈀㌀䌀䘀㈀䘀䌀䌀䐀㌀䘀㌀㘀㄀䔀㐀　㘀䔀㐀䘀　䔀㈀㐀　㜀㤀㄀㠀㌀䌀㤀㈀㄀䔀㐀㔀　㜀㈀㄀㠀䈀㤀䌀㌀䄀㜀䔀䘀㔀㤀䘀䈀䈀䘀㤀㠀㠀䘀　㜀㔀㜀　㠀㐀㐀䘀㤀　㠀㤀䈀䌀㔀䘀㈀　䌀㤀䈀㄀䐀䌀䄀㔀䘀㜀㐀㤀䘀㄀㄀㤀㜀㠀䘀䈀　䘀㜀㠀㤀䘀㈀　䌀㜀䈀㐀䈀㘀䔀㜀䄀㠀䔀㄀㜀㐀䔀㜀㄀䔀䘀䌀㜀㌀㄀㜀㔀㐀㠀㌀䔀㔀㔀㜀　䘀㔀㄀㠀䘀䔀䐀䔀䈀㤀㔀䌀㌀㠀䐀䈀㔀䐀䌀㌀㄀㜀㜀㈀㐀䐀䄀㔀䌀䐀㌀㤀䔀䔀㔀㄀䔀䔀㄀䄀㌀　㤀䈀䐀䘀㈀㘀㄀㜀䐀㤀䘀䈀䈀㤀䌀䔀䌀䘀䔀㘀㠀㤀䄀㐀㤀䈀㠀㜀㈀䈀䔀㌀㘀䌀㜀䔀㤀䈀㔀䌀㈀㐀㌀䔀㌀䔀㠀㈀䄀䘀㜀䈀䈀㜀䈀㌀䄀㄀㘀䐀㔀㐀䈀䈀㐀䐀䐀㘀㔀䈀　㠀㠀䘀㠀䈀㈀㐀㌀㤀䌀䘀㘀䐀㘀㔀䘀㐀㐀㌀䄀㘀䔀㜀㤀㈀㘀㜀㜀㈀　䘀䔀䘀㈀䈀㐀㘀㘀㜀㜀　䌀䘀㄀㈀㜀㈀䄀㤀㔀䈀㜀䄀㜀　㜀䌀㜀　䄀㈀㄀　䌀㄀㐀㤀䌀㄀䄀㤀䈀䌀㌀䈀䔀䌀㐀㘀㐀䔀㌀䈀㌀㘀䔀㐀㤀㔀㜀㄀㌀　䐀㌀䘀䔀䈀㘀㤀䌀䘀䐀䈀㘀䘀䔀㠀㐀䘀㜀䌀㈀䄀䘀㘀䔀㜀䘀㔀䔀㘀䈀㘀䘀㄀㔀䌀䄀㈀㜀㜀㈀䘀䘀䘀㔀㘀䐀㜀㌀㤀㔀㘀㜀䘀㌀　䔀䔀䄀㠀㤀㘀䐀䈀㜀䌀㈀㘀㌀䘀㈀㜀㜀䐀㐀䐀䈀㘀䔀䘀㄀㘀㤀㐀㤀㜀　䈀䌀䈀䐀㜀㔀䄀㤀㄀㠀㄀䘀㄀㔀䄀㈀㘀㈀䐀㐀㈀㄀䔀䄀㄀㠀㜀㔀㠀䄀䈀䄀㐀㐀　䐀㔀㄀㘀㌀䐀㐀䐀㔀㠀䐀䈀䌀䔀㔀䌀㘀䐀䐀㠀䄀㔀䄀䄀㈀䐀㘀㈀㠀㠀䌀㔀㐀㄀㐀㐀㜀㤀㔀㘀㠀㠀䈀䄀㠀㐀㜀䈀㐀䄀㔀㄀䈀㜀䈀㈀䈀䔀䄀㄀㌀㘀䐀㄀㜀　䐀㠀㠀䈀㘀㠀䘀　㘀㐀㘀㠀㌀䄀㈀㈀㄀䐀㄀䐀　㘀㠀㤀㠀㄀䈀㜀㤀䌀䈀㠀䐀䈀䈀䔀㔀㐀㘀䐀䐀㜀㈀㘀㌀㘀䔀䈀㤀㄀㄀䈀㜀䐀䌀㜀㠀㔀䈀䐀㄀㜀䔀䐀㄀䈀㠀㘀㠀㜀䌀㌀㐀㈀㄀䐀䄀㌀䘀㤀䄀㄀㠀㄀䐀䔀　䄀䄀䔀䌀㐀㘀㤀㌀䄀㈀㠀㌀䄀㈀䌀㤀䐀㄀㤀㐀㘀㠀㘀䄀㜀㐀㜀　㌀㐀㈀䐀㌀䄀䄀㐀䐀㈀䄀㤀䐀㈀䈀㤀䐀㈀䄀㔀䐀㈀㔀　㘀㤀䄀䌀㌀㐀㔀㔀䈀䄀㔀㔀㤀䄀㈀䈀䐀䐀㈀䈀䄀㔀㐀䄀䈀㤀㄀㈀㔀㐀㔀䄀㌀䔀䈀㌀䄀䈀䄀㘀㠀㘀㠀䄀㌀　㘀䄀㠀䄀䈀䄀㐀㜀㠀㄀䄀䈀㌀㌀㄀㈀䘀㔀㠀䌀䈀㘀㠀䄀　㘀㐀㜀㌀䈀䈀㠀䄀䄀㈀㈀䐀㄀䔀㜀䄀㈀㔀㄀䄀䔀㤀㘀㐀㠀䈀㐀㤀㜀䄀䈀㈀㈀䔀㈀㘀䄀㠀㠀㔀㐀䐀䌀㜀㜀㘀㘀㐀䈀䘀䘀㜀㌀䈀㔀㐀䘀䄀㠀㔀　䐀㈀㤀䄀㜀䘀㜀㈀䐀　㈀䐀㤀䄀㠀䌀㠀㌀㜀㈀㜀　㐀㐀䔀䔀䔀　㐀㘀㌀䔀䄀䘀㜀　䐀㜀　䈀䘀㐀㄀㜀㘀㔀㤀䐀䔀䄀㐀䌀㔀䘀䄀㘀㤀㜀䔀㤀䌀䈀䘀㔀㜀㈀䘀䐀　㌀䈀䐀㐀㈀㔀䘀䄀㄀䄀䘀䐀㐀㌀䘀䐀㐀㔀㜀䔀㤀䄀䈀䘀㔀㌀㔀䘀䄀㔀䄀㜀䐀㤀䐀䈀䔀㤀䔀䌀䘀㜀㘀䘀䘀䔀㤀䐀㄀㜀㄀䔀䌀㔀㈀㤀䄀㐀㔀　㜀㌀㜀㄀䔀㤀㠀䘀䐀䔀䘀䐀䔀㠀䘀㘀䌀㄀䈀㘀䈀㐀㠀㌀　䐀㘀㤀　㘀㐀㤀㐀䄀㄀　㈀䄀㌀　䌀䈀㤀㔀㜀㘀㜀䌀䐀䘀㠀䈀㐀㌀㈀䄀䐀䈀㔀　䐀䔀㈀䐀䌀䄀㌀㘀䈀䘀䄀㔀㈀㐀㘀䔀䌀䘀㤀䈀㐀㜀䄀䔀㘀　㔀㜀㄀䄀㄀㄀㠀㄀䈀㌀䔀㄀䔀䘀䔀㌀䔀㜀䌀㈀㈀㜀䌀㌀㈀㜀䌀㈀䄀䘀䌀㐀㌀䈀㠀㌀㈀㜀䌀䐀䄀䐀㔀㤀䘀　䘀㔀㜀㠀㜀䌀䘀㠀㘀䌀䘀㠀㔀㤀㜀㠀㜀䌀䈀䌀㌀㄀䘀㠀㐀㈀䈀䌀㈀㈀䈀䌀㈀㈀䈀䌀㌀㄀䘀㠀㘀㔀㜀㠀㔀㔀㜀㠀㜀䐀㜀㠀㐀䐀㜀㠀㘀䐀㜀㠀㔀䐀㜀㠀㜀㌀㜀㠀㐀㌀㜀㠀㘀㌀㜀㠀㔀㌀㜀㠀㜀䈀㜀㠀㐀䈀㜀㠀㘀䈀㜀㠀㔀䈀㜀㠀㜀㜀㜀㠀㐀㌀䘀　䄀䔀䘀　䌀䔀䘀　䄀䔀䘀　䔀㜀䘀㄀䌀䐀䔀㄀㌀䘀䔀㈀㐀䈀䌀㌀㜀䘀䌀㘀㌀䘀㠀㜀䌀䘀㠀㐀㈀䘀㠀㘀㈀䘀㠀䐀㌀䘀　㐀䘀䔀㄀㐀䈀䔀㄀㤀䘀䌀㌀㤀㜀䐀䐀㘀㠀　䔀䔀㄀䄀䈀䔀㄀㘀䈀䔀㄀䔀䈀䄀䔀㠀㘀㜀䐀䈀㠀㈀㘀㜀䌀㈀䈀㜀䌀㌀䈀㜀䌀㈀㜀㜀䌀㌀㜀䈀䌀㈀䘀䘀䌀㔀㤀䈀䌀㌀㈀㜀䔀㤀䄀䔀䄀䈀㘀䘀䘀䘀䈀㈀䈀䄀㘀㐀䈀㌀㄀㐀㈀㜀㐀㜀㐀㤀㔀㘀㐀㐀㐀㘀䘀㘀䈀䌀䄀䘀䔀　䐀䌀㌀䌀㜀䄀㤀䄀㤀㔀䌀　䌀㔀㜀䔀㘀䔀䐀㜀㌀㜀㤀䘀䈀䌀㜀䈀㘀㌀㘀㘀䔀䈀䈀䘀䘀䐀㌀㈀䄀㤀䘀㐀䈀㜀㤀䄀㤀䐀㠀㤀㈀㐀䘀　䈀䄀㜀䐀㤀㔀㜀䈀　㈀㜀㠀㠀䈀㤀㘀㈀䄀㄀㐀㠀㐀㐀㈀㘀䄀䔀㄀㄀㜀㜀㠀㠀䘀䈀䌀㔀䌀㌀㘀㈀䄀㔀㜀㠀㐀㤀䈀䌀㘀䐀㜀㄀㌀㐀䐀㤀㔀㜀㤀　㜀䐀䔀䐀䄀䈀䌀㜀㔀㄀䘀㘀㤀㔀䔀㌀㘀㐀䘀䈀䄀䄀䘀㄀㌀㠀䘀䈀㠀䄀䘀㄀㄀䌀䈀㤀䌀㐀㔀㔀㐀㔀㜀㜀䔀䈀㘀　㌀䐀㄀䐀䌀㌀㈀㜀䐀䈀㐀䐀㌀䘀䐀㔀㘀䔀䘀䄀　䘀䔀䐀䄀㘀㤀䘀㘀䔀㌀㜀䈀䐀䄀䄀䐀䐀䘀㐀㌀㌀䔀䐀䄀㘀㔀㜀䈀㜀㤀䈀㜀䔀䈀㘀䐀䐀䘀㐀　䈀䔀䐀䄀㘀㔀䘀㘀䌀㌀㜀䘀䐀䄀㜀㜀㘀䐀㌀㈀䘀䈀㔀㤀䈀䘀䔀㜀㌀䈀䈀䔀㤀㤀㜀䐀䈀㐀䐀䘀䘀䄀㔀䐀䐀䘀㐀㈀䈀䔀䐀䄀㘀㔀䘀㘀䐀㌀㜀䘀䐀㔀䄀䈀䈀䔀㤀䐀㜀䐀䈀㐀䐀䈀䘀䐀㄀㘀䔀䘀䄀䌀䐀㜀㘀䐀㌀㘀䈀䐀䄀㐀䐀䈀䘀䐀㔀㘀䔀䘀䄀䔀䐀㜀㘀䐀㌀䔀䘀䈀㐀㤀䈀㜀䔀䘀㜀㘀䘀䐀㌀㜀㄀䈀䈀㜀䐀㄀㈀䘀䘀㘀䐀㤀䘀䘀䌀䘀䐀㤀䄀䘀㌀㔀㈀䌀䔀䈀㘀䌀䘀㘀䐀䔀䔀䘀㌀䔀䈀䔀㤀䘀㘀㄀㤀㜀㘀㌀㘀㤀䘀㜀㠀䘀䘀䔀䐀䄀䄀䔀㌀䔀䈀䌀㐀㘀䐀㔀䌀㜀㔀䘀䌀㤀　㜀㠀䐀䌀㤀䔀䘀䈀䈀䌀㈀㠀㔀䔀䈀㌀㘀㜀㌀䔀䔀䈀㘀㔀㈀㜀㜀䈀䐀䔀䄀㌀㘀㐀㐀䘀㜀䈀䐀㘀㌀㌀㔀㠀䔀䔀㈀䌀㐀㜀䌀䈀䈀㄀㜀㈀䄀㈀㤀䌀㈀䄀䄀㜀䌀䈀䄀㌀䐀䈀㜀㤀䘀䄀㜀䐀䐀䔀㌀䔀㤀㄀䈀㜀㐀䘀䔀㘀䔀䐀㔀㌀㜀㤀䘀䈀㠀㜀㠀䘀䈀㤀㜀䈀㌀䄀㘀䘀㔀㜀䔀㔀䔀䐀㌀㌀㜀㤀䈀䈀㌀䄀㘀䘀㤀䘀䐀䐀䈀䌀䌀䘀䘀　䘀㤀䈀䌀㜀䐀㈀㄀㘀䘀㔀䘀䌀䌀䐀䈀㌀䘀䔀㔀䔀䐀㐀䈀㜀㤀䘀䈀䔀㜀䈀䌀㜀䐀㌀㤀㘀䘀䘀䘀㤀㈀䈀㜀䄀䘀䔀㐀䔀䐀䄀䈀㜀㤀䘀䈀㔀䄀䐀䔀䈀䔀㤀䔀䈀㜀㘀䘀䔀㐀䔀䐀㤀䈀㜀㤀䈀䈀㈀㘀㘀䘀䐀䘀䌀䄀䐀䈀䈀㜀䘀㌀䘀㘀㤀䐀䈀䌀㜀䐀㜀㜀㤀㌀䔀㌀䄀㘀㄀㠀䔀㜀䈀䘀㔀㜀䐀䈀䐀䘀䌀㐀㤀䐀　㄀䐀㠀䔀㌀䔀㠀㔀䐀㈀㄀䔀䌀䈀㄀䈀㌀㐀䄀䐀㠀䘀䔀㔀㐀䈀䔀㘀㠀㠀䘀䌀㈀㜀䘀㜀䄀䈀䘀䌀䈀䐀㤀䘀㈀㄀㐀㜀㤀㠀㘀㌀䌀㔀㜀㔀䔀㈀　㈀䘀㤀㈀㜀㔀䈀㤀㐀㈀㔀䔀㈀㜀㘀䘀㤀㌀䘀㜀䌀㠀　㜀䔀㐀㐀㌀䘀㈀㜀㄀䈀㤀䌀䄀䘀㘀㘀㄀㄀㜀䈀㐀㘀䐀㐀㔀䈀　㌀㠀㘀䘀㤀㜀䔀㐀䔀䐀䔀㔀㜀㤀䈀䈀㌀䌀㘀䘀㜀䘀䐀　䐀㘀䈀㘀䔀㘀㌀䘀㘀䘀䘀䐀㜀䔀䐀䔀䄀䔀䌀䈀䐀䈀　䘀䘀㌀㜀㘀㜀䐀䘀䔀䐀䈀㌀㘀䔀㘀㘀䐀㜀㌀䐀䔀㜀㘀䌀䘀䐀䈀䌀㜀㌀䘀䈀㘀㤀㜀䘀䘀䐀䄀䐀㘀䄀䄀䄀㘀䈀䌀㠀䐀䘀㈀㜀㘀㔀　䐀䔀䔀䔀㤀䄀䈀㜀㈀㌀䘀㌀㜀㘀㔀㐀䐀䔀㄀䔀㤀　䈀㜀㠀㜀䔀㐀䔀䐀㄀㄀㜀㤀㌀䈀㌀䐀㘀䘀㠀䘀䌀䐀䐀䈀䔀㌀䘀㈀㜀㘀㔀㘀䐀䔀䌀䔀䌀䘀䐀䈀䘀㌀䘀㌀㌀㘀䘀䘀䘀䐀㔀㔀䘀䔀䘀䈀䄀䈀㐀䈀䘀㌀䘀㘀䌀㘀䈀䌀䘀䐀㜀㄀䐀䔀㌀䔀㤀䄀䈀㜀䈀㤀㐀㈀㤀㔀䘀䘀㤀㔀㜀㔀㤀䄀䈀㜀㔀㜀䔀㐀䔀䐀　䐀㜀㤀㜀䈀㜀䈀䐀䔀䐀䔀㤀䈀䈀㜀　䘀䔀㘀䔀䐀㈀㌀㜀㤀䘀䈀㐀㐀䘀䔀㔀㜀䔀䘀㤀䈀䐀㜀㜀㐀㜀　䐀㔀㌀㌀㠀䄀㠀䌀㈀䄀䐀㌀㠀㤀㤀㄀㤀䈀㌀䄀㌀㌀㤀䔀㐀䌀㄀㜀㘀䄀䘀䈀㌀㔀㔀　㤀㜀䄀䐀㈀䈀㘀㌀㌀㘀㌀㔀䐀㄀䐀䈀㌀㘀㔀㌀䐀䈀䄀䘀㌀䈀䈀㔀䘀䐀㐀䄀㜀䌀㐀㈀㔀䈀䄀㘀䈀㘀㔀䘀㐀　㘀䐀䈀䘀㄀㘀䈀㔀䄀䈀㄀䄀㈀㔀㔀䄀㄀㤀㜀㌀㐀㘀㌀㌀䌀䔀㐀䌀㐀㐀㘀䐀䈀䘀㔀㠀㄀䐀䄀䈀㘀㘀㠀㤀㈀䐀㄀㠀䈀㌀䄀㤀㈀㜀㤀㔀䐀䐀㜀䄀㌀㄀㐀䔀㔀㌀㘀䘀㘀䄀䘀䈀䘀㔀䄀㄀䈀㘀䐀䘀䐀㘀䔀䄀䌀㜀䔀䄀䌀㜀䄀㈀㈀䘀㤀䘀䘀㜀㘀䔀㐀㌀㤀䐀䈀䘀㜀䔀䐀㐀䘀㤀䐀䈀㤀㘀㄀䄀㜀䔀䘀䐀䄀㤀䔀㄀䈀㜀㄀䐀㌀㔀䘀䌀　㘀㔀　䌀㌀㘀䘀㜀䈀㜀䐀䄀䘀䈀䔀㔀㜀　䌀䐀㐀　䘀䔀䄀　㜀䌀㔀㈀　䘀䐀㠀㠀㜀䔀㐀㐀　䌀䐀㘀㐀䘀䔀㠀㈀㜀䌀㐀㤀　䈀㘀䔀䈀㐀㜀䔀䐀㄀㘀䄀䔀　䐀䐀㜀㠀㔀䔀䘀㠀㔀䔀䘀㠀㜀㄀䘀㠀㐀㄀䘀㠀㘀䔀䈀䌀㌀㠀䘀㤀㐀㔀　㔀㈀㄀㔀㔀㐀㔀㄀㜀㔀㔀　㄀䐀㔀㔀㈀㜀㌀㜀㘀㘀㤀㈀㘀䄀㔀　㠀䐀䄀䄀䄀䈀㄀䈀㌀㜀㐀㤀㌀㔀䄀䈀䔀䔀䄀䄀䄀㐀䌀䄀䘀㘀㔀㐀䄀䄀㐀㔀䈀㔀䄀䄀㔀　㈀㤀䄀㔀䔀㌀㘀㜀䔀㈀䐀㔀䘀㄀䈀㌀䔀䔀䔀䌀䔀㄀䐀㌀㤀䘀㠀㄀㜀㤀㌀䔀䔀䌀䌀㘀䘀㌀㘀㄀㌀㌀䌀䘀㠀㐀㘀㔀㤀䔀　㤀　㌀㤀䔀　㤀㐀㌀㤀䔀　㤀㄀㔀䌀䘀㠀㐀䈀䐀㜀㠀䘀㘀䐀䈀㠀䄀䔀㜀䈀䐀䄀䐀䐀䈀䈀㘀䐀㈀䔀䔀䈀䈀㔀㠀㔀㔀䐀㐀㄀㘀䄀䄀㠀㜀䐀䄀㔀㈀䘀㔀㔀㐀䈀䐀㔀㐀㘀䘀䈀㔀㤀㔀䔀䄀䄀㌀䈀㘀㔀㘀㜀䐀䐀㔀㌀㘀䄀䄀㤀䘀䐀䄀䐀㘀㠀䐀䐀䐀䄀㐀　㘀䄀㠀䔀䐀䐀㔀㐀　㜀㜀䈀㔀㠀䄀㄀䄀䄀㈀㠀㘀䄀䄀㘀㄀㘀䄀　㜀䈀㔀䄀㌀㄀䄀䄀䔀㜀㘀㔀㈀㌀䈀䈀䈀㔀㄀䈀㄀䔀㈀䔀㜀䔀㈀㌀䘀䌀㘀㘀䐀㤀㔀䄀㤀䐀䌀䐀㠀㔀㐀㠀㈀䈀㄀䄀㤀㈀㐀㘀㌀㔀㌀㄀㔀㠀㌀䔀䈀㠀㈀㔀䈀䔀䌀㔀㘀䐀䔀㄀㘀䐀䌀㘀䔀䈀㜀䐀㈀㔀㔀㄀㈀䔀䈀䐀㘀㘀䄀㔀䄀㔀㌀䘀䈀㌀㜀㜀㐀䄀㌀㐀䘀㤀㔀䄀㤀㐀䌀㄀㔀㌀　　㘀㔀㔀㄀㠀㤀㘀䌀㌀䐀㠀㘀䔀㈀㔀㈀㌀㜀㄀䌀㔀䘀㜀䌀㔀㌀䘀䈀㌀㔀䈀䔀㤀㘀䄀䄀㔀䈀㠀䄀䐀㄀䌀㈀㠀㔀䄀䌀㈀䈀㌀䌀㈀　㔀䔀㄀䐀㤀䔀㄀㌀㤀䔀㄀䈀䘀㠀㔀䔀㜀㠀㘀䐀䘀　䄀㄀㜀㠀㘀䔀㜀㠀㔀䔀㜀㠀㜀䐀䘀　䔀㄀㜀㠀㔀䐀䘀　㤀㈀䘀　㠀㄀㜀㠀㜀㐀䈀䌀㈀䄀㔀䔀㄀㠀㔀䈀㄀䄀䈀㌀㜀㔀䄀㘀㠀䄀䈀㔀㔀䌀㈀㔀㠀䔀䌀　㄀䐀㜀　䘀㤀㘀䌀㈀䔀䘀㠀㘀㐀㤀㔀㠀　䐀㈀䘀　䄀䈀䘀㄀㜀㔀䔀㄀䌀㜀䔀㌀䘀䈀䌀㈀㐀䄀䌀㠀㔀㤀㜀㠀㘀㈀㘀䄀䌀㠀㜀㘀㤀㤀㠀㠀㔀㤀㜀㠀㔀䌀䈀䐀䌀䔀㜀㜀㐀㠀䌀㠀㤀㈀㐀䔀䌀䐀㐀㘀䌀㌀㄀㔀䌀㜀䐀䔀㐀䌀㘀㈀㘀䐀㔀　㔀㔀䐀䐀㐀㄀䐀㜀㐀㐀㜀䐀䐀㐀㤀㜀㜀䐀㘀㔀䐀䐀䌀䐀㠀䄀㐀䈀䄀䄀䈀㘀䔀䐀㈀䐀䐀㜀㐀䈀㌀䔀䔀䄀䔀㐀䈀䈀䄀䄀䌀　㌀䐀䐀䔀㈀㐀㘀㈀㤀䐀㔀㐀䄀㘀䈀㄀䐀䔀㤀㔀㠀㔀㜀䘀㐀㄀㘀䈀䄀㠀㜀㄀䈀䄀㔀㔀㐀䘀㜀䐀㈀䈀䐀䘀㔀㔀㘀䈀䄀㠀䘀䐀䔀㔀䄀䘀㜀䐀㔀䐀䈀䔀㠀㜀䔀䔀㄀䘀䐀䔀㄀䌀䘀䌀㌀　㜀䌀㈀㔀䘀䈀㠀䐀㄀㐀䘀䌀㌀㠀㜀䌀㌀㐀㜀䌀㈀㐀㜀䌀㌀䐀䘀㌀㈀　㘀䄀䄀䈀䈀䈀㈀㘀㘀　䈀㔀㜀㤀䘀䐀䐀㤀䔀䄀㤀䐀䐀㈀㌀䘀䄀㠀㜀䈀䘀　䄀㜀䘀㈀㌀䐀䌀䈀㔀㔀䄀㠀㤀䐀㠀㐀㜀㜀䘀㐀㌀㤀䘀䄀䄀䈀䘀䄀㤀㐀䘀䐀㌀䄀㜀䔀䈀䈀㤀㜀䄀㤀䔀㌀䔀㐀㌀㤀䘀䄀㤀䔀㜀䔀䈀䈀㌀䘀㐀　㈀㜀䐀䈀㘀㌀䔀㐀㜀㘀䘀䄀䈀䘀䈀䔀䈀䔀䐀䘀㐀　　䈀䐀䈀䐀㄀䔀䄀㠀　㜀䔀㤀䌀㄀㜀䄀㠀㠀㄀䔀䄀䄀㠀㜀䔀㤀㄀䐀䘀㐀㠀䔀㜀䄀䈀㠀䐀䔀㐀㤀䔀䘀䄀䌀㜀㜀䐀㄀㈀㌀䘀㐀䔀㜀䘀㐀䄀䔀㜀㘀㜀㤀䘀䘀㄀䔀䘀䔀㌀䄀䘀䌀㠀䘀䘀　䄀㄀䘀　㌀㜀䔀䐀䐀㜀䄀䈀　䘀㜀　䔀㌀䄀㜀䔀䄀㐀㤀䘀䄀㈀　㌀䐀㔀㤀㐀䘀䐀㄀㔀㌀䘀㔀䌀㄀㜀䄀㤀䄀㄀䈀㌀䘀㔀㔀㄀䘀䄀㘀　䘀䐀㜀㐀㜀䔀㠀䔀㤀䘀䄀㐀㠀㌀䐀㐀㌀㜀䘀㔀㄀㄀䘀㄀㔀㌀䐀㄀䐀䄀䐀㠀䘀䄀㌀䘀㠀㈀䈀䔀䔀㌀䈀㔀　䄀㈀䄀㄀䈀㔀㤀䈀䄀䈀䘀㐀䌀㄀㤀㘀䘀㘀䈀㄀䈀䘀䐀㄀㈀䘀㐀㔀㜀䘀䌀㘀㤀䈀㄀䄀㄀䌀䄀䐀㠀䌀㔀㘀㠀䄀㌀㄀䐀㄀㠀㜀䐀㄀㠀㜀㘀㈀䌀䘀䐀㠀䔀䔀　㘀㜀䈀㔀㘀㜀㔀㐀㠀㜀䌀㠀㠀䐀㠀㌀䈀㤀䔀㄀䐀䌀䘀㄀㘀㘀㌀䔀䐀㈀㌀䔀㜀㠀䄀㤀㄀㜀䄀䄀㐀㄀䔀䄀㔀㜀㜀䐀㌀䄀㌀䘀㔀䔀䔀㜀䄀　䘀䘀䐀㜀㤀㌀䐀㐀㘀䔀䘀䄀㤀䘀㜀䐀㈀㜀䈀䔀䈀䈀㄀㜀䄀㄀䘀䈀䐀䄀䘀䐀䔀㐀䘀㠀䘀䐀㌀䔀㌀䘀㔀　㐀䈀䐀䈀䘀㤀䔀䄀㠀䘀䘀㐀䐀㤀䘀䄀䈀䈀䘀䄀㔀㄀㜀䔀䄀䘀㌀䘀㐀䘀㤀䘀䄀䐀䈀㜀䄀㤀㄀䘀䔀㠀䔀䈀䔀㐀　㈀䘀䐀㘀㐀䈀䘀㐀㔀㈀㜀䐀䄀㄀䘀䔀㤀㈀㄀䈀䐀㜀㔀㔀㄀䘀䄀䐀㠀䘀䐀㄀㌀㌀䘀㔀㔀㜀䘀㔀䐀㜀䘀㐀䈀㄀䘀䄀㌀㠀㌀㜀䄀䔀䄀䈀㌀䔀㔀䔀㤀䘀䄀　㐀䘀䐀㐀㔀䘀䐀㜀㈀㜀䔀㤀㤀㌀䘀㔀㄀䌀㜀䐀㐀䄀䘀㐀㐀䌀㈀䌀䔀㈀㐀䄀㜀䌀䈀㐀䘀䈀㜀㘀㤀㔀䔀䐀㐀㌀㠀㘀䈀㠀䘀䐀䐀䈀䈀䄀㔀䘀䔀䈀㔀㐀䐀㄀㘀䄀䘀䘀㔀䔀䘀䐀㐀㐀㄀䘀㐀㘀䈀　䐀䐀㤀㤀㄀㄀㘀䌀㜀㜀㘀㄀　㐀䐀䈀㄀㄀䘀㄀㘀㄀䘀㄀㘀㄀䔀㈀㜀㌀䘀㄀　㤀䘀㄀　㤀㘀㈀䐀㜀䘀䌀㐀䌀䘀䐀䈀䈀㌀䄀䐀㄀㔀㔀㜀䐀㤀㄀䘀㠀㘀㐀㔀䐀㜀㄀䘀㜀䐀㌀䔀䘀䔀㤀㠀䈀䘀㔀䘀㜀䘀㔀㈀㔀䔀㈀䔀㌀㄀㔀㐀　　䄀㜀㈀䄀䐀㔀㠀䄀㜀䐀䌀䈀㠀㔀䐀䄀㌀䐀㐀㘀䔀㘀䄀䈀㐀䐀䄀䐀䐀㠀䐀㘀䘀䄀㘀䌀㘀䄀㠀㌀䐀䐀㔀㔀䔀㘀䄀㘀䘀㌀㔀㔀㘀䔀䐀䄀㌀䘀㘀㔀㔀䘀䈀䄀㤀㜀㄀㘀䄀䈀䌀㤀䄀䄀　䘀㘀㔀㜀㄀㌀㘀䐀㠀䘀㜀㐀㤀䌀㤀䄀䄀㔀㘀㘀䄀䈀䔀㌀䐀㔀　㤀㘀䔀㐀䌀㌀㌀㜀㔀㤀㈀㌀䄀㔀㤀䌀䐀㔀㄀䄀㜀䄀㠀㘀䘀䄀㠀㔀㌀䐀㔀㌀㜀䐀㔀㘀㤀䔀䄀㜀㐀㌀㔀㔀㜀䌀䐀㔀㌀㘀㜀䄀㠀㌀㌀㘀䐀㘀䘀㜀㘀䄀　䘀䄀㠀㈀㤀䄀䄀㐀　䔀㔀㈀㤀㌀䐀㔀㄀㐀㌀㜀㠀㘀㤀㘀䔀䐀䌀㜀䌀䔀㔀㈀　䈀䐀㐀䐀㤀䔀䄀㄀䌀䔀㔀䌀㘀䘀㜀䘀䈀㤀㘀㔀䄀䄀㠀䄀㘀䐀㤀䐀䔀䔀䔀㔀　㜀㔀㤀㠀㌀䄀䐀䌀䘀㔀㜀㜀䔀䄀㐀㠀㌀㔀㐀㌀㜀䐀㔀㄀㄀䐀䄀㔀䈀䔀䄀㐀䈀䔀䄀䌀䈀䔀䄀㈀㠀䔀㔀㘀䌀㜀㈀㠀㌀㜀㌀䔀䐀䄀䘀㤀䔀䄀䐀䈀㘀䄀㤀㄀䘀䄀㠀䔀䔀䈀䘀㤀䐀㐀㄀㈀䈀㔀㔀㐀㔀䐀䄀㠀䈀䔀䄀䈀㄀㈀㔀㔀㔀㔀㄀㜀䄀㤀䔀䘀䄀㤀㠀䈀䐀㔀䘀㜀䐀䐀㘀㠀㤀䈀㘀䔀䄀䌀㌀䄀䐀䈀㈀㜀㄀䄀㔀㔀㔀㜀䄀㤀䌀䄀䐀㐀㘀㔀㘀䄀㤀㤀䈀䄀㔀䌀㈀䐀㔀㜀㌀䘀㔀　㈀䈀䐀㐀㄀㔀䔀䄀㐀䄀䘀㔀㐀㌀㜀㔀㤀㔀䈀䄀䐀䄀㠀䐀䄀㈀䄀㘀䄀䔀㔀㌀䐀㜀䄀䈀㄀䈀䐀䌀㐀㠀㘀䄀䔀䄀㘀㘀㜀㔀㠀䈀䈀䄀㔀㔀䐀䐀䄀㘀㘀䔀㔀㜀㜀㜀䄀㠀㄀䘀䄀㤀㌀䈀䐀㔀㔀䐀䔀䄀㘀䔀䐀䈀㤀㌀䐀䔀䄀㌀㜀䔀䄀㈀䔀䔀㔀㔀㌀䘀㔀㔀䘀㜀䄀㤀㤀䘀䄀㤀䘀䈀䐀㔀䌀䘀䐀㔀　㌀䔀䄀㄀㜀䔀䄀㐀㄀䘀㔀㐀䈀䘀㔀㈀䈀䘀㔀䔀䘀䔀䄀䐀㜀㘀䔀䄀㐀㌀㔀䘀㔀㄀䈀䘀㔀䈀　㜀䄀䌀㐀㠀䐀䈀㘀䄀㘀㄀䔀㔀㌀䈀䘀㔀㌀㠀䘀䄀䈀䐀䘀䄀䈀㈀㜀䐀㐀㤀㌀䔀䄀㈀㤀䘀㔀　㜀䈀㔀㔀㈀㌀䐀㘀䐀䘀䈀䐀䘀㘀㜀䐀㐀㘀䄀䘀㔀䄀䌀㜀䄀㐀䔀䘀䐀㔀㄀㌀䐀䄀䘀㔀䔀㔀　㈀䘀䄀䄀㌀䘀䄀㤀㤀㜀䐀㐀㤀䘀䐀㔀䌀䈀䔀䄀㈀䘀䔀䄀㄀㔀䘀㔀䄀䄀㄀䈀㠀䐀㐀䐀䈀䐀䄀㄀䐀䔀㔀㐀㘀䈀䐀䌀㠀㠀㘀䌀䔀䄀㄀䐀䘀㔀䄀䔀䘀䄀䄀䈀㔀䄀䄀䈀䐀㘀䄀㤀䘀㜀䐀㐀䘀䈀䔀䄀　㌀㌀㜀㌀㈀㤀䈀䔀䐀㤀䐀㜀䘀䄀䄀䔀䘀䐀㌀㌀䘀䐀㌀䘀㜀䔀䈀㤀䘀䔀䈀　㜀䘀㐀㈀䘀㘀䌀㌀䘀䘀䐀㐀䈀䘀䐀㈀䈀䘀䐀䔀䘀䘀䄀䐀㜀䘀䄀㌀䘀䘀㐀㐀㌀䘀䄀㌀㜀䘀䄀㘀㄀䐀䈀㘀㜀㌀䘀䄀䄀㜀䘀䄀䈀㄀䘀䐀㌀䈀䘀䐀㌀㠀䘀䔀䈀䐀䘀䐀䈀䈀䔀䘀䈀㐀㤀䘀䐀㤀㐀䘀䔀㠀㌀㔀䔀䄀㤀㤀䘀䐀㘀䄀䈀䘀㐀㌀㌀㜀䄀㜀㔀䘀䌀㐀㈀䘀䌀㘀㈀䘀䌀䄀㜀䘀㠀䔀㔀䘀㠀㈀䘀䘀㄀㈀䈀䘀㄀㐀䈀䘀㄀䄀䈀䘀㄀㤀䘀䔀㌀䐀㜀䔀㈀䐀㜀䔀㌀㌀㜀䔀㈀㌀㜀䔀㌀㌀㔀䘀㄀㔀䈀䘀㄀䐀䈀䘀㄀㌀䈀䘀㄀䈀䈀䘀㄀㔀䘀䌀㔀㌀䘀㔀䘀䘀䐀䘀㜀㐀䔀㜀㄀䔀㠀㜀䘀㐀㌀䌀㌀㈀㜀䘀䘀䘀㘀㜀䘀䘀䘀㈀䘀䔀䈀䘀䔀䄀䄀䘀䘀䘀㐀㄀䔀䌀䐀䘀㜀䌀㐀䄀䈀㜀㘀㈀䘀㘀䌀䘀㠀䌀䐀䘀䘀䘀㄀䘀䄀䌀䔀䘀䔀㜀㜀䘀䔀䈀䘀䘀　㌀䈀䈀㜀㜀䐀㠀䈀䐀　㔀㔀㤀㐀㈀㠀㤀㐀㘀㜀　㜀䘀䐀䌀㠀㔀䐀䌀㐀㠀㘀䐀䄀䐀㌀㤀䈀䈀䌀㈀㜀䐀䄀䔀䔀䔀㜀㌀㘀䐀䈀䄀䄀㄀䔀㘀䘀䄀㘀㄀㈀䘀㈀䌀㘀䘀㜀㔀㜀䔀䌀㈀㤀䐀䘀㐀䔀䄀㈀䄀䐀䔀㘀䈀㄀䈀䈀䌀䔀䈀㈀䐀㌀㠀㘀㐀䄀㄀䈀䈀䌀㈀㜀䔀㤀㜀䔀㔀䄀㈀㄀㠀㜀䔀㜀㜀㌀䈀䄀㤀䌀㐀䔀㄀䔀㐀㤀䌀䔀㄀　㤀䈀䄀䘀㠀㠀䐀䌀㘀䔀㠀䈀㠀㌀㜀䔀䔀㔀䐀㤀㜀㘀䐀䔀㌀䔀䈀䌀䄀䈀䐀㠀㔀㘀　䐀㤀㤀䘀㜀䄀　㠀㈀㄀䐀㐀㐀㔀䈀䐀䐀䔀㈀䌀䐀䄀䌀䈀㜀䘀㔀㤀㔀㘀　　䈀㤀䈀㄀䘀䈀䄀　䌀㤀䈀䌀㤀㔀䔀㈀䔀䐀㔀㄀㄀䔀㐀　㔀㈀䔀䘀䘀䄀䈀㤀㔀㠀㜀　䈀䐀㌀䌀㔀䘀㠀㜀䘀䔀䌀㌀䐀㜀㜀䘀䈀㌀䄀㘀㠀㈀䘀㌀㤀㐀䔀㄀䔀㘀㠀㔀䘀　㤀㄀䐀㈀䔀㠀䘀㤀㈀㌀㌀䔀䐀㘀䈀䄀㄀㤀㌀䔀㔀㘀㤀㜀㈀䈀䔀㜀䐀㌀㔀䈀㐀㐀㠀㔀䔀㈀㠀㈀䘀䈀㘀䄀䘀㠀㜀㤀㘀䌀䈀䄀䈀䔀㐀　䐀䘀㘀㄀㔀䐀㄀䐀䐀䘀㈀㌀䔀䘀㤀䄀　㜀䐀㐀䐀䘀㐀㤀㠀㜀䌀㘀䄀䔀㌀䈀㠀㄀㤀㘀䈀䔀㔀䘀䄀㐀㈀㠀㜀㐀㈀㘀㌀䄀㄀㔀㐀㔀　㠀㔀㄀䔀㠀㔀㌀䔀㠀㔀䘀䔀㠀㔀䌀㄀㠀㔀䔀㄀㠀㔀㔀䐀　䈀㜀䈀㄀㐀䌀㘀㄀㘀㈀㘀㄀㐀㈀㘀㄀㔀䄀㘀䐀㤀䈀䐀䐀㄀䌀㤀㜀䐀㜀䈀㌀䌀䔀㠀㐀䌀㜀㘀㈀㄀㄀䈀䌀㠀㐀㘀䈀㈀㠀㤀䔀䌀㐀㘀㌀㘀㤀㌀䐀䐀䌀㤀㌀㈀㄀㤀㤀　䄀䐀㘀㐀㐀㠀㘀䄀㌀㈀㈀㈀㘀㌀䈀㈀㐀㈀㘀䔀㐀㤀䘀㘀㈀㐀㜀䈀㤀㄀䈀䐀䌀㤀䄀䐀䌀㠀䄀䐀䌀㤀䈀䔀㘀㐀㌀䘀㜀㈀㄀　㌀㤀㤀㠀㄀䌀㐀㈀　䔀㈀㔀㠀㜀㤀㄀㌀䈀㤀㈀䌀㌀䌀㤀㤀䐀䌀㠀㔀䐀䌀㠀㄀㄀䔀㐀㐀㠀㜀㈀㄀㐀㌀㤀㤀䄀䐀䌀㤀䐀䐀䌀㠀㜀䐀䌀㤀㜀㄀䌀㐀䘀㐀䔀㈀　㈀㜀㤀㈀　㜀㤀　㤀㌀䌀㠀㠀㌀䌀㠀䌀㤀䔀㐀㄀㐀㜀㈀㈀䄀㜀㤀㌀　㌀㤀㠀䐀㌀䌀㠀㐀㌀䌀㤀㐀㌀䌀㠀䌀㌀䌀㤀䌀㌀䌀㠀㈀㤀䌀㐀䔀㄀䔀㐀㤀䌀䔀㈀　䈀䘀㐀㠀㄀䔀䌀㔀㜀㜀䘀㔀䐀㜀㤀㈀䔀䈀䌀㠀䘀㜀䌀㠀䘀㜀䌀㤀　䘀䌀㠀䘀㔀䔀㐀㐀㜀㈀䔀㈀䈀㠀㈀㤀㐀㘀㐀㠀㄀㈀䌀㤀㈀㄀䐀䌀㠀㠀䔀㈀䔀㌀䘀㤀䈀㜀㄀䔀䘀䘀䔀䌀㔀㐀䐀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㜀㠀䐀㌀㤀䈀㌀㔀㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀䈀䌀䔀㤀䌀䐀㤀䄀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䘀㔀䄀㘀㌀㜀㘀䈀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀䌀䌀㤀䈀䘀䔀䄀㐀䔀㤀䄀㠀䔀　㐀㘀䈀㜀㠀䄀㠀䄀㘀㐀　㜀䈀㈀㈀㌀䐀㤀㠀㤀䔀䌀㐀㈀㌀㘀㤀　㠀䐀㘀㐀㔀㜀䈀㈀㄀䈀䐀㤀㐀䌀㤀㘀䌀㠀㌀㈀䐀㤀㐀㈀䈀㘀㤀㈀㈀㄀䄀㤀䌀㠀㤀㠀䄀䌀㤀　㔀䈀㤀　㌀䐀䌀㠀㈀䐀䌀㤀㔀䔀㘀㐀㘀䘀䈀㈀　䘀䈀㤀㄀䐀㌀㤀㠀　䐀䌀㤀䔀㄀䌀㐀㠀　䔀㈀㈀㠀㜀㤀　㐀㌀䌀㤀㘀㄀䔀㐀㠀䔀䔀㐀㜀　㜀㈀㄀㜀㜀㈀　㐀䈀㤀㈀䈀㌀㤀㤀㈀㄀䌀㐀䐀䔀䔀㐀䔀㠀䔀㈀㄀䘀㜀㈀㐀䘀㜀㈀㘀䌀㜀㤀㈀䘀䈀㤀㄀䔀㌀䌀㠀䘀㄀䔀㐀　㐀㜀㈀㜀䘀㜀㈀㈀㈀㜀㤀　　㜀㤀㈀　䘀㤀　㔀㜀㈀㄀㈀㜀㤀㄀　㌀㤀㤀㤀㤀䌀㐀㈀㐀䔀㈀㔀　䘀㈀㘀䄀㜀㤀㄀㠀䌀㐀㠀㔀䌀㘀㄀䐀䘀㔀㘀㌀䄀㤀㌀䔀䌀䔀㄀　䄀㜀䈀䈀㠀䌀㈀㄀䔀䄀䔀㌀㐀㤀㄀䔀䌀䔀㄀　䄀㜀䈀䈀㠀䐀㈀㤀䐀㘀㐀㌀䘀㔀㜀䐀㠀䌀䘀㤀㔀㠀　㘀㐀㘀䘀㜀䘀㈀㘀䈀㔀　㤀䘀䘀䐀㔀㐀䐀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㐀䌀㄀䈀㘀䘀㜀䄀䈀㌀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀㠀䔀䔀㤀㌀䄀䄀㘀䔀䈀㤀㠀䄀䔀㘀㌀䈀䄀䘀䔀㔀㤀㤀㤀䄀㘀㤀㘀㜀㘀䄀㌀　㠀㐀㐀㌀㄀㔀㠀㄀㄀䌀䐀㠀䌀㘀䔀䄀㌀㌀䐀䌀㘀䈀㘀䔀䔀䐀䐀䘀㈀䄀䈀㔀䄀㠀䐀㤀　㜀㈀䄀㔀䐀㠀㠀㤀㄀㄀㐀㌀䔀㘀㠀䄀　㔀㘀㈀䄀㄀䈀㠀㐀　㈀㐀㤀䈀㄀䌀　㌀䘀㜀㠀㤀　㜀䌀㔀䌀㌀㄀䈀㠀䘀㠀　㌀㔀㘀㈀䄀䐀㄀㐀䈀㈀㤀㌀㘀䌀䌀㈀㜀䘀㤀䘀㜀䌀䘀䌀䌀㘀　䐀㔀㜀䘀㐀㘀䌀䘀㠀㐀䔀㔀㔀㤀䈀䘀䐀㠀㔀㜀㈀㠀㤀㤀㔀㤀䘀䌀㤀㈀䈀䄀䐀䘀䈀㌀䈀䔀㐀䈀䐀㘀䐀䔀䄀䔀䐀㔀䄀㔀㜀䘀　䌀䔀䐀㈀　䄀㌀㜀㜀䄀䄀㠀䌀䐀㌀㤀䔀㐀㌀㤀䔀㐀㐀㤀㘀㐀㌀䐀䐀䘀䐀㘀㔀䈀䈀㤀㜀㔀　䄀㤀㤀㤀㄀䄀㜀㤀㈀䌀䈀䌀㠀䌀䈀㤀㠀㘀䈀㐀䔀䈀䔀䄀䌀㌀㐀㜀䘀㐀䌀㤀䄀䘀䘀㜀䔀㔀㔀䔀䔀䈀䐀㤀㘀㤀䌀㐀䘀㔀䔀䌀䐀㐀䘀䔀㘀䔀㔀䘀㌀㄀䘀㤀㌀䌀䘀䈀㜀䔀㄀㔀㘀䐀䈀㌀㘀䈀㐀䐀䐀㜀㜀㘀䈀䈀䔀䌀㘀　䐀㐀䈀㜀㈀䔀䐀㠀㤀㘀䔀䌀㐀㔀㔀䐀䄀䈀㌀䐀䌀㐀䘀䔀㌀䔀䐀㤀㠀㘀㜀㄀䔀䘀㜀㈀䐀䌀㠀䔀㜀㤀㤀㤀㤀䈀㜀㘀䔀䈀㐀㔀㔀䄀䄀䌀㤀䐀䈀䔀㤀䈀㘀䔀䐀㌀㠀㈀㌀㤀䘀㜀㘀㌀䘀㤀䐀㤀䘀䐀䘀㔀㜀㘀䘀䈀㜀㤀㘀㈀㔀䘀㤀䌀䘀㤀㘀䔀㘀㘀䐀䐀㔀㠀䐀㠀䐀䌀䄀䐀㘀㔀㘀㌀㜀䐀㤀㠀䄀㠀䘀䌀䐀䐀㜀㌀㘀㘀䄀㈀㠀㈀䐀䘀䈀䄀㜀䄀㈀䘀䔀䘀㘀䈀䈀䔀㔀㘀㌀㠀㌀㜀㘀䔀㄀䌀䄀㄀䐀㄀㄀㔀䌀㄀㄀䐀䌀䔀䔀䄀䔀㠀䄀㘀䄀䈀䐀㐀䌀䈀㐀䘀㈀䌀㤀䐀　㤀㘀㜀䌀㌀㈀㌀㐀㤀㠀䌀䘀㠀㐀㠀㘀䘀㈀㤀㤀䐀　㠀䔀㜀䌀㈀㘀㌀㐀㔀䌀䈀㠀㌀䄀䘀㜀䄀䐀㜀䌀䌀㜀䌀䘀㔀䐀㌀㄀㌀䔀㘀䔀㤀㌀㘀䘀䘀㠀㤀䐀䌀㈀䘀㜀　䌀㄀㘀㔀㤀㈀㄀㤀㜀㠀㠀㠀䌀䈀㄀㌀䐀　䈀㈀䐀㐀㜀䈀㤀䈀㄀㘀㤀㘀䐀䈀㈀㈀䘀㔀䈀䐀䌀㌀㤀䈀䈀䈀䈀㜀㔀䔀䌀䌀㘀䈀㘀䔀䐀䐀䔀䐀㤀䔀㐀㔀㜀䌀㤀㜀㌀䌀㤀　䈀䌀㤀　㔀㘀䔀㔀䌀　㔀㤀㘀㌀　㈀䈀㔀䘀䌀㈀㈀䌀㄀䔀㌀㤀㈀䈀㔀䘀䌀㈀䄀䌀㜀䌀　㤀䈀㌀㔀㠀䌀㈀㈀䌀㤀㘀㌀　㠀䈀㈀㔀䌀䌀㘀㈀　㤀䈀㌀䐀䌀㄀㈀㘀䌀䘀䈀䄀㔀㤀㘀䔀㌀㠀㐀㘀㠀㤀㤀䐀䐀䘀㈀　䐀㘀䈀䐀䐀㠀䐀㌀䌀䐀㐀㘀㠀䐀䐀䘀㜀㄀㘀䘀䐀䌀㐀䌀　㜀㘀䐀䘀㔀㔀㤀䌀㘀䌀䔀㜀㌀䈀䌀䘀䘀䐀䄀䐀㘀䐀㔀㘀㐀㤀䈀㜀䐀䔀䘀㌀䘀㈀䘀㔀㤀䔀㄀㜀㔀䐀㘀䌀㜀㌀㌀㄀㌀䘀㔀䘀䌀䌀䌀䘀㄀㜀䘀㌀䘀㌀䌀㔀䘀㤀䌀䘀㄀㜀䈀䈀㤀䘀䐀䈀䘀㘀䘀䌀㤀㘀　䈀䔀䌀㤀䄀㤀㘀䈀㐀㈀㐀㠀䌀䘀䘀䘀　㤀㤀㔀䌀䐀䈀䘀䘀䘀䘀䘀䌀㠀㠀㔀䐀䌀䄀㜀㄀䈀㈀㤀㐀㈀㌀㜀㘀㈀㤀㐀㜀䔀䌀㔀㈀㠀䔀䐀㠀䄀㔀㄀䌀䈀㄀㐀䈀㌀㤀㘀㈀㤀㜀䐀㈀䈀䈀䈀㠀㔀䈀䄀㜀㤀　㄀㤀㜀㤀㈀䄀䈀㤀㠀䌀䈀䌀㠀䌀䈀㤀䔀㘀䔀㐀䌀䈀㐀䄀䘀㌀䌀㜀䈀㐀䈀㔀㠀䌀䘀䔀㘀䈀䐀䈀㘀䈀䌀㤀䘀㤀䔀㐀䐀㔀䘀䌀㘀㐀㔀䔀㌀䔀䘀䘀㌀㄀䘀㤀㜀䌀㄀䈀㘀䔀䈀㔀㘀䐀㐀㌀䐀䈀㜀䐀䈀㜀䔀㔀㘀䈀䐀䌀䈀　㈀㐀䐀㜀䈀㘀㄀䐀䈀㄀㐀䈀䘀㌀㈀㌀㜀㘀㈀㤀㐀㜀䔀䌀㔀㈀㠀䔀䐀㠀䄀㔀䘀㘀㠀㠀㌀㔀䘀㤀䐀䄀㐀䐀䈀䔀㐀䐀䈀㘀㄀䘀　䌀㤀㘀㌀㈀㐀㜀䐀䈀㜀㘀㤀䌀㤀㄀㐀䘀䈀䈀㤀䘀䌀䔀䌀䘀䔀䘀䄀䈀䈀㜀㔀䈀䌀䈀㤀㈀䘀䌀㘀㜀㄀䈀䔀㘀㌀㄀㄀䌀䈀㄀㐀䈀䐀䈀㐀㘀㌀㌀㘀䔀䈀㜀㄀㔀㄀䘀㤀䈀㈀䘀㌀䘀㘀㈀㤀㜀䔀㘀㐀㜀䔀䌀㔀㈀㠀䔀䐀㠀䘀䌀㜀㜀䐀䈀㜀㠀䌀㐀䈀㘀㔀䐀㜀㄀㜀㜀㘀㄀䈀　㠀䌀㈀䈀䔀䔀㈀䔀㄀㘀䄀䐀䄀䐀㘀䈀䌀㌀㈀䔀䘀㘀㠀㠀㜀㔀㔀㜀㠀㜀　䐀㠀䔀㜀䘀㄀㈀䈀䈀㐀䄀䐀㜀䈀䘀㠀䐀㜀䘀㘀䈀㠀䘀㔀㠀㜀㜀㠀䐀㤀㠀㌀䐀㘀㈀㘀㔀䌀䘀㜀䌀䘀䌀䐀䐀䄀㤀㠀䌀䔀㐀㌀㐀㔀㌀䌀䌀㄀㘀㈀㜀㠀䈀䐀㌀䌀㐀䘀䌀䐀䌀䌀㘀㠀㘀㘀㌀㜀㔀㜀㌀㘀㜀㌀㐀㔀㘀㠀㜀㔀㠀㈀䘀㌀䈀䌀㠀㐀㘀㔀㤀㜀㈀䄀㌀㌀䈀　㘀䄀䈀䐀㤀䈀䘀䄀䈀䐀㤀䈀䘀䄀䈀䘀㤀㠀䔀䌀㠀㘀䄀䘀䔀䌀㘀䄀䈀䔀㤀䈀㔀㔀㘀䈀㌀　䘀㔀㘀㈀㌀㘀　㌀㔀䈀䘀䌀㄀㘀䄀䘀䈀䈀㜀㈀䐀䈀䄀䘀㤀䘀㌀㔀䈀㌀㌀䌀㤀㤀㐀䈀䌀㤀䔀䈀䌀㠀㤀㌀䌀㠀㜀䘀䌀㄀㄀䘀㌀㌀㈀㘀䄀㜀䈀䈀　㈀㘀䌀䘀㘀㌀䌀㠀㜀㤀䔀㐀㐀㤀㘀㐀㤀㔀䄀䌀㤀㌀㜀㌀䌀㠀㠀䌀㜀㐀㘀䈀㔀䄀㤀㌀䄀䘀㘀㤀　䐀㘀䈀㔀䄀䌀㌀㤀䄀䐀㘀䈀　䄀㘀㌀㔀䄀䌀㘀㤀　䐀㘀䈀㔀䄀䌀㌀㤀䄀䐀㘀䈀㐀䄀䐀䌀㤀㐀䔀䈀㤀䔀䄀䄀㘀㈀㈀㜀㠀㌀㘀㜀㠀䐀㌀䘀䔀㤀㔀䐀䘀㘀䄀㈀㤀䘀　䔀䐀㤀㐀㐀䘀㜀䌀㈀䄀䐀䌀㤀㈀㜀㈀䔀䌀䄀㜀㘀䔀㤀䐀㌀㘀䔀䐀䘀㈀㔀䈀㈀䔀䔀㜀㤀䔀䌀䈀䈀㤀䔀㜀㜀㈀㜀㜀㠀䘀㘀䐀䈀㌀㤀㘀㘀㔀䘀㘀䘀㠀㔀䘀䐀䔀䈀㈀㠀㈀䌀䘀䄀㄀㐀䘀䐀䈀䘀㠀㤀䐀䔀㠀㐀䐀㠀䘀䘀䔀　䐀㜀䘀㠀㔀㐀㈀䌀䈀䌀䐀㈀䌀䔀㌀㘀㘀㌀㜀䘀㈀䈀䄀㤀䈀䄀㘀㈀䘀䈀㤀㤀㤀䄀㔀䐀䘀䔀䌀㠀䔀㄀㐀㤀䈀㈀㜀㤀㄀㤀㤀㄀䈀䄀㔀㠀㜀㜀㤀䔀䘀㘀㈀䐀䔀䈀䈀䘀㈀㜀㤀䔀䘀㘀㈀䐀䔀䈀䈀㤀㠀䘀㜀㈀䔀䔀㘀䈀䐀㠀䈀㜀㜀㌀㈀　䄀㈀䐀䈀㜀䈀㐀䐀䌀㘀㤀䈀㜀䔀㐀䔀䔀㤀㘀䘀䈀䐀䌀㔀㠀㘀䘀䈀㈀䐀㤀䘀㘀㜀㜀䄀䔀㤀㜀㌀䈀㤀　㈀䈀䄀㈀㌀㜀䘀㐀䐀㜀㜀㌀䘀㤀㔀䔀䐀㠀䔀㘀㜀䄀㠀㠀㠀㜀䌀㐀㘀㌀㘀㈀䄀㔀㜀㠀㐀䔀䈀䌀䌀㐀㌀㔀䈀䄀㤀䌀䐀㔀䐀䄀㘀㔀䄀䔀㜀㌀䄀㌀䐀㄀䈀㜀䄀䌀㘀㌀䄀䄀㘀㘀䈀㜀㘀㈀㄀䐀㘀㌀㤀㈀䈀䈀㔀䈀㜀㌀䌀㠀㠀䌀㌀䌀㤀㔀㌀㐀㘀㐀䌀䄀㔀䌀㜀㌀㤀㠀㘀䈀㌀䐀㠀䘀㔀䔀䌀䘀㤀㐀㜀䈀䘀㐀䘀䄀䘀䌀䐀㄀䔀䈀㜀㤀㌀㐀䔀䘀䐀㔀䐀㠀㌀䌀㤀㔀㌀㐀㘀㐀䌀䄀㔀䌀㜀㌀䘀㈀㜀㔀䌀䌀䌀䌀䈀㜀䄀　㘀䐀㜀䐀㘀䔀䈀㤀㌀㌀䘀㌀䌀㜀䌀䘀䌀䌀㤀㜀䐀䔀䈀㘀㈀䌀䘀㜀㤀㠀㤀㤀䘀㤀㘀㌀㘀䄀䘀㤀䐀䄀㌀㘀㌀䌀㤀㈀䈀㤀䄀㠀䔀䄀䘀㠀㤀㈀䐀䐀㌀䈀㘀䔀㐀䌀䄀㄀䐀㘀㤀㘀䘀㜀㔀䄀㌀䔀㄀㐀㘀㄀䌀䈀㐀㜀䄀䐀㔀㈀䌀㐀䄀䔀　㈀䈀㜀䔀㠀䔀㄀㈀䄀㜀　䘀㌀㐀䐀䈀䄀䈀㄀䘀㘀㌀㤀㘀㈀䐀㌀㘀㜀䈀㠀䈀㤀䘀㘀䈀㠀㌀㤀䐀㜀㌀䔀䌀㜀㔀䐀㤀㠀㠀䘀㌀㘀䔀㘀㠀䔀㤀䈀䈀䈀䌀㔀䘀䐀㤀䘀㜀㠀㄀䐀䘀　㔀䔀䐀䔀䄀䈀䈀㘀㜀䐀䈀䘀㌀䌀䈀䘀䈀㈀䐀㤀䘀㘀䐀㐀㔀䈀䈀㠀㤀䔀䐀䌀䔀㘀㌀㜀䌀㠀㠀䌀㌀䌀㤀㤀䄀䌀䈀㔀㤀䈀䌀䔀㠀㐀㘀䌀䐀䐀㠀㈀䄀㤀䌀㔀㤀䘀㜀㠀㐀䌀㐀䄀㤀䔀㐀㜀㜀䔀䌀䈀㔀䐀㜀䘀䐀㠀㌀㘀䈀㘀㌀㠀䔀䐀䌀㤀㜀㤀㘀䈀䘀㈀䈀㘀㤀䔀䈀㜀䔀䔀㤀㄀㐀㌀㔀㠀䌀䄀㤀　㜀䌀㌀䄀㈀㌀㐀䘀㈀㘀㘀䈀䔀䐀䄀㘀䐀䐀㤀䄀㠀㜀㌀　䈀㔀䘀㠀㄀㌀㠀䘀㐀㤀䌀㤀䘀㌀㐀㠀䈀㜀䔀㘀㈀㄀䘀㤀㤀䄀㠀㜀䔀㐀㘀䈀㄀䔀㤀㈀䄀䘀㜀㤀㐀㠀䈀䔀䔀㘀㈀㄀㘀䐀㘀䈀䈀㘀䘀㌀䘀㜀㜀　㔀㜀㄀䔀䈀㘀　䔀㘀䐀㄀䐀㈀㌀㔀䄀㌀㘀㜀䈀䌀㔀䌀㔀䔀㤀䔀䔀䄀䘀㘀㈀㌀㌀㈀㄀䐀䐀䈀㌀䐀䌀㤀㤀䐀䌀㜀㌀㈀㘀䘀㜀㤀䌀䔀㤀䔀䔀䈀㄀䔀䐀䐀䌀䐀㘀㌀㌀䔀䌀㔀㈀䔀㘀䈀㜀㈀䔀㘀㠀䘀䘀㄀䐀㤀䐀䐀㘀㄀䈀䔀䌀㜀㌀䈀䌀䘀䈀䘀䔀䐀㠀㐀䐀䔀䐀䄀䘀䘀䈀㘀㠀䈀䐀䌀㔀㌀䐀䘀㌀㠀㜀䘀㌀䘀㠀㔀㤀䄀㄀䘀㔀䈀㘀䘀　㠀䌀䈀䘀㌀䐀䌀㈀䘀㘀䄀㠀䈀㜀䘀　㠀㠀㄀䈀䘀䘀䈀㔀㔀䘀䐀㌀䘀㤀䔀䈀㌀㌀䘀䌀䘀㔀㄀㤀䘀䘀䐀䈀䐀䔀㐀䘀䘀㘀䐀㜀㘀㜀䘀㠀䔀䈀㌀㌀䘀䔀㄀㜀㤀䄀㌀㘀䌀㈀㔀䘀㤀䘀䔀㄀䄀䘀䌀䘀䘀㠀㘀䘀㤀䄀䈀㘀䔀㜀㤀　䔀㔀㠀䘀㠀䐀㤀㜀䘀㐀䌀㤀㔀㄀㄀䈀㄀㘀䈀㤀䔀䘀䌀㌀㜀　䔀㘀䈀䄀䈀㜀㜀䈀䔀䐀㘀㈀㜀㌀㌀䔀㜀㤀㈀䈀㔀㤀㈀㌀䄀䘀䈀㄀㘀㜀䈀䌀㜀䈀㐀㜀䌀㜀䔀㜀䈀㜀㘀㘀㤀㈀䌀㜀㤀㈀䈀㌀䌀㤀　㔀䔀㐀䌀䐀䔀㐀㔀㜀䌀㤀㜀㤀䔀㐀䈀㤀㌀䌀䔀䔀㤀㠀䔀㠀㘀䌀㜀㜀䄀䈀䔀㈀䌀㘀䄀䐀㈀䘀䈀㘀㠀䌀㘀䐀㤀㤀㘀䌀䌀䘀㠀䈀㔀䐀䄀䐀䘀㄀䔀䔀㜀䌀　㌀䄀㜀㈀㐀䐀䌀㐀㠀䐀䐀㘀䐀㘀㌀　㔀㘀䌀㜀㠀䈀䘀䄀㐀䔀䐀㜀䐀㤀䘀㐀㈀䔀䈀㜀㈀䘀㜀䌀䄀䐀㐀㈀㔀㘀㜀㘀㤀䌀䈀䐀䐀䔀䈀㘀䐀㘀䔀䐀䐀䌀䄀䄀䐀㘀㌀䘀㌀㔀䈀㔀㔀㔀䄀㘀䄀㄀㈀䐀㄀㤀䔀㘀㔀䌀䘀䈀䌀㤀㘀䘀㌀䌀䐀㤀㤀㘀㔀䄀䐀㤀㜀䐀䈀䘀㌀䈀㤀㄀䘀䈀㐀㔀䔀㘀㔀䘀䘀㔀㘀䈀䘀㠀䈀㜀䘀䌀㜀㠀㠀　　㤀㜀䐀㠀㌀㌀䌀㌀㠀䘀䈀䘀㔀䈀㌀㈀䔀䐀㘀㌀䄀䘀㔀㠀䐀䌀䐀㤀㜀㜀㈀㄀䔀䌀䔀㔀㈀䄀　䔀䐀㤀㤀䌀㐀㜀㈀䔀㈀　㘀㜀㤀㈀䌀㜀㤀㈀㠀㘀䈀㐀䔀㜀㜀䐀㘀㄀㈀䘀䄀㘀䔀㘀㤀㌀㜀㔀㌀㈀㈀㌀㤀㜀㤀　㐀䈀㐀㤀䘀䈀㠀䄀䐀　㈀䐀䌀䈀㤀䐀䈀䘀䐀䄀䘀㘀㤀㠀䘀䌀䐀㄀䐀䘀㜀㔀䈀㜀㈀䄀㄀䌀㤀㄀䄀㈀㐀㌀㔀㠀　㤀㜀䈀　䄀㄀㄀䘀㘀　䔀　㜀㠀㠀㠀䔀䔀㄀䌀　㜀　䄀　㈀㠀㔀㄀䔀㄀䄀㘀䈀䌀䔀㤀㌀㔀䐀　䔀㄀㄀　䈀㘀㘀㠀　㠀㐀䈀㄀䘀䐀㈀㌀㘀㌀䄀㐀㈀㌀㠀㜀㐀䔀㌀㜀㜀㐀䌀䔀䌀㜀㤀䔀㜀㠀䌀䘀䈀䌀㐀㜀㘀㘀㈀㔀䄀䔀㄀䄀㘀㠀䔀㐀䐀㤀䐀㠀䘀㘀䔀䈀㠀䈀㜀䄀㤀䐀㈀㜀䌀㜀㈀䔀㤀䄀㄀㤀㘀䘀䔀䔀㄀　㈀䈀䐀䈀㈀䈀㈀㜀㌀㠀䘀㈀㔀㌀䐀㔀䘀䐀䔀㘀䄀䄀䘀䄀䐀䔀䈀䐀䈀䄀䌀䔀䐀㌀䘀㘀㤀䌀　㌀㔀㠀㌀㌀䄀　䐀㤀㤀㌀㄀䔀䌀䌀䔀䔀㄀䄀䐀㌀䈀䌀䘀㄀䔀䘀㄀䔀　䌀㠀㌀䔀䈀䈀䌀䐀䐀䐀䘀䐀䘀㄀㌀㄀㐀㌀䘀㜀㌀䄀㜀䘀䔀䌀䘀㌀䘀䈀㠀䐀㄀䔀㜀䘀䘀㄀䘀䔀㘀䈀　䔀㤀䌀㌀　㘀㤀䌀㔀㄀㐀㜀㄀䘀　䄀㄀㠀㜀䐀䌀㜀㈀㜀㠀䘀㌀䘀㐀㤀㤀䈀㘀㜀䘀㘀䌀㜀䈀㐀㔀㜀㈀㤀㔀䈀㠀㐀㄀䐀䌀㘀㘀㔀䘀㤀㌀㘀䌀㜀㠀㄀㔀䘀㜀㤀㐀㔀㠀㈀䐀㔀䔀㄀㐀䄀䘀㘀䌀䘀䄀㔀䄀㔀䔀䘀㘀㤀　㜀䐀㘀㐀㜀䘀䘀䈀䄀䄀㘀㐀䈀㠀䐀䌀㔀㔀䔀䔀㈀㄀䌀㜀䌀䄀　㤀㜀㈀㤀㈀㤀䌀㈀㘀䄀㜀䌀䈀㈀䘀䌀䈀䄀䘀䌀㤀㄀㌀䔀㐀㈀㤀㜀㈀䄀䔀㔀䌀㈀　㄀㜀䌀䄀　䈀㘀㐀㈀㈀㈀䘀㤀㄀㤀㤀㔀䌀㈀㄀䄀䘀㤀㄀㌀㜀䌀㤀㌀䈀䔀㐀㌀䐀䘀㈀䘀䔀㠀䐀㄀㔀䘀䄀㤀䔀㤀㌀㈀䘀䌀㤀䐀㜀䔀㐀䐀䈀㤀䈀㔀㐀䔀㠀䔀䈀㔀㤀䔀㠀㔀䈀㄀㠀㔀　㄀㠀䈀䄀䈀㄀㐀㘀䐀䘀䌀㐀䌀㈀䔀㐀䄀　㤀㌀䔀䈀㈀㄀㠀㌀䌀䔀䄀䔀㠀㜀　䌀䐀䌀䐀㤀㜀㜀㤀㜀䄀　䌀㄀䘀㔀㤀　䘀㘀㜀㠀䈀㌀㌀䐀㘀㐀䐀　䔀㐀㜀䄀䌀㠀䄀　㤀䈀䔀䈀㈀㄀㠀㌀㘀㘀䐀㜀㐀㌀䐀䄀㈀㌀䐀　䘀㘀㤀　㐀㄀䐀㤀䘀㔀㤀　䘀㘀㌀㠀䈀㐀㌀䐀㘀㐀䐀　䔀䄀㜀䄀㐀㠀㜀䈀㌀㐀䐀䄀㄀䔀㌀㈀䐀　䄀䔀㠀㜀　䌀䐀䌀䘀㠀㄀䈀㔀㄀㄀　䈀䈀㄀䔀䐀㈀㔀䐀㈀㌀㄀䔀㔀㐀㠀㈀㈀䐀㔀䐀　䘀㄀㤀䘀㐀㜀㐀㌀䐀㘀㐀䐀　䌀䈀䘀㔀㤀　㐀㄀㘀䘀䐀㜀㐀㌀䐀䄀䔀㌀䐀㘀䘀㘀㤀　䌀㄀䐀㘀䄀䔀㠀㜀䈀㐀㐀㜀䄀䘀䔀䐀㈀㄀䐀䐀㄀㔀䔀䄀䘀㘀㄀㠀㄀䔀䔀㐀㜀䄀䌀㠀䌀　㠀䐀　㌀㌀㈀㌀㠀㄀㠀䔀㈀㜀䄀䌀㠀䌀　㠀䐀　㌀㌀㈀㌀㐀㜀　䔀㌀㠀　　䌀　䈀㜀㘀㜀㐀㌀䐀䄀㐀䈀䈀䔀䔀㤀䌀䔀䈀䌀䄀㘀䐀　䘀䔀㤀䄀䔀㘀㠀䔀㜀㌀㠀䈀㜀㌀䐀㘀㐀㌀　䐀㈀䘀㔀㤀　㠀㄀㄀䈀䈀㔀㘀㔀㔀㐀䔀　䌀㘀㘀䈀㜀㄀䌀㜀䈀䌀䔀䐀㈀㄀㠀㌀㜀䐀㔀䌀　䘀㘀㤀㠀䘀㜀䌀䐀䈀㐀㌀　㘀䔀㌀㔀䐀　䘀㘀㤀㠀䘀㜀䘀䐀䈀㐀㌀　㘀㄀㌀㔀䐀　䘀㘀㤀㜀䈀　㄀䐀䈀㐀㌀　㘀㤀㌀㔀䌀　䘀㄀㤀㄀䌀䔀㐀㜀䄀䌀㠀㘀　䈀㈀䔀䈀㈀㄀㠀㌀㈀㤀䄀䔀㠀㜀　䌀䄀㘀䈀䄀㄀䔀㌀㈀㌀㠀䐀㠀䘀㔀㤀　㠀㄀㜀䈀㐀䔀㤀㤀㄀㘀䈀㠀㜀㄀㐀㈀　䔀　㤀　䔀㜀㔀㌀䐀㘀㐀㜀　㤀㠀䔀䈀㈀㄀㠀㌀䌀㌀㔀䐀　䘀䔀㤀㐀㘀㔀㄀　㠀㠀䔀㜀　䐀㜀䌀㄀　㜀䐀㌀䐀䐀㜀㔀䘀　䌀㄀㤀㄀䔀䔀㌀䄀䘀㠀㘀　㐀㘀䘀　㐀㔀䐀㜀㐀㌀䐀䄀㔀䔀䌀㘀䘀㘀㤀　䘀㄀㔀䄀䐀㜀㐀㌀䌀㘀䔀䈀㔀䌀　䘀㄀㤀䈀䘀䔀㜀㜀䄀䌀㠀䘀㠀㜀䐀䐀㜀㐀㌀䐀䄀䐀䔀䌀㜀䘀㘀㤀　䘀㄀㜀䄀䐀㜀㐀㌀䌀㘀㄀䘀䈀㤀㄀䔀䈀㈀㈀㈀㔀䌀　䘀㔀㤀㤀㄀䄀䔀㠀㜀䄀䌀㄀㐀㔀䌀　䘀㔀㤀㈀㤀䈀䄀㄀䔀䈀㈀䐀㈀䌀㄀䘀㔀㤀　䈀㘀㤀䘀䈀㈀㌀䐀䄀㐀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䘀㔀㌀䘀㈀㐀䄀䈀㈀　㠀䄀䐀㄀䔀㈀㘀㠀䈀㄀㄀　㔀㄀㄀㈀䘀䐀㐀㠀䌀㠀䈀㠀㜀䘀䈀䌀㤀䐀䐀㠀䘀㘀䘀䘀㔀䄀㔀䐀㠀㌀䄀㠀㐀　䐀㔀䔀㔀㈀㈀㔀㔀㤀㜀㌀䈀㔀　㜀㔀䈀㤀㈀㌀㔀㔀㤀㜀㌀䈀㔀㄀㜀㔀䈀㤀　䈀㔀㔀㤀㜀㄀䈀䄀㠀䈀䄀䐀䌀㐀㠀䐀㔀䔀㔀䄀䔀㔀㐀㔀䐀䔀䔀㐀㘀䐀㔀䔀㔀㘀㘀䄀䄀㈀䔀㤀㜀䄀㠀䈀䄀㔀䌀䄀㘀䔀䄀㜀㈀　䈀㔀㔀㤀㜀㔀䈀䄀㤀䈀䄀㄀䌀㔀㈀㜀㔀㔀㤀㔀㄀㜀㔀㌀㤀䄀㘀䔀䄀㜀㈀㠀㔀䄀䄀䌀䈀㔀䈀㔀　㜀㔀䈀㤀　㜀㔀㔀㤀㜀䈀㜀䄀㐀䔀䄀㜀㈀㈀䘀䄀䄀㈀䔀䘀㜀䄀㘀䔀䄀㜀㈀㄀䘀䄀䄀㈀䔀㘀䘀㐀㜀䐀㔀䔀㔀　㄀㔀㐀㔀䐀䐀䔀㤀䔀䄀䄀䌀䈀　㌀䄀㤀䈀䄀㌀䌀㠀㠀䄀䄀䌀䈀㐀㌀䄀㠀䈀䄀㌀䌀㤀㐀䄀䄀䌀䈀䌀㌀䄀㠀䈀䄀䈀䌀㈀㌀㔀㔀㤀㜀㠀㜀㔀㌀㜀㔀㜀㤀㄀㜀䄀䄀㈀䔀㠀䘀䄀　䔀䄀䘀㈀䄀䔀㔀㐀㔀䐀㄀䔀㐀㤀䐀㔀䔀㔀䐀㄀㔀㐀㔀䐀䐀䔀㤀䐀䄀䄀䌀䈀㘀㌀䄀㠀䈀䄀䈀䌀㈀㜀㔀㔀㤀㜀䘀㜀䄀㘀䔀䄀䘀㈀㔀㠀䄀䄀㈀䔀䔀䘀㐀㜀䐀㔀䔀㔀㜀㄀㔀㐀㔀䐀㄀䔀㐀䘀䐀㔀䔀㔀　㤀㔀㐀㔀䐀䐀䔀㤀䘀䄀䄀䌀䈀㄀㌀䄀㤀䈀䄀㜀䌀　　㔀㔀㤀㜀　䘀䄀㐀䔀䄀䘀㈀㄀㜀䄀㠀䈀䄀㌀䌀㠀㤀䄀䄀䌀䈀　㜀㔀㄀㜀㔀㜀㤀㌀㈀㔀㔀㤀㜀䄀㜀㔀　㜀㔀㜀㤀㈀䄀㔀㔀㤀㜀　䘀䄀㘀䔀䄀䘀㈀㌀㐀䄀䄀㈀䔀㄀䘀䔀㈀䄀䄀㈀䔀㔀㜀䔀䌀䈀䔀䄀䐀㜀㐀䄀䄀䐀㠀䈀䔀䄀㌀䐀㈀䈀㤀㘀㈀䘀㜀㜀　䄀㔀㐀䈀䌀㔀䔀䔀䔀㄀㐀䄀㐀㌀䌀㔀䔀䔀䔀㄀㐀䄀㘀㌀䌀㔀䘀㘀㄀䐀㤀㔀䄀㘀㠀䄀䐀䐀䌀㌀㤀㔀㘀䔀㄀㔀䈀䈀㠀㜀㈀䈀䌀䐀㄀㔀䐀䈀㜀㜀㔀㐀䈀䄀㔀㜀䔀䌀㜀䔀䄀䔀㤀㐀㈀䄀㜀㘀㌀䘀㔀㜀䌀䄀㄀㔀䐀䈀㠀㌀㔀㐀㠀㈀㠀䄀䐀䐀䐀䈀䘀㘀䈀䘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䘀㔀㌀䘀㈀㌀㘀䈀䘀㌀㜀㔀　䐀　䄀䄀㈀䄀䘀䔀㠀㄀䔀䘀䐀㈀　㔀䄀㄀㄀㔀䐀㄀㄀㔀䐀䈀㤀䈀㄀䈀䐀㈀㘀䈀䄀㈀䔀䈀䄀㈀㄀䈀䄀䌀㤀䌀䐀㘀㌀䔀㜀㈀䐀㠀㠀䌀㘀䔀㠀䄀㈀䔀㠀㘀㈀䘀䈀䌀㠀㐀䈀䄀㈀㐀䈀䔀䌀㔀㈀䔀䄀㔀㄀㈀㘀㌀䄀㐀㐀䌀䈀䄀㈀㘀㔀䄀㈀㜀㌀㜀㐀㜀㔀㜀㐀䈀㔀䔀㠀㄀㈀㔀䐀㄀䈀㔀䐀㈀䈀㄀䄀䄀㈀䔀䈀䄀㌀䔀䈀䔀䐀㤀䌀㌀㜀㐀㘀㌀㜀㠀䄀䄀䔀䐀㄀㈀䐀䐀㄀㈀䐀䄀㈀㈀㤀䈀䄀㌀䐀䈀䄀㐀㌀䐀㠀㈀䐀㄀㐀㔀䐀䔀䌀䘀䄀㄀䄀㠀㔀㄀㐀㌀㈀㜀䄀䐀䐀㈀䐀䌀䐀䘀䔀㜀㘀㐀䘀㐀㜀䔀䈀䔀䐀䔀䐀㐀㈀䈀㐀㌀㈀䘀䄀䐀　䐀䔀䐀㌀㘀㐀㤀㜀䘀䄀㐀䌀㈀䌀䔀㈀　䄀㔀䈀䈀㤀㈀䄀㔀䄀㘀㔀䐀㜀䘀㔀㔀㄀䘀㐀㤀㄀㜀䐀㤀㐀䘀䐀㘀㜀䔀䘀㈀䈀㠀㠀㜀䔀䄀㈀㄀㐀㜀㜀㠀䈀䈀䈀䌀㜀䄀㔀䈀㠀㄀䌀　㜀㜀㄀㐀䈀㄀䌀䌀㘀㌀䄀㠀䔀䔀㈀㈀䐀䔀㈀㄀䔀㜀㄀䄀䘀㜀㠀䄀䈀䈀㠀㐀䘀䐀䌀㌀㜀䐀䔀䌀㘀㈀䐀㈀㜀㜀䄀䐀䐀䄀䔀㐀㄀㐀㐀㘀䘀㐀㘀㘀䘀䐀䄀㜀㔀䈀䐀㄀㔀䈀䐀㘀㔀䐀㜀䘀　㐀䔀䘀㐀㠀䔀㔀䐀䔀㘀㔀䘀䄀㌀䈀䘀䐀䄀㘀䐀㔀䔀㄀㜀䄀䐀㄀㌀㄀䐀䄀㌀䘀㜀䄀㌀䘀㜀㐀㔀䄀㜀䔀㠀㐀㌀䈀䈀　㔀㤀䐀㘀㌀㄀㤀㄀㜀㐀㐀㐀㌀䐀䌀㌀㄀䔀䔀㈀㠀䈀䄀䌀㘀㤀䐀䔀㌀㈀䔀䄀㈀㈀㤀㘀䔀㠀䌀䈀䈀　䄀䈀䈀㌀䘀㐀㔀㘀㐀䔀䘀㘀䘀㠀䔀㔀䈀㘀㌀㘀㔀㌀㜀䄀㄀㄀㈀㘀䘀㄀㤀䘀㜀㠀䌀㜀䈀䌀㜀㔀䈀䐀䈀䘀䈀㌀䈀㐀㜀㘀䘀㐀㐀㘀䘀䐀㠀㜀㔀䈀䌀㄀㜀䈀䐀㘀㜀䐀㜀䘀㄀㐀㄀䘀㐀㠀㄀㔀䐀䌀㜀㐀㜀䈀㄀㄀　䌀㔀䈀㠀㄀㠀㜀㜀㄀　㄀䐀䔀㌀㐀䔀㜀㄀㈀㜀䈀䈀䐀䌀㠀㘀䈀㠀䌀㄀䘀䐀䐀㘀㠀㔀䔀㤀䘀㘀㠀㠀䈀䔀㔀㐀㈀䌀㄀㌀㔀㜀㠀䄀䔀䈀䌀㐀㈀䐀䔀㈀㐀䔀㜀㄀䄀䘀㜀㠀㐀　䘀䌀㔀䄀㌀䌀㈀䄀㤀䔀㄀　䄀䈀䌀㐀䘀㌀䔀㈀㘀㔀䘀㄀㠀㘀㜀㠀㔀㜀㜀䌀㈀　　䈀䈀㈀㠀䈀㘀䌀㤀㘀䄀䐀䈀㈀㈀㈀㜀䈀䌀䈀㜀䔀㜀㈀䄀　䐀䌀㐀㄀㠀䔀㤀　䄀㌀䔀㔀㔀䔀㜀㈀㤀䌀㌀䌀㔀　㐀䔀㤀㔀㠀㜀䌀䈀䄀㌀䔀㐀㐀䌀㌀㤀㔀䈀㤀䔀㈀䌀㐀䘀㤀㌀䘀㌀䔀㔀䈀㤀㜀㈀㤀㄀䈀䌀㔀　㔀䔀㈀䌀䔀䈀㜀㈀䈀㤀䈀䌀㐀䄀䐀䔀㈀　㘀䘀㤀㌀㜀㜀䌀䈀䘀䈀䔀㐀㠀㌀䘀㈀㈀㄀䘀㤀㤀㠀㜀䌀㐀䄀䄀䔀㤀㘀㈀䘀䌀䄀㔀㜀䔀㐀㄀䄀䈀㤀㔀㘀䄀䔀㈀䘀㜀㐀㈀㠀㌀㐀㄀㘀㐀䄀　㔀㔀㔀䔀㠀㔀㄀䔀㠀㔀㌀䔀㠀㔀䘀㄀㠀㔀䌀㄀㠀㔀䔀䐀㠀䈀㔀䈀　㐀㜀㘀㄀㘀䌀㘀㄀㐀㈀㘀㄀㔀㈀㘀㄀㤀䄀䄀䈀㔀㌀㄀㈀䐀䐀䔀䄀䔀䄀㤀㐀㤀　㔀䐀䌀㠀　㘀䈀㈀㤀㄀㘀䌀㈀㈀䈀䈀㤀㄀䌀䐀㘀㐀㜀㜀䈀㈀㐀䌀　㘀㘀㐀㈀䈀㄀㤀㤀㈀㤀䄀㠀䌀䌀㠀㤀㠀䄀䌀㤀　㔀䈀㤀㈀㌀䐀䌀㤀㔀䔀㘀㐀㘀䘀㜀㈀㈀䈀㜀㈀㘀䈀䈀㈀㈀䘀䐀㤀㠀䘀㄀䌀㐀㐀　䔀㈀㘀㠀㜀㤀　㐀㌀䌀㤀㘀㄀䔀㐀㠀䔀䔀㐀㜀　㜀㈀㈀㜀㜀㈀㄀㜀㜀㈀　㐀㌀㤀㤀㈀㄀䌀㐀㔀㠀䔀㈀㘀㜀㜀㈀㜀䘀㜀㈀㄀䘀㜀㈀㔀䌀㜀㤀㌀㄀㌀䌀㠀㠀㤀䔀㐀　㄀䔀㐀㈀㐀䘀㈀㈀　㜀㈀㌀㈀㌀㤀㠀㔀㤀䌀㐀䄀㄀䔀㐀䌀㐀䔀㈀㌀　䘀㈀㄀　䘀㈀㔀　䘀㈀㌀　䘀㈀㜀㠀䘀㈀　䄀㜀㤀㌀㐀㜀㤀㈀㌀㌀䌀㠀㈀䘀㤀㈀㐀㜀䈀㤀㠀䌀䐀㜀㤀㈀䔀䈀䌀㠀䘀㜀䌀㠀䘀㜀䌀㤀　䘀䌀㠀䘀㔀䔀㐀㐀㜀㈀䔀㈀䈀㠀㈀㤀㐀㘀㐀㠀㄀㈀䌀㤀㈀㄀䐀䌀㠀㠀䔀㈀䔀㐀㔀㐀䈀䐀　㈀㤀㘀㠀㄀㐀㈀㈀㘀㠀　䄀䈀䄀㠀䈀㠀䔀㔀㐀㤀　㘀㤀䄀　㜀㘀㐀䌀䐀㜀㐀　　㜀㄀㔀䐀㄀㈀䐀䐀㠀㌀㈀䐀㠀㐀䄀㤀㐀䄀㤀　㔀䄀㌀㠀㈀㜀䔀㐀㄀㌀䘀㄀㄀　㔀㠀㌀㠀㈀㘀㄀㈀㈀　䔀㜀㘀　䌀㜀㘀㄀㈀㌀䐀䄀㤀䘀　䈀㈀㄀㔀䈀㔀㔀䐀䈀㘀䄀㘀䄀䄀䌀䈀㌀㘀䐀㐀㜀㌀䐀㤀㤀㘀㐀䄀㈀䔀䐀䈀㔀㄀䌀㌀㘀㔀䘀䈀㘀　㔀㈀㜀　㤀㐀㄀㠀㄀㐀䄀䘀㠀䐀㌀䘀㄀　䄀㌀䔀㌀䘀㔀㤀㔀㠀䔀㘀㈀䌀䘀㜀䘀㜀㤀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀㤀㠀㐀䔀㌀　㤀䐀㘀　㌀䄀䌀㄀㜀㐀㠀㈀䔀㤀　㐀䐀㌀　㤀䄀㘀㄀㌀㐀䌀㈀㜀䐀䔀䘀㐀㘀㘀㐀䐀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀　䐀䐀㌀㌀㔀㐀䌀䐀㜀㌀　㔀䐀䌀㌀㜀㐀䌀䐀㤀䈀䐀䔀䄀䌀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㘀㈀䈀䄀㠀䄀䔀㤀㈀䄀䄀㘀䄀䈀㤀㠀䄀䔀㜀䄀䐀㌀㤀䈀㌀㔀㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀㌀　㘀䐀䈀䌀䔀㤀䌀䐀㤀䄀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䌀㔀㜀㐀㠀䄀䔀㤀㄀㐀䐀㌀㈀㤀䄀㘀㔀㌀㐀䌀䄀㜀㤀㠀㐀䔀㌀㄀㤀䐀㘀㈀㌀䄀䘀㔀䄀㘀㌀㜀㘀䈀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀　䌀䐀㌀㄀㤀䄀㘀㌀㌀㐀䌀㘀㜀㤀㠀䌀䔀㌀　㤀䐀㘀㄀㌀䄀䌀㌀㜀㐀㠀㘀䔀㤀䔀䌀䈀㌀㌀㈀㌀䐀䘀䐀㘀㠀䐀㄀㔀䘀㐀䌀㈀䐀䐀䌀䐀　䈀㄀䈀㄀䘀㌀㤀㜀㄀䈀䔀䔀㘀㤀㠀䄀㤀䄀䈀䘀㔀䔀䘀䄀㜀㔀㐀䈀䈀䘀㜀　䈀䔀㜀䔀䄀䄀㌀㈀䈀䌀䌀㜀　㔀㌀䐀㔀䘀䐀䄀㘀䄀䌀䌀䐀㘀㤀㜀㘀䔀䘀㌀㘀䔀䘀䘀　㌀　㜀㔀䌀㌀㔀䄀㠀䌀㌀㤀　䔀㤀䌀㌀䔀䔀㄀㠀㄀䔀䔀䌀㜀䌀䐀䌀㠀㠀　㜀㐀㘀䘀㘀䐀䔀䔀䐀䈀㐀䐀䐀㄀䘀㄀䈀㌀㌀㜀㠀䄀䘀㠀㔀㘀㌀㤀䘀䐀䈀㘀䘀䐀㐀䘀㠀㠀䈀䘀㘀㜀䘀䔀㌀䌀　㜀㄀㤀㌀㤀㘀㐀䘀㔀䔀㜀䘀䘀　䈀㐀㐀㌀㘀䔀㌀䄀䈀䌀䔀㤀㔀䘀䘀㔀䘀䐀㜀䔀㔀䘀䌀㜀䘀㠀䘀䘀䘀䈀㌀䄀䌀㘀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀㜀㤀㔀㤀㔀䔀㤀㘀㤀㜀䔀㔀㘀㔀䐀㤀䘀䈀䄀㤀䌀䘀㈀㤀䄀㠀䌀䘀䐀㤀㐀䘀㐀㠀䄀㤀㐀㐀㄀䘀㌀㄀㐀䔀㄀䌀㈀㠀䄀㘀㠀䄀䌀㌀䌀㔀㔀㄀㘀㈀䄀㘀㤀㠀㈀䐀㐀䔀㄀㘀䄀㜀㠀㤀䘀㤀䔀㈀㔀䌀䈀㄀㐀㠀㔀䌀䘀㠀㔀䘀㜀㜀㘀㠀䈀㜀㘀　㘀䔀㤀䌀䐀䄀㤀䌀㄀㜀㘀㜀㌀㘀䌀䘀㠀㠀㤀㜀䐀㤀㌀䌀㤀㌀㤀䌀㐀䘀㤀䔀䌀㔀䘀䐀　䈀䔀㈀䌀䈀㘀䌀㤀䔀㄀䐀㔀䘀㘀䔀䘀㌀㄀䌀䄀㘀䘀䘀㠀䐀䔀㤀㜀㌀䌀㤀㘀䘀㤀㄀　䈀㤀㤀䘀䘀㌀䌀䄀㘀䌀䘀㘀㜀㤀䔀㘀䘀㌀㌀䈀䐀㠀㠀䔀㤀䘀䘀㘀䌀䔀䘀䐀䔀㘀㌀䔀䐀䌀䄀䔀䔀䌀㈀㠀䔀䐀䘀䈀㤀䔀䘀　㘀㤀䄀䌀㈀㠀䌀㌀䐀㌀䐀䔀㌀䄀㘀㌀㐀㐀䐀䐀㌀㄀㐀㈀㠀㐀䌀㈀㤀䄀㐀㤀㐀䐀㈀㌀㐀䄀㐀㄀㐀㘀㠀㤀䄀䄀㘀㤀㐀䄀㘀㤀㐀㠀㘀㈀㐀　䌀㘀㄀　㠀䘀㠀㌀㄀䈀㘀䌀㜀㘀䘀㜀䈀䘀䌀㜀䔀䈀䘀䐀䘀䔀㌀䘀㜀㘀䈀䄀䘀䈀䐀䐀㘀㔀䔀㘀䈀䄀䘀䔀䐀䘀㄀㜀㠀㌀䌀䈀㘀䌀㜀㌀㘀㠀㠀㈀㈀㠀㐀㄀　㐀㈀　㠀㈀㄀㠀㐀㄀　㐀㈀　㠀　㄀　㈀㠀㐀㄀　㐀㔀　㠀㈀㄀㠀㐀䐀㈀㄀㐀㐀㈀䔀䘀䘀䐀㔀䌀㈀䈀㠀㔀㤀㘀㌀䘀㈀䄀㌀㔀㜀䘀䌀䌀㄀䘀䘀䔀䔀㌀㜀䔀䈀㔀䌀䘀㌀䐀䘀䈀㤀䌀䔀䈀䈀䈀䐀㘀䌀䘀䌀䈀㄀䘀㔀㤀䈀䄀䈀䄀㈀㜀䘀㐀䄀㐀㤀䔀䐀㈀䐀㌀㜀䄀㐀㘀䌀䘀䌀䔀㜀㜀䘀㐀䐀䈀䄀䔀䌀䘀㜀㤀㤀䘀䘀㌀㔀䔀㜀䈀㐀㄀㈀䘀㌀䔀㜀㜀㘀㌀䄀䔀㤀㜀㔀䌀㔀䘀䐀㘀㈀䈀㜀䄀䐀㔀䔀㜀䄀䘀䈀㤀䘀䘀䘀䄀㜀䌀䌀㜀㤀䔀㤀䄀䘀䈀㘀䔀䄀䔀㠀䘀㠀䐀㠀䐀㌀䐀㌀㔀䘀䈀䌀䈀㜀㌀㠀䈀䘀㤀㤀㜀㜀䔀䈀䘀䌀㌀䘀㠀　䈀䔀㌀㤀䘀㄀㤀㔀䘀㌀㄀䈀䔀㘀㘀㜀䌀䐀㌀䘀㠀䘀㘀䘀㄀䈀䐀䔀㌀㠀㜀䌀㜀㐀䘀㠀䔀㤀䘀㄀䈀䈀䘀㌀㈀㄀䔀䌀㘀䌀䈀䘀㠀䄀䐀䘀㄀䈀䈀䔀㌀㠀䘀䌀㘀㜀䘀㜀䌀䘀䌀䄀㜀䌀㘀㜀䘀㜀㘀䘀䌀㄀㜀䌀㘀㜀䘀㜀㤀䘀䌀䐀㜀䌀㘀㜀䘀㘀䈀䘀䌀䘀㜀䌀㘀䘀䘀㜀　䘀䌀㐀䘀䌀㘀㌀䘀㌀㜀㌀㄀㌀㘀㌀㄀㌀䐀䘀㄀䄀㔀㄀㌀㐀䘀㐀䘀㠀䌀㈀㘀䈀䔀㘀㈀䔀㈀䈀䐀㄀㌀㔀䘀㌀䐀䘀㄀㜀㔀㄀㌀䐀䘀㌀㠀䘀㄀㠀㄀㠀㤀㘀䘀㤀䐀䘀㠀䘀　䌀㐀㜀㜀㐀䔀㜀䌀䘀㜀䌀㐀㈀㜀㈀㘀㌀䔀㌀䐀䘀㄀䌀㌀㄀㌀㈀䈀㈀㜀䐀㘀㐀䐀㘀䌀㤀㤀䐀㠀㌀㤀䈀㄀㜀䘀䔀㈀䔀㠀䌀㐀䔀㤀㠀㤀　䈀㄀㌀䐀㜀㈀㘀䔀㈀㐀㐀㤀䐀䈀㠀㌀䐀㜀㄀㜀䘀䔀㈀㐀㜀㈀㜀㜀䔀㘀㈀䔀㈀䄀㜀㈀㜀㜀䔀㘀䔀䔀㈀㄀㜀㈀㜀㜀䔀㘀㔀䔀㈀䐀㜀㈀㜀㜀䔀㘀㜀䔀㈀䘀㜀㈀㜀䘀䔀㘀㠀䔀㈀㐀䘀㈀㜀䘀䔀㘀䌀㜀㈀㜀䌀㜀㈀㜀㘀䘀㈀㤀䐀㤀㌀㠀䈀㈀㘀㤀㜀㐀䌀䈀䔀㜀䈀䘀㈀㜀䐀㤀㌀㔀䘀㌀㌀䘀㤀䘀㔀㤀㌀䐀䘀㌀㐀䘀㤀䌀㄀䌀㤀㘀䘀㤀䈀䘀䌀䌀㠀䔀㐀㜀㜀㐀䐀㜀䔀䌀䘀䔀㐀䄀㜀㈀㘀㔀䘀㤀䌀㔀䌀㌀㘀䈀㤀㜀䄀㜀㈀䌀㌀䔀㐀䐀㘀䌀㤀䐀䐀㤀㌀　㜀㈀㜀㠀䘀㐀䘀㤀䔀㤀䐀䈀䌀㌀㐀㜀㤀㘀㌀䈀㈀㤀䈀䈀䌀㌀㤀㜀㤀㘀㜀䘀㈀䌀㄀䔀㐀㠀䘀㐀䐀䘀䔀䔀㐀䔀㐀䌀䘀㐀䌀䘀䔀䘀䌀䔀㐀㈀䘀㐀䐀䘀䔀䔀䄀䔀㐀㘀䘀㐀䔀䘀䔀䔀䔀䔀㐀㄀䘀㐀䌀䘀䔀䘀㄀䔀㐀㘀㜀㈀㜀㌀䘀㌀䘀㌀㔀㌀㤀䘀㔀㠀䔀䄀㤀㈀䘀㤀䈀㜀䄀㜀㘀䔀䄀㔀䐀㔀㌀䔀䘀㤀㤀䘀䄀䌀䄀䄀㤀䔀㜀䄀㜀䐀䔀㌀䘀䘀㔀䌀䐀㔀㌀㄀䘀㤀䄀䘀䄀㠀䔀䄀㤀㠀䘀㐀䔀㜀䐀㘀䌀䔀䄀䔀㌀㔀㌀㈀䘀㐀䌀㜀䐀㘀㘀㘀䄀䌀㔀䐀㐀㤀䄀䄀㤀㐀䐀㔀㌀䐀䈀䄀㜀䘀㘀㐀䔀㄀䐀㤀䔀㌀䄀㌀㤀㜀㔀㘀䔀䔀䄀䌀䄀㔀㐀㤀㠀㈀䄀㔀㌀䈀㜀䄀㘀䔀䔀㐀䔀㌀䐀㤀䄀䘀䄀䘀㄀䄀㤀㤀䘀㤀䄀䘀䄀䐀㤀䄀㤀㔀䘀㤀㠀䘀䄀䔀㔀䄀㤀㔀䘀㤀䈀䘀䄀䄀䐀䄀㤀䐀䘀㤀䈀䘀䄀䌀㌀䄀㤀㌀䘀㤀㤀䘀䄀䐀䌀䘀㐀䐀㠀䘀㐀䘀㐀䘀㐀㤀㜀㐀䔀㌀䘀㌀䐀㌀䐀㤀䄀䘀䔀㠀䄀䔀㤀䘀㜀㐀䔀㜀䘀䘀㔀䘀㐀䐀㜀㐀䐀㜀䘀䔀㌀䘀㐀　㜀䄀㘀䈀䘀㜀㔀䘀䄀䌀㌀䐀㌀䐀䘀㌀㤀䘀䐀䐀䐀䐀㌀㤀䘀㤀㠀䘀䔀䘀㐀䘀㐀　䘀㐀䘀䄀䘀㤀䌀㔀䔀㌀㜀䈀䐀㘀㔀㜀䄀䔀㜀䘀㐀䘀䔀䔀㤀䄀㌀䐀㌀䄀㜀䄀㜀㈀䘀㐀䌀㔀䘀㤀䈀㠀䔀䐀㌀㜀㔀䘀䄀䘀㘀䘀㐀䘀䐀䔀㤀㄀䘀㤀䐀䘀䔀㠀㤀䔀㤀㤀䘀㤀䔀䘀䔀䈀㤀䔀㤀㔀䘀㤀䌀䘀䔀㤀㔀䔀㤀㔀䘀㤀䘀䘀䔀㤀䐀䔀㤀䐀䘀㤀䘀䘀䔀䄀㌀䔀㤀㌀䘀㤀䐀䘀䔀䈀㌀㤀㤀䘀㄀㤀㤀䐀㤀㤀㤀㜀㜀䌀䔀㈀䌀㤀䄀㔀㤀㌀㈀䘀㌀䔀䔀㤀㤀䘀㜀䌀䐀㜀䌀䌀䐀䌀䌀䐀㜀䌀䘀㜀䌀䐀㌀䌀䌀　㜀㘀㜀䈀䔀㘀䐀䔀㘀㈀㌀㌀㌀䐀䘀㌀㔀䘀㌀㌀䐀㌀㌀㤀䘀㤀䄀㜀㤀㜀㄀㘀㘀䐀㤀䌀䌀䔀䄀㤀㤀　䐀㌀㌀㔀䈀㘀㜀㜀㘀䌀䘀㄀䌀㤀䌀㌀㤀㌀䔀㜀㌀㜀㘀䔀㘀䐀㈀䌀䌀㠀䐀㤀㤀㘀䔀䔀㘀䔀㘀䌀䌀㤀䐀㤀㤀　㜀㌀㌀㌀䘀㌀㘀䘀㌀㤀㌀㌀㌀㌀䘀㌀㌀䘀㌀䘀㌀㌀㌀䈀䘀㌀㐀䘀㌀䄀䈀㌀㌀䈀䘀㌀㤀䘀㌀䈀䈀㌀㌀㜀䘀㌀　䘀㌀䌀㜀㌀㌀㤀䘀㤀䐀䘀㤀䘀䌀䔀䌀䔀㐀䔀䌀㌀䈀㘀㘀䈀䘀㘀䌀䘀㘀䐀㤀䐀㤀㜀㜀䌀䐀䈀䔀㘀㜀䘀㘀㈀䈀㘀㜀㤀䘀㤀䘀㜀䐀䘀䘀䔀䌀㌀㜀䌀䘀㜀䔀㘀㠀䘀㘀㌀䈀㘀㘀㌀䘀㌀䄀䘀䈀䈀㄀䐀㤀㠀䘀䌀䘀䈀䔀㌀　䘀䈀㤀㤀䐀㤀㄀㔀䈀㌀㘀䈀㘀㘀㌀㜀䌀䐀㘀䔀㤀䘀䐀䐀㌀䈀㜀䈀㜀㠀䘀㘀䔀㐀䔀䌀䈀㤀䐀㤀㈀䈀䈀㌀㘀㄀䈀㘀䌀䌀䐀䔀㤀䄀䈀䐀㌀䈀䘀䈀㘀㠀䘀㘀䌀㜀㘀㜀㜀䘀㘀䄀䘀㘀㘀㜀㘀㜀㜀䘀㘀㄀䘀䔀䄀㐀㤀䌀㤀䘀䄀䄀䄀㜀㘀㜀㜀㐀㔀㘀䘀䘀㠀㘀䈀䔀㐀㌀䈀䘀㔀㐀䘀䘀䄀㘀䈀䔀㔀㌀䘀䘀㤀㘀㜀䔀㤀㤀㜀䔀䈀㤀㌀䔀䄀䐀䌀䘀䔀㠀㈀㈀㔀䐀䄀䌀䌀䘀䔀䄀䐀䘀䐀㘀㤀㄀㌀䔀䄀㜀㐀䈀䘀㐀䔀䘀䔀㠀䈀䈀䘀㐀䔀䘀䔀䄀㔀㜀䔀㠀䐀䘀䐀㌀㜀㜀䔀䈀䐀䘀䐀㜀䘀㜀䔀㠀㌀䘀䐀　䘀㜀䔀䄀㌀䘀䐀㐀䘀㜀䔀㤀䐀㜀䔀䄀䘀㌀䘀䄀㐀䘀䘀㐀䔀䈀䘀㐀㤀䘀䔀䄀䐀㜀䔀䈀㌀㜀䔀㠀䘀䈀䘀㔀㤀䘀䔀㤀㌀㜀䔀䄀㌀䘀䐀㜀㘀䘀䐀㈀㜀䘀䄀㄀䐀䘀䄀䌀䘀䘀㔀㈀㌀䘀䄀　䘀䘀㐀䄀㌀䘀䄀㠀䐀䘀䄀㈀㄀䘀䐀㈀㜀䘀䄀䈀㄀䘀䐀㘀㜀䘀䄀㜀㄀䘀䐀㄀㜀䘀䄀䘀㄀䘀䐀㔀䘀䘀䄀　䐀䘀䄀㤀䘀䘀㔀㄀䈀䘀㐀䈀䘀䘀㤀㌀㜀䔀㐀䌀䘀䘀䈀㌀㜀䔀䈀㜀䘀䔀㄀㜀䘀䐀㄀䔀䘀䐀䄀䘀䘀䄀㜀㄀䘀䐀㔀䔀䘀䐀㠀㐀㜀䔀㔀㈀㌀䘀䄀㔀䐀䘀䄀㜀㈀䘀䔀㠀䘀㜀䔀䈀䄀㜀䘀㔀　㜀䘀㐀㐀㔀䘀䐀㐀㄀䘀䐀㠀䌀䈀㌀䔀㌀䌀㘀䔀㠀䄀㤀䘀㤀䐀䘀㘀　㌀䐀㜀䘀㌀䐀㤀䄀䐀　㐀㤀㤀䐀㔀㈀㤀㌀㌀　㌀㈀　㌀㈀㌀㌀㌀㌀　㌀㈀　㌀䄀㌀㈀䘀㔀㄀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　㌀㈀　㤀㈀㌀㤀㌀㌀　䘀䄀㈀䄀䘀䐀㘀䄀䘀䐀䌀㜀䘀䄀㌀㔀㘀䄀㄀㈀㐀㘀㈀㘀㘀㄀㘀㐀㄀㈀㐀㘀㈀㘀㘀㄀㘀㐀㄀㈀㐀㘀㈀㘀㘀㄀㘀㐀㄀㈀㐀㘀㈀㘀㘀㄀㘀㐀㄀㈀㐀㘀㈀㘀㘀㄀㘀㐀㄀㈀㐀㘀㈀㘀㘀㄀㘀㐀㄀㈀㐀㘀㈀㘀㘀㄀㘀㐀㄀㈀㐀㘀㈀㘀㘀㄀㘀㐀　㘀㐀㘀㘀㘀㘀　㘀㐀　㘀㐀㘀䘀䘀㔀䄀䈀䘀㔀㔀䘀䘀㠀䐀㜀䔀㤀䈀㜀䔀䈀䈀㜀䔀㠀㜀㤀䄀㤀㌀㤀㄀㌀㤀㄀㤀㤀㤀㤀㌀㤀㄀㌀㤀㄀㤀㤀㤀㤀㌀㤀㄀㌀㤀㄀㤀㤀㤀㤀㌀㤀㄀㌀㤀㄀㤀㤀㤀㤀㌀㤀㄀㌀㤀㄀㤀㤀㤀㤀㌀㤀㄀㌀㤀㄀㤀㤀㤀㤀㌀㤀㄀㌀㤀㄀㤀㤀㤀㤀㌀㤀㄀㌀㤀㄀㤀㤀㤀㤀㌀㤀㄀㌀㤀㄀㤀㤀㤀㤀㌀㤀㄀㌀㤀㄀㤀㜀䐀䘀㈀䘀㄀㠀䔀㈀䘀䐀㔀㘀㔀䈀䄀㔀䌀㔀㜀䔀㠀㐀䈀䈀䄀㔀㈀㔀㜀䔀㤀㘀䄀㜀䐀㔀㤀䐀㜀䔀㠀㔀䄀㔀䐀䄀㜀䔀䈀㜀㔀㠀㌀㘀䔀䐀㐀㐀䐀䈀䄀㔀㤀䈀㜀䔀㠀㈀䈀䈀䄀㔀㔀䈀㜀䔀㤀㜀㘀䐀䐀䄀㄀㌀䈀㜀㔀㤀㜀䔀䔀䐀㘀㌀䐀䈀䄀㔀㜀䘀㜀䔀㤀㜀䔀㌀䐀䄀　　㜀䘀㔀㤀　㄀䔀䐀㘀㈀㌀㜀䄀㔀㐀㠀䘀䔀㤀㜀㄀㌀䐀䄀㄀㈀㜀䘀㔀㤀㐀㤀䔀䐀㘀㌀㌀㜀䄀㔀㘀㔀䘀䐀㔀㜀㌀㜀䄀㔀䔀㈀䘀䔀㠀㐀㔀䈀䐀䄀㐀㤀㜀䘀㔀㠀䄀㔀䔀䐀㔀㘀䈀㜀䄀㔀䐀㄀㜀䐀㘀䈀㌀䐀㄀䄀　䄀䐀㐀㘀㐀䐀䐀䄀㘀㤀䐀㘀䄀㈀䈀䐀㔀㘀㄀䐀䘀㐀䄀㘀䈀䔀䄀㘀䈀㜀䘀㐀㜀㔀䈀䐀䄀䐀㘀䘀䔀㠀㄀䐀㜀䐀㔀㌀䔀䘀䔀䄀㌀䐀䈀䐀䄀䘀㘀䘀䔀㤀　㌀㜀䐀䄀㠀㠀䘀䘀㐀㐀㜀䔀㘀䘀䈀䐀䌀㔀㜀䔀䄀㔀㜀㄀㄀䐀㤀　䐀㈀㈀䈀䈀㐀㄀㘀㐀㌀㜀㠀㠀䔀䌀　㘀㤀㄀䌀䐀䘀㜀䌀䘀䘀㔀䘀㌀䘀䄀㄀㜀䘀㌀㔀䐀㌀㈀䄀㘀㐀䘀䄀㤀㔀㌀㘀㈀㠀㤀㔀㌀㘀㈀㠀㤀㔀㌀㘀㈀㠀㤀㔀㌀㘀㈀㠀㤀㔀㌀㘀㈀㠀㤀㜀䘀㈀䘀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀㠀㈀䈀㤀㘀㌀䌀䈀㌀㌀　䄀㔀㐀䈀㄀㘀䔀㤀㘀㈀㜀䐀㔀㘀䔀㜀䐀䌀㌀䐀䘀㘀㈀㔀㔀䘀䘀㠀　䐀㐀㜀䔀䘀㄀䈀㤀䈀㤀䄀䐀㌀䘀㌀㠀㜀䌀㘀䐀䔀㌀䐀䔀㜀䐀䐀䌀䘀㠀䌀䈀䐀㜀䘀䘀㐀䐀㐀㘀㠀㜀䄀䔀䌀㘀㌀䄀㌀䐀㤀䐀㄀㜀䈀䌀㘀㌀䔀㌀䔀䘀䄀䄀䄀䐀㄀　㜀䌀㘀䐀㘀㠀䘀㌀䔀㌀㠀䘀䄀䔀㐀䐀㠀䄀㄀䐀㄀䐀㈀䈀㤀㌀㔀䌀㠀䐀㐀䘀㠀䐀㤀䔀㜀㌀䔀㌀䈀䘀㜀㄀䔀㤀䘀㜀䈀㘀㈀䄀㌀㈀㜀㌀㘀䘀䄀䘀䘀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀䘀㌀㘀㜀㜀䄀䘀㌀䐀㠀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䌀㌀㐀㘀　䐀㄀䈀㈀䐀䔀䌀䘀㠀㔀㈀㔀䐀䄀㘀䌀䈀㜀㔀㠀㔀䈀䔀䄀㐀㈀䈀㜀㔀㤀㔀䄀䔀䐀㘀㤀㜀㜀㔀㠀䐀䄀䔀䐀㔀㜀㔀䈀䄀㔀䔀㌀㜀䔀㠀㐀㘀䐀䐀䄀㐀㤀䈀㜀㔀㠀䈀䈀䔀䄀㈀㔀䈀㜀㔀㤀䈀㘀䔀䐀㜀㄀䐀䈀䄀㔀㌀㜀㜀䔀㤀㘀䔀䐀䐀䄀㌀㜀䈀㜀㔀㤀䘀䔀䔀䐀㜀　㌀㜀䄀㔀　　䘀䔀㤀㘀㄀㌀䐀䄀㈀㐀㜀䘀㔀㤀㠀㄀䔀䐀㜀㄀㌀㜀䄀㔀㈀㐀䘀䔀㤀㘀㤀㌀䐀䄀㌀㘀㜀䘀㔀㔀㔀㌀䐀䄀㜀䔀㜀䘀㔀㠀㈀㔀䔀䐀㐀㐀䈀㜀䄀㔀㤀䄀䘀䔀㠀㔀㔀䈀䐀䄀㘀䐀㜀䘀㔀㠀㘀㈀䔀䄀䌀㘀䄀䐀　㔀㘀䄀㌀㈀㘀䔀䐀㌀㐀㘀䈀䐀㄀㔀䔀䄀䈀　䔀㜀䄀㔀㌀㔀䘀䐀㌀㔀䈀䘀䄀䈀䄀䐀䔀䐀㘀㌀㜀䘀㐀㠀䔀䈀䔀䄀㤀㜀㜀䘀㔀㤀䔀䐀䔀䐀㜀䈀㜀䘀㐀㠀㄀㌀䔀䐀㐀㐀㜀㌀䄀㘀䘀䄀㌀㠀㘀㠀䐀㤀䄀䌀㜀㌀㘀㘀䄀䐀㠀䄀㠀㘀㄀䄀㌀㠀㘀㠀䐀㄀䄀㌀㘀㘀䄀䐀㠀䄀㠀㘀㄀䄀㌀㠀㘀㠀䐀㄀䄀㌀㘀㘀䄀䐀㠀䄀㠀㘀㄀䄀㌀㠀㘀㠀䐀㄀䄀㌀㘀㘀䄀䐀㠀䄀㠀㘀㄀䄀㌀㠀㘀㠀䐀㄀䄀㌀㘀㘀䄀䐀㠀䄀㠀㘀㄀䄀㌀㠀㘀㠀䐀㄀䄀㌀㘀㘀䄀䐀㠀䄀㠀㘀㄀䄀㌀㠀㘀㠀䐀㄀䄀㌀㘀㘀䄀䐀㠀䄀㠀㘀㄀䄀㌀㠀㘀㠀䐀䄀䌀㈀㜀㄀䈀㌀㔀㘀䌀䐀㐀䈀　㔀㄀䘀㌀䌀㐀㐀㘀㐀䘀㘀䌀䘀㐀㌀㘀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䘀㤀䐀㌀㌀䌀㌀䌀䈀㘀㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀㠀㔀㄀䐀㔀䘀䄀䄀䌀䈀㜀㐀䈀㤀䄀䔀䐀　㤀㜀㜀㐀䄀㔀䄀䔀䐀㈀䐀㔀䘀䄀䈀㈀䄀䔀䐀㄀䈀㔀䈀䄀㐀䔀䐀㜀䔀䈀　㘀䐀䐀䄀㠀㤀䈀㜀㐀䈀㌀㘀䔀䐀㄀㔀㜀㜀㐀䄀䈀㘀䔀䐀㌀䔀䐀䈀䄀㐀㌀㜀㜀䔀䄀㈀䔀䐀䐀䄀䐀㜀䈀㜀㐀䄀䘀䔀䔀䐀㌀䘀䐀㜀䄀㐀　　䘀䔀䄀㈀㄀㌀䐀䄀䌀㐀㜀䘀㐀䄀㠀㄀䔀䐀㌀䔀㌀㜀䄀㐀㈀㐀䘀䔀䄀㈀㤀㌀䐀䄀䐀㘀㜀䘀㐀䄀䌀䈀䔀䄀䄀䔀㜀䘀㐀䈀䌀㔀䔀䐀　㠀䈀㜀䄀㐀㤀㈀䘀䔀䈀㄀㔀䈀䐀䄀䄀䐀㜀䘀㐀䈀䄀䐀䔀䐀　㐀㘀㄀㜀䐀㘀䈀㘀䐀㔀䄀㠀㐀㤀㌀䈀䌀䐀㔀䄀䈀㐀䐀㜀䄀䄀㠀㌀䐀䔀䐀㐀䐀㜀䘀㐀㤀㘀䈀䔀䄀䔀䈀㜀䘀㔀　䐀䈀䐀䄀㌀㘀䘀䔀䄀㔀䐀䈀䐀䄀㜀䘀㜀䘀㔀㈀䐀㜀䐀䄀　　䘀䘀㔀㤀㄀䌀䔀䐀䈀㈀㠀䈀　㔀㄀㜀㠀㘀䌀䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀　㔀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀䈀　㔀㄀㘀　䄀㌀䌀　㐀㘀㠀㄀㠀䐀　㈀㄀䈀㔀㤀㐀㤀㌀㘀　䄀㘀䌀㄀㐀䐀㠀㈀㠀㌀䌀䈀㄀䐀㄀㄀㌀㄀䈀䈀䐀　䐀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀䐀㄀䘀䌀㌀㤀䐀䔀㌀䔀䈀㘀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀䈀㈀㔀㄀䌀䈀㐀㘀　䈀㌀䈀䈀䔀㔀㐀㤀㜀䔀㤀㜀㈀㔀䐀䄀㄀㈀䘀䔀㤀㐀䄀㔀䐀䄀㔀䄀䈀䘀㔀㘀㔀㔀䐀䄀㌀㘀䈀㜀㔀㤀䐀䄀䔀䐀㜀　䐀䈀䄀㔀㄀㌀㜀䔀㤀㘀㘀䐀䐀䄀㈀䄀䘀䔀㠀㔀㘀䐀䐀䄀㘀䐀䈀㜀㔀㠀㜀䔀䔀䐀㐀㔀䐀䈀䄀㔀䈀䘀㜀䔀㠀㔀䔀䐀䐀䄀㜀䘀䈀䘀㔀㠀　㄀䔀䐀㐀㐀㌀㜀䄀㔀㠀㠀䘀䔀㠀㔀㄀㌀䐀䄀㘀䌀㜀䘀㔀㠀㐀㤀䔀䐀㐀㔀㌀㜀䄀㔀䄀䌀䘀䔀㠀㔀㤀㜀䐀㔀㔀䌀䘀䔀㤀㜀㤀䈀䐀䄀　㄀㜀䘀㔀㤀㈀㔀䔀䐀㘀㈀䈀㜀䄀㔀㔀䄀䘀䔀㤀㜀㔀䈀䐀䄀㄀㠀䐀　㘀㔀䐀㔀㠀䔀㄀䄀㠀㐀㤀㌀䈀䌀䐀㔀䄀䈀㐀䐀㜀䄀䄀㠀㌀䐀䔀䐀㐀䐀㜀䘀㐀㤀㘀䈀䔀䄀䔀䈀㜀䘀㔀　䐀䈀䐀䄀㌀㘀䘀䔀䄀㔀䐀䈀䐀䄀㜀䘀㜀䘀㔀㈀䐀㜀䐀䄀　　䘀䘀㔀㤀㄀䌀䔀䐀䈀䄀㠀㘀㔀䄀㌀䘀㘀䈀㄀㠀䐀㔀䄀㌀㘀㘀䄀䐀㤀䄀㠀㘀㔀䄀㌀㤀㘀㠀䐀㔀䄀㌀㘀㘀䄀䐀㤀䄀㠀㘀㔀䄀㌀㤀㘀㠀䐀㔀䄀㌀㘀㘀䄀䐀㤀䄀㠀㘀㔀䄀㌀㤀㘀㠀䐀㔀䄀㌀㘀㘀䄀䐀㤀䄀㠀㘀㔀䄀㌀㤀㘀㠀䐀㔀䄀㌀㘀㘀䄀䐀㤀䄀㠀㘀㔀䄀㌀㤀㘀㠀䐀㔀䄀㌀㘀㘀䄀䐀㤀䄀㠀㘀㔀䄀㌀㤀㘀㠀䐀㔀䄀㌀㘀㘀䄀䐀㤀䄀㠀㘀㔀㈀㌀㘀䈀䌀㠀㐀㘀㈀䐀㄀䈀䈀㔀㘀䌀䐀㐀㌀䔀䈀㄀䐀㄀㄀㌀㄀䈀䈀䐀　䐀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㘀㠀䘀䔀　㐀㠀䘀㠀䘀㘀䐀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㘀㠀㘀㄀䌀㜀㤀㜀䔀䄀㌀㈀㔀䐀䄀䔀㈀䈀䘀㐀㈀㔀㔀䐀䄀㤀䄀䈀㜀㐀䈀㔀䈀䔀䄀䌀㘀䈀㜀㐀䄀䐀䄀䔀䐀㌀䘀㔀䈀䄀㐀㄀㌀㜀䔀䄀㈀㘀䐀䐀䄀䌀㔀䈀䘀㐀㄀㔀䐀䐀䄀䄀䐀䈀㜀㐀䈀䈀䔀䔀䐀　㤀䐀䈀䄀㐀䈀㜀㜀䔀䈀㄀䔀䐀䐀䄀䈀䘀䈀㜀㐀䈀䘀㄀䔀䐀　㠀㌀㜀䄀㐀㠀　䘀䔀䈀㄀㄀㌀䐀䄀䄀䌀㜀䘀㐀䈀㠀㤀䔀䐀　㤀㌀㜀䄀㐀䄀㐀䘀䔀䈀㄀㤀㌀䐀䄀䈀䄀䘀䔀䄀㌀㤀㌀䐀䄀䘀㄀㜀䘀㐀䄀㈀㔀䔀䐀㈀䌀䈀㜀䄀㐀㔀䄀䘀䔀䄀㌀㔀䈀䐀䄀䔀㌀㜀䈀㐀䐀㄀䄀　䄀䐀㈀䔀䄀䌀㜀㌀䐀㈀㐀䔀䈀㌀㄀㘀䔀䐀䈀㔀䔀䄀䄀　㌀㜀䘀㔀㌀㔀䈀䐀䄀㔀䄀䘀䔀䈀㘀䐀㜀䐀㐀㌀䔀䘀䔀㠀㤀䈀㜀䄀㔀㜀䔀䘀䔀㤀㜀䐀㜀䐀㐀䈀㄀䘀䔀㠀㐀㌀㜀䐀䄀㐀䘀㌀㌀㘀㠀䄀㘀䌀㄀㐀㄀䘀䐀䈀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㤀㄀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㘀䌀㄀㐀䐀㤀㈀㠀䈀㈀㔀㄀㘀㐀䄀㌀䌀㠀㐀㘀㔀㘀㠀䘀㠀䐀㈀㈀㄀䈀㐀㔀㌀㘀㠀䄀㐀䘀㘀䌀䘀㐀䌀㐀㐀㘀㘀䘀　㌀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㤀䄀㌀䘀䈀䈀䐀㌀㘀㌀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㔀䄀䐀㠀䘀㄀䄀㔀䈀䄀㐀䌀㤀㜀䔀䈀　䄀㜀䐀㐀㤀㔀㜀䔀䄀㈀䄀㔀䐀䄀䐀㈀䘀䔀䈀㄀䄀㔀䐀䄀䈀䔀䈀㜀㐀䈀䐀㘀䔀䐀　㠀䐀䈀䄀㐀㤀㌀㜀䔀䈀㄀㘀㜀䐀㐀㔀䈀㜀䔀䄀㌀㘀䐀䐀䄀䔀㌀䈀㜀㐀䄀㜀䔀䔀䐀㈀䐀䐀䈀䄀㐀㜀䘀㜀䔀䄀㌀䔀䐀䐀䄀䘀　㜀䘀㐀䄀　㄀䔀䐀㈀䌀㌀㜀䄀㐀㐀㠀䘀䔀䄀㌀㄀㌀䐀䄀䔀㈀㜀䘀㐀䄀㐀㤀䔀䐀㈀䐀㌀㜀䄀㐀㘀䌀䘀䔀䄀䄀䈀㜀䄀㐀䔀䌀䘀䔀䈀　㔀䈀䐀䄀㠀㤀㜀䘀㐀䈀㈀㔀䔀䐀㄀䄀䈀㜀䄀㐀䐀䄀䘀䔀䈀　䐀㘀䐀㌀㐀㘀㠀䄀䈀㔀㄀㄀㜀㔀㘀䈀䈀䐀㌀䄀䌀㐀㔀㜀䈀䄀䐀㌀䄀䔀㠀㐀䐀㜀䐀㐀䐀㘀䘀䔀㤀䔀䈀㜀䄀㔀䈀䐀䘀䐀　㌀䈀䘀䄀䄀㘀䐀䔀䐀㔀㜀䈀㜀䄀㔀䘀䐀䘀䐀㈀　㜀䘀䄀㔀　㄀䘀䔀㤀䈀䌀㠀䐀㄀㈀㄀䈀䄀㔀䌀㜀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㔀㄀㘀㈀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀㄀㈀㄀䈀㈀㔀㌀㘀㐀䄀㘀䌀㤀㐀䐀㠀㈀㠀䈀㄀㤀㄀㜀㔀㘀㌀䄀㌀䌀㐀㐀㘀㠀㤀㠀䐀䐀㈀㄀㜀䌀䘀㐀㘀㔀䘀䐀㐀㤀䘀䔀㌀㤀䈀䐀䘀䐀㤀㄀䐀䌀䘀䌀䐀䔀䘀䔀䌀䌀䔀䔀㜀䔀㘀䘀㜀㜀㐀㤀㜀䔀䔀䐀㘀㌀䐀㌀䔀䈀䘀䘀㜀䈀㤀䘀㤀㄀䐀䐀䘀䘀㜀䐀䌀䘀䌀㔀䔀䔀䘀㜀㜀㜀䐀䌀　䘀㔀㐀㄀㌀䐀䄀㐀㠀㜀䐀䐀㜀䘀䌀㐀䘀㔀㔀㄀䘀㜀㄀䌀㜀㌀㜀䐀䐀䌀䘀㔀　㤀㌀䐀䄀㤀䄀㜀䘀㐀䈀㐀㤀䔀䐀㄀䈀㌀䘀㌀㄀䐀䘀䐀䈀㘀䔀䈀㜀㌀䐀䔀䔀㜀䈀䌀䐀㜀㔀䔀䐀　㠀䈀䌀䘀䌀䐀㐀䘀䔀　㈀㔀䐀㜀㤀㜀䘀㔀㠀䄀㔀䔀䘀㔀䘀㤀㘀䈀䔀䔀䈀䘀㌀䔀䐀䘀㈀㜀㌀䘀䌀㜀䘀㜀䌀㐀㠀䔀㔀䘀　㐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀㌀㠀㜀䘀㜀㘀㜀㐀㠀䘀䔀䐀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀䔀㌀䌀㈀㠀䔀㈀䘀䐀㔀㘀㔀䈀䄀㔀䌀㔀㜀䔀㠀㐀䈀䈀䄀㔀㈀㔀㜀䔀㤀㘀䄀㜀䐀㔀㤀䐀㜀䔀㠀㔀䄀㔀䐀䄀㜀䔀䈀㜀㔀㠀㌀㘀䔀䐀㐀㐀䐀䈀䄀㔀㤀䈀㜀䔀㠀㈀䈀䈀䄀㔀㔀䈀㜀䔀㤀㜀㘀䐀䐀䄀㄀㌀䈀㜀㔀㤀㜀䔀䔀䐀㘀㌀䐀䈀䄀㔀㜀䘀㜀䔀㤀㜀䔀㌀䐀䄀　　㜀䘀㔀㤀　㄀䔀䐀㘀㈀㌀㜀䄀㔀㐀㠀䘀䔀㤀㜀㄀㌀䐀䄀㄀㈀㜀䘀㔀㤀㐀㤀䔀䐀㘀㌀㌀㜀䄀㔀㘀㔀䘀䐀㔀㜀㌀㜀䄀㔀䔀㈀䘀䔀㠀㐀㔀䈀䐀䄀㐀㤀㜀䘀㔀㠀䄀㔀䔀䐀㔀㘀䈀㜀䄀㔀䐀㘀䘀㘀㠀䄀㌀㐀㄀㔀䈀㠀䐀㤀䄀㜀㐀㘀㄀䌀䐀䈀㌀㄀㘀䔀䐀䈀㔀䔀䄀䄀　㌀㜀䘀㔀㌀㔀䈀䐀䄀㔀䄀䘀䔀䈀㘀䐀㜀䐀㐀㌀䔀䘀䔀㠀㤀䈀㜀䄀㔀㜀䔀䘀䔀㤀㜀䐀㜀䐀㐀䈀㄀䘀䔀㠀㐀㌀㜀䐀䄀㐀䘀㌀㜀㘀䔀䌀䐀㠀䈀㄀㜀䈀㘀䌀䌀㜀䘀㤀㌀䘀䌀䘀䘀䘀䐀　䌀䘀䔀㤀䘀䘀䐀㐀㌀䘀䐀㌀㌀䘀䐀㜀䌀䘀䔀䈀㔀䘀䌀䌀㜀㜀䌀䔀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀䐀㠀䈀㄀䄀㌀㄀㔀㘀㌀䌀㜀㠀䔀㄀䐀㌀䈀㜀㘀䔀䌀㤀䔀䘀䌀䈀䘀䐀䄀㄀㌀㄀䈀䈀䐀　䐀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㘀㠀䘀䔀䈀䌀䌀䔀㠀䘀㘀䐀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㘀㠀㘀㄀䌀㜀㤀㜀䔀䄀㌀㈀㔀䐀䄀䔀㈀䈀䘀㐀㈀㔀㔀䐀䄀㤀䄀䈀㜀㐀䈀㔀䈀䔀䄀䌀㘀䈀㜀㐀䄀䐀䄀䔀䐀㌀䘀㔀䈀䄀㐀㄀㌀㜀䔀䄀㈀㘀䐀䐀䄀䌀㔀䈀䘀㐀㄀㔀䐀䐀䄀䄀䐀䈀㜀㐀䈀䈀䔀䔀䐀　㤀䐀䈀䄀㐀䈀㜀㜀䔀䈀㄀䔀䐀䐀䄀䈀䘀䈀㜀㐀䈀䘀㄀䔀䐀　㠀㌀㜀䄀㐀㠀　䘀䔀䈀㄀㄀㌀䐀䄀䄀䌀㜀䘀㐀䈀㠀㤀䔀䐀　㤀㌀㜀䄀㐀䄀㐀䘀䔀䈀㄀㤀㌀䐀䄀䈀䄀䘀䔀䄀㌀㤀㌀䐀䄀䘀㄀㜀䘀㐀䄀㈀㔀䔀䐀㈀䌀䈀㜀䄀㐀㔀䄀䘀䔀䄀㌀㔀䈀䐀䄀䔀㌀㜀䈀㐀䐀㄀䄀　䄀䐀㐀㘀㐀䐀䐀䄀䔀㤀䌀㈀䌀䄀㄀㜀䔀䐀䈀㔀䔀䄀䄀　㌀㜀䘀㔀㌀㔀䈀䐀䄀㔀䄀䘀䔀䈀㘀䐀㜀䐀㐀㌀䔀䘀䔀㠀㤀䈀㜀䄀㔀㜀䔀䘀䔀㤀㜀䐀㜀䐀㐀䈀㄀䘀䔀㠀㐀㌀㜀䐀䄀㐀䘀㌀㌀㘀䌀䄀㘀䌀㤀㐀㄀䘀䐀䈀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀㤀㤀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㘀䌀㤀㐀䐀㤀㈀㠀䈀㌀㔀㄀㘀㘀䄀㌀䌀䌀㐀㘀䐀㘀㠀䄀㠀䐀㌀㈀㄀䈀㘀㔀㌀㘀䌀䄀㐀䘀㘀䌀䘀㐀䌀㐀㐀㘀㘀䘀　㌀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㤀䄀㌀䘀䄀㤀䌀䈀㘀㌀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㔀䄀䐀㠀䘀㄀䄀㔀䈀䄀㐀䌀㤀㜀䔀䈀　䄀㜀䐀㐀㤀㔀㜀䔀䄀㈀䄀㔀䐀䄀䐀㈀䘀䔀䈀㄀䄀㔀䐀䄀䈀䔀䈀㜀㐀䈀䐀㘀䔀䐀　㠀䐀䈀䄀㐀㤀㌀㜀䔀䈀㄀㘀㜀䐀㐀㔀䈀㜀䔀䄀㌀㘀䐀䐀䄀䔀㌀䈀㜀㐀䄀㜀䔀䔀䐀㈀䐀䐀䈀䄀㐀㜀䘀㜀䔀䄀㌀䔀䐀䐀䄀䘀　㜀䘀㐀䄀　㄀䔀䐀㈀䌀㌀㜀䄀㐀㐀㠀䘀䔀䄀㌀㄀㌀䐀䄀䔀㈀㜀䘀㐀䄀㐀㤀䔀䐀㈀䐀㌀㜀䄀㐀㘀䌀䘀䔀䄀䄀䈀㜀䄀㐀䔀䌀䘀䔀䈀　㔀䈀䐀䄀㠀㤀㜀䘀㐀䈀㈀㔀䔀䐀㄀䄀䈀㜀䄀㐀䐀䄀䘀䔀䈀　䐀㘀䐀㌀㐀㘀㠀䄀䈀㔀㄀㤀㌀㜀㘀㤀䄀㜀㔀㘀㄀䘀䐀㜀䈀䄀䐀㌀䄀䔀㠀㐀䐀㜀䐀㐀䐀㘀䘀䔀㤀䔀䈀㜀䄀㔀䈀䐀䘀䐀　㌀䈀䘀䄀䄀㘀䐀䔀䐀㔀㜀䈀㜀䄀㔀䘀䐀䘀䐀㈀　㜀䘀䄀㔀　㄀䘀䔀㤀䈀䌀㠀䐀　䄀㄀䈀㤀㔀䌀㜀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㔀㄀㘀㄀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀　䄀㄀䈀㄀㔀㌀㘀㈀䄀㘀䌀㔀㐀䐀㠀䄀㠀䈀　㤀㄀㔀㔀㘀㈀䄀㌀䌀㈀㐀㘀㠀㔀㠀䐀䌀䄀㄀㌀㄀䈀㌀䐀䈀㄀䐀㄀䐀䈀䌀　㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䌀䐀㤀䘀䐀㄀䘀䐀㘀㌀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀㌀䐀㄀䈀䘀㔀㘀䌀䈀㐀䈀　䔀㌀㐀䈀㜀㔀㤀㤀㈀䔀䐀㜀㄀㔀䘀䄀㤀㈀䄀䔀䐀㐀㔀㔀䈀䄀㔀䄀㔀䘀䐀㘀㌀㔀䈀䄀㔀㘀䐀㜀䔀㤀㜀䄀䐀䐀䄀　㄀䈀㜀㔀㤀㌀㘀䔀䐀㘀㈀䐀䘀䄀㠀䄀㘀䔀䐀㔀㘀䐀䈀䄀㔀䐀㜀㜀䔀㠀㐀䔀䐀䐀䄀㔀䈀䈀㜀㔀㠀䘀䔀䔀䐀㔀㜀䐀䈀䄀㔀䘀　䘀䔀㠀㐀㄀㌀䐀䄀㐀㠀㜀䘀㔀㠀㠀㄀䔀䐀㔀㘀㌀㜀䄀㔀䌀㐀䘀䔀㠀㐀㤀㌀䐀䄀㔀䄀㜀䘀㔀㠀䌀㤀䔀䐀㔀㔀㜀䘀㔀㤀䌀㤀䔀䐀㜀　䈀㜀䄀㔀㄀㈀䘀䔀㤀㘀㔀䈀䐀䄀㈀㔀㜀䘀㔀㤀䄀㔀䔀䐀㜀㄀䈀䐀䄀㘀㠀䐀　㔀㘀䄀㌀㈀㘀䔀䐀㌀㐀㘀䈀䐀㄀㠀㔀㔀䐀䄀㠀㌀䄀䔀㠀㐀䐀㜀䐀㐀䐀㘀䘀䔀㤀䔀䈀㜀䄀㔀䈀䐀䘀䐀　㌀䈀䘀䄀䄀㘀䐀䔀䐀㔀㜀䈀㜀䄀㔀䘀䐀䘀䐀㈀　㜀䘀䄀㔀　㄀䘀䔀㤀䈀䌀㠀䐀㜀䄀㌀㘀䔀䄀㄀䘀䐀䈀䄀㠀㘀㜀䄀㌀㤀䔀㠀䐀㜀䄀㌀㘀䔀䄀䐀㤀䄀㠀㘀㜀䄀㌀㤀䔀㠀䐀㜀䄀㌀㘀䔀䄀䐀㤀䄀㠀㘀㜀䄀㌀㤀䔀㠀䐀㜀䄀㌀㘀䔀䄀䐀㤀䄀㠀㘀㜀䄀㌀㤀䔀㠀䐀㜀䄀㌀㘀䔀䄀䐀㤀䄀㠀㘀㜀䄀㌀㤀䔀㠀䐀㜀䄀㌀㘀䔀䄀䐀㤀䄀㠀㘀㜀䄀㌀㤀䔀㠀䐀㜀䄀㌀㘀䔀䄀䐀㤀䄀㠀㘀㜀䄀㌀㤀䔀㠀䐀㜀䄀㌀㘀䈀㈀㌀䔀㘀䌀䐀㐀䈀㌀㔀㄀䌀䘀㐀㘀䘀䐀㄀㌀㄀䈀㌀䐀䈀㄀䐀㄀䐀䈀䌀　㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀䔀㘀㐀䘀䔀㜀䘀䄀䐀㠀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㄀㘀㜀㘀㜀䌀䄀㤀㈀䔀䐀㌀䔀㔀䈀䄀㐀㈀㔀䘀䐀㈀㤀㔀䈀䄀㐀䄀㔀㜀䔀䈀䌀䈀䈀䄀㐀㘀䐀㜀䔀䄀㌀䄀㔀䐀䄀䘀㄀䈀㜀㐀䄀㌀㘀䔀䐀㈀䌀䐀䈀䄀㐀㔀㔀䘀䐀㄀䄀䐀䈀䄀㐀䐀䈀㜀䔀䈀　䔀䐀䐀䄀㤀䈀䈀㜀㐀䈀㜀䔀䔀䐀㄀䈀䐀䈀䄀㐀䘀䘀㜀䔀䈀　㄀㌀䐀䄀㠀㠀㜀䘀㐀䈀　㄀䔀䐀㄀䄀㌀㜀䄀㐀䌀㠀䘀䔀䈀　㤀㌀䐀䄀㤀䄀㜀䘀㐀䈀㐀㤀䔀䐀㄀䈀㌀䘀䄀䄀䄀㤀䔀䐀㌀䘀㌀㜀䄀㐀㄀㈀䘀䔀䄀㈀㔀䈀䐀䄀䌀㔀㜀䘀㐀䄀䄀㔀䔀䐀㌀䔀䈀㜀䄀㐀㌀㄀䈀　䐀䐀䄀㘀䄀䐀㐀䄀㐀㤀䐀㘀㘀㈀䐀䐀䄀䔀䈀䌀㈀㔀䔀　䌀㜀䄀㔀㌀㔀䘀䐀㌀㔀䈀䘀䄀䈀䄀䐀䔀䐀㘀㌀㜀䘀㐀㠀䔀䈀䔀䄀㤀㜀㜀䘀㔀㤀䔀䐀䔀䐀㜀䈀㜀䘀㐀㠀㄀㌀䔀䐀㐀㐀㜀㌀䄀㘀䘀䄀㌀䌀䄀㐀㘀䘀㔀䈀㄀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㔀㐀䐀㤀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䌀䄀㐀㘀㤀㔀㠀䐀㈀䄀㄀䈀㔀㔀㌀㘀䄀䄀㘀䌀㘀㐀㘀㔀䐀㠀䄀㠀䈀㈀㔀㄀㘀㔀䄀㌀䘀䄀䌀㐀㐀㘀㐀䘀㘀䌀䘀㐀㌀㘀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀䘀㌀䔀㜀䘀㈀䘀　䐀㠀㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀䈀　䐀㄀䌀　㐀㘀　㌀㄀䈀㈀䐀䔀䌀䘀㠀㔀㈀㔀䐀䄀㘀䌀䈀㜀㔀㠀㔀䈀䔀䄀㐀㈀䈀㜀㔀㤀㔀䄀䔀䐀㘀㤀㜀㜀㔀㠀䐀䄀䔀䐀㔀㜀㔀䈀䄀㔀䔀㌀㜀䔀㠀㐀㘀䐀䐀䄀㐀㤀䈀㜀㔀㠀䈀䈀䔀䄀㈀㔀䈀㜀㔀㤀䈀㘀䔀䐀㜀㄀䐀䈀䄀㔀㌀㜀㜀䔀㤀㘀䔀䐀䐀䄀㌀㜀䈀㜀㔀㤀䘀䔀䔀䐀㜀　㌀㜀䄀㔀　　䘀䔀㤀㘀㄀㌀䐀䄀㈀㐀㜀䘀㔀㤀㠀㄀䔀䐀㜀㄀㌀㜀䄀㔀㈀㐀䘀䔀㤀㘀㤀㌀䐀䄀㌀㘀㜀䘀㔀㔀㔀㌀䐀䄀㜀䔀㜀䘀㔀㠀㈀㔀䔀䐀㐀㐀䈀㜀䄀㔀㤀䄀䘀䔀㠀㔀㔀䈀䐀䄀㘀䐀㜀䘀㔀㠀㘀㌀㘀㄀䄀䈀㐀䐀㔀䄀㠀㐀㤀㌀䈀䌀䐀㔀䄀䈀㐀䐀㜀䄀䄀　䈀㌀䈀㜀㈀㔀㌀㔀䘀䐀㌀㔀䈀䘀䄀䈀䄀䐀䔀䐀㘀㌀㜀䘀㐀㠀䔀䈀䔀䄀㤀㜀㜀䘀㔀㤀䔀䐀䔀䐀㜀䈀㜀䘀㐀㠀㄀㌀䔀䐀㐀㐀㜀䘀䄀㈀㌀䘀㌀㘀㔀䄀㌀䔀㄀䈀㄀㠀䐀　㘀㌀㘀㄀䄀䐀㠀㘀㠀㘀　䄀㌀㠀㄀㠀䐀　㘀㌀㘀㄀䄀䐀㠀㘀㠀㘀　䄀㌀㠀㄀㠀䐀　㘀㌀㘀㄀䄀䐀㠀㘀㠀㘀　䄀㌀㠀㄀㠀䐀　㘀㌀㘀㄀䄀䐀㠀㘀㠀㘀　䄀㌀㠀㄀㠀䐀　㘀㌀㘀㄀䄀䐀㠀㘀㠀㘀　䄀㌀㠀㄀㠀䐀　㘀㌀㘀㄀䄀䐀㠀㘀㠀㘀　䄀㌀㠀㄀㠀䐀　㘀㌀㘀㄀䄀䐀㠀㘀㠀㘀　㈀㌀㘀䈀䌀㈀㐀㘀　㌀㄀䈀　䐀㘀䌀㌀㐀㜀䌀䐀㄀㘀䌀㌀㐀㌀䔀䘀㘀㠀䔀䈀㤀䈀䘀　䐀㠀㜀䔀㜀䄀㘀㘀㘀䘀䔀䔀䌀㌀䈀㌀㐀㌀㜀㐀㌀㐀䘀㠀䐀㌀䐀㌀䈀䘀㜀㌀㄀㌀䈀䘀㜀㌀㄀䈀㤀䘀㠀　㜀䔀㘀㌀䔀䘀䔀䘀䈀䐀㌀䔀䈀㄀㘀㜀䐀㜀㈀䔀䔀䐀㄀㔀㌀䌀䘀㜀䌀䌀㌀䐀䌀䐀䐀㜀㌀㤀䘀㔀䘀䈀䌀㜀㐀䘀䔀䐀㄀䐀㌀㌀䘀䘀㐀㔀㜀䔀䔀㜀䌀㘀㄀㘀䌀䘀㈀䔀㤀㌀䘀㔀䔀䈀㐀䔀䈀㤀㤀䘀㜀䌀䔀㌀䘀䈀㜀㘀㠀䐀䈀㔀䌀䐀䘀䘀㔀㠀㔀䔀㜀㌀䔀㌀䐀㌀㘀䈀㌀㘀㠀䌀䐀䐀㠀䌀㐀䐀㌀䈀䘀䈀㄀䘀㠀㜀䈀㄀㜀䈀䐀䈀㠀䔀㠀䄀㄀㔀㜀䘀䘀䌀㘀㔀䌀㔀䘀㜀　䌀㜀䘀㠀䐀㠀䘀㐀䐀㠀䘀㌀㠀䈀㔀䘀㄀䌀㜀䈀䔀㘀㤀㤀㔀㔀㠀䈀䘀㘀㠀䐀㐀䐀㈀䌀䘀䔀䌀㐀䐀䌀㤀䐀䌀䈀㄀㘀䈀䐀䘀㠀䌀䌀䈀㜀㌀䘀䘀䐀㤀䈀㠀䈀㜀㘀㈀䐀㠀䄀䘀䘀䘀䈀䐀㄀䈀㌀㔀䘀䈀䈀㘀㠀䐀䘀䘀䘀䐀㌀㜀䐀䌀䘀䌀䘀㌀䐀㌀䘀䘀㜀㌀㔀㤀䔀䘀䐀㘀䘀㜀㌀䘀䐀䌀㠀㄀㜀䈀䔀䌀㘀㜀䈀㄀㜀㜀䘀䘀䘀䐀㠀㌀䈀㐀㜀䈀䘀䈀㔀䘀　䌀䄀㘀㜀䔀䔀㈀䐀㔀䄀㌀䔀䘀㜀㜀䔀　䘀䌀㜀㈀㘀㄀㘀䘀䐀䘀㐀㌀㌀㈀䘀㈀䔀㔀䄀㌀䔀䘀㜀䌀䔀䘀䘀䔀㜀䈀㌀䌀䘀䘀䘀䔀㔀㘀㜀㜀䐀䘀䘀㐀㜀䘀䔀䔀䄀㤀䘀㜀㤀䘀㐀䌀㈀䐀㠀㌀㌀㜀䘀䐀䐀䘀䈀㌀䐀䘀䐀㐀㌀䈀䔀䌀䈀㈀䘀䈀䌀䘀㘀䘀䘀䈀䄀䔀䘀䘀㤀䈀䘀䘀䔀䈀䔀㈀䘀㜀䌀㠀䐀㠀㔀㔀㔀㤀䐀㔀䔀䘀䌀䔀㈀䔀㈀㄀䘀㔀䌀䘀䌀㤀㤀䌀㔀㌀䘀䈀㐀䘀㠀㠀㜀㤀䘀䘀䈀㐀㜀䘀㌀䌀䘀䌀䐀㜀䐀䔀䘀㜀㘀㘀䈀䘀㄀䐀䄀䌀㔀㄀䈀䔀㜀㜀㜀㘀䈀䐀㄀䔀㘀䈀㤀䐀㜀䐀㠀㤀㄀䐀㄀䄀㜀䔀㘀㤀䘀䘀䘀䘀㈀䘀䌀䘀㠀䐀㄀䘀㜀㜀㤀㔀㐀䌀㘀䌀㘀䘀䔀㄀㜀㈀䔀㄀㜀㈀䐀㜀䄀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀　㌀㠀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㔀䈀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㈀㌀㜀㌀㠀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㜀㌀㜀㌀㠀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀　㈀　㌀　㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㠀㌀㌀㌀㌀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㜀㌀㜀㌀㠀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㜀㌀㜀㌀㠀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㘀㌀㘀㌀㜀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀　㈀　㌀㤀㌀㐀㌀㐀㈀　㌀　㈀　㌀㘀㌀㘀㌀㜀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㌀㌀㌀㌀㌀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀　㈀　㌀　㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㠀㌀㠀㌀㤀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㌀㌀㠀㌀㤀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㌀㌀㌀㌀㌀㈀　㌀㘀㌀㄀㌀㄀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㜀㌀㜀㌀㠀㈀　㌀　㈀　㌀㔀㌀㔀㌀㘀㔀䐀㈀　　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀　㌀㤀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㈀㌀㘀㌀㜀㌀㔀㌀㐀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㌀㄀㈀　㌀㘀㌀㤀㌀㠀㌀㜀㌀㈀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䔀䌀㜀䐀　䈀㜀䌀㔀㐀䐀㔀䐀㔀䔀䘀䐀䄀㜀䈀㤀䘀㌀㌀䔀㜀䌀䌀㐀䌀㄀䔀㤀㌀䘀㜀㠀䈀㌀　㈀㜀　䌀㤀㌀㠀㐀　䌀㈀㄀㈀㄀　㐀䌀㈀㈀㌀㤀㈀㤀㌀㤀　㐀㐀㌀　　㔀䌀㈀㐀㌀㐀䌀㠀　䐀㐀　㐀㠀㠀䄀㈀䘀㔀㄀㄀䔀㐀䄀㔀䐀㠀㐀㈀㜀䌀㈀　㄀䄀㔀　㘀㌀㔀㔀䄀䄀䈀㔀㤀㘀䘀㠀　　㈀䐀䄀㠀㐀䌀㈀㘀㠀㠀㐀㤀㠀　㄀㈀䈀㔀㔀䄀䈀㔀㔀㔀䈀　㔀䄀㠀䈀㜀䔀䈀㘀䌀䐀䄀䘀㠀䄀㐀䘀䄀㠀㜀䔀㈀䐀䄀㈀㄀㜀䌀㤀䌀䌀䘀䐀䔀䘀㌀㌀　㄀䄀㄀䔀㔀䘀㘀䈀㘀䈀䘀㜀䈀㜀䘀䐀㜀䔀䘀䔀䈀㤀䐀㌀㔀䄀䌀䈀䐀䘀㘀㘀㌀䘀䐀䘀㜀㔀䔀㜀䈀䔀䐀䈀㔀䘀㜀䐀㤀㘀㜀㐀㈀㠀　㄀㠀㄀㄀䌀㔀㈀　㔀㄀䄀㠀㜀㔀䔀㘀㤀䌀㠀㈀䄀㈀䄀㐀㄀㔀㌀㜀䈀㜀㄀㈀䈀㄀䄀㔀䄀㠀㘀䐀㔀䌀㜀䌀㘀㔀㔀㌀㐀䈀䌀䌀㤀䘀㠀䐀㄀㈀䄀㈀㜀㈀㄀㜀㄀㄀䄀䘀㔀㠀䈀䌀㘀䄀㠀㔀㄀㄀㜀䄀䘀䔀䌀㤀䘀㌀㠀㤀㄀㘀㘀䌀㈀㈀䐀㈀㄀䄀㈀䘀㘀㤀䈀㤀䘀㐀䌀䄀䐀䔀㤀䌀䈀㠀㘀䐀㐀㐀㔀㌀䔀㘀㄀㈀䐀㤀㈀㘀㔀䘀㜀䄀䌀㔀㜀㔀㤀㜀䌀㐀㈀䘀㜀㤀㜀㤀　㐀䐀㄀䄀㈀㈀㌀㐀㐀䘀㌀㄀㈀㤀㜀㌀㘀㌀㜀㈀䐀㌀㤀䐀㄀䈀䌀㜀㌀　䘀䘀䄀㐀㈀㤀㤀䌀㘀㈀䐀㐀㔀㐀㔀䘀䌀䐀䄀䔀㐀䄀䐀䔀㠀㜀䘀㌀㠀䌀䄀䌀㌀㤀㜀㔀䔀䈀㤀䔀㈀䐀䄀㤀㜀䐀䘀䘀㌀㔀䌀㠀㜀䘀㈀㐀䈀㐀㐀㘀㔀䐀㔀㔀㜀㔀䌀䈀䐀䈀㠀㘀㤀䘀㔀䘀㔀㜀㜀䌀䌀㈀㈀䔀䄀㐀㄀䈀㌀䄀㜀䘀䐀䌀䄀䄀㘀㘀䈀㔀䈀䐀㈀㘀䔀㠀䘀䐀䘀㠀㜀䘀㘀䄀㤀䄀㠀㌀　䄀䔀㘀䌀㔀䔀䐀㄀㈀㐀㌀䄀䐀㐀㈀㘀㘀㈀䐀㄀䔀㌀䄀㔀㜀䐀㔀㜀㌀㔀㔀䐀䐀㤀㐀䌀䌀㄀㐀䈀㜀䘀㐀㄀䘀㐀㘀䔀㌀䈀㔀㄀䔀㄀䄀䐀㈀䐀㔀㜀㈀䘀㔀䘀㄀㄀䌀䄀䄀㌀䐀䘀䄀㄀㌀䐀㔀㔀䔀䄀䈀㜀㔀䌀䐀㌀䐀䌀㈀㈀㘀㘀㠀䔀㜀䈀㠀䄀㘀㠀䐀䄀㌀䐀㐀㐀㜀㄀㔀䘀㤀　㤀䌀䄀䈀㄀㘀䘀㔀䄀䄀䘀㜀䔀㤀䐀䘀䌀䌀䈀㠀㌀㠀䈀㘀䘀㐀　䈀㌀䐀㐀䐀㈀㜀㐀㤀　䘀䈀䘀㔀㜀㤀䄀㈀㤀䔀㔀䔀㄀　䈀㠀㜀㈀䌀㌀㤀㜀㄀䔀㈀䔀㐀㠀　㠀䈀䘀㐀㘀䈀䄀　㘀䈀䈀㜀䘀㐀㈀㔀㐀㄀㘀䄀㤀㌀㠀㌀㌀㌀㘀㠀㠀䄀㠀䈀㐀䔀㤀䌀㌀㠀䈀㄀䌀㘀㐀㔀䄀㜀㔀䈀　㘀㈀㤀䘀䄀㔀䐀㔀㤀㄀㌀䘀㜀㐀䈀㘀䄀㈀㔀㄀㜀㈀㔀㄀㌀䌀㜀䌀㜀㐀㔀　㔀㌀㐀　䘀䈀㠀㄀䄀㠀䌀䌀䈀䐀㄀㈀䄀䌀㐀㤀䈀㜀䌀㈀䘀䄀㤀䄀㐀䄀䈀㌀䘀㔀㘀䌀㜀䄀　㠀㌀㠀䌀䈀　㄀㐀䄀䘀䐀㌀㈀㔀㌀䌀㔀䔀㔀㜀䈀㤀㔀㌀㔀㌀䈀㠀㈀㐀䄀㔀㤀䘀㐀㘀㠀㔀䘀䄀䔀㠀䐀䄀　㔀䔀㠀䐀㘀㈀䔀䘀䈀㤀䔀㌀䈀㜀䐀㠀䄀㐀㄀䘀㠀㜀㠀㜀䘀䄀䐀䈀䔀㄀㄀㤀䌀䌀㔀䌀㘀㘀㠀㤀㌀㔀㤀䌀　㈀㐀㄀㘀　䄀㠀㔀䈀　㘀㠀䐀㤀㘀䄀䄀䘀㤀䌀㈀㤀㈀㔀䐀㤀　㘀㐀䐀䔀㈀㄀㌀　㘀㜀㤀㌀䈀㜀㔀㠀䈀㔀䘀㔀㄀　䈀䘀䐀　䈀　㐀䐀䌀䐀䐀䘀䘀㠀䄀䘀䔀㌀䘀㈀㈀䘀㔀㤀㜀㄀㘀㘀䘀　㘀㌀㜀㠀㄀䔀䘀㔀㄀䔀㜀䐀㄀䈀䐀䌀䄀㜀䈀䘀㐀㈀㌀䐀䈀　㐀㔀䄀㈀㐀䔀䈀㌀㄀䐀㘀䄀㘀㔀㌀䈀䄀䄀㠀㜀䘀䐀　䈀㘀㤀䐀䔀䔀㐀㈀䘀䐀㜀䐀㘀㠀䄀䘀㤀㜀䈀䄀㤀㘀㤀㐀䘀㠀㜀㤀㜀㐀　㄀䐀䄀㐀㜀㈀㈀㜀䘀䈀㜀㌀䄀㈀䘀㄀㐀䐀㈀㘀䔀㈀㜀䌀䐀䔀䄀㜀䘀㔀䔀㘀㠀䔀　㄀䘀㠀䐀䄀䘀㈀䌀䄀㜀㘀㤀䌀　㘀䐀㠀　䈀䌀㄀　㜀㈀㈀䔀㘀㐀㌀㤀㜀䌀㤀㈀㘀䄀䔀㔀䐀䘀䄀㌀㄀䘀㤀䔀㌀㤀㔀㜀㤀㤀䐀㜀㌀㈀㘀㤀㈀䐀䔀䄀䔀䘀　㈀䌀䘀　㘀㘀䘀　㐀㈀䘀㄀　㤀㤀㄀㘀䈀䔀㄀　㌀㠀㌀㜀䌀䄀䈀㜀㈀㌀䔀䘀㠀㐀㔀䐀䘀㘀䌀㄀䘀䔀㘀㌀䘀䔀㘀䘀䘀㤀㈀䄀㐀㈀䘀䘀㌀㔀䔀㤀㔀䌀䘀䈀　㄀䈀㄀䘀　䔀䄀䈀㜀㘀㄀㐀䈀㠀㐀㈀㈀㄀㐀䄀㄀　㠀㐀㔀㈀㠀㐀㈀㄀㄀䘀䄀䘀㜀㈀㌀䈀㘀㌀㤀䐀㐀䘀䈀㘀䐀䐀䈀䘀　䌀䘀㤀㈀䘀㈀䌀㄀㜀䘀㄀䘀㔀䈀㈀㌀㄀㐀䄀㄀　㠀㐀㔀䔀㠀䐀䈀㈀㐀㐀㘀䄀㄀㔀䔀㄀䐀䔀䌀䄀㈀䐀　㤀䔀㘀䘀䐀䈀㤀㘀　㠀㐀㔀㈀㠀㐀㈀㄀㄀㠀䄀㔀　㠀㐀㈀㈀㄀㐀䄀㄀　㠀㐀㔀㈀㠀㐀㈀㄀㄀㠀䄀㔀　㠀㐀㈀㈀㄀㐀䄀㄀　㠀㐀㔀㈀㠀㐀㈀㄀㄀㠀䄀㔀　㠀㐀㈀㈀㄀㐀䄀㄀　㠀䘀䐀䘀䈀㤀　䘀㈀㈀䌀㔀䐀䘀㈀㘀䐀䐀䈀㄀　䄀㄀　㠀䘀䐀㜀㜀㈀㌀䘀㘀䔀㌀㘀䘀䐀䈀㠀㈀　㠀㐀㔀㈀㠀㐀㈀㄀㄀㠀䄀䐀　䘀䘀㐀䘀䄀㐀㌀䔀㐀㈀䈀㔀䔀䄀㄀䈀㔀㐀䄀䘀䈀䔀㐀䐀㤀䈀䔀䐀㜀㤀䈀㐀㄀㤀㜀㈀㤀㌀㐀㠀䄀㘀㐀㤀䈀㈀㐀䐀䘀䔀㜀䔀㤀㐀䘀䌀㔀䐀䄀㘀㔀㌀䈀䄀㜀䌀㌀㔀䐀䐀㈀㠀䌀䈀䈀䌀㤀㘀㘀㈀㈀㄀䐀䈀㐀䔀䐀㔀㐀䈀㜀䐀䐀㤀㈀㘀㜀䘀㤀㜀㐀㔀㌀㤀㠀㠀㌀䈀䔀　㤀䘀䔀㤀㌀䔀䔀㔀㤀㜀䈀㐀㔀　䘀㤀㐀䘀䌀㠀㔀䈀䌀　㈀㌀䔀㠀㌀䔀䘀㔀㌀䌀㔀䄀䄀㠀䌀㘀䐀㌀㜀䐀䌀　䐀䔀㜀㜀　䄀䄀㜀㠀䌀䄀㐀䘀䈀㘀䌀䈀㤀㘀㠀㠀䈀　㈀㔀䘀　　䘀䐀㐀䐀㤀　㜀㌀㈀　㠀䘀　㌀㜀㌀㌀䐀㔀䐀䄀　䄀㐀䐀㄀　㠀䔀㔀㔀㌀㘀䄀㔀㜀㜀䔀㐀㠀　䔀䐀䈀㈀䌀㐀䄀䈀㐀㌀　䐀䈀㐀㠀䘀䘀㜀䘀䔀㠀㤀䔀㘀䘀㠀㔀䌀䔀䘀㐀㔀㄀㠀㐀㈀㈀㄀㐀䄀㄀　㠀㐀㔀㈀㠀㐀㈀㄀㄀䘀䄀䈀㜀㈀㄀㌀㄀䌀㠀㐀㌀　㘀㜀䘀䄀㔀䘀䔀　㤀㤀㐀㤀　㘀㌀　㄀㔀㈀䄀㠀㤀䐀䔀㐀㘀䘀䐀䈀㄀䈀䌀㠀㄀㄀　䐀䄀㌀㔀㄀㌀㐀㠀䐀㈀䔀䄀㈀㜀䄀䈀䄀㠀䌀㔀㘀䐀㌀㜀㔀䐀㐀䌀㄀㐀㘀䘀㌀䈀㜀㘀䐀䄀㘀㘀㄀㌀㜀　䄀䈀䌀䈀䘀㤀㘀䈀䘀㤀䐀　䘀䈀䐀㔀㄀㔀㐀㐀䔀䐀䘀㠀㄀㐀㘀㄀㌀㔀䐀䘀㄀䘀㜀㄀䄀䄀㄀䘀㜀䘀䔀䔀㘀䈀㌀㌀㠀䘀㐀㘀㠀㤀　㤀䐀䘀㐀㜀䘀䘀䄀䐀䄀䄀㜀㠀䘀㄀䘀㌀䔀䔀䘀㘀䘀䘀䘀㠀䐀㠀㄀㜀㌀㄀㄀䈀㌀㜀䐀䘀㌀㐀䘀㄀㄀㌀　䌀䔀㜀㄀㌀䐀䘀㤀㔀䈀　㔀㐀䌀㐀㔀㔀㄀䌀䘀䄀㠀㠀㠀䘀䈀䘀䈀㐀䔀㠀㘀㜀䈀䈀㌀㜀㌀㜀㈀㐀㜀䔀㐀䘀㤀㐀㘀㄀㈀㄀㔀㄀㐀㠀䔀㈀䔀㄀䄀㔀㌀㌀䌀㜀㘀㔀䌀䌀㤀䘀㠀　㤀㄀㌀䄀㤀㜀㐀䈀　䈀䐀䈀㈀䄀䄀䘀䄀䘀䌀䄀㤀䐀㌀㈀䔀䄀㠀䘀㤀　䔀䐀㄀䌀䌀䐀䄀㔀㤀䈀㌀䔀㜀䌀䌀䈀䐀㜀　䐀䔀㐀㔀㜀㔀䘀㔀䘀㌀㘀㤀䔀㄀㌀䘀䔀䐀䐀㄀㜀䘀㤀㈀䌀㐀㌀䘀䄀䘀䘀䄀㔀䈀㤀㤀䈀䌀㄀㌀䌀䔀䘀䘀㤀㜀㔀䈀㄀㔀䈀㌀䔀㈀䌀㈀䈀㤀㘀㘀䐀㤀䔀㐀䘀㌀㐀䄀㈀㜀㐀䐀㤀䌀㌀　䈀䔀㘀㐀㘀䌀䘀㄀㤀㠀䄀㈀䐀㄀㠀㔀　㔀䄀㌀䘀㈀㐀㜀䘀䄀䘀㈀㐀㘀䔀㐀䔀㘀㘀㐀㜀䈀㠀㜀㜀䈀㠀㘀㘀㔀㄀㤀䔀䔀䄀㄀㤀㤀㐀㌀㌀㈀䐀㈀䐀㌀㔀㈀㔀㌀㤀㈀㤀㌀㄀㈀㄀㌀䔀㈀䔀㌀㔀䌀䈀㄀㌀㄀䐀㄀㔀㄀㐀䔀㠀㜀㔀䐀䐀㜀㘀䌀䄀䄀㈀㈀㌀㠀䄀㌀㤀㄀㔀㔀㤀䔀䔀䄀㐀㘀䌀㌀㤀䘀䐀䐀䔀㠀㔀㜀䈀㈀㌀䐀㔀㌀䄀㜀䔀㘀䌀䈀䈀㈀䄀㜀　㤀㄀㔀㐀䐀㘀㜀㔀㐀㌀㐀䘀䄀　䐀㔀㐀㔀㔀㤀䘀䄀䐀䔀㌀㌀㜀㄀䄀㈀䐀㌀㔀䔀㌀㘀䌀㐀䐀㄀㌀㤀䄀㤀㜀䘀䌀㠀䐀䄀㘀㄀㤀䐀㘀㌀㐀㐀䘀㘀䈀㌀㈀㤀㜀㔀㄀㐀䄀䄀㔀䘀㤀㈀㌀㠀䐀㈀䄀㠀䘀䔀㄀㜀䘀䈀㔀䐀㈀㘀㌀㜀㐀䈀㌀䘀㤀䈀㌀䔀䄀㤀　䈀䘀䈀䐀䐀㈀㔀㌀㘀䘀䘀㠀㠀䘀㔀䄀䘀㤀䔀㤀㔀㘀䈀䔀䐀䐀䌀䄀㐀㜀㈀㌀㤀䘀㤀㔀　㔀㠀　㔀㄀㤀㔀䈀䄀䈀㐀䐀㈀䘀　䈀㌀㐀㘀䄀㌀䌀䄀㔀䘀䈀䐀㘀䄀㘀㤀㔀䈀㔀㔀㘀㌀㈀㔀䈀䄀䔀䈀㜀㐀㌀䄀䄀㘀㜀㠀䄀㘀㌀㐀㌀䈀䘀㈀㐀㜀㔀㈀䄀㜀䌀㌀㠀㤀䄀䌀㄀㌀㌀㤀㜀䘀㠀䄀䄀㜀䄀㔀㤀㌀䄀㔀㐀䌀㘀㘀㔀㘀㠀㘀䄀㜀㔀㐀㐀䐀䔀䌀䔀㐀䄀㐀㐀㜀䌀㌀㈀㠀㜀䘀䈀䄀䄀㜀䈀㈀䌀䄀㤀䘀䔀㘀䄀㤀㤀㐀㄀㘀䘀㠀㠀㔀䈀㜀䄀䄀㘀㤀㠀㤀䈀䘀㜀㘀㔀㘀㔀䐀㔀㔀㘀㔀㐀㘀㔀㘀㔀㘀㜀䐀䘀䔀㐀㠀㌀䘀㤀䈀䈀㈀䐀㠀䈀㌀䌀㠀㐀䘀㤀䔀　䄀㜀䘀䄀䌀䌀䘀㔀㈀䄀㄀㈀㤀䐀㘀㌀　㜀䔀䐀䈀㄀㐀䈀䘀㘀㘀　䐀㘀㌀㔀䌀㈀㘀㘀㜀㐀㌀㄀䈀㠀䐀䌀䔀㤀㄀㜀䐀㘀䐀㤀䈀䈀䄀㔀䐀䈀㐀䄀㠀䐀㄀㄀㜀䈀㔀䌀㐀䈀㌀䄀㐀㘀㤀㘀㄀㤀䐀㔀䘀㌀㐀䐀㔀䌀䈀㌀㄀䔀㈀㜀䌀㄀㠀䈀㜀䐀㈀㤀䘀䈀㈀䔀㘀䘀䐀䐀㐀㘀䘀㠀䄀䔀㠀㌀䌀㜀䔀㐀䄀䐀䐀㠀㘀㌀㌀㔀䈀㌀㌀㐀㐀㔀䈀㔀㔀䔀䄀㘀㔀㠀㘀㈀䌀䈀㘀䈀㔀㘀䐀㌀　䘀䌀㜀䐀䈀㌀䔀䄀䌀䔀㘀䌀䌀䐀㤀㈀㘀㤀㜀䐀㌀䐀䘀䄀　　㤀㘀㜀䈀䄀䈀㄀䈀䐀䈀䄀䄀㌀㄀䘀㐀㈀㘀㌀㠀䈀㄀㘀㘀㠀䔀㠀㄀䐀㄀䘀㠀䘀䄀䘀䄀㌀䄀㌀䘀㔀䈀㠀䘀㈀㄀　䐀㌀㤀㄀㌀㌀㤀䄀䈀䘀　䘀䌀㤀䄀㌀䐀㔀㔀䈀㈀䄀㘀䘀㄀㜀㈀䌀㌀㘀䘀䘀㜀㔀㐀㜀㠀㤀㘀䈀㘀㔀䐀䐀䔀㠀㠀䄀㔀㐀㤀㘀䘀䘀㌀䐀㌀䔀䌀䔀䈀䈀㈀　㈀䔀㤀䔀㤀㘀㘀㐀䘀䄀㠀㤀䘀䐀㈀䄀䈀㠀䌀䈀㘀䈀㤀㜀㔀㤀䔀㈀䌀㜀䘀㔀㤀㠀㘀䄀㜀䈀䔀䄀㤀㜀㈀㐀㠀㘀㜀㈀㈀䈀㔀䌀䐀䈀䔀䄀䔀㈀䈀䌀䐀㌀㐀䐀㈀䌀䔀㘀䔀䌀㤀㄀䘀䐀㤀䔀㤀㠀䄀　䈀㌀䈀䈀㘀㌀㌀㈀㘀㜀㘀㌀　㄀㌀㄀㔀㜀䐀㘀㘀䄀㘀䘀㤀㜀㐀㤀䈀㤀㔀䈀㌀䐀㐀㘀㔀䄀䔀㘀㘀䘀㘀㘀㤀䌀䘀㌀㈀㘀㤀㤀㄀㘀㜀㄀䄀　㈀䌀㈀㘀䘀㈀䌀㌀㘀㘀　㐀㤀㤀䐀　㜀㜀㌀㄀䄀㈀䘀㤀㌀䔀㘀䘀㄀䐀㐀䈀㘀㜀㠀㌀䌀䐀㐀㐀　䘀㔀　䌀㈀㠀䘀䘀㄀㈀䄀䌀䌀㠀㘀㔀㜀䔀䘀䈀㤀㐀䌀㘀㌀㘀䐀㜀㐀㐀㔀㤀㈀䘀䘀㄀㜀䔀䐀㔀䔀䈀䘀㈀㄀㠀㘀䐀㔀䘀㄀　㈀㈀䌀　㜀㌀䘀㐀䌀㠀䐀㤀㌀㔀㐀䐀㠀㌀㌀㔀㌀㘀䄀䘀䔀䈀　䈀㤀㈀㔀㤀㄀㤀㈀㜀䄀㜀㐀㌀　䐀䔀䐀䄀㜀䘀㈀㜀䔀㤀䘀䌀䘀㤀䘀㤀㜀㈀㜀㐀㌀㐀㐀㤀䈀㠀㈀㌀㔀㠀㔀㠀䐀㤀㌀䄀䐀䘀㈀䐀㠀䘀䌀㤀㄀䄀䈀䈀䄀䘀㤀㌀㠀㐀䘀㠀䈀䌀䈀㠀　㠀　䘀䈀䄀㠀㄀㘀䈀䔀㘀䐀䄀䄀㤀䘀㔀㠀　　䘀㜀㘀㜀㘀㔀䌀㤀　㔀䐀䔀䐀㠀㘀䐀䐀㈀㈀㈀㄀㐀䘀䌀䄀䐀䈀㌀䔀䄀䌀㈀㘀㔀㠀㌀㄀㘀㘀㔀　㐀䌀㠀㈀䌀䘀　䐀㔀䘀䈀㜀㤀䄀㌀㘀䌀䔀㤀㌀䈀䐀㔀㤀㈀㜀㐀䄀㄀㘀䌀㘀㤀㌀䐀䐀㔀㜀㈀㄀䄀䐀䔀䔀㠀㐀㄀㈀㐀䔀䘀䈀㈀㜀㘀㜀㠀㤀㈀㔀䘀䌀䘀㌀䔀䘀䐀㈀㜀䐀㘀㤀㔀㤀䌀㔀　䈀㔀㜀㐀䄀㈀㤀䘀㈀㔀䘀䘀㠀㌀䔀㘀䔀㘀㜀　㜀䈀䌀䐀㄀䌀㐀䘀䌀䐀䄀䌀䘀㤀㜀㔀㐀㘀㔀㔀㔀䈀䔀㌀䄀　㘀䘀㘀䈀䔀㘀㤀䔀㔀㔀　䄀䈀㜀㠀䘀㌀䘀䐀䐀㌀㘀㤀㠀䘀㌀㈀㜀㐀䌀䄀㤀㄀㌀㄀㤀㜀䌀㌀　䌀㜀㌀㌀㠀㐀䐀㔀㠀䄀䄀　㔀䌀㜀㠀㔀䄀㔀㤀㄀㘀䔀䄀䄀㈀䘀䌀㠀䄀㄀㜀㜀䘀㘀䌀㔀㘀㔀　㈀䘀䘀㄀　䈀　㐀䄀㔀㔀㔀䌀㄀㠀䌀㘀䄀䈀䘀䄀䈀㜀㄀㘀䄀㌀㠀䄀䐀㜀㜀㘀㐀㘀㔀䘀䐀㈀䘀㌀㄀䐀䐀㤀䄀㜀䔀　㘀䄀㠀㌀䈀䘀㐀䈀㤀㐀㐀㔀㤀䔀㈀㄀䈀䐀㠀䄀　㤀㔀䘀䔀㠀㤀䈀䔀䈀㌀䌀䈀㤀㌀䌀䔀㈀䄀㤀䘀㘀㔀㔀䐀㔀㐀㤀䈀㠀　䈀䐀㐀䄀㌀㘀䄀䘀㤀㤀㌀䈀䈀䘀䄀䐀䌀䐀㜀㄀㔀㘀㔀䈀㌀㔀　䔀䄀　䈀㘀䈀㘀㘀䄀㠀䘀㔀㄀䐀䐀䐀㘀䐀㠀䐀㘀䐀㐀㄀䐀㘀䄀㔀䐀䔀㐀㌀㄀㔀䌀㤀䔀䈀㘀㄀䔀䘀䔀㄀㠀㜀䘀䄀䌀䄀䐀䄀㔀䄀䄀䘀㄀䐀㐀㠀㈀㜀㘀㠀㜀㜀䄀㌀㜀㘀㘀䘀㠀䄀䈀㌀㜀䐀㔀㘀㌀㄀㈀㐀䈀䐀㤀㐀㐀　㐀㈀䈀䄀㜀㠀䄀㐀䔀　䘀䈀䈀㜀㔀㔀㘀䄀㜀䌀㤀㘀䔀㤀䐀㌀㌀䈀䘀䄀䔀䌀㜀㠀㔀䔀㌀䘀䈀䐀㘀䈀㤀㜀㔀　㄀䌀䔀䘀㠀㤀㐀䌀㘀㠀䄀䘀䄀䌀䔀䔀㄀㘀㠀䄀䈀䔀䈀㌀㄀㜀　䔀㘀㔀䄀䈀㔀㔀䌀䐀㘀䌀䄀㐀䄀㔀㤀㌀　㘀㐀㠀㄀㘀䄀㄀㠀䔀㈀㌀䌀䌀　㜀㔀㐀䈀㌀䘀䄀㌀䌀㜀㈀㐀㘀䄀䈀㔀㔀䄀㄀㔀䄀䈀䌀㈀㈀䄀㈀䘀䔀䔀㘀㘀㘀㐀䐀㔀䔀㤀䄀㜀䔀䄀㄀㠀㈀䐀䔀䔀䔀㘀䔀㄀㌀䄀㔀㜀㜀㠀䄀　㘀䌀㘀䈀㈀　㄀㌀　䘀䐀㠀䌀㔀䐀䐀㐀䄀䈀㠀䌀㔀㌀䌀䄀㔀䄀䐀䄀　㐀䔀　䘀䐀㜀䈀㔀㠀㘀䈀㔀㜀㌀　㜀䈀㔀㜀㔀䈀㐀䈀㠀㘀㐀㐀䈀㈀䘀䔀㄀㐀䌀㈀㜀䄀䈀㌀㄀㐀䌀䘀㈀䐀　㤀㠀㌀㈀䈀㜀䔀䔀䌀䌀㜀　䈀　䘀㘀㔀㠀㜀䐀㌀䔀㔀㄀㜀㤀㄀㐀䌀䐀㄀㔀㌀䈀䔀㔀㠀㜀㠀䘀䄀㔀㐀䌀㜀㈀㠀䈀䄀㜀䌀㐀㤀㌀㜀㠀㄀䄀䈀䈀䌀㔀㤀㌀㔀䐀䈀㘀㐀䌀㜀㜀㘀䈀㜀㤀䈀㐀㜀㠀㠀㈀㜀㘀㠀㈀㌀㤀䈀㤀㤀　㄀䄀䔀　　䔀㈀㄀㈀䘀㈀㤀䄀㘀㜀㠀䄀㈀㐀䈀㠀䈀㈀䔀㌀㈀䈀䈀㈀㄀䔀㌀㄀㌀㈀䐀㄀㤀㐀㠀䘀㘀㄀㔀䘀㔀㠀㐀䘀䄀㤀　㤀㤀㌀㠀䌀㘀䄀䄀䌀䘀䈀䘀䄀㜀䄀㠀㜀㔀䄀䘀䐀㠀㐀㄀㄀㜀䐀㌀㄀㠀㔀㐀䔀䘀　㠀㔀䌀㈀㠀䄀䈀㜀㜀㜀㐀㤀㤀㤀㔀㐀㔀㤀㘀㄀䌀㌀㌀㈀㤀㈀䌀　䈀㐀㘀㔀䈀㌀㈀䄀　㠀㜀㤀䈀䈀㔀䌀㐀㈀㈀㜀㜀㜀㤀㌀䄀㘀　　㔀㘀　㐀䔀䈀㄀㠀㌀䈀㤀㤀㤀䔀　㌀䈀䌀㄀㔀䈀䌀　䘀䈀䌀㄀㌀㘀㄀㠀䈀㐀㠀㌀䘀䔀　㠀　䔀㠀㄀㠀㔀㜀㠀㔀䌀㌀䌀㄀䌀䄀㠀㜀㘀䄀㌀㠀㜀䄀䐀䔀㠀㈀㠀䈀㘀㌀䌀㔀㄀㘀䌀㠀㔀㘀㜀㐀䐀䄀㐀　㜀䌀　㈀㄀䈀　㠀　䘀㔀㔀䈀㌀㄀㤀㜀䄀䐀䘀㐀䐀㤀㘀　㠀䐀　㈀䄀䈀㄀䔀䔀㤀䈀㈀㐀㜀䌀㤀䔀㄀㄀䘀䈀㄀㔀　㄀㤀䔀㈀㄀㄀䄀　㘀㈀㤀㄀䈀䄀䌀　䄀䐀䔀　㤀䐀䔀　　㌀㘀　㤀㔀䄀䔀㐀㘀䈀䄀　㔀㄀䌀　㈀　䈀䔀㐀㄀䔀㐀㘀䐀䈀䌀㌀䌀㐀䌀㔀䌀㌀䔀㈀䄀㄀㠀　䌀䈀䔀䐀㈀䄀㜀㜀㠀㠀㤀䘀䐀㈀㌀䄀㌀　㄀㜀㌀䘀䄀㘀㔀㠀䌀㘀䌀㠀㠀䐀䐀䔀䔀䘀䔀䈀㜀㈀㔀㤀䈀䔀䈀㤀䈀䘀㈀䈀㌀㘀䄀㄀䌀㠀㈀䌀㜀㜀㠀㤀㜀䈀䄀㤀㄀㘀䌀䌀䌀㤀㈀䘀䄀㘀㔀㌀㄀䘀㤀㠀䄀㌀䐀䈀䈀䈀　　䈀䈀㠀䈀㌀㠀䐀㐀㘀䈀　㈀䘀㤀䄀㌀㈀䐀㄀㜀䐀㘀㜀㐀㌀㤀㘀㈀㠀䄀㔀䌀䐀　䐀䘀　㠀䄀㌀㌀㜀䌀㈀㤀　㠀䐀㄀㠀䈀㈀　㌀㈀㤀䈀㌀䌀䄀㈀㘀㔀㠀䔀䄀㘀䘀䔀䌀㐀䄀㐀㠀㤀㘀䐀䐀䐀䘀㄀㐀㠀㠀㠀䐀䈀㌀㜀　䐀㜀　㜀　䄀㠀䈀䌀㌀㤀㤀㈀䔀㔀㜀㘀䄀㔀㄀㈀䐀䈀䌀㜀　㈀䐀㌀㄀䐀㄀㈀䌀䄀䔀㈀㈀　䘀㤀㘀㜀㐀㈀䐀䔀㐀㔀　䌀㠀䌀㔀㤀　㜀㈀䄀㤀㄀㜀㠀㤀㈀㔀㄀㐀㘀䐀䐀㤀㘀㤀㜀㘀䌀㔀䈀䄀㠀䄀㔀䄀㌀㄀㔀䔀㄀㤀䐀㐀䌀䈀㐀㐀㄀㈀㠀䐀㐀　㜀㌀䈀㤀㐀㠀䄀㘀㈀㈀䌀㠀㐀䄀㤀㄀㐀䔀㄀㤀㤀㘀䐀䄀䌀䄀㐀　㐀䌀㜀㠀㤀䌀㤀㔀㠀㄀䐀䌀䈀䌀㈀㈀䌀䌀㜀㠀㠀䄀㐀㠀䈀㔀㔀㐀㘀㈀㐀㔀㌀㐀㄀㔀㐀㌀䔀䄀㐀㈀　䈀㄀㐀䈀㤀㠀䐀㌀䐀䌀㈀䈀㐀㤀䌀㜀䘀㘀䈀㤀㜀䐀䐀㈀㤀䔀䐀䈀䈀㌀㔀䔀　㐀䄀㈀䄀䐀䄀㈀㜀䐀㘀　䈀㠀䐀㄀㈀䄀㄀䐀㔀　䄀䄀䐀㄀㐀㜀㜀䔀䌀㌀䔀䔀㄀䌀　䌀䄀㌀䄀䄀䌀㤀㤀䌀䌀䔀䐀䈀㈀㐀㜀㄀㜀䈀㔀㤀㜀㐀㜀㠀㤀䈀㤀㤀㠀䔀㘀㔀䌀䈀㠀䌀㔀　䐀㄀䈀㄀㤀䈀䌀㜀䌀㤀㔀䐀㔀䐀㄀㔀㔀　㄀㜀㐀㔀㐀㄀䔀㈀㜀䄀䄀䌀㐀㄀　㐀䄀㐀㘀䐀䈀䘀㜀㐀㐀㈀㘀㈀㔀㐀㄀㔀㘀㠀䈀䄀㄀㤀㘀㜀䌀㐀䌀㌀䌀㐀㐀䐀㔀㤀　　䘀㜀㘀㘀㔀　䘀㜀㄀䘀㜀䔀䐀㄀㄀㜀㜀㔀䈀䄀㠀㄀䘀䌀䄀㐀䔀㌀㄀䘀䌀䔀㐀㜀　㘀㠀㐀䐀䔀䔀㠀䄀㠀䔀㈀㤀䔀䄀㈀䈀䈀㜀㠀䈀䌀㤀㘀㠀䘀㔀㠀䈀㌀䈀䈀　　　㜀㜀㔀㠀㠀㌀䈀㜀㜀㜀㘀㔀㠀䘀㈀䘀䄀㈀䘀㈀㘀䌀㤀㄀㐀䈀㠀㔀㘀　　䔀㄀䘀䄀䘀㐀㌀㘀䔀㤀䐀㄀㔀䘀㐀㘀䐀䌀㠀䈀㔀㘀㄀䐀㔀䐀䄀䈀　㔀㈀㘀䐀㔀㠀䄀㤀㌀㘀㄀㠀䐀㔀㠀㘀䔀㠀㈀㌀㜀㄀㄀䈀㔀䄀㘀䔀㠀㌀㐀䔀㠀㄀㔀㠀㐀㌀㈀䐀㘀㈀㌀㔀䈀㔀㠀㌀䈀㜀㈀　㈀䘀䌀㌀㈀䄀㈀㤀　　㠀㜀䘀㘀㔀㠀㤀㤀䔀㄀䈀㤀㐀㔀㌀䐀㈀㈀㐀䐀䄀㐀䌀㈀㌀㄀䄀䔀㌀䐀㜀　㈀㔀㐀㌀㘀䐀㜀䄀㤀㜀㌀䐀㐀㘀㔀䄀㤀㘀㄀䄀㠀㠀㐀䘀䈀　䐀㐀㔀㈀䈀䈀䄀㈀㘀㈀㠀䄀䌀䄀䘀㘀㠀㤀䔀㔀㠀㠀䘀㌀䔀㔀䔀㠀䐀㌀㄀㐀㈀䈀䈀䄀㔀㈀㔀㈀㠀䈀䄀䔀䐀䔀㈀㌀䘀㈀䄀䌀䄀㤀㠀䌀䔀䌀㐀䄀䌀䐀㤀　㠀　㤀㘀　　䌀㈀㜀㔀㤀䘀㐀㠀　㤀㈀䘀　䐀㠀　䌀㤀㜀㈀㐀㤀䘀㘀㠀㤀㈀㄀㜀　㠀㐀㜀㐀㐀䌀䄀㘀㄀㠀㄀䄀㐀㠀㜀㈀䘀䈀䌀䈀䐀䐀㈀㠀䌀䈀㐀　㜀㘀䔀㌀䄀䄀䘀䔀　䄀㌀䘀㈀㠀㤀䐀䌀㐀䐀䘀䔀　䈀䘀㤀㔀䌀䈀䌀䐀　䘀䄀　㈀䌀䔀㔀䄀䘀　㘀䔀㔀䄀䈀㠀㌀䘀㈀䈀㔀䈀　　䌀䘀㔀䘀㄀㠀㌀䔀㄀㐀䐀䌀㄀㜀䘀㈀㌀㘀㔀㜀䘀䘀㤀㄀　㜀䔀㄀㠀㤀䐀㔀䐀䌀䌀㜀䘀㐀䘀㔀䈀㤀　䔀㌀㜀䌀　䘀㜀䘀㤀䔀　䄀　㄀㜀㠀㠀㜀㜀㜀㐀䈀㈀䈀䘀㠀䐀䈀䈀䌀㠀㜀䌀䄀㈀　　䘀䄀㄀䈀䌀　㐀䈀㈀　㜀㜀㈀　䌀㘀㐀㘀䘀㈀　䔀䈀㈀㔀㜀㜀㌀㜀䔀䘀䔀䔀㠀㈀㠀　䔀䐀　䘀　㐀䄀㈀㤀㌀䔀㔀㘀㐀䘀㤀䘀㌀　㄀㔀䘀䌀㄀㘀　䌀㘀䔀䐀㄀䐀䌀䌀䄀㐀㘀㐀　䌀㘀㘀䔀㈀㤀㌀㠀䈀䌀䄀䈀䐀䘀䌀㌀㤀䘀䔀㈀䌀䐀䔀㠀㤀䐀䌀䘀䌀㜀㜀㤀　䌀㌀㈀㄀㤀䘀䔀㔀㜀䐀䈀㠀㘀䐀䈀䈀䘀㤀㜀䔀䌀㠀㔀㐀䌀㠀㌀䔀䈀䔀㠀㈀㔀䔀㠀㈀㜀䌀㄀䄀䄀㜀䐀㘀㈀㐀䌀㠀㔀䐀㠀㌀䘀㈀㄀㜀㜀䌀䄀䘀　䌀㜀㄀䘀䔀　䌀䐀䘀㐀䐀䔀㌀㈀㄀䈀䈀　㈀㌀㄀䐀㈀　㐀㜀䘀㐀　㤀㌀㘀㈀㘀㜀䌀　㈀㘀䌀㔀㔀㌀　㄀　䄀㤀㜀㘀䄀　䈀䐀䌀㜀䈀䘀㤀㔀㌀㜀䌀　㜀䄀㔀㐀㌀䘀㔀䌀㤀㐀　㜀㘀㌀䄀㘀䄀㄀䘀䔀䘀䌀䄀㄀䔀䔀䔀㠀䔀䐀䐀㠀㌀䘀䔀㄀㠀䐀䘀䌀䄀㔀㜀　㐀㌀㈀䐀䐀䘀㄀䔀㔀　䔀䘀䔀㄀　䄀䈀㘀㌀䌀㜀䄀　䐀㐀㐀㄀㠀㜀䄀㐀䄀㐀㜀㠀䘀䔀㜀　䄀　㐀㐀㜀㘀䐀㈀㄀䔀䐀㠀㘀䈀䈀㠀㜀䈀㜀㠀㌀䈀㘀䘀㌀㜀㔀㌀㐀䈀㐀䌀䄀䘀㤀㤀㘀䘀㘀䔀㄀㌀㠀㔀䐀䔀䌀㈀䘀䌀䌀㈀㘀䐀䌀㈀䘀　㄀䄀䘀㤀㐀㘀㠀㤀䈀㄀䌀䐀㈀㠀㜀㜀䘀㄀㌀䈀㜀　㠀　㘀䌀䔀㄀䐀㠀䈀䘀㜀䌀㈀㌀䐀㈀㄀㈀㌀㈀㌀㠀䄀㈀　㜀㘀䌀㠀㈀䐀䈀䘀㤀㘀䐀　㄀䄀㔀䌀㐀㔀䘀㌀䔀㠀　㌀㤀䌀㤀㜀㤀㜀㄀㘀䄀㐀㔀䐀䄀㘀㄀䔀㔀㄀䄀㤀㄀䈀㘀㔀㠀㌀㤀㐀㈀䔀䄀㌀䄀䐀䐀䘀䄀䈀㤀㤀㔀㈀䈀䔀㌀䔀䈀㘀㤀㈀㘀㤀㠀䄀㌀㠀䘀䈀㔀䔀　㜀㔀䔀　㔀㘀䘀　　䐀䘀㈀㌀䐀㠀㔀䄀䘀　㄀㔀䘀　䘀䘀䔀㌀䔀䘀㠀　㜀㔀㘀䌀䐀　䄀䘀　㐀䄀䘀　㘀䄀㤀䌀㈀㘀㈀䐀㐀　䈀㐀　　䐀㄀　㈀㐀㐀㠀䈀㠀㔀㘀㠀　㄀䄀㈀　㔀㠀㠀㄀㘀㈀　㔀䄀㈀䌀㐀㐀㠀䈀㌀㔀䘀䄀㐀䄀䈀　㐀㐀㌀㐀　㈀䐀㄀　㠀㐀㐀㈀㌀㄀　㠀䐀㄀㘀䄀㈀㄀㄀㠀㠀㐀㘀㈀　㄀䄀㠀㄀㘀㠀䈀㐀㄀　䐀㈀䐀䔀㐀㘀㈀　㄀䄀㈀䐀㐀㐀㈀䐀㄀　䈀㔀㐀　䐀㐀　㈀㔀㄀㘀䈀㈀㄀㘀䄀㠀㄀䄀㠀　㔀䄀㈀㄀㘀㠀㠀㔀䄀　䈀㔀㄀　䈀㐀㐀㈀䐀㄀　䈀㔀㄀㘀䌀㈀　㐀䌀㈀　㐀䌀㈀　㐀䌀㈀䈀㐀㄀　㈀㘀㄀　㈀㘀㄀　㈀㘀㄀　䄀㘀㠀㔀㌀　㠀㄀㌀　㠀㄀㌀　㈀䐀㐀㐀㈀㄀㄀　㠀㔀㐀　㄀㐀　㈀㔀㄀㘀㠀㈀㄀　䄀㠀㄀㈀㠀　㐀䄀㈀㄀　㠀㠀㐀㈀　䈀㔀㄀　㠀㐀㐀㈀㄀㄀　㠀㔀㄀㘀䌀㈀　　䌀㈀　　䌀㈀　　䌀㈀䈀　㄀　　㘀㄀　　㘀㄀　　㘀㄀　㠀㘀㠀㔀㌀　㠀　㌀　㠀　㌀　㈀䌀㠀㐀　䈀　㠀㄀㜀㄀　㈀䔀㈀　㔀䌀㄀㘀䌀㈀　㔀㠀㐀　䈀　㠀㄀㜀㄀　㈀䔀　䈀䔀㄀䈀㈀䐀㘀㘀㜀㈀㔀㔀㠀㈀㈀䘀䄀㠀㄀䔀㠀　㜀䄀㈀㄀䘀㠀㠀㜀䔀　䈀䐀㄀　䘀㐀㐀㌀䘀㄀　䘀䐀㐀　䘀㐀㔀䈀㠀㠀㜀䔀㈀　䘀䄀㠀㄀䔀㠀䔀㜀䄀䈀㌀䈀䌀㔀䌀㄀䘀㈀㄀㜀　　㌀㤀　㠀䌀㠀㐀㄀㐀　　䔀㔀䄀㤀　㠀㌀㠀　㄀䌀　㐀䔀㐀㈀　㈀　　㜀㈀䐀䌀㠀㐀㄀㐀　　䔀　㈀㜀㈀㜀　㜀　䔀䄀㈀䈀㈀䌀㘀㜀㜀　㠀㐀䌀䐀㔀䄀䘀　㌀䄀㜀　㈀䈀㔀㠀㘀㈀䘀䈀㠀　䔀䐀　㌀䈀㘀　䘀䐀㠀㌀䔀　䈀䐀䈀㘀㜀㠀㔀䐀㜀㐀䄀䈀　䌀㐀䘀䄀㠀㄀䘀　　㌀䔀㄀　㜀䌀㈀㘀䘀㈀㄀䘀䌀㐀　䘀㠀㠀㄀䘀　　㌀䔀㄀䈀㜀㄀　㜀䔀㈀　䘀䌀㐀　䘀㠀㈀䐀㐀㐀　㜀㄀　㄀䐀㐀　㜀㐀　　䐀㄀㘀㄀㈀㄀㌀䄀㠀　䔀㠀　　䄀㈀　㌀㠀㠀　䔀　䈀䐀㄀㘀㄀　㔀䔀䔀㐀䄀䈀　㐀㐀䘀䌀䔀䈀㐀㄀䘀㤀㈀䘀㈀䘀　䐀䈀䘀㠀㄀䐀㔀䔀㤀㜀㠀䐀㘀䘀㈀㔀㘀㌀㘀䌀㈀㤀㈀䔀䈀䔀㠀㠀㠀㈀㔀䐀㜀䐀㈀㈀㄀㐀䈀䘀䔀㠀　㌀䄀㈀䐀䘀㤀㜀䐀䐀䄀㘀㘀䌀㤀䔀䈀䔀㤀㐀㘀㐀䈀䄀䔀䄀㄀㄀㈀㐀䈀䄀䔀䄀㘀㘀䌀㐀䈀䄀㈀㌀䘀㐀䈀䄀䔀㈀　䈀㜀䌀䔀　㈀䔀䔀㤀㈀䐀㠀䘀㈀㘀㐀㄀䌀　㄀㌀㌀䌀㄀㄀㜀㠀㌀䄀䘀　㘀㘀䘀　㄀䌀䈀㐀䈀䐀㈀㜀䔀䈀　㘀㘀䔀㔀　䔀㠀　䘀䘀　㠀　䔀䘀㄀䈀㄀䔀㘀㌀　㈀㔀㔀㘀㤀䈀䄀㤀㘀䐀䐀㄀㜀㘀㘀䄀䘀䈀㌀㔀㜀㔀䄀㜀䐀㘀䄀䘀䘀㄀㔀㠀䐀䈀㐀䌀䐀䈀㄀㘀䐀䈀㐀䔀䐀䈀㜀䔀㤀䈀䈀䄀䐀㌀䐀㘀㘀䘀䔀㌀㐀㘀㜀㤀　㘀㠀䘀䈀㘀䌀䔀㔀㄀㄀䌀㈀䐀㜀㐀䄀㜀㤀㔀䄀䔀㐀㌀䘀䄀㄀㤀㄀㠀　䘀㄀㄀䄀㐀㘀㔀㔀㘀䄀䔀㠀䌀㄀㜀㘀㌀䐀䌀㘀㈀㤀䌀䈀㌀㘀㌀䘀㄀㈀㤀䔀㘀䌀㔀㘀㘀䐀䌀㔀㄀䔀㌀䈀㌀㌀䌀㜀㘀㈀　㠀䘀䔀䐀䌀䘀㘀㌀㌀䈀䘀㌀䐀㠀㤀䐀㜀㤀䄀䌀䐀䌀䌀䔀䌀䘀㘀㜀㠀䄀㜀㔀䐀㈀㄀㤀㔀㐀㠀㈀䔀䈀㤀䔀㤀䈀䐀㔀㤀㤀㔀㄀䐀㤀㤀㌀䐀䐀㠀㜀䌀　㈀㔀䐀㤀㌀㤀㤀㌀㜀㄀㌀㈀䐀䐀䈀㄀䘀䈀㐀㠀㠀䄀㌀䈀㤀　㌀䐀䌀䔀䐀䐀䌀䐀䘀㘀㠀㘀䌀㔀　㠀䐀㌀　㜀㜀㤀　㐀䐀䌀　㤀䐀䔀　㘀䈀䔀㄀㄀㔀䌀　㈀㈀䔀　㈀䔀㜀㠀㌀䈀䐀㘀　䈀㜀㔀㔀㤀㜀　㜀䘀䐀㌀䄀㜀㌀䐀㠀㘀　㤀㜀㜀䈀䌀㄀㌀㤀䔀　㈀䌀䈀　㈀㄀㠀㜀䄀　䔀㐀㘀㐀䈀䌀㤀䄀䌀㐀䌀㜀䔀㤀㘀㘀　䘀㠀䘀㘀㘀䐀䈀䈀䄀㔀䔀㠀㠀㈀㘀䈀䈀㄀䌀㈀㜀㈀㜀㄀㜀䈀㠀㌀䐀㠀㄀㤀䌀㐀㈀㠀㠀䔀䔀㐀　䌀䔀㐀䌀㠀㠀㘀㜀　㈀㌀㤀㠀䈀䐀䌀䔀㔀㜀㘀䈀㘀㤀䈀㜀㈀䔀㐀䄀䐀㠀㠀㌀䐀㠀䐀㤀㔀䐀䈀　㄀䈀㤀㌀㌀䔀　㜀䔀㄀䘀䌀䐀㐀䘀㠀㘀䌀㔀㄀㌀　㄀䘀㜀㄀䔀㠀㠀䌀㜀　㌀䔀䔀㘀㈀㠀㠀㠀㘀㐀　䌀䔀㈀㠀㠀㠀　㔀㠀㄀㤀䌀㔀㜀䐀䐀䔀㔀䐀㄀䔀䌀㐀㈀㜀㈀㈀䈀㄀㈀㌀䄀㜀㜀㔀　䌀䔀䌀㄀䈀䌀䄀㔀㤀䌀㄀䐀㜀　䌀䘀㠀㌀䐀䄀䄀䌀㠀　㜀䈀　㐀㠀㐀㈀䘀㤀　㤀㌀㈀䐀䈀㔀䘀㌀㌀　㤀　㄀㜀䄀䐀㈀㌀㔀㠀㄀䐀䈀䐀　䘀䔀㤀㄀䐀㐀㐀　䐀　䘀㠀䘀䔀㐀　㤀䈀㠀㈀㜀㐀㄀　䌀　䈀䈀㠀㈀㜀㐀㠀㘀䐀㤀䐀㜀㈀䔀㐀䌀㈀㌀㌀㄀䈀䔀㔀㔀䈀䔀㘀䄀㤀㘀　㈀㤀㐀㔀㄀㜀　䌀䘀䄀䄀䌀㠀㜀䐀㔀㈀㤀䌀䌀㜀㐀䈀䄀㠀䘀䈀䄀䔀䘀㜀㘀㄀䘀　㄀䘀䌀㔀㌀㌀㠀㄀㘀䔀㄀䘀㄀䈀㘀䐀㄀䄀䐀㐀　㄀䌀䘀　㜀㘀䈀㌀㜀㤀䄀㘀䌀㌀䈀䐀㌀㜀䘀䘀䄀㜀㔀　㈀䔀㜀㜀　㜀䌀䄀㄀䐀㔀㈀㄀䘀䌀䘀㠀㜀䌀䔀㐀㄀䔀㤀㤀㜀䘀㈀㘀㤀䘀㜀㌀㘀䔀䘀㘀䐀䔀䔀　㜀䐀　㄀㜀䘀㌀䔀䔀㜀㘀䐀䘀䔀䘀㄀䔀䔀㔀䈀䔀㈀㌀䈀䘀㔀䈀㐀㜀䘀㔀䔀䐀䈀　䘀䈀㌀㘀㘀䈀㠀㠀㠀　䘀䈀㐀㘀䈀䌀㘀䔀䔀䔀㌀　㄀㌀䐀䌀䄀䐀䔀䔀㐀㈀䘀㜀㠀䄀䘀䌀䘀㜀䐀䐀䌀䈀䐀䐀㄀㜀䈀㠀㤀䈀䐀䌀䈀㌀䐀䐀　䐀㔀䔀䐀㐀　㜀䐀䌀　䈀䐀䐀㜀䈀䄀㔀㤀㤀㔀㐀䌀䘀䔀䄀䘀㠀㠀䔀䐀䐀䔀䔀㔀䄀㜀㐀㌀㠀　䐀䈀㌀䘀　　㘀䐀䌀䔀㜀㜀䈀䈀䈀㈀䐀㄀㌀䄀䈀䐀䐀䐀㜀䈀㤀㐀䐀㜀㜀㠀䔀㜀䈀㠀㈀䈀㄀㔀㜀䘀䄀㤀㜀䌀㘀㠀㜀䘀䈀㈀䐀䌀㤀䐀䘀㈀䈀㌀䐀㐀　㐀㔀䔀㄀䐀㄀㐀㜀䌀㈀䈀䘀㜀㤀䐀䔀㘀䔀㄀㤀䔀㌀㄀㜀㤀㘀㜀㐀䈀㌀㌀㠀㌀㌀㐀䘀䘀䈀㔀䌀㘀䈀䐀㜀㄀㘀㘀㠀㄀㔀䐀䄀㈀㐀䌀䐀䄀㌀　䐀䐀㌀㠀㘀㘀䄀㤀㤀㔀䄀䄀㈀㄀䔀䄀䘀䈀䈀䘀㐀㄀㠀㌀䐀㐀䄀㜀㜀䔀㠀䈀䄀㘀䔀䐀㌀㄀㔀㤀䐀䔀䈀䄀㐀㈀㜀㜀㘀㠀㜀䘀䄀㐀䐀㤀䘀䘀䌀㤀䔀㈀䘀䐀㄀䔀㘀㤀㈀䌀㈀䄀㘀䌀㠀㔀㐀䈀㄀䘀㈀㈀䔀㈀䔀㔀㌀䘀㤀㤀㔀䄀　㜀䌀䘀㜀㘀　㌀䄀䄀㜀　䈀䌀㠀㤀䘀㈀　㘀䄀㜀㠀䌀䐀㤀䌀　䄀㔀㘀䔀㌀䔀䘀㔀䈀㐀䌀㌀㔀㠀䈀　䌀䘀䘀䘀㄀㌀㤀㤀䔀㘀䔀䔀㘀䌀　䐀䈀㤀䌀䔀䄀䄀㤀㘀　䘀䔀䘀㠀㄀䄀䄀䄀㤀㤀㔀䈀䔀㄀㄀䘀䔀䘀䄀䈀䔀㤀䐀㘀㐀㈀䈀㌀䘀䐀㈀㔀䈀䔀㄀䄀䈀䘀㔀㘀䈀䈀䄀　䄀䔀㤀㌀䈀㄀㌀䈀䔀䄀㔀㄀䔀䈀䔀㜀䈀㜀䔀㈀㘀㔀㘀㤀㘀䔀㔀䐀㌀㜀　䈀䌀㤀䄀䄀䘀㔀㄀㤀䘀㈀㘀䈀㤀㌀㐀䔀㐀㘀䔀䈀㘀䘀䌀䘀䔀㠀㈀㄀䌀㘀䐀㈀䐀㘀䐀䘀㔀䔀㔀䘀㐀䘀䄀㤀䌀㤀䄀䈀䌀䄀㔀㈀䌀䈀䔀㈀㈀㜀䌀㜀㐀䐀䄀㠀䄀䔀㌀䌀㐀㜀䐀㈀㌀㠀㤀㠀䘀䄀䈀䔀䄀㄀䐀㐀㌀㌀䈀㌀㤀㤀䘀䔀䌀䐀㌀㔀㜀㌀䔀䄀䘀䌀䐀䈀㌀㌀䔀䈀䘀䐀㐀㔀㌀㈀㄀㌀䌀䄀䄀䌀䄀䘀䘀㄀䐀䘀㈀　䈀䘀㔀㐀䔀㤀䔀㄀䈀㄀㌀䌀䈀䄀䄀䄀䈀㈀㠀㜀䌀㜀㐀㠀㔀㄀㔀䘀䐀㜀䄀㌀䈀㐀䘀　䐀㠀䄀䄀䐀㤀䈀㈀㔀䔀㘀㤀䄀㤀䄀䌀㠀㜀䐀䄀䘀䈀㤀㘀㄀䄀䄀㈀㌀㤀　㘀㘀䄀㤀㐀㈀㌀　㔀䐀㐀䘀㐀　䄀㌀㈀䄀㐀㄀䄀䌀䔀㤀㌀　䄀䄀㤀㠀㘀㌀㔀　䄀䔀䈀㘀㔀　㌀　䔀䈀䐀㈀䌀㈀㤀䄀　䔀㜀㠀㠀䄀㘀㘀䌀㐀䈀㈀䘀䐀䈀㄀㄀㘀䐀䔀㤀㈀㤀㐀䌀䔀䄀㜀㔀㄀䔀㌀㈀䄀䄀㈀䄀㌀䈀　䐀䌀㌀䐀㈀䘀㄀㄀㈀㄀䐀䈀㈀㜀㐀　䔀㜀㤀䔀㤀　䌀㄀䐀㐀㐀　䌀䈀　㤀㔀㤀䐀䐀㤀䐀㤀㤀㘀㤀㘀䌀㜀㘀　㜀㔀㔀㈀㠀䈀䐀㔀㜀㤀　䌀䌀䈀䈀　㄀㄀㔀㘀㐀㜀㘀䔀㌀㜀㔀㐀䘀㈀䐀䐀㤀㘀　䄀䌀㌀䈀䐀䌀䔀䔀䄀䌀㠀䌀䐀䄀䌀䌀㄀䘀䌀　㔀䐀䘀䄀㠀㜀㠀　㜀㔀㔀䌀㘀㤀䔀㔀㘀㄀㤀㘀䈀㠀䐀㈀㔀䐀㠀㌀㜀㌀䄀䔀䔀䈀　㐀䔀㘀㈀䔀䔀㈀㤀㤀䐀䌀㐀㔀䌀䔀㠀䘀㠀䘀䔀　䘀䄀㤀䈀㤀䌀㈀䌀㜀䈀䄀㐀㘀䄀䘀㔀䌀䘀䈀䈀䌀䘀䌀㤀䔀䄀䄀䐀㄀㔀㌀䐀㔀　䌀㘀䔀䘀㐀㘀䘀㔀䌀䈀㔀㌀㐀䐀㔀䐀䘀䈀䄀䌀㠀㌀　㌀䄀䐀㜀䄀䔀㄀䌀䘀䌀　㈀㈀䈀䈀䈀㜀㄀䐀㄀䔀㈀䄀㔀㔀㈀㌀㘀㌀㔀䘀䈀㔀㜀㜀䄀㤀䄀㈀䈀䘀䐀㘀䈀㌀䐀㤀㔀㐀㘀䔀㜀䔀㠀䔀㜀䌀䘀䐀㄀䘀䌀䈀䌀㘀䌀㄀䔀䔀䐀䄀㤀䔀䌀䄀㐀䔀㜀䄀䈀䔀㘀䐀㘀㜀㔀㌀䔀㘀䘀㌀㘀㔀㜀　㘀㐀㘀㤀䈀䄀㌀䄀䈀㌀䌀㐀䐀㤀㔀䘀㔀㔀䐀㘀㔀䄀㔀㜀㔀䔀㔀㘀㜀㠀䐀㜀㔀䐀䈀䔀㤀䈀㄀䔀䄀㐀䄀䌀䘀䐀㄀㔀㤀䄀㤀䔀䌀䄀䌀㐀䔀㠀䔀㔀㔀㔀㘀㜀䔀㠀䔀䔀㘀㜀㈀䐀㤀㔀䌀㈀㘀䌀㜀㈀䄀㤀㜀㘀㌀㤀㔀䌀䈀䈀㄀䌀䄀䌀䌀㌀㈀㘀䈀䄀䌀䄀䄀䌀䈀㘀㐀䐀䌀䐀㜀䐀㘀㜀㔀䔀䄀㔀㐀㔀㄀㌀䘀㘀㔀㘀㄀㔀㠀㜀㘀㜀㄀䄀㜀　㌀㌀㄀䐀䌀㤀㠀㤀㄀㔀㔀㔀䘀㤀㄀䔀䌀㘀䄀㤀㤀㈀䌀　㌀䈀䄀㘀㜀㔀㈀㔀㘀䔀䄀䐀䄀㠀䌀㔀䔀㠀㔀䐀㠀䔀㌀䔀㐀䘀㐀䐀㔀䘀䈀䄀㌀㌀䌀㄀㔀䘀䔀㘀㠀䈀　㘀䌀䌀䄀㈀䘀䌀䘀㈀䘀㤀㜀㐀䐀䐀㠀㘀㜀䈀㈀㈀㤀㐀㘀㜀䔀㄀㤀㌀㤀䐀㠀㤀㐀䈀䄀㜀㘀㔀㈀㔀㘀㐀㘀㈀䘀㜀䈀㜀䌀䈀　䌀㤀㠀㔀䔀䄀㌀㠀㐀䘀　㔀㤀䐀㜀㈀㈀䐀㐀㤀䄀㔀㄀䄀䘀䘀䐀㠀㔀㤀㌀㔀䘀䔀䄀䌀㌀㤀䘀㌀䔀䈀㘀㐀䄀㠀䘀㠀䌀䐀䄀㘀㜀㌀䄀䘀䐀㤀㜀㈀㐀㤀㔀㘀㜀㌀㈀䄀㔀㔀㔀䐀㔀㘀㠀㤀㌀䘀㈀㠀䄀䘀䈀　㄀㠀㤀䘀㌀㌀㌀㔀㘀㤀䘀㤀㌀㤀㘀㤀䌀㔀䈀㤀㘀㠀䔀㔀䌀䄀㤀㔀䌀䈀㘀㔀䈀㈀䐀㈀䈀㜀㤀䌀䄀㠀䌀㘀㤀䘀㌀㜀䄀㜀䌀㘀㌀䘀㘀䔀㄀㘀㈀䌀䐀㄀㌀㐀　䌀䐀㔀㔀㠀㔀㤀㠀䘀䈀䄀㔀㄀䄀㜀䔀䄀㠀㐀䈀　䔀䄀㌀䄀䔀䐀䘀㘀䄀䄀䔀䔀㔀　㄀䘀㄀䄀㜀䐀㌀　㠀㈀䄀䐀㤀　䌀㌀䌀㤀㤀䌀㠀䘀䘀㤀䔀　㐀㄀䐀㌀㠀㄀䈀㜀㈀䔀㠀䐀㜀㜀䐀㠀㌀䄀㌀㐀㈀䔀㔀䘀㄀㔀㔀㘀㜀㐀䄀㔀㘀㜀㄀㘀㔀䐀䈀䐀　䘀㐀䘀䘀　㜀㔀㘀　䈀䌀䌀㜀䘀㄀䐀㔀㠀㄀　㈀䔀䈀䘀㔀㤀㤀䄀䘀䔀䔀㄀䄀䔀㘀㤀㔀䔀䘀㈀䘀㈀䈀䈀䄀　䄀䌀㘀㠀㘀㈀㔀㔀䔀㔀㜀䄀㔀　䌀䄀㐀㘀㜀㄀㔀㘀㄀㠀㐀䄀䔀㄀㈀㐀　䄀㔀䘀㐀㠀㘀䄀㔀㄀㤀㤀㜀㠀䘀㐀䌀䈀䈀䈀㜀㌀䐀䈀䘀䈀䐀䄀㐀䌀㌀䐀䈀㤀㄀䐀䘀㔀㄀㘀㈀㐀㌀䔀䐀䔀䔀㘀䐀䄀㠀㜀㐀㘀䘀㤀㌀㠀䘀䐀㈀㐀　䌀㄀㌀㘀㐀㄀㈀䈀㜀䌀䌀䈀㐀䘀㌀㤀　㈀䐀㤀㄀㔀䘀㔀㜀　㌀㘀䌀䌀㤀㈀䔀㌀㌀䐀㄀㐀㄀㠀㤀㈀㘀㤀　䐀䐀䌀㈀㄀㌀㌀㌀䔀㔀䘀䈀䐀㘀䘀㌀㤀䈀㌀䘀䌀䘀㔀䘀㜀䌀䔀㘀㘀䄀㜀㤀䌀㜀䔀䐀䄀䈀㄀䌀䈀　㜀㜀䈀㔀䐀㘀䔀㜀㔀䈀䘀䔀㈀䐀㐀㠀㈀㠀㐀䔀䈀㤀㜀　䘀㜀㘀㠀㈀㤀㔀　㠀㠀䘀䈀䔀䘀㈀㄀㐀㘀䌀䔀㔀㈀　䌀㠀㘀䄀㔀䌀㘀㤀㠀㄀䌀㈀㤀䐀㠀㐀㐀䈀䄀㜀㤀㌀㘀䘀㘀㠀䌀㔀㐀䄀䐀㤀㤀㔀䘀㐀㈀㜀㐀䔀㘀㤀䈀㔀㤀㜀㠀㘀㔀㠀䘀䌀㄀㠀　䐀㔀㄀䈀㈀䘀㄀䄀䔀㐀㔀䄀㄀䘀㜀㐀䘀㜀㄀䘀　䈀㈀䐀　䘀䈀䈀㈀㐀䐀㐀䄀䘀䔀　㤀㐀䔀䘀㐀䌀䌀㌀　　䘀㔀㈀㠀　㤀䔀䄀　䐀䘀䈀㄀㔀䌀㘀㘀㔀　㄀㜀㌀䈀㐀㄀㈀㤀䘀㐀㄀㔀㐀䈀㘀㌀䄀㌀㘀㤀㄀䄀䄀㈀䘀㐀㐀䈀㔀䌀䔀㄀㜀㘀䐀㈀　　䐀䐀㠀䈀䐀㜀䘀䌀䈀㤀䈀㐀㤀㤀䌀㔀䔀㌀䐀䐀㈀䐀㤀㤀㈀䔀䄀㐀㘀㤀㐀䌀㠀㄀㠀䔀㠀䘀㌀㘀䈀㄀　㜀㐀㈀䄀䈀㐀㈀㄀䘀䐀㌀㜀㤀䘀㐀㐀㌀㜀䄀㌀㠀䘀㐀　䌀䈀䈀㌀㄀䈀㐀㄀䐀䔀䐀㜀㜀䐀㈀㠀䈀䘀㐀㄀㔀㈀䌀䘀㠀　㌀㤀䔀㤀㠀㈀㔀㌀㐀　㌀䘀䄀㄀㜀㔀㈀㌀㌀㜀䐀㈀䌀　䔀㔀㌀㜀䐀䔀㠀䌀㜀䄀㐀䐀㌀　㘀㜀㈀䔀㈀䐀䐀㘀䔀㌀㘀㐀䈀䄀㘀㈀㘀㜀䄀　䈀㤀䘀㈀䘀㘀　䌀㌀䐀䐀㜀㐀　䘀䘀䐀㤀䌀㜀䐀㌀䘀䘀㐀㄀㔀㐀㘀㐀䐀䄀㐀㄀䈀䐀㄀㔀䘀㈀㤀㤀㔀㔀㌀㜀㤀䔀㠀䐀㤀䐀　㐀㤀䌀䄀䄀㌀㐀䐀㐀䄀䈀䈀㜀䄀䌀㠀䘀䔀㌀㐀䐀䐀㐀㔀㜀䈀㤀㠀㈀䐀䈀㐀㌀㠀㜀㐀㄀㤀㘀䔀㐀䄀䌀㌀䄀㠀㠀䐀䘀䈀㐀㈀㘀䘀㠀㔀䘀䔀㐀㠀䐀㤀㔀㐀㐀䘀㠀䘀䐀　㄀㌀䈀　䌀㤀䌀㜀䘀䄀㤀㐀䄀㤀㤀㐀㐀㔀䐀䘀䄀㌀䘀㔀㜀㐀㄀䘀㐀䈀㄀㌀㈀䘀㈀㈀㜀㜀㈀䘀㌀䐀㐀䄀㐀㄀㄀㘀䌀㔀㄀䈀䌀㐀㄀㐀㜀㔀㌀䘀㐀㘀㤀䄀㐀㘀䘀㌀䔀㠀㈀䄀㔀䄀㐀䐀㘀䐀䈀㐀㤀䐀㔀䔀㘀㄀䘀㄀䄀䌀㔀㘀㌀䐀䄀㐀㜀䔀㄀䔀䈀䄀㌀䔀䘀㐀㈀㄀䄀㈀㌀㄀㠀㄀㜀㈀㘀㄀䐀㌀㘀㔀䘀㐀㌀㄀㄀䈀䌀䈀䄀㘀䘀㌀䄀䐀㐀䄀㔀㐀㘀㠀㜀㈀䔀㠀㄀䐀㔀䄀㐀　㌀䐀䘀㐀㄀㈀䔀㘀㈀䈀㌀䘀㜀䐀䌀䄀　㈀䔀㔀㌀㄀㜀㔀㐀㄀䈀　㈀䌀䘀㐀㘀　䔀㠀㌀㤀䈀䌀㠀㔀㌀䘀䌀㌀㄀䌀㘀䌀㈀䘀㜀䈀㔀㘀㈀䐀㔀㈀䔀䘀㄀㠀䈀㠀㈀㄀䘀㐀㔀　䔀㠀㈀㤀㠀䄀㠀㈀㌀䐀䄀㌀䔀㄀㤀㄀㄀㤀㄀㠀㘀㜀㄀㄀䐀䐀㐀㐀䌀䘀䐀㈀䌀䈀䘀㐀㤀䘀䘀㐀㄀㜀䈀䔀㈀䔀䈀㐀㠀䔀䄀㘀䐀㈀㄀䌀㠀䌀䘀䌀　㈀䌀䈀㘀㐀　㘀䌀䈀㠀㘀䌀㜀䐀䘀䔀㈀㘀㤀㜀䌀㈀䐀㔀䘀㈀䈀䐀䔀䈀　㜀䔀䄀䄀䐀㐀　　㘀䈀㔀㜀䐀㈀㄀㘀䘀㈀㘀㌀㐀㔀㜀䄀㘀㤀　䘀䔀䐀㠀㌀㘀䘀䘀䔀㠀㌀䘀䄀䔀㤀㌀　㐀䈀㘀㐀㄀㤀䔀䌀　㈀䈀㘀㠀㠀䐀䐀䌀㔀䘀䔀䌀㈀䄀㌀䘀㠀㄀㈀㜀䔀㐀　㌀䌀㈀　㜀㘀㠀㤀㌀㜀㄀㔀䄀㘀䘀䌀　䌀䘀䔀䘀㘀㤀　㄀㜀㌀䔀㔀䄀㐀㄀㔀䈀㘀㤀㌀㜀䘀䐀㤀䄀㔀䔀䄀㔀　㌀㐀䌀㐀㔀䘀䘀㠀㔀䄀䌀㤀㘀㔀䐀䌀䔀䄀䔀㘀㘀㌀䘀㘀㈀　䘀䈀㈀㜀䔀䔀䔀䔀㜀㐀㜀䘀㠀㤀㜀㠀䄀䄀䔀䐀䌀䄀㐀㜀䌀䄀䐀　䌀䄀㠀䐀㤀䌀㄀䘀䔀䔀　䐀㜀䄀㄀㄀㤀䄀㄀㈀䘀䘀　䔀䔀㤀䐀㐀䔀䐀䘀䄀㄀㌀㔀䈀㐀　䔀䈀䔀㜀䐀㠀㐀䈀䄀㘀㠀㄀㜀䈀䐀㐀㘀䈀䘀䄀㔀䈀䘀䐀　㔀䘀䔀㤀㌀㠀㜀㌀䈀㄀䘀㄀㘀䌀㈀㤀㜀䈀㠀㠀䘀㤀㔀㤀㌀䘀㌀䈀䌀㈀䔀䐀㜀䌀㄀㠀㤀䘀䌀㤀㔀䈀䘀㠀㘀㘀䈀䌀㐀㔀㌀䘀㈀㤀㘀㘀㠀㠀䈀䈀䌀㐀䈀㌀䌀䄀㔀㠀䄀㔀㐀㈀䘀㤀㤀䔀䘀㈀䄀䄀䘀㈀㠀䔀㜀䄀㠀䈀䈀䄀㔀㄀㘀䈀䐀㈀㠀㈀㈀㜀䈀㜀　㔀䔀䘀　䔀㌀䔀㄀㤀㜀䌀㌀䐀䘀㐀㐀䌀䔀㠀㜀㔀䌀㐀㐀䔀　䌀䘀䄀䌀䘀䄀㘀㘀䄀㜀㠀䘀㐀　㘀㐀㐀䌀㔀㔀㘀䐀䄀㐀䘀㘀䘀䄀　䘀㜀䈀㜀䔀㤀䘀㜀䘀㐀㈀㜀㄀㤀㌀䘀䔀㠀㜀䘀㄀㈀㤀䈀䌀䘀䈀䔀㠀䈀㔀㄀㤀㘀䈀㌀㔀䈀䐀㤀㌀䐀䔀䌀㐀㤀䘀㘀　㈀㜀䈀㤀䐀㜀䐀㠀㈀㔀㤀㔀䄀䘀䘀　䌀㌀䄀㐀㘀㤀䌀䌀㐀㈀䈀㌀㄀䔀䄀䐀㔀䘀䌀㄀䄀䘀㠀䔀㤀㐀㘀㜀䔀㌀㜀䈀䘀　㜀䄀㌀㄀䘀㤀　䐀䘀㜀㠀䘀　㜀㜀䘀㠀䔀䘀䘀㤀䄀㜀䘀䌀　䈀䄀㄀㠀䄀㘀㄀㘀㈀㤀䌀㔀㠀㈀㘀㄀䔀㄀㈀㜀䔀䐀㄀㈀䐀　䔀㠀䄀　䘀㄀㐀㤀㜀㤀㈀䄀䐀㠀䌀㔀㈀㐀㘀㈀䈀㌀㌀㤀㔀䘀㤀㐀䄀　㠀㈀䈀㔀㌀䄀㐀㤀䔀䄀䘀䌀䔀㔀㄀㄀䘀㔀㜀㜀㜀䄀㠀䌀䘀䄀㤀㤀䘀䐀䈀㐀䄀㘀䐀㐀䈀㘀䌀㈀䐀䈀㘀㠀䘀䈀㐀㄀䈀䈀㔀㤀䈀䘀㔀㔀䘀　䘀䔀㐀　䐀䘀䌀㈀㄀㐀㠀䌀㄀䄀㔀㐀㄀㜀䘀䈀　　䈀䈀㄀䄀䈀㈀㌀㤀㈀䐀㘀䌀　㄀㌀㌀䘀䄀㔀㠀㜀㄀㄀䘀㜀䈀䈀䈀　　㘀䄀䘀䌀　䄀㌀䄀䘀䌀㄀䔀㈀㜀䔀㌀䄀㠀㘀㔀㔀㐀㠀㘀㜀㔀㤀㈀䌀　㜀㜀㘀㐀䘀㘀　䐀㔀䄀䌀㠀㘀㐀䐀㘀㜀㄀㜀䈀㄀㠀㔀䄀䌀㤀㤀䐀䐀䌀㠀㌀㘀䈀　㄀䘀䈀㈀䘀䈀䐀㠀　㌀䔀䌀㘀㄀䘀㘀㄀㐀㘀㘀㠀　㌀㤀㜀　　䐀䈀㘀䘀䈀㜀㠀㌀㤀㤀䘀䌀㌀㤀䈀㜀㠀㌀㌀䈀䘀㤀㤀㘀䘀䔀　䈀㜀䘀㌀㔀䐀䘀㠀䘀㐀䘀㈀㤀㜀䘀㤀㔀䈀䘀䌀㄀　㌀䘀　䄀䌀䈀㔀㌀㠀㐀㐀㜀䘀㠀䌀㐀㘀㠀㌀㄀㐀䐀䌀䌀㄀㜀　䈀䌀㐀㔀㔀㤀㠀䌀㌀　䄀䈀㄀㔀㘀䐀䌀　䌀䌀䘀䐀䔀㈀㔀䈀㘀㠀䈀　㌀䔀㈀　䐀䘀㄀䄀㄀䘀㠀㐀㠀㄀䌀䌀㔀䄀䄀䄀㔀㈀㠀㐀㌀㤀㔀㤀㔀䌀䄀㄀䄀䔀㔀㜀䔀䔀㔀㌀㄀㘀㔀㤀㜀䘀㈀䈀䄀䘀䄀㄀䐀䘀㔀㐀䄀㜀䌀㄀䔀㔀㘀䘀㜀䄀䈀㜀䐀䔀䄀䔀䈀䔀䄀㐀㤀䘀㔀䄀㐀㠀䐀䐀䈀䐀㈀㘀䐀㐀㌀㘀䌀　㔀䈀㘀䌀䈀㘀䐀㠀䘀䐀䈀䘀䔀䄀㐀䐀㤀䈀㐀㜀㄀㔀䄀䄀䐀㜀㘀㤀䈀䘀㘀䄀㘀䘀㘀㔀㜀䈀䐀㠀㔀　䐀㘀㄀㜀㤀䈀　䐀䌀㌀㠀䘀㌀䄀㜀㠀䌀㌀䌀　䐀㜀䈀㜀　㈀㠀䐀䘀䌀䔀㄀㌀㤀㔀㜀㔀䔀䌀㈀㠀㈀䄀㌀㈀䘀㄀䘀㘀㄀㄀㠀䈀㤀㤀䘀䈀䈀　　䔀㜀㌀䈀　㈀䈀䘀䔀㐀䄀㘀㔀㈀㈀㠀㠀㜀㔀㠀㤀㤀㄀䔀䐀䈀　㈀䐀㠀㤀䄀㜀㈀㤀　㤀㄀㈀㘀㤀㌀㌀㄀㔀䈀䘀䘀䌀䔀䔀㠀㈀䔀䐀䄀㄀䈀㄀䔀䌀　㔀㔀䄀㘀㜀䔀㌀㐀㈀䘀䔀　㜀　　䘀䐀㄀㐀㘀　䔀䘀䘀㈀㜀䔀䔀㔀㜀㤀㜀䔀㄀䔀䘀䐀㤀㘀㌀㔀䈀㈀㌀㐀䔀㔀㌀㄀㜀㄀㤀㔀䘀䄀　䄀䌀䘀䄀㈀㄀䐀㌀㠀㠀䐀䐀䄀䘀㤀㔀䔀䈀䔀㠀㜀㔀㔀䐀　㈀䔀㔀䔀䌀䄀䔀㜀䘀㄀㤀䘀　㠀㘀㈀㠀㜀䘀㄀㜀㐀㌀䌀㠀䌀㜀㠀䈀䘀㤀㘀䔀䔀㘀㄀䐀䘀㘀㌀䌀䈀㘀㤀　㜀㌀䈀䌀䄀㈀㘀䈀㈀㄀䘀䈀　㄀㈀䈀㘀㠀䔀䐀䔀䔀㐀䌀㤀㘀㈀　䔀䈀䈀㤀㤀㐀䄀㐀㌀　䘀㜀㌀㠀㔀䐀㤀䐀㤀㌀㐀䘀㘀㌀㤀䌀㄀　㈀䈀䄀㐀㄀㔀㤀㐀㈀䐀䘀䘀䐀䌀㜀㌀䘀㌀䐀㘀㔀㄀㌀䔀㠀㔀䐀䘀䄀㌀㠀䘀㠀㔀㌀㈀㔀㔀䄀䘀㤀㌀䔀䌀䔀䄀㜀㘀䔀䐀䄀㠀䌀㄀㔀㜀䐀㠀㈀䘀䔀䌀㠀㜀䔀㐀㘀㈀㜀㤀㠀㄀䄀㌀䄀㠀㈀䐀㌀㐀䐀䔀　㌀㐀㘀䄀䌀㈀㈀㤀䈀㌀　㤀䘀㄀䈀䔀㤀䔀䔀㐀䄀㤀䐀㜀㠀　㜀䐀䈀㘀　䔀䘀䈀㌀㄀　䐀㈀㜀䌀㠀㄀㔀䈀㘀　㌀䈀㐀㐀䈀䘀䔀㘀㐀㔀䌀㈀䈀䈀㄀㐀䐀㔀㘀䐀㘀䐀　䔀㜀䘀㐀㌀䘀䔀㠀㘀㌀䈀㔀㄀㜀㄀㄀㔀㔀㠀㄀㤀㌀䘀㐀䌀㌀䔀　㘀㔀䌀䄀㐀䘀㤀㔀䘀㜀㐀㈀㈀㔀䄀㄀㜀䌀䔀䌀㌀　䔀䌀㌀㈀㜀䄀㄀䌀䘀䈀㘀䔀㈀㤀㤀䐀㠀䘀㄀䐀㜀㌀㄀㠀㔀㄀䈀㈀　䘀㘀㔀㔀㤀㔀䄀㠀㠀㤀䐀䔀䔀䌀　㔀㤀㔀㈀㠀㐀㔀䐀㔀䐀㐀䈀䘀㌀㘀㤀　㤀䘀䐀　　䄀㜀䐀䔀㔀䐀㈀㄀㜀䘀䔀㠀㈀㜀䄀㄀㤀䈀㐀㈀䐀㜀㠀㔀䄀䔀䄀㘀㔀䘀　㄀㜀䈀㠀㈀㠀䐀㘀㐀㈀㜀㔀㠀　㜀㜀㘀㐀㐀㌀㜀㄀　䄀㔀䘀㐀㄀㈀㌀䔀㜀㜀䐀㈀䐀䈀㘀䌀㈀㌀䘀㘀䔀㄀䘀㤀䘀䘀䘀䈀㤀䘀㄀㐀㤀䘀㠀䈀㠀㈀㐀䈀䄀㠀㠀䘀㌀䔀㘀㄀䄀㤀䌀䌀䌀䈀㠀䄀䈀　㄀䘀㠀䔀䄀䄀䄀䈀䐀㐀㜀㘀㜀㔀䈀䈀䈀䄀㐀䈀䘀䐀䈀㤀䘀䄀䄀䄀㘀䐀㌀㐀䈀䌀㜀䐀㌀㌀㌀䐀㠀　㠀㠀䘀䔀㄀㌀䄀㈀䐀㤀㠀㄀㄀㤀㈀䌀䄀㘀䐀㜀䔀㤀㄀㌀䘀䄀㤀㈀䔀㤀㔀㠀㤀䈀㌀㐀㄀䄀㐀㤀䌀㔀䈀　㜀㜀㌀䌀㘀䌀䄀䘀䄀㌀㈀䈀㜀㠀䈀䐀䐀㠀㐀㜀㔀㌀㔀㠀㌀䄀䈀㔀㘀　䌀䘀䔀㘀䔀㈀㄀䌀䄀䘀㄀㠀㤀䌀䌀㤀㜀㈀䘀㐀㜀㈀㈀㌀䈀䌀䘀㜀㄀㌀䔀䌀䔀㜀㜀䐀䐀㠀㄀䈀㤀䘀䔀㌀㤀䌀㔀㠀㐀㠀㌀䘀䄀㜀㐀㌀㠀䌀䈀㌀㄀㐀䌀䌀㘀㠀㌀㄀䌀㘀䐀㜀䐀㄀㐀䘀　䐀䘀䌀㜀䌀㌀㄀䈀㐀䈀㜀㘀㄀　㔀㘀䘀㘀㈀㔀䐀䄀㠀㔀㤀㠀㈀㔀㌀㌀䈀㠀䘀㌀䔀䌀㔀䈀䌀㘀㌀䐀㠀㜀㠀䈀䌀㤀㠀㠀䘀㈀㐀㄀㌀㌀䐀㘀䐀䌀㘀䄀㤀䐀㔀　㜀㤀䈀䐀䔀䄀㔀　䘀䔀　䔀䐀㤀　㘀㔀䐀㜀㐀㠀㤀䌀　䈀㤀㔀㘀䌀㄀䔀䘀䄀䘀䄀㤀㈀㈀䔀䄀㈀㈀㔀㄀㠀㘀㄀㄀䌀䐀㔀䈀㈀㐀䔀䄀䌀䌀　㘀䔀㤀䄀㠀　㤀㌀䈀㔀㔀㈀䘀䌀㄀䄀䘀䔀㄀䔀䌀䔀㔀䌀㔀㐀䌀㄀㠀㘀䈀㄀㐀㜀㠀㄀㘀䈀䌀㐀　䔀㠀䐀䄀㄀㐀䌀㤀䄀䄀　䈀䔀䌀㜀㌀㠀㠀䐀　䌀䌀䔀　㠀㠀䐀䔀㜀㤀㜀㠀㤀㜀䐀㜀㠀䌀㘀㠀㐀㔀　䐀䘀㠀㄀䄀㜀㔀㜀　㘀㤀䐀䌀㜀㤀㘀䌀㄀㠀䄀㔀㠀䌀䌀㘀㌀㠀　㤀㈀䐀㠀㐀䌀㄀䄀㄀䈀㤀䌀　䐀㄀䈀䐀䔀㘀　㐀㈀䘀㄀䈀㌀䐀䘀㔀㠀㔀㘀䐀䌀䌀䘀㤀䈀㐀㌀㄀䈀䌀㐀䔀䄀䔀　㄀㔀䘀㐀㈀䈀䘀䄀㄀㤀䐀㘀䌀㐀㔀㐀㔀㘀㘀㤀㤀㔀䌀䄀㌀㔀䌀䄀㜀䄀䔀㔀㘀䈀䔀䈀㘀㜀㌀　䄀㐀䔀㈀㠀㌀　㠀䐀㈀䄀㠀㘀㈀㄀㜀㘀㜀㐀㄀㤀䈀䐀㘀䌀䐀䌀䈀䌀䌀　㐀㔀㈀㤀㔀䄀　㈀　㠀㜀䄀㘀　㐀㄀㤀䄀㔀䔀㤀㌀㘀㌀㔀䌀㠀䌀㔀㔀䔀㤀㘀㐀䐀㜀㘀㄀䌀㤀䌀䄀㤀㤀㐀䔀䄀㜀㌀㄀䐀㈀䘀㄀䐀㈀㠀㤀䐀䔀㄀㌀䄀㔀㘀㌀䄀㜀䐀䄀　㤀㐀䌀䄀㤀　㜀㜀㤀䐀㐀㐀㌀㈀䈀䄀㌀　㈀䈀㈀䔀㈀䈀䌀䔀㠀䈀　㐀㘀䘀㔀䌀㜀㐀䐀㈀㄀　㜀䐀㈀㜀㐀䐀㤀㔀䈀䔀㈀㘀㐀㌀䔀㤀㤀㌀㜀䘀㄀㌀䄀㌀㄀䈀䈀㄀䘀䌀㄀㄀㤀䔀䐀㤀㈀䄀䐀㤀䔀㤀䘀䄀㔀䔀㌀䔀㠀㘀㤀䌀䈀䌀䌀㠀䘀㐀㌀㤀㔀㐀㌀㌀䌀䐀㔀䐀㄀䌀䄀䈀䈀䄀㔀㔀䄀䔀䌀䔀䐀㜀䌀㜀䐀䈀　㐀㈀㜀䈀䈀䌀䐀㜀㄀䄀㜀㤀㌀㌀㤀䐀㌀㔀㈀䐀㈀㠀㔀㌀䐀䐀䈀䄀㘀㘀㜀㘀䈀㐀䄀㌀㘀㄀㌀䐀㤀䐀䌀䐀㘀䌀䈀䔀䘀䌀㄀䔀㔀䔀䄀㄀䔀㌀㌀㠀䄀䌀䈀㐀㜀䌀㄀㤀䐀㐀䌀䈀　㌀㐀㠀㜀䈀㌀㤀䈀䔀㤀㔀䐀㔀㤀㄀䘀䔀䌀䌀　㄀䈀䐀㌀㠀䌀㘀㌀　䐀䄀㔀䐀㌀䐀䘀㜀䘀䐀䘀㜀㔀㌀㐀䘀䌀㤀㤀䔀㄀䄀䄀㘀䄀䄀䔀䘀䌀䄀　　㄀䔀㘀㤀㔀㤀㔀㐀䔀㜀㜀　䐀㜀䌀䐀　䔀　㄀䈀㔀䐀䌀㠀䄀䄀㈀䈀䄀䈀㈀䈀㤀㤀㠀　㤀㔀㐀㈀㈀㘀　䌀䘀䈀䈀　㜀　䔀䄀䈀䈀䐀㠀㈀㔀㘀䈀䘀㠀㐀㜀䄀䌀㈀䔀䘀㠀䘀㠀㐀　㘀䄀䘀　㄀㘀㤀㘀㄀㘀䘀䌀㄀　䐀㘀䈀㘀㠀㠀㐀䔀䐀㄀㘀䌀㔀㤀䔀䈀䄀㐀䔀䘀㤀㤀䌀㔀㄀䈀䐀㐀　䐀䌀䔀䔀㌀䔀䄀㜀㄀䄀㜀㘀㈀㔀㌀㘀䐀䌀䔀㘀㘀䈀㔀䐀㤀䈀㤀㐀䄀㔀䐀䔀㔀䈀㐀㤀㄀㈀䄀㤀㠀䌀䐀䔀㤀䐀　㌀㔀㄀㔀㌀㌀㄀㘀䌀䔀㘀㌀䈀䄀㈀䔀㐀㠀㌀㜀㔀䌀㠀䔀　㈀㐀㜀㤀㤀㐀㌀㌀㠀䈀䄀䐀㤀䘀㔀䄀㘀㐀㌀㄀㠀㘀䔀䔀䈀䌀㤀㈀㔀㔀㠀㌀㜀䐀䘀䐀䌀㄀㔀䈀㔀㜀㔀㠀䄀䘀㐀㔀䔀䌀㌀䐀㄀㠀㄀㠀㘀　㄀㔀㠀䔀㘀㌀䄀㄀䄀㤀㜀㌀㈀㠀㄀䌀㔀䌀㔀㐀䘀㤀㠀㈀　㄀㤀䘀㘀㔀䐀䈀㌀㈀䌀㐀㄀㠀䌀䌀䐀㐀䄀㄀㈀㘀㌀䄀䌀㜀㐀䔀䈀㔀㠀㔀㘀㌀㐀䔀䄀㤀㠀㐀䌀㐀㐀㈀㜀㠀䈀䘀䈀䔀䄀䄀䈀䔀　㘀㜀䔀㄀㔀㐀䈀䔀䌀　䐀䔀㠀䐀䔀㐀　㤀㤀㘀㠀㘀㤀㔀㄀䈀㘀䔀㈀㘀䘀㄀䘀㄀䔀㐀䔀　䐀㤀䈀㄀㜀㠀㠀㔀㌀㘀䄀㠀㄀　䈀䔀㐀䘀㔀㌀㈀䔀㔀䐀㤀㔀䔀䄀䌀㌀　㈀㌀㔀㐀䌀䌀㜀㌀　䐀㌀㠀䘀㠀䔀㈀䔀㄀䌀㠀㌀䔀㤀䐀䔀㈀䐀㄀䘀䘀㜀㤀㠀㔀䌀䘀㠀㘀䘀䌀㔀䔀　䄀㐀䔀䐀䌀㔀䄀䄀㌀䈀㔀㠀㜀㤀　䘀㘀㤀䄀㄀㐀㌀䄀㘀䈀䐀㘀㐀㐀㈀䈀㄀㈀䐀㄀㜀㠀㤀㈀㘀㘀䘀㤀䈀䘀㘀䐀䌀䈀㄀䌀㔀㌀㘀㄀㌀　㤀㐀䄀㠀㜀䌀䌀䐀䄀䄀䌀㄀䌀䈀㐀㈀㄀㄀㤀㐀㄀㜀㤀㐀䄀㤀䔀㤀䄀䔀䈀㈀㠀㠀㠀㄀䄀㐀䘀㈀㔀㘀䄀㔀㤀䐀㐀䔀㔀㜀㐀㌀㤀㘀䘀㄀㘀㤀㜀䄀㠀㐀䈀䘀㔀㐀䈀㄀䐀㄀䘀㠀㤀䐀㠀　䈀㘀䌀㠀䌀䔀䈀㜀㘀㈀㘀㄀䌀㜀㘀䈀䈀䄀㈀䐀㤀㄀㤀　䔀　㐀㈀䐀㄀㄀䔀㜀㠀䔀䌀䐀䄀䔀㈀㠀㠀㘀㘀䄀㐀䈀㔀㐀㔀㔀㤀䈀䔀䔀㌀　䐀㌀㌀㌀㈀㜀㌀䈀䔀㐀㄀　䌀䔀䘀㐀䌀䌀㘀㈀㠀㜀㤀㜀　䈀㘀㄀㔀㌀䔀㐀䘀㜀㌀㈀㘀㘀㠀䌀㐀䐀䔀㌀䄀䄀㠀㈀　䈀㤀㘀㄀䔀㤀㔀㤀㈀㤀㈀㐀䔀䐀䐀䈀䌀䌀㤀㜀㐀䈀䄀㤀㤀䔀㔀䈀䌀㔀㘀䌀䈀㜀䐀䌀㌀㐀䐀䈀䈀䐀䈀䌀䔀　䄀䔀䐀䄀䐀㜀㘀㘀䔀䔀䘀䔀㔀䌀㌀㐀㤀㠀㄀㠀㘀䐀䐀㔀　㤀㤀㤀䄀䔀㘀䘀䌀䔀䔀䔀㈀㔀㌀䐀㌀㐀䐀㌀䈀䐀䔀䈀　䔀䌀㔀㠀䌀㌀䈀㈀䐀㐀㠀㄀㄀㤀㜀㈀䘀㤀䔀㄀䔀㌀㔀㈀㤀㜀　䌀㠀　䄀㌀㜀　㜀　㐀㄀䔀㤀㠀　䌀䘀㔀㜀䈀䄀㐀㄀㄀䐀䔀㔀䐀䈀䘀　㠀㌀㔀䘀㘀䌀㄀㠀㤀㔀㈀䄀㠀㔀䔀㘀㈀䄀㈀䐀䐀䐀䘀　㠀䈀㔀䘀㜀㐀䐀䄀䔀㐀㐀䘀㄀䘀㜀㜀䐀㤀㠀䈀䔀䐀䐀㄀䌀㔀䔀㐀䄀䈀䌀㜀㐀䄀䐀㐀䘀㠀㤀䐀䈀㠀䘀䄀　䘀䌀㔀䐀㔀䈀䘀㠀㜀㐀㐀㈀㠀㄀㠀䐀　㄀㔀㐀㜀㘀䘀㈀㠀　㠀㐀䘀㤀䐀䔀䌀䈀㐀㈀㤀䔀㌀㈀㔀䐀㔀䈀㌀㘀㔀　䐀䔀㄀㔀䈀㘀䈀㔀㘀㤀㘀䌀　㠀㜀㘀㔀㈀㔀　㠀䄀㄀䔀䔀　䘀䘀䔀䈀䌀㜀㔀㘀　䘀㜀㜀㔀䌀㄀㄀㜀䘀㤀㈀㐀㌀㘀㈀㄀䔀䘀㤀㔀㄀㜀䐀㤀䘀㐀㘀　㤀㜀䐀䄀㜀䈀䈀㈀㠀䐀㄀䈀　㌀䘀䐀㜀㈀㤀䘀㘀䐀㠀㘀䔀㜀㄀㜀䌀㄀䘀㌀　㤀㔀㠀䄀䄀㤀㄀㜀㐀䌀㠀㈀䌀㔀䈀㤀䐀䌀㜀㤀㘀䌀㘀㔀䌀㤀䈀䘀㜀㠀㄀㜀㈀㔀䌀㔀㄀䔀䌀㔀㤀㐀㤀㜀㘀㔀䈀䔀䔀䌀㠀㈀䌀㘀䘀㜀㈀䈀䌀㌀䈀㘀㤀㘀㘀㄀㈀㈀䘀㐀䌀䐀䄀㤀㤀䌀㐀㤀㌀㤀㈀㄀㈀㌀䐀䌀㌀䈀䌀䘀㄀　㤀䈀䄀㤀㄀䔀㠀㘀㔀䌀㐀㌀㌀㜀㈀㔀䄀㘀䌀䄀䐀㜀㠀㌀㠀䐀㘀䔀㐀䔀㘀䔀䌀㠀䌀㘀㈀㔀㄀䘀㈀㄀㔀䌀㄀䔀䔀㈀䌀㠀䔀䔀䄀䔀㘀㤀䈀䌀䌀䄀䌀䌀㈀㔀㄀䔀㘀䄀㠀䐀䄀㔀㄀㠀䐀䄀㌀㔀䄀㐀㘀䈀㔀㠀䔀㘀䄀㄀䘀䐀㔀㌀㄀㐀䄀㌀㜀㐀㘀㄀㔀㠀䔀䔀㈀䄀㌀㄀㈀㠀㜀㄀㤀㘀㐀㈀㐀㄀㐀㈀㘀䘀　㠀㐀㘀䔀䈀䔀䈀㄀㈀䈀㜀䘀䘀㐀㤀䌀䈀　䈀㌀䔀㐀䔀䔀㤀䐀䔀䔀㘀䄀㔀㠀㜀㘀䐀䌀䈀㜀㘀䌀䘀䄀䐀㄀㘀㌀　䐀㐀㜀䄀䐀㤀䐀㈀䌀㌀㤀㘀䔀㐀㈀㐀㄀䌀㌀㌀㈀䘀㤀䐀䔀㐀　㐀㤀䄀㄀䐀㘀㐀　䔀㘀㠀㐀㈀㐀　䌀㄀㈀㐀㠀㤀㜀䄀㈀䈀㔀㌀㌀㘀㄀　㈀㈀㘀㔀䌀　䘀㈀㔀㄀㤀䈀㘀　㐀㌀䔀䔀䐀䄀䈀㔀㠀䘀㤀㤀䄀䔀㐀㌀　䔀　㤀㜀　㘀㘀䄀㐀㠀䌀㠀㈀䄀㄀䄀䌀䄀㤀㌀㄀㈀㘀䐀㔀䄀㜀㈀㌀㈀㔀㈀㤀䈀㘀㘀㔀㌀䈀㌀㔀㠀䐀䌀㤀㠀䄀㈀㤀㈀㜀㄀䔀㌀䌀㘀㄀㘀㘀㜀䔀㜀㘀㐀㜀䈀䈀　䘀䐀　㘀　䈀䐀㤀㤀䔀䌀䐀䘀䌀㠀㈀䄀㜀㜀㘀㘀䌀㤀㠀㜀䘀䘀㔀䌀㔀䈀㜀䈀㐀㌀㜀㌀䌀䈀㐀䔀䄀㠀㈀䔀　䔀㄀㘀　㌀㐀䌀䈀㜀䐀䔀䔀䌀㤀䈀䌀䔀䘀㔀䌀㔀㐀㜀㌀䌀㄀䌀㠀䐀㜀䈀㜀䈀㌀䘀㠀　䔀㔀䘀䌀㔀㄀䌀䘀㌀䈀䄀㔀㜀䐀㐀䐀䔀䌀䌀㠀㔀䘀㜀㔀䘀㜀䌀䔀㤀㄀㌀䈀䔀㤀䌀䈀䐀䔀䈀㤀㘀䔀䌀㔀䈀㄀㘀䄀䐀㜀㌀䔀㔀䌀㔀䔀　㤀㌀䄀䄀䘀䐀䄀㈀䘀㌀㈀䈀㈀䘀䈀㐀䄀䈀　㌀㌀䐀䌀㄀㘀䈀䔀䐀㔀㄀　䐀㌀㌀㈀䄀㄀㘀䔀㘀䌀㤀䘀䐀䐀㄀㄀㐀䘀䄀㔀　䘀䐀䄀䔀䘀䄀　㘀䔀䔀㠀㈀㘀䘀㤀㤀㌀㌀㘀䔀䈀㄀䐀䘀㤀㘀㜀㠀㔀䈀䘀㈀㄀㘀䈀䄀䌀䘀䘀㘀㐀䈀䘀䈀㤀䈀䔀㈀㐀䐀䔀㜀㄀㜀䌀㈀䔀䔀䈀㔀䔀㜀㐀㘀䔀㔀㐀㘀㠀䘀㐀㠀㄀䌀㤀㄀䈀䌀㔀㈀㔀䐀㘀㤀䈀䘀㐀㔀䐀㔀䈀㔀　㐀㈀䐀㈀㔀㈀㔀㈀㄀㈀㔀㘀㔀　㐀䌀䘀㄀㌀㔀䔀㔀㔀䌀䈀㔀㔀䔀䘀㔀㜀㜀䘀㘀㐀㜀䘀㔀㤀䈀䌀䔀　㔀㐀䌀䈀䐀㠀㐀䌀㌀䌀　㠀㘀㘀䈀䈀㠀㠀䘀㔀䔀㌀㔀㠀䌀㘀㐀㄀　㘀㤀㜀䌀㜀䄀㔀㄀㘀㔀䈀䐀㈀㠀㄀㜀㠀䔀㤀㘀㘀䘀㌀䌀䐀㤀㐀䐀㐀㜀䌀㐀㔀㠀䘀㌀㄀㘀㌀䔀㈀㠀䈀㘀㌀㘀䄀㈀䔀㠀䔀㘀㔀㌀㌀㘀㌀㔀㤀䄀䌀㤀㤀㤀㐀㔀䄀㄀䌀䐀䈀䌀䐀㜀㈀䌀䐀㘀㄀䘀㄀䘀㤀　䔀㄀㄀䘀䈀㔀㤀䌀䌀㌀䌀䘀䄀㠀䌀䄀䌀䄀䔀䐀㈀　䈀㠀㜀䈀　㈀㄀㐀㤀㌀㤀㄀䐀㄀䄀㠀䈀䐀㔀䐀䌀㔀䄀䄀㄀㈀㘀㜀　䔀㠀㘀䔀䔀䄀䌀䄀㔀㠀㌀䈀䈀㠀㈀䔀㔀㠀㠀䐀㄀㤀䄀䔀㠀㘀䔀㌀　䐀㔀㠀㄀㐀䄀䌀䌀㤀䌀　㌀㄀㔀䘀䌀㌀䈀㈀䘀㜀㜀䐀㔀㈀䌀䄀㐀䌀䌀㌀䔀㠀㐀㈀㘀䄀㘀　　䐀　䐀　䐀㐀䌀䈀㔀㈀㤀㄀䔀㠀㌀䔀㈀㔀䌀㤀㐀㘀㔀䄀㐀㈀㐀䄀㜀䄀㠀㜀　䔀㐀㌀　㔀䈀㤀䌀㈀䈀㜀㤀㐀䌀䐀㄀㌀㠀䄀㔀㠀䌀䈀㤀㈀䈀㠀㈀䄀䘀㄀䔀　㤀䈀䔀㄀䈀䈀䌀㤀㔀䄀䐀㘀㄀䌀㔀㈀䌀䘀䄀䘀㄀㈀㔀㐀㔀䌀㄀䘀䘀㐀㠀䐀䘀䈀䄀䔀䄀㤀㄀㔀䘀䈀䐀䐀㐀䈀㄀㘀䄀㌀䈀䌀䘀㔀㠀䘀　䘀㤀䌀㜀㌀㠀㐀　䔀㜀䈀㌀䄀䈀䐀㠀䈀䐀㔀䈀䈀䔀䔀䈀䄀䘀䈀䔀䔀㘀䔀㘀㐀䘀㠀㈀㈀㜀㠀㈀㤀䘀㄀䌀䐀㤀㈀䌀䌀䘀㠀㘀㜀䈀㄀　䄀㄀㐀䐀㠀㠀㔀　㄀㜀㠀䔀㤀㌀㜀㔀䔀㘀㤀㠀㔀䌀㘀䌀䘀㜀䘀㌀㔀㌀㤀䄀㤀㔀䔀㘀㈀㠀㌀㔀㈀䘀㘀㔀㐀㈀䌀䄀䐀㐀䔀㐀䘀䄀䔀㐀䄀㔀䌀㤀䔀䄀㠀㐀㤀㐀㜀㄀㄀㤀㄀䈀㌀㈀䔀䔀㔀㜀㌀㜀㌀䈀㔀㔀㜀㜀㤀䌀　䌀䌀䈀㠀㐀㜀㠀㘀䘀䄀䌀㐀䈀㐀䘀䌀䈀䐀㤀䄀㤀㌀㄀㘀䐀㌀　㈀㘀䔀㔀䄀䌀䌀䌀㠀㐀䐀㘀㈀䌀㘀㘀㘀㐀㄀㔀㘀㘀䘀㄀䄀䌀䈀㠀㜀㠀㐀㐀䄀㄀䄀䈀䐀　䌀㔀㔀䐀㌀㈀　䄀㠀䐀㜀㌀㐀㘀䔀㄀䔀㤀㄀　㤀㐀䈀㌀㔀䌀䌀㘀㘀㐀㄀㠀䄀㔀㈀㐀㈀㜀䌀㜀㈀㜀㈀㔀䔀㈀䘀䔀㠀㜀㠀䘀㈀㜀㄀䌀㐀㐀㤀㌀䈀㤀㠀䌀㄀䈀㐀㐀䐀㄀㌀䐀㌀䌀䘀㌀㤀㤀䌀㘀㄀䈀䈀䄀㄀䈀䘀㌀㐀䈀㈀䔀㤀㤀㜀䔀䐀㌀䄀㈀㐀㜀　㜀䐀䔀㘀　䈀㤀䈀䘀䘀䘀㜀䔀䌀㤀䐀㐀㠀䈀㐀䈀㐀䈀䄀䘀㤀㠀㌀㌀䘀㤀㘀㤀䈀㔀㜀㜀㐀㠀䘀㘀㜀㌀䌀㄀　䘀㔀䘀㜀䈀䘀䄀䄀㘀㠀䔀䌀㔀㌀㔀㜀㤀㘀䔀䔀㔀䈀㤀㤀㌀㘀㌀㘀㌀䔀㈀䔀㜀䈀䐀䈀　㜀䐀䘀䈀䔀䔀㐀䈀䔀㈀㘀㌀㘀㐀㠀䌀䐀䌀㠀䈀㔀䈀䐀䔀䔀㜀㤀㠀䄀㤀㤀㌀䐀䄀䌀䐀䘀㌀㜀㐀㔀㔀䐀㄀㜀㐀䄀䘀㈀䐀䐀䔀䄀䐀䈀㈀㐀㈀㜀㔀㈀㜀㤀䔀㐀㘀䄀䄀㔀䐀㈀㠀㔀䔀䌀䔀䈀㠀䌀㌀䔀䔀㜀㔀㤀㈀䄀䔀䐀㤀㘀䄀　㐀㤀䘀䔀䄀㈀　㌀䌀㤀㠀䐀㈀㠀䐀䔀㠀䌀㈀㘀㠀㌀㌀㔀䄀㐀㐀㈀䈀㜀㘀㠀㌀䌀㤀　㌀㄀㜀㈀㄀㠀㄀㄀㤀㐀㔀㤀䐀㌀㤀㈀㌀㘀䈀　㄀㐀䈀䄀㜀㄀䘀㈀䈀㌀䐀㔀㘀㜀䄀㠀䔀㘀䐀䄀㔀㘀㈀㌀䘀㘀㔀㐀䔀㔀　䈀㄀㤀䘀䈀　䄀䐀䐀㐀䈀㌀䈀㘀㤀㔀㔀　㜀㄀㈀㈀㔀㤀䔀㜀㜀㔀㔀㈀䐀㘀㈀　䐀䘀䄀䈀㤀㐀㤀䐀䘀䌀㤀㠀䘀㜀　䘀㄀㠀㘀㈀㠀䌀䐀䄀䘀䈀㔀㔀㜀　䌀䘀㤀㜀䌀㄀㘀㔀㔀䘀䌀㈀䘀䄀㄀䘀䌀㄀䘀䄀㤀䈀㘀㄀䈀䐀㤀䐀䄀䔀㌀㄀䌀䈀㘀　䈀䐀㐀䐀䘀㔀㘀䄀㠀㘀㔀䔀䄀㠀䔀䘀䐀㜀䘀䘀䄀㠀㈀䈀　㔀㜀䄀䈀䈀䌀䔀㜀㔀㤀䐀䌀㈀㔀㌀䈀　䌀㌀䘀䔀㌀㈀䐀䈀㐀䌀㤀䌀㄀䄀䈀㌀　㔀㤀䔀䘀䄀㌀䌀䐀䐀㜀　㄀㘀㌀䄀䈀㤀䘀㌀㘀䌀䘀䈀㄀䐀䔀㜀䈀㈀䈀䘀䄀㄀䐀㐀㜀䄀㠀　　䔀㤀㐀䌀㘀㐀䈀䔀㌀䌀䘀㘀㔀䐀䘀㠀䘀䌀㐀䐀㄀㠀㄀㐀㤀㜀䌀䌀㤀䌀　㐀䘀䄀㐀㘀䐀㔀䈀䈀䘀㄀䄀䈀㠀㐀䈀㜀䄀㜀㘀㄀㄀㜀㘀䐀䘀㌀䔀䔀䌀㌀䔀　㌀㈀㜀㔀䌀䘀㔀䘀㠀䄀㄀㌀㔀㐀㌀䔀㜀㘀㤀䄀䈀䘀㐀㔀㔀㔀㄀䔀䈀䘀㔀㤀䈀䄀㌀䐀㘀䄀㜀䐀䌀㤀䌀㘀㄀䈀㜀䄀㔀䐀㠀㌀㈀䔀㈀㔀㌀䔀㈀㌀㌀㜀㈀䔀㌀㜀㈀㔀㌀㜀㌀䐀㌀㜀㌀㠀㜀䔀䄀㔀㌀㤀䐀　䈀㤀㐀䈀㤀䘀㘀䘀㤀䌀䔀䌀䈀㤀㔀䔀䈀㤀㔀㌀㔀䄀㤀㈀䈀䐀㈀㜀㜀䌀㜀䔀䌀㜀㘀䘀䐀㌀㈀䘀䄀㐀㔀䐀㜀䔀䘀㔀䌀㄀䘀䈀䄀㘀㈀䌀㐀㄀　㤀䈀㈀㄀㜀㜀㤀䈀䔀㤀㐀䔀㤀䘀䔀　㐀㘀䔀䘀㤀㠀㄀㈀㐀䈀㄀䔀㤀㈀㘀䘀䈀㌀䌀㜀䌀䈀　䐀㄀㜀㔀䘀㌀㌀㌀㌀㠀㄀㈀㔀䌀㠀䐀䐀㤀㘀㈀　㜀㜀㔀䈀㔀䔀㜀㈀㜀䔀㈀䌀㘀䔀䔀㌀䌀䌀㐀㠀䈀䈀㄀㠀䐀㔀㌀㤀䘀㄀䘀㌀䈀㠀䐀䈀㌀　　㐀䄀㘀㌀䌀䄀䌀㜀　㄀㠀㄀䘀㤀㘀㤀㘀䐀㌀䔀㄀㘀　䈀㄀　䔀䈀㜀䄀㌀㔀　㌀䔀䄀　䈀㄀䔀䈀䈀㈀䐀㘀㘀䔀㌀㤀㘀䈀䐀㜀䌀㤀䌀㤀䈀䈀㠀䔀㄀䐀㔀䐀㘀㘀㌀䐀㈀䘀䌀㈀䈀䈀　䘀㤀䈀䔀䘀㘀㠀㤀䌀㜀䌀㜀䄀㈀䌀䘀㌀㤀㔀㔀䄀　㜀㤀䔀䈀㔀　㄀䐀㤀䐀㠀䄀䌀㌀㠀䔀䌀䌀　㘀㄀䌀㌀㄀㄀㠀䌀䘀㄀㈀㔀䔀㌀䌀㘀㄀㠀䌀䄀䔀　㄀䔀㐀䌀㜀㈀䌀㔀㘀㌀　䘀㤀㘀㠀䌀㄀㔀㘀㔀㜀䌀㘀䐀㐀㌀㜀　䌀䈀䐀㌀㄀䘀　㐀䈀㜀㌀䘀䐀㄀䐀㜀㜀㌀䘀䈀㘀䘀㔀㠀㄀䌀㄀䈀㌀㌀㌀㈀䘀㠀㠀䔀㜀䈀㐀㜀䔀䈀㜀㌀㠀㜀㌀䘀䐀䄀䐀䈀䈀　㘀㜀　䄀䌀䘀䘀㠀㜀㈀䄀　㜀䈀䘀䔀㘀䐀䌀䘀䈀㈀㐀䈀䐀䘀㌀㠀䌀䌀㤀㘀㔀䌀㌀䌀䔀䐀䘀　㈀䈀㈀㔀㔀㜀䘀䌀䔀　䘀㠀㔀䘀㠀㈀㔀䘀　㜀䈀䘀㤀䔀㔀㘀䐀䌀㠀䈀㜀㤀䌀䄀㘀㜀㐀㔀㤀䔀㄀㔀㤀䘀㠀䘀㤀㠀㔀䔀䈀䈀䄀㈀㌀䄀　㐀䈀㜀㌀䈀䈀䌀㐀䄀䘀䌀㐀䔀䌀㄀㠀㐀㈀　㤀䈀䄀䄀㘀㈀㈀㤀㌀㔀㔀䐀㐀㜀㜀㐀䄀䄀䈀䄀㘀㄀㌀䈀㈀　㜀㜀㄀䔀䐀䘀㘀㠀　䔀㌀㌀䄀㌀㘀䈀䄀㌀㄀䈀䄀㌀㐀㔀㐀䈀㜀㐀㘀䈀㌀㐀㤀㜀䄀㄀䐀䄀㄀㄀䐀䐀㄀㜀䄀䐀㐀㐀㜀㌀㘀㜀㜀㠀䈀㄀䘀䈀䘀　㄀　　䄀㠀㜀䔀䈀䌀䄀䈀㌀㌀㜀䔀　㌀㔀䌀㜀㄀䈀　㘀䔀䘀㜀㌀䐀㘀㈀㌀㄀㌀㠀㤀㔀䌀㜀㌀㈀䈀㔀䔀㠀㔀㄀㔀䄀䘀㈀㈀䘀䌀㄀㠀㤀　䔀㈀㘀䘀䔀㈀䘀㔀㔀㐀㐀㠀㤀䌀䘀䔀㘀䌀㘀㘀䈀㤀䈀䌀㤀㈀䔀㔀　㘀　䘀　䐀䔀䌀㔀㔀㜀䈀　㜀䘀㘀䘀㌀䘀㈀㄀㌀䐀㔀䘀䌀㠀㘀㠀㄀㜀㔀㤀㠀䐀㌀㈀㘀㠀㐀䌀㜀㈀䔀䌀䌀㐀㤀䐀　䐀㔀䐀㘀㌀䔀䔀㠀㈀䄀㈀䄀㈀䔀㔀㘀䔀㔀㠀㄀䔀㄀䘀㄀㔀䄀䐀㈀㈀䌀㐀䈀㐀䌀㈀㤀㈀㘀䐀㔀㔀㐀㘀䈀䐀㔀㔀㘀䈀㔀㔀䘀䌀㔀䈀䐀䈀　㔀㄀㘀䐀㔀㄀㌀䘀㔀㜀㤀㔀㔀㘀㄀㔀㈀㜀㈀㜀䌀㜀䘀䐀㠀䄀㠀䈀䈀㜀㜀㄀㘀䘀䘀㔀䔀㌀㜀㘀㈀䌀䘀䄀䔀㐀㜀㤀㈀䌀㈀㜀㜀㔀㄀　㈀㔀㠀㔀䄀䔀㔀㈀㐀㘀㤀䘀㔀䄀䌀䌀㘀䈀　㘀䄀㜀㔀㈀　㘀䌀㌀㄀㠀㠀䄀䈀　㔀㘀䐀䄀䈀㜀㠀㤀䔀㔀䄀䄀䈀䐀㈀㜀䄀䄀㘀㄀䌀㜀㠀㌀䐀㠀㌀䐀㔀䈀䐀㔀䄀㜀㜀　䈀䘀㌀䈀䌀䘀㐀䌀䄀䘀䐀㔀㘀㐀䐀䘀　䄀䌀䔀㜀䐀䐀㈀㄀㔀㌀㔀㔀䐀䔀㌀䔀㈀䌀䌀㠀䐀㘀㄀㄀䈀䐀䐀㜀㌀䔀㘀䌀㘀　㠀䌀䄀㜀䔀䄀㜀　䘀　䌀㜀㘀㘀䐀䌀䐀㌀䄀䔀㤀㐀㄀䌀䌀䈀㜀㔀䘀㜀䐀䔀䄀䔀䈀㘀㤀㔀䘀䌀䄀䔀㠀䌀㜀㄀㘀䈀　䄀㔀㘀㄀㠀䔀㔀㄀㌀䌀䐀㔀㜀㐀㌀䄀㐀㔀䈀㘀㤀䔀䔀䐀㄀㐀　䄀䐀㘀　䌀㄀䈀䐀䐀䈀㐀　䘀㤀㤀㔀㠀䔀䌀㌀　㈀㘀㐀䔀㈀䄀䈀㘀㜀㜀㠀㜀䘀䄀䈀䈀　㘀䄀㔀䘀㤀䔀㠀㤀　㔀㄀䄀㠀㐀㔀㘀㈀䈀㌀䔀䈀㠀䔀䘀㜀䔀䌀㐀㜀㄀䌀䈀㠀　䈀㌀㠀㄀䌀　㤀㜀䌀㠀㠀䔀㈀䈀㈀䈀䈀㄀䐀㄀䔀㌀䔀㔀㈀㌀㄀䔀䌀　㔀㠀䔀㐀䈀䘀㤀㔀㈀䄀㔀䐀㤀㜀䔀䈀㤀㘀㌀㌀㔀䈀䘀㔀㘀㜀㤀䐀㐀䈀䔀䐀䐀䘀㄀䈀㐀䈀䐀䐀㜀㜀㄀䐀䌀㜀䔀䌀㈀㤀㄀䈀䌀㐀㔀㘀㤀䈀㜀㘀䘀㜀㄀䈀䌀㘀㠀㜀䘀䐀㤀䘀㄀㌀䈀㜀䔀㐀㠀㜀㤀䌀䈀䘀䔀䈀㘀䔀㌀㐀㌀䘀䔀㤀㄀㜀㈀䐀㠀䘀䔀㠀㤀㈀㌀㜀䄀䈀㔀䘀䐀㔀䄀䌀㜀㐀䐀㜀䌀㤀㌀㜀㈀㤀㌀㜀䐀㤀㌀䄀㌀㤀䐀㘀䈀㜀㔀䌀䔀㘀㘀㜀䔀䈀㤀㜀㈀䄀㤀㜀䐀䄀㤀㘀㌀㄀㔀䈀䘀㐀䔀䐀㄀㈀䄀㜀㤀㠀䐀㔀㈀㘀㤀䄀䘀㜀㄀㔀䌀䄀㐀㔀䘀㘀㐀䄀䘀㜀㌀㘀㠀䄀㤀㠀䔀㠀㈀㤀㠀㘀㈀㌀䔀㔀㄀㈀㤀䈀㘀㐀䘀㜀㈀㤀㐀䌀㔀㘀㠀㠀㈀㐀㜀㈀㤀㌀㘀䈀䈀䐀䐀㤀㄀䌀㐀䐀㌀㤀㔀㄀㐀䈀䈀㄀㘀䈀䔀㈀㐀㤀㤀㘀䔀㌀㠀䌀䄀㘀㄀㔀㜀䄀㌀㌀㐀䄀䐀䌀㠀㄀㘀㄀㌀㔀㔀㠀㐀㐀䈀㠀䐀㐀䈀㜀　䈀䐀㔀㘀㠀䘀㈀䔀㜀㘀䌀䄀䌀㐀㤀䄀㘀㔀㠀䌀㌀㌀䈀䄀㔀㠀㌀㜀㘀㌀㜀㈀㠀䄀㤀䐀㌀㈀㐀㄀䐀㔀㐀䘀㐀䌀㤀㜀䌀䌀㌀㠀㜀㔀䈀䌀㔀䄀㈀䈀㠀㠀㔀䄀　㜀䔀㤀㌀㈀䐀　䌀䄀䈀　䄀㄀㔀㈀㈀㘀㠀㐀㘀䘀㔀㄀　䐀䄀䌀䔀　䄀㠀䔀䈀䌀䐀䄀㌀䈀㈀㈀㈀䄀㌀㌀䈀㌀㐀䌀㤀䌀䌀䌀㜀㈀㠀㠀㘀䄀㈀䐀䈀䔀䐀㐀㔀㐀㈀㐀㤀㄀㐀㐀㈀䔀㄀㐀䔀㠀㜀䄀㌀㐀㠀㜀　㘀㐀㌀㤀䈀䄀㄀㄀㔀㄀　䄀䔀㜀㔀㄀　䔀䐀䌀㌀㐀㌀㔀䐀䐀㄀䐀䌀㌀㘀㈀䈀䄀㔀㤀㜀㐀㤀㜀䘀䌀䌀䈀䌀㈀䈀䐀䈀㠀　䈀䌀䈀䈀　㔀䄀䐀　㄀　　䔀䄀㜀㤀㐀㌀㤀㜀㌀㠀䈀䐀㔀㈀㈀䌀䐀䐀㐀䐀㘀䔀㤀㐀䌀䐀䘀䈀㜀　䔀䄀䈀䈀　䌀䘀㘀㤀㌀㠀䄀㌀㜀㠀㌀㜀㄀䘀㘀䘀䌀㘀㈀㌀㠀䔀㐀䌀㈀㠀㤀㈀　㤀㈀㔀㈀䄀㜀㈀䌀䈀䔀䈀㄀㐀䈀䄀㠀㤀㤀㘀㌀䈀䌀㌀㜀㔀㘀䌀䐀㤀㔀㄀㤀䘀䌀䘀㔀㔀䘀䄀㘀㜀㔀㜀㘀㤀㜀䄀㤀䄀㘀䈀㘀　䐀㤀䌀　䈀㈀䐀㈀䘀㐀㔀㐀㄀㜀㈀䔀㤀　䄀㠀㜀　䈀䐀䈀䘀㐀䌀㔀䔀䐀䔀䄀䐀㘀䐀　㈀㘀䈀䌀䘀䈀䔀㔀㄀　䔀䐀䔀㄀䔀㄀㌀䔀㘀㘀　䐀䘀䔀㠀䄀㄀䘀䔀㐀䔀䄀㜀㈀㄀䄀䘀㠀䄀　䐀㄀㘀㔀㤀㜀㄀䔀㠀㈀㌀䐀䘀㌀㈀㄀㤀㌀㘀㠀䌀䌀㤀㤀䐀䌀㈀䘀　㐀㠀䈀䈀㠀䈀䔀䐀䌀㄀㌀䈀䄀㈀䌀㘀䘀㘀　㘀㠀䘀　㘀㜀䘀㄀䘀㜀䌀㈀䘀䘀㠀　㜀㔀䌀㄀㠀㔀㌀䌀㔀㐀㜀㈀㜀䄀䄀㤀㔀㄀䈀䈀䘀㔀䔀㈀䈀㄀㤀㌀㄀㜀㔀㄀䘀䌀䔀　㈀㠀䘀㌀䌀䔀䐀䐀㤀㘀䈀㘀㘀㠀䌀㔀䐀䐀㠀䘀㐀㌀㐀㤀㄀䄀㈀㈀䈀䘀㄀䐀㠀　䐀䘀　㈀䔀㜀㔀䌀㔀㌀䈀䌀䈀䔀㐀䈀䔀㤀㐀䐀㌀㤀㘀䐀㈀䌀䌀䌀㌀㠀䌀㐀㐀㤀㄀䄀㘀㈀㜀㘀䄀㤀䄀㈀䔀㜀㐀䌀䔀㌀㔀㘀㄀㠀㜀䈀䘀䔀　㈀䈀䄀㄀䌀㠀㄀㤀㈀䈀㜀㈀䌀㘀㐀䄀㤀㄀䔀䐀　　㘀䔀䌀䘀䘀㈀䌀䌀㐀㠀㌀㌀㤀䐀䈀㔀䌀䔀㐀㘀䄀㜀㘀㠀㜀㄀䈀㘀㌀䄀㜀㤀㠀㜀䈀㌀䌀䘀䌀㤀䌀㌀㐀䘀　㠀䐀䐀㌀䔀䐀㠀䄀㤀㤀㐀㘀㘀䌀䌀㤀䌀㌀㤀䌀㔀䘀㘀䄀㈀䈀㌀㐀䔀㄀㄀䌀㜀㄀㤀䄀㜀　㠀㈀䔀䐀㜀㌀㠀㐀㜀㐀䔀㄀䐀㈀㐀㈀㠀㔀㤀䘀䈀䌀䘀㜀䄀䈀䐀㈀㄀䘀　㠀㘀㔀㄀㜀㈀䘀㈀䘀　㔀　㌀㠀㠀䔀䔀㐀䄀㤀䐀㈀㘀䘀䐀䄀㄀㄀㄀㔀䈀䄀㄀㄀㠀䔀㤀㄀䈀䔀㘀㜀䔀䌀䘀䘀㤀㌀䈀㄀㈀䘀㠀㄀㠀䘀䄀䄀䈀䄀䘀䘀㌀䐀䔀㜀䐀䌀䘀䐀䌀䔀㤀䐀㌀䈀䐀䈀㤀䐀㌀䐀㤀㌀䌀䌀㤀㈀䌀䌀㈀㐀㤀㤀㠀㐀䌀㤀㌀㈀㈀㄀　㐀　㈀䈀㤀㐀㠀　㠀䘀䈀　䔀㤀㄀㐀㄀㐀㘀㈀㈀㐀䄀㈀　䄀㠀㐀　䄀㠀㄀㘀䈀　㄀㔀䄀㈀㈀㈀㠀䈀㔀䄀㜀㄀　㔀㐀㐀㈀䌀䄀㤀䈀㔀䔀䔀㤀㔀㐀䐀㈀㐀䌀㄀㔀㈀䄀㤀䈀㔀㈀䔀䔀䐀㜀㌀㜀㤀㘀䔀㄀㔀㔀䈀㈀䈀䈀㘀㈀㠀㘀䄀㤀䈀㐀䄀䘀䈀㜀㠀㠀　㤀㔀䐀䌀䈀䌀䐀䘀䈀㤀㌀㌀　㄀䈀㐀㤀䘀䘀䔀㔀䘀㄀㌀䔀㘀㤀䔀㜀䈀䔀䔀䐀䌀㤀㤀㜀䈀䌀䘀䔀䘀䘀䌀㤀㘀䔀䘀䘀㜀䘀㜀㌀䈀㌀㜀㔀　䄀䐀㌀㄀㈀㄀㌀㠀䘀㔀㈀䔀䐀㔀㔀㔀㘀㌀䌀䌀䈀㌀䈀䄀㤀䔀䈀㌀䐀㐀㠀㤀㔀䐀㤀㘀㌀䄀㜀㌀㘀　㈀㌀　㌀㐀㌀䐀㈀䔀㈀㈀䌀䐀㠀㜀　㠀䌀㠀㜀䄀㤀㘀㄀㜀㐀㠀㘀㘀䐀㘀㄀㘀䔀㠀㔀㘀　䐀㜀㈀䐀䔀䔀㄀㌀㠀䘀㌀㌀䘀䌀㐀䈀䌀䌀㤀䈀䔀㈀㠀㜀㈀㈀㄀㌀㘀㘀㔀㈀㘀㈀㤀䄀㄀㤀㈀㄀㐀䔀㄀㌀䔀䘀㘀㄀㜀㘀㠀㤀䐀䐀䌀䌀㘀䔀㜀㄀　䘀䘀㌀㠀㈀㘀㠀䌀㤀㔀㄀㤀䈀䐀䄀䈀䄀㌀㐀䐀㄀㘀䈀㐀䐀㘀䄀㜀㌀㐀䌀䈀㜀䄀㘀㘀䄀䐀㈀㈀㐀㐀䌀㌀㜀㠀㈀㔀㘀　㜀㐀㜀䈀㘀䔀㤀㔀㈀㘀㐀㐀㠀㤀䄀䌀䌀㠀㘀㠀䐀㜀㤀㜀㘀㐀䈀㘀㄀㄀㠀㜀䄀䈀　㄀㄀㠀㤀㈀　䘀㠀　㠀䔀㌀㄀㔀㈀䄀㐀㠀㐀㈀㄀㠀㐀㄀㘀䄀㠀㔀䄀㤀㐀㐀㄀㜀䔀㘀㤀㌀㔀㘀㐀㄀䐀㈀㐀㠀㔀　㤀㠀㐀㈀䌀㘀　䄀㌀䈀㠀㐀䄀㜀㠀㐀䐀䘀㤀㄀䄀㌀䔀㐀㜀㌀㜀㈀㐀㈀䘀㠀㤀䄀㔀㠀㄀㈀䄀㐀㔀㐀㤀㠀㈀㠀䄀䌀㄀㘀㌀㘀　㤀㐀䘀㄀㌀㤀䔀䘀䄀䄀　㤀㔀㄀㜀㠀䄀㄀㐀㠀㌀䄀䄀㤀　㐀㄀䄀㘀㈀㘀㔀　㄀䘀㠀㈀㄀䐀䐀䈀㜀㄀㤀㠀䌀䌀䌀㔀㈀䔀䔀㌀䘀㜀䘀䐀㜀䈀㐀㄀　㄀㈀䄀㤀㤀㜀㜀䘀䔀䐀㔀䌀㈀䘀䌀䔀㈀㔀䌀㌀㌀䌀㔀㘀㐀㄀㤀㠀㠀䄀㜀㈀㜀㈀　㤀䔀䐀䄀㠀　䘀㌀㌀䘀䄀䌀䌀䘀䐀㤀䌀㘀㘀䐀㄀㌀䈀㜀㈀䈀䐀䈀㔀㔀㔀㘀䌀㐀㠀㈀㈀䄀䐀䄀　㐀㔀䘀䌀㈀䈀㜀㔀䄀㔀䄀䔀㔀㄀㐀㔀㘀㌀㤀㔀㘀䈀䈀㌀㜀䈀　㤀䈀䌀㔀䌀䐀䌀䄀　㘀䘀㔀㔀㘀䔀㜀㘀㘀㘀䐀㤀㌀㜀䈀㤀㌀㜀㜀㤀㌀㘀䘀㐀㌀㐀　㄀㄀㤀䌀䄀　　㤀　㄀䈀㜀㌀㌀䄀　　㔀㜀䌀䔀䔀㠀　䔀　䄀䄀䈀㐀㐀䄀䘀䔀㐀䄀㠀㄀䘀㄀㈀㐀㜀㘀䌀䈀㄀㠀䌀㤀㜀㘀㌀㤀㤀䌀㠀䈀㠀㘀㜀䄀䈀㠀㈀䄀䄀㐀㠀㜀䐀䄀㐀㈀㈀䈀㐀㈀㔀䐀䄀㄀䔀䔀㄀　㄀䘀　䔀㤀䐀　䌀㤀㄀㤀　㌀䐀䐀㄀㠀䐀㌀　䔀㔀㤀㘀㔀㔀䔀㘀㤀䌀䐀䘀䈀㄀䈀䘀㘀　䔀䐀䄀䘀䌀䘀㠀㜀㐀䌀㄀㌀䈀㤀㘀㔀㐀䐀䔀㐀䐀㘀䐀㜀䐀㐀㐀㜀㄀䐀㘀㈀䈀㘀㄀㌀䐀　㜀䘀㄀䄀䈀　㌀䐀㠀䐀㠀㤀㌀㤀㜀㠀㠀䄀䈀　㐀㘀㐀㌀㈀㈀㠀　㌀㘀　㠀㠀䘀㤀㤀㌀㄀㌀㔀㌀䘀㔀䘀䈀䌀㜀㤀㌀䘀㘀䔀䌀㘀䈀㜀㄀䄀㘀䈀㠀䐀䌀㌀㐀㘀䄀䘀䈀㄀㄀㘀㔀㜀㜀䘀䈀㘀㜀㜀䔀䘀㔀䘀㌀䔀㌀䄀㜀㠀䘀　㄀㠀㜀㤀䘀㜀䐀㠀䘀㘀㄀㔀䘀䈀㤀㈀䌀㌀㠀䐀㘀㔀䌀㘀　䔀䔀㌀㈀㄀㘀㌀㌀㤀㠀　䐀㐀㈀㔀㔀䘀㄀䈀　㌀　㌀　㌀䔀㜀䌀䔀㜀䔀㐀㌀䔀㔀㐀　㄀㄀䐀䈀㔀㤀䈀　　㈀㈀䄀㠀㜀㔀㔀㜀䄀　㤀䌀䘀䘀㔀㘀䄀䈀䐀㌀䔀㘀㘀㄀䌀㠀㜀㄀㜀㜀㌀䔀䘀㜀㌀䌀㐀䔀㤀㈀㠀䈀㄀䄀䄀㈀䄀　䄀䐀䄀㈀㤀䔀㘀䈀㄀㈀㄀䐀㄀䘀㌀㘀䘀㘀㠀䐀㐀㔀㌀㄀㐀䄀䄀䌀䄀㠀䘀㠀䘀　䈀䐀㤀㘀䐀㄀㜀㜀䈀䘀㤀㠀㈀㘀䘀　㌀䐀㈀䘀㌀㜀㠀㌀㐀　䘀㜀䔀㈀䔀㘀　㔀㈀㤀㠀㌀　　　䐀䌀㜀㤀㔀䄀㄀㌀㠀䈀䘀㤀　㤀　䌀㈀䐀䌀䘀㘀䄀䔀䔀䌀㜀㜀䘀䌀　䔀䄀䌀䌀䈀㔀㐀䘀㈀䔀䐀䌀㌀㘀㜀㔀䔀㤀㘀䈀䈀䘀㜀䄀㜀㠀䘀㜀䘀㜀䌀㜀㔀䌀㌀䔀䈀䔀䄀䔀㤀䈀㌀䈀䔀㐀㠀㤀㜀䌀䈀㐀㜀䈀㘀㌀㐀䘀㠀㜀䌀㌀䐀䐀䘀䘀㜀䈀䘀㘀㐀㔀䄀㌀㘀䐀䌀㠀䌀㈀䐀㄀䐀㌀㤀㜀㔀㠀㘀㔀㜀㌀㔀䔀䄀䘀䔀㔀　䈀㘀㄀㔀䔀䐀䐀䄀㠀㄀㐀　㠀䌀㌀㠀䐀㄀䈀㐀㈀㄀䈀㈀㌀㌀䈀䐀　　䔀㘀䐀䄀㜀㘀㜀䄀㜀㤀㜀㔀䘀㘀䐀䈀䘀䐀㄀䈀䈀㈀䄀䈀䌀㐀㄀䐀䔀䄀　㘀䔀䈀㈀㘀䘀䐀㈀㌀㘀　㜀㐀㔀㌀䔀㈀㐀㤀㔀　㐀㠀㈀㔀䄀㐀㠀㠀䈀䘀㠀㐀䈀䄀䔀䘀㘀䐀䔀㠀　䌀㐀䔀䈀㄀　䌀䔀　㠀㐀䈀㐀　䌀㔀䐀㘀　㐀䐀㘀㄀㐀䄀䔀　㤀䐀䘀㈀㘀㘀䌀㜀㘀㘀䌀　䔀㘀䌀　㠀㌀䘀㈀　䔀䌀䈀　㘀䌀㜀㔀㌀䌀㈀㄀㌀䌀䔀㜀㜀㤀䐀㤀䘀㌀䈀䔀䌀㜀㔀㄀㄀䘀㤀䌀䔀䈀䔀㠀㄀　㌀䄀䔀㐀㄀䈀䐀　㄀䄀㠀㄀㘀㜀䘀　㘀㐀㌀㐀㄀䘀㔀䐀㠀㌀䐀㠀㘀㈀㐀䘀㌀㐀㤀㄀㈀㠀䘀㘀　㠀㠀㠀䔀㄀㐀㤀䈀䌀　　㈀　㔀㌀䄀㈀㠀㜀㐀䌀㌀䔀㄀　㤀䘀㄀㘀䄀䐀㤀㐀　㠀㤀㔀㤀㠀䌀䐀㤀㄀㈀㘀㌀䐀㜀㠀㤀㘀㘀䔀㘀㌀䐀䔀㤀㔀䄀㐀㜀㠀䈀䌀䌀㠀㤀䘀㈀　㤀㌀㜀㘀㤀㜀㘀㌀㘀㜀㔀䔀㤀䄀䌀䔀㤀䌀䈀㘀㤀㐀䔀䈀䔀㔀㘀䐀䔀㔀㈀䈀䌀䄀䈀䈀䌀䄀䈀䈀䌀䈀䘀㤀㜀　䘀㤀䌀㤀㜀㈀㔀㈀㔀䔀㤀㐀䔀㠀㔀㘀䈀　㐀䐀㈀㤀㔀㈀䄀䄀㄀㐀㠀㘀㤀㈀䐀㈀䘀䐀㘀㔀䐀䘀䐀㔀㄀㘀㤀　䔀䈀䘀㄀㜀䔀䌀　㔀㌀䄀㠀䔀㤀㔀㐀㔀䘀䐀㈀䐀䔀㘀䘀㠀　䐀䔀㘀　䔀䄀䘀㐀㔀㄀㈀䔀　㜀㠀㈀㌀䄀　㄀㔀䈀䌀㄀㈀䈀㔀䈀䔀㈀䘀㄀　䄀㈀　䐀㐀　㐀㌀䘀䌀㠀㜀㈀㤀　　㌀㘀㠀㐀　䌀㤀䐀　䈀䌀㄀䔀䈀㤀㈀㤀䐀㔀䄀㤀㠀䘀㈀㜀䔀䄀㌀䐀㔀䌀䘀㔀䈀㔀㔀䐀䐀㜀㠀䔀䐀㄀䐀㔀㠀㌀㜀㜀䔀䐀㌀㘀㤀䔀㌀㄀㘀䔀䌀㈀㔀䐀㜀㠀　㈀㘀䔀䌀㄀㘀䈀䔀䈀㐀䄀㠀䐀㐀㌀　䐀　䐀䌀㜀　䔀㄀䌀䘀㠀䔀㐀㤀㌀䄀㜀䘀㔀㠀㘀㜀㤀䐀㤀㔀㤀䘀㜀㄀䌀㤀䄀㌀䄀䔀㐀㜀䘀㘀䈀㌀㄀䔀㄀　㜀㐀䐀䘀㠀㐀䔀䈀䌀　㐀㈀䘀䌀㘀㔀䈀㠀䌀㐀䔀䔀㌀㠀㄀㔀䘀䐀䔀䈀㔀㐀䌀㄀䘀䘀㌀䌀䈀㄀䘀㄀㠀䐀䘀㤀䌀䔀䈀　㜀㐀㔀㜀㌀㠀䘀㠀㠀㌀䌀㔀㄀㐀㌀㌀㔀㠀䐀㘀㈀㈀䘀䌀　㈀䔀㌀　㌀㌀㄀㄀㜀㐀㔀㘀䈀䘀䈀㤀䌀㄀㌀㘀䌀㄀㜀㘀䄀㤀䈀　䐀㐀䈀㈀㔀㐀㜀㤀㔀㈀㜀䄀㐀䌀䔀䐀㠀䔀㌀䐀䄀㜀㜀䔀㈀　䌀㤀䈀䌀䌀㠀䌀䈀㔀䔀䐀㄀㈀㌀　䘀㔀㔀㔀䈀䐀㐀㄀㘀㤀䈀㈀　䐀䄀㈀㔀㠀㜀䄀㘀㘀䄀㌀㘀䌀䐀㌀䔀㔀㐀㄀䐀㘀䄀㄀䈀㘀㜀䈀䈀㔀䔀㔀䐀㘀㌀㜀䘀㐀㜀䈀㘀䄀䌀㤀㘀㔀㘀䘀䈀䈀䘀㄀䘀䐀䄀㈀㐀㘀䐀䘀㈀㘀䘀　㠀䘀㄀㤀㈀㐀㜀㤀㌀㄀㐀㤀䈀㌀䄀㐀䈀䈀䐀㔀䔀㔀䐀䄀䘀䐀䔀䄀㜀䘀䔀㔀㐀䔀㔀䐀㐀䈀　㔀㔀䐀㄀䄀䌀㔀㘀䌀㔀䄀㘀䈀㠀䄀䐀㔀䔀㐀䘀㠀㤀䌀䈀䄀䔀䔀㄀㌀㘀䄀䐀㔀䈀㈀㌀㤀䄀㠀㘀䌀㈀㄀㄀䄀䄀䌀㠀䄀　䐀㈀㘀䔀㈀㐀䄀䄀㌀㐀㐀㔀㤀㈀㐀　㔀㘀䈀䈀㤀㔀㔀㠀䐀䘀　䐀㈀㘀䈀䄀䘀㤀㌀䐀䘀䌀㄀㄀䘀䔀㈀䐀㤀䔀䔀㔀㌀㜀䄀䔀㠀㠀䔀㄀㜀　䄀䌀㈀䄀㐀㘀㘀㈀㄀㄀䘀㜀䌀㔀䘀䄀㄀䌀䄀䐀䈀䔀䘀㈀㠀㈀㌀䔀㤀䈀㔀㘀㤀䄀䔀㜀䘀㠀㘀㘀䐀㠀䈀䄀　　䔀㠀㐀䐀䘀䘀　䌀䈀䔀㌀㤀䄀䈀䐀䔀㘀㠀㜀䘀　㤀㌀䈀䘀㈀㤀䌀㄀䔀㤀㤀㜀㌀　　䄀䄀㔀䔀㘀㌀㘀䄀㌀䄀䐀　㜀㠀䄀䘀㈀䈀䌀㈀　䌀㈀㄀䈀㄀㤀㠀䌀㌀㜀㄀㐀㄀䐀䘀㠀㄀䈀䄀㈀䘀䘀䘀䔀䈀㜀䈀㔀䐀㈀䘀䘀䔀䄀䄀䔀䐀䌀㘀䄀㔀䘀䈀㠀䐀㄀䘀䈀䘀䈀䘀㜀㈀䘀㘀䔀㔀䔀䐀㠀䐀㜀䘀㜀㠀㘀䘀㘀㤀䔀㌀䈀㐀䘀㄀䌀㔀䌀䘀㤀䔀䔀　　䔀㐀䐀䘀䈀䔀䐀䌀䐀㌀䘀䘀䈀㜀䐀䌀㄀䈀　　䐀㐀䘀㄀㤀㜀䘀䌀㘀㐀䐀㐀䘀㘀㔀㈀㈀䘀䐀㌀䈀㤀㤀䄀㤀䌀㔀㜀㌀㈀䘀㤀㤀㜀㠀㤀㤀䌀㈀㔀㄀㤀䌀㌀㐀㜀㄀䔀　㌀㌀䘀㘀㤀䘀䄀　䘀䐀㄀㔀䘀㠀㈀䐀㜀䐀㘀㐀䄀䘀䄀㌀㈀㜀䘀㐀㔀䌀䔀㤀䌀䈀㄀㔀㈀䌀㄀　㜀㄀㌀㜀㄀　㜀㄀䈀㜀㈀䘀䈀㤀㠀㠀㔀䈀㔀㐀㜀䄀㄀䐀䈀䘀䐀䄀㜀䄀㔀䐀䔀㤀㔀㄀䔀㔀䘀䐀㤀㠀㤀㈀㤀㄀䔀㜀䄀㠀㜀㌀䄀㈀㤀㤀䐀㠀㄀㈀䄀㔀䐀䐀䈀㤀㌀㠀䐀㈀㔀㄀䈀䄀䈀㠀㘀㈀㔀㔀㘀㠀㐀㌀㘀㠀㘀䈀㐀㐀㜀㄀䌀㘀㈀㠀㤀㘀㈀䄀㈀䌀㐀䄀䐀㌀㔀㘀㔀䘀䔀㐀　䘀䄀㐀㘀㜀㐀㐀㘀㜀䌀㐀㜀䔀㄀㔀䘀䐀㔀㔀㠀䌀䔀䐀㠀䌀㜀㘀䌀㘀㘀䔀㠀䄀䐀䔀㄀㐀䘀䈀㈀㐀䘀䄀㐀㤀㠀䌀㐀䘀䌀䄀䔀㔀䐀㘀䔀㈀㘀㠀㜀㄀䄀䌀䌀㄀㤀䄀㠀䔀㐀䐀㤀㈀㈀㜀㔀㤀㤀䈀䄀㌀㘀㌀㘀㈀㐀䈀䄀䐀㠀䈀㘀㈀㘀䈀䄀䌀㌀㜀㐀㐀㌀㜀㔀䈀㘀䘀㠀䈀㌀䔀㈀䄀㌀䘀㘀㘀㜀䐀㌀䌀䔀䄀㤀㈀㘀㐀䌀㤀䌀䄀㐀㜀䘀㤀㤀㠀㔀䘀䘀㘀㔀䈀㌀䐀㔀㄀㈀㄀㄀䄀㤀㌀䄀䐀㈀䌀䘀㘀䈀㘀䘀䄀㜀㐀㜀䘀㌀㠀䈀䐀䐀䌀㠀㜀㤀㜀䘀䈀㜀㘀䘀㤀㠀㠀䔀䘀㄀　㔀㤀㠀㐀㠀㈀㄀　㄀䘀㄀㐀䄀　㈀㐀㐀㄀㄀䌀䄀䌀䐀㐀㄀㠀㌀㐀㄀䔀䐀㌀㠀　㌀㄀㈀㄀㄀　㐀䔀㔀㜀㘀㄀㄀䐀㐀䘀䌀㜀㘀䐀䘀㠀㈀䔀䐀䌀㠀䐀䘀㜀䔀　㈀㌀㔀㠀䌀㐀㜀䘀㘀㜀䘀㔀㐀　㠀㌀㤀䐀䌀㔀㘀䌀㘀㔀䈀㤀䔀㐀䘀䈀㘀䄀䌀　㠀䈀䈀䐀䈀䄀䌀䈀㤀䈀䘀㘀㐀䔀㄀㈀㄀㈀䘀㄀䌀　㄀　䈀　㄀㤀䘀䈀㄀䔀䔀　䌀㔀㤀㌀䘀　㔀㜀㠀䔀䐀䌀　㐀䘀䄀㈀䈀䐀䘀䌀䔀㜀䈀䄀㌀㐀㤀䈀㌀䔀㘀䔀䔀㐀㔀䘀䄀䈀　㠀䌀㤀㤀䄀㄀㤀㤀㘀䄀㌀䘀　䐀㘀䐀㜀㈀㈀㔀㐀䐀　䈀㜀㐀㈀㘀㐀䘀㘀㔀㤀㌀䌀㜀㜀㌀䔀䐀䌀䄀䔀㐀㜀㄀㌀　䄀　㔀䌀㔀　㌀㄀　㄀㜀䈀㄀㐀䔀㐀㄀㄀　䌀㠀䐀　㈀㜀㤀䈀䌀㤀㔀㘀䘀䘀䘀䈀㈀䌀䘀䐀㔀㄀　　㔀䘀㄀㐀　　㌀䈀䐀䐀㜀䘀㘀㌀㤀㘀㤀䔀䘀㈀䐀䐀䐀䔀㘀㘀䌀䈀　㠀㘀㤀䐀　䐀䈀㈀䘀㤀䈀㈀䐀㄀㘀㌀㤀䘀䔀䈀䄀䄀　㈀䌀㜀䄀䌀　䐀䈀㈀㠀䘀䈀䔀㔀䌀　䐀䐀䘀䄀䄀　䐀㘀㜀䘀㈀㈀　䐀　㌀䐀㔀䌀㄀䔀㘀䔀䄀䐀㠀䈀䐀㘀㠀㄀㄀䌀㈀㜀㔀㠀䌀㜀㐀㐀㔀䈀㘀㈀㠀䘀䌀䄀㐀䘀㐀㐀㘀㔀㤀㐀䌀䐀　䌀㄀㈀䘀㜀㄀㈀㠀䘀㈀㜀䔀㜀䘀㈀㄀㌀䔀㘀㘀䘀㔀䐀㜀䄀䔀㠀　㔀㠀䄀㈀㐀䘀　㘀䔀䌀䐀䔀䈀㘀㄀㐀䐀䌀䐀䄀㈀㌀㤀㠀䌀㠀㤀㌀㠀㄀䌀䐀㠀䈀㔀㜀㄀䌀䈀䐀䐀㈀㌀㈀㜀䄀㜀㜀䈀䘀䘀䐀䔀䈀㘀㜀㄀䐀䐀㔀㜀㐀䘀㘀　　䐀㜀䈀　㔀䔀㌀　㌀䐀㜀㠀䐀㌀㜀䐀䔀㌀㐀㈀㄀㔀㔀㌀㄀　䌀䔀䘀㜀㤀䘀㌀䘀䄀㌀䈀　㘀䐀　　䈀䌀㘀㤀㜀䌀㘀䘀䈀䘀㠀䄀㌀㠀㈀䈀䈀㌀㜀䄀䐀㤀㤀㤀㄀㤀䔀㄀　㜀㐀　䔀㄀㤀䐀㄀䈀䄀䔀㘀㤀㤀㄀㔀䈀䘀㘀䔀䘀䘀䔀㜀㘀䘀䄀䐀㤀䐀㔀㜀䐀㘀㐀㔀㄀䈀䐀㈀㈀㔀䄀㤀䘀㘀㘀䈀　䘀䐀䘀䈀䔀䘀㘀㠀䘀㔀㜀㘀㌀䘀䄀㠀　㈀㈀䄀䄀㠀　㘀㠀䐀㄀㘀䈀㘀㘀㌀㤀㔀㜀䔀䄀䈀㄀㤀㐀㔀㐀䌀㔀㔀㘀㜀㄀䐀㌀䄀㔀㄀㔀㔀㈀㤀㜀㜀㐀㤀㜀㈀㐀䘀　㤀㠀㈀㌀㈀㔀㈀䌀㐀㌀　㐀㈀㐀㐀䄀㔀䔀㘀䘀㠀　㔀䐀㐀㜀㤀㄀㄀　䄀䔀䐀㐀㘀㔀㔀䔀　㠀䔀㌀㈀䄀㐀㐀㄀㜀㔀㘀䐀㌀䄀䔀㠀㌀㔀㄀䄀㜀㤀㌀㄀㔀䄀㐀㠀䈀䐀䌀㐀㔀㔀㠀䔀㈀㄀㜀䘀䈀㤀䘀䌀䔀䌀䘀䌀䄀㠀䌀䈀㤀㜀䈀　㤀䌀䌀㠀䄀䌀㤀㤀　䘀䈀㄀䈀㘀㄀㌀㌀㜀㘀㔀㄀䘀㌀䘀㄀㜀䌀䈀㐀㘀㠀㌀㐀㠀㤀　㄀㠀㐀䘀㐀㌀䄀䌀䄀㠀䘀䘀㄀䌀㜀䌀㘀㄀㐀䘀㘀㐀㜀䌀㘀㔀㐀䘀㘀䌀㔀䈀㌀㘀㜀䈀䘀䄀㄀䌀䈀䈀䄀䔀䘀㠀㔀㔀㠀㔀䔀　䌀㜀㜀䔀㔀㐀㜀䈀㜀䔀㤀䌀㌀　㐀㔀㄀㤀　　㐀㌀䈀㌀㠀㄀㄀㘀㤀㤀䌀㌀㠀㐀䔀㄀㈀㈀䔀㤀㔀㔀䄀䔀䐀㔀䈀䔀䐀䐀䈀㄀䌀䐀䈀䐀䐀　䘀㜀䄀㄀䔀䈀㌀㄀䘀䘀㐀䘀䌀䐀䔀䘀䐀㈀㤀㜀䘀㤀䄀䈀㜀㔀㠀㄀㔀　㔀㈀㌀㈀㈀㤀㐀䈀㠀㈀㐀䌀㔀㄀㈀䈀㘀䈀䔀㐀㤀䔀㄀䄀䔀㐀㤀䘀㐀㠀㈀䐀㌀㠀㌀㘀䐀㐀㄀㘀㘀㐀㔀䈀　㈀䈀㐀㠀䌀㈀䌀㄀䄀䄀㘀　㜀㜀䘀　㐀㠀㤀　　䐀㘀㈀㘀　㐀㐀㘀㄀㜀䘀㤀㔀䘀䘀㠀㠀㤀䘀䘀㄀㔀㌀㐀㜀㄀　䘀㠀㠀䘀㐀㐀䄀䘀䌀䘀㜀㐀　㘀㈀㘀㐀㄀㜀㈀㐀㔀㄀䌀㌀　㈀㔀㄀䔀䐀㌀䈀㐀　㄀㠀䐀䐀㠀㔀㔀㄀㈀㠀䈀䐀㈀㄀㐀㐀䈀䐀䐀䈀䐀䈀㠀䐀㐀䔀㈀䐀䄀䘀㈀䌀㌀䈀㔀㔀䐀　㄀㔀䌀㔀䄀㜀㔀䐀㌀　㜀䌀䘀䈀䌀㜀䐀㜀㐀䄀䐀㄀㘀　㈀㜀㠀䘀㈀䐀㤀䔀㄀㘀㄀䘀㌀䄀䔀㔀䐀䈀䌀䘀㔀㄀㤀㈀㘀㜀㤀䌀䔀㌀　䌀䔀㜀䔀䈀㠀㌀㔀㜀㌀䌀㔀㠀㌀㜀㌀䐀㘀㤀䔀㐀㘀䘀㐀㌀䘀㘀㈀　㘀䌀䘀㌀㤀㄀䈀䌀㘀䌀㜀㘀㌀㜀㔀㌀䘀㘀㈀䈀　㐀㠀䈀㌀㄀䌀䌀䔀　㘀㤀㌀㄀㘀䌀䌀　䔀　䌀㐀䘀㄀䘀㄀㄀䐀䘀䌀㜀䔀䘀㤀㌀䄀㌀䔀䌀㔀㄀㠀䔀䄀㌀㄀㐀㘀㐀㌀㔀䈀㜀　䐀㘀䘀㈀㔀　䘀䈀　䐀䈀䈀㤀㔀䐀㌀㐀㜀䈀㘀䔀䔀㄀㔀㌀㈀㈀䄀㔀㌀㤀㘀䐀䔀㈀㈀䄀㈀䌀䘀㠀㤀㄀㠀㜀㈀䘀㐀㌀㜀㄀㜀䔀　㈀㄀䄀䌀㜀㔀䘀　䄀䈀㌀䌀㠀㄀　㄀㈀䌀㘀㐀㠀㠀㌀䌀㤀䔀㔀㤀㤀䘀㌀㄀㤀㘀㔀䄀㘀㠀㜀㈀䌀䐀㐀㈀䐀㌀䌀㜀　㘀　㄀㘀㄀　㈀䔀㈀㘀䐀䌀㈀㄀㜀㈀　㔀㔀䐀䐀䘀㐀䔀㔀㔀䐀䈀䌀㈀䔀㈀㜀㔀㘀䌀㄀㜀䘀䈀㌀㄀㜀䈀㠀䌀㘀㔀䐀㤀㄀䔀㘀䌀䐀㄀䔀㔀㜀㔀㐀䌀㄀㜀䘀㌀㌀㄀㜀㌀　䌀䔀㠀㄀㠀䐀㠀䔀䄀　㄀㌀㠀　㌀　㠀䌀㄀㈀㄀㘀䌀㐀㄀㠀㐀䔀㘀㤀㈀䄀䈀㌀　䌀㘀㜀䔀䔀㄀䄀㈀㔀䌀㌀㈀㔀㠀㔀㠀䘀㘀㔀㐀㌀㘀㤀䈀䘀㐀䘀㔀㤀䐀䌀㜀䘀䈀㜀䐀䐀䘀㐀㘀䘀䈀㄀㜀䈀　䔀䌀㤀㄀䘀䐀䘀㘀㄀䌀㠀䄀㌀䐀　　　　㜀㘀㌀㘀䐀　㤀䌀䄀䌀　㤀㘀㄀䌀䐀㔀　㠀㘀㤀㈀㄀㠀㌀　㔀䘀　㐀㔀㌀䌀䌀㠀䘀㠀㤀䄀㔀䘀䘀㄀㐀㄀䔀㠀䐀䈀䘀　㜀　㄀㘀㠀㜀㠀䘀䘀䘀䘀䔀㄀　䔀㜀䐀䘀㌀㘀䈀㜀㘀㈀㐀㔀　㔀㈀䐀　　䌀　㄀㈀㄀䔀㄀㜀㘀䌀䄀㄀䈀䘀㄀㠀　䔀䔀㐀䌀㌀㈀㐀㤀㌀䔀㘀䌀䄀㤀䈀㔀䈀　㈀　㐀㠀㠀䈀　䔀㠀㈀䔀㌀㐀㄀㠀㈀䘀䈀䄀㄀㘀㔀㈀䔀㘀䄀䘀㜀䘀㤀䔀䈀　　㤀㤀㤀䘀䐀　㈀㔀㤀䄀㐀䈀䘀㜀䌀㌀㐀㘀㄀㤀䔀䌀㈀㄀䐀䄀䔀㌀䄀㠀㌀䘀䌀䌀㜀㠀㐀㈀㘀㤀㌀㘀　䌀㄀䈀　㄀䄀㠀㄀䌀䄀䘀　㐀㤀　㔀䈀㈀䄀㐀㌀㈀㔀㤀㈀䘀　㠀㔀㜀䌀㐀㈀㌀㤀㈀㌀㜀䐀㈀䐀㤀䘀㔀㄀䈀㠀㔀㜀䈀㠀䐀㜀䔀㐀㔀㜀㤀㐀　䘀䐀㄀䈀䈀䌀　㄀䌀䐀䘀㔀㜀䈀䔀㐀㐀㤀䘀㐀䄀䐀㈀㔀㌀䔀䌀㐀䘀䈀㤀䄀㜀䔀㐀㤀䘀㈀㤀䌀䘀䈀㌀䘀䈀䈀㤀䔀㜀䔀㔀　㌀䌀䄀䄀䈀䄀䌀㌀㐀㠀㐀㠀䐀㜀㈀㈀㤀㌀㤀䄀䌀㌀䌀䌀㠀䐀䔀䌀䈀㌀䐀㈀㠀䐀䘀䄀䘀㠀㠀䘀㤀䄀䌀䈀㤀㠀㠀㔀㔀㈀䈀㔀䐀㠀䌀䈀㈀㔀䘀㠀䐀䔀㐀䌀㠀㠀㜀　㐀㌀䈀㐀　䘀䌀㈀㈀䘀㐀㤀㘀㜀㜀䔀䔀䌀䘀㜀㄀䌀㈀㤀䐀䈀䄀㤀䈀㌀㈀䌀㐀䄀䈀㘀㠀䌀䘀䌀㈀㌀㌀　㠀　䈀䄀䌀㤀㤀㤀㜀㌀㈀㘀䐀䔀㘀㈀㈀㄀㘀㘀㠀㠀㘀䄀㌀䔀　䈀㌀㈀䘀㔀䄀㔀㠀㈀䔀䐀䌀㌀㌀㔀　䈀㔀㤀䘀　㜀㄀㈀䐀㠀㌀㌀㔀　䄀㌀䌀䘀㘀㜀㤀　㄀㈀䈀䔀㐀㠀　㌀㘀㐀㤀䔀䔀㌀㘀䄀㈀䌀䈀㈀㘀㘀䈀㄀䌀㠀㄀㈀㈀䘀　㠀㘀㄀㔀㄀䐀㈀㐀㐀㔀㄀㘀㈀㈀䐀㠀䄀㤀㈀䄀㜀㠀䈀㜀　㄀㄀㐀㘀㐀㄀　㐀䈀㌀　䄀䌀㌀䌀㤀㄀㘀㐀㄀㄀㈀㜀㤀㔀㄀㄀　䈀㠀䈀䌀㤀㈀㤀㠀䌀㐀㄀㄀㠀㈀㈀䄀㔀㠀㜀䔀　䄀㜀㠀㘀㄀　䘀䄀䔀䐀㈀䔀㔀㌀　㜀䘀䐀㠀㜀㈀㔀㠀㐀䘀㔀㄀㤀䔀　䔀㔀䐀㈀㔀㐀䌀　䈀　䘀　㐀䘀䈀䄀䐀㠀㌀䘀䄀㄀　䘀　㐀䘀䔀㤀䌀䘀　㘀㜀䌀䘀䐀䘀䐀　㄀㜀䘀㜀䘀䐀㘀㌀㜀㔀㠀㔀䔀䌀㠀㘀㤀㠀㔀㌀䐀䘀䘀㘀䈀䐀䔀㌀䐀㈀䐀䔀㜀㤀㠀㔀䈀䔀㐀䄀　䔀㐀㜀　䌀䄀䌀㔀䘀䄀䘀㈀䔀䐀㈀㘀䌀㜀㜀㈀㐀䌀㜀㈀䐀㠀㤀㤀㘀㜀　㘀㜀㐀䐀㌀㐀㤀㔀㔀䌀㔀　㔀䄀䄀䔀㈀㌀㈀㔀㔀　㘀㈀䘀㌀㈀㄀䔀䌀㘀䄀㤀㠀䘀䈀　　㈀㄀㄀　㔀㜀䘀㠀㈀䌀䈀㠀䐀㤀䐀䌀㘀䌀䈀䌀㘀㄀䘀㠀䐀㠀䘀䌀　　䄀㄀䐀䌀䌀㔀㜀䔀㜀㄀　㠀䈀㠀　㈀㤀㠀䔀䘀䘀䄀㘀　㜀㘀䌀䄀䘀㄀䘀㘀䌀㘀䘀㈀䔀㘀㠀㤀　㠀㠀㜀䔀䐀㌀　䈀㐀㘀䘀　㐀䈀㜀䐀㤀㐀䄀㔀䔀䔀㠀㠀㠀䌀㔀㤀㠀㘀䔀㔀㄀㠀㠀㄀䔀㔀㔀㠀㠀㘀䌀䈀䔀䐀㠀㜀　㤀䐀㘀㐀　　䔀䔀㘀㤀㄀㌀　㈀䘀㔀　㈀㠀㠀䈀㔀㤀　㄀㔀㠀㈀㔀䌀䌀　䄀㐀㌀㠀　㈀䈀㈀㈀㐀䔀㄀㘀㜀㄀㈀䈀㘀　䔀㘀䌀㔀㘀　㔀䈀㈀　㘀䄀㈀　䐀䐀　㐀㠀㤀䘀㈀䘀㌀䌀㐀　䈀䐀䘀䌀䐀㄀㌀䔀䘀　㄀䔀　㤀㔀㘀㄀　㐀㈀䌀䐀䄀㜀䈀㄀　㤀䘀　㜀㄀䐀䔀䐀䘀䈀㈀㔀㈀䄀㈀䌀㌀䈀䘀㠀㄀㜀䈀䘀䘀䐀㌀㠀䈀　䔀㔀㔀䌀　㌀㜀䔀㌀㄀㈀䘀䄀㄀䐀㌀䌀㜀䄀㤀㠀　㤀䌀　䐀　䔀㔀㌀㌀㐀㠀䔀㌀䌀㜀㜀㄀㘀　㄀㜀㠀㐀　䔀䈀㌀㌀㜀㜀　　㐀㔀㌀㔀㘀䔀㄀㐀䔀䐀㈀䘀㔀㄀䈀㄀䄀　䄀㐀䌀㤀㠀䘀㈀㤀㐀㔀㈀㘀㤀䔀䘀䔀㄀㌀䘀㠀㌀㈀㤀䌀䌀㄀㌀㌀䘀㄀㤀䌀䘀䔀㐀䘀㐀㤀　㜀㌀㌀䄀㌀䘀䘀㄀㜀䄀㐀䘀㤀䐀䌀䌀䘀䘀䈀㄀䘀㠀　㈀䈀㐀䘀㄀㠀䘀㠀㤀䌀㄀䐀䌀㈀㠀䔀㐀㈀㌀㄀㔀㐀㠀㌀㌀䈀䘀㔀㈀㔀㐀㈀㐀　㈀䌀䔀　㐀㈀㤀䔀䌀　䌀㐀䔀　䘀㠀㠀㈀　㤀㈀㔀㜀䘀䈀　㜀䘀䔀䌀㤀　㠀㘀䘀䄀㔀䈀䘀䌀㤀㜀䌀㘀䐀䈀䘀䐀㠀䈀䔀㌀㄀䈀䔀㈀䘀㜀䘀㠀䔀䘀　䐀㌀䌀㄀䄀䔀㠀　䐀䈀䔀㄀㈀㜀㠀㌀㔀䄀㠀䘀　䈀䌀䐀㔀䔀䐀䔀㄀䘀䐀㤀䔀　㐀㔀䘀䔀㘀䌀䔀䘀㠀㔀㜀㤀㄀　䐀䔀㐀㔀㄀䘀䔀　　䘀䘀㌀㈀䄀䘀䈀䌀㤀　㌀䔀㘀䄀㈀㜀䄀㄀䔀㈀㤀䄀㘀䄀㐀㜀㠀㔀䈀㔀㔀㠀㐀䘀　䔀㐀㤀㄀㜀䔀䈀䐀㄀㔀㈀䐀㠀䘀㠀㐀㌀䔀㤀䔀㔀䌀㔀䔀㜀㠀䄀㐀㤀㜀㄀㐀䈀㠀㠀䄀䄀㜀䄀㤀㔀㘀䄀㐀䈀㠀䘀　䌀㘀㄀㄀㐀䈀㈀㠀㜀䘀㘀㠀㐀䈀䔀　䔀䈀㄀䄀㄀㔀　　㔀䄀䔀㐀㔀㌀䄀㄀䌀䄀㔀㠀䌀㠀㤀䄀　㌀㤀㄀㄀䈀䐀䌀　䐀㄀㄀㐀䐀㄀㠀㌀㜀㘀䐀㠀䘀㠀　㈀䔀㤀㐀㠀　䘀䈀㤀䔀䔀　　㈀䈀㈀㠀㔀㘀䈀㤀㠀㈀㔀䄀　䌀䈀䌀㘀㜀䈀㘀䘀　䈀㘀䐀㤀䌀㈀㄀㤀㄀㔀㜀　㠀㘀䄀䔀㘀䈀㤀㘀䌀㈀䔀䄀䈀㠀㔀㠀㈀㘀㤀㔀㔀䄀㌀㌀㐀㔀䌀䄀㈀䔀㠀㔀㄀㐀㠀㄀㐀䘀㔀　䈀　䄀㈀䄀䈀㤀䔀䈀㐀㄀㈀㤀㠀㤀㘀䌀㘀䔀㤀㌀㘀䘀　㄀㜀㜀㜀㔀㈀㠀㜀㔀㔀㔀䈀㄀㘀㔀㤀䔀　䌀㔀㄀䘀㜀䈀䘀㄀㌀㐀䔀䘀　㈀䔀䘀㜀㈀㈀䘀䔀㌀䘀㔀䐀㜀㜀㘀㠀䌀㄀䔀䌀䌀㠀㈀　㄀㔀䄀䔀㠀䔀䌀䌀䈀䐀㈀䈀䌀㘀㘀㌀㈀䐀㜀㌀䈀㘀䔀䘀䄀㜀䐀䐀　㌀㄀㌀　㌀䈀䄀　䔀㠀㈀㘀㠀㘀㌀　㤀㄀㘀　㌀㈀㘀㜀䌀䌀䘀䈀㔀㈀㈀㄀䐀䌀㤀㤀䔀㤀㄀䈀㜀㐀㘀䈀䌀㔀㐀　䌀䄀㠀㌀䄀㄀䘀㐀䔀䌀䔀㈀䄀䈀㠀䄀㐀㤀㌀㘀㤀㤀䄀㄀䘀㔀㈀䔀㤀㠀㐀　㐀㘀䈀㔀䔀㜀㠀㈀㔀䌀㘀㜀㤀㘀　㘀䘀䈀　㐀㠀㐀㜀㘀　䄀㄀㌀㄀㤀䌀䐀䔀㌀㠀䐀㤀㠀㠀㠀㤀䐀㠀㜀䔀　㐀㄀㈀㌀㜀䔀䘀䐀䐀　䘀䄀㄀䌀㔀㠀䌀㜀㤀㐀㈀䈀䈀㤀㌀㔀㠀䄀䐀㠀䔀㄀㘀　㄀䐀㔀䔀㌀㐀㤀　㜀䌀䘀䈀䌀䐀㔀䘀䘀㐀㐀䌀㘀㈀㠀㈀㈀㔀䌀㘀㤀㜀㄀㘀䈀䈀䌀　㠀䌀㜀䘀㈀㐀䘀䈀䌀㠀䔀㄀䐀㘀　㜀䔀䘀䘀㤀䌀䐀䔀㐀䔀㤀䌀䈀㈀㜀䌀䐀䌀㘀㤀㜀　䘀䘀䐀䈀㈀䈀㠀㜀䔀㘀䔀䘀㌀䔀㐀䈀㄀䈀㔀㜀㘀　䈀䘀㤀䘀㌀㤀　㄀䐀䘀㜀㘀㔀㌀㘀㄀䘀㌀㐀㜀䄀䔀䔀䈀㠀㜀㔀㜀㈀㐀㄀䈀䐀㔀䘀㘀䌀㘀㤀䐀㤀䈀㜀㘀㤀䐀䔀㠀䘀㈀㘀㄀㔀㤀㐀㠀㐀　䈀㘀㘀㠀䌀㄀䐀㘀㄀䈀䌀䔀䐀䄀䌀䘀㄀㈀㔀㄀䄀㐀㜀䈀㐀䐀㘀䌀㐀䔀䈀㠀䈀㄀㜀㠀㄀䌀㠀㌀㜀㠀㈀㌀㘀䐀䌀㘀㜀㜀㈀䌀㐀　㈀䘀㐀㔀　㈀䘀㜀㈀　䔀㤀䌀䐀㔀䄀䈀㈀䐀　䐀䘀㔀䌀㄀㜀㄀㐀㄀䔀㈀㘀䌀䔀㔀㔀䈀䔀㔀㔀㘀㐀䘀䄀䈀㈀䘀㔀㌀㜀　㐀㘀䔀　䔀䈀䐀㠀㄀㄀䐀㘀㄀㄀䄀䔀䈀䄀䔀　㔀㠀㜀㘀㤀㈀㜀㔀㤀㈀㘀䈀㘀䌀䘀　㌀䔀䔀㄀　㄀㐀㤀㔀㘀㔀㐀㌀　㜀䄀㄀㐀䄀　　䈀䘀㄀㌀㠀㐀㄀䄀㌀㜀㌀䔀㄀䈀㈀㔀㠀㘀䌀㐀㠀䘀㘀㐀㘀䌀㐀䌀　㠀䄀㐀㈀㔀䌀㘀㠀㈀䘀㈀㌀㐀䌀䐀䌀㐀㘀㄀㜀䄀䄀㈀䈀㜀㠀　㔀䔀䄀䄀㈀㔀㠀㈀䐀䐀㐀㤀㐀㤀㌀㜀㜀㘀㜀䔀㌀㤀㐀䈀䔀䘀䔀䌀㘀䌀䘀䄀㘀　㈀㜀㜀䌀䌀㌀㄀䌀㜀㌀䔀㄀䄀㘀㄀㐀䐀㐀㘀㠀㌀䈀㌀㘀㌀䔀㘀䔀䄀㤀㘀㜀㘀䈀䔀㔀䐀㘀䔀䘀㜀䈀㐀䘀䈀㌀䄀　䄀䈀㠀㈀䌀㌀　㜀䘀㌀㌀㈀㌀　㤀䄀㈀㜀㌀　㈀䈀䈀　㄀㠀㄀㈀㔀䐀䌀㈀䔀　㠀䌀㄀䔀㜀㜀㤀䘀㈀㐀㘀䔀䌀䈀䘀㜀㤀䐀䘀㠀䈀㠀㘀䐀㄀䐀䘀㜀䈀䐀㤀㔀䔀䐀䐀㤀㤀㤀䔀䈀　㈀㘀㜀䈀䌀䈀䘀䄀䌀㔀㠀䈀㌀㘀㜀　㠀㜀䘀䄀㐀䘀䐀䔀㘀㜀㤀䌀㌀　䈀䔀㌀㘀㐀䔀㄀䄀㄀䘀㔀䔀㤀㘀䐀㤀㐀㤀䌀䄀㜀䘀㌀㘀㘀䐀䌀㔀䄀䔀䄀㜀㤀䔀䘀䈀䌀㤀㐀㌀㌀㐀㠀㈀䌀䌀㠀㄀䈀㄀㌀㜀㠀㄀㈀㔀䘀㠀䐀㄀㈀㜀䘀䄀㠀䌀䈀㤀䈀㘀㠀䌀㌀㌀䔀㌀㔀㤀㘀㈀䔀䈀㜀　㜀㘀㜀㠀㘀䔀䘀㐀䄀䐀䘀㄀㘀䘀㈀㌀䐀䈀㤀㐀㤀㜀䔀䐀㈀䘀䘀䈀㜀䔀㘀䘀㜀䘀䐀䘀䘀㜀　㔀䘀䘀㠀㔀䘀㠀㠀㔀䔀䈀　䈀䘀㜀㔀㤀䐀䔀㌀㔀䌀䌀㌀㔀䌀䌀㌀䐀䐀㄀㌀㤀䐀㄀䐀㌀䔀㈀䌀䈀㈀㠀㄀䐀㠀䄀㌀　䐀䌀㔀㤀䔀䘀䄀㤀䘀㜀㌀㄀䄀䈀䈀㠀㔀㔀䈀㘀㠀䐀䐀䌀　㘀䐀䈀㘀㘀䘀䘀䔀㌀䌀䔀䌀㜀㌀䌀䈀䐀䌀䔀䔀㜀㌀䌀㤀㈀㘀䄀㘀䄀㘀㠀㌀　䄀䐀㤀䄀䄀㄀㔀㌀㐀䈀䄀䈀䈀㔀㔀㘀㜀䄀䌀㐀㔀䘀㤀㠀䈀㘀䔀㘀㄀㤀䄀㌀䘀㔀㄀　㘀㘀㤀㄀　䌀㌀㈀㜀㌀㌀䄀㈀䌀㐀㠀㠀㜀㔀㌀㤀㄀　䔀䔀㜀䄀㄀䐀䄀䈀䈀㐀　㐀䘀　䘀㠀㄀䐀㌀㘀㘀䔀㄀䄀䐀䈀　㔀㜀䌀　䘀㐀㈀㠀㠀䔀䄀　㤀㐀㤀㔀䔀䔀㔀㠀㈀㌀䐀㌀　　䐀　　㐀㠀㈀㐀㈀㐀㐀䘀㌀　㜀䔀㘀䔀㘀㐀㐀㐀㤀㜀㌀䘀㄀䈀㐀　　㤀㘀　㐀㠀䄀㐀㠀㤀㌀䘀　䐀㤀䔀㌀䌀㤀㔀䌀　㔀　䌀䐀䄀㄀䌀䌀㈀　㐀㤀㤀䔀㘀䐀㌀䔀䐀㔀㐀䄀䈀㠀㘀䐀㘀㜀㌀㔀㐀䔀㤀㈀㠀㐀䘀　㐀㔀㔀㘀㐀䄀䈀㠀䐀䈀䘀䄀䄀㔀㜀㐀䔀䔀䈀䈀㠀㜀㄀䐀䐀䐀㔀䐀㌀䐀䈀䐀䐀㔀㠀㐀䈀㤀䔀㜀䄀䘀䐀　䈀䔀㌀䄀䘀䐀㠀䐀㌀䘀㜀䔀㈀䄀㜀䔀㐀㘀䘀㌀㔀䈀㌀㘀㘀䐀䘀䘀䐀䔀㐀䔀㄀㤀䐀㤀㜀㈀䐀㐀䘀䘀䐀䘀㈀㐀㔀㄀䌀䌀㜀㈀䌀㄀㘀㜀　䌀㤀㘀㌀㤀㐀䘀㄀䌀䐀　㘀䐀㤀㔀䐀㤀㄀䐀㜀㤀䈀䈀䈀䘀㐀㐀䄀㘀㜀㠀㘀䌀䘀䌀㠀㄀㤀㘀㜀㐀䔀㔀䈀䈀㘀㠀㌀㘀䄀㤀䌀㤀㔀䄀㐀㄀㔀㠀㔀㔀䐀㠀㔀㘀㐀㌀㠀㤀㌀㔀㘀㠀㘀䈀䈀䐀㌀䘀䔀㠀㤀㐀䌀䈀㌀㌀㈀䐀㄀䐀䐀䔀䌀㜀䘀㐀　㤀㈀㌀㐀㔀㌀㔀䐀㈀䌀㔀㐀㘀䈀㜀㐀䐀㔀㈀㈀䄀㠀㌀㘀㤀㠀　䄀䐀㤀㔀䈀䄀㘀㔀䄀䔀㌀㤀㠀㘀䄀㠀䄀䌀䐀㠀㘀　㈀㔀䈀䄀㠀䔀䔀㐀㐀㐀㐀㜀䘀㘀㠀㘀䔀䔀㌀䘀㤀㄀㄀㜀㘀㤀䔀䌀䔀㘀㤀㠀䌀㄀㤀　㌀㜀㌀䘀㤀㄀㌀㤀㌀㜀㜀㠀㄀䄀䔀㔀㠀㌀䈀䘀㠀　䔀䈀㤀䌀㌀㤀㤀䐀㌀㄀㘀㌀䔀㤀䈀㠀㤀㐀㐀䔀䄀䘀㈀　㌀㜀㐀䐀㘀䐀㘀㜀㠀㄀䐀㄀㄀㜀䌀䈀㄀䄀䄀䈀　㔀㜀㄀㠀䐀䘀㠀䌀䐀䔀㌀䈀䔀䘀䄀　䘀㄀㠀䐀䘀㄀䔀㈀䈀䔀㤀䈀䈀㄀䈀䘀䐀䘀㤀㤀㘀䄀䈀䔀䔀㄀㠀䄀㐀䐀䔀䈀㄀㜀㔀䘀䈀㔀㜀㄀䔀㜀㘀㔀㄀㤀㤀䌀　　䘀䔀䄀㄀㘀㈀䘀䘀㜀䐀䌀㐀㜀䔀㘀䔀䌀㔀㤀㌀㤀㌀㤀㜀䘀䐀䔀䌀㤀㄀㠀㌀㌀䘀䐀㤀　㔀䔀㌀㄀䐀　䐀䔀㌀㐀䐀㠀　䄀䔀㘀㠀䄀㠀　　䘀䘀䈀㐀㄀㜀䐀㤀䌀㄀㐀䔀㔀䄀㈀䌀　䐀　䘀㐀㠀㌀䈀䄀䌀㔀䈀䔀䐀㠀䘀㜀㌀㠀䘀䌀㤀䌀䘀㐀䈀䌀䘀㔀䈀㜀䈀　㈀䄀㈀䄀㠀䔀㄀䘀㄀㘀㐀㄀䌀䐀䘀㈀㈀㐀䘀㈀䈀㜀䌀䐀䌀䘀䄀㄀䌀䘀䘀㔀䌀䔀　㄀㔀䘀㤀㔀㔀䔀㔀㜀䐀䘀㤀　㌀䔀㔀䄀䌀㜀　䌀㘀㘀䄀㈀䐀䈀　㄀㔀䈀㠀㜀㔀䘀　㄀　㘀䔀㔀䐀㜀㔀䄀㐀㘀䐀䔀䔀㄀㜀䐀䌀㘀䘀䈀䄀㄀㤀䈀㜀䄀㤀　䐀㠀㔀㐀䐀㘀㘀䄀䈀㜀䄀䄀㄀㈀㔀㌀䘀䐀㈀㠀㄀䘀㐀㌀䄀䄀㜀䄀䈀㘀䐀㈀䄀㔀㄀㜀䐀㐀䔀䌀䄀㤀㌀㤀䔀䘀㌀　㜀䐀㌀䈀㠀䐀㘀㘀㤀㄀㘀㔀㄀㐀㌀䔀㄀㔀䌀㌀㄀㌀㔀㔀䄀㤀㘀㘀䈀㤀㌀㤀㔀䈀㤀䐀㘀㔀㜀㘀　䈀㘀䈀䄀　䐀䐀䌀㘀㤀㌀㜀㔀䐀䈀㐀㘀䘀㠀㜀䐀䈀㔀䔀䔀　㜀㐀䐀㈀䐀㔀䈀㈀䄀䌀䌀㔀䔀㤀䄀㌀䔀㈀㈀䔀䈀㘀　㠀㈀㠀㠀㈀㔀㌀䔀䔀㤀䌀㄀㈀䄀㔀　䄀㄀㜀㄀㐀㈀䔀㈀䘀䐀䌀㔀㔀䌀㠀㄀㘀䐀䄀㈀㈀䄀㈀㘀䔀䈀㔀䄀㔀㐀㄀䔀　㜀㤀㘀䘀㤀㠀䘀䌀㔀㘀㔀㔀䈀㔀㠀䘀䄀䔀䐀㘀䐀㔀㜀䌀㜀䄀䄀㤀䐀㘀䔀㐀䐀㌀　䈀㘀䐀䈀　　㄀㄀㜀䔀䌀䄀㌀䈀䔀䐀䄀㘀㐀㌀㤀㐀䐀䘀䐀㈀㘀㠀䐀㜀㈀䌀㈀㐀䐀䌀　㄀㤀㘀㘀䐀㈀　㌀㐀䔀㜀㈀䔀㘀㔀䐀㌀㔀㘀䐀䘀㜀　䐀㤀䔀㜀䄀㈀䄀㄀䘀䈀䄀䌀䐀　䘀㈀　㜀㠀䌀㌀䐀㤀㐀　㘀䘀㜀䄀㤀䘀㤀㜀㌀㘀㜀䈀䘀㘀㐀䈀䘀㈀㈀㠀䈀㌀㌀䈀㌀䄀䐀㈀㘀㐀　㘀䘀㜀䌀䌀㜀㄀䔀䄀㐀㄀䈀㌀䔀㘀䔀㔀㔀㔀㄀䐀䄀㐀䄀㐀䐀㈀㠀䈀䄀䄀䘀㐀䘀㈀䄀䄀　䔀䌀㈀䌀䄀䄀㔀㌀䔀䌀䐀䄀㔀　䄀㐀　䔀㘀　　㔀　䐀㐀㤀䄀䘀㠀㄀䌀䈀䌀　㔀䄀㘀㈀䄀㄀䔀　㘀㐀㠀㐀䔀㜀㔀㄀䌀㌀㄀㄀㄀㄀㌀䄀䐀䈀䈀㜀㈀㜀䌀䌀䄀㐀䈀䘀䔀㠀㔀㜀䐀㐀㌀䈀䘀䐀㠀㘀䐀䘀䌀䘀㔀䐀㘀　䔀䄀䌀䈀䐀䐀㌀㠀㜀㤀䐀㜀䌀䈀䘀䌀䔀䐀䌀㜀䌀䌀㔀㈀㔀䘀㌀㄀㈀䌀䌀䔀䄀䐀㘀䘀㤀㠀䐀㠀䐀㄀㠀䌀䘀㐀䌀䔀䐀䘀㠀䌀㤀㠀㄀䈀䈀㌀䘀　㈀㔀䐀㐀㠀㄀䄀䄀䘀㄀㠀㠀㜀㘀䘀䈀䌀㜀䐀㌀䌀䈀䔀䔀㘀㠀㘀㜀㔀㘀㌀䌀㘀㜀䌀㠀䘀䘀䄀　䐀㄀䘀㄀㠀䌀　㘀㜀䌀　䌀㐀㌀䐀䄀㠀㐀㜀䄀䘀㄀㤀䌀䄀䔀㈀㜀㈀㌀㘀㘀䌀　䘀㌀䈀㌀㈀㘀䌀㤀㜀㠀䘀㄀㌀䐀㤀㄀㜀㜀䌀䌀㐀䔀䐀㜀㄀㄀　䌀䐀䔀㤀㜀㄀䄀㠀㈀䔀㄀䈀䈀㈀䄀䈀㈀䔀䘀䄀㈀䌀㠀㔀㈀㘀㠀㤀㌀㘀　䈀㔀䔀㘀　㄀㤀䈀　㄀　　䈀㤀䐀　㠀㤀㤀䌀㜀　䔀㤀䈀　㜀　䘀㜀㠀䈀　㠀㜀㜀㘀　䈀䔀䐀䘀　䈀䐀㈀㜀䔀㤀㄀㌀㄀㠀㈀䔀㐀䐀㤀㘀㘀䄀㤀䈀䌀㐀㘀㤀䔀㈀㜀㐀㤀㄀㄀㄀㐀䈀䔀䐀㈀㤀䌀㜀　㈀　㜀㜀㄀䘀㐀㘀　㔀㘀䈀㜀䄀䄀䄀䔀㌀㠀䐀㄀㄀㘀䄀　㘀䔀䌀䘀㄀㄀　䘀䘀㄀㔀　㤀䐀㤀　㤀㐀䈀㐀䌀㜀䔀䘀㔀䐀䐀䐀㐀䈀㌀䄀㔀　㘀䔀䌀䔀䌀　䄀㔀䐀㈀㤀㔀㐀㔀䔀㜀䈀㈀㐀　䈀㄀䘀䌀䌀㜀㤀㄀　䘀䌀䌀㠀㐀㈀㘀㈀䐀䔀　䐀㔀　㐀㤀䈀㠀㘀㄀䄀㄀䈀䘀䌀䔀㐀䔀㌀㤀　䄀䈀䐀㘀䔀㐀㤀㠀㌀㔀㔀䔀䌀㄀䘀㐀　䄀䔀䔀㔀䄀㜀㜀　䌀䐀䌀㘀䈀䌀䌀䈀㜀䈀㌀䔀㄀㠀㄀䔀䈀㔀㜀㜀䘀㈀䘀㌀䔀㘀㘀䐀㐀䌀㠀䈀䄀䈀㜀䐀䘀㌀㘀㐀䔀䔀䌀㘀㐀䔀㌀䐀㌀㌀㜀䄀䌀㤀䘀㔀㔀䘀䌀㤀㈀䈀䐀㘀㄀䌀㘀䄀㐀㠀䘀䌀䔀㄀䐀㘀㐀㈀㘀㤀㠀䈀㘀㘀䘀䌀䌀㘀　䐀䈀㐀䌀　㐀㤀㄀䌀㈀㔀㌀䘀㔀㠀㔀䄀䈀㐀㈀㄀䈀㐀㌀䌀㐀䄀㤀㔀㠀㔀㜀㔀㐀㘀䘀䈀　㜀㘀㔀㔀䈀㌀㘀㄀㄀䌀㈀㌀㌀㄀䄀㘀　䄀䐀㜀㤀㈀㔀䄀㐀㘀䌀㜀㘀㌀䌀㠀㄀㠀䔀㘀㌀㈀㔀䈀㐀㘀䌀䈀㤀㐀䈀㐀㤀㘀䈀㔀䌀㈀㔀㐀㔀䐀㘀䐀㌀䈀䔀䈀㌀㠀䔀䈀㜀㈀㠀䔀䈀　䐀㘀㜀䄀㐀㘀㤀㐀䐀㘀㔀㘀㐀䌀䈀㈀㌀㘀㜀䈀㈀㘀㤀㔀㌀㘀㔀㜀㤀䌀㔀㐀䘀䄀䈀䐀䘀㈀㤀䐀㄀　䈀㌀㈀䐀㠀䄀䐀㔀㔀㈀䄀䔀㔀㠀㄀㌀䄀䄀䌀㜀䔀䈀䄀䔀䈀㐀㈀䄀㐀　㜀䌀㜀䐀䌀㔀䐀㐀　㈀　䔀㤀㠀㄀㘀㘀　㈀䄀䈀䄀䔀䄀㌀　㤀㔀㘀㐀䈀䘀㐀㔀䌀㤀䈀㔀䄀㔀䔀㔀㌀㤀　㌀㠀㠀㤀㔀䔀㐀䐀䄀䔀䄀㜀㐀䌀䔀㄀　㈀㐀㜀㜀䐀　　䌀䘀䌀　䈀㌀㠀䔀䄀㜀　㠀䄀㘀䌀　㤀䐀䄀䄀㠀㜀㈀㈀㔀㄀㔀䈀㠀䌀㔀㈀䐀䘀㠀䘀䌀㜀䌀㜀㤀㤀㤀㈀㔀㄀䔀䘀　㔀㄀䄀㜀㈀㌀䘀㤀䘀䐀㠀㄀䌀　㤀㘀㘀䄀㔀䌀　䐀㈀䔀䄀㠀㐀㜀㤀㜀㔀㄀㘀䐀㜀㄀䌀㐀䔀㤀䄀䘀㌀䄀䔀䘀㜀䐀㐀䔀䔀㔀䘀䐀㠀䘀䈀䐀䌀䘀䐀䔀㜀䘀㜀䌀㌀　㔀㠀䘀㔀㤀䘀䌀䄀䔀㜀䄀㠀　㜀䔀㌀㌀䘀㌀㈀㘀䘀䌀䔀䈀䌀䘀㠀㌀䔀㤀㠀㄀䌀㔀㌀㜀䐀㈀䘀㈀㐀䔀䈀䔀㠀㠀䈀䔀㈀䈀㔀㜀䌀㠀㠀䔀䈀㌀㐀䘀䐀㤀㘀䄀䐀㐀㌀䔀䈀㈀㠀㔀㤀㔀䌀䐀㘀㤀䔀䔀䌀㐀㠀䘀㄀㌀㐀䌀䄀㜀㤀㌀㤀㠀䘀㜀㜀㌀　䔀䔀䐀㜀㠀㄀　䈀䌀䈀㈀䈀䈀　䈀㜀　䔀㄀㠀㈀㜀䈀　䌀䌀㌀　　　　㔀㤀㜀㜀㘀䌀㄀㤀㜀䄀䐀䌀㄀䄀㌀䌀㔀㔀　㘀㤀䔀䈀䈀㈀䘀䄀㄀㈀㤀㜀㜀㔀䔀䐀㤀㄀䘀㜀㘀䘀㔀䌀㠀㠀䘀㄀　䈀䈀䘀䔀㤀䌀㈀䌀㈀䄀㠀㄀㔀䌀䘀㘀䘀㌀㄀䘀䔀䘀㤀䔀㜀㜀㌀䈀㜀䈀㐀㈀䐀䈀䔀㜀㌀䐀㌀㤀㈀㐀㔀䈀㜀䈀㐀㈀㐀㠀㘀䈀㤀　䈀㈀㌀㤀䔀䔀䄀䐀㠀䔀㔀　䘀㌀䔀㜀䐀㘀　䌀䈀㜀䈀䐀㠀㠀㈀　㌀㌀䘀䈀䘀䘀䘀䐀䌀䈀㠀㔀䘀㄀䌀㔀䄀䐀䄀䐀㠀㜀䈀䄀㜀㐀䄀㘀䔀㜀㤀䔀㈀䄀㄀㤀䘀䘀䌀䘀㠀㘀㜀䐀䐀　䘀㠀㄀䈀　䔀䔀㐀㄀㠀㠀䌀䐀㠀　㔀䘀䘀㜀䄀　㜀䐀㜀䄀䐀㈀㠀㘀㠀䈀㜀　　㌀㤀䐀㐀㠀䘀䈀㈀㔀䘀㠀㄀㈀䌀㜀㤀䘀䘀　䐀㜀㔀㠀㄀㈀㌀㠀　䘀㔀㜀㐀䌀䔀㘀㌀䄀㤀㘀㌀㠀㌀㠀㠀䌀㠀㤀㐀䈀㜀㌀㌀㠀㔀䐀㠀䌀㐀㘀䈀　㠀䐀　䄀㌀㔀䌀㐀　㠀㤀㈀㈀䌀㘀䈀㘀䔀䐀㤀㠀㌀㤀　㐀㔀㠀䔀㠀䈀㤀㈀㄀䔀㈀䔀㐀䔀䔀䘀㤀㘀䘀　㠀　㠀㐀㈀㔀㄀　㌀㌀㐀䌀㠀㤀㈀㜀㔀䄀㤀䌀䈀䔀䌀䈀䐀㜀䔀䐀㈀㌀㈀䈀㜀䌀㈀㜀㜀䐀䔀㐀㈀䈀㄀䘀䘀㘀㈀㄀㈀䐀䔀䔀㜀㄀㤀䈀㘀䔀　䈀䌀䔀䔀䐀㜀㘀䔀㌀㤀㌀㘀䔀䔀䌀䘀㘀㜀䈀㤀䈀㜀㈀㠀㈀䔀䘀㔀䌀㤀㤀䌀䌀㤀㜀䐀㜀㘀㄀䔀䘀㜀㐀䈀䔀㤀㜀䔀㌀㐀　䌀　㈀㌀䘀䄀㐀　䄀㘀㔀䔀㄀㌀㔀䔀㠀㤀㈀㘀㈀䐀㠀㜀㘀㠀㐀　　㄀㐀㈀㈀㄀㜀㄀㠀㌀㈀䄀䄀㜀䌀䐀㜀　䌀㜀䐀㌀㔀䐀䘀䌀䐀㐀䄀㘀䌀㌀㔀㜀䔀䌀㤀䌀㄀㘀㌀㈀㐀䔀㠀㐀㘀㜀㠀䌀㘀䌀㔀㤀㔀㘀㘀䈀㤀䌀　　㔀㠀䘀　䔀㤀䄀䔀䘀㄀㈀䈀㌀㘀㘀䐀䔀㤀䈀䘀㤀䈀㔀㐀㌀䘀㌀㘀䄀䘀䄀䔀㜀㤀䘀㌀㠀㘀䘀䔀䈀䘀䌀㄀䄀　㐀㄀䈀㜀䌀䐀㤀㔀㘀㈀㘀㘀䌀㔀㔀㔀㐀　䄀䈀㜀䄀㤀㄀㐀㐀㘀䈀䄀䌀　䔀䈀㤀㐀㤀㤀㜀䄀㘀㐀䈀䄀㐀㐀䈀䐀䄀㈀㌀㄀䐀㤀㄀䐀䔀㤀㈀䈀䔀㤀㈀䈀㠀㈀㈀䄀㤀㐀䐀㔀䄀㈀㜀㜀㔀䌀㌀　㄀㠀䔀䔀㄀　㔀　㐀䌀䌀　　䄀㈀㤀㠀㘀䔀㔀㘀㔀㘀㄀㤀㤀㐀　㔀㐀䌀䌀㐀㜀㌀䈀䌀䌀　䌀䄀㐀㐀㠀　㤀㠀㘀㤀䔀䄀㘀㈀䄀㐀㌀㠀䌀䐀䘀䄀䌀㔀䘀䌀䈀㠀㈀䔀㠀䌀䄀㌀䌀㤀㌀㐀䌀䘀　䈀㘀㔀㘀㄀㌀　䌀䔀㤀㔀㐀㤀㄀㜀䈀䐀䔀㤀䐀䌀㄀㈀㌀㐀䔀㌀　㐀䘀㘀䈀㌀䌀䘀㘀㄀䐀㘀㌀㠀䘀㜀䌀䐀㐀㐀㌀㘀䘀䔀䌀䐀㠀㜀㠀㌀㘀䈀䐀㤀䌀䌀㌀䈀㤀䌀㘀㔀䐀㘀㠀㐀䘀㔀㌀㈀㜀䄀㜀䘀䐀䌀㜀㐀㠀䔀㜀㐀㜀㄀㜀䈀䈀㠀㈀㌀䐀䌀㔀䈀䐀䌀㔀㜀䈀㤀㐀㈀䘀　㌀䄀䄀䔀㄀䈀　䔀㜀　㜀　㌀㌀　䌀䌀　　䌀㈀㘀㠀䔀䐀㄀䔀　㤀䐀㈀　㌀䘀䘀䈀㘀䘀㜀㜀㤀㈀䈀䘀㜀㘀㜀䔀䔀㤀㔀䈀䈀䔀䔀䔀䈀䈀㄀㘀㈀㄀㜀䔀㌀䈀㔀㠀㜀䄀　㈀㠀䘀䔀㠀㐀㔀㘀㔀䘀　䔀㤀㈀䌀㔀䌀　䈀㌀䌀䄀䈀䔀㈀䔀㘀㌀䐀㐀䄀㤀䄀㐀㤀㠀䈀㘀㤀㔀䘀㌀䄀䐀㘀㐀䌀䌀㘀㠀䄀㘀㌀㜀䐀䌀䐀㌀㄀㈀㔀䌀䌀䄀㐀䌀䄀㘀㘀㐀㤀㘀䐀㘀㔀㔀䐀㘀㔀䈀䈀䌀䄀㄀䔀䔀㄀㄀䘀㄀㌀㄀䔀㔀㔀　䔀䘀　　㜀㤀㐀㌀䐀㘀㔀㘀䘀㤀㔀㄀䐀㈀䈀㔀㌀㔀㄀㔀㤀䄀䄀㘀䌀㌀䄀䈀䌀䘀㄀㐀㈀䐀㤀䌀㜀㘀㔀㜀䌀㤀㤀㄀䔀㈀㠀㐀㠀㌀㜀㐀㄀䈀䘀䌀䈀㜀䌀㤀㌀㄀㌀㈀㈀䄀䌀㄀　　㠀㔀㄀㔀㜀䈀㠀㐀䘀㄀㘀㈀㈀䄀㘀㐀㜀㘀㐀　㔀䈀䈀䌀㌀㤀㄀　㠀㄀㘀㄀㐀䌀㐀㄀㌀㌀㈀㠀㠀䐀㌀㘀㘀㠀䘀㌀䈀㄀䐀䘀䄀䈀䌀䈀䄀㌀㘀　㜀㔀䔀　䔀䌀㈀䔀㤀㈀㄀㈀䐀䈀䄀㈀䐀㄀　㠀䌀㠀㜀　䄀䔀　䐀㠀䘀㈀　㈀䐀䌀㔀㘀㠀　　䈀䔀　䐀㠀䈀㌀㈀㔀䘀㄀㜀㠀㠀㈀䄀㈀㠀㠀㜀䐀　㠀㈀㔀䌀䌀䌀　㈀䄀㌀㔀䐀㄀㔀㘀㄀䘀　䄀䘀㜀㤀䐀㠀　㔀㌀㄀㌀䘀䄀㘀㠀㜀㠀㌀㔀䌀㈀䄀䈀㌀㠀㤀㄀㐀䔀䔀㠀䌀㌀㐀㜀䄀㘀㔀㌀㠀㤀㌀㜀㄀㌀㄀䘀㈀㜀㄀㠀㔀䈀䄀㈀㈀㠀䐀㄀㤀㔀㘀　㔀　㈀㈀㤀䌀䄀㠀㐀䄀　䌀㈀㐀䐀㠀㠀㐀䈀䘀䘀㐀㈀䘀㠀䐀㠀㌀䌀㐀㈀　㤀䘀䌀䔀䌀䈀䐀㤀㜀䘀䔀㌀㘀㤀㠀㠀㘀㄀䔀　㘀㘀㐀䘀㜀㜀㘀㘀㘀㤀㌀㌀䄀㠀㠀䔀㈀㘀䈀㔀䌀䐀㘀㔀䔀㜀　㜀㔀㜀㜀䄀䄀䐀㐀䌀㔀㈀㔀㜀㠀䈀㤀㌀䄀䔀㠀㠀㤀䈀㘀㈀㜀䔀䄀䘀㠀㤀䘀䌀䈀䐀㄀䔀㔀㌀㌀䐀㄀㌀䔀㜀䐀㔀䘀㌀㠀㈀䄀㘀䄀䔀䌀㔀䌀䌀䔀䐀㐀㜀䐀䄀䈀㜀㔀㘀䈀㔀㌀䌀㌀䌀䘀䘀䘀䄀㠀㜀㐀䈀㐀㄀㔀䘀㐀㌀㠀㤀㄀㤀㈀㌀㤀㘀　䌀㌀㄀㐀䔀㄀㐀㌀㘀　䐀㄀䐀䈀䐀䄀㐀䐀㈀㌀㠀䌀㄀䌀㘀䔀䘀㜀䔀㘀㈀䘀㘀㤀䌀㌀㤀䈀㌀㄀㜀䌀䌀㘀䘀䐀䔀䐀䔀㤀䘀㈀㄀　䈀㜀䔀㌀䌀䄀㐀㜀㄀䘀䌀䔀䐀㔀䈀　䐀㐀㈀㔀䄀㄀䔀㤀䌀㔀㜀䐀㄀䈀㈀䘀䔀㠀㄀䘀䔀㜀㌀䈀㤀㜀䄀㌀䄀㤀䈀㠀㄀㌀㤀䘀㌀䄀　㔀䐀䈀䄀㐀䘀㜀　㜀㤀㔀䐀䘀㌀䌀㐀㈀㔀㈀㈀䐀䈀䌀㌀㘀㈀㤀㠀㈀䐀㜀䈀䈀㌀䐀㠀㘀䌀䘀䈀䌀㈀䌀䔀䘀㄀䄀㘀䈀㤀㌀䄀　㐀䐀㔀䌀䄀㈀䈀㄀㘀　䈀䌀　㈀䘀㠀㈀䔀㌀㄀䔀㘀㐀㤀䄀㈀䈀䘀　㘀㈀䘀㠀㤀㈀䘀䘀㘀㐀䄀䔀䈀㈀㈀㔀䄀䔀䄀㠀㔀㐀䈀䔀㔀㘀䄀䈀㜀㈀䐀䔀㘀䄀㄀㔀㜀䌀㄀㈀㌀䌀䘀㜀䈀㜀䄀䐀䐀㘀㤀㐀䐀㐀䈀䘀㄀㤀䄀䔀㐀㤀䘀䘀䌀䘀㈀㌀䈀㜀䌀㠀䈀㜀䌀䌀䐀㐀㄀㐀㄀㈀㄀㠀㈀䘀㤀䈀㌀㄀㐀䔀㄀㐀䌀䘀㘀㠀㤀㠀㜀　㔀䐀㄀㈀㤀㐀㤀䘀䈀䈀䘀䐀㤀䐀䔀䌀㠀䔀㘀㤀㐀㔀䄀㐀䘀　䔀㤀㐀㔀䌀㌀䄀㘀䄀䘀䐀䘀㘀㜀㄀㐀䈀㄀䘀㄀㤀䐀䌀䘀㠀䔀㔀㤀䈀㈀䘀䔀　㜀䐀㐀㔀㘀㘀㜀　㈀㈀㘀䐀䈀　㄀㈀㌀䈀㔀　㈀㠀㈀䐀䘀䄀㘀㠀䘀䘀䘀㄀䌀㤀䘀㄀　䌀䘀䈀㠀䌀䔀䈀㠀䐀㤀㔀㜀䌀㠀䔀㜀㄀䌀㜀㄀䘀䄀㌀㤀䈀䘀㐀㐀㌀㈀䘀㘀㔀㘀㔀㜀䄀䈀㈀㜀䔀㌀䐀䈀㐀㘀䈀㘀䘀㌀䐀䈀䌀㔀㘀䐀㐀䄀㠀䘀䘀㐀㄀䔀䘀㤀　㌀䘀㜀㐀㜀䔀㤀㌀䐀䔀㔀　㐀㜀㜀㠀㈀䘀䘀䐀䌀㘀䄀㜀䘀㐀䌀䘀䌀㄀䐀䘀㤀㔀䘀䘀䌀䄀䘀䌀㔀㤀㜀㄀㔀䔀䔀㜀䄀㜀㄀㌀㌀䈀䘀㔀䔀㘀㐀㄀䌀䄀㘀㄀㘀㔀䄀䈀䌀㔀㐀㐀㐀㄀䄀㈀䈀㘀㠀　䐀㐀㈀䄀　㈀䐀䈀㠀㈀㈀㐀㠀㠀㈀㘀䄀　㐀㜀䐀　䈀㜀㈀䔀㜀㠀㠀㐀䈀　䔀㠀㠀　䔀㜀䄀㜀㐀䄀㤀䌀㌀䐀䔀　䔀㌀㠀䈀㐀䌀㌀䌀㜀㘀㈀䔀䄀䌀䔀㜀㄀䐀㘀㤀㔀㜀㘀䌀㈀䈀　㤀　㔀䈀　㌀䐀㈀㔀㈀㄀䌀㈀䘀䈀㤀䌀㠀㜀㜀䌀䘀䈀䌀䄀䐀㜀䘀䔀㜀㌀䘀㜀　䐀䄀㜀㠀䔀䐀㘀䘀䘀㜀㄀㠀㘀㜀㘀䔀䌀㌀䔀㄀䄀䐀䌀䈀㤀㘀䐀䐀㜀䘀䘀䘀䈀㈀㘀㔀㔀䈀㐀㤀䘀㐀　䔀䌀䌀䐀䘀㘀㘀䈀䌀䘀㈀䐀㔀㌀䘀㠀䌀㔀䘀䄀䘀㄀䘀㜀㠀䘀䌀䌀㜀㠀䘀㌀䘀䐀䔀䈀䐀䘀㌀䘀㄀䌀㜀䔀㤀㜀㠀㘀䘀㌀㜀䄀䔀㘀㄀䈀㜀䌀㄀㜀㠀䔀䐀㠀　䈀㤀㜀㜀䔀㠀㐀㌀㠀㘀䈀㤀䌀㘀䈀䈀㠀㠀㌀㌀䌀䐀㌀㐀㔀㠀㄀䈀㔀䌀䔀㤀㘀　㌀㌀㌀㌀䌀㄀㌀䄀䌀㄀䐀㔀㄀䌀䘀䌀㌀䄀㈀㠀㔀㄀䐀䔀㌀㘀㠀㠀䌀㔀㐀䘀　䈀㔀䘀　㜀㐀㔀䈀　㤀䘀㠀䈀㌀㤀㤀䄀䌀㜀㘀㈀䈀㄀䐀䈀䐀㐀㐀㄀㠀䔀䔀㘀㈀㠀㔀㌀㔀㔀㔀䈀䐀䌀㘀䔀㌀㜀䌀㄀䈀㜀䔀㔀䈀䈀㈀䌀㘀䐀㐀䄀㔀䘀㈀㌀㐀䌀䄀㐀䘀䐀䘀㠀䈀䘀䘀㄀㌀㐀䐀㌀䐀䘀䐀㈀㄀㠀㐀㘀㜀㤀䐀䄀㐀㔀䐀㠀㤀䈀䄀䔀㘀㘀㜀㐀㔀㌀㐀䐀㐀㜀㜀㤀䄀㈀㐀㘀䔀㄀䘀㜀㠀㔀㔀㄀䐀䘀㠀䔀䘀㤀䐀䄀㘀㜀㤀㘀䘀㘀㘀㈀㘀㈀㤀䌀䔀䈀㤀䐀䈀䈀㘀㔀㄀䄀㐀䌀䈀㄀䔀㜀䌀䔀䘀㘀㠀㔀㌀㜀㘀䘀䈀㠀㜀㈀䘀㄀㈀㘀㤀㠀䐀䄀䔀㤀㔀㜀㄀㤀㜀䘀㌀㈀䘀䄀㠀䐀䐀㌀䌀㘀䐀㄀㤀㘀㌀㤀䘀䐀㔀䘀㌀　䈀䐀䘀䈀㤀䘀㜀䄀㘀㠀䘀䘀㘀㌀　䘀㔀㌀䘀䌀㜀䐀㄀㤀㠀䌀㜀䐀㈀㄀㠀䌀䐀䐀㠀㄀㐀㈀䔀㠀㈀㄀䈀䐀䐀䔀䐀㤀㐀㠀䐀㈀䐀㘀䈀㐀䐀㘀㔀㠀㌀　㤀㄀㌀㐀㔀䈀㤀䈀䈀㔀㠀㤀　㔀䔀㈀㠀䄀㈀㈀㄀䌀㄀㈀䐀䐀䐀䔀㜀㐀㠀㘀䌀䈀䌀㠀㤀㜀㔀䄀㔀䈀㔀䐀㄀㤀㘀䘀㈀㘀䐀　㄀䄀㜀䄀㔀㐀㜀䔀䈀㐀䔀　䄀䌀㜀㐀䐀䄀㜀䄀㐀㘀㔀㌀㄀䌀㐀㠀　䐀㔀㈀㈀㄀䈀　㄀㘀㜀㜀㠀䔀䄀㠀　䄀㌀㘀㌀䈀䔀䘀　㌀㤀㈀㔀㄀䔀㠀㈀䌀　㌀䈀㘀㄀㔀㜀㜀㌀㠀㐀䌀䄀㈀㈀䄀㘀䐀䈀㄀㘀㌀㜀䈀䄀　㈀㠀㄀㜀䘀䄀㐀䘀㔀䘀㌀㐀䘀䔀㔀㌀䐀䘀㄀㤀㜀䔀䈀㈀㌀㌀㈀䘀㠀　　䔀䄀䔀㐀㌀㘀䔀㜀㜀㜀㔀㜀㠀㌀䈀䘀䌀䔀䐀㈀㄀㄀　　　㜀㘀䘀　㘀㘀䔀　䌀䔀䈀㄀㈀䈀㄀䄀䈀㤀㜀㄀䘀䄀　㈀䘀㔀㘀㈀㈀㘀䐀㐀㌀䘀䈀㈀䔀　䌀　䘀㔀䈀㜀㘀㄀䔀㘀䌀㠀䐀㈀　㜀㄀䈀㌀㄀㘀㌀㤀䌀䈀䌀䘀㔀䄀䄀䘀㘀䌀䐀䔀䈀䄀䘀䈀㠀䔀㈀㄀䔀䔀㌀㄀䄀䔀㈀㄀㤀㌀㜀㘀䈀䐀㌀㈀䔀㘀䌀䌀㜀　㠀㄀㜀䌀䐀䈀䈀䔀䌀䄀㄀㜀䘀䈀㔀㌀　䌀䘀䘀䔀㜀㐀䐀㜀䌀㌀㜀䈀㜀㘀㌀䘀䘀㠀　䌀㐀㔀㤀䐀㄀䈀㄀㄀㘀㈀䔀䄀䌀䐀䐀㤀㜀䘀㔀䌀㈀䘀䐀䐀䌀㘀㘀㄀㐀㤀䌀㔀䈀㌀䈀㠀㜀㘀䔀䔀㜀䄀㠀䔀㐀㤀㌀㤀䔀㜀䄀䄀㐀䈀䐀㐀㄀㔀㐀䔀㔀㘀㤀㘀㘀㠀㈀䐀㤀㄀㘀䌀㔀㄀　㘀㄀㐀䐀㈀䄀㐀㐀䌀㔀㌀㠀㠀䐀㈀㐀㌀㔀㘀䔀㤀㘀㔀㠀㈀　　㄀㘀䌀䔀㄀　㔀䔀㈀䔀㐀㔀㤀㈀㔀䐀䄀䄀㤀㈀㔀㘀㐀㠀䄀䌀㄀㐀㔀㠀䔀㜀䐀䌀䔀㔀㈀㐀　䈀㤀䌀䔀䈀㤀䌀䈀䈀㤀䐀㘀䘀㌀㤀㔀㤀䄀㜀㄀䐀䌀㔀㘀㤀㈀䄀　䘀㌀㐀㠀　㤀　㈀䔀䐀䌀㐀䐀㜀㌀㜀㤀㠀䔀䄀㘀㔀䔀㔀䌀㠀　　㘀䌀㤀䘀䄀㜀㤀㠀㌀㌀䔀㤀䐀䘀㔀㐀䘀䌀㤀㠀㄀㐀䈀㄀　　㘀䐀㠀㜀㜀㐀㌀㐀䐀㐀䔀㄀㤀㌀䄀䐀㄀䄀㐀㌀䐀䐀䔀㔀㤀䘀㐀㄀㄀㐀㔀䈀䄀䈀㈀䈀㔀㘀㘀㄀㠀㘀㠀㐀㈀䌀㐀䈀㐀䔀䄀䘀㌀㌀　㤀㌀㜀㜀䔀　㘀䔀㘀䄀䐀㌀㘀㌀䄀䔀㘀䔀㘀䔀䌀䈀㔀䌀㌀䄀㘀䔀䔀㐀㠀㠀㤀㤀㈀㤀㌀㘀䈀䔀䔀䐀䔀䄀䔀㘀䈀䄀䘀䘀㌀䈀㘀㐀䘀㐀㤀㌀䌀㘀㌀䘀㘀　㠀䌀㔀㔀㘀　䐀㄀㜀㘀㄀㠀㘀㌀㌀㤀㜀㤀㔀㄀㌀䘀䌀㈀㌀䈀䘀㠀㤀㠀㤀㠀䘀　㌀䄀䈀䌀䈀㄀䔀䐀䌀䔀䔀䐀䐀䄀䈀㘀䌀㐀䘀䐀䔀㔀㤀㈀䄀　䈀㔀㘀㠀䌀㐀䘀㤀䈀䌀䈀㔀㔀㜀㜀䐀㈀㔀䘀㈀㘀㤀䔀䌀䄀䌀䘀㔀㜀㐀㤀㐀㈀䘀䈀㌀䌀䔀䈀㄀㈀䔀䈀㈀䐀䔀㘀䘀䐀㤀䔀㘀㜀䌀㈀䌀䐀䄀䄀䈀　㠀䄀㌀㘀㌀㜀䄀㜀㄀㜀㌀㜀䌀㜀㄀䘀㐀䄀䄀䘀㠀㐀㘀䔀㜀㐀㘀㘀䐀㐀㌀䘀㐀㤀㘀㘀㈀䄀㤀㌀䔀㌀䔀㤀㘀㘀䘀䈀㄀㐀䌀䈀㐀㐀䔀䈀㌀䈀㔀㐀㐀㈀䔀㠀㤀　䄀䐀㄀䔀㈀㐀㐀䈀䌀㔀䔀䄀㤀㠀䈀䐀　㜀䄀㐀䌀㔀䐀䈀㄀䌀　䌀䈀㤀䌀㐀㌀㠀䄀䘀㠀䄀䌀　㤀㈀㔀㄀䄀㠀䐀䌀㘀㠀㐀䔀㈀䄀㠀㔀䔀䘀㄀㌀䐀㘀㔀䈀㔀䈀㘀䌀㘀䘀䐀䘀䐀䈀㈀䔀䈀䌀䈀㌀㜀䈀㤀䐀㜀㤀㜀䔀䘀㜀　䐀䘀㔀䘀䘀䔀㘀䌀䘀㐀䐀㤀㤀㠀䈀㔀　䈀㘀䘀䘀㄀䐀䔀䔀㄀㜀䈀䄀　䘀䌀㠀㤀䘀㈀㌀䐀㄀㔀䈀䌀㌀㜀䔀㈀䐀㄀㈀㌀䈀㄀䈀㐀㐀㜀㈀䘀㈀㠀㐀䄀㄀㜀㜀㤀䘀　䌀㜀　　䔀㐀㘀䈀䌀㔀䌀㠀䘀㐀㤀㈀㈀䐀㈀㔀䄀㐀㐀㐀䘀㜀㠀㔀䐀㈀㈀㔀㠀㄀　䄀㜀㌀㐀㄀　䐀䌀㐀㤀䐀䔀㤀㄀㔀䈀㠀䄀䄀　㈀䄀㜀㈀䄀㜀　㐀㔀㘀㄀䄀㐀　䄀㤀㐀䄀䈀㄀㘀䌀㠀㜀䌀㌀䔀㌀㘀䔀㔀㔀㘀䌀㜀䌀䄀㐀䐀䈀㤀䌀㠀㐀䌀䐀㜀㜀㈀䘀㠀㤀㌀䄀䈀㜀䈀䄀㠀䌀㠀䌀䘀㐀㄀䈀䌀㌀㄀䘀㌀㔀㄀㜀㤀㄀䘀㘀䄀䄀䔀㌀䄀䄀㘀㤀㄀䄀㠀　䘀䔀㔀㠀䈀㐀䄀㜀㔀㌀䌀䌀㘀㌀䌀䘀㘀䔀　㜀㠀㜀㐀㘀㠀䄀㐀㈀㔀㌀㈀㄀䈀㘀㜀䈀䌀㔀㜀䔀㄀　䔀䔀䘀㘀㤀㈀䌀㘀㌀㈀䘀㘀㄀　㌀㤀㄀㈀㠀㈀㤀㜀㔀㔀㤀㄀㔀㔀㈀㄀䄀㔀㠀䌀　㘀㈀䈀㘀䄀㔀䐀㐀㌀㈀㌀䐀㠀　　㌀㈀䐀㈀䔀　㄀㤀㠀　　䘀䌀䄀㌀䄀　㜀㐀䘀　㤀㔀䔀䐀　䌀䐀㈀㄀㈀䐀㠀䔀䘀㈀㠀㠀䔀㠀䔀䘀㐀䔀㐀䐀䄀䄀㠀㔀㤀㈀㈀㈀䌀䄀㘀䘀䐀㘀㌀䘀䈀㠀䈀㠀䄀㜀㌀㜀䐀㜀䘀䌀　䔀䌀䔀䈀㐀㄀䐀㠀䈀㤀䐀䄀㠀䄀㠀㜀㐀㘀㔀䈀䄀㈀䐀䈀䄀䐀䘀㜀㐀㔀㔀䘀㠀䄀䈀䔀㄀䈀䔀㔀㈀㌀㔀㄀䌀㔀䌀䄀䈀㈀　㄀㤀㐀㐀㜀䔀䄀䄀㠀㤀㘀㘀㈀䘀㘀䘀䐀䐀䔀䌀䄀㈀㘀㤀䌀䄀㜀㜀㔀㘀㘀㌀䘀㔀䄀㤀㈀㌀㘀䄀䈀㜀䔀㈀㄀㠀㠀䘀䔀　㠀䔀㜀䔀䄀㜀䔀㘀䌀㄀䈀䔀䔀䌀㈀㈀㜀㌀㄀㠀㌀㐀　䔀䘀㘀㤀㄀㔀㤀　㌀㔀䌀䘀㜀㐀㜀㤀䔀　㐀䌀㠀䌀䘀㔀㈀㤀㠀㠀䌀㔀　䈀䐀㠀㤀㌀㈀䌀䄀㄀㐀㌀䘀　䔀㠀䘀　䐀㔀㤀䔀㔀䄀䄀䘀　䔀䐀䘀䔀䈀䐀㔀䔀㄀㐀䈀䈀䐀㜀䄀㔀䐀㜀䐀䐀䄀㐀䈀䘀㌀㠀䐀㔀䔀䈀䐀䄀㐀　䌀㌀㘀䘀　䈀䐀㌀㘀㘀䘀㤀㄀㤀㤀䐀䄀㘀㌀䈀䐀㜀㌀　㈀㌀䄀䌀㐀㈀䘀㔀䈀　　㐀䘀　䘀　䌀　㐀㐀㠀㜀䔀䘀　㘀㘀㈀㄀䐀　䘀䌀䄀㄀䄀䈀㠀㐀䈀㌀㤀䐀㜀㐀䈀䐀䘀　䌀䄀㔀䌀㌀㜀㈀㜀㠀䌀㜀䌀䔀㔀㈀䔀䌀㜀㤀㌀㌀䄀䔀㄀㈀㜀㤀䈀㔀䈀䐀㔀㔀㜀㌀䌀䘀　㤀䄀㈀䔀㔀㤀㤀䌀㐀䐀䈀㘀㔀㈀䐀㠀㠀　㄀䌀䘀䔀䘀㘀㤀䌀䈀㔀㐀㄀䐀㄀㤀㐀　㘀䈀䄀䈀䈀㐀䘀䄀㄀䈀㔀䌀　㈀䘀䘀㜀㔀䄀㄀䄀㐀䌀㐀㈀㠀䄀䔀㤀㔀㈀㤀㔀䌀䔀㜀䌀㔀㔀　䘀㠀　㌀䌀　㐀䘀䈀㐀㐀䈀㄀㔀㤀䐀㔀䄀㌀　䔀䔀㄀䔀㈀䄀㈀㄀䔀䘀䐀　㌀㠀䔀㌀㐀䘀䐀㔀㜀㠀㔀　㌀䌀䔀㘀㔀㔀㜀㔀䔀㔀䈀㔀䘀䄀㈀䈀㤀㈀㜀㄀㠀㐀䘀㔀䘀䈀㘀䘀㘀䌀㌀㐀䘀㌀䘀㜀䌀䈀㜀䐀㐀㌀㠀䔀㌀㔀㠀㌀　㜀㜀㜀㤀㔀㔀䈀㠀㈀　㠀䔀㜀䘀㤀㔀㤀㤀㜀䈀䔀䄀䄀䈀䄀㌀䘀䐀㌀㠀㤀㔀㤀䌀㌀㤀䄀㜀䈀㐀㈀　㄀㔀㜀㘀㘀䈀㠀䔀㐀㤀䄀㌀㔀䄀㄀䘀䈀㠀䔀䐀㄀㜀㜀㜀䐀䔀㔀䔀㌀䐀䔀䄀㤀㈀㈀㈀㐀䘀䄀䌀䐀　㔀䐀䐀　㌀䔀㜀㄀䐀㈀㠀㘀㜀䈀䐀䔀䐀䔀㠀㌀䔀㠀㄀䘀䄀䄀䘀䄀㤀䌀䐀䌀䌀䐀㌀䐀　㐀㔀㄀䘀㄀㜀㔀䈀䐀㈀䌀㠀䌀㠀　㤀　䌀㤀㘀㔀䈀㘀䔀㄀䔀䄀㐀㐀㌀㔀㘀㌀㄀㌀䘀䌀㘀䔀䔀㐀㘀㌀㌀䌀㘀䔀䔀㐀㜀㔀䈀䄀㌀㐀䔀䌀㜀㔀㄀㈀　䐀䘀䈀㄀㠀㐀㤀㤀　　㔀䌀㔀㐀㜀䌀㔀㘀䐀㐀㌀䐀䔀㘀䔀䔀䘀㄀䔀㈀䘀䐀㌀　㘀䌀䐀㄀㄀㈀䘀䔀㌀　㔀䔀㈀䈀㤀䌀䘀㠀䐀㘀㤀䐀　䐀㠀㠀䘀䐀䌀䘀㐀㘀㤀㤀㜀䔀䈀㜀㐀㔀㔀䈀㄀㐀㠀㈀㤀㌀㤀㠀㔀㠀　䘀䈀㈀䐀　　㈀䘀㐀㄀䄀㤀㘀㤀䄀㤀㠀䘀㠀㤀㜀䈀㤀䐀㜀㌀䐀䌀㐀䐀䐀䄀㈀䔀㘀䐀䈀㜀䌀㘀䈀㐀㘀㤀㔀䐀䐀䄀㔀䐀䐀䄀㔀䈀䐀䄀㐀㤀㠀䐀㐀㌀㤀䄀㔀䐀　䈀㘀䈀㔀㔀㄀䄀䄀䈀䘀㤀　㌀䄀䈀䈀䈀　㜀䔀㄀䐀㐀䄀㐀㌀䐀䘀㔀䔀　㈀㜀㐀㘀㤀㠀㐀䘀　䈀㘀㠀　㌀㐀㜀㘀㠀㘀㄀䘀　㔀䌀䄀䔀㈀䔀㘀㠀㌀䘀㘀㔀䘀㈀䐀㘀㌀䔀䘀㌀㈀㤀㄀㤀㌀㠀䘀㔀㌀㠀　　㈀㤀㐀㜀㘀䐀㤀䔀䈀㜀㘀㘀㌀㄀㤀　㔀㐀䌀䐀㤀㐀䄀㤀㤀㜀䌀䘀㄀㜀䐀䌀㄀䌀䈀㄀䈀䄀䐀䄀䈀䄀㄀㈀　㜀䈀㤀䔀㄀㠀㠀㈀㔀㔀㄀㤀　㤀㠀䔀㠀㔀䈀䘀㠀䌀㌀䌀㤀㌀㜀㌀㐀㔀㠀䄀㐀㤀䈀㘀䔀䌀㈀　㄀㌀㘀㜀䔀䌀䌀㤀㠀㜀䐀㜀㌀䈀㈀㈀　䘀㠀㘀㄀㜀㤀䔀䐀㠀䌀䈀㄀䐀㔀䘀㜀䔀㌀㌀㜀㠀䘀䈀䐀䘀㌀㠀㠀䈀㄀㄀㤀䔀㐀䘀㌀㈀㌀䘀　㌀㈀䈀㌀䐀㠀㌀㠀㈀　䄀㐀㤀䐀䈀䄀䘀㜀㔀㈀䌀㜀㘀㈀䌀㜀㔀㘀㠀䔀㤀㄀㜀㠀㌀䘀䐀䘀㐀㠀㄀䄀㄀䐀㤀㌀䌀㠀㈀㐀䌀㜀　㤀㈀㈀㤀㠀㜀䌀䌀㘀䌀㄀㔀䄀㌀䌀㐀㠀㜀㘀㘀䈀㐀　䌀㤀㠀㄀㤀㜀䌀㜀䐀䐀㘀䔀㐀㐀㄀䐀䄀㐀䔀䄀㌀㄀㜀㄀㔀㈀㠀䔀䈀䌀䘀䘀　䘀㌀㠀㐀㤀㄀㈀䌀䘀　㌀㈀㐀㄀㄀㤀䘀㄀㐀䈀㄀䘀㠀㤀䘀㘀㤀㐀䐀㈀䔀䌀㠀㜀䌀　㜀㄀䘀㘀㔀㜀㌀㐀㤀䄀䌀㜀㠀㤀䌀㤀㘀㄀㠀䈀㔀　䈀䐀㔀㐀㘀㘀㘀䔀䄀䘀　䌀㌀㄀䐀㔀㜀㌀䘀㌀㤀㄀㤀䘀䈀㠀䈀㘀㘀㌀㘀㠀䐀㔀䘀㔀㤀㠀䔀䘀䐀䈀䈀䔀㘀㈀䌀䈀䌀䘀䌀䌀㤀䄀䐀䄀㐀䐀䈀䘀　㄀䐀㔀䈀㌀㐀㘀㈀䐀䄀䘀㔀䌀㜀䘀㄀㄀㄀㈀　　䄀㌀　㐀䔀　䈀㈀　䌀㄀㜀㤀㌀　㐀䔀　䈀　䔀䔀䄀㘀䔀䄀䔀㌀㐀㤀　㐀䄀　䈀㜀㐀䌀㌀䐀㌀㠀䐀㐀㠀㌀㜀㐀䌀䌀䘀䌀　　㜀䘀䈀䄀㄀㌀㔀㈀㤀㐀䄀㌀㠀㌀　㌀䌀䈀䐀㠀㌀䌀㔀㌀䌀㘀㌀㄀㄀㐀㔀㔀㤀䈀㄀　　　䘀㈀㌀㐀䔀㈀㘀㈀　　㔀䔀㐀㈀㠀䄀䄀䈀㐀䈀䌀㘀㈀㔀㄀䌀　䈀㘀㐀䘀䔀䄀㤀䔀㔀　㌀㠀㈀䐀㈀㌀䌀䔀䄀㈀㈀㄀䈀䘀䄀㔀　㐀㤀㔀㔀䈀䐀㈀㘀㠀䈀㠀㘀㔀㈀㌀㤀㈀䘀㈀䈀㔀㈀䐀㄀㤀㔀䈀㄀㔀䘀㌀䈀䈀㈀䌀㤀㈀㌀㜀䌀䐀㘀㈀㈀㐀㘀㄀㄀䔀䌀㤀䈀㐀㤀䔀　㄀䐀㌀㤀㠀䄀䘀㔀㔀䔀㤀㐀䔀　䈀㤀㈀㔀㤀㠀䈀㈀䌀㐀㤀㠀㐀㘀　㄀䔀䘀㘀䄀㔀　㘀㤀䄀　䘀䐀㔀㜀䐀　㔀䄀㔀㘀㤀㠀䈀䈀㔀䌀㠀㔀䌀㈀䈀䌀䔀㔀䄀䈀䐀䐀䔀㠀　㔀䐀㘀䔀㤀㈀䄀㜀㤀㤀　䈀䄀䐀䄀䄀㜀㐀　䈀㐀䈀㄀䄀㈀䌀㘀䌀㄀㌀㌀䈀㠀䐀㘀㔀䐀㠀㐀㌀䄀㐀　䄀㈀　㘀䄀㤀㜀㘀䔀㔀㌀䔀䄀㄀　　䔀㠀㌀　䈀㘀㄀䈀　㔀䘀㜀㤀　㤀㜀㐀䌀䈀㐀䘀㤀㔀㈀䈀䔀㤀㤀䈀䐀㈀㤀㜀㠀㔀㐀㠀㤀㔀䘀㔀㤀䈀㈀㔀㈀㜀䈀㌀㘀䘀㈀㈀㜀㐀䈀䈀䈀㤀㐀㈀㄀㜀䌀㌀㈀䐀㤀㠀䄀㘀㤀䐀䌀䌀䐀㈀㄀䌀㔀㄀䔀䔀㜀㤀㄀㐀㄀䌀㜀㄀㜀㤀㘀㤀䘀㈀䐀䐀㄀㔀䌀㄀䘀㠀䄀　㌀㄀㄀䈀㈀㜀㔀䔀㄀䐀䔀䔀䔀㔀㔀㔀䘀䈀㘀䘀㜀㄀䌀㐀　　䔀㤀䘀㔀䘀䘀䘀㤀䌀　㔀㠀㐀䘀㘀㔀㈀㔀㈀㤀䌀䌀䌀㤀㔀㐀　㈀㐀㘀㌀㐀　䌀㘀㐀䄀䄀䔀　㠀䘀䘀㐀㘀䄀㤀　䄀䌀㠀䌀㜀㠀㈀㈀　䈀㤀䌀㄀㐀㐀㐀㄀䔀㔀㈀䌀㠀㌀䄀䈀㠀㠀　䄀　㐀㤀㠀㔀䈀㈀㐀㌀㔀㄀䌀䌀㤀㈀㘀㐀䌀䌀䐀㈀䌀　㌀㐀䘀　䔀㌀㤀㤀䘀㄀䘀䌀㜀㘀㘀㘀㌀䈀㘀䘀䔀㘀㠀㐀䘀㔀㔀㔀㄀㔀䔀㌀㐀　㠀㐀㄀㘀㤀㘀䔀㔀㔀㠀䌀㤀㈀㈀䈀㌀㐀䄀㄀　　㔀㔀㠀　䘀䄀㜀㐀㤀㜀䔀䐀㤀䄀䐀㈀㠀㌀㄀㔀㐀䌀䄀㈀㘀䈀㠀㐀䄀䄀㤀㔀㐀㐀䔀㈀㠀䐀㔀䄀㠀㤀䔀㄀䈀㈀㔀䈀㔀䄀　㜀㄀㘀㐀㄀䌀㌀㜀㔀䔀㤀㠀㈀　䄀䐀㐀㈀䄀䈀䐀㤀㔀㔀䐀䌀㘀䄀㘀㤀䈀㔀䈀䌀㐀䄀䐀㤀㠀㠀㌀㘀䈀㄀㄀䈀䈀㤀㐀䐀䐀㈀㈀㘀㜀㤀䄀㌀㜀㈀㄀㐀㄀䐀㘀㔀䐀䘀䔀㌀䐀䔀㤀㌀㠀䔀䌀䄀䔀䘀㈀㤀㔀䘀䄀㈀㈀䘀䐀㤀䔀㌀䐀䌀㜀㄀䔀㤀㐀䈀䘀㤀䈀㠀䘀㈀㌀㔀䘀䄀㤀䄀㌀䐀䌀䐀㤀䐀㄀㔀㐀䔀㐀䈀㔀䘀䌀䈀䄀㜀㤀㔀䌀䄀䔀䘀䐀㘀㄀䘀䄀㔀㜀䌀䘀䐀䐀㄀㈀䐀䐀㄀䘀䄀㈀㌀䔀䐀　䐀㔀㘀㄀䄀㜀㤀㠀㤀䌀䔀䐀䄀㐀㔀㤀㔀䌀㘀㘀䘀㤀㜀㄀㤀䄀㜀䔀㐀䌀䈀㠀䌀㤀㌀䘀㔀㄀䄀㔀䄀㘀㘀䘀䌀㤀䘀㐀䄀㠀㜀㜀䌀䄀䔀㜀㐀㈀㠀䄀㜀䐀㐀㈀㘀㤀㔀䐀　䘀䄀䄀㄀㌀㠀㔀䄀䌀㈀㈀䄀　䄀㠀㌀䐀　䄀䔀㐀㔀㄀㘀㜀㠀䔀㤀㠀㠀䌀㄀䔀䄀䈀㌀㘀㄀䔀䌀䈀㜀䈀䔀䐀㐀㠀䈀　㌀㌀㤀䈀　㐀㄀㐀䈀㠀㜀䘀㤀䌀䄀㘀㄀䄀䔀㜀　㤀㠀䘀䐀㈀䘀㈀䄀㠀㜀㠀㌀䌀㔀䌀㄀䌀䔀㈀㐀䄀㈀䘀䔀䘀䄀㔀㤀㠀䈀㘀䔀㘀䐀㠀　㘀㄀㤀䔀䐀䐀㘀㜀䄀㔀䌀㔀䘀㐀䈀㌀䔀　䄀䌀㈀䐀䈀䄀㐀㈀㠀䘀㤀䌀　㐀㘀㜀䌀䐀䔀㐀㄀䄀㤀䔀䄀䔀䘀　䈀　䐀　䐀䔀䈀㄀㐀㄀䐀㜀㘀䐀䘀䄀㜀䔀㠀䄀㘀㘀䄀㠀㔀㘀䈀㠀䔀㠀㌀䘀㄀䌀㘀㄀㄀㠀㤀䌀㌀㄀䘀㘀㘀　䌀㜀㈀䈀　㜀䈀㄀㘀䐀䔀䘀䔀䘀䈀　䐀䈀㜀㠀䌀䄀䘀㠀䔀㜀䌀㄀㘀㜀㐀㄀㌀㌀䌀㘀㤀㌀㄀䔀䘀䄀䘀䄀䔀㘀㐀㌀䘀㈀㔀㐀䘀䘀㄀䌀䐀　　䐀䐀㔀㤀㠀䌀㄀䌀䔀　㐀䐀䐀㜀　䔀㄀䘀㐀䈀㌀䌀䔀㔀㈀　䔀䈀䈀㘀㠀䈀㐀䘀㐀㈀㤀䈀㘀䈀㐀䔀㠀䈀㄀䐀䄀䐀㈀　㈀䐀䐀䘀　㜀㐀䌀㌀㜀㤀䔀　㄀㠀䌀㤀㈀䐀䐀㄀㄀䘀㤀䔀　㘀㌀䄀䌀䐀㔀䄀㈀䐀㈀䄀㘀䘀㈀㜀䌀㠀䌀㔀䈀㌀㈀䔀䌀㈀䌀㈀䘀㔀㘀㠀㈀㈀䈀　　䐀䄀　㐀㈀　䘀䐀䔀　䐀　㘀㘀㌀䈀㌀䄀㘀䐀㐀㔀㈀㄀㐀㜀㘀㔀㜀䈀㤀䐀䈀䐀䌀　䌀㐀䐀㤀　㤀㠀䈀㄀㌀㐀㤀䔀㌀㘀䘀㌀㈀㘀䌀䔀㠀㈀䌀㈀䈀㐀㤀䈀䄀䔀䌀㤀㘀㠀㘀　㜀㐀㤀䘀㌀䘀䈀䐀䌀䔀䄀䌀䌀㠀㈀㘀㜀㐀㠀㤀㤀㠀㌀䐀㠀㈀　㤀䔀䐀㌀㤀㜀㄀　㌀䐀㈀　䈀㠀㘀䄀㘀䘀㌀䔀䈀㘀㔀䈀㐀㤀㜀䘀㈀䈀䔀㌀㠀㤀㤀㈀䈀䐀䈀㔀㌀䈀䈀䌀㤀㌀䐀　㈀㤀㘀㐀䌀㜀㘀䄀䔀㤀䌀㘀㈀㌀䘀㜀㔀㄀䌀㜀㠀㐀䐀㌀㘀㤀㔀㤀㌀㌀㜀䌀䔀㔀㔀㈀　㤀䐀㌀㤀㜀㤀　䈀䄀䄀㤀㤀䌀㄀䌀䄀䐀䈀㐀䔀㜀㘀䐀㈀㄀䔀㌀䈀䈀㠀䘀㈀䔀㄀䔀　䌀䄀䘀㜀䈀㄀㜀㘀㜀㐀㘀㠀䔀　㈀㐀䐀㠀䔀㘀䌀㤀䈀䐀㠀䌀㄀䐀㤀䈀䌀䘀㜀䌀䔀㔀㄀䘀䐀䘀䘀㠀㔀䌀㔀㜀䄀䐀㠀䔀㈀㘀㤀㜀䐀䐀䔀㔀㠀㜀㠀䐀䐀㌀䐀㜀䌀㐀㠀㄀䘀㠀䘀㜀㐀㌀㠀㜀䈀㘀䘀䈀䄀　㤀䘀䘀䈀䄀䔀㐀䌀㐀䔀䐀䌀㠀㈀䌀䄀　　㜀䄀㐀䔀㤀㠀㘀㔀　䄀㄀㔀㈀㜀㠀䐀䈀㌀㌀㠀㘀㘀㘀䌀㄀䔀㔀㌀㌀㈀䔀㘀䐀㈀㜀㔀䐀㌀㘀㜀㐀䌀䘀㔀㔀䘀㔀㈀䈀㜀䘀　㜀㈀㌀䘀㠀㠀㔀䔀㈀㔀䘀䘀㌀䌀㐀㜀㜀䄀䈀㌀　䈀㐀㜀㐀㘀㄀䐀㜀䘀䈀㐀㜀䔀㈀䘀㜀㌀䘀䔀㄀㤀㌀䘀㤀　㌀䔀㠀㌀䌀㘀䔀䈀㌀㄀㤀䄀　㐀䌀㤀䔀㜀㐀㌀㤀㠀㌀㘀㘀㠀㐀㠀㤀㄀㤀㤀　䔀㘀㄀㐀　㈀㔀䘀䘀䐀䈀㘀㐀㐀㠀㘀䔀㐀㔀㄀㜀㐀䐀㠀㘀㤀㠀㠀㤀㄀㜀䈀㠀䌀㈀䔀䈀䔀䌀㘀䈀䘀㠀㄀㌀䔀䔀㄀䐀䈀㠀㐀㈀㔀㈀䘀㜀㌀㌀㠀㠀㜀㐀㠀㄀　㌀㐀㈀㜀㜀㠀㄀㐀　䘀䘀㠀䔀㄀㄀㐀㌀㠀䔀㘀㈀䈀㐀㤀䈀㜀䐀䘀䐀䄀㤀䘀䌀䘀㌀㤀䔀㔀㐀㠀　㤀䐀䔀㘀㜀䄀㄀㄀㤀䄀䌀䐀㜀㤀㄀䐀㘀䈀䘀　㔀㤀䐀㤀㌀㠀　䐀䔀㈀㌀㤀㠀㐀㐀䈀䘀　㔀㘀㔀㈀　㜀䐀䘀䔀㈀㌀䈀㠀䌀㄀㠀㘀㘀㄀㤀䌀　㜀䄀　㄀㔀䔀㈀䈀䘀㜀㜀㈀㌀㠀㘀㔀㌀䘀㠀㔀䌀䌀㜀㔀䄀㄀㜀㐀㠀㔀䔀䈀㔀㘀䄀㌀㄀㠀䘀䘀㄀㄀䌀䔀䈀㔀䔀㜀㌀䔀䌀㌀㜀䔀䘀㘀䘀䘀䘀䘀　䌀䘀䈀䐀㤀䈀䘀䐀䔀䔀㔀㈀䄀㈀䔀㜀䌀　㘀䄀㌀䘀䘀䔀㈀㌀䄀䌀㠀㌀㠀㠀㐀㔀䈀㈀䔀㜀䌀㐀㘀䘀䌀㈀䘀㌀䔀㈀㌀䄀㈀㌀㌀㠀㜀䌀㐀䌀㄀䌀䘀㌀䌀㠀䘀㐀䈀䔀䌀䘀䘀䌀㔀㘀㜀䔀䌀䔀㠀䄀䈀䔀㜀䔀䐀㘀㌀䌀䐀䌀䘀䐀㠀㔀㄀㌀䈀㤀䄀䌀㜀㔀䔀䌀㘀㐀䔀㐀㔀　㈀　㈀䌀㐀㠀㄀㠀䄀㔀　　㈀䄀㔀㔀　㌀䐀㘀䄀㐀㈀䔀㌀䐀　㌀㐀㜀㐀㈀㤀㔀䄀㠀　㄀㘀䄀㌀䔀㔀㘀㠀㄀㔀㔀䄀㠀㜀㔀䔀䐀㔀䄀䘀㔀䌀㜀㈀䌀䐀䘀㐀䐀㤀䈀㌀䔀㜀䌀䘀㔀䐀䘀䐀䌀㌀㘀㄀㠀䐀㈀䈀䄀䔀㈀䈀䄀䐀㘀㠀䈀䈀䄀䄀㜀㠀䘀㈀㜀㠀㐀㔀㘀䌀䐀㘀㔀㤀㈀㐀䌀㈀㘀䘀㐀㄀䈀㠀䈀㠀䈀㄀䄀㈀䈀㠀䈀㠀䄀㈀㤀㄀㤀㤀㔀䈀㤀　䄀䔀䐀㈀䔀䌀㜀㘀㔀䘀䌀㄀䐀㐀㠀㤀䐀䘀㔀䘀䈀㤀㜀㈀㘀㄀㜀䈀䌀䈀㈀㔀㘀䈀㘀䘀㄀㠀㔀䄀䈀㌀㘀䌀䄀㤀䐀㌀㌀㌀䈀㌀㤀㔀䘀　䌀㌀㐀㜀䈀㔀䌀㈀㘀䘀䘀㐀䘀㈀㜀㤀㠀㔀㠀㄀㜀㤀㌀㜀㈀䌀㤀䐀㌀㜀㘀䘀䔀㤀　䐀㐀䌀㜀䈀㔀㐀㔀㘀䌀䈀㠀㜀　䌀㠀㤀㐀㜀䐀䈀㔀㄀䔀䄀㐀䘀䄀䘀㌀㜀䄀㐀㔀䔀㜀䘀䔀䈀㜀㔀䔀䄀䔀䔀㔀㈀䄀㤀㤀㐀䘀䐀䄀䐀䐀㜀䔀䐀䄀䘀㠀㌀㘀䈀㠀㄀䈀䐀䐀㜀䔀㤀䔀䔀䌀㔀㈀䘀䘀㌀㌀䌀㤀䌀䌀䄀䈀㔀䘀㘀㌀㜀㜀㈀䔀㜀㜀䘀䔀㜀䔀㐀㜀䘀㌀䈀㄀䘀㈀㐀䄀　䌀㔀䄀㈀䘀㐀㘀䘀㜀㤀㈀㜀䘀㈀䄀䐀㈀䈀䐀䘀㜀䄀䘀㌀䔀䐀䔀　䘀䈀䌀㈀㜀㜀䘀䄀䐀䘀㘀䐀䈀䘀䘀䈀䘀䔀㜀㜀䘀䈀㈀㔀䐀䘀䘀㤀䘀䔀䌀㄀䔀䈀㌀㄀䔀䘀㔀㘀䄀㔀䐀㌀㔀㔀䘀㜀䐀㄀䌀䐀㤀㤀䐀䄀䔀䄀䐀䄀䔀䄀㘀㈀䈀䄀㘀㜀䐀㐀䐀㜀䌀　䌀䘀䌀䘀㘀䈀䄀䈀䄀䈀㘀䈀䌀㤀㐀䌀䈀䄀䔀䐀　䘀䐀　　㌀䔀㐀㤀㘀䘀㌀䔀㜀䘀㘀㌀䘀㔀㌀㤀㔀䄀䔀䄀㤀㌀㄀㐀䘀䌀㘀䄀䘀䐀㈀䘀㜀㠀䌀䘀㤀㜀㐀㜀䈀㠀㘀㤀䔀㜀䌀㄀䘀䐀䐀㘀㌀䈀㘀䌀㈀䄀㘀　䄀㜀䄀䌀㘀䔀䘀㘀䈀㘀䈀䄀䈀㌀䘀㠀㘀　䔀䐀䔀　㘀㌀䈀䄀䐀䘀㐀䌀䈀㜀䔀　　㄀䈀㜀䌀䈀㠀㈀㘀㔀㔀䐀㜀㌀䘀㄀䔀䘀㘀䔀䔀䄀䘀䄀䄀㐀䄀㤀㌀㜀　䘀䔀㈀㐀㐀㌀㠀　㤀䐀䌀䘀䔀㤀䌀㜀㠀䔀䄀㘀䄀䈀䐀㈀㐀㌀㘀　䔀㜀䌀㈀㤀䘀䄀㈀㌀㜀㜀䘀䄀䄀㘀㤀䈀䔀㘀㌀䘀䄀䌀　㐀㜀䐀䌀㤀㔀㘀　㘀䘀㔀㔀㘀㠀　䌀㤀䄀䄀㘀㈀㜀㄀䐀㤀䄀㘀㘀䈀㜀㠀㐀䔀㌀㘀㌀䌀㘀㄀㐀㠀䔀䄀䐀㐀䄀㈀　䐀㐀㤀　䈀　㄀㔀㄀㘀㄀㔀㤀㈀㐀㈀㔀㐀㄀㔀㠀䘀㔀㔀㔀㘀䄀㜀䐀㌀䌀㤀㔀㄀㤀㔀㤀䄀㔀䘀㜀㈀㠀㠀䌀㤀㐀䄀㠀䔀䄀㄀㘀㤀㤀㤀䄀㘀䐀䄀㌀䔀㘀㜀㐀㌀䄀䄀䈀㘀䈀䘀䔀㘀㠀䐀㄀䄀㤀䌀䌀䄀䘀㘀䐀㔀䄀㘀䌀䌀䄀㜀㔀䄀㘀䈀䘀䈀㘀䄀㘀䄀㘀㤀㤀㔀䌀㠀㌀㔀㠀䄀䌀㤀䄀㔀㠀䄀䈀㔀㐀㈀䔀㈀㠀䐀　　㤀㘀䄀㐀㘀䔀㘀㜀　㠀䄀㤀㐀䈀㠀䘀㈀㈀㜀㐀㌀㔀䘀㘀㄀　䔀㠀䄀㤀㐀㐀䄀　㤀㔀㜀㠀㤀㔀㜀㄀䌀㌀㌀㤀䈀㔀㌀㔀䄀㌀㐀㠀䐀䐀㌀䄀䘀㜀䐀䌀㜀䈀䐀䘀䈀䐀䘀㜀䄀㘀㌀㜀䔀䔀㤀䔀㐀㈀㘀䌀䔀㄀㈀㈀䔀㌀㄀㔀䐀㔀㈀䔀㄀㘀䌀䘀㔀䐀㜀㤀䘀䘀㄀㔀㠀䈀㤀䔀䘀䌀䔀㄀䐀㠀㠀㘀䘀㔀㄀䘀䔀䌀㔀䄀䈀㌀䄀㜀　㤀㘀䈀㈀㌀䄀䔀㤀㤀䐀㜀䈀䌀㘀㠀㔀㈀㤀䐀㤀㌀䌀䌀㤀㠀㜀㈀㘀㐀䘀㄀㠀䌀㠀㔀㐀㌀㄀䐀䈀㄀㤀㄀䈀㌀㘀䈀䄀㘀䐀䌀㜀㤀䌀䐀㘀㠀䈀㘀䔀㠀䔀䄀㤀䘀㈀䔀㄀䈀㔀㘀㜀㜀㔀䐀䌀䘀㜀䄀㘀㌀䔀㔀㤀䄀䘀䐀㜀㜀㜀㐀䐀㘀　䘀㤀㤀㄀䌀㐀䘀䈀㐀　䌀　䐀　䘀䈀䘀㜀㘀䔀㜀㄀㔀　䈀㄀䘀䘀䄀䘀䔀㈀䌀䈀䘀㈀䈀䔀䌀㤀㠀㜀㄀䐀䐀䌀㐀㤀㠀㜀㜀䔀㠀䘀䌀䈀㄀䌀㘀㈀㜀䐀䔀㈀㄀㐀䔀䈀㔀㘀䄀䐀㐀䘀㠀䘀㠀㤀　䘀㄀䐀㔀㠀㄀䔀㠀㤀㐀䈀㔀䐀㤀䘀䌀䈀䄀䘀㘀㤀䈀㐀　㄀䔀　㔀㈀㠀㠀䔀㈀䔀䐀㜀㐀㜀　䄀㈀㔀䐀䔀㄀㈀㈀㈀㠀㘀㜀䐀㘀㄀㈀㈀䘀㠀䈀䌀㌀䔀㤀㈀　　　䈀㈀㈀㈀㠀㔀㄀㔀　䄀　㈀㔀䌀㈀㠀㔀㜀㜀㠀㄀㘀　　䄀㐀䈀䐀䐀䄀㄀㐀㐀㤀㔀㠀㠀㘀䐀㘀㈀㄀㄀䘀䐀㜀㌀㔀䘀　㔀㠀㔀㈀㔀㘀䔀㌀㜀㄀䈀䄀䐀㔀㐀㤀㠀㐀　㈀㔀㈀䈀㤀㤀㠀㤀㈀䈀㐀㜀㐀㌀䄀䄀䌀䘀㤀㐀㐀䔀䈀㘀䄀䘀㠀㘀䄀䔀㘀䈀䄀　㐀㈀䌀䄀㔀㘀㔀㜀䐀㄀䔀㜀㈀㔀䔀㤀㘀䄀䔀䐀㌀　㐀䐀㘀㈀㤀㐀䐀　䄀䌀㄀䌀䔀䈀㜀㘀㐀㜀㌀䌀䈀㤀䌀䄀　㐀䄀㘀㠀䈀㄀㘀䄀㠀㜀　䈀㠀䐀㘀䔀䄀㐀㜀㜀㜀䘀䔀䐀㤀䔀㠀㌀㤀䘀㠀　㐀㘀䔀䈀㠀䔀㜀㠀䐀㄀㔀䈀䐀䘀㜀㔀䌀䐀䐀㄀㈀㌀䈀䔀㜀㤀　㘀䄀㤀㌀㘀䐀䈀䈀䈀䔀㤀㠀䐀䌀䈀䘀㠀㠀䔀䌀　䈀䌀䌀䌀䘀䄀䔀㄀䈀㜀㜀䘀䐀䈀䌀㤀㄀䘀㠀䔀䔀䈀㜀㤀㜀㜀㜀㜀䌀䘀䌀　㘀㤀䔀㠀㄀䐀䘀㜀㠀㘀㤀㜀䔀䌀㌀㤀㈀䈀䈀䘀㜀䘀䔀䔀䔀䐀䄀㜀㄀㤀㜀䐀䔀㔀㤀䈀䈀䘀㈀㄀㌀㜀䌀䌀䘀㐀䈀䐀㤀㘀䌀㐀㔀䐀㘀㜀䌀　㘀㠀䔀䄀䔀㈀　㤀䔀　㈀㘀㌀　䈀䄀㄀㌀䄀㌀䐀㄀㐀㤀㜀㜀　㈀㠀㠀䌀䈀㄀㔀䄀㘀㐀䈀㜀㈀䈀䔀㄀䈀　㔀䄀　㔀䐀㠀䌀㄀㈀㄀㔀㐀㜀䄀㄀㠀㄀䈀　㄀㠀　㠀㤀㤀䄀㔀䔀㘀䄀㘀䄀䔀䄀䄀䈀䄀㔀㜀㌀㔀䄀㤀㌀䄀㈀㔀㌀㘀䄀䌀㈀㘀㔀㤀䄀㐀䈀㄀䌀㐀㈀䔀㠀㜀䐀䔀㔀㜀㈀㠀㤀䔀㘀䘀㐀䈀㈀㘀䔀㘀䔀㠀䄀䘀㄀㐀㄀䔀㔀㤀㐀㠀䔀䌀㘀䘀㤀㌀㜀㐀䔀㠀㤀㄀䄀㄀䘀㘀　㘀㜀䐀㄀䌀䌀䄀䈀㘀䘀㤀䐀㔀㤀㜀䘀䐀䐀䘀㈀㠀㔀㤀㌀䘀䔀㔀䘀㜀䈀㔀䘀　㈀䐀䘀䌀㘀㜀㄀䐀䔀㌀䈀䈀㌀䈀䈀　　㄀㘀　　㜀㄀䘀㄀䄀㘀　㐀㤀㈀　㌀㤀㄀　㐀㜀㠀㠀　㈀㐀㐀㠀㠀㠀䄀㈀㈀䔀㠀䈀　　㐀㤀㔀　䄀㐀䌀㐀㐀䈀㈀　㈀㤀㠀䄀㤀㘀㘀㤀　㤀㈀㐀㐀　㄀㄀㄀㈀　㔀㌀　　　㈀㠀㤀䄀䘀㈀㈀㄀㄀䘀䘀㈀㈀㄀㔀䈀㔀㘀㘀㐀㐀㜀䈀㘀䔀㐀㈀䈀㘀㤀㤀㌀䈀䄀䌀䔀㔀㔀㌀䈀㐀䔀㤀䐀䘀㠀㠀㠀䐀㌀㌀䄀㈀䔀䔀㌀䈀㠀㐀㤀㘀䐀䄀䈀㠀㤀㤀䈀䄀䈀䈀㄀㤀䐀㔀䘀䐀㈀䔀㐀䐀㤀䄀䔀䔀㔀䈀䔀䘀䄀㠀㠀㄀䐀㐀䈀㠀㐀䐀䔀㌀㜀䈀㌀䈀䈀㈀　䄀㠀䌀㌀㌀䘀㌀䘀䘀䘀㜀䔀䔀㤀㐀䈀㔀䘀䄀㄀㤀㄀㠀　㘀䘀㘀㜀㘀㜀䈀䘀䘀㤀䈀䔀䘀䘀㜀㜀䌀䌀䌀䌀㘀㈀㘀㜀㔀㔀䌀㌀㔀䘀㄀㌀䈀䄀䈀㄀㤀㜀䄀䌀䐀䘀䘀㌀䈀㤀㘀䐀㘀㜀㤀䔀㔀㘀㌀䐀䘀㔀䔀㌀㔀㔀䌀㌀㤀㜀䐀㠀㜀㈀㄀䈀䘀䌀㔀㜀㜀䔀㘀䐀㔀䄀㤀㈀㐀㘀䘀䌀㌀䌀㐀㠀䈀㌀㄀㈀䈀㔀㜀㤀䌀䄀㐀㄀㤀䄀䔀㔀㈀䈀　㤀㜀㘀㤀　㈀䄀㐀䌀䔀㔀㌀㄀㠀㈀㘀㐀䈀㠀䈀䔀㜀㘀㌀㤀㈀㄀䈀㈀㐀䌀㔀㔀䘀㐀㤀䐀㜀㌀㈀䐀䘀㌀㐀䌀㈀䄀㌀㜀㌀㠀㄀㠀㐀㠀䘀㘀㈀䈀㄀　䌀䐀䘀䌀䄀䈀㔀㌀䔀㘀㔀㌀㠀䐀㄀㜀㤀㔀㠀䐀㈀䈀㤀　㐀㔀䈀㐀㈀䌀㤀䔀㔀㔀䐀㔀㈀㔀㜀䘀㔀䔀䐀䐀㄀㔀㘀㠀㄀䔀䐀㤀䈀䘀㠀㤀㔀　㘀㤀㐀䈀䘀䄀㈀㜀䄀䘀䔀䈀㜀㄀㐀㔀䘀㘀㠀䌀㔀㔀㤀㐀㠀䐀䌀㐀　䔀　䘀䄀䐀㤀䈀㠀䈀䔀䔀䐀䌀㔀㠀㤀㔀䘀䌀㜀㤀㐀䐀㔀㜀㜀　㠀䐀㜀䘀㔀䘀㜀㜀䘀㤀　㔀㌀㐀䌀㠀㘀䈀䈀䄀㘀䌀䔀㌀䄀䄀㘀䐀㄀䈀㘀㐀㐀䐀䌀䔀㔀䌀㈀䄀㌀㔀㘀㤀䐀䄀㜀㄀䔀㌀㄀㘀䈀䄀㤀䈀䔀䌀䔀䌀䔀䈀䄀䄀㌀㘀䐀㔀㜀㜀　　㘀㌀䈀㜀䌀㜀㔀䄀䄀㤀　㔀㘀䐀㠀䌀㈀㐀㈀䈀䄀䈀㤀㐀㈀㌀䄀㐀䐀㠀㔀㔀䌀䌀㄀㔀㔀㌀㜀㔀䈀㐀㘀㘀䐀㄀㠀　䈀㤀㌀㐀㠀㠀㈀㤀䈀䔀䔀䔀㜀䄀䄀䄀　㔀㜀䐀䔀㠀㔀㄀㠀䔀　㌀䄀䄀㐀㔀㄀㌀　䈀㄀㠀䄀㄀䔀㤀㌀　䄀䔀㔀㐀　　䌀㘀㤀㔀䌀㤀䈀㜀䐀㌀　　㔀㘀㜀䐀䔀㜀䌀䌀䘀㔀㠀䄀㠀　㜀䌀䘀䈀㐀㜀䈀䔀㤀䘀䄀㐀㐀㄀　䌀䐀㈀䄀䌀㠀㌀㄀　䘀䘀㔀㜀䈀㘀㔀䘀䄀䘀　㈀䔀㘀㈀㜀䄀㈀㐀䔀䌀䐀　㤀㐀㐀䄀㜀㔀㌀㔀㔀㠀㠀䄀㈀㔀䔀䄀㠀䄀　㌀㈀㈀䌀䌀䌀䌀㌀㔀䘀㔀䌀䈀䘀䘀　䌀䄀䈀䌀䘀㤀㤀㔀㜀㤀㠀㠀䐀㠀㈀㘀㄀䈀䄀䌀䘀䘀䐀䌀㜀㤀䈀㘀㈀㘀䈀㜀㘀㔀㄀䐀䘀㜀㄀㜀㐀䘀㌀䘀䈀䐀䈀　䘀㌀㘀㤀䘀䄀㤀㠀䔀㠀㤀㤀䄀㘀　䘀㌀䔀䔀　㜀䘀㈀㐀䔀䐀䘀䈀䐀㠀䄀㄀䄀䔀㘀㘀䘀䈀　㌀㈀䄀䐀　　䐀㤀䔀䔀䔀㔀䌀㄀䈀䌀䔀㈀䈀䌀㘀㤀䄀㘀㈀䈀䌀㘀䌀㌀㤀㈀䔀㌀　㤀䄀䘀㈀㐀䐀䈀䈀㘀　䌀㄀㐀㘀䌀䄀䌀㄀䄀㔀㈀䈀㈀䄀㐀䄀㠀䈀䌀䌀䌀㐀㘀㐀䐀㈀㌀㤀㔀䌀㐀㔀㤀䔀䄀㈀䄀㌀㐀㔀㜀䌀㔀㄀䄀㤀䌀㌀㈀㔀㘀䐀䐀䈀䔀　㔀　㜀䔀㜀䔀㐀㔀㐀㔀㜀㤀䌀㄀㠀䄀䐀䄀㄀䌀㤀㌀䌀㤀㘀䌀䈀㘀㄀㠀㜀㌀䈀㐀䐀㘀㔀䄀　䐀㐀䈀㈀㠀㘀䔀㘀䄀䐀䐀㜀䄀䈀　㘀㤀㘀㌀㈀㌀㜀䌀䈀㌀䄀㠀㘀㄀㌀䔀䌀㠀䘀㈀䌀䄀䐀㔀㌀㜀䌀䘀䌀䘀䔀㌀䌀㈀㔀㌀䄀㌀㘀㘀㐀䄀䌀㠀㐀䘀䄀㤀䄀㔀㘀䘀䔀䌀䐀　䄀㠀㌀㔀䐀㠀䌀㘀㤀䔀䌀䔀䄀䘀㈀㠀㔀　㤀䔀䌀㤀䄀㜀䘀䈀㌀䌀㤀䄀㜀㄀䐀䄀㄀㘀㠀䘀䔀䘀㠀㤀㔀䄀㤀㠀㔀䔀䐀䔀㜀䈀䐀㜀䐀䌀㌀㄀䈀䄀䐀㄀㠀㌀㤀䘀㌀䔀㜀㈀㌀㤀䐀䐀䔀㘀䘀㄀䘀䈀㐀㜀㘀䈀䄀䈀㤀㌀㘀㜀㤀㜀㘀䔀䘀㘀䘀㠀㐀㜀㔀㄀㐀䌀㌀䔀䘀㌀䌀䐀㘀䄀䘀䌀䐀㤀䄀䘀㌀䔀㜀㠀䔀　䘀㔀㌀㌀㄀䘀㤀䔀㔀䔀䘀㠀㘀㌀䘀㈀䄀䌀㠀㠀㔀㜀䄀㘀㤀䔀䌀䌀㄀　㌀㘀䄀　㄀䌀㄀㠀㔀㔀㌀㜀㜀㤀㤀㘀䘀䈀㤀㘀㐀㌀㄀㈀㄀㌀䔀䌀㈀㔀㌀䌀㐀䘀㐀䄀㔀䌀㈀㔀㤀䔀㄀㈀䈀䔀䄀㐀䄀㐀㈀䄀䐀㜀䔀㘀㌀㈀㘀㄀㔀㌀㄀㄀䄀䌀㜀㄀㄀䘀䐀㜀䔀㠀䘀㐀㈀䄀㄀䐀䄀䘀㈀䔀䄀㌀㜀㜀㐀㘀㌀㤀㄀㠀㠀䘀㔀䈀㄀䄀㈀㄀㜀㌀䈀㘀㌀　㈀㜀䄀㘀䈀㘀㄀䘀䄀㔀　䄀㔀㌀䘀䈀㠀䘀㘀㈀䘀㘀㈀㌀䄀㐀䈀㐀㈀㘀㤀㔀䘀㈀㈀㐀䄀䘀䈀㠀㠀㌀䔀䌀䈀䔀㔀䌀㈀䔀㜀䐀㤀䌀㈀㈀㜀㤀䈀䄀䘀㔀㤀㄀䔀䐀䐀䈀䈀䘀㌀㠀䐀㜀䔀㄀䈀䈀䔀㈀䄀䘀㔀䄀䌀䈀㌀䐀㔀䈀䐀䐀䄀䔀䄀㄀㤀㘀㠀䄀䘀㈀㤀㘀䄀䐀㠀䐀㠀䐀㐀㌀㤀䔀㜀㈀㘀㄀䌀㌀䈀㄀䄀䈀㐀䔀䘀䘀䘀㈀䘀䔀䔀䐀㈀㌀䐀䐀㤀䘀㌀䐀㜀㤀䘀　㤀㘀㄀㜀㘀䘀䔀䈀㔀㠀㜀㠀㈀䈀㜀㠀䌀䈀㘀　㜀㤀䐀㔀䌀　㤀㔀䘀䔀䐀㄀㄀䈀䘀䌀䘀㘀䌀䄀䈀䔀㔀㤀䔀䄀㄀㤀䐀㜀㤀䘀䘀䐀㌀䐀㌀㜀䌀䈀㜀㘀㄀㌀䐀㐀㜀㠀㈀䌀㜀䄀㄀䐀䈀㈀㌀㜀䔀㐀㘀㈀䔀㤀㐀䔀　㈀㤀䘀䄀䈀䄀㌀㌀㜀㈀㄀㄀䔀䐀㌀㄀䈀㘀　㘀䐀㠀䈀䄀㠀㤀䌀㈀䌀㜀䈀㈀䐀䈀䌀㐀㠀䔀䘀㐀㄀䌀㈀㈀㈀㔀㤀㜀䄀㈀㠀㤀㜀䐀䐀㄀䔀㜀　䐀㐀䘀㄀㐀䐀㄀㘀㜀䌀㤀䘀䄀　㄀㈀䔀䐀䈀㔀㤀㘀䌀䄀㐀㈀䌀㜀㘀㐀㜀㜀䄀㈀䌀㜀䐀㄀㔀　䄀䌀㔀㜀㌀䐀㜀㔀㈀㘀䄀䈀㜀㔀䐀㠀㔀　㔀㠀㈀㈀䄀㠀䐀䔀㔀䐀㔀㘀㔀䘀䈀㠀㘀䔀䘀㐀䐀㘀㔀䐀㠀㈀㈀　䘀䐀䄀䄀䐀䐀䄀㤀䄀㈀䘀㜀㔀㜀䔀䐀㘀㠀㈀䐀㄀䄀䘀㐀㔀㠀㔀㜀㤀㐀㄀㔀䐀㤀䐀㔀　䔀㠀㜀䈀䄀䄀　㠀　䄀㠀㔀䐀㘀䄀㠀䘀㤀䄀㔀㜀䄀䈀䐀㜀㌀㜀䐀㠀㔀䌀㐀㘀㘀䌀㔀䌀㔀㄀㐀䄀㄀䘀㐀䈀㈀䈀䄀䈀㌀　㄀㔀䄀㠀䔀㤀䔀㌀㘀㜀䐀䘀䌀䌀䐀㄀䄀䌀䄀㈀㔀䘀㘀䄀䄀䐀㄀䔀㠀㄀㐀　䐀㈀䌀㠀䐀㌀䈀㠀㠀㠀㤀䘀　㔀㈀　㔀䌀䘀㠀㈀㜀㈀䄀㈀　㐀㠀㤀㐀　㘀㤀䘀㜀䌀㜀㌀㜀㠀㠀㤀䐀　䈀䌀㤀㈀　㤀㘀㐀㘀㠀䘀㤀㘀㜀䄀㤀䌀㠀䌀䐀㔀䘀䐀䄀㌀㤀䘀䔀㤀㜀䈀㄀　䐀㄀䐀䘀䈀㄀䘀䈀䌀㤀䌀䐀䐀㌀㌀㐀䔀䐀㜀㘀㤀䈀䔀䈀䌀㘀㔀䄀㠀䄀㄀㜀㄀㤀䈀䄀㜀䄀㈀䘀䌀㤀㈀㐀㄀㤀㜀㘀䈀䈀㠀䈀䐀㌀㈀㌀㤀㔀䈀䔀㠀㄀䈀䈀䘀䘀㤀䐀㈀䐀䐀㤀䐀䘀䔀䄀㄀䔀㌀㈀㜀䄀䘀䈀䌀䔀䔀㠀㜀䈀㜀㜀㔀㔀䐀䈀䄀䘀䐀㠀㄀㌀㌀㔀䌀㐀䄀㘀㔀䘀䔀䔀㜀㔀䈀䔀㘀䘀䄀㈀䈀㄀䐀䘀䔀㘀䈀㐀㜀䈀㘀㔀䐀䐀䐀㔀䘀㔀㄀㌀㌀㜀䌀㄀䐀㐀㔀䐀䌀　㐀　　㜀㠀㔀㐀㜀㔀㄀　㠀䈀䈀㔀㄀䔀㌀㌀㠀㜀䘀㔀㜀㘀㔀㄀㐀㌀㔀㐀㈀䔀㤀㠀㌀㜀䘀㌀㈀䄀㄀㔀㐀㜀䈀㔀䐀㔀䔀䈀㐀㐀䈀㔀㐀　㤀㜀䘀㈀㈀䘀䌀䌀䐀㌀㤀㠀㄀䌀㠀㔀䄀䘀㄀㜀䄀㠀㤀䈀㐀䈀㠀䘀　䐀㌀㐀䐀㄀㠀㤀㌀㈀䔀㜀䈀㤀㈀䐀䘀㤀䘀䈀䌀㌀㠀㜀䐀㤀㠀䐀㤀㜀㌀㌀㐀䘀䘀㄀㄀䐀䈀䘀䌀㘀㘀㈀䘀㈀㐀㌀䔀　㜀䐀㈀䈀䄀䌀㠀䄀䔀㠀䐀䐀㤀㘀㤀㔀䄀㠀䐀㜀㘀㌀㘀䐀㈀㈀㌀䔀䌀㈀䐀㤀䔀䐀䔀㔀㔀䄀㘀䐀㜀㤀㜀㤀䐀䔀䄀䄀㤀㔀䌀㠀䐀㘀䐀　㔀　㘀㠀䄀㜀㈀䈀㄀䈀㈀䔀㠀䘀䄀㜀䔀䔀䔀㠀㌀㐀㔀㔀㄀㐀䄀㠀䐀㄀䌀䄀㘀㈀　䄀䄀㠀䐀㘀䄀㠀䄀㌀㠀　䈀䔀䐀㠀　㠀䐀㤀䔀㠀㤀㐀㌀䌀㠀㐀䈀䈀䐀㤀㄀㠀　䔀㌀䔀　㤀㄀䔀䄀㤀䄀㈀䈀㠀㠀㄀䘀䈀㐀㤀㤀㤀㠀㠀㜀㌀㐀㠀㌀㜀㐀䄀　䄀䄀㐀䐀䄀㘀㘀㜀㘀䄀䘀㠀㐀䘀䔀㘀㘀䌀䔀䔀　㔀䔀䐀㤀㠀䌀䈀䘀䄀㈀㄀䐀䈀䔀䈀㐀㘀㔀㘀㐀䌀䐀䈀㈀䔀㈀䐀䔀䌀䈀㐀㈀㈀䈀㤀䈀　㈀　㌀㈀䐀㌀㤀㜀㘀㔀䌀㘀㐀㌀㈀　䐀䈀㐀㤀㐀䈀㜀䄀䔀䄀䄀䐀㐀䔀㜀䔀㄀䄀㈀䘀䄀䌀䘀䘀䌀䐀䐀㤀㄀　㌀䐀䘀㠀䄀䄀䘀䌀㈀䈀䈀䈀䌀䔀䔀䔀㈀　䐀䔀㌀㄀䐀㤀䘀䄀䈀㘀䔀㜀㜀㄀㔀㄀㔀䐀㘀䈀㔀䐀㘀　䌀㄀䘀䔀㌀㘀䔀㐀㠀㌀㘀䘀䐀䐀䄀䔀䐀㔀䔀㤀䈀㔀㜀䐀㄀㔀㠀䈀䌀䘀㘀㜀㜀䘀㠀㐀䈀㘀㜀㌀㘀㄀䔀㜀䘀䘀㄀䌀　䔀䄀䌀㘀䔀㄀㈀䈀㌀䄀㌀㐀㄀㘀䐀䐀䐀㤀䈀㌀㐀䄀㈀䔀䔀㌀䐀㐀㠀㘀䘀䐀　㠀䌀㄀䈀㄀䔀䌀䌀㄀㜀　㜀䌀㈀䐀㌀䈀㤀㘀㜀䘀䈀㌀䔀㔀䐀㐀䄀㠀㄀䈀䌀㤀㘀䘀㄀㐀㄀㄀㐀䔀　䄀㌀㄀㠀㠀䈀㜀㌀䌀㜀㐀䌀㐀䔀㌀䐀㄀䔀㠀㌀　㘀䘀㌀㐀㘀㐀　㤀㔀㤀㠀㈀㘀　䄀㜀䌀䘀㘀㤀䄀䈀㔀㔀㈀䄀䘀㔀㌀㘀䘀㔀㈀䐀㘀䄀㘀䔀䄀䐀㜀䄀㤀㌀㤀䄀䄀䈀㔀㈀䌀㌀㘀㠀䌀䌀㤀㤀䌀䌀㄀㘀㘀䌀䌀㄀䐀㠀㐀䔀㔀䘀㄀㈀　㈀䘀㌀䔀䈀㘀㄀　䐀䐀㘀䔀㐀㔀㤀䈀㈀㜀㠀㤀㌀㐀㘀㘀䐀䄀㐀㌀㜀䄀䈀㄀䔀䔀㌀㜀㠀㔀䔀㔀　㌀䘀䌀㄀㌀䘀䘀䌀㄀㠀㜀䐀䈀䈀㠀䄀㠀䔀㠀䔀㐀㜀䘀㌀㈀䐀㠀　㄀㔀㤀㠀䌀䈀㌀䌀㐀䘀䐀䘀㤀䈀㔀㈀㌀䘀䐀䄀㔀㠀㜀䘀㜀㌀　䐀㜀䐀㜀㠀䐀㐀㌀㠀䄀䘀㤀䄀㤀䘀䈀㜀㘀　㌀㜀㘀㐀㈀㠀㠀䈀䈀䈀㌀　䈀䐀㤀㈀㌀䐀㠀㤀㘀䘀㜀㌀䐀㠀㌀㐀㜀㐀䐀㔀㘀䈀䔀㐀㌀㔀㄀䄀㄀䈀㐀㐀㤀㄀㐀㌀㌀㠀㤀㤀㜀䌀䈀䔀㈀䈀㔀㤀䐀㤀㤀㄀㜀䌀　㤀䈀䘀㠀䄀㌀㔀䈀㜀䄀㠀䘀㐀䌀㘀㄀䌀䐀㌀㘀㘀㔀䌀䐀䄀㘀㜀䌀䄀㌀㄀䔀䄀䐀㔀㠀䘀㌀䘀㈀䔀䌀㐀㤀㈀㈀䘀㔀䄀㘀䈀㘀䄀㤀䈀䔀䌀䘀䘀䘀䌀䈀㌀㠀䄀䄀㘀㤀䄀䔀䄀㘀㔀䘀㐀䈀䐀㄀䐀㈀㜀㐀　䈀䘀䄀㌀䄀　㤀䘀㄀㄀㈀䐀㐀㌀㘀䔀㠀㠀㈀㘀䔀㈀㌀　䄀䐀䈀　㠀㤀㘀㈀䈀㔀㠀䐀䔀㐀䈀䈀䘀㈀㌀䐀䘀㤀㐀㜀䔀㤀㜀㘀　㘀㜀㜀㄀㌀㌀㘀䐀㤀㠀㤀䐀䈀䔀㔀䔀㘀䐀䌀　䔀䔀䄀㘀㌀㜀䘀㘀䈀㌀㈀㄀㤀䐀㤀㘀䘀㘀䘀㘀䔀㤀䐀䘀㄀㈀㤀㈀䔀㠀㄀㤀㘀䘀㌀㜀䘀䌀㌀㈀㘀㈀㤀㜀㐀　㐀䄀㈀䔀㈀㈀䘀䌀䌀㔀䈀㤀㐀㌀㤀㠀䄀㠀㔀䘀䔀䈀䄀㤀䄀㐀㜀㠀㌀㐀㘀䐀䔀㔀䈀㘀㌀㈀䘀䔀㌀䘀㌀䔀㐀䘀㜀㘀㔀䌀　䔀㐀　㐀䐀䈀䔀㠀䌀䘀䄀䌀䘀㤀㜀㤀㘀　㜀䐀㠀䐀䘀䌀　㔀䘀㌀㌀㠀㄀䈀㜀䔀䔀㈀䄀䄀㤀㘀䌀㄀㘀䌀䔀㜀䈀䄀䘀䄀䐀䄀㤀䌀䈀㄀䐀䔀䘀　㜀㜀䄀䔀䈀　䐀㤀㔀㜀䘀㜀㌀㤀㐀䘀㈀㐀䈀䐀㤀䌀㘀䄀䘀䄀䈀䔀䄀㘀㔀㔀䈀䔀㠀㈀䔀䄀㜀㔀䔀㔀䔀㄀㘀㠀㜀㔀䘀㜀㘀䔀㘀䘀䘀㄀䄀䐀䐀㄀㘀㐀　䈀㜀䘀䘀㠀㠀㜀㄀䌀䄀㜀㔀䔀䔀㔀㜀　䈀㠀㔀㔀㄀䌀㤀㜀䔀䌀㜀䈀㐀㜀㈀䐀䄀䔀㜀㜀䘀䄀䄀䐀㐀㘀䔀䔀㜀㠀㘀㄀㔀㤀䘀㤀䈀䔀㈀䔀䌀㜀㘀㘀䔀䘀㐀䄀㜀㌀䔀㤀㄀䐀䔀㌀㄀䈀䄀㈀䌀㌀䌀䐀㄀䄀㔀䔀䌀　䔀　䔀㜀㤀㜀㤀䐀㜀䐀㔀䈀䈀㠀㐀䔀䈀㠀㄀㄀䐀㤀䐀　䄀㔀㄀䔀䄀㜀䐀㤀㘀㘀䈀㄀㈀　䐀䈀㌀㜀㘀䌀䐀㠀㘀䈀䐀䈀㘀㈀䈀䈀䌀㌀䘀㘀㤀㜀㌀㘀㐀㄀㜀䄀䄀䐀㠀㌀䄀䐀䄀䌀䌀㠀㐀㘀㔀䘀㌀䈀　　䘀㌀㌀㄀㤀䈀㤀㤀㘀䐀䘀䔀㈀䔀䌀㤀㜀䐀㄀䄀㤀㐀㌀㔀䘀　　䘀䄀㌀㄀㈀㈀䔀䘀㄀㈀㠀䄀䘀㤀㜀㈀㜀㘀㘀䈀　㤀䔀䈀　䌀　㐀㐀㔀㔀㐀㤀㈀㌀䄀㌀㐀䌀㘀䘀䐀　㤀䄀㘀䔀䄀㈀㔀㜀䘀㈀㠀㜀䈀䌀㐀㄀㐀㐀㐀㤀㄀㜀䄀䈀㤀䄀㠀㔀䔀䈀䐀㘀㈀㐀䌀䘀䌀䔀䔀䘀䘀䘀䔀㄀㤀䐀㔀䈀䈀㘀䐀䌀㜀㔀䘀㈀䌀　㜀㜀㌀　䐀㜀㤀　㜀䌀㜀㔀㔀㤀䈀㐀㘀䘀䘀㔀　䔀㤀䘀䐀䐀䐀䔀㌀䔀䈀䄀䄀䄀㜀㜀㠀㘀䔀　㤀㤀㄀䘀㌀䌀䈀㌀䔀㔀䘀㠀㐀䘀　䘀㄀䔀㜀䔀䘀㔀䐀䔀㈀䐀㠀䘀㌀䔀㔀䔀㜀㜀㔀㤀㜀㜀㔀㤀䘀䘀䌀㄀㤀䐀䄀㄀㐀㌀　㌀䔀㔀䌀㄀䈀䐀䐀㐀㈀䘀䄀㤀䐀䐀㌀䔀　㜀㜀㘀䄀㌀䔀䘀䘀㤀㘀䈀䘀㘀㄀㐀㘀㠀㘀䐀䌀㐀䔀䄀䈀㈀㜀䄀䄀䌀㐀㜀䄀䐀㠀㈀䐀㔀㘀䄀䌀䘀䈀㄀㤀㌀㘀䌀㔀㜀㌀㘀㤀㜀䌀䐀㤀䔀䐀䘀䌀䈀䐀㘀䔀㔀㔀　㈀㌀㈀㄀䐀㤀㐀㠀㠀䄀㤀䌀㈀　㘀㈀　䔀㐀㔀䈀䘀㠀㐀䄀㜀䘀䈀䄀　㈀　㌀　䐀㤀㌀䈀㈀㠀㔀㠀㌀㠀䄀䔀䄀㐀㈀㄀㘀䄀㈀䘀㌀䈀㠀㄀䔀㜀㌀䈀㄀㌀　䔀䘀䘀㠀㄀䄀䐀䈀㔀䐀䈀䈀䈀㤀㜀㜀㜀䔀䔀㤀㠀䐀䐀㤀㐀䄀䌀䌀㜀䔀㐀䌀䔀䄀䔀䐀㄀㌀㔀㈀㐀㈀䈀䈀䘀䄀　䐀㘀㔀䈀㔀䐀䈀　䐀䐀㈀㜀䌀㐀㜀㐀䘀䄀㠀㈀䈀㄀䌀䘀㌀䔀䈀㤀䘀㜀䘀㠀䄀䘀㌀䄀㤀㜀㔀㔀㤀㜀㔀䄀䘀㠀㐀㌀　䈀㌀䈀㈀䐀㘀㔀䄀䈀䌀䄀䐀䈀　䔀㘀䌀㤀䈀䐀㤀㘀㐀䐀㜀䄀䄀㔀㐀䐀㈀　䔀㔀䘀㘀㄀㈀䐀㐀㠀䄀䄀䄀㜀㔀㤀㐀㔀䄀㌀䐀㄀䘀㄀䈀䌀䈀㈀㌀㌀㔀㌀㠀㜀　䌀㤀　㄀䘀㄀㄀㜀䈀䈀㤀　䘀㠀䘀䔀㠀㈀䘀䐀䐀㜀䘀㈀䈀㠀䄀㐀㠀䄀　㈀㠀㘀㌀㤀　㔀㘀　䈀㈀㠀䐀㌀䐀䈀㔀䈀䘀㈀䘀㐀㜀㜀䐀㄀䈀㄀㔀㠀䄀㘀㤀㘀䐀䘀䐀㔀㈀　㤀㜀㄀㌀䘀䌀䔀㄀㠀㔀㘀㌀㤀䌀㜀㜀䔀㄀䔀䘀䈀㤀䔀䈀㠀㔀䐀㠀㄀䈀䌀䘀䈀䌀䘀㄀䌀㄀㄀䈀㔀㈀䌀䘀䘀䌀䈀䘀㐀㄀䌀䘀㔀䄀䐀㐀䔀㤀㈀㤀㠀㔀㄀　䔀㄀㄀䈀㜀㠀㠀䔀䔀䐀䔀䄀　㘀㄀㄀䘀㐀䐀　㜀㌀㠀㌀䘀㐀䔀䌀㄀䐀㠀㄀䌀䔀䔀㤀㠀㌀㐀㜀㠀䘀㘀㤀㌀㐀㔀䄀㤀䐀䘀　㤀㐀䐀䌀㌀䈀㜀㐀㈀䈀㜀㔀䄀䄀䘀㐀㌀䄀䈀䄀䄀㐀㐀䘀䌀䈀　㤀䈀䔀㜀䈀䔀㄀㘀㔀䘀䌀㔀䄀䐀㈀　㘀䘀䐀㤀䐀㜀䌀㌀㌀䐀㤀㈀　䘀䈀䐀㔀㜀㌀䔀　㔀㜀㔀㔀㘀㠀䐀䌀䔀㌀䄀　䐀㌀䘀　㈀䄀㠀䌀㐀䈀㌀㠀䘀䈀㔀䘀㔀㐀䔀㄀㈀䐀㔀㔀㜀㜀㔀㐀㜀㄀䄀㐀䌀䄀㔀㔀䔀㔀䄀㤀䔀㈀䄀䈀䄀䄀㘀䄀㐀䄀㘀䌀䘀㐀䘀䐀　㔀㤀䌀㈀㄀㈀䘀㤀䘀㠀㔀㄀㌀㐀䌀㘀㄀㠀䈀䈀䔀　䈀䐀䐀㘀㘀㠀㌀㘀䈀㔀㔀䄀㈀㌀㈀䈀　㄀㤀㈀䘀䈀㈀㄀㄀䄀䄀㤀㄀㘀㤀䈀䔀䘀　㘀㈀㘀㌀㤀䄀㜀㌀䌀㄀㤀㜀㐀㔀㜀㈀㌀　㄀㠀㤀㈀㄀㘀㤀㜀㐀㈀䔀㜀䘀㤀㄀㠀㔀㠀䈀㈀㠀㤀䈀䈀㤀㜀㜀㌀㔀㘀㈀㔀　䔀㄀䐀䐀䘀䘀㐀䐀㤀䐀䘀㜀䌀㜀䔀䈀　䘀㜀䌀㐀㘀䈀㜀㜀䘀䌀㄀㐀　㘀㠀䌀䔀㐀㘀䘀㤀㜀㔀䐀䈀㄀䄀䐀㜀䐀䈀䄀䌀䘀䔀㤀䔀䌀㠀䘀䈀㘀䐀䄀䈀䄀㌀䈀㌀䐀䘀㤀䘀㠀䐀䔀䐀㜀㤀㈀㐀䔀㜀䈀㘀䈀㘀㌀䘀㄀䘀　　㌀䈀䘀䈀㠀䘀䔀䄀䄀㜀䘀㜀㤀䔀　䐀㈀䈀䘀㜀㤀䌀㐀䐀䐀㌀䐀㔀㐀㌀㤀㜀　㘀　㜀㠀䘀㐀䐀　㠀㠀䐀㌀㔀　㐀㠀㜀㈀㜀㘀䌀㤀㜀㘀䐀䌀䌀䘀䔀䌀䔀㠀䘀㄀㄀㐀䄀㠀䔀䐀㠀㈀㔀㘀　䈀䈀㄀䄀　䈀㌀䈀㌀㄀䈀㔀㔀㄀㘀䘀㘀㌀䘀䄀㜀㈀㄀㌀㘀㌀　㘀㠀䈀㔀㤀䌀䄀㠀䐀㜀䌀㄀㘀　㐀㐀㐀㄀㤀䌀㘀䘀㤀㤀䌀䘀㤀㘀㘀㄀㤀㐀㜀㄀㤀䌀㌀䘀䈀㔀䘀㐀㤀㔀　䄀㈀㜀㌀　䌀㄀㔀䘀䌀㐀㈀㐀䘀㤀䔀䈀䔀㐀䔀㔀㤀　㤀䘀　㘀䘀㄀䐀㜀㐀䘀㄀䘀䌀㄀䄀䘀㈀㐀䌀䈀㤀　䐀㐀㈀㌀㜀䔀　㈀㜀䄀䔀㐀䐀㄀㌀㈀㠀䘀㤀㘀㤀㌀㜀䄀㐀㈀㤀㐀㈀䘀㜀㌀㠀䈀㄀㘀䌀䌀㤀䌀䐀㠀㈀䐀䘀㄀㄀　㘀㈀䄀㜀㠀䘀䌀㠀䐀㜀䘀　㜀䘀㠀㐀㘀䈀㔀㐀䈀　㌀䄀㈀㤀䐀䄀㈀㤀㘀　䄀䘀䈀　㐀㔀䔀　㠀㠀䔀　㄀㈀㌀㠀㐀㄀䐀　䘀　　䄀㠀䘀䄀㜀㐀　㌀㘀㌀䔀䔀㔀㔀䔀㠀䈀䔀㠀䌀䄀䄀㈀䔀㔀䐀㄀㈀䐀䌀䈀㔀䔀㈀㄀㜀㘀㘀㘀䘀㘀　䐀㤀㤀䄀㜀㠀䄀䔀㘀䌀㠀㈀㈀㜀㐀䈀䐀䄀㜀㈀䘀㌀䘀㘀䘀㔀㔀㄀䔀䈀㜀㐀㘀㠀　䌀㄀㄀㌀㘀㜀　㤀䄀㠀㈀㠀䌀䘀䄀　㌀㘀䔀㤀㌀㔀䘀㘀㌀㤀㌀㔀䐀䔀䄀䐀䌀㘀䔀䈀䐀㔀䐀䐀㘀䄀䄀䔀㔀㘀㠀䐀䄀䐀㌀　　䔀䔀㠀㜀㐀䌀䈀䘀㜀䔀㔀䔀　㔀　　䔀㜀㘀䔀㜀䈀㐀䔀㔀㜀　㈀䈀㜀㈀㜀　　䔀䘀䌀㌀㔀㐀㈀㄀䔀䈀㔀䈀㠀㈀䌀㤀䌀䄀㔀㈀㠀㐀䘀䐀　㄀䈀㔀㔀㘀㘀㜀㔀　䔀㘀㠀䘀㌀㤀㠀㈀㄀㐀䈀㘀䈀㤀㘀䌀㜀㠀㄀䘀㤀㘀䌀㌀㘀　　䌀　䌀䌀㤀㔀㘀䐀䄀䌀䄀㜀㐀㌀㈀㠀㈀㌀㐀䔀䈀㤀䐀㤀㐀㘀㌀㠀㄀　㄀　㘀䘀䔀　㤀䈀㜀㌀㈀㠀㜀　㘀㔀㄀㠀　䄀㤀㔀㌀㘀䄀㜀㠀㐀㈀䘀䔀　　䈀　㔀㠀䐀䌀䔀䄀㠀㜀䘀　㈀䐀䘀㤀㤀䘀䌀㐀㠀㌀㠀㠀䈀㜀䔀㤀䈀㌀䌀㈀䈀㈀㐀㌀䘀䌀㈀㜀㜀㌀䔀䄀㔀㌀㌀䔀䄀㐀㐀㄀㔀䐀䔀䈀㄀䈀䌀䐀㘀䐀㔀㔀䌀䌀㄀䈀㔀㤀䌀㌀䔀䌀㈀㌀㜀㤀䐀䘀㤀㄀㄀䘀䐀㈀㜀䌀㐀㄀㘀䈀䔀㔀䈀䐀䔀㔀䌀㔀䘀㔀䈀㈀㐀䔀䈀㈀㜀㈀㐀㤀㠀㘀㔀䈀㜀㜀䄀㤀䄀䘀㘀㠀䈀㜀㠀䈀㌀㠀㠀㐀㔀䈀㄀㄀　㌀㈀㤀䘀䌀㘀䌀䔀䐀䘀㈀㄀　　䈀㘀㄀䔀㐀　㐀䘀䈀䈀㠀䘀䌀㌀䔀䐀䘀㐀䈀㔀㌀㄀䔀㤀㘀㄀䌀㌀㤀䘀㘀㜀䔀䈀㌀㔀䐀㈀㄀䄀㜀㔀㄀㐀䌀㘀㌀　㠀㠀㤀㠀㔀㌀㘀䔀　㔀㔀㐀䌀䌀㠀　　㔀㠀㄀㐀䘀㘀　㌀㌀㜀䔀㤀㈀䌀㜀䔀㘀䔀㐀㤀䈀䌀㤀㄀䔀㄀䔀䌀㐀䔀㠀䔀㈀㄀䔀㌀䘀㜀䐀㠀㐀䘀䈀䘀䄀䌀㈀㈀　䌀䐀㘀䄀㌀㐀㠀㈀䐀䔀㠀㘀　㠀䄀㈀㌀㌀䔀㈀　㄀㐀䘀䔀䐀䔀䄀㠀䄀䌀䔀　䄀䄀䔀䐀㤀䈀㘀䐀㄀䌀㘀䄀䐀䌀䔀䔀䔀䌀䌀䔀㘀䈀䄀㜀㠀䈀䌀㤀㘀䌀㜀㌀䄀䐀䈀㤀㘀㄀㈀㤀䌀㌀䔀㐀㌀㤀㘀㘀䘀㤀㔀䐀㈀㔀䌀㘀㜀䐀㈀㤀㜀䐀㄀䘀㠀㔀㔀㐀㄀㈀　䄀㔀䔀㜀㌀䄀䔀䄀㈀㜀䄀㌀䐀㈀㌀䌀㤀䘀㐀㘀　䄀㜀䐀㠀㌀㤀㌀㌀㐀䐀䐀䄀㠀㌀㠀㘀㜀㘀㈀㜀䌀䐀㤀㤀㘀䔀㌀㌀䘀䈀䘀䘀㤀䄀㘀㔀䘀䐀䌀㌀㌀㌀　㜀　䌀䘀䌀䘀　䔀䐀䔀䘀䌀㠀䈀㜀䈀䘀䌀䐀㠀㔀㄀䐀䈀䈀䈀㜀䈀䌀㌀㠀㘀㜀　㠀䘀䈀㌀㜀䄀䘀㌀㄀䔀㐀䘀䌀䈀㤀䔀㄀䔀㈀㜀䔀㜀䈀䔀䘀䐀㤀㔀㄀㌀䘀䐀䘀䔀㜀䈀㜀䔀㜀㤀䌀䈀䄀㄀㔀䘀㄀䌀䐀䘀䈀㈀䔀㔀䘀㠀䌀䘀㘀䔀㄀䘀㌀㤀㌀㠀㔀䌀㔀㌀㌀㌀㜀䌀䔀㌀䘀㘀㤀㄀㄀䈀㠀㘀䄀䄀㈀䄀䈀㜀㄀䔀㔀㐀䈀㈀䈀㌀　㜀㄀　䌀䐀㐀㔀㈀䈀㘀　㔀䐀㘀䄀䐀㔀䐀㤀䌀䌀㔀㘀　㈀䈀㤀㤀㤀䈀㜀㔀䄀㔀㄀㜀㤀㜀䔀㐀䔀㌀䄀㠀㈀䘀㐀㐀㤀䄀䄀䌀㜀䈀㈀䈀㌀㜀㌀㜀㔀㜀㤀㄀㜀㐀䐀㌀䌀㤀㈀㤀㌀䌀䈀䄀㤀㤀䄀㠀䐀㤀　䐀㈀䔀䔀䔀䌀䌀㔀㈀㄀䘀㔀　㐀䈀䔀㈀㌀㜀䌀㘀㈀㐀䐀㠀㌀㜀䘀㈀䐀㜀㄀䘀㜀㠀䘀䈀䈀㤀䌀㔀㜀䘀㘀㔀䐀㌀㔀㜀䔀䈀　䌀䄀㔀䔀㜀㌀㐀㤀㜀䐀㘀䔀䘀䘀㜀䄀㈀㄀䄀㘀䌀㤀䌀䐀䐀䔀㌀　㌀㠀䈀㄀㜀䄀䔀㠀㤀䄀㄀㄀䈀㜀㐀䔀䄀䈀㐀㤀　㘀䘀㤀䌀㌀䌀㤀㌀䘀㤀㠀䌀䐀㄀䔀㜀䈀㐀㌀䈀䈀䌀㠀　䈀㄀㈀䔀䄀㐀㜀㔀㐀　㐀㔀　㔀䘀㠀䔀㔀㘀䄀㄀㈀䘀㜀㠀㌀䄀㌀䈀㔀䌀䈀㠀䈀㤀㄀㐀㜀㜀䔀㐀㘀㈀㔀䘀　䔀䔀䔀䐀㐀㘀㄀䔀㠀䄀　䐀㘀　䄀䘀㈀㜀㘀㄀㐀䔀㄀䔀㘀㈀㈀㘀䌀㈀䘀䌀㈀㐀㔀㐀㈀䈀䔀䄀䐀㜀䄀㜀䈀㄀㤀䔀䔀㈀䄀䌀㌀䄀䈀䌀㄀　㔀䘀䈀㘀䈀㠀䘀䐀㘀㜀㈀䐀䔀㔀䄀㐀䌀㘀䄀㔀䐀䈀㔀㔀䌀㘀䐀䔀䐀㘀䄀䄀䈀㠀䐀㘀㐀䈀㤀䈀㈀䈀㠀䄀䌀㐀㘀䄀䄀㤀　㠀㔀㜀䘀䐀㠀䄀㌀　㜀　䔀䄀䄀䔀䄀䈀䌀㘀䄀䄀䔀䈀䄀䌀䌀䌀㘀㄀㘀㌀㈀䘀㐀　䐀䔀㈀㠀㈀㠀㘀㘀㘀㌀㠀䈀䄀㐀䔀䄀㌀䌀䈀㌀㐀䘀　㤀㘀㄀㜀䐀㈀䌀䌀㌀㔀㐀䄀䐀䐀䌀㘀㈀䐀　㔀　㄀䄀䌀䔀　䐀㠀㐀䌀㔀㈀䈀㘀㘀　㠀㔀䌀㘀㈀䔀㘀䐀䌀㐀㔀　䐀㈀㤀䔀䘀㈀㌀䄀㈀䔀䌀䌀㐀䌀䐀㤀㘀䌀䄀㜀㌀䈀䄀㜀䔀㤀　㌀㔀䌀㠀䄀㐀㤀㔀㔀㘀㐀䌀㘀㄀䘀㜀㔀䄀䔀㌀䘀䐀䌀㐀㜀䌀䐀䄀㤀㤀㠀䈀㜀䐀䐀㔀㌀㌀䐀㜀㈀䔀㘀㘀䔀㘀㜀䔀䘀㤀䔀　䐀䈀㔀㄀㔀䄀㔀㤀䈀䔀䄀㜀㘀䄀䔀　䘀䈀䄀㠀䄀䄀䌀㠀䄀㠀㔀䐀㜀㌀䘀㔀䌀䐀㘀㔀㌀㘀㔀㈀䐀　㘀䐀㌀䐀䔀䄀㐀㤀㠀䘀䄀䔀䄀䔀㜀㌀㜀㤀㜀䄀䔀䌀㈀䘀䘀㘀䈀䘀䈀㐀䐀㈀㌀㌀㔀䈀䄀㠀㈀䐀䄀䈀䌀㘀㌀　㔀㤀㜀㤀㐀䐀㔀䌀㐀㌀㜀㈀㤀　㘀㤀㜀䔀䌀㜀䐀　䄀䔀䌀㐀䐀㔀　㌀䐀䐀䄀䔀䈀䄀㤀㈀䘀䌀㠀䌀䈀䈀㌀䔀㜀㘀㘀䔀㜀䔀㘀㘀㘀㤀䈀䈀㌀㐀䈀㜀㌀㜀㌀㜀㔀㌀㘀䔀䌀䈀　㌀㠀㌀㠀㠀㜀　㌀㌀㔀䐀㐀㤀㜀㐀䄀㄀㤀　㠀㈀㌀　䈀㔀䌀㔀㔀㤀　㤀䐀㔀䈀㘀䄀㌀㘀㤀㤀㄀㠀㈀㠀䄀㔀䄀㔀㜀㔀䈀㤀㜀㤀㐀㐀㔀㜀㤀㜀䔀㘀　㔀䘀㌀㈀䌀㜀㔀䌀㈀䐀㐀䌀㈀㈀㈀㠀㜀㤀㔀䔀㈀　䘀㠀䐀䘀㔀㜀㐀㘀䈀㌀㌀㤀䐀　䌀㐀䄀㤀䔀㔀㄀䌀㈀㈀㤀㜀㌀䄀㠀㌀䌀䈀㘀㤀䘀㄀㤀䘀　㠀㘀䐀㤀㘀　㔀㤀㤀㤀㈀㔀㈀㜀㜀䐀䐀䔀㔀㔀㤀㘀㜀㜀㠀㈀㄀㌀　㈀㠀㜀　㈀䄀䐀䐀㘀䔀㔀䌀䈀䘀㌀㈀䔀㠀㤀㔀䔀䐀䄀㄀䌀㜀㘀㌀䘀㤀㔀䘀䌀䔀䄀㤀㜀䐀䌀䘀䔀㘀㔀䌀㘀䔀㔀䌀㐀䈀㄀㈀䌀䔀㜀䔀㠀䌀㘀䄀䐀䌀䈀㤀䌀㔀㔀䔀䔀㄀䄀䘀㌀䄀　䘀㜀㄀䔀㈀㄀㘀㘀㔀䄀䐀㄀㔀䌀㔀㤀㜀㤀䈀㤀䈀䈀㜀㘀䔀㜀㜀　㔀㜀㠀㄀㤀　㄀㜀䔀䌀㐀㤀䘀䔀䔀䔀䌀㌀䐀䔀㄀㄀䈀㌀䄀㠀㔀㔀㜀㄀䌀㤀㌀㔀䐀䌀㐀㌀䈀䌀䄀　䐀㤀㔀　䔀㤀㔀䌀䄀䐀䔀㘀䈀㠀䐀䘀䈀　䘀䐀䌀䔀䄀㜀　㐀　㜀䘀㠀㐀䘀㌀㌀㌀䄀䔀㐀䔀㤀㠀䄀㌀㤀䈀　㘀㌀㐀㔀䄀䐀㐀䐀㔀䌀㘀䔀䈀㌀㔀䄀䔀䘀㌀㜀䔀㈀䐀䐀㐀㘀㌀䌀　㈀㈀䈀㌀㄀㈀㐀㤀䄀㐀㔀㈀㈀㜀䄀㐀㐀㐀㄀㄀㐀㜀㌀䐀㘀㈀　㔀䈀㜀㌀䘀㌀　䄀㤀䈀䘀㐀䔀㘀䈀㘀㘀㘀　䄀㠀㔀㠀䐀䘀䔀㤀䘀㤀　㐀㘀䐀䔀䈀㠀䈀㈀㜀㐀㜀㤀㤀䐀㄀㔀㔀䈀䄀䐀㠀䔀㔀㈀㐀㜀㈀㄀㄀䐀㐀䈀䈀䔀䈀㤀㔀㈀㔀䘀㐀䄀　㄀㈀㤀㤀㐀䔀㌀䐀㤀䈀㈀㐀㘀㄀䄀䘀䘀䔀㤀㘀䘀䌀䐀㠀䌀㐀㠀䈀䈀㔀䐀㌀㠀㐀䄀䐀㌀㈀㌀䐀　㘀㘀㘀㠀㐀㔀䐀㌀䄀㐀䈀䌀䔀㐀㘀　䈀䄀䈀㌀䈀䘀䌀䄀㐀䄀㐀䔀䐀㤀㔀䔀䌀㄀㔀　㔀㌀㠀　䄀㌀㌀䘀䐀䘀㌀䄀㜀　䈀　㜀　䔀䘀䈀㘀䌀䄀䌀䔀㔀㔀䄀㐀䐀䄀㤀㔀㜀䈀㘀㤀䔀㜀䘀㘀䄀㌀䘀㘀䌀㐀䐀䄀䐀㠀㐀㌀㔀㌀㈀䘀䈀䘀㘀䐀㐀㤀䈀䔀㘀㘀㄀㤀䔀䌀䔀䈀㄀䘀䌀䔀㔀䈀㌀㤀䐀䌀䈀䄀䘀㔀䐀䄀䔀䄀䄀䐀䈀䈀㐀䄀䐀㜀　䔀䄀䐀　䄀䐀䘀䘀㜀䐀䄀䘀䈀㌀㘀㜀䌀䘀䈀䔀㔀㌀䈀㠀䌀䄀㔀　䐀㈀䈀㘀　㤀㔀䄀䔀䌀㤀䈀㜀䔀㐀䄀䘀㈀㌀㘀㌀㠀㜀䐀䈀䄀䘀㄀㠀㜀㄀䘀䘀䘀㔀㈀㌀㔀㤀㔀䔀㠀䘀䄀䈀㌀䄀䄀㜀㜀㠀㔀㤀㤀㄀㈀㤀䈀㜀㈀䄀䌀䘀㜀㤀㘀㈀㘀䘀䌀㌀㠀䔀䄀㄀䘀㘀䘀䌀䔀䄀䔀䘀㌀䐀　㜀㘀㠀㔀㔀䌀㄀　㠀䘀㔀　䔀㔀䈀㔀㄀䐀㠀㌀䐀䄀㘀㤀㜀　㐀㈀䌀䄀㠀䔀䐀㔀㄀䌀㠀䄀䈀㐀㠀䄀㌀㔀㌀㘀㌀䄀䄀㈀䌀㐀䘀䄀䐀䈀䘀㌀　　䘀䄀㌀䐀㈀㠀䈀䄀㌀　䈀㈀䘀㠀䌀䈀㈀䈀㜀㐀䘀㐀䄀㌀䈀㘀䔀䄀䘀㐀㤀㜀䔀㠀䐀䘀䘀䌀㜀䔀㐀䐀㜀䘀㤀㐀㌀㘀䘀䈀䌀㜀㄀㘀㘀㄀㘀㌀㠀㄀䐀㠀㔀㘀䌀㜀㤀㄀㤀㜀　䄀䄀㐀　㈀䔀㐀䘀㐀䔀㠀䔀䐀䐀㘀䌀㜀㘀䌀　㈀　㔀㤀䔀㄀䄀䄀䔀　㜀　㠀㔀䄀㔀㠀㈀䄀䈀㄀　䔀㤀䐀䌀䄀㈀㔀㠀㘀䘀䌀㄀㜀㈀㜀㘀㘀㘀㌀㤀䔀㔀㤀㐀㜀㐀㄀䈀㈀䔀㈀㜀䈀㔀㤀䌀㘀㔀㜀㜀㔀㄀䔀㔀㄀㔀㤀㠀㐀㘀㔀㤀㤀䘀䐀㤀㤀䈀㠀䔀㘀㈀䌀㈀　䈀䘀䄀㐀㤀㜀䘀㘀䐀㘀䈀㐀䐀䄀㄀䄀　㔀㈀㘀㄀㈀㈀䔀㘀㔀㜀㄀㐀㄀㜀㘀䘀䈀䌀㈀䌀䈀㘀㜀㄀䘀䘀㤀㜀㈀㌀㤀㜀㤀㠀䘀㐀㔀㤀㤀　䈀䄀䔀䘀㘀䐀䐀䐀㤀䔀䈀䈀㘀㘀㘀㌀㜀㘀㘀㤀㘀㔀䌀㄀䈀㈀䔀䐀㄀䔀㈀䔀䈀㘀䘀　䘀㔀䔀　㠀䐀㌀䈀䐀䄀㔀㜀㤀㐀䈀㠀㔀㘀㘀㐀䐀㜀㘀䔀　䔀䄀䌀㜀㐀䐀䐀䈀㤀㠀䐀㘀䔀㄀㜀㠀㄀䌀㠀䈀㠀㄀㄀㘀㐀䈀㐀㐀　㔀䌀䈀㠀　䐀㜀䄀㤀䐀䐀㘀䄀　䐀㔀䐀䈀㜀㔀䐀䄀㔀䌀㤀䐀㔀㘀䄀㜀䔀䈀䐀㐀㘀㈀䄀䐀㐀㔀㔀　㘀䈀䌀　㈀䈀䐀㐀㜀㘀䘀䄀㐀䔀㄀㜀㔀㄀䈀㐀㜀䌀　㄀㔀㘀㐀䈀㄀䄀㐀㐀㘀　　㔀㠀㔀䈀㐀㜀䄀㠀䐀㔀䄀　㜀䈀㈀㜀䘀㔀㌀䐀㐀䔀䄀䐀㠀䔀㠀㐀㈀　㌀　㈀㄀㘀㜀䘀䄀㌀㘀䔀㔀㠀　䈀䌀㄀㠀㈀䔀㠀䔀㘀㄀䄀㌀㌀䘀䄀䐀䔀䌀䐀㈀䄀　㠀　㌀䈀䄀㐀㐀㘀㈀䔀䈀㈀㌀䄀㔀㐀㈀㄀㤀㈀㘀㌀㄀䘀䐀㜀㄀㄀　㠀㘀㐀㜀㘀䔀㠀䈀㐀䄀㘀䈀䌀㠀㌀㘀㌀䔀㠀䘀㄀䈀㤀㈀䔀䐀䌀㤀䐀㌀䌀㤀　䔀䐀䌀䘀䌀㤀㈀㌀㄀䐀䈀　㠀㠀　㐀㜀䐀㠀㜀䄀㠀㠀㘀䈀㌀䄀㜀䐀　㐀䘀㐀䘀㤀䈀䔀䈀䌀㈀䄀䌀㈀䘀㐀䘀䘀䈀㤀㔀㜀䄀䘀㘀㜀䌀㠀䐀䔀䔀䘀㄀㤀䐀䘀㔀䄀㌀㐀㔀㄀㜀㐀㜀㜀㄀㄀㌀䘀㤀㈀㄀䘀䌀䔀䈀䘀㈀㜀㤀䘀䐀䘀䄀㔀㌀䐀䄀䔀䔀㔀㌀㘀㠀䄀䈀㠀㄀㌀䔀㌀㈀䘀㈀㌀㜀䌀　䘀䌀㈀㤀㌀　㠀㘀䘀㈀䌀䌀㄀㐀䐀㈀㔀䐀㠀㔀䔀㠀㈀㐀䈀㈀䄀㘀䌀　㠀㄀㔀㤀㐀䐀䈀䄀㐀㄀㜀㄀㜀㄀㐀㜀㘀㤀䄀䘀㄀㔀䄀㌀㌀䄀䔀㌀㈀㘀㌀䈀㌀䌀䔀䄀㘀䐀㔀䔀䄀㠀㔀㐀㈀㔀䈀㠀㄀䐀䔀㔀㘀㤀䘀䐀㔀　㈀䐀㤀㤀㄀㄀㐀䈀㠀　䄀䈀㠀　㈀㜀㌀㠀㤀䌀　㘀䈀䌀䈀䈀㈀　䄀䄀㠀㤀㘀㐀㠀䐀㄀㔀㈀㤀䄀　㈀䈀䌀㌀䄀　䄀䄀䔀䈀䌀㠀㘀㐀䔀㜀䌀䄀㤀㘀㌀㤀䈀䔀㄀㔀　䄀㄀䔀㔀㐀䌀　㠀㜀䘀㘀䌀㌀䌀㌀㠀㜀㘀㄀㤀䄀䌀㤀㠀䐀㠀㔀䈀㄀䄀䌀㄀㤀䈀䐀䐀㐀䌀㘀䈀䄀䄀䈀㄀㜀䈀㄀㔀䘀䈀㤀㤀㔀䌀㄀　㤀䔀㌀㐀㤀㤀㜀㠀㠀㄀䌀䘀㌀㄀㜀䌀㈀䈀䘀㤀㐀䔀䘀㈀㘀㔀㘀䌀㠀䈀㔀㠀㠀䄀䐀㐀㄀䌀䌀䔀㌀㈀㄀㤀㔀㔀䌀㜀㜀㄀䐀㤀㤀䐀㠀㈀䌀㤀䄀㐀㠀㜀䈀㔀㔀㌀㤀㄀㈀㔀㠀㈀㠀䈀㤀㌀㈀㜀䈀㤀㈀㌀㐀䐀㘀䈀㈀䌀䄀㘀䄀䔀䘀䄀　㔀㤀㠀䔀㘀㈀䐀㜀䌀㌀㠀㜀　㠀㌀䐀䐀䈀㈀䄀䔀㘀㔀䄀䐀㤀㤀䄀䈀㔀䘀䘀㠀㘀㜀䘀㌀䐀䄀㤀㘀㜀㔀㄀㘀䘀䈀　䐀　㌀㤀䌀㈀㠀䌀䐀䈀㈀㐀㐀䈀　䔀䄀㜀䐀㠀　㠀䘀　㠀㈀䈀䌀㘀㐀䄀䈀㘀䐀䈀䐀㈀㐀䔀㜀㜀㔀䈀㘀䄀䐀㐀䘀㐀㈀㤀㘀䄀㤀䔀䌀㌀　㈀㜀䐀䈀㄀㈀㤀䌀䔀　㔀䈀㜀䄀㘀㔀䈀䘀㤀䈀　　㘀䄀㤀㔀㔀㄀䌀㤀䘀㤀䄀䈀㠀㌀㄀㐀㌀㔀㈀㄀䐀㔀䘀㔀㤀䈀㐀㄀㠀㈀䔀㌀㐀㈀䘀䌀　䄀㄀䌀㠀㠀䌀㤀㜀䐀䄀㄀䔀㠀㤀㤀䘀㐀㤀㜀㘀䔀㈀　䔀㈀䌀㘀㈀　䔀䈀㜀㠀㄀䐀㔀㔀䔀䔀㔀㠀䔀㈀㔀㐀㜀䘀　㐀㌀　䈀䈀䈀㤀㌀䔀㔀㜀㐀䄀䐀䌀䔀䔀㘀㠀㜀㘀䄀㠀㄀䈀㌀㄀䈀䔀䔀㘀　䘀䘀㐀㜀䔀䔀㈀䘀㜀䘀䐀䌀㠀　䘀㈀㌀䐀㌀䄀㔀㠀㔀㔀㘀䈀㌀　䔀㜀䌀㄀㔀㠀㜀㠀㤀㈀㜀䘀　㐀䌀㈀䄀䐀　㘀䐀㜀㌀㐀䌀㄀㌀㈀㜀䔀㤀㔀㔀䌀㘀䔀㐀㜀䄀䘀㔀䌀䄀㐀㤀䌀䘀㤀㈀㐀　㔀㌀䘀䌀㤀䔀䐀䔀㔀㜀㔀䘀䌀　㄀䘀䔀㔀㔀䌀㄀㈀㤀䈀䌀䄀㐀㔀䄀䄀㌀䈀䄀㤀䄀㤀㔀䄀䘀䄀㤀䘀䘀㐀㔀䘀㌀䈀㈀䈀㠀㐀䐀㜀䌀㐀㘀㜀䈀䈀䈀䄀䔀㐀㔀㄀䘀䐀㔀㌀䘀㤀㔀㔀㔀㤀䐀䘀㔀　㌀䌀㌀䔀䈀㠀㘀䐀㜀㠀䐀䔀㌀㐀䈀㠀䈀㘀㤀䈀㜀䔀㤀㜀㔀䘀㌀㐀䐀䔀㘀㘀㐀䈀㘀㤀　㜀䐀㌀　㈀㜀㤀㘀䘀㌀㐀䔀㘀䔀㄀䈀㈀䈀㜀㌀㜀㤀　㌀㜀㤀䌀䘀䌀㌀㠀㈀䘀䈀䔀䘀　䄀㔀䄀　䄀㄀䔀㈀䐀㄀䄀㈀䌀䘀䄀䈀㜀㘀㔀䐀䈀㤀㘀㜀㌀㔀㘀㌀㌀㤀㐀㤀㜀䘀䔀䄀㜀㤀㔀㘀㈀㤀㐀㈀䄀㘀㔀㤀㤀㤀㈀㈀㤀㤀㤀㤀㈀㈀㤀㤀䘀䄀　㔀䌀䘀㈀㈀㜀㈀㤀䌀㌀㤀㤀㤀㈀㈀㤀㜀䘀㠀㘀䔀㔀㌀㌀䌀㔀䈀㜀㄀㔀㌀䘀㤀㠀㈀㤀㤀㤀㤀㈀㈀㤀㤀㤀㤀㈀㈀㤀㤀㤀㤀㈀㈀㤀㤀㤀㤀㈀㈀㤀㤀㤀㤀㈀㈀㤀㤀㤀㤀㈀㈀㤀㤀䘀䄀㐀㤀㐀㜀䌀㈀㌀㔀㌀䘀䔀㘀䌀䌀䈀㄀㌀㤀㤀㤀㈀㈀㤀㤀㤀䘀㈀㘀㤀㐀䄀䄀㤀䄀㜀䘀㐀䔀㄀䐀㈀䘀㜀䌀㤀㐀䔀䘀㈀㄀　㌀㤀㐀㤀㐀䔀䐀䄀　㘀㘀䌀㠀䘀䈀㄀䘀㈀㄀䘀㈀䈀䘀㘀䄀䔀䈀㠀䄀䘀䌀䌀䌀　㐀䄀㔀䔀㔀㤀㜀㄀㔀㤀㐀㔀䐀㤀㔀䐀䔀㔀䄀㘀䘀㈀䌀䘀㤀㐀㌀䘀㔀㜀䌀㄀㔀㜀䄀䌀䄀䈀䘀㠀㘀䄀䌀㔀㘀䘀㈀䈀㄀㘀㘀㠀䈀㄀㌀䈀䔀䌀䌀㜀䔀䐀䈀䘀㜀㈀㜀㠀㄀䌀䌀㜀㈀䈀㔀㜀㔀㜀㌀䔀㔀䔀䐀㔀㔀䈀㄀㔀䄀䘀䘀䄀㜀䔀㌀㔀䄀㤀䘀䔀　㘀㤀㐀㜀㜀䘀䘀䄀䈀㐀䈀㠀䐀㈀䔀㔀㌀㌀㈀㈀㔀㔀㌀㌀㈀㈀㔀㔀㌀㌀㈀㈀㔀㔀㌀䘀䔀䘀䘀㈀㤀　㠀䄀㄀　㄀䘀䔀㐀䐀㐀㐀㜀㜀䄀　䐀　㘀䐀㌀㘀䌀䈀䐀㠀㔀㘀㘀㈀㐀䄀䐀㌀㌀㜀䐀䌀㈀䐀㤀㌀㘀㤀　䔀㠀㤀䐀䌀䘀䐀㌀㈀䌀䐀䄀㌀　䐀䐀䌀㌀㔀㌀㈀㈀䐀䄀　㔀䌀䔀䔀䄀㠀㐀䌀䄀䈀㔀　㈀㄀䘀㜀䈀㐀㐀䌀䄀䈀㠀㄀㜀䔀㔀㤀䄀㘀㌀㔀㈀㠀㤀㠀䔀㈀㈀㌀㈀㈀㄀㜀䘀㜀㤀㄀㐀䌀㘀䈀䐀㄀䄀䐀㈀䄀㤀䐀㐀䌀㄀䈀㠀䌀㠀㈀䔀䄀㤀㠀䈀㈀㤀䈀㄀㤀㄀䈀㜀㈀㐀䔀䌀㠀㌀㐀㐀㘀䄀䄀䐀䌀　㜀㘀㔀㤀䄀㐀㌀㐀㈀䔀䔀䔀䘀㘀㐀㤀䄀㐀㜀䄀㔀䈀㤀㌀䘀㤀㔀㘀㤀　㄀䔀㤀㜀㈀㔀䘀㤀㌀㘀㤀㄀㔀䌀䄀䌀䄀㜀䐀㔀䘀䄀㘀䐀㔀㈀㠀㈀䈀　䘀䌀䈀䈀㐀　㘀㌀㔀䄀㐀䘀㠀㠀㠀䄀㠀㌀　䔀㜀　䈀㌀㈀䄀䐀㐀㔀䈀䔀㌀䌀㠀㌀㐀䌀㄀䈀㌀㐀㔀䌀㤀䔀㄀䘀㌀㠀㘀㌀㠀㄀㠀㜀䈀䔀㠀䌀䐀㘀㤀䐀㌀㈀㈀䐀䄀　㘀㔀䐀㘀㐀㄀㐀㘀䄀䈀䄀　㔀䔀㘀㜀䐀䐀㈀䘀䐀㌀　㈀䌀䄀䈀㜀㐀㘀㄀㠀䄀䐀㠀㘀㜀䄀䈀㔀䘀㔀䄀㠀㐀䌀　䈀㈀㠀䐀䈀㜀䄀㤀　䐀㄀㄀䄀㠀䄀㤀䈀䘀㔀㠀䈀㌀㈀　䐀㔀㠀㔀㤀䔀䘀㘀㘀䈀㐀　㠀䘀㔀㔀㤀䐀㘀㘀䘀䌀䈀䈀㐀㠀　　䄀䄀䐀㔀䘀㘀㔀䈀㐀㄀㘀㤀㐀㈀䌀䔀㄀䐀䔀㤀㈀㘀㤀　㤀㜀䘀㠀㤀㤀㘀䘀　㤀㜀㘀㠀　㤀㜀䘀㠀㤀㤀㘀䘀　㤀㜀㘀㠀　㤀㜀䘀㠀㤀㤀㘀䘀　㤀㜀㘀㠀　䐀㄀䄀䈀㌀㌀䔀㈀䈀䐀㌀㄀㈀䘀䔀㄀㈀㈀䐀䔀㄀㈀䘀䐀㄀　㘀㘀㌀㘀䔀㜀㄀㌀㤀䄀㌀䔀㤀䘀䘀㄀㤀㘀㔀䄀䌀㘀㤀㤀㜀㘀㤀䐀　䈀䐀㘀㘀㌀㔀䄀㌀䘀㔀㔀　㤀䘀㔀䐀㜀㌀䈀㤀㐀䌀　䈀䄀㠀䄀㐀㐀㘀䌀㈀㈀䄀㠀䈀䌀䄀㔀㘀㜀㌀㤀㔀㐀䌀㠀㌀㌀䌀㌀㔀䐀㌀㠀䌀㌀㘀㐀㈀䈀䐀䈀㤀䔀㘀㔀䔀㤀㤀㄀㘀㤀　䈀㔀䔀㘀　㠀䄀㌀䌀䐀㠀䌀䌀䘀㔀㔀㌀㈀㐀䐀䘀㤀㐀㠀䔀䐀㜀㌀㈀㠀㠀㘀㌀㔀䐀䘀㤀㘀㘀㤀䌀　䈀　㐀㘀䌀㈀㈀㐀㤀㜀䌀㤀䘀㌀䈀䌀㐀䌀㔀㌀㜀㤀㈀㐀㄀䐀䘀㌀䄀　㌀䔀䈀㜀䔀㘀㌀㜀㌀㈀㈀䐀㈀　㔀㈀䘀㌀㔀㌀㐀㘀䔀㜀䐀㌀䘀㘀㐀䔀㐀䔀䄀㘀㘀㤀䘀䈀㌀䘀㌀　䈀䄀㠀㠀䈀㘀㜀㜀㔀䄀㘀㔀㄀䄀䐀䄀㌀䈀䌀䐀㠀䌀㔀䔀㐀䔀㘀䐀䔀䄀㔀䌀㈀䘀䐀㌀㘀　㔀㌀䄀㜀㠀䈀䐀㄀䌀㔀䌀䌀䄀㘀㔀䘀㤀㐀㘀㤀㘀䄀㔀㌀䌀㤀㜀㘀䄀㔀䄀䌀䈀䐀㔀䘀䄀㘀㘀㤀䘀䈀　䔀㐀㘀㤀㜀㔀㌀㤀䈀㌀䄀㈀㜀㘀㔀㄀䄀㘀䌀䔀䄀䈀䌀㠀䌀䐀㄀䐀㔀㄀㐀㄀䘀䔀㜀䈀㔀㌀㈀　䐀䘀㠀㌀㠀㄀㌀㠀䌀䄀䔀㘀㔀㜀䌀㠀䔀䌀㤀㌀㐀䔀㔀㜀㌀　䈀䄀㔀䌀㔀㌀㐀䘀䌀䌀㔀㌀㐀䘀䌀䌀㔀㌀㐀䈀䐀䌀㐀㌀㐀䈀䐀䈀㈀䐀㈀䐀䄀㘀㜀䄀㔀䈀㔀䌀䘀㐀䄀䈀㌀㐀䈀㤀㘀㘀㈀㤀㜀䄀䘀㈀　㠀㈀㄀䄀㤀㄀　䈀䘀䔀㌀㔀　㄀㌀㔀㠀㠀㈀㘀㔀㄀　㠀䈀䔀㜀䈀㔀　㄀㐀㐀㔀䔀　㔀䘀　㈀䌀䐀䄀㄀㘀㤀㔀㘀䐀㌀　㘀㐀㜀㌀㄀䄀　䔀㤀㘀㜀　　䔀䄀䌀㌀䄀䌀㐀㔀㄀䐀㤀䌀䘀㄀䄀㈀㈀㤀㈀㠀　㐀䘀㤀䄀㄀㘀䔀㄀㜀㔀䌀㤀䘀㐀　㜀㄀㜀㘀㄀㐀㠀㈀䔀䘀㄀　䈀㐀䐀䔀　㜀㤀䘀㐀㄀䐀㘀䐀㈀　　䄀㔀㄀㌀㠀䔀䌀㘀䄀　㌀㘀㠀㐀㘀㘀䄀㄀䄀㘀㠀䘀㜀㄀㠀䘀㐀　䈀䘀㐀䄀㌀䘀䐀䐀䌀　㜀䐀　䔀㜀㠀䌀䘀　　㄀䘀　㈀㜀䌀䄀㌀䌀　㌀㌀㠀䌀䌀㘀㠀㄀㄀䔀　㜀㜀䄀㄀䄀䌀䔀䌀㔀㔀㈀䘀䐀㤀　㤀㐀䘀㐀㈀䔀䔀㐀　㘀䌀䄀㤀䔀㌀䄀㘀䄀㐀㘀㐀䔀㈀㘀㐀㌀　　㌀㠀㐀䌀㐀㌀㔀䈀　㈀䘀䐀　㘀䄀　㄀䘀䌀䄀㘀㌀㄀䌀䔀䐀㤀㄀䐀䈀㘀䔀㠀㈀䄀㌀㐀㤀䄀㠀䄀㔀㘀㜀㘀㜀㐀　䌀㘀㜀㠀㐀䄀㈀㜀㠀䄀㐀㌀㤀㠀䔀㤀㌀㄀㜀㔀㔀㄀㜀㤀㈀㘀㄀㠀㄀㘀　㐀䈀㔀䌀㈀䘀㄀㄀㠀㤀䌀䄀㄀䈀㔀　㄀㠀㘀䌀㐀㔀㈀㄀䐀㈀㔀㌀䔀㔀㄀㔀㤀㔀㌀䌀㈀㜀䄀㤀㤀㠀㄀䈀㌀䔀㌀㐀䌀㔀䘀㜀䄀㌀㐀　㄀䈀䌀㘀㜀䔀㄀䐀䄀㄀㠀䄀䈀㤀㤀㠀㄀㔀㘀㐀㄀㠀㘀㄀䌀㠀㄀㜀䄀䌀㔀㄀䔀㔀䐀㈀　㄀㌀㐀㔀㈀㜀䌀䌀䄀䔀㠀䈀㌀　㘀䌀䐀㜀䈀㄀䔀䈀㐀㌀䄀䌀㐀㔀　㠀䔀䐀㠀㔀㌀䔀㈀㤀䐀㈀㐀㄀䘀㘀㐀㤀㘀㐀㠀㤀㤀㐀䈀㘀㠀㐀䐀㔀䌀㜀䄀㄀㠀㘀䔀㈀㌀㜀㤀䐀䈀㈀䔀　䄀㈀㄀䔀䘀㐀㜀䌀　㈀䄀㐀　㠀䌀㌀㤀㔀㜀㄀㐀　䌀㄀䌀䈀㔀䄀㐀䄀㄀䄀㈀㤀㔀䄀　㐀㤀㠀㐀䌀䐀㐀　㌀㠀㈀䄀䌀㐀㜀㈀䄀䘀㌀㄀䔀䄀㘀䐀䐀䌀㐀䄀㜀䘀㈀㤀䔀㜀㌀㔀䈀䄀䔀㔀䐀䐀㈀㘀䈀㈀䈀㤀䌀㤀㤀㘀㈀䈀䄀㔀㐀㐀㈀䌀䈀㌀　㤀㌀㌀䐀㤀䄀㐀㈀䄀䌀　䄀㘀䐀㘀㔀㈀㠀䌀㔀㔀㌀㤀䄀㌀㐀　㌀㐀㜀㄀㜀䘀㠀䘀㄀㈀㈀㠀䘀䐀䄀㄀㐀㠀䘀㄀䔀㤀　䔀䔀䈀䘀䐀㘀䐀㜀㜀㔀䔀䌀㔀䘀䌀㘀䐀䘀䘀䘀䈀䈀䘀㠀䘀䈀䘀㤀㜀䔀䈀　㘀㠀䄀㔀㜀㘀䔀㘀　㤀䈀㌀䐀　㌀㘀　㈀㜀㠀㔀　㌀䈀㐀䔀㐀　　㤀䌀䈀㌀䄀䐀㔀㌀㈀䔀䌀䄀㌀㈀　㐀䘀㤀㠀䘀㔀䐀　䌀䈀䌀䔀㐀䌀㌀㈀䌀䘀　䈀　　㘀䘀㘀䄀㤀䈀㜀䔀䔀㘀㐀㤀㌀㄀㜀㘀㈀㘀䌀䌀䔀㈀㘀㠀　　㌀䔀㄀㜀㜀㔀䄀㜀㤀㠀㌀㔀䄀　㌀㔀㘀㠀㌀㔀㔀㠀䘀㐀㜀䌀㔀䘀䄀㜀㜀䄀䌀䘀㠀　㈀䌀䐀㌀㐀䌀㐀䈀㐀㤀䐀䘀　㤀㈀㘀㘀䘀㠀㈀䐀㤀㘀䘀㠀㐀㘀㄀㐀䌀㔀㠀㐀㐀䌀䔀㌀㄀㐀䌀㈀㔀　䌀㄀㈀㈀㤀䈀䈀㈀䄀䄀䐀㘀㤀㔀䐀㤀㐀㜀㤀㄀㜀㐀㔀㤀䘀䌀䄀㄀㐀㘀㈀䘀㈀　㔀㔀㤀䈀䈀㘀㤀䐀㤀䘀䔀㐀䔀㄀㘀䔀䈀㄀㄀䐀㘀䌀䘀㌀㐀㤀㌀㔀䄀䈀䄀㜀㘀㔀䌀䔀㘀㄀㈀㤀㈀㠀䘀　㌀㠀䌀䘀㜀㌀㐀䐀㌀㘀　㈀䘀䈀㐀㐀䄀䈀　㜀㌀䘀㐀䄀䄀㌀㄀㈀㘀㠀㜀㘀㈀䌀䘀㜀㌀㘀䐀㤀㌀㤀　䄀䘀㤀　㌀䌀㈀㔀㜀㘀㔀䔀䌀䐀㐀㐀㐀䄀　㜀㘀㜀䔀䄀㜀㠀䐀㄀㌀㜀䌀䔀㐀㜀㘀㜀㤀䄀㄀䐀　㜀䔀㄀㤀䄀㜀㄀㌀㠀㜀㘀䌀䄀㜀䔀㐀㈀䔀㌀㔀㄀䔀䄀䐀㜀㤀㤀䔀䄀䔀㜀㔀䌀　䐀㈀㐀㠀䈀䌀䐀㌀㈀㤀䌀䌀㘀㔀㤀䔀㐀㔀䌀　㠀䈀㌀㔀㤀㔀㤀䐀㌀㌀　㠀䈀䄀㤀㈀㤀㄀㘀㌀䐀㐀䄀䄀㐀㤀䘀㠀䈀㌀䐀䈀䐀㘀㘀㠀䄀㔀㄀㤀㔀䐀　䈀䔀㘀䄀㠀㤀䄀䘀㔀䔀㤀㠀䈀䈀㈀㐀䌀㌀䄀㜀䌀㔀㌀㘀㌀䐀㄀㈀㄀㐀䘀䘀㠀䌀㌀㄀䐀䘀㔀㜀䘀䌀㐀䐀䘀㄀䘀䐀　䈀㘀㤀䄀　䘀㐀㜀䔀䈀䔀㔀䌀䔀䈀䐀㈀㜀䌀㠀　㘀䄀㈀㈀䔀㤀㤀㈀㘀　䘀䐀㈀㤀䈀㤀㌀㄀䌀㘀䄀㈀㘀㜀㠀䔀䘀㤀　䘀㜀䐀䐀㌀㔀㐀㠀㐀㘀㔀㠀䌀䌀　㐀㔀㌀㔀㤀㔀㜀䌀㈀䘀䈀　䌀㐀䄀䈀䄀㐀䌀㠀㠀䘀䌀䄀㤀䘀㤀㈀㔀㘀㄀㈀㐀䐀㜀㌀䐀　䈀㐀㤀䌀㠀㤀䄀㠀䈀㐀㠀䄀㌀㔀㄀㔀㌀䔀䈀㐀㈀㔀䌀䐀㜀㜀㄀䘀䔀㜀䄀㌀㔀㈀䐀㘀㠀䔀䌀㠀㤀㘀㔀㤀䔀㐀䄀䔀㐀㐀㐀㠀㔀㠀㐀㘀㌀㤀䌀㘀㜀㈀㘀㌀㤀㠀䌀㔀㜀　㐀㈀䈀㘀㈀䐀㤀䐀䄀䘀㈀㠀䄀㌀䌀㐀　㐀㠀䈀䔀㘀㈀㤀䄀㘀䄀㔀㠀㈀䘀㈀㔀㈀䄀䘀㜀㘀㌀㈀䌀䈀　㐀㄀㠀㄀䐀㤀㐀䘀䐀䔀　䘀䌀㠀䌀㜀㘀㘀䔀㈀㐀㔀㐀䈀㈀䌀䌀㐀䔀䘀㔀㔀䌀㠀䈀䔀䄀䄀㄀㠀㐀㔀㠀㐀㘀䄀㘀㜀䐀䔀䌀㘀㄀㜀㤀㈀䈀䌀㐀䄀䌀㄀䄀㠀　㌀䄀㠀䄀䐀　㈀䔀㘀㠀䄀㄀㤀䌀䄀䈀㤀㜀㜀㤀䔀䔀㌀㠀㈀㜀㐀䈀㔀㘀䌀㤀䐀㄀䈀䈀㤀㠀㈀䐀䔀㈀㈀㤀䌀㐀㄀㐀㘀㤀䘀䔀㘀䘀䌀㘀䄀㄀㐀䘀㤀㠀䘀㜀㠀㤀䘀㔀㄀䌀㄀䔀䐀䐀　䄀　䘀㔀㈀㤀䌀䘀㈀䔀㘀䐀䐀㔀　㈀㜀䐀㤀㐀㤀䘀㄀㤀䄀㄀　㄀䈀㌀㌀䄀㜀䔀㐀䘀㄀㘀㈀䐀㄀䈀䈀㌀䘀㘀䔀㈀䌀㔀㌀䈀䌀䘀㈀䔀㈀䔀㌀㄀㤀䈀㔀㔀䌀㜀䘀㈀䄀㜀㈀䔀㈀㘀㤀㜀㌀　㐀䌀㤀䐀䔀㤀㈀㄀㜀㠀㐀䔀㐀䈀䔀㜀㘀㌀㄀㔀䘀㠀䔀䌀㠀㜀㘀㜀㜀㌀㈀㤀䐀㘀㌀䘀㈀㌀㠀㈀㌀䔀㔀㄀䔀㤀䄀㄀㤀　㈀　䌀㜀䘀䌀㤀䌀䔀㠀䄀㄀䘀㐀䈀㜀䔀㌀㔀㈀䐀㘀㜀㜀　䄀㤀　㜀㌀䄀　䔀㐀㠀䔀㌀㐀䄀㈀㐀䔀㔀㈀㤀　㄀䈀㐀㌀㠀㤀䔀㤀䘀㤀䈀䌀䘀䘀䔀　㐀䈀㘀㐀㠀㈀㄀㄀㐀㘀　䈀䄀㐀㜀䔀㔀㌀㄀㐀㜀䌀㤀㄀䘀㐀㄀㔀㘀㌀㌀　㌀䐀㠀㐀㠀㌀㄀䈀㈀㌀㠀䌀㜀㈀㄀㘀䌀㔀㐀㤀䈀㤀㈀㜀䐀䄀㘀㔀㈀㤀㄀䘀㄀䔀㈀䈀㘀㐀㔀㜀㐀㄀䌀㔀䈀㌀㈀䄀㈀㠀㌀䈀㔀䄀䈀䐀㈀㌀　　䄀䈀㈀㔀㄀㘀㘀㘀䄀㐀㤀㤀䔀㌀㤀㔀䘀䌀㜀㠀䘀䔀㄀䌀㜀䈀㈀㘀䘀㤀㠀㔀䐀䄀㜀䈀㐀䈀䔀㜀　㜀㘀㜀㌀㤀䔀㤀㌀䐀䐀㄀㐀䔀䌀䌀䘀䈀䐀㤀䄀䄀㈀㈀㘀䔀㔀䐀㌀㜀㐀䈀䐀㄀㔀䈀㤀㄀㘀㘀㜀㔀䈀㠀䈀㔀㄀䈀㌀㌀㠀㄀㈀㈀㤀㌀㘀㜀㐀䈀㈀㜀䌀㄀䘀㘀㔀䈀䐀㐀䌀䄀㐀㠀䔀㐀㌀㘀㤀㄀䔀㐀㈀䘀㌀㤀㘀㘀㐀䄀㄀㌀㠀㜀　㔀䈀㄀䌀㘀㄀㈀㔀䄀㤀䌀㜀㤀㠀㈀䌀㈀㄀㜀㤀䄀㐀㤀䄀㐀㤀䐀㤀㌀㈀㌀䐀㤀㜀㐀㠀㌀㘀䄀䌀㤀㜀㈀䐀㄀䔀㘀㜀㔀㄀㌀㈀㤀㔀㤀㈀㐀㄀㠀㤀䔀䈀䄀㔀䈀䔀䘀㐀䌀㤀㔀㄀㐀䐀㄀䘀䔀㄀㈀㔀㈀䐀䐀㌀㐀㜀㤀䄀䄀㔀㌀䔀䈀䐀㠀㠀䌀㐀㈀䌀䌀㌀㜀㄀䔀䘀䄀㜀䈀㐀䄀㌀㌀㈀㄀䄀䐀　䐀㤀㘀　㐀㐀㐀㘀㈀㘀㤀㐀㈀㘀㐀㄀㤀　㜀䐀䐀㈀㌀䔀㄀㜀㜀㄀䐀㤀　䐀㈀䐀䌀㘀䐀㌀䌀㘀㠀䔀䌀㐀䌀㜀䔀㐀㘀㌀㈀㤀䘀㌀　㜀㤀㤀　㘀䌀䄀㠀㠀䈀㜀㜀㘀㐀㤀㄀㘀　䘀　　䌀㜀㈀㠀䌀䈀㌀㠀㄀㜀㤀䔀㔀䘀㐀䈀䘀㌀㌀䘀㘀㔀㤀㐀㔀㤀䌀㐀㐀㜀㄀㤀䌀㤀㄀㘀㌀㄀㐀䄀䌀䘀㈀㤀㐀䈀䄀䘀㠀䄀䈀㌀㔀䌀㈀㄀䐀㤀㘀䄀㐀䌀䐀㘀䘀䈀䌀㈀㘀㌀㘀䔀䔀　㈀㈀㄀㘀㠀䐀䄀㔀䈀㐀㠀䘀㌀㌀㈀䘀㠀䐀㌀　䔀䔀㔀㈀㄀㐀㐀㤀㈀㌀㘀䘀䘀䄀㠀㠀䘀䔀㘀㤀㌀䐀㐀　㄀㤀䐀䘀㌀䄀㤀㄀㠀䘀㤀䐀䔀䐀㐀㌀㄀䐀㜀　㌀㐀　䌀䄀㌀䄀㔀㤀䘀䐀㔀㜀㐀㐀㄀㄀䐀㤀䐀䈀㜀䘀䄀䔀㄀䌀䌀㔀㘀㌀㠀㘀䄀㠀㜀䐀䄀㜀㘀䄀㠀㜀㄀㐀　㠀䈀　㄀䘀㤀䈀䌀㠀㌀㔀㤀㘀䄀㤀㠀㠀䐀㐀㌀㤀䐀䐀　㘀䔀㠀㠀㠀䐀㜀㄀㄀㈀　䘀㌀䘀㜀䌀䘀㘀䌀㈀䘀㄀　㠀䌀䈀㜀㄀㄀䐀㠀㠀䈀　㘀㌀㜀䄀䈀㐀㄀㤀䐀䄀䘀㜀　㈀㈀䘀㜀䄀䄀䐀　䘀㘀䐀㘀㌀㜀䐀䘀㠀㠀　䐀䈀　　㘀䈀䔀㤀㘀㜀䈀䌀㜀䈀䄀　䈀㘀㄀䈀䈀䔀㜀䐀㜀㈀㌀䈀㜀䄀㐀㔀㄀䈀䐀㐀　䌀䌀㄀㌀㄀䄀㔀㌀㜀䈀㈀㈀䌀㈀㠀䘀㔀䐀㜀　䈀㔀㜀㐀㤀䄀䈀㠀㔀㈀䔀㜀㤀㐀䌀㤀㐀㈀㐀㄀䐀㠀㐀㜀䄀㤀㈀䐀㈀㜀　䄀㤀㔀㐀㔀䐀䄀䌀㐀㜀㐀㔀䈀㈀㄀䔀㌀㠀䘀㈀　㌀䘀䘀㐀䔀䘀㤀䄀䌀㄀㜀㜀㠀㜀㜀㌀㄀㜀䔀㔀㐀㜀䔀䐀䄀㜀䘀　㜀䄀㌀㜀䈀㔀㌀㜀㈀㜀㘀䌀㠀㤀㈀㜀䄀㄀㤀㐀㘀㤀㐀㌀㌀䔀㔀䐀㤀　㘀㄀㈀㜀㔀䈀㌀㈀㌀㔀䄀㌀䈀　㐀䐀䘀䘀䐀䐀　㘀䔀㠀　䘀㔀䔀䘀㘀㔀㌀䄀㐀䈀䐀㈀䘀㘀㌀㈀㄀䐀㌀䄀䔀　䈀䌀䄀㐀㠀䈀㠀䘀㐀㤀㐀　㜀䈀䄀䔀㤀㌀㜀㔀㤀㔀䐀䄀㔀㄀㜀䌀䈀㘀䌀䄀㘀㜀䄀㠀㠀䐀䄀㠀㜀䌀䐀䐀㔀　㄀㘀䈀㔀䘀㈀㌀㈀　䌀㌀䄀㤀㤀㌀㐀㠀䈀䘀㠀䈀㔀䌀㄀㜀㜀㌀䘀㐀㠀㐀䔀䘀㤀㘀䘀㠀㐀䈀㌀㠀㌀㘀䌀㠀㐀䔀㠀㠀㌀㈀䈀䐀䈀㤀㤀䄀㘀　㌀　䌀㌀䐀㤀䘀㠀䌀㄀㤀䐀㔀䈀㘀㤀䈀㄀䐀㈀䐀㘀䄀㈀㔀㔀㤀䄀䄀㠀䐀㘀㤀㐀㌀㔀㄀䄀㔀㄀㠀䈀㐀　㌀䐀䐀　㌀䘀䘀㌀㘀䄀㘀䈀　䘀㌀䈀㌀㐀䘀㐀㤀㄀㘀㜀䘀㄀䄀䈀㜀䄀㔀䐀㠀　䐀䈀㌀䘀㌀㠀䈀䄀䐀㈀㐀䘀䐀䈀䌀䘀㈀㘀㜀㄀䈀㐀㌀䄀䔀㠀䘀㄀䐀㐀㤀䐀㘀㘀㠀㘀㌀㐀㜀㠀㌀䌀䌀㔀㘀䘀㐀䄀䌀㔀㌀䈀㘀䄀㔀㤀䘀䔀㤀㜀㄀㘀䔀䄀䘀䌀㌀䌀䌀㄀㌀㜀䐀䄀䌀㤀㔀㤀㜀㘀㤀㌀䌀㤀　䘀㈀㤀　　䔀䔀㘀䈀䐀㤀㈀䘀㐀㠀䄀㜀㜀㐀䄀㜀䐀䘀㐀䄀㔀㐀㤀㈀㈀䘀㔀㐀㜀㘀䐀㤀䈀㈀䔀㠀䈀䔀㈀䐀㔀䔀㐀㘀㌀㘀㈀㐀㐀䔀㈀䄀㈀㤀䌀㄀䘀㤀㈀㈀䐀㜀䐀㌀䔀㈀䔀㄀㐀㜀㔀㈀䘀䌀㌀㠀㐀䌀䄀㌀㔀㤀　䔀䄀䘀㤀㘀㈀㤀䌀䔀䈀䈀䔀㐀㈀㄀䄀㔀䐀㠀䐀㐀䐀㘀㐀㜀　㌀㈀㐀㐀㜀䄀䄀㈀㤀㄀㘀㠀㘀㈀㘀䔀㌀䄀㐀㐀䐀䄀䄀㈀䈀㄀䔀㤀㘀㠀㈀䌀㤀　　㠀㐀㜀㈀㌀㜀㔀䌀㐀㌀䈀㌀㔀㐀㔀䘀䌀䔀㄀㔀䐀㤀㌀㠀㤀㌀㠀䘀㄀㠀㜀䔀㈀䄀㄀䐀㠀䈀䔀㔀　䈀　㠀䔀㄀㠀　䌀㤀䐀䄀㄀䈀㄀㔀㠀㘀㠀㤀㘀䘀㐀㐀䐀㠀㜀㈀㈀㠀㌀䘀㐀㤀䄀䔀䔀䌀　㔀䌀㜀㐀㈀㘀㐀㄀䄀㘀䄀㈀䈀䈀䌀㈀䔀㌀㘀㐀㌀䌀㌀䄀㌀䐀㄀㜀䄀㌀䐀㜀㄀　䌀䄀䐀䔀䔀㔀㈀㘀㜀㘀䘀䄀䐀㔀䔀䌀㈀㐀䘀䔀䌀　䐀㐀䘀㐀㈀㐀䔀㤀　䌀㐀㐀䌀㘀䄀㌀䔀㌀㜀䈀䄀　㜀㘀㔀㌀㜀㐀㌀㈀㐀㈀㌀䄀㘀㜀㠀㈀㜀㄀䐀䄀䐀㌀䔀　㘀㐀㌀㠀㐀䔀䄀㘀䐀㈀䘀㤀㐀䌀㐀㐀㘀㌀䄀㐀㌀㔀㌀䌀㌀㘀㄀㔀㄀䔀　䘀㐀䌀㄀㄀䈀㤀㐀㜀㘀㠀㄀㌀㠀㔀㐀䔀㐀㤀㌀䌀㌀䄀㄀㌀㄀䈀　䘀䌀㄀䐀㜀㐀㐀㘀㈀㌀㘀㄀　　䈀㤀㄀㤀㤀㐀㠀㌀　㄀㐀㈀㌀　㤀䄀䄀㐀㜀䐀㜀㈀　䔀㤀　䔀㠀䘀㠀㜀㈀㈀䘀㄀䐀　㌀䄀㄀㈀　䘀㠀㔀㐀㠀㘀㠀䔀䘀㔀㠀㈀㠀㄀㠀　䌀　㔀䌀㤀㤀㐀㔀㐀㐀䈀㠀㈀䄀㄀䘀㠀㜀㠀㈀䌀㌀䌀㐀䐀㄀㔀㘀㐀㜀䐀　㐀㐀㌀㠀㤀㐀　㜀㠀㈀䄀㔀䔀䔀㜀㠀䐀㠀㔀䄀㄀㈀㌀䔀㠀㈀㄀㐀　㄀㈀䈀㄀㐀　㌀　䈀㐀㌀㜀㄀　䐀䈀㐀㌀䄀㈀㄀㌀㄀㜀㐀㜀㐀㜀䄀㤀㔀䌀㈀䈀㔀䐀䐀㤀㄀䄀㤀䐀　䄀㤀㈀䌀䄀㤀䔀䘀　㜀㠀㈀䌀㐀䄀䔀㔀䄀䄀䐀䄀㄀䄀㠀䄀䌀㔀㘀㤀㄀䘀䌀䐀㜀㔀䄀䔀㈀㘀䐀㘀䄀㈀㤀㘀䈀㘀䔀㠀㄀㤀㐀䌀䘀㄀㘀㈀䐀　䈀㔀䌀㜀　㈀䈀㌀䔀㄀䌀㠀㈀䔀䐀㈀㌀㜀㌀㄀　㄀䘀㈀㤀㄀㔀䄀䔀㈀㠀䘀㠀䔀㠀㔀㈀㌀䄀㐀㌀㜀㌀䌀㌀䔀㄀㤀㤀䐀　䄀䌀㐀㤀䐀䄀㐀㌀䘀㤀　㠀㠀㠀㔀䌀㜀䌀㌀　㄀㌀㈀㄀　㘀　㔀䄀䌀㘀㐀㤀䌀㌀㤀䄀䐀㔀㠀䐀䄀㤀㘀䔀㐀㠀㜀䌀㘀㘀㜀䄀㜀䄀㈀䄀　䌀䘀䄀㐀䐀㐀㐀㈀㌀㠀㤀㌀䄀㌀㈀㄀㈀㤀䐀㈀㄀㜀䈀　㌀㜀㌀㘀㐀　㘀㌀㐀㐀䐀㔀　㐀䌀㘀㤀㌀㔀㐀㤀㐀㐀䌀㤀㜀㠀㈀䌀㄀㐀㐀㠀㠀㐀㤀䌀㈀㐀㄀㠀㠀䔀㐀䘀　㌀䌀䔀㐀䔀㄀㈀㠀㠀　㐀䌀㤀㜀㐀㈀䌀　䌀㘀㜀䌀㜀䄀㄀㐀㤀　㠀䈀䔀　㌀㜀㄀㌀㈀㄀䐀㠀䄀䔀䐀　䐀㈀㜀㄀㈀䌀　㘀䔀㘀䌀㠀䔀䔀㄀䄀㤀䄀　㤀㘀㠀　㄀㌀　　㜀䔀㐀䌀㈀㄀㈀㘀㘀㠀　䘀㐀䔀䘀䄀䌀䐀㔀　㐀䘀㠀㤀㌀㌀㄀䐀㠀䈀　㘀㘀㜀䌀㘀㄀㌀㐀䔀㐀㈀䈀䐀　㔀䄀䔀㜀㔀䐀㈀㘀䈀㤀㐀　䔀㐀　䈀㄀䐀㤀㐀㤀䐀　㈀䌀㐀䐀䈀㈀㔀㤀䔀㠀㌀㐀㄀䌀㄀㤀㤀䘀㤀䄀　㤀㔀㈀䐀㜀㔀㈀䄀㐀㠀䘀㐀㘀䄀㘀䔀㘀㐀㠀㘀㔀䈀㠀㐀䄀䈀㈀㔀䔀㔀䄀㜀㌀䔀　䘀　㜀㄀䐀㈀㐀䄀䌀㘀䄀㘀㜀㠀䌀㘀㐀㈀㜀㄀㠀䄀㄀䈀㌀㔀䐀㐀㘀㈀　㜀䘀㐀䘀㈀㄀㐀䄀䘀㜀㔀　䌀㠀㄀䌀䄀㌀　䘀㐀㤀㈀　㠀䔀䐀䄀㔀㔀㘀㠀䐀㠀㔀䄀㄀䐀㜀㘀　㜀㐀㌀㘀㌀㈀㄀㔀　䐀　㐀㤀㜀䄀㈀㄀㜀㤀　䄀　　㈀㈀㜀　㌀㜀㔀䄀㈀䐀　㄀㔀㜀䌀䌀䔀㈀㐀䄀㘀䌀㄀㔀㤀㠀㌀㈀㄀䄀䄀㈀㘀㘀䐀㌀㌀㄀㤀㤀䄀㤀䄀㔀䔀㠀䄀㈀㠀　㐀㔀　㘀㐀㐀䔀㘀䔀㐀䔀　䐀　㈀　䌀　㄀㤀䘀䌀㤀䘀　㔀㠀㄀㠀㘀㐀䄀䔀㌀㌀㄀㠀䄀㠀㘀䈀㐀䐀㐀㐀䄀㜀䄀㘀䄀㈀䌀䌀　㔀㘀㐀䄀㠀㤀䐀㘀㐀㈀䌀㄀　　㜀㔀㤀䄀㌀㤀㄀㤀㐀㐀㌀㈀䈀㐀㘀䄀㠀㤀䌀㐀䌀㈀㐀䄀㘀䐀㜀䐀㘀䐀㜀㠀㜀㈀㈀㜀㔀䈀㌀䔀㄀㌀䐀䔀㄀䔀㤀㔀　㌀　㄀䌀䄀㠀㠀䈀䌀㘀㜀㘀䐀㔀䐀㌀䄀㌀㜀䄀㘀㠀䈀㤀㐀㌀㜀㘀䘀䐀㈀䄀㌀　㈀䘀㜀㌀㠀䈀㌀㠀㄀㔀㠀䌀䈀㈀䈀㤀㜀　䄀䌀㔀䔀㈀㠀䌀㘀㜀䔀㈀䌀䈀㜀䔀㠀䄀㘀㈀䐀㜀䔀㐀㈀㘀㄀䐀䔀㄀䐀　㔀㤀䐀㈀㠀㌀㐀䄀㄀㜀䐀䄀㄀㈀㤀㠀㠀㌀䘀　㘀䘀㜀䐀㈀㘀㠀䄀㘀㔀　㈀䔀㠀㤀㘀㜀㠀㌀䄀㄀㤀䘀㄀䄀㈀㜀䌀䔀㐀㈀　　䘀㐀　㘀　㠀㐀㈀㜀　䐀㔀䄀䔀㔀㠀　　㤀　　㤀㌀䄀䌀㤀㐀㐀　䌀㘀㈀㄀㌀䈀䌀㘀㜀㜀䌀㌀㈀㄀　䐀䈀　㔀㌀䄀㔀㌀㠀䌀　㄀㈀䈀䈀　㈀㠀㔀䌀㐀䔀䄀㈀㘀㌀㄀　㤀㌀㄀㄀　䄀㐀䄀㠀　䔀㔀㄀㌀䌀㔀䌀䘀㌀䔀䈀㤀㄀㘀㔀㐀䄀　㐀　㌀䌀㄀䔀㠀㔀䌀㠀䄀㄀䘀䔀㄀㄀㠀䌀㠀䔀䌀䘀䔀䌀　㔀㠀䈀　㐀䄀㐀䈀　　䘀㐀䘀　㄀㌀㈀㤀㔀㤀㐀䔀㌀㄀㈀㘀䐀䌀㤀㠀　㤀䌀㔀　㜀䔀㔀㈀䌀㔀㈀㐀　䄀㠀㘀㘀㠀㐀㘀㤀　䔀䌀㜀　䌀㄀㜀㘀㘀㐀㌀㘀㤀䌀㤀㠀䄀㐀䐀㔀㘀㤀䔀䔀䔀㘀㤀㐀䐀䐀㠀䐀㐀䄀䄀䘀㤀䌀㤀䔀　䄀㠀㌀㤀䘀㐀䄀㜀䐀㔀㌀㔀䔀㌀㄀㈀㤀䄀㔀㐀㈀　䘀㈀䌀㠀㠀䄀㠀㠀㘀㐀䔀䈀㈀㌀㜀㄀䄀　䌀㐀䘀䐀　䔀䘀㄀　　㌀㘀㐀㜀䄀　㘀㄀㐀㠀䄀㐀䘀䈀㈀㠀　　㔀䐀㘀㘀㌀㌀㌀㌀㐀㜀㠀䔀㌀䈀㐀㔀㈀䘀㘀㄀㈀䐀　䈀　㄀䔀㄀㐀㠀䘀㠀㜀㈀　㐀㜀　㌀　㜀㘀䄀㘀䈀㄀㤀䄀㔀　䈀㠀䄀㈀䄀　㔀㌀䌀㜀㐀㈀㤀　㔀㠀䐀㠀䌀㌀㐀㄀㌀㘀㈀㜀㘀㌀㈀䈀䄀䘀㜀㘀㌀㜀㐀䄀㐀㘀㄀㌀　㄀㌀㠀䈀㠀　㌀　㈀㄀䌀㘀㈀　㄀㠀㠀㔀䌀㐀䌀䈀㘀㐀䐀㤀㄀䐀㄀䄀㐀䘀㈀㠀　䔀䈀㘀䔀㠀䌀㜀䔀　䘀䌀䌀㄀㌀　　䈀䈀䌀䈀㔀㤀㈀㠀䈀　㜀䌀㘀䄀㈀䘀䈀㐀㈀㘀㤀䔀㌀　㈀䔀㐀㌀䘀㄀䄀㌀㈀㐀䌀㄀䔀㄀䄀㘀㐀䐀㌀㠀䈀㤀䔀㈀㈀㤀䘀㠀䄀㐀䘀　㘀㐀　䄀䈀䈀㄀䐀　㤀㈀䌀㠀　䐀䄀㐀㈀㤀㄀䄀䄀㌀䐀䐀䌀㜀㄀㌀䔀　㐀䌀㌀㐀䘀㔀㐀㈀䘀　㐀䄀㠀㄀䘀䔀㜀㄀　　䐀　㜀㠀䔀䈀䘀㐀㤀㄀㠀㄀䈀䔀㠀䔀䌀㄀㘀㄀䄀䘀䐀䘀㐀㜀䈀䄀　㘀㐀㠀䈀䘀䈀䘀㘀䘀㘀䈀㔀㜀䈀䈀䄀䘀㤀䐀㌀㠀䈀䌀　㌀㜀　䔀䌀㜀　㤀㈀䔀㄀䄀䔀䌀㄀䌀䔀䈀䔀䄀㄀㐀㄀　㈀㈀䐀䘀䌀䐀䔀䐀䔀䌀㄀㄀㄀䐀㈀䐀㜀㐀㄀䈀䌀䈀䐀㈀㌀㘀㐀㜀㌀㔀㜀㘀䘀䈀䈀㤀㌀䘀㠀䈀㘀䘀㔀䘀䈀㜀䐀　㌀　㌀䄀㐀䌀䘀㐀䘀䈀䄀㜀䄀䘀䄀䈀䈀䈀䈀㜀䌀㔀　䐀㜀䐀㔀䐀䈀䐀㘀㌀䐀䐀㐀䐀䔀䐀㔀䈀䈀㤀㄀䈀㐀䌀㈀㜀㔀䈀䐀㜀䐀㌀　䘀䌀㜀㐀㐀㄀㈀㐀　㈀䐀㌀䌀㄀㌀䔀㐀㈀㌀䈀㤀㐀㔀㤀㜀㔀䘀㤀　㘀㈀㠀䈀㌀㄀䔀㤀䘀䈀䘀䄀䐀㄀㌀　䔀䈀䐀䄀䐀㔀䐀䐀䐀㔀䐀㠀㌀㈀㌀㐀䔀䐀㈀䐀㄀㌀㔀䐀㠀㐀䈀㜀㤀㜀㘀　　㔀㌀㈀䘀䔀㤀䘀㜀䘀䄀　㜀䈀䈀䐀䄀㠀㘀䈀䄀䈀䐀㜀䔀䐀㈀㌀䘀䔀㐀䔀䘀䔀䘀㄀䈀䘀　㐀㄀䘀㜀䔀䐀䌀　䈀㘀䈀㜀䄀䈀䈀㜀䌀㌀　䘀䈀䐀䘀㠀㜀䄀㜀䌀䈀䐀㠀㌀㜀㔀䐀　㈀䈀䐀㐀㄀㄀䐀䘀㔀㘀㌀㠀㈀　　㌀㤀䐀䐀䔀䔀䔀㘀䔀䐀㘀㤀㔀㜀㜀　㠀䄀㐀䘀㜀㌀㌀䘀㤀䐀䄀䘀䄀䘀䄀㐀㜀䘀䌀㔀䐀㄀䈀㌀䈀　㜀㐀㤀㘀㜀㔀䘀㜀㜀䈀䈀　䘀㈀䄀㔀䈀㜀䐀㈀　㤀㤀䈀㜀䈀㔀䐀䈀㈀㜀㜀㔀　㔀㐀䄀䈀㔀㜀㔀㜀䈀䈀䈀㜀䄀㤀䌀䄀㐀䐀䐀䐀䈀䔀㌀䐀䐀䔀㠀㘀㌀㔀㜀䘀㔀　㄀㄀㜀㌀䘀㘀䈀㈀㘀㐀䈀㌀㜀䐀䌀䔀㤀㘀㌀㔀㔀䐀　㤀䘀㄀㜀䘀䔀䈀㘀　䐀㜀㘀䘀㔀䘀㔀㔀㈀㌀㔀䐀䄀䘀䄀㜀䄀　㜀䘀䐀㜀　䔀㠀　㐀㈀䐀䘀䐀㠀㌀䄀㤀㐀䈀㠀㜀䈀䈀　㘀㜀䌀㐀䔀䔀㈀䘀㔀㜀㜀　䐀㔀　㐀　㌀䄀䘀䌀㜀䐀䌀　㤀䔀䌀㈀　㤀㔀㜀䘀㐀㌀㄀㈀㘀㜀　㔀䐀䄀䘀㐀䘀䔀㈀㐀㈀䄀㄀㈀㘀㐀䈀㈀䌀　㈀㐀䐀䔀㠀䘀㄀䐀　㠀　㘀䘀㔀㄀㤀㘀㜀㘀㤀䘀䈀㜀㄀䈀㜀㠀　䐀䐀　㠀䈀䐀㌀㄀䈀㈀䘀䘀䐀䔀㔀䄀㠀㄀㜀㔀㘀㄀䄀䈀䈀䐀㠀㜀䄀㠀㌀䄀䔀㘀㐀䐀㈀䌀䘀㈀㐀䐀　　䌀㌀㘀䌀　㄀䄀䔀㘀㠀䐀㈀㔀䈀㔀㄀㌀㘀䌀㠀㔀㤀㐀㔀䔀䐀㌀䌀㄀䄀䔀㐀䐀䄀㐀䐀㜀䘀㄀䈀㜀䘀　䐀䘀䔀㔀䔀㜀䘀㤀䈀䘀㠀㜀䌀䘀㐀㜀㤀㜀䈀㐀䘀䐀㔀㌀䘀䐀㐀䄀㤀㔀䈀㤀㄀䘀㤀䘀䈀㤀㄀䘀㤀䘀䈀㤀㄀䘀䘀䘀䘀䘀䘀䔀㜀䔀䈀䌀䘀㐀㤀䈀㘀䄀䔀㘀㤀䔀䘀䌀㜀䘀䌀䘀㜀䈀䘀㈀㤀㈀䘀㔀㌀㈀䘀㜀䔀㔀㌀㌀䘀㜀䔀㔀㌀㌀䘀㜀䔀㔀㌀㌀䘀㜀䔀㔀䌀䘀䌀䐀䔀㘀㤀㤀㜀䈀䘀㌀㐀䈀䔀䘀䌀䐀㈀䈀䔀㠀㘀㐀䔀䔀䌀䘀㘀㜀䔀䔀䌀䘀㘀㜀䔀䔀䌀䘀䘀䘀㤀㤀䐀䐀㤀䘀䈀䘀䔀　㄀䄀㌀㜀㜀䌀䐀䔀㄀䄀㤀㜀䌀䔀　㈀㘀㤀䌀㘀䐀㤀䌀㜀䔀㘀㔀㠀䈀　䔀㈀㔀䐀㜀㈀㜀㘀㈀㌀㤀䈀䐀䘀䌀㐀䐀㤀㄀㠀㤀㈀㘀　㜀㤀㜀㐀䔀㤀䈀䄀䘀㜀　䐀䘀㠀䐀䔀㠀㌀䘀䔀　　㔀㜀䈀䘀　㄀䘀㔀䔀㤀䔀㜀䈀㘀䈀㈀㈀䈀䐀㈀㘀䈀㌀䄀䐀㤀䘀㜀㌀䔀䈀㘀㜀䔀㔀䔀㜀䄀䄀㘀㤀䘀䔀㔀㤀㤀㄀㠀䌀䈀㔀㤀㔀㈀㘀㘀㤀䄀䈀䈀䄀㠀䘀㐀㐀䈀㈀㐀㄀　㐀䄀㠀㔀　䐀䌀㈀㌀䄀䄀㄀㐀䐀㔀㠀㈀㔀䄀䌀㄀㘀㌀䌀䌀㈀㈀㔀䌀㈀㘀㘀㘀㄀䌀䐀㤀㈀㈀䈀　㜀㈀䘀䈀㠀㠀㈀䐀䘀㐀䌀䈀䘀㜀㄀　㌀䐀㐀㈀䘀䄀䐀䄀㔀㜀㤀㘀䐀㄀䄀䘀㐀㔀㤀䐀㈀　㜀䈀㘀䄀　䐀䘀䘀　㘀㔀㤀　䈀㔀㤀㜀䄀㈀㄀㘀㤀㔀㘀㜀䐀㠀䈀䌀䘀㐀䘀㐀䘀䘀㔀㤀　㜀䘀䄀㄀㤀䈀䄀䘀　㄀䘀㈀䌀㜀䘀㔀㜀䐀㈀䐀䐀　　䌀㄀䄀㤀䌀㠀㈀䔀㤀㤀䌀䔀㠀䘀㐀䈀䘀㐀　㘀䘀㠀䈀㜀䌀㈀㄀䈀䐀䈀㄀䈀㜀㄀㤀㈀䈀㘀䈀㤀䐀㠀㤀㐀㤀㌀㘀䌀㠀䌀㠀㔀䘀㘀㌀㠀㐀㤀㜀㜀㈀　㄀㄀䘀㄀䌀㘀　㈀㘀㌀㐀䔀㜀㈀䘀䔀㌀㤀㜀䄀㤀䘀㔀㈀㘀䄀䌀㄀䈀㠀㘀㜀　㄀䔀㌀㤀䈀䈀㠀㈀㌀㠀㠀　㌀㠀㤀㄀　㜀㜀㄀㠀㘀㄀䔀䔀㜀㘀䔀䔀㄀䔀䌀㐀㜀㌀䘀㜀㜀㈀䘀㜀　㈀㜀䐀㄀䘀㜀㜀㄀䘀䐀　䘀㜀㜀㌀䘀㜀　㌀䘀䐀　　䘀㜀㜀㤀䄀　䈀䘀䌀　䘀䐀㘀䘀䄀　䘀䘀㤀㌀䘀䈀㄀　䔀㠀㌀䘀䘀㈀㄀㘀㠀㐀䘀㤀㘀䌀㌀䔀㄀䈀䘀㄀㜀䌀　䔀䐀䘀　㄀䘀㐀㐀㘀㜀䔀㌀㌀䐀　䐀䐀䘀䌀㌀㔀㐀　㄀䘀䔀　　䘀㈀　㠀䔀䈀䘀㤀㘀㜀䘀　䘀䔀㠀䘀㜀䘀㤀㌀㌀㐀　㈀䘀䘀　㐀㤀䄀　䌀䘀䘀㈀㘀㜀㄀㄀㈀䘀㈀　㈀㄀㠀䔀䈀　㤀　㄀　㄀㈀㐀　䌀䘀　㠀㜀㌀㐀　䔀䘀㄀㜀䘀㘀　㌀㜀䐀䄀㔀㜀　　㜀䐀　㜀㜀　䄀㤀䘀　㌀䘀䄀㤀㠀㜀　　䌀䔀㠀䈀䈀㠀㐀䈀䈀㠀　䈀䔀㔀䈀䐀㔀㠀㠀䈀　䌀䄀䄀䐀㔀䄀㠀㤀㜀㠀㔀㔀㤀㌀䄀䄀㄀㤀䔀㠀䐀㔀䄀䄀㜀㔀㐀　䄀䘀㔀㜀䈀㜀㈀㌀䄀䌀䘀㘀䄀㤀䄀㄀㔀䘀㜀㔀䈀㜀䈀䄀　㜀䔀㠀㔀䔀䘀㔀　　䐀　㠀㌀䔀䄀㈀㄀䄀　䈀㜀䄀䄀㠀㜀㠀㄀䐀䔀䄀㘀䐀䔀　㘀䘀㐀㠀㠀㜀䄀㌀䈀䐀　㤀㜀䄀㤀㄀㌀㐀　䌀䘀䄀㠀㘀㜀㠀　䐀䔀䄀㜀㤀䔀　㔀䘀䄀　䄀䘀㔀㠀䐀㠀㠀㔀㌀䐀䘀䄀㐀䈀䔀㄀㤀䔀㠀㔀䈀䐀㐀㠀㜀㠀　䈀䔀㔀㔀䘀㌀㔀㜀　㠀㘀䈀㄀䔀䐀㐀㌀䌀㠀㠀㜀㠀䌀䐀㔀䘀㘀䈀䈀䔀　㔀䘀㐀䈀㜀㐀㔀㈀䘀䔀㈀䌀㐀㔀㘀䘀㄀㈀䄀䌀㐀㠀䈀㔀㜀㠀䈀䄀　㤀䐀㜀㠀㐀　䈀䌀㄀䘀䔀㠀　㜀䌀㐀䈀㜀㠀㄀䘀䔀　䘀䘀㄀㌀䐀䄀　䐀䘀䐀㜀㐀㈀㈀䘀䐀䄀㄀㄀䔀䐀㈀䌀䔀㈀䈀㔀㔀㜀䔀㠀䈀㔀　㠀䔀䈀㜀㔀㜀䄀　㌀䔀㈀䘀㔀㐀㘀㜀䐀㈀㔀䐀　㔀㔀㜀䄀㌀㜀䐀　㈀䈀䘀㔀　䘀　㄀䘀䐀㘀㔀䘀䐀㈀㌀㐀　㜀䘀㐀㌀䘀䘀㌀䐀䄀　㤀䘀䐀㔀䌀䘀　㌀䘀䐀㜀䐀䘀䐀㠀䘀㠀　䘀䔀㈀㜀䘀䐀　䈀㠀㠀䐀㌀䈀䘀䄀㠀㜀䘀　㌀䔀㠀㌀㜀䘀㔀䄀㜀䄀　䘀䔀㘀䐀䘀䐀䈀䈀㐀　䈀䘀䄀㜀䘀䘀　㌀䐀　㄀䘀䔀㠀㌀䘀　　䘀䄀㐀㌀㌀䐀㈀　䄀䘀䘀䘀䄀㌀䘀䔀㈀㌀䄀　㐀䘀㠀㌀䘀㄀䘀㠀㈀䌀㤀䌀䘀㔀　䘀　㠀㘀㜀䌀䐀㘀㜀䘀䐀　　䔀㠀䔀㜀䈀㌀䐀䔀　㄀䘀䄀䐀䐀䄀䌀䘀㜀㄀　㤀㜀䘀㔀䈀䔀䌀㄀㠀䌀䈀　䌀㄀㘀㈀㈀㠀㐀㈀䈀䌀㘀㄀㤀㤀㘀㄀㈀䈀䐀　䌀㌀㠀㘀䌀䈀㠀㄀䐀䔀㘀㄀㠀㐀㜀䔀㠀䐀䌀䘀㄀䄀㤀䘀㐀㔀㤀䌀䘀㄀㄀䘀㐀䌀㠀㔀　㠀㤀䈀㠀䄀㐀䌀㌀㘀䌀㐀㤀㤀㔀㘀㤀㠀䔀䌀㠀㠀㌀㜀㌀㤀㐀䌀㄀䈀䄀　䄀㘀䌀㔀䐀㐀　㈀䈀㐀䌀㜀䘀㐀㄀㈀䐀　㈀㜀㐀䐀㘀䘀　㈀䘀䐀䔀䘀䄀㘀䈀㜀䄀　䌀䐀㈀㤀䐀㌀㜀䘀㐀㈀䌀䐀㌀䈀䄀㘀㜀㜀䄀㄀䔀㘀㌀䐀㌀㌀䘀䐀䐀䘀䈀㠀　㔀䈀㌀㠀　㜀㠀䈀㌀䌀䄀䄀䌀㐀㈀㤀䌀㔀㤀㘀䐀䐀䔀　䘀㌀㔀㔀㜀㤀䄀䄀䘀㠀㐀㤀䄀䄀䈀䌀䌀㘀　㌀䈀䘀㌀㔀䐀㘀㘀䈀　㤀䐀䘀㤀㘀䔀䌀䈀㠀䐀　㠀㔀䈀㘀䔀䈀㈀㠀　㐀䐀㈀䐀䌀㜀㈀䌀㔀　㘀䘀䈀㤀䌀䈀㜀㈀㌀㜀䔀㈀㈀䌀䌀㜀㈀䐀䘀㐀㤀䐀䐀㐀㠀㈀䔀䌀䔀㜀㄀䌀䈀㈀㌀㄀㜀䘀㤀　㌀䌀㐀㄀䘀㈀　㄀䐀㤀䘀䄀㠀　䈀䌀㄀䘀㜀　㄀䔀㄀㐀䌀㄀㤀䄀䔀㈀㌀㘀㄀㄀㜀　㄀㘀㈀䘀㄀㔀㐀㄀㄀㜀㌀㄀㈀　㠀䔀䌀㌀䔀㜀㠀㐀㌀㠀　䐀㤀䘀䘀䈀䌀㐀㌀㤀䘀㠀䐀䌀　䘀㌀㘀䄀㈀䐀㘀䈀㤀　䔀㌀䔀䄀䘀㄀㜀䄀䘀㠀㜀㤀䄀㄀䈀䌀㐀㄀䈀㠀　㌀䔀㈀㠀䐀䔀　㐀䘀㐀䌀䐀䔀㈀㈀㄀䄀　㘀䘀㄀㔀㘀䘀　㌀䘀䄀㈀㠀㔀㠀㤀　䐀䄀䔀䔀㄀䐀䐀㤀㔀㈀㄀䌀䐀㠀䄀㠀　㘀㘀㠀䄀㜀䈀䔀㄀䔀㄀　㜀㘀䔀㤀㔀䐀䌀䌀　䄀䘀䘀　䔀䘀㐀㔀䈀䘀䄀䈀㜀㄀㠀䌀㈀䐀䘀㠀㜀䌀䘀䔀㜀䈀㈀㤀䔀　㌀㤀䌀㜀䘀　　㘀㠀㔀㌀㘀䌀䘀㌀䔀㄀䈀㌀䌀　㔀　　　䄀㠀㄀㘀㄀䄀　　㐀㤀㐀㌀㄀㄀㐀㔀䘀䈀䘀䘀　　䐀㄀　㘀㌀㐀㠀㐀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㄀㌀　㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㔀䈀㈀　㌀㈀㌀㜀㌀㠀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㌀㌀㌀㌀㌀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㘀㌀㘀㌀㜀㈀　㌀　㈀　㌀㜀㌀㈀㌀㈀㈀　㌀㜀㌀㈀㌀㈀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㈀㌀㜀㌀㠀㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀　㈀　㌀㔀㌀㔀㌀㘀㈀　㌀　㈀　㌀㔀㌀　㌀　㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀　㈀　㌀㔀㌀㔀㌀㘀㈀　㌀　㈀　㌀㈀㌀㈀㌀㈀㈀　㌀　㈀　㌀　㈀　㌀㈀㌀㈀㌀㈀㈀　㌀㠀㌀㌀㌀㌀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀　㈀　㌀㌀㌀㌀㌀㌀㈀　㌀㔀㌀　㌀　㈀　㌀㈀㌀㜀㌀㠀㈀　㌀㔀㌀㔀㌀㘀㈀　㌀　㈀　㌀　㈀　㌀㔀㌀　㌀　㈀　㌀㔀㌀　㌀　㔀䐀㈀　　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㄀㌀㄀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㈀㌀　㌀㠀㌀　㌀㐀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㌀㄀㈀　㌀㔀㌀㐀㌀㤀㌀㜀㌀㘀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀䔀䌀㜀䌀㜀㤀㜀䌀㔀㐀䐀㔀䘀㔀䘀㠀㌀㤀䘀㜀㘀䐀䈀㌀㘀㔀䔀㘀䌀䐀㘀㐀䈀㘀䄀䌀㘀䘀㠀㘀㐀㤀㐀㈀䌀㠀㈀㐀㈀㐀㈀㐀㈀㄀　䈀　㐀㌀㈀㤀　　㔀㈀㐀䔀䌀㤀䈀㐀㤀㈀　㄀㈀㜀㘀㔀　㤀　㠀㐀䌀㔀　㈀㘀䔀䈀㠀㄀㔀㠀䌀㔀㘀䔀㈀㔀㈀䄀䐀㈀䈀㔀㠀㄀　㜀㄀㘀㔀㤀㈀㈀　　䔀㠀㠀㠀㈀㄀㔀䔀䈀㘀䔀㘀䐀䈀㔀㜀㔀䄀䈀㠀㔀䄀䘀　㔀䈀㔀　䄀㔀㈀㈀䐀䄀　㔀㔀㌀㌀䘀㌀㌀䈀䘀㜀䌀䐀䈀　䘀㤀䔀䐀䘀㜀䘀䈀䔀㤀䄀䘀䘀䘀䘀㐀䘀㌀䘀㤀㌀㘀䔀㜀㜀㄀䘀㜀㜀㌀䐀䘀㌀䐀䘀㜀䐀䌀䈀㌀䐀䐀㘀㜀㄀䌀㐀　　　䈀　㔀㈀㈀㘀㐀㈀䐀䈀㠀㐀㈀㤀㠀㔀䌀㔀㜀䘀㠀䈀㘀䐀䈀㤀　㘀　　㄀㜀㔀㄀㘀䘀䔀䈀䐀䌀䄀㔀䈀㌀䐀䈀䄀㘀䄀㐀㤀㔀㌀䔀　䔀㔀　㄀㐀　㘀㘀　㄀䘀䌀䘀䈀䐀㘀䌀䄀㔀㘀䘀䐀㐀䈀㠀䘀䌀㌀䐀　　䄀㄀㔀䘀　　㐀㠀　䈀㄀㘀䈀㐀㈀䐀㔀䌀䘀䄀䐀䐀㤀㈀㠀㄀㜀䘀　㔀㈀㠀䈀㤀　㌀㐀　㄀䔀䈀䌀㜀　䌀㤀㤀䄀　㔀䄀㌀䌀䄀㠀䄀䐀㘀　㈀䐀㐀䐀㌀䘀㐀㤀䄀䔀䐀㠀䈀䔀㘀䌀䘀㤀䔀㜀㜀㈀䄀㔀㈀㌀㘀㤀㤀㄀䄀㐀㜀㈀㤀㤀㔀㈀䐀䄀㈀　䔀䔀䈀䄀㠀䄀㐀㐀㌀䘀㐀䘀䔀㈀䌀㘀䄀㘀㜀㈀䐀㔀䄀䈀䄀㜀㈀㜀㔀㐀㤀㔀㄀䐀䄀㘀㔀䐀㐀㜀䔀㄀㤀㘀　䔀　㈀㜀㐀䈀㤀㘀䌀䐀㤀䐀㜀䐀䐀䈀㠀㤀䔀䈀㘀䘀　㐀䈀㠀㜀㄀㌀䈀㐀　㐀䄀㜀㐀䔀㤀䔀䌀䐀㔀㘀䐀䄀䄀㔀㄀䄀㄀㌀㘀㠀䔀㈀㘀㜀䌀䐀䘀䐀㈀䘀㤀㈀䈀㘀㜀䈀䘀㔀㘀㜀䐀䔀㤀㐀䈀　　䔀䘀䄀䌀䄀㘀㜀㘀䘀㌀䄀㔀䈀㌀㤀㜀䌀䔀䈀䘀䘀㜀㠀䐀㄀䐀㐀㘀㠀　㈀䐀㠀㐀㔀䘀䘀㐀㘀㐀䐀䈀䈀㈀㄀㔀㈀䈀㘀㌀㤀㤀㜀　㈀㜀㠀䐀㌀㜀㜀㈀䘀䌀䈀㘀䔀㔀䘀㌀䐀䈀䔀䔀㤀㠀㔀㌀䘀㄀㈀㈀㐀　䔀㔀䔀䈀㐀㐀䐀䘀㘀䈀䌀　䘀㜀䄀䄀㔀㠀䐀䔀䘀㠀䔀䐀㤀　㄀㌀䄀㤀䈀㌀㘀䌀㔀㔀㈀㜀　䐀㈀㤀　㘀䔀　䈀　㘀㔀䘀㤀䄀䘀䘀㘀䘀㄀䘀㈀䌀㠀䈀㐀䘀㐀　㔀䐀䘀㜀䘀䐀㐀䈀䈀䐀　㜀㐀㔀　䘀㤀㄀䔀㄀㠀㄀㠀㜀㔀㜀䌀　䔀㔀㐀㈀䄀䌀㌀䄀㌀䔀㌀䄀㄀䌀㘀䘀㐀䔀㠀䘀㜀㄀䘀㜀䐀㌀㜀䐀㤀㜀㐀㄀　䘀䌀䄀　䌀　㌀㤀㘀　㔀䄀䌀㔀㜀㄀㈀䌀㔀㄀㔀㠀　㜀㈀䄀㔀㠀㘀㠀㈀䔀䄀㌀䈀㈀㄀　䄀㘀㄀㌀䐀㜀㌀䄀㘀㤀㔀䐀㐀㘀䄀㌀㠀㈀䈀　　㄀㌀䈀㐀㄀　㈀㠀㌀㜀㐀㠀䘀㔀㐀　㈀㤀㤀㤀㠀䄀㘀㤀㜀䌀䐀䌀㈀㘀䘀㘀㄀　㄀㜀㌀㄀㠀㈀㐀㘀㘀㤀㘀㐀㔀䌀㘀㤀㠀㤀㄀㠀㤀㠀㜀䌀　㄀䄀　㌀㔀㠀㌀䐀㈀㌀䈀䔀㈀䔀䌀　䐀㐀㜀㄀㌀㔀㌀䔀䄀䄀䘀㤀䈀㈀㔀䘀㤀㜀䐀䔀㠀䔀㔀䔀㠀㠀㈀㔀䌀䄀㜀　䔀䌀　䔀　㄀䔀䔀㌀䈀䘀㠀　䐀㄀䐀㔀䄀㠀䔀䈀㐀㠀㜀䔀䘀㄀㐀㐀㐀㌀㤀㐀㄀㈀䌀䄀䈀㌀䌀㤀㌀㔀㘀䈀　㜀㜀䐀㄀　㔀㌀䘀　㈀㔀䌀㠀䘀䔀㈀㠀䘀䘀䈀䘀㐀㜀㤀㠀䘀䌀㈀䄀䌀㜀䘀䐀㐀䘀䘀䄀䘀㠀㈀㌀㐀㌀䐀䘀㘀䄀䔀㔀䔀䈀䔀　㐀㜀䈀㈀㠀䌀䐀㌀㠀䐀䐀㈀䘀㔀㜀䌀㈀㐀䈀　㤀㌀䄀㔀㜀㤀䐀䔀䔀㄀㌀㔀㜀䌀　㘀㐀䘀㤀㔀㄀㘀㠀㐀䔀㠀䌀㌀䘀㈀㌀㐀䐀㠀㜀䌀㘀䌀㐀䐀䌀㔀㘀䄀䄀㜀㜀㠀䄀㜀䘀㠀㘀䐀㠀㠀䘀䐀䔀䈀䐀㠀䘀䘀䄀㠀䘀䘀䘀㘀䘀䔀䈀䐀㌀㌀䈀䘀㔀䘀㜀䐀㄀㘀㘀㔀㜀㔀　㜀䐀　㤀䄀㔀㠀䈀㄀㌀䘀䐀㠀㌀㜀㤀㠀㤀㈀䘀䌀㄀䈀　䐀㌀䈀㠀㔀㐀㈀䘀䄀㌀䘀㔀㘀䈀㘀㠀䄀䌀㤀㘀䐀㈀㌀䌀㜀㄀㐀㔀䔀䌀　䈀㤀䐀䌀㘀㐀㜀䄀㤀　䐀㌀　㤀䔀䘀㌀㤀㈀䘀䄀䐀㜀㤀䐀㜀㤀㌀㜀䌀㐀㜀䄀䘀䘀㈀㄀㄀㌀䘀䈀䔀　䘀䘀㄀㐀䐀　䈀㤀㔀䘀䘀㤀䐀䘀䘀䄀㄀䔀䌀㔀㔀䈀䘀䔀㄀䐀䈀㐀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀㐀㐀㄀㄀䘀䘀䌀㈀㜀㠀　䘀㠀㌀䌀㈀䌀䘀㠀㜀㜀䐀㌀䐀　　㜀㜀䐀䘀　䄀䘀　㈀䐀䔀䘀㌀䔀䘀䄀㘀䄀　　䘀䘀䄀䄀　　䘀䘀䔀㤀㌀㐀　㜀䄀㄀㄀䔀㘀䌀㤀㄀㘀㜀㠀㔀䄀䘀䄀㄀㘀㄀䄀㠀䐀䐀㌀䔀㄀㐀㈀㈀䄀㜀䈀　㐀㄀㘀㌀䈀㜀䄀㜀䄀㤀䌀䘀䘀䌀䐀䐀䌀䔀㤀㌀䄀㌀㌀䌀㄀㌀㈀䈀䐀㤀䌀　㠀㔀㜀㔀㌀㜀䘀䌀䔀䔀㤀㜀䔀㠀䔀䌀䘀䌀㜀䘀㠀䐀䘀䐀㈀㠀㤀䔀䐀䈀㄀䐀䐀䘀䄀䈀䌀㄀㜀䔀　㐀䄀䘀㄀㔀㌀㤀㠀㈀　㈀䔀㠀㌀䘀㄀䘀䄀㌀䄀㠀㔀䈀　㤀㘀㤀㜀䘀㠀㜀㤀䈀䌀䄀䐀䌀䘀䐀䈀　䈀㄀㌀䄀㐀㤀㜀㘀　䈀䌀㜀㠀㄀㐀䌀㘀㐀䈀㠀㌀䔀　㜀㈀㜀㄀㘀㤀㜀䌀㐀䌀䘀䌀㤀　䘀䄀㤀㘀㐀㈀㤀㤀䄀㠀䌀㈀㘀㌀䔀㈀㐀㜀㜀　䔀䐀㄀㤀㔀䄀㤀㘀䌀㔀䔀䔀㄀㐀㤀㜀䌀　㜀䘀䌀䌀䐀䘀㔀䐀㤀䐀䌀䈀䄀䈀㌀䔀䔀㠀㠀㌀㌀䔀䔀㠀㠀㌀㌀䔀㌀㠀　㌀㐀㈀㈀㈀䄀㔀㈀㜀䘀䔀䔀㐀䘀䐀　㜀㘀䄀㔀㄀㠀䐀㌀㄀㄀　䔀㄀㄀　䈀㔀㐀䈀䘀㤀䐀䘀䌀㌀㠀㌀㄀㌀䘀䄀㐀㄀㜀䘀㈀㠀㠀　㄀㄀㔀　　䈀䄀㌀䔀　　㈀㄀㠀　㜀㄀㌀㘀㄀㈀䄀㌀㐀䌀㄀㘀䌀㤀㠀　䘀　䈀㘀㄀㌀㄀䈀㐀䌀㄀㈀䄀㔀㠀　㌀㤀䈀䔀㄀　㤀㄀䌀䌀㐀䐀䔀䘀㜀㄀㤀㜀䐀㠀㔀䐀㤀䄀䘀䌀㜀䘀㠀㔀䘀㤀㤀䘀䈀㄀㈀䈀㌀㘀䄀䘀㐀㔀㤀㘀㌀㘀㄀　㈀㐀䌀㠀㘀㐀㘀㤀䄀㌀㔀㔀㜀㤀䘀䈀㔀　㐀㤀㘀䌀㌀䔀䄀㄀䘀䌀䘀㠀䄀䘀䐀䘀㤀㤀䘀㜀㠀䔀㘀䐀㈀䈀㌀㌀㔀㠀䄀㤀䘀㜀䐀䘀㈀䐀㤀䘀䔀㠀䘀㔀㜀㤀䌀䘀㤀㌀䘀　䈀䘀䔀㌀䘀　㄀㘀㔀㌀㠀䘀䈀㌀䘀㈀㔀䐀　㠀㘀㠀㄀䘀䐀㄀㠀㠀㄀㔀㠀㈀㌀㐀䄀䈀䌀㘀㘀䐀㈀䐀䈀䔀䄀㌀䘀㜀㠀㐀㤀㄀㘀䔀㐀䘀㐀　㜀䌀㠀㠀㌀㜀䌀㠀　䌀㈀㈀㈀㈀㠀㈀䔀㠀㄀䌀㄀㘀㔀䔀㔀䐀㐀㌀䐀䈀㐀㈀䄀㌀㄀㔀䔀　䈀䘀㔀䄀㌀㐀㘀䌀㌀㄀㠀䐀䄀㌀䈀㐀䌀㤀㠀㌀㠀㘀㤀䘀㈀㄀㐀㤀㠀㌀㘀䘀䐀䌀㈀㐀㘀㠀　㄀㤀㌀㌀䘀䘀㌀㔀㤀䄀䘀䘀㘀㜀㄀　䘀䔀㜀㤀䐀㐀䐀䘀䘀㌀䔀䌀㠀㌀㜀㠀䘀䐀䘀䘀䘀䌀㈀㤀㠀㜀㐀㘀㐀䔀㤀䈀㄀䄀䄀䄀㄀䔀㌀䔀䄀䌀㘀䄀䔀㠀㤀　䌀䄀㠀䄀䘀㈀䌀㄀䄀㔀㈀㔀䌀㔀㠀㌀㠀䄀　䄀　㜀㄀㘀䔀㐀　㜀䘀㌀　㘀䔀㐀䘀㘀䌀䘀䌀㤀䌀䔀　䄀䘀㐀䘀㌀䘀䈀䈀㐀䌀䌀㠀䌀䘀㐀䈀㐀䐀㐀㄀㐀䄀䘀䌀㜀䔀䐀㜀㈀㈀㘀㌀䈀䔀䌀䄀䄀䌀䐀㤀䄀㘀㐀㌀㄀㤀䈀㠀䌀　㘀㐀㔀㤀㘀㐀㐀㠀㄀㈀㄀䔀㐀䐀㜀　㔀䔀䄀㔀䈀㜀䐀䔀㄀㤀䌀䐀㘀䈀　㤀㠀㄀㌀㄀㠀㌀䐀䈀䄀㠀　䈀㜀　㌀䈀㌀䄀㤀㘀㌀䘀㘀㌀㤀㄀䐀䄀䐀㘀㄀㄀䘀㜀㔀䐀㔀㤀䘀㠀䘀㄀㌀䘀㘀䈀㔀䔀䄀㘀㠀䈀䔀䘀㌀㌀㄀㐀㌀㠀㐀䈀㤀䔀　㐀㜀㤀㠀䄀㄀㌀㠀㘀㘀䔀㠀　䌀㈀㘀䄀䄀䈀䔀㈀䄀䄀㠀㈀䄀䌀㠀䘀㜀䐀㔀　㔀㜀䌀䔀㄀㌀㜀㘀䄀　㌀䈀䔀　㠀㌀㘀㐀䘀㘀䄀䄀㐀䘀䄀䌀䘀㘀䄀　㌀㐀䐀䈀䔀䘀　㌀㄀䈀䐀㌀䔀㐀䔀䄀䘀㠀䈀㌀㤀㜀䄀㈀㌀㠀㤀㄀䄀㜀䔀㌀䘀䌀䐀䘀　䐀㔀㜀㤀㄀㜀䐀㔀䘀䄀䌀㈀䐀㠀䔀䄀䄀䈀　䈀䐀㜀㔀䘀䈀㘀䄀㠀䄀㌀䄀䔀䈀㔀㤀㘀䐀䔀䐀㜀㘀㔀㌀㘀䐀㔀　㐀㘀䄀䔀㘀㤀䈀　䄀䘀㈀䄀㄀䌀䈀㘀㐀䄀㘀䄀䄀㤀㤀㘀䄀㘀㄀㐀䘀䄀　䄀䐀　䈀㌀䐀䌀㌀㔀㄀䄀䘀㌀　㐀䘀䐀䐀㤀　㈀䔀　㘀㠀㘀㈀㐀䄀㈀㈀䄀㤀䌀㄀䄀䄀㠀䄀䐀　䈀䄀㜀　㐀㘀䄀㌀㤀　㤀㘀㄀㈀㄀䈀䈀㘀䔀䘀㘀䈀䌀䘀　䌀㐀㐀㤀㠀䐀㜀㔀䈀㔀㘀㤀㜀䔀㜀䘀㔀㌀㐀㄀㜀䔀㄀㠀㘀䈀䔀㘀　㘀䔀㘀㠀㐀㈀㄀㌀　㌀㈀㘀䌀　䈀䔀䄀㈀㠀㔀　䄀㌀㈀䘀㄀㌀㤀㘀㘀䈀䌀㈀㠀䄀䈀䔀㠀䌀㘀䘀㌀㄀䐀䘀　䔀䐀䌀䔀㐀䔀䈀䌀䄀䐀䘀䐀䘀㜀㄀㜀㌀㐀㐀㠀㔀㌀㤀䄀䐀㐀㄀䌀䈀䈀䌀䌀　䈀䌀䐀㤀㌀㌀㄀䈀䌀㌀䌀㈀䔀䌀㈀㘀䈀䔀㠀㘀㌀䐀㐀㠀䔀䈀䐀㘀㠀㘀㌀䐀㘀䈀　䘀㜀䈀䌀䘀㌀㘀䔀㤀䔀㔀㠀䔀㤀䄀䌀㘀䘀㔀䔀㜀㠀䔀䄀㘀　㤀㄀䐀㜀㔀䐀䔀䌀㔀㌀䔀䐀䔀䔀䌀䔀㠀㔀㠀䔀䘀　䈀㘀䘀㤀䔀䐀㐀㜀㠀䔀䔀䄀㠀㤀䘀䔀㜀㐀䐀㐀䐀䘀㐀　䔀㤀䄀䌀䈀䈀㈀䔀䈀㔀䈀㌀䈀䔀䄀㘀㤀䔀㤀㤀䈀㌀㤀㄀㜀䈀䐀㠀㔀㐀㐀　㠀㈀㜀㤀䘀㘀䘀㈀㔀䈀䔀䄀㤀䘀㤀㠀㄀㌀䄀䐀䔀䐀㌀㜀䄀䈀㄀㈀䘀㘀䌀　䌀㠀䌀　䌀㈀䌀䔀䄀䈀㠀䈀㠀㤀㔀　䔀㈀㐀䈀㔀㈀㌀　䌀㤀㌀䐀㜀䘀㠀䈀䈀㔀㌀㔀㌀㐀㌀䈀䈀㘀㌀㠀㜀㈀　䈀㔀䌀䔀䐀㜀㌀㄀䈀㔀㌀㄀䔀　　䘀㔀㜀䄀㜀　㔀㤀䄀㘀㘀䐀㜀䄀㘀㜀㜀㌀㤀䄀㄀㘀㌀䘀㈀㤀䄀㤀䔀㤀㐀㤀　㈀䘀䔀㔀䘀䌀㤀㄀㠀㈀䘀䌀㈀䔀䐀㔀㄀䔀䔀㜀㘀㘀㤀㜀䐀㔀㤀㘀䄀㠀㔀㠀㤀㈀䌀䔀䄀䐀䌀䌀㌀䘀㌀㌀䄀㘀䐀㜀㜀㐀㜀㐀㔀䔀㘀䈀㤀㠀㜀䌀㠀㘀㤀䐀䌀㠀㈀㤀　䄀㔀䌀㐀　㘀㈀㄀　䘀㘀䌀䐀䘀㔀㄀㄀㈀㔀㠀䐀　㄀䐀䄀㐀㠀　㔀䌀䘀䔀㘀㔀㜀㐀　䌀㜀䐀䌀　䄀㐀㈀㈀㌀㘀㠀㐀㈀㤀䄀㄀㔀㤀䔀㐀㜀䌀㜀䈀　㌀㠀㘀䌀䄀䌀㘀㤀䔀䐀㔀　㠀㜀䘀　㜀䔀㌀䔀㌀䘀㈀䌀㘀㔀䄀䈀　㄀㔀䘀䌀㜀㐀㤀䄀　㘀㌀　䘀㄀䌀㌀䈀㜀䄀㜀䔀䌀䘀䔀䌀㐀㐀㠀䘀㤀䌀䄀䐀㤀䔀　㐀㔀䔀䔀㔀䌀㈀㜀㄀㐀㘀䌀　㘀㠀䘀䌀㜀㐀㌀䐀㄀䌀　䌀㠀㘀䘀㌀䘀㈀䈀㠀㔀䌀㈀㠀㌀㔀㜀㐀㤀　㐀㐀䔀㌀㜀　䈀䐀㌀䐀䈀㠀㈀　䘀䘀䈀㈀　㠀㈀䈀　䈀䈀㐀䄀㤀㌀䔀㈀䄀㠀㠀㜀䐀㌀　䈀㄀㤀㄀䄀㘀㌀㔀　䐀㈀㤀㈀㐀㤀䔀䘀䈀䘀䐀䘀䌀㔀㐀㘀䘀㠀䄀㠀㐀㘀　　䔀㌀㔀䌀㈀䔀䈀㈀㘀㌀㔀䌀㘀䐀䈀㌀䔀㤀㠀㤀㌀䐀㘀　䐀䄀㄀䌀㈀㘀　㔀㌀㤀㠀䈀㔀䘀㈀㤀㄀䘀䐀䄀㜀㐀㜀㔀䌀䐀㌀䘀㠀䌀㠀䈀䄀䐀㌀㈀㌀㘀㜀䄀㘀䈀㜀　㘀㐀㠀㜀䌀㜀㜀䔀䄀䈀䄀䔀䔀　䄀㄀䈀㜀㈀䌀䔀䘀䌀䈀㌀䄀㤀䔀䔀䔀㐀䈀䄀㐀㔀㐀㌀䌀㈀䔀㠀䘀䔀㔀䘀㠀㘀䔀㜀䌀㜀䌀㜀㄀䈀䄀㘀　㐀㄀䄀㈀㘀㌀㔀㌀㜀䘀䄀䔀䄀㌀䄀㔀䄀㄀㌀䈀䌀㘀䐀㤀㠀㜀䄀㔀䔀㈀䈀㌀䔀㔀䔀㜀㄀㘀㘀㈀䌀㔀㄀　䈀㈀㜀䐀㜀㌀㐀　䄀㘀㤀㈀䌀㔀㄀㘀㌀㘀㤀㠀㈀㌀䔀㐀䄀㤀㈀㌀㠀䘀㌀　䌀㌀㈀㘀䘀㌀㐀㔀䄀䌀㈀㘀㈀㌀㘀䘀䐀㤀㌀㜀㔀㐀㤀㤀䔀㄀㜀㔀㄀　䌀㈀㐀㠀䄀㜀䄀　䘀䘀䄀䔀䄀䌀㌀㘀䄀䔀䈀䔀㠀㜀㠀䐀䔀㘀㐀䘀㈀䘀䈀䘀䘀䌀㤀㐀㤀㤀㄀䐀㠀㔀䘀䘀㤀㈀䌀䈀䐀㌀㠀㌀䈀㈀䐀㐀㄀㘀㘀㜀㠀㐀㠀䘀　䘀䌀䘀㘀䐀　䘀㌀䐀䄀䔀㜀㤀㄀㘀㜀䔀㤀㄀　㠀㠀㘀　㌀㄀㠀㜀㌀㔀㐀䌀㘀䐀䔀䔀䔀㠀㌀　㤀䐀㌀㜀㔀㘀㐀䘀㜀㘀䄀㜀䄀㌀䄀㌀㌀䔀䔀　䄀䈀䔀䘀㘀㠀䔀䐀㤀㠀㄀䐀㠀㤀䄀䐀㤀䈀㄀㌀䘀　䄀㤀㠀㄀㠀䔀䐀䐀䔀䌀㈀㄀䘀㘀㔀　㐀㜀㔀䈀㔀䐀䔀䈀䔀㤀㄀㌀㠀䐀䌀㐀䘀㘀䐀䌀㤀㐀㄀㘀䄀䔀䈀䘀䈀㤀㠀㤀㌀㘀䈀㄀　㠀㠀㜀㤀　䈀㐀㌀㈀㄀㠀䐀㤀㄀㔀䌀　　䐀㤀㌀䈀䄀㐀㈀䈀㠀㘀㄀㐀䄀㜀㌀䔀㌀㘀䔀㤀㔀㈀䌀䘀䔀㠀㘀䄀㤀㠀䐀䐀䐀　䌀㔀㤀㐀䐀䔀䈀䌀㠀䄀㘀䄀䔀㈀䌀㄀䄀㘀䈀䐀䌀䔀䐀㈀㌀㔀㌀䄀䈀䘀㜀㌀㈀䐀䔀䌀䈀㌀䈀㜀㤀䌀㌀䌀㜀㄀䈀䐀　㠀　㈀㐀䔀㠀䐀䐀䌀䌀䄀　䔀㌀䄀㜀䔀䐀　䔀　㄀䄀䌀䐀㌀㐀㜀㐀㔀䈀䐀㐀㌀㘀䘀䌀䘀㠀䐀㈀　䔀㠀㜀䐀㠀㘀䐀㌀㜀䐀　㠀㜀㌀㈀㌀㈀䌀䐀䔀䄀㜀䌀㘀㄀㜀䌀䄀䐀㄀㄀㜀　䄀㤀㄀㤀䘀㤀䔀㄀䈀㄀㄀䔀㌀㈀㌀䄀㄀䐀㌀䐀㠀㈀㈀䘀㔀㄀㤀䔀㈀㜀䐀䔀䈀䔀㈀䐀㠀䈀㤀　㤀㘀䌀　㌀㠀䐀䄀㠀㜀䌀㘀㐀　䘀㌀　㄀䔀䐀㤀䘀　䌀㄀㌀㠀㜀　㔀㌀㔀㄀㌀㌀䈀㔀䘀㄀㔀䌀㜀㤀䐀　㤀㔀䄀䌀䄀㤀㠀　䔀㐀㘀䈀㠀㐀　㔀䄀㘀䈀㈀㘀䔀䘀䔀䔀　㄀㜀㤀　　㄀㄀䄀䔀䈀㘀㈀㘀㄀䄀㠀䄀㈀㌀㈀䐀䌀㈀㌀㘀㜀㘀㠀㐀㔀䌀䘀䈀　㐀㜀㠀㤀䌀㈀㄀　䐀䈀䐀䔀㔀䐀㔀㤀㄀㈀㠀䄀䈀　䔀䐀㌀䐀䄀䄀䄀䈀㤀㠀㤀㜀䐀䐀　䄀㘀䘀㌀䔀䐀㈀㘀㌀㜀㄀㄀㐀㔀䘀㌀䐀䌀㈀䌀䔀䈀㘀䌀㄀　䔀㐀䄀䘀䈀㈀㠀㄀䐀䄀㜀㈀㐀㐀㈀㄀㄀䔀㔀㄀㌀㈀㠀䌀䐀䄀㈀㈀㐀䐀　䘀㐀㘀䐀䐀䐀㄀䈀㌀㤀䘀䔀䈀㘀䔀䔀㔀㤀㜀䄀䐀㄀㌀㌀㜀䔀㔀㈀䘀㄀㌀䄀㔀䔀㠀䔀㄀䐀㔀㜀䄀䌀䈀㜀㐀㌀䄀㌀䔀㌀䄀㔀㈀㤀㈀㤀㔀䔀㄀䄀㠀㜀䌀㐀䌀䈀䄀㈀㄀㈀㠀䔀䈀㜀䈀㔀䄀㜀㘀䔀㌀㔀㘀䘀㘀䘀䔀䐀㈀㤀㄀䔀㄀㈀㘀䘀䔀㜀　䐀㠀䄀䈀㜀䈀㌀䈀㈀㘀㤀㜀㤀㤀㔀㘀䐀㈀㔀㄀䄀㠀䘀䔀䈀䈀㤀㠀䐀䘀㈀㐀㈀㐀䄀䐀㔀㤀㐀䄀䔀䄀㘀㈀㐀䐀㈀䔀㈀㔀䈀㜀䈀㔀䌀㄀㤀䘀㄀㘀㤀㐀㘀㈀㜀㤀䘀䈀㘀䄀㔀㈀㜀㌀㔀䄀䐀䐀㠀䈀㘀㠀䘀㘀䐀㈀㄀㠀䌀㈀䐀㌀㐀㘀䘀㠀䈀㐀䔀䔀㈀㤀㘀㤀　㠀㤀㠀㘀㄀䐀㄀㌀䔀㐀　㤀　䄀㌀䈀㌀䔀䄀㈀㤀䌀䈀㠀㠀㄀䈀　㐀㤀䌀䘀䄀䘀䐀㘀䘀㌀㔀㤀㜀䄀㔀䔀䄀䐀䔀㜀㠀㔀㜀䄀㘀䔀㐀䈀㠀䌀㜀䔀䌀䔀㔀㜀䐀㜀䘀㌀㜀䐀㜀䄀䈀䔀㐀㌀䌀䘀　䈀䘀㔀䈀䌀㔀䄀䌀䘀㈀㜀䔀㠀䘀㤀㌀㈀㌀䐀䐀㜀䘀㄀䘀㄀㄀㠀㌀䐀㐀㜀䔀㤀䘀㤀㠀㈀㤀䔀䌀䘀䘀㄀䘀㌀㤀　　㌀䘀㈀㄀㄀㌀㐀㔀㐀䌀㤀㄀䈀㘀䄀㄀㠀䌀䄀䌀㜀㤀　㠀㘀䈀䈀䐀㄀㠀㠀䔀㘀䔀䔀㔀㈀䔀䐀䐀㘀　㠀㤀䄀㐀㌀䔀㔀䄀㔀䐀䄀㐀　㔀䘀㠀䐀㔀㘀㐀䌀䄀㤀䌀㐀㌀㜀㐀䄀䌀䈀䄀㜀㔀㈀䄀㌀㜀㐀㜀㤀䐀䔀㘀㠀䄀䐀㠀　㤀㈀㌀䘀䄀䘀㔀㘀㈀䈀㐀㜀㜀䄀㈀䘀㄀㠀㤀㄀䐀䌀㄀䄀㜀㠀㌀䌀㜀㐀䈀㐀　䔀䈀䈀㈀㄀㄀㐀䌀㄀䌀㜀㤀䘀㠀䔀䄀䔀㐀䘀䔀䄀㔀䐀㤀䘀　㐀䌀㘀　㠀㔀㘀㜀㜀䔀㜀㠀䐀䐀㔀㐀㘀㄀㠀㜀㄀　㠀䔀䌀㄀㄀䘀㤀㜀㈀㘀㔀㤀㐀䔀䔀䄀㄀㈀㐀㜀㘀䔀㜀㈀䐀䐀㜀㤀䔀䄀㌀䐀㤀㌀䔀䈀䐀㐀㤀㠀㈀䌀䘀㄀䔀䔀䈀䐀㘀䈀䔀㈀䘀㠀㠀䔀　䘀㐀㘀䔀䔀䐀㌀䈀㈀䐀㘀㈀䌀　㘀䔀䔀䐀䔀䘀㔀䄀㠀㐀㘀㄀㈀㠀㔀㤀䘀䈀㔀㘀㌀䈀䄀䌀㜀䐀䄀㌀㌀䐀䄀㌀㤀䐀䐀㐀䌀㘀㘀㠀䄀䘀䔀㐀㌀䐀䄀㘀䔀䐀㈀㘀䄀䌀㜀䈀䈀䄀䈀㔀㠀㠀㄀㘀㄀㄀　㤀㘀䈀㜀㌀㔀䔀㠀㐀㌀䐀㄀㘀䈀㈀㘀㤀㌀㜀㘀㤀㤀㌀㠀㤀䈀㠀䌀㌀䐀䄀㘀䄀㘀䐀㠀㤀㜀㘀䄀㤀㐀䘀㄀䘀㔀䄀䔀㈀䄀㜀㈀㈀㘀㐀䐀㘀䔀㘀䐀㈀䄀㐀䔀㘀䈀䌀㘀㘀䄀䐀㤀㄀㈀䌀㈀䌀䄀䐀㌀㈀䐀䔀䄀㜀䄀䘀㌀㈀㐀䄀䄀㌀䐀㜀䔀䌀䐀㈀䔀䄀㘀㠀䈀　㌀㘀㈀䘀㠀㈀䈀㠀㐀䈀　䈀㘀㤀㌀㜀㘀䄀㈀㔀　㔀䘀䄀䐀㐀㘀㈀㌀䔀㜀㔀㤀㜀㌀㘀㐀㠀㔀䈀䄀䔀　䐀䐀㐀䘀㐀䔀㔀䘀㈀䔀㌀䌀䈀　䐀㠀㠀䐀㌀㤀㘀䌀䈀㠀䈀㔀䐀㔀䄀㜀䘀㔀䄀䄀䌀㤀䘀䈀䔀㐀䄀㤀䐀㌀㘀㈀䐀䌀㤀㤀㠀㘀㐀㈀䌀䔀䘀䘀䌀䄀㌀䐀㈀䈀㤀㔀䐀䔀㤀䐀䌀䄀㘀㜀㐀㔀䔀䄀㔀㜀㐀㠀䔀㔀　㌀䄀㠀㜀㈀䄀㤀䐀㘀㔀㐀䄀䔀㜀㘀　䄀㔀䈀㌀㐀㠀䔀㤀㈀䌀㔀㐀㌀䄀㠀㌀㐀䄀㘀㜀䈀㘀䐀㈀㤀㤀䄀㄀㌀㠀　䐀　䔀㠀㌀㘀䄀䈀　㄀䄀㈀䌀　㘀㤀㌀䌀㄀㘀　㤀　　䐀䄀㈀㠀㄀㄀㤀䌀　䔀　㠀䌀䌀㐀　䔀㠀㔀㠀㈀㌀䌀㌀䔀㜀㘀䌀䄀㈀䄀㈀䘀㘀㐀㤀㄀䔀㜀䄀㈀㔀䔀㔀㜀㄀㤀䌀䘀㜀㤀㈀㠀䌀䐀㤀㔀　䐀　䐀㠀䌀㠀㈀䐀䘀㜀　䈀㈀䐀　䌀　㄀䄀䄀㘀㠀䌀䌀㐀㠀㘀䘀　䘀䔀䈀㤀䐀　㌀　䌀㜀㄀㜀㌀䔀㌀㔀㈀㔀㄀　㐀㄀㄀㌀㤀㤀㈀䘀㈀㤀㌀　㄀㈀䌀㌀㠀䔀　㘀㘀㠀㤀㠀㌀䄀䐀㈀㄀䈀䄀䔀　㠀㌀㘀㐀㐀㤀㐀䐀㠀䔀㐀㜀　㜀㤀䈀　㈀㄀䄀䌀㐀䌀㤀䌀䐀㄀䐀㠀㠀㔀㜀㠀㐀䈀㄀㌀䘀㔀㠀㘀䐀㤀　㘀㌀㈀　䘀㔀㌀㄀䈀㈀㌀㤀㠀䌀㈀䈀䈀㘀䔀㐀㠀䔀㌀䔀㄀䌀㄀㘀䔀㌀䄀䐀㔀㤀㐀㄀䈀㜀䔀㤀㘀䌀㘀䌀䈀䐀㠀　䐀㌀䘀㘀䈀㘀䄀　㈀䘀㜀㘀㔀䐀㔀䐀䔀㘀䄀䌀㜀㜀　㜀䈀㘀㔀㜀䐀䔀䐀㌀䘀䌀㠀㔀䄀㄀㌀㜀㤀䘀　㈀䌀㜀㠀㠀㌀䔀㜀㐀㄀䌀㌀䌀㐀㌀㔀䈀䈀䔀㤀㤀㐀㄀䈀㜀䈀㄀㐀㘀䐀㤀㠀㐀㈀䌀䐀㈀㤀䐀㐀䔀䌀䔀㐀䌀䐀㐀䔀䐀䔀䘀㐀㘀㘀㠀㐀䔀䘀㘀䌀㤀㠀䐀㈀㄀㠀㜀䔀㌀㐀䄀㌀㈀㤀㔀䌀䌀䌀㈀䈀䈀㄀㠀䌀䄀㘀㠀㘀䘀　䔀䐀㔀㌀㜀䌀㌀㌀㄀䈀㜀㜀䔀㌀㤀㌀䘀㠀㜀㠀㔀䐀䔀䐀㘀䔀㜀䌀㠀㈀㄀㜀㐀䐀㠀䐀䈀䈀㠀㔀㜀䌀㜀䌀䈀㈀㘀䔀㌀㈀䔀䘀㄀㜀䘀㈀㘀䈀㤀䈀㤀䄀㄀䄀䔀㠀㘀㠀㜀㐀㌀䌀㄀㈀䘀䈀㈀㜀㌀㤀䐀䔀㤀㌀䈀䌀㈀　㌀䌀䌀㌀㄀䘀䄀　㤀䄀䔀㌀㐀㄀䈀㔀䔀㄀　䘀㌀䄀㤀䔀㠀㠀㜀㄀䈀䌀㠀　㠀䔀㐀㜀㘀㈀㄀㜀䌀㜀㜀㌀䘀䈀㈀　䄀　䔀㌀　㔀䐀䌀䈀䔀䘀㌀䘀　㌀㈀䘀㄀　㤀㠀䔀㤀㜀䌀㜀　䈀䌀㈀䘀㌀㄀䌀㠀㈀㐀䌀㄀䐀㈀䘀䐀㌀㜀㌀䔀㠀㄀䌀䈀䌀䄀䔀㌀䐀㠀㄀䈀䄀䐀䄀䄀䔀㐀　䔀　䘀㐀䈀䈀䘀㘀䔀㠀㌀㠀㜀䈀䔀㈀䔀䘀　䄀㔀㜀䔀㤀㈀㠀㤀䄀㐀㘀㈀㠀㜀䔀㐀䐀㐀㜀㈀㄀㔀㔀䐀㄀㜀㐀㄀㐀　䐀㤀㤀㠀䔀㔀㈀㜀䘀㄀㘀䄀㔀㈀　㠀㄀㌀㈀䘀　　䌀䌀䄀㐀　㜀䐀㈀㔀　㄀䌀䘀䔀㈀㘀㠀㜀㄀㤀䌀㈀㐀䐀䘀㘀㤀㤀䌀㈀㐀䈀䔀㔀㈀䘀　㤀䘀㠀㈀䘀㤀㈀㌀㠀㌀䌀㄀䈀䄀䌀㔀㔀䌀㔀㘀㈀㘀㌀㘀㜀㘀㄀㤀㘀　㘀㐀㄀㌀㌀㤀㐀䘀䈀䐀㜀㐀䄀䈀㘀䐀䌀㌀䘀㔀㜀㌀㐀䘀㐀䄀㄀㤀䘀䔀㔀　䐀䄀㄀䔀䘀㠀㤀䐀䘀　　㔀㤀㠀㈀㤀㜀䔀㌀　㔀㄀　　㘀䄀　䔀㠀䌀㠀㐀䔀䄀㘀䄀㘀䘀㔀　䄀䐀䌀㈀㐀㈀䐀㤀㄀㈀㤀㘀䄀㤀㐀䈀䄀㄀䌀㐀䈀㄀㠀㜀䘀䄀䈀䐀㔀㜀䄀㔀䔀䐀㄀㄀　㄀䈀㜀䔀䈀䐀㠀㄀㘀䔀䄀㐀䔀㐀䄀　䌀㄀㔀㠀䌀㈀㠀㄀㠀䌀㄀㠀㜀㐀㠀㜀䄀䘀㤀㤀　㤀㔀㐀㜀䈀㈀㠀㤀㈀㄀䔀䘀㔀㔀㐀㌀䘀䐀㘀㤀㜀䈀㜀　㜀䈀㘀㈀㐀㠀䄀㔀㘀䔀㌀䈀䄀䐀㜀㄀　䔀㤀䐀㈀䈀㔀㜀䄀䔀㈀㈀　　㘀䘀䐀䐀䔀㈀䐀䄀㌀㌀䘀䘀㔀㘀㈀㐀㘀　㔀㔀䄀㈀㔀䌀　㤀　䐀䔀㄀䈀䌀㈀㤀　䐀䔀㄀㘀䄀㜀㈀㈀䘀㔀䐀㠀䄀㔀㈀㐀㜀䌀㄀㔀䐀㘀䐀㄀㌀䘀㔀㄀㔀㤀䐀䔀䔀㌀㌀㤀䈀䔀䈀㈀㈀䈀㄀䘀䐀䘀㄀䌀䔀㠀㄀䐀㐀㔀㤀䌀㔀㌀䈀　㔀䔀㄀　䌀䔀㈀㤀㤀㌀䔀䄀㌀㌀㄀㠀㄀㐀㠀䐀䌀䐀㠀㌀㔀㈀㄀㄀䘀㈀㜀㘀㠀㔀㠀㐀䔀㈀㐀㌀㐀　㔀㔀㜀㄀　㈀㤀䈀㐀䐀　䈀㤀㄀䌀㔀䌀䈀㤀㐀㈀䌀䘀㌀㤀䈀㄀㌀䄀㜀㤀㐀㄀㤀　䘀㘀㐀　㠀䄀㤀䔀䈀㘀㐀㄀䄀䄀㤀㠀　㌀㔀䔀㠀　䐀㠀䄀㜀㤀㐀㌀䔀䔀㌀㘀㔀㜀㐀㜀㄀䔀䌀㐀䈀㌀䔀㄀㘀㔀䐀㄀㘀䘀䈀㤀㠀㜀䐀㐀䌀㘀䄀䘀䈀㔀㐀㈀㈀䌀㔀㘀㄀㈀䘀䔀䌀㠀㌀㤀䈀䄀㄀　㜀䈀㘀䐀㄀䐀㌀　㔀㈀䄀㠀䄀㌀　㠀䘀䔀䔀㠀　㌀㜀䐀㄀䘀㌀㌀䌀㜀䌀　䔀㄀䐀䘀　㐀䈀䈀㠀㄀㔀㜀㜀䌀㈀　䄀㔀㠀　䈀㔀䈀䄀㤀䘀䔀　䌀㌀䔀䌀䈀䐀䄀䄀　㄀㤀䐀㘀㠀㄀㠀㜀㘀䔀㠀䈀㈀䘀㐀　㄀㄀　䄀䈀㄀䈀㜀䔀　㜀㄀䈀㠀㄀㈀㤀㌀㐀　　㘀　㜀䈀䌀　㈀㘀䘀䌀　㜀㐀䈀㠀㌀㔀䈀㘀㄀㄀㤀㌀䌀㄀　䌀㈀㤀㜀㐀㘀㌀㔀䌀　䔀䈀䈀㠀㔀㤀㜀㠀㔀㜀㜀㘀㌀㔀䘀㘀㈀㌀䐀㔀䔀㐀䄀㘀㘀㈀㌀㠀䐀䔀䔀㤀䔀㤀㌀㘀㄀㤀㜀䘀　㈀㔀䈀䌀㠀㜀㈀㈀㄀䈀㈀㘀㜀㤀䄀㔀㄀㔀䈀㄀　㈀㤀　䌀　　㠀䈀䘀㠀㘀㌀㜀䐀㠀㔀㠀䄀㈀䐀䈀　䔀㈀䔀㈀㠀䄀㜀㜀䈀䔀㘀㜀㠀㤀㠀㐀㤀㌀㐀㌀䐀㐀䌀䈀㐀䈀䔀　㠀㄀䘀㘀㈀䄀䔀㔀㐀㄀㌀䔀㌀䈀䘀㈀㐀㄀　㠀㈀㈀㤀䈀㐀䘀㈀㄀䄀䈀㠀　㔀䈀㘀䌀　䄀䈀䈀㠀㤀㄀䌀䐀㘀㜀䄀䈀䐀㠀㔀㘀䔀㄀㘀㔀㘀㤀㔀䄀䔀䌀㤀䔀㄀㠀䄀䐀䌀㈀㜀䘀㌀㌀　　㜀㈀䄀　㔀䔀䈀䘀䌀䐀䄀䔀㠀　㤀䘀䌀　㌀䐀䈀㐀㠀䘀䔀㌀㘀㠀䌀㈀㘀㐀㜀䌀㄀䔀㠀䘀　㠀㔀䔀䘀㄀䈀䔀䔀㠀䐀㜀䐀㄀䈀䘀䌀㜀䈀㘀䐀㈀䌀䔀䘀䈀䐀㌀䄀䐀㜀㠀　㐀䐀㐀䐀㄀㤀䐀㜀㜀㄀䐀㄀䌀㠀　䐀㜀䔀　㜀䐀㌀㠀　㈀䐀䘀䔀㈀㌀㐀㔀䌀䌀　㠀㈀㘀䌀䄀䄀䐀　㈀㘀㐀䄀䔀㈀䌀㈀㤀㠀㌀䈀䈀㘀㤀㌀㘀㠀䌀䔀㠀　㘀㈀㌀㈀㜀㈀㘀㌀䔀㠀䈀䔀㌀䌀　䐀㔀䄀䔀㄀　䄀䈀㠀㤀䄀㌀㠀㜀㘀㌀䘀㜀㐀䈀㄀㈀䐀䌀㈀䌀䐀䐀㄀　㌀䐀㄀㘀䘀䘀㠀䔀䘀㄀㔀䐀　㔀㌀㐀　㔀㐀㤀㜀䌀㌀㄀　䐀䄀㜀䘀㌀㌀䘀㄀䔀䄀　䐀䘀㠀　　䔀䐀㤀㠀㠀㈀䐀㤀䐀㠀㄀䘀㐀㜀䔀㌀㄀㐀㔀䌀㠀䌀㤀䈀䘀㄀㜀䈀䄀㘀䈀　㐀䄀㜀㘀　䐀䐀䈀䌀䄀䈀䔀㄀㄀㈀㐀㈀㄀㤀㜀㤀䔀㌀㈀㘀㄀㠀䈀䘀　㤀㐀䘀　㤀㄀㜀　㔀　䘀㠀㐀䄀㄀䌀㈀䐀䄀䔀㄀㘀㌀䘀㤀㄀䌀䐀䈀㄀䐀䌀㔀㠀㐀㌀㘀䌀㔀㄀㘀䌀㜀㔀㘀䌀㔀㌀㘀䌀㔀䘀䔀䌀䈀䘀㠀㠀䄀㜀㄀䄀䔀㐀䐀㈀㤀䐀䈀䈀㤀㤀䈀㠀㜀㄀㄀㄀䐀䐀䈀㤀䐀䈀㘀㠀㐀䘀䐀㜀䌀　㜀㔀䈀　㠀㄀㐀䔀䔀䈀㌀䔀㜀䄀䔀䔀㠀㜀㐀䐀䘀　㄀　䔀䌀㠀㈀　㠀㤀　䌀㈀䌀㌀䐀䈀㜀　㄀　䘀䔀　䈀䈀䔀㠀㘀㘀䘀䐀　㠀䄀䌀㔀㌀㠀㄀㐀䄀䈀㜀　　㄀㈀䔀䌀㄀䐀㔀㘀㐀㠀䘀㤀䔀䌀㈀䄀㜀䘀㄀㌀㜀䘀㠀㌀䈀䐀㘀䌀㈀㘀㘀䈀㌀㔀䘀䈀㈀㌀㜀㠀㐀㠀　䐀　㐀䌀㘀䈀㘀䘀㈀㔀䔀㔀䄀㠀㄀㔀㈀㜀㠀䄀㈀䈀䌀㐀䐀䘀㐀㔀㈀㄀㔀䄀㄀㄀䈀䐀㌀㤀䐀䄀㄀㔀㜀䐀㌀㌀㘀㘀㠀䐀㜀㔀䌀㜀㔀䔀㠀䄀㄀䐀㠀䐀䘀㔀㄀㈀㌀㜀㌀㔀䔀㈀㜀㤀㌀㘀㜀㄀䈀㐀㠀　㘀䔀䘀䌀䘀㌀㘀㤀䔀㔀㄀䈀䔀　㔀㘀䈀㠀㤀䈀㔀㘀㜀䌀　䌀㜀㘀㐀　㤀㠀㤀䔀㌀䐀䘀　㈀㄀䘀䌀㄀㄀䘀䔀㐀㈀㤀䌀㌀㌀䐀㈀䄀㌀䄀㈀㄀㌀㌀䐀㤀㠀㠀㔀　㌀䈀　　　　䈀䈀㄀　䌀㈀㜀䔀㈀㈀㐀㘀䌀䌀㘀㠀㔀䈀㠀㄀㈀䐀㜀䔀　䈀㔀㜀㠀　䈀㜀㘀䔀㈀䐀䐀㜀㠀㄀䘀㠀㘀䈀㄀㠀㜀䄀㠀㜀㤀　䔀㔀䘀䌀㐀　䘀䘀　㌀㌀䘀䌀㈀䈀㜀䔀㐀䐀㤀䌀䔀㄀㌀䘀　㌀㘀㄀㘀㘀㌀㘀䄀㘀䈀㄀㜀䔀㈀䌀㤀䘀㄀㔀䈀　㠀㄀㘀䌀㌀䌀㔀䈀䌀㠀䐀㘀䈀㌀㐀䔀䘀㘀㌀㠀㜀䈀㠀䄀䔀䐀䄀㔀䔀㜀㈀䐀䘀㘀　䔀㜀䈀㠀䘀㜀䐀䌀㠀㠀䔀䈀　䄀䘀䐀㠀䐀䘀　㔀䈀䈀䔀　䄀㐀䄀㜀㤀䘀㤀　㈀㌀㠀䌀㄀㘀䌀㘀　㠀㌀㌀㠀㔀㘀㔀䌀㈀㘀䄀㘀㄀㠀䐀㜀　㤀㔀䘀　㄀㠀䘀㄀䘀㌀㌀㔀䔀㄀㤀　㈀㠀䐀㈀䘀㤀䐀㤀䌀㐀㔀䌀㌀㄀㔀䘀䈀䌀㔀䔀㜀䌀㐀㠀䐀䌀㈀㄀䘀䔀㐀㘀䘀䌀㐀㈀䘀䌀䈀䈀㘀㐀㤀㘀㘀䔀㤀㄀㘀䔀㤀㜀㜀䔀㈀㄀㄀䐀㤀㄀㠀䔀䌀㠀㈀　䄀䈀䘀㈀㌀　㜀㤀䄀㈀䈀䌀㐀㠀䘀䔀䈀㤀㄀䌀㤀㄀䐀䘀㔀㜀　㐀㘀㔀㤀㈀䈀㈀㐀　䈀㤀㐀䄀䈀㤀㔀䄀䈀㤀㔀㘀䐀㤀㐀㔀㔀䔀㌀　㘀　㜀㠀㄀䌀䈀䄀㐀㤀㌀䈀䈀䄀㘀㠀䄀㜀䔀㜀　　㤀䈀　㤀　䘀䌀㈀䐀䈀䘀㠀㄀䌀䘀䌀　㤀䈀㜀　㤀㐀䔀䘀㘀㄀㠀㐀䔀㘀㐀　䘀䔀㌀㤀䐀㘀㠀㄀㔀䈀䌀㜀　㠀㤀㜀　㈀䘀䘀䔀㔀㘀㘀䄀㠀　㄀䈀㔀㤀㄀㔀　䈀䔀㌀㌀㠀䔀㘀㄀㘀䘀䔀㠀㘀㤀㜀䔀㄀㘀㔀䔀　㄀㈀㄀䔀䌀㄀㄀㌀㜀　　㈀㜀㘀㔀㄀㐀　䘀䌀㄀䔀　㘀䌀㔀㠀㜀㜀㄀㌀㌀䔀䌀㈀㔀㐀䐀䈀䄀㤀㤀㔀䐀䌀㈀㔀㘀㠀䈀㌀㘀䈀䌀㔀　㜀䌀㐀㐀䔀䌀䌀㔀㤀㔀䔀㈀䔀䘀㐀㐀㠀㄀㄀䐀㠀㘀㘀䐀䔀䌀㐀䈀䈀䔀㠀䔀䔀䌀㄀㐀㄀䘀䄀㘀䐀㔀䘀㠀䔀䘀㜀䐀㈀䌀䌀㔀䔀㄀㔀㐀㔀䈀　㠀㐀䈀䔀㄀　㄀䔀㘀㠀㐀䐀㜀㈀㠀䈀䄀䈀䈀　㄀䐀䄀䔀㄀㔀㜀䘀　㠀　㘀䌀㘀㐀㤀䐀㜀㐀䔀䔀㄀䈀㈀㄀㠀㜀㠀䐀㠀㘀䌀㄀㜀㠀　㄀㌀䘀㄀䈀㜀㘀㄀䌀䈀䔀㈀　䔀䐀䈀　㘀㌀㌀㔀㔀䌀㐀䌀㜀䄀䐀㈀㠀䈀㔀䈀䄀㐀㤀㔀䔀䌀㐀㄀㔀䌀㈀䈀㜀䌀䌀㘀㈀䌀㌀　㄀䐀㜀䈀䐀㤀㐀㄀㄀䌀㈀䄀䄀䐀㠀㐀　㔀䔀㐀䐀㤀䄀䘀䌀㄀㄀䔀㌀㘀㔀䔀㜀㠀　䐀　䘀㤀㌀䔀㘀䔀䐀㈀㔀㜀㤀㘀㤀䌀　㐀㔀䄀䌀㄀㈀䔀㜀㐀　㈀䘀㜀䌀㠀㈀䈀䘀䌀㐀㐀䘀䐀㠀㌀㐀㄀㠀䌀㜀䄀䔀㠀㌀㈀䐀䔀㈀㐀㈀䔀㤀㄀䐀䘀䌀　㠀㠀㌀㌀㠀㔀䔀㔀䄀㐀㐀䘀㈀　㜀䔀㈀㈀㄀䔀㄀　㈀㘀㄀　㄀㐀䈀㘀㘀䌀䘀䘀䌀䈀㜀㠀䘀㌀㄀㌀䈀㘀　㈀㜀㘀㤀䌀㈀㄀䈀㌀　㔀㘀㜀㠀㄀㤀㘀㘀䔀㈀㘀䐀䄀㐀䘀䐀㘀䘀䈀　㈀　㔀䌀䌀　㤀㘀䌀㄀䘀䐀䌀㈀䈀㌀䘀㠀㄀㜀䐀㠀㠀㤀㔀㜀㠀㠀　䈀㠀㔀㐀㔀㐀㐀䔀㔀㘀䄀㈀㘀䔀㈀㜀㔀䄀㐀　䈀㠀䘀㐀㌀㠀䘀㌀　㔀䄀㌀㐀䌀㌀㐀㠀䐀㠀㈀㤀䔀䌀㠀㐀䔀㜀㜀　䈀䈀䘀　　㜀　䌀䌀㈀　䔀㜀㄀㌀㔀㔀䔀㠀䄀䈀㜀䌀㜀䔀䄀㜀䄀㔀䈀䔀　䄀㐀䈀䌀㐀䐀㜀䌀㔀㈀䔀㠀㤀㈀䌀䄀䌀㐀䘀㐀䐀㠀䄀䈀䐀㄀㌀䘀䔀㈀㐀㌀䘀㠀㔀㘀㘀䌀　䘀䘀䈀　䄀䌀䄀㘀㌀䄀䘀　䄀䐀㌀䄀㈀　䈀䘀㄀㌀䔀㌀㄀㠀㔀䘀㐀䘀㈀　䄀䐀㈀䐀䔀䔀㔀䌀㐀㈀㄀㌀㌀㌀䌀㐀㘀䘀㌀䔀䘀㈀㌀㠀䈀䈀㄀　䐀　䌀㔀㐀䌀䈀㈀㘀㜀䐀䈀䌀㠀㔀䔀㐀䐀㔀㐀㔀䈀㘀䌀䐀㐀㠀㔀䄀㔀䔀㐀䘀㤀㘀㘀䈀㈀䌀㔀䌀㠀㐀㔀䘀㤀㌀䌀㘀㔀䌀㐀㜀㔀䌀㈀䄀䌀㌀㔀䌀㄀㠀䌀䘀䘀䄀䌀㄀㈀㔀㘀䌀㠀㐀䔀㈀㤀㌀㤀䐀　　㐀䄀㜀䘀㜀㠀㌀㐀䌀㘀㌀㔀䘀㤀㔀㈀㄀㠀㠀　㄀䘀㠀㠀䐀䈀䌀㤀㌀䔀䔀䌀㄀㄀䐀䈀䌀㔀䔀䈀䌀㐀㔀㌀䘀䌀䘀　䘀㤀䌀䐀㔀㐀䄀㈀㠀㜀㜀㘀䄀㤀䌀　㤀㠀㈀䔀㠀㘀䌀䘀㤀　䄀㌀㤀㐀㐀㄀㘀㄀䔀㔀䐀䐀㈀　㠀㤀㄀㄀㄀䌀䈀㠀㔀㌀　　㤀㌀䌀㈀㈀䈀㐀䘀㈀㄀䄀㐀㄀㠀㘀㐀㠀㤀㠀䘀㌀㌀㄀　䈀　䄀㘀䌀㜀㌀㠀䔀㌀㌀㤀㜀㈀㘀　䄀㜀䄀䄀㜀䄀䄀䈀䌀㘀䄀䈀㈀㜀䄀䄀䌀㘀䘀㔀㔀㘀㐀㄀㌀㔀䐀㔀䐀㔀㄀䘀㈀㠀㄀䈀㔀㐀䔀㐀䈀㜀䘀䈀䔀䐀䐀㤀㤀㐀㔀㄀㤀㐀　㔀㌀䘀䘀㠀㠀㐀䘀䐀㌀䘀㠀㐀㈀㐀䘀㠀㄀䔀㜀䌀䔀㈀㜀䔀䘀䔀䐀㔀㜀㈀　㔀㘀㔀㤀㜀㤀㈀　䐀䔀㜀㔀㘀㜀㈀㔀㘀䌀㠀䄀䘀䄀㄀䌀㘀㌀㐀㐀㄀㄀㌀䌀㔀　䄀㤀㈀㄀䌀㈀㘀㌀㌀䄀㌀㈀　　䄀㄀㐀䘀䐀㄀䄀䔀䄀㘀㐀㄀　㄀㠀䌀㠀㈀㘀㈀㤀㠀㈀㜀䘀　䈀䈀㤀㐀㤀㠀㈀㠀㐀㜀㘀㘀㌀㄀䐀㘀䈀㈀䘀㤀㐀㈀㜀䌀㠀䈀㌀㘀㐀㐀㄀㐀䔀㌀㄀　䐀䐀㤀䔀　　䐀䐀㈀䐀䄀㈀䐀䔀㌀　䔀䘀㜀㄀䔀㜀㘀㔀㐀㄀㘀㄀䔀㈀㌀㤀㜀㔀䄀㔀㔀䄀㠀㄀䔀㐀㌀㐀㜀䄀㔀䐀䐀㔀㄀䄀㤀㈀㠀㠀㌀㠀䄀䈀　䄀㔀㈀㔀㠀䐀㤀㔀㤀㠀㔀㤀㜀㤀㠀㤀㜀㈀㘀㐀㔀㤀䘀㔀㠀㜀䈀㔀䔀䘀䘀䌀㌀㤀䘀㠀㜀䄀㄀　㤀㜀　䈀䔀㤀㤀㠀㄀䘀㜀䐀䔀㘀㠀㜀䐀䔀䔀㠀㈀䐀㘀䘀䈀䌀　㄀䈀㄀㄀㠀䈀䄀㠀㐀㄀䔀㠀㄀䐀㌀㤀㌀　㌀㈀㘀㌀䈀䄀　　㈀㈀㘀䔀㐀㔀䘀㌀䈀㔀䐀㌀䐀㠀㠀㌀㈀㐀㐀䈀　䔀㄀䔀㤀䐀㄀䘀䐀䘀㔀䔀䘀䄀䐀　㌀㈀　㠀㠀㌀䌀㠀䄀㐀㐀㔀㄀䔀㠀㘀㄀　䔀㤀䐀䘀䔀䘀㘀㔀　㔀㔀　㠀䈀㘀㐀䄀䄀䌀㐀䐀㐀㈀㐀㤀㐀㐀㄀㄀䄀㔀㔀䌀㠀㘀㔀㠀㈀䈀　䄀㐀䔀㔀㄀㄀㐀㈀㐀㘀㐀㤀㐀㠀㌀㠀㠀　䄀㄀㌀㘀䘀㄀㔀䈀　㤀㌀䔀㔀㠀㈀䘀㐀㠀䔀㈀　䔀㐀㄀㈀䘀㜀㜀㘀㈀㤀㤀　㈀㈀䌀䘀䈀㠀㤀䔀㔀㌀㜀䘀㜀㠀㤀䌀㜀䄀㄀㠀䄀䄀㠀㌀㔀㔀䄀　䘀㘀㔀㘀　㔀䐀㔀䌀㌀䔀䄀㌀㄀㈀　䐀䄀㈀䈀䐀㄀䔀䔀䘀　㔀㐀䄀䔀䈀㜀　䔀　䌀㐀䄀㔀㜀䄀䄀　㜀㠀㈀㜀㘀䈀䐀䄀㌀㤀㈀䔀䘀䄀㜀㄀䐀㤀㌀㘀㤀㌀㌀　㈀㠀䄀㤀㘀䐀㈀㌀㜀　㜀㈀䘀㄀㘀㜀䄀䐀　㜀㄀䘀㈀㘀㐀䘀㐀㐀䈀䘀䐀㔀㘀㄀㌀㘀㄀㐀䘀䈀　䄀㔀㜀㐀㠀䔀䈀䔀㤀　㠀䄀㤀㜀　㌀䐀䈀㈀㄀䐀䌀㈀㌀䔀㄀　䔀㐀㠀㄀㄀㈀䘀㄀䈀䄀㤀㜀㌀㘀㤀䐀䌀㘀㄀䘀㔀䐀㐀㘀㄀㈀㠀㌀䌀㌀㘀䄀㠀㈀㠀䈀㤀䐀䌀䄀䘀䌀䌀䌀䄀㘀㄀䈀㤀䐀㤀㄀㠀㜀㤀㠀䄀㄀䌀㈀㜀䔀㌀䈀䘀䐀㔀㈀㈀㄀䔀䄀㜀䘀䐀㈀㠀㘀　㠀㔀䌀䐀䄀㄀㜀䄀㠀㌀㈀䌀㌀㌀䐀㤀㘀　㔀　㈀㐀䄀㌀䌀㤀㈀㈀䌀䄀　㘀䄀䈀䌀㔀䄀㈀䌀㠀　㘀㤀䈀㘀㐀㔀㐀㈀䐀㜀㜀㔀㤀㤀　䘀㤀㐀㠀㘀㐀㌀㈀㄀㔀㠀䈀㔀㌀㔀㄀㈀䌀䌀䌀㈀㈀㠀䄀㤀㤀　㈀㜀㌀　䄀　㈀㐀㌀䌀㔀㐀㘀䌀䄀㈀䔀䄀㠀㤀㘀䔀䘀䔀㤀㤀㘀㘀䐀㌀㐀䘀㠀㈀㔀㌀㤀㠀㈀䌀䘀㠀㐀䄀䌀㠀䄀㐀㈀㈀䌀㄀　䌀　㘀　㜀㤀䌀㐀㜀㘀䐀䐀䈀㔀䐀䔀㘀　㠀䄀㜀䄀　㈀䈀䌀䐀㔀㔀㔀㈀䄀㜀䘀㐀䔀㤀　㤀䌀㔀㐀㔀㜀㄀䐀㐀㌀䈀䈀䄀㜀㤀㈀䘀㘀䈀㜀㜀䔀㘀　㜀　䘀䐀㤀㔀　㜀䐀㘀　䘀䘀㐀　㘀䘀㔀　䐀㄀㌀　䈀䔀㠀䐀䘀㜀䄀䐀㔀㜀䄀㐀　㌀䄀㜀　㘀　䈀䐀㤀䔀㈀䈀㘀䄀䐀㔀㜀䄀䘀㔀䌀　䄀　䄀㈀　　㤀㘀㈀㐀　㜀　㐀䈀䘀㠀　㜀䔀㈀㄀䄀㜀䈀䘀䄀䌀　䌀㄀　䄀䄀㌀䘀䘀䐀䘀䄀䈀㤀㔀㄀䈀䐀㌀䈀䈀䔀䌀　㘀䄀㌀䌀㔀㈀䔀㤀㌀㜀㄀㐀䈀㜀㐀䄀㜀䈀䈀䔀䄀䈀䌀㜀㘀䐀䐀㄀㘀㘀㌀㘀　䌀䐀䈀㌀䔀䈀䌀䔀䐀䄀䄀㈀㜀㠀㠀㌀䈀㜀䈀㘀㈀㤀䘀㐀䄀䔀䘀㐀㤀㘀䘀㤀㌀䈀㜀䐀䔀䐀㐀㜀㌀䄀㜀　㄀㤀㌀䔀㤀㐀㈀䐀　㘀㌀䈀㌀㤀㜀䔀䄀㄀㜀　㌀䄀䈀䐀㔀㔀䔀䄀䄀䘀䄀㔀㐀㜀䈀䄀㤀䐀䐀㤀㜀㘀㐀㈀䘀䘀㔀䘀㈀䄀䔀㐀㄀㘀㘀㜀䈀䄀㤀䔀㠀㜀㔀㜀䄀㔀㤀㠀䔀䈀㌀㔀䄀䄀䐀㄀㜀㔀㘀䄀䈀䄀㈀㘀䄀㜀㔀䈀䄀㔀䐀㈀㤀䄀䄀䌀㌀㔀㘀㘀㤀䈀䐀䌀䐀㠀䌀㤀㔀㤀䐀䘀䌀䈀㈀㈀　㌀䄀　䄀䌀䌀㐀㈀㐀䄀㠀㄀㘀㠀㠀㐀䌀䈀㠀㤀䘀㤀䈀㌀㐀㌀㐀䔀䐀䈀䔀㔀㔀㘀㜀㜀㔀䔀㤀㄀㠀㈀㠀㔀　䄀㈀䄀䄀㔀䔀㤀䐀㘀㤀䄀㠀䌀䐀㈀㄀䄀䌀䔀䘀䄀㐀䘀㐀㠀㐀㐀䐀䈀䌀㜀㄀䐀㔀㌀㠀䘀㤀䐀㈀　　㤀㌀䐀㔀㘀㜀䐀㠀䌀㐀㐀䈀㔀䔀㔀䈀　䐀䄀㜀䈀䌀㈀㐀䔀㜀䈀㈀㐀㔀㤀㠀䐀㄀䘀㘀䌀㠀䈀㄀䔀　䄀㐀㄀　䈀㜀䄀㘀㐀　㠀䘀㠀䌀　䄀䔀㈀㘀㤀㜀䘀㤀㠀䈀㐀㔀㠀䘀㤀㈀㤀㌀㄀㌀䘀　㈀㤀䈀㈀䐀䐀䔀㤀㈀䔀㈀㤀㈀䔀㄀㌀䐀䘀䘀䔀䐀㔀䌀䌀䔀㠀䔀㘀　䘀䄀㌀㈀㜀䄀㌀㈀䘀㜀䐀䘀㤀　䔀　䔀䘀䐀　䈀䘀䄀㌀䐀㐀䘀㘀㜀㌀䌀䈀㔀㌀㄀䘀䄀䈀㜀㘀䐀㤀䐀㜀䘀䔀䄀䘀䔀䌀㔀㈀㤀㈀㘀䄀㘀㐀㔀䄀㌀㌀䘀㔀　㔀䌀㔀㈀㠀㐀㌀㜀䄀㌀䘀　䔀㤀㜀㜀㘀䘀䐀䈀㌀㜀䐀䐀㜀䘀䘀䌀䌀䐀䔀㠀㤀㄀㠀䘀䈀䘀䘀䌀㌀㔀䐀㜀䈀䄀㄀㤀䄀㐀䔀㤀䐀䐀㜀㐀䌀䄀㌀㘀䘀　䌀㄀㘀䐀䄀㄀㌀㄀㄀䔀㄀䘀㘀䐀㌀㈀㤀䐀㘀㜀䔀　䘀㐀㌀㤀㠀䈀㤀䌀㘀㄀㈀㜀㔀㤀㘀䔀㤀䈀㠀䘀䐀㄀㔀䐀㌀㔀㔀䐀䌀㌀䈀㐀㜀㐀䌀䐀㔀㜀㠀㠀㠀㔀㌀䔀㘀㔀㤀㐀㠀㐀㌀䔀㔀㔀䌀䐀　㐀㈀㐀㔀㌀㠀㈀㤀䄀䌀䘀㠀䘀㤀㠀䌀䈀㔀㠀㜀㈀䄀㔀䔀䄀䌀䘀䈀㔀㠀㄀㈀㄀㌀㔀䌀䘀㌀　䄀㤀㤀䘀㄀䄀㐀㄀㈀㔀㘀㐀䈀㜀㐀㄀㈀㄀䄀䐀㔀㄀䔀䘀㘀䘀㐀㌀㐀㐀㄀㔀䔀䄀㈀㜀㜀㤀㠀㌀㠀㔀䌀㄀䄀䄀㄀㘀䐀㐀䐀㔀䘀㌀䐀㠀㜀㠀䘀㔀䐀㐀㌀㠀䐀䄀㜀䈀㔀㔀䈀　㄀㜀　䔀㤀㌀䄀䌀䄀䈀䈀䐀㔀　㈀㔀䐀㄀㠀㤀㔀䘀䌀㤀䌀䘀㤀㌀䈀㘀䐀䌀䐀㈀䐀㈀㄀䔀　䌀㤀㘀䄀　䈀䘀䐀㠀㤀㌀䌀㤀㔀䌀㐀䔀㈀㘀䌀䈀㠀䄀㄀䌀䌀㠀㈀䔀㈀㤀㈀䔀㈀䘀䔀㌀㐀䘀䐀㤀䔀　䐀㈀㤀䌀䘀䔀㌀㤀　㄀䘀䘀　䌀㌀㈀䔀㠀㜀䈀㌀㘀㐀䐀㔀䐀䘀䐀䔀㠀䘀㐀㐀䈀㤀䔀㜀㠀䘀㘀㤀䄀㌀㤀㄀䈀䄀㌀䔀䘀㜀䔀㜀㘀䘀䘀䐀䄀䈀㄀㘀㔀䄀㌀㠀㘀㠀䌀㤀䐀㜀㄀㐀㔀䔀䈀䄀㠀㌀䈀䄀㌀䈀䐀䐀㈀㄀䔀㠀䘀䈀㘀䔀㤀䌀䈀㌀䈀䈀䄀䄀㈀㄀䘀㜀䐀㜀㐀㘀㔀䄀㘀㘀㜀㔀䈀㠀㘀㈀㌀㔀　㌀　㘀㘀䌀䔀䘀㜀㤀䈀䈀䈀䘀㜀㘀㤀㄀䔀㌀䄀䄀䐀㤀㜀㘀㈀㤀䘀䌀䄀㜀䔀㤀㈀　　㄀䘀䈀䌀㐀䔀䈀㜀　䐀㌀䄀㘀㌀㌀䈀㄀䐀䘀䈀㈀㠀　䐀㌀㌀䘀㌀䄀㠀㜀㐀䘀㤀䄀䌀䘀䄀䌀㤀㜀䘀䐀㘀䌀㌀㜀㤀䌀㈀㈀㔀㘀　　㐀㔀㔀䌀䌀䌀䔀㌀㐀䄀㜀㌀㌀㜀䐀䄀㠀䄀䈀㔀䔀㤀㔀　　䘀䈀䄀㔀　䄀㄀䄀㘀㐀䔀㐀䘀䄀㌀㐀㈀䐀㈀㄀䘀㄀㔀䄀㘀㘀㜀㈀䄀㔀䔀㌀㌀㘀䄀䈀㈀䘀㄀㜀䘀䌀㈀䌀㤀㜀㈀䌀㠀㔀䈀䈀䌀　㈀䄀㘀㐀㄀㐀䌀㠀䌀㘀䔀㐀㌀䌀　㜀㌀㌀㌀㈀㔀㔀㠀㠀䔀　䘀　㤀　䄀㜀㔀䘀㘀䄀㔀䔀㤀㄀　㤀　䈀㐀䐀㘀㠀㈀䄀㄀㔀䘀䌀䈀㤀䐀㐀㈀䈀䘀㠀㐀䐀䄀㔀䌀㐀㄀䈀㌀䐀䘀　　䘀㤀㈀䌀㈀䔀䘀䌀㜀䘀㄀㜀㄀䔀㄀㌀㠀䌀㔀㔀䈀䔀䘀䔀　㄀㤀　㤀㈀㄀㠀䈀䐀　䄀䈀㔀䈀㠀㔀䌀㌀㠀㘀䘀㔀䄀㜀䌀䐀㐀　䐀䌀㌀　㔀㐀䔀䄀䘀㈀㄀㈀㤀㜀㤀㘀㈀　㤀㘀䘀䈀　㔀㔀㤀　䌀䘀㠀䘀䄀䔀㜀䐀㠀㔀㔀㐀㜀㔀㘀㐀㤀䈀㄀䐀䈀䄀䐀㠀䈀㐀䌀㌀䘀㤀㄀㄀㠀㐀㤀㈀㈀㔀㌀㤀䔀㈀䌀㠀䌀　䄀䈀　㘀䈀䄀䘀㔀䌀㄀㌀㜀䐀䘀㔀䌀䔀䔀㠀䘀䔀　㜀㘀䔀䘀㠀　䈀䌀䔀㜀䐀䘀䘀䈀䔀㘀䘀䄀䘀䌀䘀䐀㠀䄀䘀䈀䐀㜀　䘀㜀䄀㘀䔀㠀䐀㄀㠀㜀㌀䔀䐀㠀䈀䘀䔀䘀㠀䘀㈀㌀䐀㤀䌀㠀㘀䐀䈀䐀㠀䘀㠀䐀㘀䐀㜀䐀㜀䔀　䈀　㈀㄀䄀䈀　䔀䈀㌀㜀䔀䐀䌀䘀䘀䔀䌀㈀㜀㔀䐀㜀㠀㌀㐀䘀㐀㐀䈀㜀䘀䌀䔀㤀䄀㌀㠀䘀䄀䘀䌀㈀䄀㄀䘀䌀㘀㈀䈀䌀㠀䄀　㐀䔀㠀㄀㈀㤀㈀㄀䐀　㄀䔀䔀　㠀㄀㤀㔀㔀㠀㤀㈀㈀䄀㌀㘀䄀㠀㤀㐀㤀㄀㐀䔀㄀䘀㜀䔀㐀䔀㐀㤀㔀䔀䄀䄀㔀㌀㜀䄀　㤀㜀䄀㄀䘀䔀㐀䔀㔀㜀㈀㤀㄀㌀㠀㐀㠀㐀䌀　㄀　㘀㜀㤀㠀㤀　　䈀　㘀㐀㘀㐀㘀㔀䐀䐀㠀　䌀㐀㘀㈀㐀㤀䘀㄀㔀㜀㈀　㐀䄀䄀　㄀㌀㠀䄀䔀㌀䐀䈀㔀㔀䘀䄀㤀㐀䄀㘀䘀㜀䘀㐀　䄀㐀㐀㠀　䈀㌀䌀　䘀䐀䌀䌀㔀䔀䘀䈀㜀㔀㔀㄀㠀㔀䌀㌀䈀㔀䔀䘀䐀㈀䈀㘀䐀䌀䐀㔀䈀䌀㠀㔀䈀㠀㔀䌀㄀䈀㔀䔀㌀䐀㐀䄀䘀㜀㠀㠀㌀䔀䄀䈀䄀䄀㔀䄀㐀䈀㐀㔀䔀㐀䄀㐀㠀　䘀㐀䐀㈀　䘀㄀㈀㤀䌀㄀㄀㈀㔀䌀㠀㔀㈀㔀㈀䘀㐀㐀䐀䘀䔀㐀䈀䄀㐀䘀㘀䘀㤀䌀㐀䌀䐀䄀㔀㤀䄀䌀㔀䈀䔀㠀㔀㔀㈀㄀䔀䘀䘀㤀䔀㐀㠀㠀㜀㐀㄀　䘀䌀㠀㜀䈀㠀㜀䔀㐀㔀㐀䔀㘀䐀㐀　㈀㠀㐀䐀䐀㄀㐀㤀䈀䈀㔀䌀㈀㜀㈀䐀㈀䔀䌀㌀㔀　㈀䘀䔀䈀䔀㐀䐀㐀䔀䘀䌀㘀　㄀㜀　　䔀㐀㔀㐀㐀㐀㈀䌀䈀㠀䘀䔀㤀䔀㄀㠀㈀㜀䐀㌀㠀㈀䔀䐀㠀㔀㔀䔀㜀㤀㈀䌀㔀　㤀䘀㈀㈀䈀㤀㌀䈀㄀䘀㠀㐀　㤀㐀㠀㈀䈀䈀　　㔀㄀㜀㔀㜀㐀㄀䈀䔀㜀㘀㌀㌀㌀㜀㤀䈀㄀䔀䘀㠀㠀㈀䔀㈀䘀㄀䈀㄀㜀䄀䄀䐀䔀㤀㐀㠀䄀㘀㔀㐀㈀䈀㤀㔀㈀㘀䔀㈀䌀㔀㌀㐀㜀㈀㤀䄀㌀㠀䌀䘀㔀䔀䄀　㔀㠀䔀㈀㘀㘀㄀㠀㘀㘀㌀㠀㤀䈀　㔀㐀㔀䌀㘀䌀䈀㠀䌀㐀䈀㠀䐀㠀䈀㈀㌀㠀㘀㤀㤀㤀㘀㌀㜀㄀䘀㈀䈀㈀䐀㐀㌀㔀㠀䔀䄀䈀㔀㌀㘀䘀㄀㐀㘀䔀䈀　㜀㜀㌀㠀㄀䔀㜀㄀䈀䌀䔀㜀㌀㠀㤀㠀㤀䄀䈀㘀㈀㤀䘀㔀㘀　㈀䄀䔀䈀㤀㈀䘀㤀䌀㜀䌀　㤀䐀㈀㘀㐀㠀㐀䐀㤀㄀䈀㠀䔀㠀㔀䄀㤀㈀䘀㠀　㤀䈀䌀㄀㔀㐀䄀㈀㔀㔀㤀䈀㘀䄀䄀䔀㘀䘀㐀㔀㈀㔀㜀㠀㠀㌀㈀䌀㤀㘀㔀㄀㔀　　䌀䐀　䔀㌀　㄀㠀䔀㠀㤀㘀㔀䌀㐀䐀㈀㘀䈀㜀㠀䄀䘀䈀㄀㘀㈀䔀㌀䔀䈀䄀㈀䌀䄀㔀䔀䐀　㘀㔀䈀䔀䌀㔀　䈀㜀䐀㔀㈀㜀䔀䘀㠀䐀䔀䐀　㜀㠀㤀㤀㈀㐀㠀㈀㜀㄀㌀㄀　㐀㐀㐀㤀㘀㈀䈀㈀㘀㈀㌀　㐀㠀㤀㘀㈀㐀䄀䈀䐀㔀㘀䌀㔀㌀䔀䐀㜀㘀㘀䈀䈀㈀䐀㌀䔀㔀㜀㈀䈀㠀㌀䐀㔀䔀䄀䘀㘀䈀㠀㌀䐀㔀㘀　䘀㐀㐀㔀㘀㈀䘀㌀㜀䈀㈀㐀㠀㜀䐀䐀㄀㜀䌀㄀䐀䌀䐀　㘀㐀㄀㜀㌀㤀　㘀㈀㘀㐀㤀㤀㤀　䔀㤀㜀䐀㌀㈀㄀㄀㤀㄀䌀㈀䔀　㌀䐀㔀䔀䐀㔀㘀䄀㜀㔀䐀㘀㈀㜀㘀䄀䈀䐀㄀㘀㐀䌀䄀㌀㐀㔀䈀㤀䐀㘀㘀㌀㌀䘀䘀䄀㔀䈀㤀㐀䌀䄀䘀䌀䈀㐀㤀㘀䘀㤀　䐀　䔀䈀㘀䄀㘀㘀㐀㘀䔀䈀䔀㔀㠀㘀㔀䌀㄀㈀　䔀㘀㐀㔀䔀㐀㜀䄀䔀䌀㌀㘀䔀㌀㜀㤀䈀㐀䐀㈀㘀㤀㈀㄀㘀䄀㌀䐀㄀㘀㐀㌀㐀㐀㐀㜀　䐀㔀㔀㌀㄀㈀䘀䘀　䔀䌀㘀㈀㈀㌀㠀㌀㐀㐀㐀㈀䄀　㠀㤀㜀㜀䈀㠀䐀㈀䔀㤀㜀䐀㄀䔀䈀䈀䐀㔀䐀㌀㈀㔀䄀䄀䐀㔀䌀䔀㘀　㘀　㐀㐀䈀䘀㔀䐀㈀㤀㔀䄀䐀㤀㜀䄀㄀㈀䄀䄀䈀㔀䄀㘀䄀㈀䐀㌀㐀㘀䘀㌀㈀䔀䘀㌀　　䈀䌀䈀䌀䌀㔀㜀㤀䈀　䘀㤀䄀　㔀㜀㌀㘀㄀㘀䄀㜀㔀㈀䄀㐀䈀㜀䐀䐀㔀㐀㐀㐀㐀㔀䌀㘀䔀㌀㐀㤀䈀㘀䘀㌀㜀䘀䄀䄀㐀㐀䔀㠀㤀䈀㔀㤀㈀䈀䘀㤀㘀㔀㈀㔀㈀䄀䐀㘀㘀㤀㜀㔀㜀㌀㔀㜀䈀䈀䌀㤀䔀䘀䄀䌀㜀䘀㔀㐀䘀㈀䈀䐀䌀㌀㄀㘀㄀㠀䄀㤀䐀㄀䈀䔀㠀䘀㘀䔀　㔀䄀㜀䔀䔀㈀䌀㄀䈀㔀䘀䘀䌀㔀㜀㌀䘀㔀䔀䈀䘀㘀䈀㔀㘀䄀㐀䈀䘀䈀䘀㌀㤀䌀㘀䈀㈀㤀䐀㐀䄀㤀䌀㘀䌀㜀䘀㘀䌀㜀㄀䈀㄀䌀㈀㔀㐀㔀㌀䐀䌀䌀㤀㔀䘀䄀㤀䌀　䄀㤀㜀㔀㌀㤀㔀㌀㐀㤀㠀㌀㈀䔀䄀㠀　㘀䄀䈀䐀㌀䌀㔀㘀㄀㔀䘀㜀䘀　　㤀㐀㤀㐀㤀㌀㠀䈀䌀䘀㔀　㘀㈀䄀䄀㔀㜀㌀㈀䈀䈀㐀㄀　䘀㜀㜀䔀　㜀䘀䔀䌀㜀　䌀㈀䄀㈀䄀㈀䄀䈀　䄀㈀䄀㈀㠀㤀㘀䌀㐀㄀㜀䈀䌀䈀㜀㈀㤀㈀䈀㜀㘀㐀䈀㜀䄀㜀䄀䌀㤀䌀䌀㐀㈀䔀㤀　㔀䌀㤀㘀㈀䌀㈀䈀㄀㠀䐀　䈀䐀䄀㌀䐀　㠀䌀䌀㔀㔀䘀䐀䐀㤀㄀㘀㄀㄀䌀䈀㘀㤀㄀䈀㄀㤀㌀䐀㄀㌀㜀㤀䘀䈀䘀㜀䈀䘀　䐀䌀䔀䄀㤀㘀䐀䔀㌀䘀㌀䐀㜀䈀䈀䈀䐀㌀㤀㠀䔀㈀㜀䐀㐀㄀䐀䄀䘀㌀䌀㌀㤀㠀㘀㜀㄀䔀䈀䘀䄀㌀㔀㜀䈀㠀䘀㤀䈀䈀㜀䄀䘀㘀䌀䄀㌀㜀㔀㠀䈀㈀䘀㄀䄀㄀㄀䘀㐀㘀　㠀㠀䘀㔀䘀䘀㌀䘀㠀䘀㌀䔀䐀㌀䘀㌀㐀㤀㄀㈀㘀㌀䌀㐀㌀㌀㘀㜀㌀㈀　䐀㤀㐀䌀㤀㔀㘀䔀㐀䐀㜀㜀㠀㘀㔀㈀䘀䈀䈀㌀㔀䌀㌀㌀㔀䈀㤀㌀㜀䌀䈀䐀㤀㌀㜀㤀䈀㤀䐀䈀㌀㠀䔀䈀㐀　㜀㐀㜀㜀㘀䄀㔀㘀㐀䈀㌀㌀䈀㤀䔀㔀䌀䌀䄀㐀　䔀㌀㤀䐀㤀㤀㠀䔀䔀㐀䔀㐀䔀㐀䈀㄀㜀㜀㌀㜀㄀䈀㐀䘀㜀䌀㈀㘀㐀䈀㈀㠀䈀㠀㈀䔀　㈀䄀㐀㠀㌀㈀䄀㘀䔀㘀䌀㤀䘀䌀䈀䌀䈀㈀㈀䄀㐀䄀䘀㔀㌀㈀䄀䐀㤀䘀㔀䔀㠀㘀㌀䌀㘀䔀㐀䘀䔀㤀㌀䄀㄀㤀䔀㔀㐀㤀㜀䔀㜀䈀㔀䔀㄀㄀㤀　㤀㘀㈀㌀㤀㐀䘀䄀䈀㠀㤀㤀㄀䌀㄀䘀䘀㜀㤀䌀䄀㐀㘀㔀䐀䌀䐀䔀㠀䐀㠀䈀㄀䈀䌀㜀䈀㌀䐀䔀䈀㈀　㔀㔀䄀㤀㈀㔀㔀䘀　㤀㌀䈀㜀㜀㐀㈀䄀䈀䄀䐀㌀䔀㠀㤀㜀䌀㔀䌀䄀㤀䐀㘀䔀䔀䔀㈀䄀䌀䈀㄀䌀㠀㌀㐀䈀㔀㤀䄀　㄀䘀㔀䐀䘀　㔀䘀䌀㐀㄀䄀㜀㐀㘀　䐀㌀㠀㔀㈀㌀㜀䔀䐀䐀㜀䔀䔀㜀䘀㘀㜀　䘀㐀䔀　䌀䘀㤀䘀䈀䘀䔀㐀㤀䐀㔀㔀䔀䐀䄀䘀㌀䘀䐀㠀㜀㈀㜀㈀䔀㜀㈀㜀䐀㄀䌀䐀㘀䌀　㄀㘀䔀䌀　㈀㌀䐀㄀㜀䈀䄀㌀䔀䘀䘀䌀䔀㄀䔀㤀㄀䈀㔀䘀㈀䄀㄀䈀䈀䐀㄀䐀　䈀㌀㘀㔀䘀䘀㌀䐀䔀䐀䄀㐀䈀䘀㘀䄀㄀㘀㜀䘀䐀㠀㜀㈀㠀㐀㘀㜀䘀䌀㈀㌀䐀㘀㜀㈀㌀㜀㤀䌀䔀㤀䘀䔀䈀㤀䔀㌀㌀㄀㔀䔀䔀　䐀㔀㔀㘀䌀㄀㜀㄀䘀㐀䔀㘀㘀䘀㤀䌀㤀㐀㌀㤀㈀㔀㜀㈀㜀䐀䘀䔀㠀㄀　䄀䐀㘀䄀䄀䄀㈀䐀㔀㤀䈀㔀䄀䄀䄀䔀䈀㐀㘀㐀㘀㘀㐀䘀䈀㔀䐀㤀㄀㈀䄀㘀䌀㘀䄀䔀䘀䄀㐀㤀㜀㄀㈀　㈀㔀㤀㔀䌀䌀㌀䔀㌀㈀㄀䈀㐀㤀㜀㔀㘀䄀　㐀䘀㜀㠀㔀䘀䄀䈀㤀䘀㈀　䄀䔀㔀㘀䄀䈀䄀䄀㔀䈀㔀䌀䄀㘀䐀䘀㈀㌀䄀㔀㤀㤀㘀㄀㜀㤀㌀䈀㌀㔀䐀㠀㤀　䌀䐀㔀㠀㐀　㌀㔀䐀㐀䌀㠀䔀䈀㌀㈀㔀䔀䔀㌀㤀㐀䘀䈀㔀㠀䌀䔀䈀䘀䐀㈀㐀㘀䔀䘀㄀㜀㐀　㌀㐀㌀㘀㈀㐀㤀㌀㄀㔀㌀䌀㈀㜀㄀㜀㈀㈀㄀䐀㈀㄀㔀䐀㠀㔀䔀䄀㤀㔀㐀㔀㔀㜀㄀㤀䔀㐀　　䈀㜀㜀䄀㄀㘀䔀䈀㜀䌀䈀㘀㤀㘀㔀䌀㐀　䈀䈀䘀㤀　䔀䌀㈀䘀䐀㘀䈀䐀㈀㜀㌀㤀䌀䘀㐀㘀㈀䌀㘀㄀䘀㌀㌀㘀㘀䐀㔀䄀㌀㐀䄀㘀㜀䐀䔀㔀䌀㠀㤀䘀㜀㔀㐀㘀㘀䘀䈀䐀㘀㈀㄀㌀䐀㘀䔀䌀　䐀㔀䘀㔀䌀䈀㄀䔀　䐀㘀䔀㠀　㘀㘀㤀䌀䘀　㔀㔀䐀㤀㜀䌀䔀䐀㠀䈀䈀㜀㘀䈀㠀䌀䐀䐀䘀䘀䈀　㐀䘀䈀䘀䈀䄀㐀㘀䐀㈀䐀䄀㌀㘀㜀　㐀㠀㤀㤀㐀㔀㘀䐀䄀䘀㔀䈀䈀䈀㐀㘀䈀　䘀㘀㐀䌀㄀䘀㄀䐀　㌀㔀㜀䔀㄀䔀㈀㈀㘀㔀䘀㠀㈀䌀䘀㘀䐀㈀　䈀䌀䐀䌀㠀㘀䐀㠀㈀䔀䄀㜀　䐀㠀䐀䌀䐀䔀㈀䌀㐀䘀㤀䄀䐀㜀㤀䐀㘀䌀㤀㐀䈀㐀䔀䌀㘀㐀㜀㜀㤀㘀䌀㜀㤀㌀䐀㠀䈀䐀㠀㌀䘀㠀㘀　㌀㔀㌀䈀　㤀䌀䈀㘀㄀㌀㌀　䈀䐀㤀䐀㘀㄀䌀䌀䐀䔀䌀䘀　㄀㠀㜀䘀䔀䄀㐀䔀㘀䈀䘀㔀䘀䄀㠀㤀㐀㈀㄀㜀　㐀䈀㈀㜀㐀䈀䔀㜀㠀㘀䌀䈀㤀㌀㘀䔀㈀㤀㈀㈀㄀㈀䈀䌀䈀䔀㠀䘀㄀㤀䌀㌀㘀䌀㈀㘀㐀㈀㔀㤀䔀䌀䄀㌀㘀㘀䄀㜀㤀㌀䔀䈀㤀㠀㠀　㈀䐀㄀㤀䄀㄀䌀㘀䔀㠀䌀㌀㜀䐀㘀䌀㐀㈀䐀㌀㄀㜀㄀㠀㔀　㐀㠀㈀㜀㐀䔀䔀䔀䈀䈀㌀䔀㘀䘀㠀㄀䌀䔀䘀㜀　㐀㘀䐀㜀㐀䔀䘀㌀㠀䈀䘀䌀䄀㜀㜀䄀㈀㐀䔀㄀㌀㜀㜀㤀㐀㠀㌀䐀㌀　㘀㠀䔀㔀㘀䄀㈀㘀䌀㔀䘀㔀　䔀㄀䌀䘀㄀㐀㠀㤀䈀㌀㠀䌀㠀㤀㔀㠀䄀䄀㜀䈀㠀㘀䘀㌀䐀䌀䐀㐀㤀㔀㤀㜀㈀㤀㌀㜀　㈀㘀㜀㌀㘀㔀㈀㈀㌀㘀　㘀㌀㠀㐀䈀䌀䈀㠀㜀䈀㌀㌀㠀㐀䘀㔀䈀㠀㤀䄀㜀　䈀㜀㜀䔀䐀䈀䐀䔀㐀䘀㌀䔀㠀䘀㜀㄀㌀　㜀䌀䌀䄀䌀㘀㠀䘀䈀㜀　㜀㄀䔀㔀　㔀䌀㔀㠀䈀㔀㘀㄀䐀䐀䔀䘀　　㠀䐀䄀䘀㘀㔀㘀㈀䔀䈀䈀㘀㔀䘀䌀㤀　㠀䈀䐀䄀䄀㌀䘀䐀䄀㐀㌀䐀䌀㌀䈀㘀䄀䘀䔀䈀㌀㤀㄀䄀㄀㠀㔀䄀㜀㤀㐀䐀㐀㜀䘀㐀㈀㠀䐀䄀䔀䘀㔀㠀䐀㈀㔀　䐀㠀䈀䈀㐀䄀䌀㠀㤀㌀䌀䌀䔀㌀䄀䘀㄀䘀㄀䈀㤀䄀䐀㔀㠀䘀㜀䈀㠀㔀㐀䔀㠀䄀㐀䔀㘀㜀㤀㄀㤀䔀㤀㔀䌀㌀䘀䈀䈀䈀㈀㄀㤀䘀㜀㐀㠀㤀䔀㈀䐀　㌀䌀䄀䔀㐀䈀㔀䔀䄀䄀㔀㠀㌀㠀䌀䈀㔀㜀　䔀䈀䌀㜀㘀　　㈀䈀㄀㌀䌀䈀　䌀㄀㔀㜀䔀䌀㄀㔀㠀㠀㘀㈀㈀㄀䘀㈀䌀䄀㔀㐀㄀㌀䘀　䘀㔀㤀㄀㔀㤀䔀㘀㔀㄀㜀㤀㘀㄀㔀䐀䌀㘀㄀㄀㘀㘀䌀㐀㤀䔀㘀䈀䌀䘀䌀㠀㄀䈀㈀㜀䈀㜀　㐀㘀㘀㔀㌀䄀㔀㐀㘀㈀㐀㘀㠀㘀㄀䈀㜀㄀㜀　䄀　䌀　㈀䐀䌀㠀　㔀㠀㌀㠀䐀㜀㐀㈀䐀䔀　䈀㘀㌀㐀䄀㤀㜀䘀㤀䔀䌀䘀㔀㄀䔀㐀㘀　㌀㘀㐀㜀㤀䈀㠀㌀㌀㤀㈀㈀䄀䌀䄀㐀䄀㜀䌀㈀㤀㠀㌀㜀㠀㠀㈀䈀䄀㈀㠀㤀㤀㘀㄀䄀䘀㐀㔀㈀㐀㘀㔀䔀㘀䄀㘀䈀㌀䄀㘀䘀䄀䄀䘀䐀㜀㈀㐀䈀㜀䐀䔀㤀㐀㔀䔀㤀䄀䌀㌀　䘀䐀䄀䐀䘀㐀㐀㌀䔀㤀㐀㈀㜀䄀㠀㐀䐀䐀䐀㐀㔀㌀䘀㤀㌀㈀㄀䐀㠀㔀㜀䄀㤀㈀　䌀䔀㐀㠀㤀䐀䔀㄀㌀㐀㄀　䄀㔀䌀㔀䄀䐀䄀䌀䘀　㤀㘀䌀䔀䐀㤀㔀㠀㔀㜀㐀㠀㤀㌀㤀䌀䌀㤀㤀㤀䄀㠀㠀㔀㈀㐀㠀㈀䔀㜀㤀㤀㄀㔀䌀䄀䔀䌀㐀㌀㔀㜀㌀㜀　㘀㤀䘀䘀㄀䌀䘀䔀䔀㐀　䌀㈀䔀㈀䐀㈀䈀㈀䈀䐀㄀䈀㤀䄀䌀㈀㠀䄀㔀䘀䐀　㜀㤀㈀䈀㘀㈀䄀㌀㈀　㔀㈀䐀㄀䔀䘀䐀䔀㄀䈀䌀㄀㜀㐀㤀㤀䘀㌀䈀䘀㜀䈀㌀䘀㄀㌀䈀䄀䘀　㠀䔀䘀㄀䔀㔀㐀㜀䌀䘀　㠀㤀䔀䄀䈀㤀㄀㜀㔀䐀㜀㄀䘀䌀䌀䔀㤀䔀㔀㌀䌀䈀䘀　㔀㤀䈀㌀㜀㌀䔀䄀䔀䐀㌀㌀㌀㘀㌀㜀䐀㔀㔀㘀㔀䌀㔀　䘀䄀䌀㈀　㌀㔀㔀㄀㌀䄀㜀䐀䘀㄀䄀㠀㌀㠀㜀䘀䔀㄀䔀㜀䐀㄀㄀㌀䘀㜀　㤀㐀㐀䌀䘀䈀䐀㤀䈀㠀㜀䈀䔀㘀䐀㘀㔀㔀㔀㘀䈀㐀㌀㘀䔀㐀㠀䔀䈀㠀㜀䈀㐀䔀䘀䈀䄀䔀䐀㘀䐀㔀㈀䘀䌀䘀㌀　䈀䄀㘀䌀䌀㌀　㌀䌀㌀䄀㘀㤀㘀㠀䌀㈀䔀㤀䘀㔀㄀㌀㘀㘀䐀㐀　䌀㘀䘀㐀䘀䄀䐀䌀䌀㄀㜀㜀䈀㔀䘀䔀䔀㐀㤀㔀㐀䈀䐀䘀䔀㜀䐀䌀㠀䘀㤀㄀㤀䌀㘀䘀䐀㔀㘀䘀㌀䘀㤀䈀㐀㈀㘀㔀㘀㤀　䌀㜀䐀䔀　㔀㌀䌀䄀㈀㠀䌀　㄀㌀㠀䌀　㘀㤀㐀　㔀㤀㘀㈀䈀㈀䈀㐀䄀㐀㈀䄀䄀㈀㔀䔀㘀䄀㜀㐀䈀㠀䔀㐀㈀䈀䄀㈀䌀䌀䈀㐀㘀㐀㔀䔀㄀䘀㈀䄀䄀㈀㄀　䘀㘀㤀䈀㠀㌀㄀䘀㌀䘀㜀㈀䈀䐀㔀㠀㌀㄀䄀㐀䈀㜀䄀㘀㘀㘀㤀㈀㄀㄀㐀㐀㄀㤀㠀䘀䘀㠀㔀㐀䈀　㐀㔀䘀䐀䌀㘀㔀䐀　䄀㌀㠀㤀㠀䐀䘀䌀㈀㌀䘀㔀䔀㤀㘀㠀㈀㈀㈀㄀䈀䐀㐀㄀䄀䔀䔀㜀䔀㜀　䈀㜀　㌀　㜀䔀㠀䈀㐀䔀䈀㠀㠀㜀䘀㌀㐀㌀䈀䔀㄀㘀㌀䘀䘀䄀䔀㤀䔀䄀㐀㘀㈀㄀䘀㠀㘀䘀䐀㄀㄀㘀䐀㔀　㈀䔀㈀䈀㔀㠀㄀㘀㠀㈀　䘀䄀㤀㔀㤀㐀䘀䌀䘀　䌀㌀䐀䘀㄀䐀㈀㌀䘀㈀㘀㈀䘀䈀㈀㠀䈀䄀䔀㠀㐀䘀㌀䈀㜀㄀䔀㄀㤀㈀䐀　㄀　䐀㄀㘀㜀䄀䔀䘀㐀㠀㤀㌀㔀㐀㤀㄀䐀㈀㠀㔀㐀㤀䄀㠀㘀㤀㠀㈀䈀㈀䐀䄀㌀䌀䐀䄀㌀㈀䐀䈀㔀䐀㘀㄀䄀䐀䈀㜀㐀䘀㌀㜀㐀㐀䈀䌀㐀䘀䌀㈀䐀㤀䌀㜀㐀㤀䔀㜀　㜀䐀䔀䐀䈀㘀　䄀㐀㈀　䔀㤀㐀㔀㤀㌀㘀㤀㠀㘀䘀䈀㐀㘀䌀㐀䘀㌀䄀㘀㔀㔀㘀㠀䌀㘀㘀㠀䌀　㜀㄀㘀㈀㄀㤀㌀㤀㔀㜀㤀䐀䌀　䔀㈀䘀䌀㔀㄀　　㘀　䄀㈀䘀㐀㈀㌀䌀䄀㈀㐀　㐀㜀㤀㈀㐀㄀䔀㐀䐀䘀䈀㔀㄀㠀　㔀䘀䘀㜀䄀㌀　㄀㄀㠀䘀㈀㔀䔀㈀㤀㄀㐀㐀㘀㠀　㔀㠀㔀　䈀㐀㘀㤀㌀䐀㤀　䌀䄀㈀䌀㐀㐀㌀　㜀㤀㌀䐀㔀㈀䄀䄀㠀㜀㘀㠀㜀䌀㌀㘀㤀䈀㌀䈀㄀㘀㐀㠀㜀㐀㌀䄀㔀䘀　䌀㄀㐀㈀㔀㈀㘀㜀㜀㄀㄀㤀　㐀䄀䈀㤀㤀㄀㠀㘀䘀㘀㘀䈀㘀㈀㐀䌀㄀䔀䄀䈀㈀㄀㠀㄀䌀㄀䔀䈀㜀䌀㄀䌀㄀㔀䌀㘀㘀㠀䄀　䔀㔀䌀㄀㘀㠀䔀䌀㔀䈀㠀䘀㤀㄀　䌀㠀㜀䌀　㠀㐀㤀㈀䘀㈀　　䄀㄀㘀䈀㌀䌀　㤀㠀䌀䈀㐀㘀㜀㘀䌀㈀䐀㔀　䌀䈀㘀㘀㘀㘀䈀䌀㠀䐀䌀㘀䌀䘀㄀　㤀䌀䐀㈀䌀㘀㐀㔀㔀㈀䐀㄀㄀䘀䌀㜀㔀䌀㠀㐀㈀䈀㜀㄀㘀䔀䔀㌀㐀䔀䔀㜀㌀㜀䘀䘀㄀㈀䄀㔀䐀㌀㈀䌀㜀㠀䘀㈀㌀䈀㜀㄀㄀䘀㐀䈀䔀㤀㌀㠀䄀㈀㤀䔀㌀㈀㠀㠀㘀㐀䔀㐀㔀䄀䘀㜀䄀㈀䌀㌀㔀㠀㔀㄀㈀㤀㔀㈀䄀䈀䘀㠀㘀㔀㐀䘀㄀㈀㠀䄀㠀㠀䄀㐀㐀䘀㔀㔀㠀䌀㈀㤀㠀㈀㘀䐀䌀㌀　㤀䌀㘀㄀䈀㜀㠀䐀㠀　䄀䌀㐀㄀㤀㔀䔀㄀㠀　㤀㔀㈀䌀　㌀䔀㔀䐀䌀䔀䈀䘀㈀䄀㈀㐀䄀䈀㜀㄀㐀㔀㔀　㜀　䌀　㜀䈀㠀䔀㜀㔀䐀䐀䔀㐀䔀䐀㈀㄀䐀　䌀䄀　䔀䔀㜀䐀㜀㔀䘀䘀㐀䈀㠀㜀㄀㌀䘀㜀䈀䌀㌀㠀㠀㈀䔀䐀㠀䐀䌀䔀㜀䔀䔀䘀䐀㤀　㘀㜀㌀䄀䄀㌀㘀䔀㘀㔀䔀㄀䌀㠀㤀䐀　㌀䈀㄀㐀㘀䘀䘀䈀䘀䐀㤀㜀㠀㄀㠀㄀㘀㔀䔀㌀䄀㌀　䈀䐀㤀㄀㄀䘀㘀䘀䈀䔀㠀䌀䔀䔀䈀䐀䌀㠀㌀㘀䄀䔀㜀㘀䐀䌀㄀㈀㤀䈀䐀㘀㘀㄀䄀㈀㌀䘀㄀䈀䔀㘀　㜀㈀㜀㐀㈀䌀㤀㜀䌀㠀䔀㌀㜀㐀㠀䔀㠀㔀㜀㐀㠀䔀㄀㘀㌀㠀㄀㈀㤀䄀䈀䌀䌀㠀䈀㠀䌀㠀䌀㐀㄀㐀㠀䄀㠀㤀㘀㐀㌀㌀䔀㘀㤀䄀㈀䐀㘀㘀㤀㌀㈀㔀㈀㄀㠀䐀䈀㈀䐀㤀㈀㐀　䈀䄀㘀㐀䌀䄀㌀䔀䌀䄀㐀㌀㄀㄀㤀㤀㤀㘀䌀㘀㐀㤀㤀㠀㈀㐀䌀㔀㜀㄀㌀䐀㤀㈀㠀㌀㌀㐀㄀䈀㐀㈀㘀㤀㤀㘀㔀㄀㐀㐀䌀㐀㘀㘀㈀㄀䐀䌀䔀㈀㐀㈀㌀㐀㈀㔀㈀㘀䈀㔀㘀㈀䐀㤀㜀㤀㌀㈀䌀㐀㘀䘀　䔀㔀㔀䐀㐀㤀㔀㐀㘀䔀㜀䌀㔀㔀䈀䘀䄀㐀㈀㄀䈀䘀㜀䈀㘀　㘀䘀㌀䌀䈀　䔀㘀㜀䌀䘀㈀䔀䄀㈀䌀䘀㈀㈀㐀㌀䔀㐀㈀　䌀　䌀㄀䄀䔀㠀㘀㘀㈀䔀㜀㄀㄀㘀㤀䐀䄀䐀㜀　䐀㤀㜀㐀䔀㠀䘀㜀䘀㌀　㌀㜀㄀㘀㤀䐀㤀　䐀㠀㘀䐀㠀㔀䈀㌀䐀䔀䔀䘀㐀㔀㈀㈀㔀㄀㈀㈀䘀䔀㔀㐀㐀䌀㤀㘀㔀㠀㜀䐀䈀㌀㌀㈀㔀㔀㄀㔀㈀䘀䘀㘀㜀䐀䐀㔀㐀㈀㘀䘀䔀䐀㌀　㐀䔀㜀㘀㈀㠀䈀㌀䘀䘀㤀㘀䌀䘀㠀㈀㈀䈀　䄀䄀䌀䈀䄀㈀䌀㌀㜀䔀䘀㜀䐀䔀䄀㠀㤀䄀㌀㄀䔀䈀䈀　䘀㄀䘀㌀䐀䔀䐀䄀㄀㔀䄀䌀㔀䌀䈀㠀㈀䔀㌀䄀䘀㔀䔀㘀䌀䐀㄀䈀㄀䔀䌀㐀㄀䐀㌀䘀㔀䌀䐀䄀䘀䈀㄀䔀䘀㜀䌀㠀䌀䐀䈀㄀䌀䘀䌀㐀㌀㈀㜀㄀㌀㠀䘀㐀㠀㜀䌀㄀䘀　㜀䌀㘀㠀䐀㈀㠀䌀　㈀䌀䌀㌀㘀㘀㔀㤀䈀　㌀㤀㘀䔀䌀䘀䌀㈀㄀㌀㠀　㘀䔀㔀㐀㈀㐀㌀䄀㔀䔀㄀㐀㈀䘀䘀㐀㈀䈀䘀㔀㠀㤀䄀㤀䘀㘀㜀㄀㘀　䈀㜀㌀㜀㌀㤀㈀　㐀㄀䈀㘀㐀㘀㜀　㘀㜀㈀㠀㌀㐀㈀㜀㈀㤀㈀䄀㤀㌀㠀㌀㔀㌀㜀㄀㠀䌀䌀㌀㜀㈀㔀㌀㤀㐀䐀䄀㘀㈀㐀㜀㜀㤀㘀䔀㘀㐀㄀䌀䘀䔀㐀㘀㐀㈀䐀㔀㔀䌀㤀㌀㄀㄀㔀㘀䈀㠀㈀䐀㤀䐀㌀㘀㠀㜀㌀䄀㌀㌀䈀㠀㈀㈀䘀㠀㐀㌀㈀　䈀㜀䐀㜀㈀㐀䔀㤀㤀䌀䐀㤀㜀　㤀㠀䐀㘀䄀䄀　㈀䐀䌀　　㈀䈀㄀䌀䌀㤀　䐀䐀㔀㄀　䄀㤀㤀㘀䄀䔀㘀䈀㈀㐀䌀㈀㄀㜀㌀㈀䘀㔀䈀㐀䐀　㘀㌀䈀㠀㜀㜀㈀䘀䐀㠀䔀䐀䘀㄀㈀㄀䌀㜀㜀䄀䄀㠀㔀䌀㐀㠀䈀㜀䘀㘀㤀䔀㤀䄀㔀㄀䄀㌀㜀㠀㠀䐀㔀䌀㜀㜀䄀㔀䈀　䔀䘀㌀䄀䘀㌀㠀䐀㘀䐀㌀䌀㈀㜀㔀㔀䄀䌀　㌀㠀㘀㜀㄀㌀㈀㘀㤀㈀䌀䌀㘀㌀䈀㘀㐀䌀䄀㄀㠀䈀㘀䔀　䘀䌀䈀䌀䈀䈀㈀䌀䄀㜀㔀　䈀㄀㤀䔀㠀㈀㜀㈀䈀䘀䐀䈀㤀㜀䐀䔀㐀㜀䘀䔀㈀䄀㔀　㠀㘀㐀㄀㠀㌀䐀㠀㄀㤀䌀㘀㐀　䄀㜀㈀䄀䌀䘀㄀㠀䈀㔀䐀㔀㤀㤀㤀䄀　㔀䔀䘀㐀䔀㐀䐀䌀䐀䈀㜀㜀㐀䔀䘀䄀䔀㤀䔀䌀㘀㄀㌀㠀㘀䐀㠀䌀㘀䈀㘀　䘀㔀㤀䄀䔀㔀䈀㜀䘀䄀㤀䘀䄀䔀䘀㠀䐀䈀䔀䔀㄀㜀㔀㜀㌀㐀䄀㘀　䌀㐀䐀㜀㜀㌀䘀㘀䐀㄀䈀㤀㘀㜀㌀䔀㄀㠀㈀　㜀䄀䔀㄀䐀䈀㤀㜀㠀㜀㘀䘀㌀䈀㘀䐀㘀䔀䈀㈀㜀㌀㔀㌀䌀䈀㄀䈀䔀䔀㤀䌀㘀㈀㤀　䔀㠀䈀㌀㔀㘀㌀䌀䌀䄀　䔀䄀䄀䌀䔀㈀䘀㤀㈀䐀䔀䄀　㌀䐀䈀㈀䘀䄀䄀㘀䘀㤀䈀䐀㘀㄀㘀䘀䐀䘀㘀䄀䄀　㤀䌀㔀㄀㜀㤀㔀䔀㈀㈀㜀㌀㘀䐀㔀㘀㠀　䐀㔀䔀㔀㐀㌀㤀㜀㘀䌀䔀䄀䌀㐀㜀䈀㤀㄀㐀䄀䔀㈀　㄀䔀䈀䈀㠀㤀䌀㜀㘀㤀㜀　㜀㌀䌀㠀㔀㐀㈀㤀㈀䌀㜀㘀㈀䔀㐀䌀䈀䈀㐀䈀㄀㘀䘀㔀䔀䘀㈀㌀䐀㌀㈀㠀㄀㐀䄀㠀㌀㐀䐀䐀㘀㐀㘀㜀㌀㌀䐀㌀㄀㘀䄀䈀㔀㜀㄀㠀䐀㜀䄀㠀㜀㜀㄀䈀㈀㐀䐀㤀䔀㤀㜀㘀　䔀㌀　䐀㘀㘀　㈀㌀㘀䈀㌀㐀䌀㠀䈀㘀㈀䌀䔀䈀㄀㐀㌀㌀㘀㘀㄀㔀㔀㄀㄀　䐀㄀䌀㤀䔀䐀䄀　䔀㠀䐀　䌀䌀㐀䄀㠀䄀㈀㘀㤀䄀䄀㄀䐀㄀㠀㜀㐀㔀㄀㐀䔀䔀䘀䌀䐀㔀䔀䄀䘀㘀㈀㤀㌀㤀䔀㤀䈀㘀㐀㘀䈀　䄀䄀㔀㘀㘀㘀㘀䐀䌀㠀䄀㠀㘀㠀䔀　㘀䌀㌀䌀䄀㔀㜀䘀㈀䌀㌀㠀㐀㄀䘀㜀䔀㄀㄀㌀㈀䐀䔀㜀㜀䐀㈀䌀㌀㤀䄀䌀㄀䈀䌀　㤀㘀䘀㠀　㜀㤀㈀㌀㠀䈀㜀䘀㐀䔀䈀䄀䔀㐀䈀䈀䘀䔀䐀䌀䄀　㤀䄀㘀　㠀䘀䔀䄀㜀㘀䄀䈀䘀䐀䘀䘀䌀䌀㐀䈀䈀㄀䐀㠀㠀　䘀㌀䐀䘀㘀㜀㈀㌀㜀䄀䔀䈀㠀㘀㠀䔀㤀䔀㘀㄀㤀䄀䈀㄀䈀㄀䈀㄀䘀䌀㐀䔀䈀㤀㈀㔀䘀㜀䄀䘀䔀䐀　㈀䈀㐀䘀䔀㈀䌀㐀㄀䐀䌀䘀㘀䘀䈀㈀䌀䌀㔀䘀䐀䔀㄀㄀䘀䐀䘀㐀䐀䄀　䐀㄀䈀㜀䔀㐀䄀㤀㈀䈀㐀㠀㐀㜀㘀䘀㤀㠀䄀㄀䔀䐀䈀㘀㤀䈀　㜀䐀㌀㜀㘀㐀㤀　䘀㜀䄀㔀䌀䐀㌀㤀䘀㠀㈀䔀㘀㜀䐀㄀㐀㔀䌀䄀㈀㠀䌀㠀㔀㘀㌀㄀㈀㌀㐀㔀㔀㠀㘀䌀㠀㤀㈀㐀䔀䐀䈀㈀㈀䄀㘀䔀䄀䈀㌀㌀㘀㌀㠀　㄀㈀㜀　㠀䐀䈀㈀㔀䔀㘀㠀㤀㔀㤀䐀㄀䔀㈀䌀㐀㐀䈀䘀㈀㤀䐀䘀㌀㔀䐀䐀䈀㐀䌀　㈀㐀　䐀䌀㄀㘀㈀㔀㌀㤀㔀䄀䈀　㄀㐀㜀㤀䄀䌀㘀䈀㠀㘀㐀䄀䘀䌀䐀㘀㘀㌀㄀㤀䈀㤀䐀㐀㘀　䈀䄀㐀㘀㤀㐀㘀䌀㔀㘀㘀㌀㔀㌀㤀㌀㔀㘀㘀㐀䔀㜀䄀䐀䐀䐀䄀㘀㠀㜀㤀㔀䐀䈀㔀䌀䐀䈀㈀㈀䐀䈀㌀㘀䐀䈀㘀㠀㤀䈀㘀　㠀㘀㘀䔀䐀䘀㈀䄀䈀㌀䔀㈀㤀䌀㜀㤀㜀䈀㌀㄀䈀䈀㌀㈀㄀䘀䔀㤀㔀㐀䔀　䘀㜀㘀䘀㤀　㜀㐀䐀䈀䔀䘀䈀㈀䄀㐀䄀䘀䌀㌀㘀㐀㈀㠀䄀㜀㘀䄀㔀䘀䔀䄀㤀䄀㐀㠀㔀㠀㈀㜀䐀䘀㈀㄀䈀䐀㤀　㤀　䔀㜀　䘀㤀㐀㠀䄀㘀㤀　㄀䘀㜀㔀䐀㜀䌀䄀㈀㔀㠀㜀㤀㠀㘀㄀㘀㔀㠀㈀㜀䄀䔀䘀㈀㌀㜀㜀䈀䐀䈀㈀䔀㤀䘀㠀䔀䄀㔀䘀䌀䘀㔀䘀䈀䐀㌀㌀䘀䄀䔀㘀䌀㌀䐀㄀䄀㈀䘀䌀㠀䈀䌀㜀㔀䌀㌀䔀䔀䘀䄀㜀䐀㜀䌀䘀㄀䈀㜀㄀䌀㤀䔀㈀䐀㄀䘀㜀㜀㐀㄀䘀㜀䌀䔀㜀㔀㜀㌀㠀㘀㈀䘀㌀㌀䔀㌀㘀䘀㐀䈀䈀㜀䄀㜀䌀㜀㘀䐀㤀䈀䄀㘀㤀䔀䈀㄀䔀䘀䐀䔀䔀䄀䄀㔀䈀㠀㘀䐀䌀䘀㐀　㜀䄀䔀㔀㤀㄀㜀㄀㌀㌀䘀㐀㘀䐀　䄀㤀䄀㜀㐀　㌀䘀䐀㠀䈀䘀㄀䈀䘀䌀䌀㐀　㜀㈀㌀㌀㄀㐀㐀䔀㌀䐀㄀㤀䘀㤀䈀㜀㌀䄀㔀㤀㄀㜀㌀㐀㔀䌀䔀䔀䐀㜀㜀㤀㌀䘀㜀䄀㘀㄀㐀䐀㄀㤀䈀㌀㈀㈀䄀㤀㔀㈀㤀䘀　㔀㐀䌀䄀㠀䈀㈀㤀㐀㈀㠀䔀㤀　㘀䘀䘀䔀㐀㤀䔀䄀䘀䄀㔀㐀㄀㄀㌀㠀㈀䔀䄀㐀䄀㔀㠀㈀䔀　㐀　䈀䈀㈀䐀　㌀䈀㈀㔀㐀㘀䌀㈀㔀䔀㜀㠀㜀㈀䄀㐀䔀䄀㐀㠀䄀㠀㠀㔀㌀䌀㐀䈀㐀䐀㐀㜀䌀㜀䈀䄀㜀㘀㌀㌀㌀㐀㔀㄀䘀　䔀䐀㄀䄀㜀㔀㤀㄀㐀　䘀㐀㤀　㘀　㔀㈀㈀䈀㜀㠀㔀䐀㈀㤀䌀㌀䔀㐀㌀㐀䔀㈀　䌀㌀㘀㜀　䈀㜀㤀㜀䌀䄀㔀㘀　㔀㌀㘀䐀㘀䐀䈀㘀㠀㌀䌀㐀䄀㤀䔀㄀㔀㤀㌀㤀䌀㌀䔀㌀䔀㈀㄀㄀㠀䌀䌀䈀㐀㜀㤀䌀㌀䐀䈀䄀㜀　䘀　㘀䘀䌀䔀䈀䐀㈀䐀䔀䐀㠀㜀㜀㔀䈀䈀㐀䐀㌀䄀䘀㔀㐀䄀㤀　㠀䈀　䄀㔀㤀㘀㘀㜀䔀㔀㜀䘀㌀䘀　㈀　㈀㈀䔀㜀㠀䌀䈀　㌀㠀㄀㔀䈀䘀㄀䌀㤀㜀㄀㐀䘀㐀䌀㜀㤀㤀㈀㔀　䈀㄀㌀䌀㌀㌀㤀䐀㄀䔀㌀䌀䘀㔀䔀䘀㘀䔀㈀䌀㈀　㜀㄀㄀㜀䔀䘀䔀䐀䌀㤀䘀䄀䐀㌀䘀㜀䌀㈀䐀䐀䔀㌀㠀䈀㜀㘀㔀㘀㜀㌀㐀㠀䈀㐀䐀䌀㔀　䐀㤀㜀䄀䌀䐀䌀㠀㜀㠀䈀㄀䐀䐀㜀㄀䐀㔀䐀䘀䄀䐀㘀　䐀㐀䘀䔀㈀䄀㠀㐀䐀㐀㜀㔀䘀㄀䘀㌀䘀㔀㤀㐀䈀䘀㤀䘀㤀䘀䐀㘀䈀㜀㄀㘀䐀䈀䄀㘀㔀䌀㌀䄀䐀㤀䈀㠀㤀㔀䘀㠀㌀䄀㌀㄀㜀㠀䄀䐀㜀㄀㌀䈀䘀䘀䄀㐀㄀　㤀㘀㘀䔀䌀㠀㘀㤀䌀䈀㠀䘀䌀　䌀㠀䄀䌀㐀䌀䈀㘀㈀䌀䔀䈀㄀㘀䄀䔀㈀㤀㠀㌀㠀䌀㠀㌀㤀㠀㠀㠀㤀䐀䔀㐀䄀䔀㌀䈀㐀㤀䌀䘀㤀㌀㤀䔀䈀　㘀㐀䈀䐀㤀䌀㄀䄀㈀䌀㄀㈀䌀䐀䈀㤀㄀䔀䐀䄀䄀㠀㘀㈀䄀㐀䐀䄀㐀㜀　㈀㜀䐀䘀䔀㌀㌀㄀㤀㤀㔀㈀㜀㈀㤀㌀㜀㈀䈀䐀㈀㤀㈀㤀　㄀㤀㌀㠀㜀㘀䌀㤀㌀㠀㜀䘀䘀㐀䔀䈀䄀㐀䄀㐀䈀㐀㐀䐀㠀㈀䐀䄀㄀㤀㈀䄀㐀㐀㈀䌀䐀䄀㤀㜀㠀㜀㌀㌀䐀㜀㈀䄀䔀㤀㘀㘀㐀㤀㈀䈀㔀　䌀㤀䈀䐀㜀㘀䈀㐀䌀㐀㤀㘀㤀䄀㐀㘀䈀䄀䐀䌀㜀䔀㠀㜀㘀㄀䈀㌀䐀㔀㜀㜀䈀㔀　䘀㌀㄀㐀㜀䄀䐀㘀㜀㤀㜀䔀䔀㌀㄀㄀㘀㜀㜀㤀㄀　䌀㠀䄀䄀㐀㔀㔀㠀䘀㘀㐀䔀㘀㌀䌀　䌀㜀　䐀䘀䔀㘀䘀㐀㈀䔀㤀䌀䌀䈀㜀㤀㄀䔀㈀㠀㜀㄀㜀䐀㔀㤀䌀㘀䄀㄀㌀　㈀䘀䘀㈀　㤀㔀䔀䈀㔀㄀㐀䐀㄀䔀㔀㌀䄀㤀㈀㤀㘀㜀㤀㘀䘀䔀㌀䐀㈀䄀䄀㠀㜀䘀㠀䔀㘀䄀㘀㤀䌀㜀㐀䘀䌀㠀㜀䄀㄀䐀㔀㄀㜀䈀㠀㌀㘀䈀䈀䘀㘀䔀㘀㤀㘀㤀㔀䘀䄀䔀䐀䘀㜀　䘀㜀䔀䈀䈀㜀㔀䐀䘀㔀㈀䐀䈀䐀䘀㠀䔀䄀䌀䌀䐀㔀㄀㜀䈀䌀䘀䌀㄀　䘀㐀㤀㠀㠀㔀䌀㜀㠀㄀㠀㜀䌀䘀㜀䔀䈀　䔀㘀㄀䘀㘀䘀䄀䐀㈀䄀㜀㤀㐀㤀䘀䐀䘀䈀㤀䔀㈀䔀䈀㌀㐀㄀㠀䘀㐀㜀㈀㘀㈀㜀䄀㤀㜀䘀䐀㘀㈀䈀㌀䘀㐀㜀㜀䔀䌀䈀㐀䈀　㐀㈀䈀㠀䈀㄀䘀㔀㈀䘀㈀䘀䘀㘀㌀䔀䘀㐀䈀䌀　䔀㌀㈀㠀䄀䔀㜀㔀䄀䈀㜀䄀㤀㤀㤀㤀䔀䔀䐀㤀㜀䄀㌀㐀㈀䐀㠀䐀㐀㘀䌀䈀䄀䌀䐀䄀㌀㔀䐀㈀㐀㠀㄀䄀䔀䐀㤀㘀䄀䐀䘀㄀䄀㈀䌀䐀㤀㘀㘀㐀㔀䈀䈀㘀㈀㔀㔀㤀䈀㘀䈀　䈀㔀㔀䈀㔀䔀㈀㐀㐀䈀䐀㘀䔀㈀　㔀㈀䘀㈀䌀䈀㘀　　䈀㌀㄀㤀䈀㌀㈀䘀㌀㄀䔀㄀㄀㈀㈀　㤀　　　䐀䔀㠀䐀　㠀㄀㠀㜀㠀㐀䄀㘀㈀㐀㈀　　㤀㌀㤀䐀䔀㐀　㘀䌀㠀䘀㜀㐀㠀䔀　㈀㘀㜀㄀　㈀䈀㤀㈀㐀䔀㄀　㘀㘀䈀䘀䌀㐀䔀㔀㔀䘀㜀㐀㠀㈀㌀　㄀㜀㤀㜀㤀䘀㤀䈀䔀䘀䈀䔀䔀䈀䈀䐀䘀㤀㌀㐀䄀䔀䄀㌀䔀㔀䐀㔀䐀㔀䐀㔀䐀䔀㜀䐀㐀㌀㤀䔀㜀㌀䘀䄀㜀䈀䄀㘀㜀㈀㐀䐀䈀㘀㠀㠀㠀㄀㠀䄀㔀䔀䄀㜀㄀䔀㤀㔀㤀䌀㘀㤀㌀㤀䌀㔀䈀䘀䘀㘀㠀䈀㔀㌀䘀㈀䐀䔀䄀㤀㘀㘀㌀㔀䘀㜀䐀䘀䈀䄀㤀䐀䘀䔀䘀㜀䐀㘀䈀㈀　䔀㤀䈀㄀㤀䘀㜀㠀　㜀㔀䘀㌀䈀㜀㠀䔀　䈀㤀㜀㔀㄀䘀㐀㐀㌀䈀䘀䄀㤀㜀䄀䌀㜀䐀㜀㘀䐀䈀㤀㄀㈀䐀㠀䈀䄀䔀䐀䔀㔀㈀䈀㐀䐀㄀䈀㈀㘀　㠀㄀㈀㔀㘀㘀㐀䐀䌀㤀䘀㤀䌀㘀䐀䈀㈀䔀䈀䐀㜀䐀㄀㈀䘀䈀䔀䔀䘀䈀䌀䔀䐀㌀㤀䘀㔀䐀䘀㤀䘀䄀　䈀㤀䈀㄀㘀䔀䐀㘀䘀䈀　㌀㌀䄀䈀䈀㘀㄀㔀䐀㔀䄀䐀䐀䌀㠀䈀㌀㔀䄀㌀䐀㜀㌀䐀㔀　㜀㔀䔀㐀㜀䈀㐀㐀䌀䘀䔀㜀䌀㌀㈀㘀㠀㤀䄀䔀㘀㠀㘀㤀䈀㄀㌀䘀㈀㠀㌀䔀䌀䔀㜀䔀㠀㜀䘀䐀㠀　䘀䐀㌀㌀䌀䈀　㤀㈀㐀㠀㘀䄀䈀䘀㔀㄀㜀䔀㜀㈀䘀㄀㜀　䔀　㠀㄀㜀　㔀䐀㘀㈀㤀䘀㠀㠀㔀㘀㌀䌀㈀㌀㌀䌀㈀㜀㤀䔀㄀㠀䄀䄀　㐀㄀㌀䌀䌀㜀㘀㄀㔀㘀䄀㌀　㔀㘀㔀㘀㘀䐀㌀㄀㠀䄀䐀䐀㘀䌀䈀㘀㄀㤀㤀䐀㐀㜀㐀㌀　㘀㤀㄀㠀㘀㤀㈀　䔀㠀㐀㤀䔀㌀㐀㐀㠀㘀㠀㄀䐀　䈀　㠀䘀㄀㌀㈀㐀㐀䌀㐀㈀䌀㌀㈀㠀㠀䔀㈀㌀㄀䐀䌀㘀㐀㈀㠀㜀　㜀䈀㠀㠀䈀㄀䌀䌀㌀　㔀䘀㔀䔀㘀㜀䌀㘀䔀㤀㠀䌀㐀㠀㐀㤀䌀䄀䐀㜀㄀㐀㄀䌀㐀䘀㈀㔀㈀䔀㘀　　㔀㤀䘀㄀㔀䄀䈀䌀䈀䔀䘀㤀㌀㐀㄀㜀䄀䌀䌀䈀㈀䔀䄀㜀㤀㜀　㤀䔀㔀㈀㤀䔀㔀㔀䌀㜀　㐀㄀㌀㈀㌀䐀㌀䄀䈀㤀㈀䌀㐀㔀䄀㤀㌀㔀㈀䐀㜀㐀㐀㌀䄀䐀㤀䌀　㘀㤀䈀㈀㠀䄀䘀㜀㈀㈀䄀㌀㄀㐀㜀䐀㤀㈀㜀䘀㠀㤀㔀䈀䐀㐀䐀㘀䐀㈀䄀䌀㠀䄀㐀㘀㤀㘀㈀㈀䄀㌀䐀㌀䄀㘀㄀㜀㜀㤀㜀䌀䘀㜀㠀㜀㔀㘀㄀㈀䐀㠀㤀㌀㤀㔀䈀㌀䘀䈀䘀䈀䔀㐀㘀㤀㘀䈀㈀䐀　䄀㔀㠀㠀㄀㠀㔀㐀䌀䈀㤀㜀㤀㔀㘀㤀㈀㔀㈀㔀䌀䐀㄀䌀䌀㠀㄀䌀䌀　㐀㔀　㄀㈀䐀䈀㘀　㘀㔀㠀㔀䌀㤀㄀㜀㤀㈀䄀㌀㌀䈀㐀䔀㐀㤀䐀䐀㌀䔀䘀㜀　㤀㜀㔀䔀㜀䘀䘀䐀㌀㌀㈀䈀㤀㜀䘀㈀䐀㤀䌀䘀　㤀㜀㈀㄀㐀㠀㈀㘀䌀㄀㌀䄀㤀㘀䌀㐀㌀䌀㄀㌀㔀㄀䈀㜀㤀䈀䌀㤀䌀㌀䘀䌀　㔀䘀䔀㐀㔀㤀㄀䐀㜀㘀䘀㈀㜀䔀䘀䔀㄀㠀䘀䘀　䌀㜀䘀㤀䔀䈀䘀䌀㈀㘀䈀㄀㤀㤀㘀䘀㔀㐀䔀㈀䐀䌀䈀㈀㄀㌀㘀　䐀㠀㤀㜀㐀㈀㤀䄀䔀　䘀　㤀㔀㄀㠀䄀䔀㠀䐀　㜀㤀䘀㐀㈀㘀㘀㈀　䔀䄀　㠀䈀㌀　㔀䐀㐀㄀㌀䐀㈀　䔀䘀㈀㘀㘀㔀㤀䐀䈀　㜀㄀䌀㌀㔀㐀㄀䌀　䐀㔀㈀㄀䈀㔀㐀㠀㐀㠀㘀㠀㈀䈀㄀㔀㄀䔀㔀㈀㠀㈀䌀㌀㐀㐀㐀㠀㐀㐀㘀㠀䘀㐀䌀　㤀㐀㔀㜀　　㐀䌀㈀㔀㈀䐀㘀㄀䐀㘀㤀䄀㐀㔀䔀䄀㐀䔀䌀㐀㄀㐀㠀㈀㠀㈀䌀㈀㐀㐀㐀㠀㐀㐀㐀㘀䈀㐀㄀㐀㠀㐀㠀㤀㔀㌀㘀䐀㤀㤀䘀㔀䐀㐀㠀㐀䔀㜀䄀䄀㌀㘀㘀㐀䄀㘀䔀㐀䄀㜀㐀㔀䘀䈀䔀㌀㈀　㤀㤀㈀㈀㈀䌀䈀㌀㈀䈀㠀㄀　䔀㜀㤀䐀㤀䔀㔀䄀㤀㜀㔀䌀　䌀㤀㄀䐀䐀　㄀䘀　㄀㘀㄀㤀䈀㠀㈀㘀㌀㠀䈀䘀䐀㈀㠀㈀㜀䐀㐀㄀㐀㄀䌀䌀㌀䘀䔀㘀㜀䈀䐀䔀㜀䈀䐀䔀䘀㜀䄀㘀䔀䐀㔀㔀䔀䘀　㜀㠀䌀䔀㘀㌀䔀䐀䈀㜀䐀䐀䔀䄀㜀㘀㌀㤀䔀䘀㘀㌀䌀䔀㌀㜀䈀䐀䔀䄀㘀䄀㤀㌀　㌀㔀䔀䄀䐀㘀㤀㠀㤀䄀䄀㈀䈀䄀㐀䐀䘀䈀㜀䐀㄀䄀　㄀㜀䈀㜀㐀㄀䔀㔀㌀㠀㄀㈀䔀㘀　䄀䄀䐀㐀㘀㤀㜀䌀㘀㐀䔀　䌀䈀㠀䐀㔀㈀㌀䔀㤀䈀㤀䔀䌀㄀㌀　㄀㤀㄀㤀㐀㐀㤀㈀䐀㠀㈀㔀㤀㔀　䌀㘀㄀䌀㠀㤀䔀㜀㄀䄀㈀䌀㌀䔀㄀㜀㔀䈀䄀㘀㐀㄀㜀䄀㤀㜀　㘀㄀䄀㜀䐀㌀㘀㔀㠀䔀㠀䄀䘀㈀㔀䄀㘀㔀㔀㤀㈀㘀㄀㔀㌀㈀䈀㘀㔀䄀䔀㔀㘀㐀䄀㜀䌀㘀䔀䔀㌀㐀㄀㠀㐀　㤀㔀䐀㌀䈀　㈀㘀䌀㌀䔀㤀䈀　㠀㈀䘀㠀㜀䐀䔀㜀䘀　　䘀㠀㈀㐀㘀䐀㤀㈀䌀㐀㐀㌀㔀䌀䈀㄀㈀䈀㈀㐀䄀㔀㘀䌀㘀㜀䄀　䔀㘀䘀　㤀㄀䄀㤀䐀㠀㤀㤀㈀䄀㌀㄀㤀䐀䌀㠀㠀㔀㌀㜀㈀㌀㈀㐀䔀㔀㈀䔀㌀㐀㐀㠀䌀㤀㐀䐀㄀㠀䌀㈀㔀㘀　㄀䄀㈀䐀㐀㜀㄀䈀㄀　㠀㜀㄀䄀㌀㌀㘀㄀㘀㈀㔀䌀㤀㈀㔀㌀㤀㘀䄀䌀㐀㐀䄀㤀䄀㤀㐀㐀䐀㐀㌀䘀䈀㈀㠀㘀　㌀㌀䈀㄀㈀㠀㤀㘀㌀㠀㔀㠀䌀䄀㐀㈀㘀䈀　䘀㈀䘀㠀　䈀㜀䔀㔀㐀䐀䐀㈀㌀㌀㄀㌀䄀　㐀㤀㤀䔀　㌀㄀㐀㠀䐀㐀㐀㐀䌀㈀䌀䐀㤀㤀㈀㐀㔀　㔀䄀㄀㌀㔀㔀䌀㔀䌀䌀㔀㘀㄀㈀㄀㄀䈀㐀　㘀䄀䌀　㄀㈀䐀䌀䐀㈀㐀㘀䐀㜀㐀㐀䈀䌀㈀㈀㔀䄀䘀㔀㔀䘀㔀䔀䔀㤀䄀㤀㤀䘀㐀䔀㈀㜀㜀㐀䔀㈀㜀㜀㜀㄀䐀㘀䈀䔀䐀㌀㠀㄀㠀䈀䐀䘀㈀㘀㐀䌀㜀䌀㄀㠀㌀䈀㘀䐀䈀㐀䔀䐀䘀㘀㄀㔀䐀㔀㐀䈀㘀䘀㈀㠀㤀㔀㘀䔀䘀䐀㘀䐀㌀㜀㜀㐀䈀　䈀䘀㌀䔀䈀䈀䔀䈀䔀䐀㤀䐀㌀䌀䈀䄀㔀㌀䌀㌀㌀䐀　䐀㠀㜀䈀㔀㔀㘀㜀䌀㜀䈀䔀䌀㄀䐀䌀㠀㄀䌀㤀䐀㔀䌀䌀㠀䈀㠀䐀䌀㤀䘀㤀㘀㔀䔀䐀䌀㜀䈀䔀㌀㘀㌀㤀䌀㤀䈀䌀㔀䔀䔀㌀䌀䌀　䘀䈀㘀㌀䘀䘀㌀㐀㠀㐀㠀㠀㐀䈀㤀㔀䌀　㈀㘀㄀㐀䐀　㤀䌀䌀䄀㔀　䐀䘀䐀㌀㄀䈀㠀㈀㈀㐀㤀㔀䈀䄀　㘀㔀䈀䌀㐀䌀㤀㈀䄀䔀㤀　䄀㤀䐀㐀㌀㔀㌀㈀㐀䐀㠀㘀㘀䔀㘀㘀㤀㜀㘀䔀䄀㜀䔀㔀㐀㤀䌀䈀㜀㤀䐀䐀䘀㌀㤀㘀䔀䘀䔀䈀㔀䔀䈀㔀㤀㠀䐀㠀㄀㠀㄀䈀䌀㌀㐀㄀㌀䔀㘀㤀䈀㌀䐀㄀䈀㤀　䄀㐀䄀㈀㔀䐀䈀䔀㤀㔀䌀　㤀　㘀㠀㌀䐀㜀㈀㠀䌀㤀㄀㈀㔀㐀　䌀㐀䄀䐀㠀㘀㠀㤀㐀䄀䌀㐀䔀㄀㠀䔀㤀㌀㤀㄀䌀　䄀㔀䄀㈀　㜀㈀䐀㜀䄀㐀㄀㤀㘀䌀㐀㘀㈀㌀䘀㠀㘀䈀㈀㐀㄀㤀㈀㔀䔀㄀㄀䌀㌀䔀㜀䈀䌀㈀䐀　㈀䌀䌀㄀㈀䔀㘀㠀㈀䌀㠀㜀㄀　䐀䔀䈀㠀䐀䌀䈀㠀䌀㄀䐀㠀㘀䘀䔀㐀㠀䌀䌀䘀㌀㌀㜀䈀　㄀䈀㄀㄀㤀㌀䌀㜀䔀䌀㈀䐀㘀㠀䌀䌀䘀䔀㄀䘀㄀䄀　㌀㔀㘀㈀㘀䔀㘀㈀㤀㄀䌀䐀䄀㠀䘀䄀㤀䄀䘀　䐀㌀㔀㈀䈀㈀䄀䔀　㘀㌀䈀䈀䄀䔀　㐀㤀㔀㜀㐀䐀䌀䄀㌀㈀䌀䈀䌀䈀㤀　㔀䐀㜀䄀㄀䘀㌀䌀㌀䄀㘀㠀䈀　㈀䄀㜀㄀䈀㈀㐀䌀䄀㈀㐀㠀㤀䌀㈀䔀㔀㤀㐀㈀䈀　䄀䘀䄀䔀㌀㌀㠀㔀㈀㔀㌀䔀㐀㌀䐀㘀㔀䄀㜀㘀䌀㤀㌀䈀㠀䘀䄀㘀㘀䔀㄀㤀㘀䘀䈀䈀䔀㘀㘀㠀䐀䌀䐀㠀䔀㤀㔀䈀䄀㈀㘀䈀㈀䄀　䔀䈀䘀㄀䐀䔀㠀䔀㄀㔀㈀㤀䔀䐀䈀䐀㘀㜀㤀䘀㌀䘀　䈀䌀䘀䐀㤀㌀㜀䈀㤀㤀䄀䘀䈀㘀䘀䈀　䈀㄀㘀㔀䐀䘀㠀䘀㜀㔀　㄀㐀㄀㠀㜀㐀㈀㜀䌀㐀㄀㤀　䐀㈀　㌀䐀㄀㌀㜀㈀䄀㄀㤀䐀䌀䘀㈀㄀　䈀䔀　䔀㐀㈀䄀䌀　䌀㤀㜀㠀䘀㈀㈀㐀㈀㘀㔀㔀䌀　㄀䈀㌀䐀䐀䈀㌀䐀㠀䌀㠀㘀㠀䘀㠀䘀㤀㘀㄀䐀䔀䌀㔀䄀䈀㤀㈀㔀䈀䄀䐀㄀䐀㄀䔀㠀䔀䌀㠀䘀䐀䔀䔀㠀䐀㐀㈀䌀䔀㘀䘀㄀㤀　㌀㐀㈀㈀䔀䘀㠀㤀䐀䈀䔀䐀㌀㠀䌀㔀䘀㈀　㤀㐀䔀㐀䔀　䈀䄀㄀䄀㔀䐀䔀䔀䌀㐀㈀䌀㄀㈀䌀㜀䘀㌀䔀㐀䄀㜀㄀䐀䈀㔀䐀㐀㠀㈀䈀㘀㤀䈀㜀㘀䈀㔀㤀䔀䐀　䔀㐀䘀㐀䄀㔀㜀㐀㐀㐀䌀㌀㤀䈀䐀㜀䌀㠀㠀　　䔀㐀　　䐀䄀㠀　㌀㌀䄀䈀㔀㐀䄀㐀䈀　䌀㄀䐀　㌀　䄀㄀㠀㠀㠀㐀　㘀　䈀㤀㠀䄀㤀㌀㠀䄀䄀䘀㌀䔀䌀㌀䐀㜀䘀㜀䔀䔀㤀㜀㜀㜀㜀㠀㘀䘀䔀㜀㠀䌀䘀䐀㔀䄀䘀㘀䐀㌀㤀㜀䐀㜀䈀㜀䘀䔀㤀㘀　㜀䈀㐀㔀䈀㐀䘀㌀㐀㠀䐀䘀㤀䄀㤀䈀　㜀　䄀䘀　㔀㄀㔀䌀䘀㐀䘀䐀㈀㜀㌀䔀䘀䄀䘀䔀䐀㤀䐀　䈀㜀㤀䘀䐀㠀䘀䌀䌀䄀㤀㄀䈀䈀㄀䘀䘀　㘀䘀䐀䌀㔀㌀䐀㔀䈀㄀䔀䔀䘀㘀㘀㌀㈀䈀㄀䘀㜀䌀㤀㌀㌀䌀㔀㌀䘀䐀㔀䐀䄀㠀㤀㜀䄀䈀　㘀䘀䔀㈀䌀䌀㠀㠀䐀䘀䔀㄀㘀䘀㐀㔀㐀㌀㠀㄀䈀䈀㤀䄀䈀䌀䌀㈀䐀䐀㄀㔀䈀䌀䌀㜀䌀㘀㤀㜀㐀㠀㄀䈀㌀㠀㈀䄀䈀㌀㌀䐀㜀㐀㐀䘀㌀䌀㤀㔀䌀䈀㘀㌀㤀㌀㌀䈀䄀㠀㠀㈀䈀㌀㌀䘀㌀䐀㈀䈀㤀㈀䈀㄀䘀　㔀㔀㜀㤀䄀䌀㠀㠀䄀㈀䄀㘀䌀䐀㘀䌀㘀䔀䔀䌀㐀䈀䈀㘀㈀㘀䘀䌀㐀䘀㜀䄀　㐀䘀䐀䐀㄀䄀㜀䈀㘀䌀㠀䄀䄀㄀㄀㠀㔀㜀䔀㌀㄀䔀㘀㤀㔀㌀䄀䌀㐀㘀䔀㜀䌀㘀㔀㄀㄀㘀㠀㘀㐀䐀䈀㐀㌀㄀㄀㘀㠀䈀䔀䄀㌀䔀㈀㔀䌀㤀㤀㐀䔀㠀㔀㐀㈀䌀䐀㤀䔀㘀㌀㐀䔀㤀㈀䐀㘀㤀䌀㠀㈀㐀䈀㠀䔀㈀㔀　䐀䌀㠀㘀㌀㠀㈀㘀䔀䔀㄀䌀䔀㌀　䔀㈀㘀㈀㄀　㄀㌀䌀䄀䈀䌀㔀䐀㈀㠀䌀㠀㐀㄀䈀䄀㠀㘀㜀㈀㔀䌀䘀㔀䌀㔀　䄀䐀㠀　㌀䌀㘀㤀䌀㐀㤀䐀㈀㈀㠀䘀䘀㠀䐀䄀㠀㈀㠀㠀㄀　　　㈀䈀㄀　䐀䘀㌀䄀䌀㌀䌀㌀㠀㔀㐀㌀㠀　㠀䘀㔀䄀㘀㄀㜀䘀㐀㤀㌀㄀㔀㔀　㔀䘀㤀㈀㜀㈀㄀㠀䘀㔀㘀㤀䐀㤀䔀䄀䄀㈀㔀㜀㐀㐀㤀䈀䄀㤀㔀㌀䌀㤀䔀㘀䄀㘀䐀㘀㔀䘀㄀㤀㐀䄀䄀㌀　㈀㐀㘀䔀㐀䘀㘀㔀㔀㔀㤀　　䘀㘀㌀㜀䌀㌀㐀　䔀㌀䌀䔀䔀㘀䌀㌀䐀䐀䄀㜀　䔀䘀㠀㔀䈀䔀㠀㜀㄀䘀㘀䐀㌀䌀䐀䘀䈀䈀䘀㌀䈀㠀䌀㔀㌀䔀䈀㠀䔀䌀䌀㄀㤀㜀䄀䔀䐀㤀㔀㠀㌀㄀䐀㈀䈀㔀㈀㠀䐀㐀䌀䈀䈀䘀㜀　㘀㜀䐀䈀䈀㈀㔀䘀䈀䔀䘀㄀㔀㠀䔀㠀㠀䘀㠀䘀䐀㔀䈀䘀㌀㈀㜀㤀㤀䔀䄀䐀㄀㤀䌀䐀㔀䔀䈀㠀　㈀㘀䘀㌀㠀㌀䈀㜀㘀䈀㐀䔀㘀䌀㠀　䘀㄀㐀㈀䈀㘀㐀䐀㜀㠀㄀㤀䌀䌀䐀䔀㠀㤀㌀䔀　㄀䔀㠀㄀㌀䐀㈀㐀㄀䌀䐀㔀㄀䐀㄀㄀㌀㠀㠀䐀㌀㄀䌀㘀䘀㠀㤀㠀䔀䔀䈀䈀䐀䌀䈀䘀㜀㄀㜀䘀㘀㌀㌀㔀㈀㤀㐀䌀㄀䄀㔀㜀㠀䌀　䈀㤀㤀㘀䄀䈀䌀　䈀䐀䘀㠀㠀䈀㔀㈀㘀㌀㌀䌀㌀䔀䄀㄀㤀䈀㌀㔀㤀㤀㔀㤀䔀　　䔀㤀㠀䄀㔀䔀㄀㔀㤀䘀㔀㤀　㄀㈀㄀㌀㌀䄀㐀㈀㔀㐀㄀㤀㌀㤀㐀㐀䘀䐀㜀㈀㌀䄀㌀䌀　䈀㄀䄀㄀㄀䌀㤀㈀䌀㐀㐀　㈀䌀䈀㘀㄀㄀㘀䐀　㜀㌀㠀䘀䄀　㠀䄀䌀㐀䄀䈀㄀㈀䘀㄀㘀㌀㔀㐀䄀㄀㐀㤀㌀㔀䔀㜀䈀　䔀㤀㜀㐀㔀㈀䌀䔀䘀㄀　㈀㤀㠀㄀䘀䘀㔀䘀㐀䌀㔀䔀㜀㤀㐀㐀　　㈀㘀䈀㈀㔀䈀㠀㔀㄀䄀㤀㌀　䐀䐀　䌀㐀㄀㠀䄀㌀㐀　㐀䌀㤀㘀㠀䐀䔀䔀㐀䘀㌀㠀㔀㐀㜀㐀㔀㤀䄀䈀䄀䔀㘀㜀㘀㘀㐀䔀㠀䈀㌀䌀　䌀㈀䈀㔀㐀㜀㔀䌀㌀㘀㈀　䔀㐀䈀㄀㤀㤀㐀㌀㠀㘀䌀㠀䄀㌀㘀㈀䐀　䐀㘀㘀䌀㄀　㐀㄀䘀䌀䔀㘀䄀㜀㠀䄀㠀䄀㄀㜀　䘀㤀㔀㈀㜀䘀䘀㄀㠀㘀　䈀㈀㔀㈀䐀㔀䌀䌀䄀䐀䈀㜀䈀㐀㘀㔀㈀㤀䘀䘀　䘀䌀㈀㠀㜀㐀㈀㤀䐀㐀㐀㠀䈀　䈀㤀㄀䔀䔀䌀㠀䔀　㔀㜀㤀䘀㤀䐀　㤀䘀㐀䔀䔀䈀㌀㌀䌀䌀㄀　䐀㤀㤀䘀䈀䈀䘀㈀㄀㌀䘀㈀㈀䌀㤀䌀㈀㔀䄀㄀䄀䄀㄀䐀㠀㠀䈀䈀㠀䌀　䘀䈀䄀㄀䘀䘀㐀䈀　㈀㌀䔀䌀㘀䔀䘀䈀䐀䐀䘀䄀䈀䈀　䌀㤀䌀㤀䔀㈀㠀䄀㐀㠀䈀　㐀䈀㐀䈀　㜀㜀㤀㌀㔀㘀㐀䈀㠀　㌀㠀䌀㠀㄀䔀㠀䔀㜀䐀㔀㐀䘀䘀㤀㠀㤀㄀䄀䈀㘀㐀㜀㜀䔀㤀㘀䘀䐀　䈀㌀㄀㤀㠀㘀㈀㐀䈀㜀䌀㜀㔀䈀㘀䌀䔀　㔀䌀　㘀㌀䐀㤀䈀　㠀㐀㠀　㔀㜀䈀　䔀䐀䈀㤀㈀㘀㈀㄀䄀䄀䌀㈀㠀　㤀䔀㌀䘀㐀㌀㠀䄀㜀㔀㔀䌀䈀㌀䈀䐀㌀䘀㔀㠀㤀䔀㐀䘀㔀　㐀㘀㤀　㠀䘀䈀㐀㠀䈀㠀㈀䘀䔀　㘀㘀㤀㜀䈀㈀䐀䔀㜀䘀㠀䔀㤀㄀㠀㌀㔀㈀㄀㘀䌀㤀䌀㔀㌀䘀䐀㈀䈀㤀㔀　䈀㈀㤀㐀䌀䌀㈀㐀㜀䘀㄀㐀㐀㌀㤀䘀㄀㄀㈀㘀䄀㔀䔀㜀䄀㌀㄀㠀㈀㤀㠀㘀㜀㤀　䘀䐀㈀䘀㈀㤀㜀䈀㌀㄀䈀㔀䘀㔀㘀㐀䌀㜀䄀㈀　䈀㌀䔀䔀㤀㌀䐀㘀䌀㤀䘀㜀㔀䈀㠀㄀㄀䌀䈀䌀　㐀䔀䔀㘀䌀㘀　㈀䄀㔀䈀㈀㐀䌀㤀䄀㈀㠀㔀㈀䌀㔀䔀㈀㠀　㤀㌀㘀㔀㈀㠀㈀㐀䘀䄀䌀㈀䔀㐀㈀㐀䔀䄀䘀㐀㄀㈀㘀㈀㤀㐀䈀㤀　　㐀㌀㜀㤀㐀㄀䌀㄀㈀㔀㈀㘀䌀䈀䄀䘀㐀㄀㠀㈀䐀㔀㌀㐀㔀㐀䐀㔀㤀㜀㌀㌀䄀䔀㜀㤀䄀䌀㘀㤀䐀㌀䈀㤀㌀㤀㈀㐀㌀䈀䘀㐀䄀㔀䈀䈀䌀䔀㐀䌀㈀䄀㤀　䈀㘀䘀㜀㄀䌀㜀䈀㤀　㌀䌀㌀㔀㜀㘀䐀䌀䄀㜀㈀䔀䌀䈀䐀㔀㠀䐀㠀䐀㠀䘀㘀䐀䐀䈀㄀㜀㌀䐀㜀㔀䌀㠀㌀䈀㜀䔀㠀䔀䈀䘀䈀㈀䄀㌀㜀㈀䔀䘀㐀㘀㜀㘀㐀䔀䌀䈀㄀䄀㜀䘀㜀㔀㜀䔀䘀㌀䈀䘀㔀䐀䌀㌀䐀㠀㘀㠀䐀䐀䈀㄀䈀䘀㌀䘀㈀㔀㈀䔀㈀　䄀㔀䈀䘀㈀㔀㜀㠀䐀㈀䔀䈀䘀㜀㜀䐀䐀䈀䄀㜀㔀㌀㐀㤀䈀䘀䔀　㌀㜀㌀　㜀䘀䘀　㐀㠀䄀㐀㌀㌀㜀　㐀㌀㌀㤀㘀㤀䄀䈀䈀䌀䐀㈀㌀䔀㘀㌀㄀䘀㌀䈀䐀䄀㘀䘀䈀䄀䌀㠀䘀　䈀䌀䘀㈀㘀䈀䌀㤀㐀䘀　䄀㄀㄀㔀㈀　　㔀䈀㌀䌀㠀㘀䔀㐀㘀㔀㄀㜀䄀㤀䘀䌀㔀　　䔀㠀䌀䌀䔀䄀䌀䐀㄀䘀㔀㤀　　　㜀㐀䔀㐀㠀㐀㌀㔀㄀䔀㌀㌀㠀㠀㐀䄀䌀㐀䌀䘀䌀㐀㤀䈀㤀㔀㤀㌀　㤀䌀㘀㌀䔀㈀㐀䘀㄀㠀㠀㜀䘀㐀䐀䘀㘀㈀䔀㈀㐀㄀㔀㤀䔀㌀㤀㄀　　㐀㈀䐀㈀㈀㜀䘀㤀㐀　㔀㤀㈀㔀䔀㄀㌀㘀㠀㄀㄀㔀䌀䔀㌀㄀䈀㜀㤀䐀㠀䌀㈀䘀㌀䔀㐀㤀㔀䔀䌀䐀㘀㤀䌀䐀䘀䌀䔀㐀䘀䐀㐀䘀䌀㠀㤀䈀　㘀䈀　㔀㔀䘀㈀䌀㤀䌀㤀䈀㈀㜀㈀䘀㈀䐀㘀㠀㄀䘀㐀㈀䄀䐀㄀㤀䔀㘀㐀㈀䐀䔀㔀䈀㌀㈀　䈀䘀䌀㠀䔀䄀㈀䐀　䄀㔀㠀㠀䈀䐀㠀㠀　䐀㘀䌀䈀㈀䄀䘀㤀㄀㄀䘀䔀㤀䐀㘀㌀䔀㄀䘀䌀䄀䐀䌀㄀㤀䌀䈀㠀㘀䈀㘀䔀㐀䈀䈀䌀䄀䐀䔀㠀䌀䐀㤀㔀㈀㜀㄀䌀䌀㜀䘀㜀䐀㠀㤀㈀㌀㌀䌀䄀㠀䔀䐀䔀㘀㤀㈀㤀㐀㠀䄀䈀䘀　䔀䔀㘀㌀㜀䄀㘀䘀䌀㘀䘀䌀䐀䔀䐀　䈀䔀㤀䈀㈀㜀㐀䘀㘀䘀㠀䘀㜀㄀㜀㤀㠀　䈀䘀　㌀䄀　㔀㜀㈀㌀㔀䌀　䄀䄀　㔀　㈀㠀㌀㠀㘀䌀䐀㜀䐀㤀㠀㔀䈀䈀䘀㐀㘀㜀䈀㐀㘀㜀䌀㐀　䘀䄀㈀㜀䘀㄀䐀䄀䈀㄀㔀㜀㐀㠀㈀㜀　䈀䐀䔀㄀㔀　䔀䌀㔀䐀䐀䄀䈀䈀䌀㐀䄀㜀䐀㠀䄀䘀㘀䈀㜀㐀䄀㤀㘀㈀㔀㄀䔀䌀㠀㠀㜀㘀㐀㐀㄀䌀㌀㈀　䌀䌀㜀㘀䄀㜀䌀䐀㠀㈀䘀㤀㔀㔀㠀㘀䄀㈀䌀㔀䌀䈀㐀㌀䐀㄀㘀䌀　㌀㄀䌀㘀㈀䔀䌀㜀　　㄀㘀䔀䔀㠀㜀䔀㤀㠀䔀䈀㄀㄀㌀㜀　䔀㐀㜀㔀䈀㈀㈀䔀　㜀䌀　㔀㄀㠀㜀㜀㤀㔀䔀㠀㜀㜀㐀䘀㘀㄀㠀㐀㄀　㜀㔀㤀㤀　㄀㤀㄀㈀㘀䄀㜀䈀䄀䌀䌀㠀䌀㜀䄀㔀䌀㔀䐀㠀㜀㔀䈀䌀㘀㐀㘀䈀㠀䔀㈀㄀䈀　㘀㜀㠀䔀㘀䐀㈀䔀䈀㜀㘀㌀䌀㤀䈀䔀䐀䌀䈀䔀䌀㄀䐀䔀㘀䘀䔀㜀䔀䌀䔀㜀㤀㠀䈀䐀㈀㜀䔀㌀䌀㄀䌀㈀　㤀㘀㈀㈀㘀㄀㠀㔀䌀㌀㤀㌀䌀䈀䔀䌀㠀䈀䘀䌀㜀㜀䘀䌀㐀䈀㌀㜀䔀㤀䔀㌀䌀䌀　䈀㘀䐀䈀㜀㠀㄀䈀㄀䘀㈀㜀㄀㘀䈀䘀䄀䌀䈀䄀䈀䘀㜀䄀㘀㈀䈀㐀㜀㔀㤀㜀㌀䔀㈀㄀䌀䈀　䘀㘀㐀㔀㔀㌀䈀㔀㌀㜀㤀㜀㠀䘀㜀㄀㈀　㤀㠀㤀㈀䘀㘀㔀㤀㈀㔀㔀㌀㄀䌀㔀䌀㔀㄀㄀㠀　䄀㐀㠀䘀䔀䈀㠀　䄀　㈀䈀㠀㜀䄀㘀䄀㤀㌀㜀㄀㤀㔀䄀䐀㔀䐀䌀䈀䌀　㠀䔀㈀㘀㌀㌀㔀䐀㜀㈀㐀䄀䘀㌀㄀䌀　㤀㄀㤀㜀䈀㔀㤀䘀䈀䘀䈀　䔀㜀㄀䔀䌀䘀㠀㄀䐀㌀䈀㜀㐀㘀䐀㔀㔀㐀䐀㔀㄀䔀䔀㤀㜀㔀䌀㜀㈀㐀㘀䔀㌀䌀䘀䐀䌀䔀䔀㌀㈀䘀䘀䐀䔀䌀㤀㘀䔀䔀䌀㔀䘀䘀䌀㈀㜀㐀㐀䐀䄀䔀㔀䐀䔀㌀㈀䘀㔀䈀䈀䌀㜀㐀㔀䘀㘀㌀䐀㄀㐀䐀䘀㠀㌀㔀　㠀䄀㐀䘀㄀㤀㔀㐀㤀㠀㠀㌀　䔀䄀㐀　䄀㘀㘀㘀㘀䌀　䄀䌀䄀㔀㄀㤀㈀䌀㔀㘀㔀㘀㄀㔀㈀䌀䐀㐀㄀䌀䈀　䄀㐀䈀䈀㜀㜀㤀㤀㜀䘀㘀㌀䐀㠀䈀䌀㘀㐀㈀　䌀䄀㐀㈀㘀㘀䈀㔀䔀䈀䔀㐀㘀㠀㠀㄀㄀㈀　㔀㘀䐀　㠀　　䄀㌀㄀㄀䄀䄀䐀㤀㘀䄀䌀䈀䘀㘀䄀䈀㐀㠀㈀䄀　㄀㌀㐀㔀㄀㘀㘀㈀　䌀㠀㌀䌀㤀㘀㐀䐀㘀䔀䈀㄀㤀㐀㄀㄀　㐀䐀㘀㘀䈀㌀䌀䔀㈀㐀㘀㠀㌀　㘀㜀䐀㘀㘀㤀䈀㔀㈀䌀䌀䈀㘀㠀㐀㐀㠀　㐀䔀㌀㌀㄀㈀㠀㔀㔀䄀㠀䐀䐀㠀䄀㄀㈀㜀㌀㄀㠀㜀㘀　䄀䄀䌀㔀䔀㘀　䔀䄀㐀䔀䈀䐀　㠀䔀㌀㌀㄀䔀䄀㐀㘀㄀䘀㐀㈀㜀㐀㤀㜀㘀㐀㌀䐀㐀　䘀㘀㌀䘀㤀䈀㐀㠀㐀䘀䄀　㄀䈀䄀䌀㜀䘀㄀㤀䈀㐀㠀䌀㈀䔀䌀䘀㄀㤀㌀䘀㐀㌀㤀䌀　䘀䈀㈀　䄀䐀㐀㤀䘀㠀㔀㌀䈀㜀㐀㠀㜀㤀䈀䐀㐀㜀䐀㤀㤀㈀䘀㔀㐀㌀䈀㈀㜀㐀䄀㄀㔀㌀㔀㘀㐀䘀䌀䈀㤀㐀䈀䐀䈀䄀㤀䌀㘀䄀　㈀　㈀㤀㈀　䄀䘀䄀㤀㠀䄀　㜀㔀㠀　䈀䄀㐀䄀䐀䐀㤀㔀䈀䘀㤀䌀㐀㠀㈀䄀㌀　㤀䘀䈀䈀䘀㈀㤀㜀䈀㌀㜀㄀　㤀䘀㤀㌀䄀㌀㄀㤀㘀䐀㈀㐀㄀㈀㄀䐀䄀㤀㘀䄀䘀㄀㔀䄀㌀㘀䌀䘀㤀㐀㔀㘀䄀䘀　㐀䐀㔀㘀㔀䌀䌀㄀㔀㐀㈀㄀䈀䄀䌀㘀䐀䔀䐀㐀㤀㐀㔀㐀䌀䌀䔀㈀㌀㜀㐀㈀㜀䘀䈀䐀䐀　㤀㈀㤀㜀㠀㘀䘀㌀㜀䔀㄀㤀㔀䄀㠀㐀　䐀㄀㜀㌀㘀㜀䈀㌀㈀㐀㌀㄀㌀㐀䌀㌀䌀䄀㌀㜀䘀㘀㄀㜀㌀㄀䈀䈀䔀㘀㄀䘀㈀㠀㌀䌀㤀㜀䘀䘀䘀㔀㤀㐀㔀㜀㜀㘀㠀㈀䘀䌀㄀䈀䐀䐀　㐀䄀㘀䔀㈀䘀䌀㠀㔀㐀㐀㘀䘀㜀　㘀㔀㜀䈀㤀㘀㈀㜀㈀䘀㐀㐀㄀㐀㌀㌀　㘀㘀㐀䌀䔀㐀　㔀㠀㌀䐀䔀　㠀㘀㤀䈀㐀㤀㠀䄀㄀㈀䘀㌀㘀㘀䄀㜀㐀㌀䄀䌀㄀㘀㠀㌀㈀㘀㤀㄀㄀㠀䔀㐀㘀㔀㘀䄀䌀㘀㌀䌀䐀㤀㈀㄀㐀䐀　㤀䄀㘀㐀䄀䐀䐀㘀㘀㐀㌀㐀㠀㤀㔀䄀㠀㤀㌀㔀䔀䄀䌀䌀㈀㘀㤀㌀㈀㠀　䄀㄀䄀㤀䐀䌀㠀䈀䄀䄀䌀㠀　㄀㘀㤀㈀　㤀䌀㌀䄀䘀㐀㤀㘀䌀㄀㘀䘀　㌀㠀㜀㌀　㜀㠀䄀　㘀䔀㄀䐀䌀　䌀䌀㈀㜀㤀䐀䘀㜀䘀䌀㤀　䘀䔀䔀㠀㤀㈀䔀　㔀㈀䄀䘀㈀㈀㠀㔀㄀㔀䘀䔀㔀　䄀㘀㜀䌀䄀㐀㐀㤀䐀㤀㐀䔀㜀㜀㠀㘀㌀㄀㈀㌀㜀䄀㄀㈀䈀䄀㌀䐀　㘀㤀㈀㤀㔀㈀䈀㌀㘀㐀㤀㘀䄀䌀㠀䄀　㈀㤀㌀䌀㐀㄀䘀䔀㤀㠀䈀　䈀㠀䄀㌀䌀䈀䔀䘀䌀䐀㈀䔀㌀㈀㜀㔀㘀䌀㐀㔀䄀䘀　㈀䘀㔀䔀㤀㠀㔀䌀䐀㜀㜀䔀㘀䘀㐀㜀㜀㤀䄀㠀䘀䈀㐀㤀䌀㤀䔀䔀㔀䔀䈀㜀㠀㤀㐀䈀㤀䘀䘀䌀䔀　䐀㠀㌀㄀䈀㘀䔀㤀䈀㌀䈀䄀㘀㜀　㜀㠀㤀㤀㜀䐀䘀　䈀㈀㄀㠀㠀　㐀㔀䌀䈀㈀䔀㠀　㜀㐀㄀䐀䈀㘀䄀䄀㘀㄀㌀㜀㜀㌀㈀　㌀㜀㠀㠀　䔀㄀㄀㄀㐀䘀　㈀㠀㤀䐀㔀䘀㠀　　䌀䘀䘀㌀䔀䄀㐀㌀　䈀䈀䄀㐀䘀㜀㐀䄀㠀㘀䘀㜀㄀䌀㐀㈀㤀㜀䈀㌀㤀㐀㘀㜀㤀㤀䈀㈀㌀䌀㤀㘀㠀䌀䔀㤀䘀㤀㄀䄀㜀㘀㤀㈀㈀䘀㌀㌀㐀㐀　䌀㜀䘀㜀㠀㠀䔀䘀㠀㘀　䈀㔀㈀㜀䐀䘀㤀㤀㄀㐀䘀㐀㄀㐀㠀㠀㜀㐀㠀䔀䐀㤀　　㈀㤀䘀㄀㤀䘀㈀㄀䌀㠀㐀㠀䄀㤀㔀　㐀䄀䔀䘀㠀䔀䔀㤀㤀䄀䘀㔀㔀䐀　㐀㤀㄀䐀䘀䌀䐀䘀䈀䔀䔀䈀㠀㄀㤀㔀㠀㜀䈀䔀㈀㐀䘀䌀㘀㐀䘀㜀㤀㈀䄀㐀㤀㌀䄀㐀㤀䈀㄀㠀䐀䘀䌀䄀㌀䐀䌀㜀㌀䌀䌀㠀䐀䘀　䈀䈀䌀㈀㘀　㜀㐀㔀㔀䌀㠀㄀㜀㠀㤀䈀㈀䐀㠀䔀䄀㤀䌀　䔀㌀䘀㠀䔀㜀㠀㠀䌀㌀䄀䈀㠀䔀㔀䘀㐀䘀㌀䌀䔀㄀㘀㐀㜀䐀㐀㔀䐀㜀㤀㈀䐀䘀㈀　㜀䘀㄀䐀㜀㤀㜀䄀㐀䌀䈀㈀䐀㜀㔀䈀䘀䐀䔀䘀䔀㘀㜀　䌀䘀䈀䐀䘀䈀㈀䔀㠀　㜀䄀㌀㜀㘀䄀䔀㄀䐀㘀㜀㄀䘀㔀㐀㠀　䈀㌀㄀㠀㐀　䐀㌀㤀㔀㄀㈀䄀㘀　㜀䈀㄀㄀䄀　㜀䈀㄀㔀䔀　㜀䈀㄀㌀㐀㐀䐀　㌀䐀䄀　䘀㐀䄀㌀㘀㠀㌀䘀䈀䄀㄀　䔀䌀䐀㠀䈀㐀㜀㔀䌀㔀䔀䄀䐀㔀䔀䈀㤀䈀㜀㜀㔀䔀㔀䐀㔀䌀䈀㘀㜀䐀㈀㠀䌀䐀䈀㜀䈀㄀㌀㌀䄀㤀䈀㘀䐀䄀䄀　㔀䈀㄀㈀䔀㐀㄀　㌀㠀㈀㘀㤀㐀䔀　㐀䄀㈀䄀䘀㌀㈀㔀㈀㔀䘀㤀䌀䄀䐀㠀䔀㘀㠀㐀䘀䌀㄀䌀㔀㤀㤀㈀㘀㈀㄀㌀䔀䄀㤀㜀㠀䔀　䌀　䔀䈀㘀㜀㜀㔀㜀㈀䔀䐀䄀䈀㜀䈀䈀㌀　䄀䘀㘀䘀㜀㌀㔀㐀㐀䌀㐀㌀㈀㌀䄀㌀㈀㤀㔀䐀䐀　　㠀䌀㔀㜀㌀㔀㔀㠀䈀㈀㌀䄀䔀㘀㔀䘀㜀䔀㘀㤀㘀㤀㘀䌀䐀䈀䈀䐀㤀㘀䔀㠀䘀㘀㠀䌀䄀䌀㠀䌀䔀㐀䔀䘀㄀㜀㐀㈀㌀䘀䘀㌀䈀䄀䘀㤀㜀䘀㠀㔀䘀䈀䘀䘀㠀㌀䄀㔀㤀㈀㈀䘀㘀䘀䈀䘀䐀䐀㈀䌀㔀䐀㜀䄀㔀䐀㜀㐀㄀㘀䈀㠀　㜀䄀㤀䐀㤀　㤀㄀㜀䘀䈀㐀㄀䐀䘀㘀㈀䈀㜀䈀䔀㤀　䐀䄀㔀䘀䐀䄀䌀䌀㘀㤀䘀㘀䈀　䘀　㈀㤀　䈀䐀㄀䔀䘀㈀䈀㤀䔀㈀㔀㐀㜀㔀㘀䘀㔀㔀䘀㜀㌀㘀㜀㔀㄀䘀㌀䔀䄀䘀㤀䐀㜀㔀㌀䌀㜀䈀㌀䘀䘀䈀䘀䌀䔀䌀䔀㌀䔀㐀㔀㤀䘀䐀㠀㜀䔀䘀䌀㜀䘀䔀㈀㠀㈀㜀㌀䘀㌀䘀䔀㜀㐀䔀䈀㈀䘀㤀㘀䈀㈀　㌀㜀㤀　㤀䈀㐀㐀䄀㠀㔀　㔀㄀㄀䔀䘀䌀㜀䌀㌀㌀㤀　㤀䈀㄀䈀㘀　㄀䄀䌀㠀㜀㘀㌀㈀㠀䔀㔀㐀㌀　䐀㜀㐀䐀䈀㔀㤀䐀㜀䌀㌀䄀㈀㜀㌀䘀㈀䘀㠀䘀㌀㘀䌀㘀㄀㜀䌀㠀䈀㤀䐀　㜀䄀䈀㈀䘀䐀㈀䈀㘀㤀㜀䌀㈀㜀䄀㄀䐀㠀䈀䈀㘀㄀㤀㌀　㌀㐀㜀䄀㄀㤀䘀　㘀　㈀䈀㤀䔀䘀䌀㈀　㄀䈀䔀　㜀㠀㠀㐀㘀䐀㈀䐀㤀㄀䔀䐀㠀䔀　㄀㜀䘀㈀䘀䌀　㔀㤀㌀䐀㔀㐀　䐀䐀㤀㔀㤀㌀㤀㌀䌀䘀䈀㠀䐀㐀㐀㘀㈀㄀㈀䐀㄀　㄀䘀㤀㈀䌀䈀䐀䔀䌀䔀䌀䘀䌀㤀䌀䘀　㘀㘀㈀䘀䄀㘀㌀䘀㘀䘀㐀㈀㜀㄀㜀䐀㄀㜀䌀䔀㔀㤀㜀䘀䌀㄀㌀䘀䌀　䘀㔀㄀㈀㤀㔀䄀㠀㤀㤀䔀　䄀䘀㘀䘀㐀㈀䔀䌀㜀䐀㜀㈀䘀䌀㔀㈀㌀㐀䈀䘀㄀䈀　　㜀䘀㜀㜀㠀䘀　㠀㠀㄀䈀䔀䘀㐀䄀䌀㐀㤀䈀㄀㈀㜀㄀㜀㄀　㈀㐀䔀㠀䘀䌀㈀㈀㔀㄀㈀䌀䔀㤀　㌀　䄀䄀䌀䄀䌀㔀䈀㤀㠀㔀㠀㔀㠀䔀㄀㔀䈀㄀䘀㈀䌀䄀㜀㤀䈀㘀䐀㠀㄀㔀䈀䄀䐀㠀䔀䄀䐀㠀䔀㘀㔀㠀㌀㘀㜀㘀　㔀　　䐀㤀㠀䄀㄀㔀䌀㘀㔀㔀㐀㤀㄀㤀䌀㤀䌀㤀㔀㔀㄀㤀㐀䔀㈀㌀㌀㘀㈀㘀㈀㜀　㄀䘀㈀䔀㔀䌀䄀㔀㤀䘀㌀㠀㈀㐀㄀䐀㄀㤀㤀㤀㔀䌀㄀䄀䔀㈀㠀䄀䌀䌀䐀䔀㈀㐀㔀㠀㄀㌀䌀㘀㌀㈀䈀　䘀㔀䌀䌀䄀䌀䈀㈀䈀䈀䘀　㐀㐀㄀㜀㘀㘀　㌀㈀㈀䘀䌀䘀㄀㈀㜀㠀㈀㌀　䘀䄀㈀䘀㈀㐀䈀　㄀䘀䘀㈀㔀䈀㈀㈀䔀㄀䌀䈀　㐀　㘀㤀䐀䐀㌀䈀㌀㘀　㄀㄀䔀㤀㔀䄀㜀㐀　㠀㐀㔀䈀　㌀䈀㤀㌀㤀䄀䐀㄀㄀㌀䘀㘀䔀㈀䘀　㄀㈀㌀㄀㌀㐀䈀㐀㄀㘀㤀　㄀㔀㜀㔀㐀䄀㠀䈀䌀㔀㈀㐀㜀㄀䔀䈀㜀㤀䄀㄀㠀㘀䐀䔀䄀　㈀㌀㘀㤀　㐀㜀㔀䔀䈀䄀㠀㌀䔀䌀䌀䐀䌀㐀　㈀㔀䌀䌀㄀㔀㘀㘀䈀䔀㈀㈀㄀䔀䈀㘀㈀㘀㠀㈀㘀䌀㐀䈀䈀䐀䔀䐀㄀䈀㌀㌀㤀䐀䈀䄀䔀㜀䘀䄀㐀䔀䈀㠀㜀䈀䘀䈀　㤀㔀䈀㘀䐀䘀䘀㔀䘀䄀㠀䐀㈀䘀䘀䔀䌀䘀㈀䌀㐀㄀䔀䘀䄀㠀㄀䄀㔀䌀䈀䐀䔀㄀䔀㠀䔀　㘀䄀䐀㜀䘀㄀䌀䌀㤀㄀㐀㜀㜀䔀㜀㈀䘀㌀䐀㔀䌀㜀　㜀　䄀㈀㐀㜀㌀䈀㄀䔀䌀㤀　　㔀㜀㌀㐀㜀㐀䄀䘀䘀䘀㔀㐀㜀㘀䈀䐀㜀䔀䔀㘀䘀㈀䄀㐀㠀㄀　䐀䌀㄀㔀䐀䈀㤀㘀䄀䐀㌀䈀䘀㌀㐀　䈀䘀䔀䌀㔀䘀䔀㈀㐀䄀㐀䄀䄀㤀㈀䘀㐀䘀㜀䐀䘀䔀㤀䈀㘀㔀　㌀䐀䐀㈀䐀㌀㔀㠀㔀㄀㘀㔀䈀㐀　䌀䄀㔀䄀䔀㄀㈀䐀㘀㤀㔀䔀䔀　䘀㈀㈀䔀㄀䈀㘀䔀䌀㠀䔀䌀㜀䘀㜀㐀㐀䈀䈀䔀㜀䘀䘀䐀䔀㄀㜀㔀㠀㔀㜀䈀䄀䈀㐀㌀䘀䘀䈀㄀䔀㄀䐀㘀㈀䐀䌀䈀㔀䐀䔀㤀㄀㔀䌀䌀㐀䘀　䌀㜀㘀䈀䈀㔀䐀㘀䘀䘀㐀㄀㔀　㜀㄀㜀㈀䐀㐀䌀䌀䌀㔀䔀㔀㘀䔀㠀䌀㠀䔀䘀䈀䄀䔀㌀㈀䄀㤀㠀㠀㤀䈀㌀㔀㜀㌀䔀䔀　䘀䘀　㐀㌀㌀㤀㄀㠀䄀　㈀㘀㠀㈀䌀䐀㠀䐀㈀㤀㌀㌀㜀㤀䄀㌀㜀㤀㘀䌀㜀㤀㘀㘀㘀㈀䘀䌀䐀㘀㘀㘀䔀㐀㠀䌀㈀　㜀㔀䐀㜀㠀䌀㐀㠀㔀㔀㌀㔀䐀㜀㠀䌀䌀㠀㤀㐀㜀㤀䌀䈀㠀㈀㤀　䄀㌀㜀㔀䄀㜀　㠀㤀㄀㄀㤀㜀㘀㠀㜀㄀㄀㜀㠀㌀㘀䘀㐀䐀䌀㔀䔀䈀㔀㈀䘀㜀䄀㐀㌀㈀㌀㔀䄀㤀㌀㠀㈀䐀㄀㔀䄀㜀㈀㈀㘀㐀㤀㜀㌀㌀䐀㈀㜀䐀㘀㤀㜀㄀㠀㤀㄀㤀䔀㐀㄀䐀㌀䐀㤀㐀㤀䄀䔀䔀㠀䔀㠀䈀䔀㌀䘀䐀㔀㤀㘀㘀䐀㘀㤀㌀䌀㔀　䈀㌀㐀䄀㈀㈀㐀㐀䘀　㤀㄀㔀㤀㤀䔀㜀䔀㔀䘀㤀　㌀㜀㐀㐀㌀䌀㐀㌀䄀㔀㌀䌀㠀䄀䐀㤀㠀　㠀㌀㠀㤀䈀㈀㄀㐀䈀㤀䄀㐀㤀㠀䄀㐀　㐀㄀䈀㠀㘀䔀㠀䐀㘀㘀㐀䄀㤀　䐀㠀㔀䐀㄀㠀䌀䔀㈀䄀䘀㤀㤀䈀䈀㈀㐀㜀䔀䔀䘀䘀䘀㘀䐀㔀䐀㜀䘀䘀䔀㈀䄀㄀䔀㘀㤀䐀㌀䘀䌀㐀䌀䔀㈀㜀　䔀䈀䔀㜀㄀㐀䈀　䐀㈀䈀㤀㠀　䐀㤀䘀䈀䐀䌀　䘀㌀䘀㌀䈀㘀䐀䔀䈀㌀㘀䔀䌀䐀㠀䐀　㌀㈀䐀㈀㤀㤀㜀䌀䘀䈀　㌀㜀㜀㈀䐀䌀㤀㤀㤀㌀䔀䈀㤀䔀㌀䌀㌀㈀㠀　㄀䘀䐀䔀䘀㠀䌀㠀䘀　䄀㈀㄀㔀䘀㜀䈀䔀㜀㌀䐀䈀㜀㜀䘀㄀䌀䄀㌀䘀䐀䘀㔀㐀㜀㌀䐀㌀㜀㜀䘀㘀䐀䄀　䈀㄀㜀䄀䘀㈀䔀㜀㈀㤀㘀䌀㘀㜀㜀㌀䐀䐀　㔀䈀䔀㠀㔀䘀䈀䈀㘀䘀　㔀䔀䔀㜀㔀㄀㐀䌀㜀㤀䐀㜀䔀㘀㄀䐀䔀䔀㠀㘀㤀䄀㈀䈀䈀䔀㐀㜀䐀㤀㔀㄀䘀䐀㌀㜀㜀㄀䐀　㜀㠀㈀　䈀㄀䐀㈀䔀㤀㜀　㌀㌀㄀㌀㈀㘀㈀㠀䄀㤀㠀㈀䄀㠀㘀㜀䌀㘀䈀㠀㐀䌀㤀㘀㌀䐀㄀㄀䈀㠀䌀㤀㈀㘀㐀㌀㐀㌀䄀㐀䌀㘀㘀䐀㤀㘀㐀䄀䔀㌀㘀䔀䘀㌀㐀㌀㌀䔀㤀䔀㘀㄀㈀㌀㌀㘀㌀㌀㌀㘀㌀䈀㌀㈀㤀䌀䄀㘀㈀㘀㄀䈀㐀㔀㤀　䔀㄀䈀㈀䈀㤀㤀㄀㤀㤀㜀㄀㄀㤀㤀㐀　　㜀㈀㜀㈀㘀㈀㘀䌀䄀㈀㜀㠀㠀㈀㈀㠀㈀䈀㘀㘀㄀䌀䄀䘀䘀㄀㠀㜀䐀㘀䄀　䄀㌀　䌀䔀㐀䘀㔀㠀㐀　䐀䐀㘀㌀䄀㄀㜀㈀㐀䌀㜀㄀䐀㈀㘀䔀䔀䈀㄀㐀䄀㌀㔀䄀䐀㘀　䈀䐀㤀㔀䘀㈀　㐀㈀䌀㔀䈀㠀㐀㔀㈀㜀㠀䐀㔀㄀　䘀䐀䘀㜀㌀䔀䐀䈀㤀䘀䐀䈀㔀㌀㄀㐀䘀䈀䔀㠀㐀㠀䈀䌀䘀㘀㐀䔀䈀㌀㈀䈀㘀㔀䐀㜀㌀㐀㜀㜀䐀䘀䈀䈀䘀㠀䌀㈀䌀㌀㈀㤀䄀䌀䔀䈀　㐀䈀䌀䈀䈀㘀䌀䐀㄀䘀䐀䈀䐀㤀㜀㐀䔀㐀㜀䌀䌀䘀䔀㔀㜀㜀䘀㤀䘀㄀㤀䘀　㘀㤀䄀㄀㘀㈀㘀㘀㜀㘀䌀㜀㠀㘀　㈀　䈀　㘀㌀䐀㄀㘀㔀䘀㈀䔀㤀䐀㔀㈀㘀㠀㐀㠀㐀㌀䌀䔀　㘀䈀㌀䔀㌀䄀㄀䈀䔀䌀㈀䐀㌀㈀䔀　䌀䌀䄀䌀㈀䌀㐀㜀㜀㘀㠀䔀㤀䌀㤀䐀㤀㌀㤀㌀㤀䐀㠀䐀㐀䌀㐀㘀㘀䈀㤀㐀㤀㤀䈀䌀㜀㜀㈀㈀㔀㤀㘀㐀䌀㤀㌀㈀㘀㈀䌀㄀䐀㔀㄀㘀㤀䌀㘀䔀䌀㄀㌀㘀　䈀䈀㘀㐀㠀㄀㈀㜀㈀㌀䄀㤀䄀㄀䌀㘀㌀　䔀䌀㘀㌀㄀㘀䘀䘀䔀㜀䌀㐀㔀㄀䄀㤀䈀㄀㠀䈀䌀㤀㘀䌀㄀㐀㔀䔀㐀䐀䐀㄀䌀䔀㠀㜀㤀㔀䔀㐀䔀㔀㄀㔀㘀䄀㘀㈀㌀㈀㤀䌀㤀㈀䔀㔀䈀䄀䐀㠀䌀㤀　㘀㔀䈀㜀㐀㌀㠀䔀㤀䐀㤀㔀㠀䐀䌀䌀䐀㈀㜀䌀㘀㈀㠀㌀㄀㌀㌀䘀㤀䄀㤀　㜀䔀　㐀㈀㈀　　䄀䈀䌀䈀䄀㌀㈀㘀䔀㜀　䘀㄀　㐀䐀　　䄀㔀㤀㠀㤀㈀　㔀䌀䔀㘀䈀㈀㔀㈀㜀㘀㈀㄀㔀䔀䐀㔀　䌀㐀㐀㌀䌀㈀㄀䌀　䈀㈀㘀㜀㔀㘀㌀䔀㄀㈀㔀㐀㄀㐀㔀㌀䄀䄀䄀䘀㄀㐀㔀㠀䄀䌀㜀㄀㘀㈀㤀㈀㘀䔀䘀㠀䌀㔀㘀䔀䌀㘀㜀㈀㜀㐀䐀㔀㈀㔀㈀㐀㔀䘀㜀䄀㈀䔀㄀䄀㜀㜀㘀㐀䔀㠀㤀㈀䐀㜀㔀䔀䈀䈀䔀㔀䈀䄀䄀䔀䈀䄀䔀䔀䐀㔀㠀㘀㐀䐀　㄀㔀㔀䔀㜀䐀䌀㌀㤀䐀㜀㔀䌀䐀㜀㜀䘀㐀㤀㐀㤀㠀䌀䌀㘀㜀㔀䔀㠀㈀㄀䌀㈀䐀䄀㤀䈀㈀㜀䈀䘀㄀䘀　㤀㌀䄀㐀㈀㤀䈀䈀㜀㐀䔀㄀㐀　㜀䔀㐀㔀䐀䈀䘀䌀㠀㐀㄀㤀㄀㈀㜀㔀㔀㘀䘀㐀䄀䘀㔀㠀䈀䌀䈀㔀㌀㘀㈀䐀㜀䐀䘀䐀㔀䐀䐀䈀　䄀㜀㘀㔀㜀㔀䐀㠀㘀㘀㘀䌀㄀䔀㄀㤀㈀䌀㔀㔀㜀䌀䐀㠀䈀㔀㜀㤀䄀㄀㄀　䐀㌀䄀㜀㤀䔀㔀　㌀㐀䐀　䔀㌀䘀　䔀㄀䄀㌀㐀㄀㠀㔀䌀䈀　㔀㌀䈀䌀㐀㄀㘀㐀䌀㘀㌀㐀䄀　㄀䈀㈀㘀㠀㜀㔀㄀㤀㈀㠀䐀　㘀䈀䐀㐀㔀㌀㈀㌀㘀㄀㤀㜀䈀㠀䌀㠀䌀䐀㄀　㘀䈀㤀㤀䌀䔀㐀䘀　㈀　㠀㘀㜀㄀㌀㠀㔀䌀㌀㈀㔀㄀㌀㔀㤀㌀㄀㄀䈀㤀㤀㠀䈀　　䔀䐀㤀䌀䌀㄀㈀㄀㄀㔀䘀䌀　䄀䘀䔀㠀　䔀㔀㄀㈀㐀䄀䌀㐀䄀㐀㌀㔀㄀㤀䈀㔀㘀䔀䄀䈀䐀㠀㠀㄀䔀䌀㔀㐀䄀㘀㄀㄀㤀䈀㔀㘀㈀㔀㘀䄀㌀㐀㐀䌀䔀㘀　㌀㜀䔀㐀䔀㤀㔀㘀㤀㄀㌀㜀㘀䌀㔀䐀㄀　㐀㜀㌀㌀㤀㔀㤀㄀㈀䄀㄀㐀䈀䄀㌀　㐀䈀㠀㔀䘀㠀䘀㄀䌀䈀㘀㜀㔀㐀㈀㔀㜀䄀㜀㄀㄀㌀䔀䈀䘀䔀㔀䈀㘀㔀䄀㐀㄀㈀䈀㄀㈀㐀　㌀㈀㘀䐀䘀㜀㈀䌀㘀㌀䔀　䐀䈀䌀䔀㤀㔀㄀㘀䐀㌀　㄀㔀䔀㤀䘀㔀㈀㈀㘀㘀㄀㠀㠀㠀㤀㜀㔀㤀㠀䔀㜀㌀　㠀䄀㈀　䌀㔀㄀㜀㈀㈀㘀䈀㠀　㈀　㄀　㈀㘀㐀㠀㄀㄀㌀䐀䌀㄀䄀㄀䐀㈀䈀䈀䄀䌀㄀䔀㤀㤀㐀㐀䘀㐀䔀䌀　㈀䘀　䌀㤀䔀䘀㠀䐀䌀䐀㘀㌀㄀㌀䄀㔀㠀㌀䄀䈀㔀㜀㤀㜀䔀䄀䄀　䘀㌀　㜀　㌀㜀㘀㐀㐀䘀　㄀䄀䐀㄀䈀㌀㈀㈀㤀㈀䘀䘀㘀㌀　㌀㜀㈀㜀䈀䘀㜀䘀䔀㤀䘀䐀䔀㐀䌀㤀䔀㄀䔀㐀㔀䘀㔀䘀䘀䄀　䐀㌀䘀䘀䔀䘀㐀㘀㜀㠀䘀㌀䌀䘀䐀㌀㐀㜀㜀㤀㔀䘀䄀䈀䌀㜀㄀　㐀䘀㈀㘀䘀㄀㤀㘀㔀䄀　㤀䈀㠀㌀䔀䈀㐀㘀㔀㌀䘀　㐀㠀䔀䌀䄀㄀㔀㠀䄀㘀㈀㤀䈀㘀㈀㜀㤀㘀㌀㤀㘀㠀䌀㘀䄀㤀㘀㘀㜀䌀䐀㠀㠀　㜀䐀　㘀㈀䌀㄀䄀䈀　㔀䔀㄀䘀䄀䘀㌀䘀䄀䌀㘀㜀䐀㌀㐀㔀䄀䌀㄀㜀䔀㌀㐀㔀䄀㘀㄀㄀㘀㌀㘀䈀㔀㐀㤀㐀䐀㜀㈀㈀䌀䈀㄀㘀㐀㐀㤀㐀䐀䌀䈀㈀㐀㄀䔀䔀㤀㜀㄀㤀㐀㤀䌀㘀䈀㈀䔀䌀㠀䈀㜀㘀㐀㤀㔀䄀䄀䌀䈀㔀䌀䄀㘀㈀㤀㐀㐀㔀㤀㌀䔀㐀㌀㐀㘀㤀䔀㌀㈀　㌀䈀䄀㈀䔀䔀　䈀䔀䌀㜀㘀㠀㈀㌀㠀㈀䘀䘀㈀䄀㐀䄀䌀㌀㔀䈀　㤀㜀㤀㠀䔀䌀　䌀㔀㤀㐀䘀䘀䘀㤀　䈀䌀㠀㔀䌀㠀㜀㠀　㄀䄀㜀㌀䌀㤀㐀䘀㄀㘀㈀䐀㔀㜀㜀䄀㤀㤀䄀䌀㠀䈀㄀䐀㈀䘀䐀㐀䘀䐀㘀㔀䔀㜀㌀㔀㔀㐀㄀㜀䄀㐀䐀䌀㜀㠀䔀㜀䐀䌀㄀䔀䘀㜀㐀㈀㔀㤀䘀㜀䄀䘀㜀䘀㄀㔀　㠀䔀㌀㔀䐀　䈀㠀㘀㐀䔀㤀䈀㔀㘀䐀䌀㔀䐀䔀䘀㈀㌀㔀䈀㤀㘀㔀䔀䐀䘀㔀㈀㔀㈀㤀㔀㄀䘀㜀㤀䘀㈀㠀䔀㤀㜀䈀㘀㐀㜀㌀䘀䈀䘀㄀䈀䈀㜀㜀䄀䔀䌀㤀㌀䄀䘀䘀䘀㠀㘀㜀㌀䘀䌀㜀　䘀㘀㜀㘀䘀㘀䄀㈀䄀㘀䐀䈀䐀䘀䘀䐀䈀㤀䈀䌀䄀㌀䈀㈀䄀㤀㈀　㌀䄀䈀䈀㜀　䔀　䐀㤀㈀䌀䘀㔀　㔀䘀䘀㤀㄀㌀㤀㌀㐀㈀䐀䘀㈀䔀䄀䈀　㠀䄀㘀　䄀䄀㈀㠀㠀㐀㤀䔀䄀㈀㜀㐀㌀㜀䄀㈀䔀㈀䘀㠀㔀䌀䌀　䘀䌀㤀㄀㠀䌀㤀㤀㈀䘀䌀㤀㄀䌀䌀㐀㈀㔀㈀　䔀㠀㄀䄀㘀䌀㘀㈀㤀㠀䈀㐀㘀䔀　㠀㠀䐀䄀㄀䐀䔀㔀㘀㠀㘀　㘀䄀㄀㘀䘀㈀㘀㈀䄀㤀䘀㠀㔀㔀㤀䐀㈀㤀㈀䌀䄀㈀䌀䘀㠀㜀㔀㔀㘀䐀　㤀䔀　㔀㈀㤀䐀䔀㠀䌀䔀㠀䌀㐀䄀䈀㜀䔀㤀㌀㌀㔀䄀㄀㈀㐀䄀㤀㘀䘀㤀䄀㈀㘀㈀　䌀䈀䘀㌀䄀㠀㔀㌀䈀䈀䌀　䈀㄀㈀䐀䐀㄀㤀㌀䌀䘀䈀䄀　㔀䔀㐀㠀䌀䌀䄀䘀㐀䄀㈀䘀㄀㠀㈀㤀䔀㔀㐀㠀　䔀䈀䈀㄀䘀㠀　䘀䔀㈀㈀㤀䘀　㔀㤀䄀䐀㄀㄀㠀䌀䌀㄀㈀　㔀㐀㄀䄀䘀䐀㌀㈀㈀㈀䐀䔀㠀㠀㘀㄀㘀㈀㄀㈀䘀䐀㘀䌀㠀㄀㠀㘀䈀㜀㘀㘀䄀㌀　㘀㐀㐀䘀㈀䌀㐀䈀㄀䔀䔀䔀㌀　㜀䄀㄀䘀䄀䘀䐀㔀䔀㠀㜀㠀䌀㠀䈀䄀㐀㐀㐀㐀䔀㐀䘀䌀䌀䈀　㤀㠀㤀䄀㠀㐀㠀㘀䈀䄀㐀㠀䔀㐀㠀㄀㌀㄀㌀㄀㈀䌀　㌀㌀㔀㔀㄀㔀㜀　㠀䔀㔀䔀㤀䄀㘀㤀　㜀㐀㠀䄀㘀㠀䐀㜀㌀㐀䘀㐀䌀䈀䌀㤀䌀䘀㠀㜀㈀䘀㄀㠀㤀䔀㈀㄀㜀㄀㌀㔀䘀㘀㐀䔀䘀㌀䘀㠀䌀㜀㔀䄀㄀㐀䘀　䘀㄀㌀䐀䈀㐀䈀　㤀㌀㔀䐀㄀㐀䌀㌀䄀　䘀䐀䐀㄀㜀㘀䌀㈀䄀䌀䐀䌀㄀㐀䐀　䔀㔀䌀　㤀䈀䘀㠀㤀㠀䐀㠀㤀㐀䌀㜀㔀　䌀㐀䔀㠀㠀㠀䈀䘀㌀䐀䄀㜀㌀㘀㔀㐀㠀㤀㔀㔀㄀㔀䔀䄀䔀䈀䐀䌀㤀㠀䔀䔀䐀㜀䐀䈀㤀㔀㠀㠀㈀㐀　㈀㌀㔀㜀㤀㜀㤀䘀䔀䔀㐀䄀㐀䈀㐀䔀䐀㘀䔀㤀㠀䐀㐀㘀䄀䘀㐀䔀㤀㐀㈀㄀䘀㤀㐀㌀㌀䄀㐀㤀䌀㜀䔀㠀㜀㈀䈀㌀㤀䌀　㤀㈀䔀㜀㌀㤀䌀㔀䐀㈀䘀㘀䄀䐀㈀䐀㌀㠀䌀㄀㘀䄀㜀　䔀㌀㄀䄀䄀㈀㐀䐀䘀䌀㠀䄀㌀䄀䔀㄀䐀㈀㠀㌀㈀㘀䄀䌀㔀㈀䌀䔀㤀㐀㠀㘀㤀㜀　䐀㄀㐀䄀㠀䐀㤀㌀㜀䌀䘀㘀䌀㈀䘀㐀㌀㤀㤀䐀　㤀㈀䈀䌀䈀㜀㐀㤀㘀㐀䈀㤀㘀㐀䐀䌀㤀䐀㄀䈀㐀䄀㤀䐀䄀䌀㈀䘀㔀㈀㐀䔀䘀㤀䐀䐀䘀㔀㔀㤀䐀㐀㘀㌀㌀䐀䘀䔀䄀䔀䄀䐀㈀䈀䔀䄀䈀㤀㘀䐀䄀㘀䌀　㤀㄀䈀㐀䘀䈀䘀㄀䐀䈀䐀䔀䌀䔀䄀㤀㌀㜀䈀㤀㘀㄀䐀䔀䌀㈀㠀䔀㔀䐀㠀䄀㜀㌀㘀㜀㘀㈀䌀㄀䌀㘀㠀㔀㤀㄀㐀䘀㔀䐀㈀䌀䘀㤀㈀㄀㜀䄀䐀　䐀㔀㐀㜀䌀㤀㔀䄀㐀䌀㌀㠀䐀䐀㤀㘀㔀㠀䈀㌀㌀㘀䄀㜀䈀䌀䈀㠀䈀㘀䘀㠀㐀㜀䌀䘀㠀䐀㌀䘀㘀䌀㜀㜀㜀㔀㔀䈀㠀㈀䈀㜀䄀䄀䄀䄀䌀　䔀㠀䈀㌀㌀䈀䔀䄀䌀䌀䔀䈀䐀㘀䌀䌀䘀䐀䄀䘀䘀㘀䄀㘀䈀䘀䔀㜀䘀㔀　㠀䈀䄀䘀㔀䌀　㤀㌀䘀䐀㤀㘀㐀㌀㐀䔀㐀㌀䈀㤀䌀㄀　㐀㌀䈀䔀㤀㤀㤀㄀㐀䈀䔀㜀　㘀㈀　䈀䘀㠀㤀㐀㘀㌀㜀　㔀㄀㜀㤀䈀㐀䐀㔀㘀㄀㄀㈀㈀㌀䐀㈀䈀㘀㜀䔀㔀䈀㠀　　䄀䘀㤀㄀㜀㤀　䐀䌀䘀㘀䈀㘀䔀䐀㄀䔀　㌀䐀㄀䄀䈀䌀㄀㤀䈀㐀㔀䈀䌀䈀䔀㠀　㐀㤀　㄀㠀㈀㐀䐀㠀㐀㠀㈀䈀䐀㌀䘀䘀㜀㌀　䐀㠀䔀㠀㔀㘀㔀㜀䌀㤀　䘀㈀㠀䄀㔀㘀㐀䔀㄀㌀㄀䐀　䐀㌀䄀㜀䘀㠀䔀㌀㤀㜀䔀㠀䄀䌀㌀㠀㠀㄀㜀䐀㔀䐀　　　㤀㐀　㔀㤀㈀㤀㔀　㤀㔀㔀䘀㤀䌀㌀䈀㄀　㄀㐀䘀䐀㄀　䘀㤀㐀㠀㔀䌀　㘀㈀㘀㐀㈀㔀㜀㠀䘀䔀㄀㈀㘀㈀　䈀䄀䌀㤀䈀㈀　㈀　䌀䈀㘀㘀䈀㌀　㔀䔀　䔀㄀㈀㄀㌀䄀㐀㠀㜀䘀䄀㔀㌀㠀㈀㐀㌀䐀䘀㜀㌀䄀㜀㌀䘀㈀㠀䐀䈀䌀㄀䌀㠀䐀䄀　䔀㄀㌀㠀䈀䐀㘀䌀㜀㌀䌀㐀㜀䌀　㌀㔀㜀㠀㘀䌀㘀䈀㤀㠀㄀䌀㤀㄀䐀䐀㠀㤀㜀㔀䌀㤀　㤀㤀㄀㄀㤀㜀㤀　㤀㤀㔀㔀㤀　㄀㈀䘀䄀㌀㤀䌀㤀㜀㈀䄀䘀䘀䌀㠀㄀䘀䈀㌀䔀㜀㜀㄀䐀㐀䄀㐀㜀䈀䈀㠀㌀䐀㔀㄀　䌀䘀㜀㔀㜀䄀䘀　㄀䄀　䘀䄀䔀䘀㐀䔀　䄀㘀㐀㐀㄀䌀㤀㌀䐀　㤀㠀䌀　䔀䌀㠀䔀䌀㔀㠀㜀䄀㈀䘀　㐀㄀　䈀䐀䔀㘀㔀䌀㐀㔀䈀䔀　䐀㜀㠀　㘀㔀㔀㜀㜀㐀㌀㐀䄀　㔀䄀䈀䄀㤀㐀䌀䔀䄀㐀䄀㜀㘀㜀㌀䄀㔀䐀㐀㠀㤀㐀㐀㐀㐀㘀㐀㐀䔀㤀㜀㈀㜀㐀㌀䄀㤀㐀䄀㐀㌀㠀䄀㜀㄀㤀㤀㠀㌀䈀㤀㤀䔀㐀䔀㐀䘀㔀㘀䄀䘀㐀　㜀䈀㤀㤀㐀㠀㔀㠀㘀㌀䐀㠀䄀　䘀㈀㔀㤀㄀䘀㜀䌀䌀䐀㠀㘀䘀㈀䄀䘀㐀㔀䈀䌀　㔀　㈀　䐀㜀㘀㘀䈀㌀㜀㐀㔀䐀㌀䈀㄀䌀䘀㤀㜀㄀䘀䈀㔀㈀㌀䈀䄀䘀䘀䈀䐀䄀䄀㘀䘀䔀㔀㌀䘀䈀㤀㜀㜀㐀㤀䘀䘀䔀䘀㐀㐀㠀䌀䘀㌀䐀䐀䐀䘀㌀　䌀䄀㜀㠀㐀䄀㐀䈀㈀䔀㘀䘀㤀㤀䈀㤀䘀䈀㤀䈀䄀㈀㈀䈀㌀㘀䔀㐀䈀㜀　䔀㄀䌀　㠀㘀䐀䄀㐀㐀䐀䌀䈀㘀䘀㈀䌀㘀䘀㘀䄀㈀㠀㔀㔀㜀㤀䘀㄀㠀㌀䌀㌀䄀㌀㤀䈀䔀㌀㤀㜀㜀䔀䐀㤀䔀䄀㔀䄀䔀䄀䌀䘀䄀㄀㈀㜀㜀䌀㌀䔀䐀䐀䘀䐀䔀䐀㄀䈀㠀㘀㜀㘀㔀㐀䄀㐀䄀㐀㔀㜀䈀㄀㤀㈀㠀䔀䔀㜀㈀㤀㠀䌀䈀㌀㜀㘀㄀㈀䔀　䐀䌀㠀㠀䔀䈀㘀　㔀㈀䈀䐀㜀䌀㜀䔀　㤀䄀㄀㠀䈀䌀㔀㘀䌀㈀㐀㌀䌀㈀䘀㔀　㈀㤀㌀㈀䌀㜀㐀　㤀䌀䌀䈀　䔀䔀䄀　㠀䔀䔀㤀䔀㄀䘀　㈀㄀㄀㘀㠀䘀䈀㈀䈀㠀㤀㌀䌀㔀㄀䄀㤀㜀䘀㈀㈀㠀䌀䘀㘀䄀㠀㠀䈀㜀㠀㌀㘀㜀㌀　㈀　䐀㤀㠀　㤀　䐀䘀㔀　㘀䔀㘀　　䌀㐀㘀㤀䘀㐀㄀䈀㐀䘀䈀䐀　㌀㤀䔀㘀㔀㤀䌀䄀䔀䌀䈀㐀㄀㌀㔀　䈀　㜀㤀　㘀䄀㌀䐀㠀䄀䐀㐀㐀㈀㜀㄀䄀䌀䔀　䈀㐀㘀㄀㄀㠀㘀　㔀㈀䘀㔀䔀㠀㠀䌀㜀㜀㘀䈀䐀㜀䌀䄀㠀䄀䄀䘀㤀㜀㠀䔀㠀䐀㌀㘀㜀㐀㈀䌀㄀㜀䘀䘀䐀䘀㔀㐀䐀䄀䘀䔀䌀㈀㤀䘀㄀䄀䐀䐀䔀䈀㌀䘀䌀㄀㈀㌀㜀㌀　㜀䘀䔀㜀䘀㄀䔀㄀䘀䈀䘀䔀䘀㈀䐀㐀䘀䄀䄀䘀㈀䌀㌀㤀㜀　㘀㘀䄀　㜀䄀㘀㜀㔀㌀㈀䔀㔀䐀㜀䘀　㘀　䔀㤀䔀　㘀　䔀䘀㐀㘀㠀㔀䐀㌀　㄀㌀䌀䌀㔀㈀㐀䘀㌀䔀㄀䘀㈀㘀䔀㤀　㄀䔀䌀䈀　㔀㄀䐀　䘀　㈀㈀㈀䘀㠀䄀㔀䔀䌀䌀䌀㠀㘀　䌀㔀㜀䔀㔀䌀㠀䔀㄀㤀䄀䌀䘀㄀　㤀　㈀䔀㘀㜀䐀　䌀　䌀䘀㈀䄀㐀䔀㠀㈀㌀㤀䔀㔀㘀　䐀䌀䄀䄀㜀㐀㘀㌀䈀㌀㘀㌀㄀㄀㔀㐀䌀　㐀䌀㈀䔀㘀䔀䈀㜀㘀㔀䈀䐀䐀㔀䄀㌀㜀㐀䈀䘀䘀䐀㠀䈀㜀㈀䘀　䘀䘀䘀㠀㤀䔀䐀䘀㌀㐀䌀䐀㘀㈀䔀㘀㈀䌀㘀㌀䌀㤀㌀䈀䈀㤀㘀㌀㈀㘀䘀㜀㄀　㌀　䘀㠀㜀㔀䔀㜀䈀㌀㠀㐀㐀䈀䔀㘀㜀㘀㐀䘀㜀㤀㔀㌀䘀䘀　　㘀䐀　䄀㄀㄀㐀㐀　䔀㌀䈀䄀　䄀㈀㜀㈀䔀㜀㐀䔀㈀䌀䐀㌀㄀㜀㠀㔀䐀　䌀䐀䔀㄀䌀㠀䐀㔀䈀䘀㐀㜀㠀㤀㌀㠀㠀䐀㜀㠀䄀㌀㠀㔀㘀䌀㐀㤀䈀㌀㐀㜀㠀㈀䐀䘀䌀䘀㈀㌀㠀㌀㤀㈀㤀㈀㤀䐀㄀㄀㌀䔀㔀䈀㈀㔀䄀䈀䐀㈀㤀　　　䈀㄀䔀䄀䘀䔀䌀䘀㄀㜀䄀㤀㄀　㜀㜀䈀㌀䌀㘀㤀㠀㤀㈀䔀㐀㤀㠀㜀㜀㔀䐀㘀㄀㐀㤀䘀䐀㜀䌀䈀䌀㘀㌀䄀㠀䐀䄀　㐀㠀䄀㜀㌀䐀㈀䔀㈀㜀㘀㈀㠀㤀䌀㔀㔀䘀㔀㈀㜀㈀䈀㠀䌀㤀㌀㜀䌀㈀㠀䄀㄀㐀䔀㄀㘀䔀㤀㔀㔀㐀㘀䔀䄀㘀㔀㘀㈀㔀㤀㌀㄀㜀㔀㜀㈀㈀㄀㈀㠀䄀㘀㤀䈀㔀㈀㈀㘀䈀㐀㌀㐀㔀䔀䔀㈀㈀㌀㜀㜀㜀䔀䈀䄀㄀䐀　㘀㜀㠀㜀㠀㜀䈀䔀㜀㔀䄀㠀䈀䄀䘀㜀　㔀䌀䌀㌀䔀䐀　䘀㜀䐀㔀䘀䔀㐀㔀䄀㘀㘀㜀　䌀䈀䔀䄀䄀㤀䔀䄀䄀㤀㄀䘀㄀　㌀㐀䈀䈀䔀䘀㄀㤀㔀䘀㄀㘀㜀䐀㈀㐀㈀㠀䘀㜀㤀㄀㠀䌀㌀䘀䐀㠀䐀㠀䐀㠀䈀㜀㜀㜀䘀㘀㌀䘀㌀㔀㄀䌀䌀㤀䌀䔀䘀䌀䈀㘀㤀㄀䌀䄀䐀㐀䄀䘀㈀䐀㜀㄀㘀㈀㘀䄀䔀㌀䔀䘀㈀㐀䄀䘀䘀㐀㌀㔀䘀䔀䘀㄀䄀㜀䘀㔀㐀㤀㤀㄀㄀䘀䌀㄀䘀㌀　㈀㌀㈀䌀　䄀　㐀㘀㌀㔀㤀　㈀㜀㔀㐀㐀䘀䌀㌀㄀　䌀䐀㘀㐀㈀㜀　䄀䌀㐀䌀　㈀㐀䈀䌀㐀㜀䘀㈀㈀㠀䌀㜀㌀㐀䄀䐀䌀㄀䈀㠀䔀䘀㜀䈀䐀䔀　㤀䔀㜀㐀䔀㌀㄀䘀㠀㌀㠀㔀㤀㈀䔀䘀㐀㜀　㄀㘀䘀䐀䌀　䔀㄀㐀㠀䘀䌀䄀㠀㈀㤀　㐀㠀㤀㄀㌀䌀㄀䄀䈀䌀　㜀䌀㜀䌀䐀㤀㠀㔀㈀䐀䄀䐀䈀㐀㤀㐀䔀㤀䐀䌀䌀㠀㤀䐀㤀㘀䄀䄀㜀㐀䌀㔀䘀　　㈀㘀㈀䔀㌀㠀㘀㤀䘀䔀㜀㠀䘀䌀㐀䐀㌀　䄀㄀㠀㄀䌀䈀㜀䔀㔀㔀㜀㜀䘀㠀㤀䘀㐀　䔀䘀䐀㄀䔀㠀　䘀䌀㄀䐀䈀㘀䔀㤀㐀䘀㄀㄀㘀㄀㤀䄀㜀䌀㤀䘀㠀䄀㄀㈀㠀㈀䌀㐀㜀㐀㔀　㔀㤀㐀　䘀㔀䐀㄀䔀䐀㔀䔀㌀㐀㌀㜀䄀㌀䌀䄀䄀䌀㜀䈀㈀㌀䔀㐀㤀䌀䘀䘀　㜀䄀㜀䌀㠀㜀㄀㄀　㌀㈀　㔀㈀㐀㜀䌀㜀㘀䈀㜀㘀䘀㈀㌀㜀䘀　䌀䌀㘀㘀㄀䔀㄀㜀䘀㌀䐀㠀䌀䔀㘀㌀㤀㄀䌀㜀䘀㜀㜀㄀㜀㠀㠀㠀䌀㌀㠀䐀㄀䌀䔀㘀㈀㐀㌀㌀䌀䘀㠀㄀㤀䘀㄀䈀㠀䐀䌀㘀䐀㄀㘀㄀㄀㄀㌀㐀㌀㄀䄀㌀㤀　㌀　㘀䐀䄀　㠀䘀䌀䌀㘀䌀䔀㐀㠀㔀㔀㘀㈀䘀㐀㄀㄀㐀㄀㄀㔀㐀㐀㈀㈀䌀㄀㜀䈀　䄀　䐀㔀䈀　㐀䌀㤀㐀㄀㄀㈀㈀㔀䌀㈀㄀㔀䄀䐀㘀㠀䈀䌀　䐀㈀㄀㤀㄀䐀　䘀㔀䔀㔀㄀㔀　䈀䌀㈀㈀䘀㄀㠀䈀㄀㌀㄀㌀䔀　㄀㘀㠀㄀䈀䐀䈀䌀㜀　㠀䔀　　㄀㌀㐀䐀㘀㌀㔀䔀䔀㔀㄀　㄀䌀㈀㌀㤀䌀　䘀䌀䘀䘀㠀㤀㠀㠀㈀䈀　䘀㠀䘀㌀㐀㜀㐀䄀䐀䌀㠀　䈀䐀㈀䌀㄀㐀㘀䈀䌀　㄀䄀㄀㌀㘀㌀　䈀㄀㐀㤀㈀㜀㜀㈀㔀䈀㤀㔀䘀㌀䘀䘀䐀㤀㈀㘀㘀䘀㈀䘀㜀㠀㜀㘀䘀䔀㔀㈀㘀㤀䔀䘀䔀䘀㠀㌀䘀㠀㘀　㐀　䐀㘀㘀䄀㈀䘀㈀䈀䐀䘀㠀䘀㐀䐀䘀䐀㠀䌀㌀㤀㜀㠀㜀䐀㤀　㜀㈀䘀㜀㜀㠀㈀䐀㌀㠀䌀䌀㤀㘀䘀㜀㜀㌀㤀㜀䈀䌀䄀㤀㠀㜀㜀䌀㈀䈀㘀䘀㜀㄀㤀䈀㔀䈀䐀㄀㌀䌀㄀䔀䔀㘀㈀㠀䌀㤀䈀䘀㐀㌀䐀㜀䄀䔀㘀㈀　䌀㈀䄀㌀　㠀㜀㜀㈀㄀䄀䌀㈀㜀㜀䌀㠀䈀㄀　䔀㔀㠀㠀㈀㌀䔀㈀㈀㄀㤀㄀㔀㤀㐀㐀㔀　䄀　㐀　㠀䈀㔀㌀䈀㔀㌀㠀㔀䄀　䈀䈀㠀㠀　䌀㄀㔀㠀　㌀　䌀㤀㘀㄀㤀　㘀㔀䈀䘀　　　㜀㤀㤀䘀　䈀㜀䔀㜀㠀㈀㌀㐀㌀㘀㘀㤀㜀䌀㈀㐀㠀㄀㔀䄀　㠀㜀䈀㈀䄀䌀䌀䔀䈀　㌀䄀㠀㄀㄀㔀㜀㠀䈀䐀㐀㠀䄀　䔀㈀䐀㤀㄀㤀㔀　　㄀㈀㈀㈀㤀㈀㤀㔀㄀㄀䐀䔀䄀㈀䌀䈀㄀㠀㐀㤀㄀䈀　㤀㔀㐀㈀䌀㘀㘀䌀㄀㄀䈀㐀䈀䄀䄀㤀　㐀䄀䌀䔀㐀㤀㌀㈀䔀　㄀㐀䔀㌀䌀㄀㔀㘀䄀䔀㜀䌀䔀㌀䌀䘀䈀䘀㄀　㤀䘀䌀㄀㔀䔀䔀䌀䌀　㤀䈀㘀䔀㔀䘀㈀㘀㌀䄀　㈀㌀㠀䘀䈀㄀㈀䐀㘀㐀䄀㔀㘀㘀䌀䘀㤀㔀㐀䈀㜀䌀　䌀㔀㠀㜀㐀㌀㐀䌀䄀㐀㐀䐀㜀　㘀䐀㜀㘀䘀䌀䔀䐀㠀㤀䐀䌀㄀䄀䌀䌀䈀䌀　㈀䐀䔀㤀㤀䈀䐀㌀㘀䘀㐀䄀㘀㜀䐀㜀㈀㘀䔀㄀䐀㔀㈀䔀䐀䌀䔀㔀㄀䌀㜀㘀㄀䔀㜀㐀䈀㈀䄀䈀㤀䐀㜀㠀㠀䐀䄀㌀䌀䈀䌀㄀㐀　㄀㠀䐀㔀㄀㠀㠀䈀㌀䈀㘀㔀㔀䌀㈀㠀㔀㜀䌀䄀㠀䌀䌀䐀㠀㐀䈀㜀㠀㠀䈀㠀㐀㐀䄀䌀㄀㄀㤀㤀㔀㠀㄀㘀䌀㜀䐀㌀　㜀䌀䄀㠀䌀㔀㘀㤀䈀㘀㔀㜀㄀䘀㔀䄀㜀䐀䔀㤀㘀䌀䄀㐀㠀㘀㐀䔀㄀䌀　䔀㤀䐀㄀㄀䈀㤀䌀㌀㄀㘀　䔀㈀㘀㄀䌀䘀䄀㤀䌀㈀䌀㌀䄀䌀㜀㔀　㄀㘀㈀䌀㤀㜀㤀　䈀䈀㠀㜀　㌀㈀㐀㜀㐀　䌀㄀䄀䄀㈀䌀　䘀㜀　㘀㄀䐀　㘀　䘀㘀㔀㜀䔀䔀䐀㤀䈀㐀䄀䄀䌀㐀㤀㤀䈀㔀㘀䄀㜀㐀䔀㤀䘀䄀㈀㜀䄀䘀䄀䐀䘀㜀㌀㔀䔀䌀䘀䌀䐀䐀䘀㘀䔀㜀　䔀㈀䐀䘀㔀䄀䐀㄀䄀䈀䐀䔀䈀㜀㠀䔀㜀䔀㠀䈀㜀䄀䔀䄀䐀䔀䌀㌀䐀䘀䈀㤀㜀䈀㄀䌀䌀䐀䄀㤀䔀䐀㄀㘀䈀㄀㜀䐀㘀䔀䐀㔀㤀㤀㌀䈀㔀䘀䌀㤀㘀䘀䘀㌀㄀㔀䌀䈀㤀䈀䈀㈀㔀㤀䘀䈀䐀䈀䌀㘀㐀䐀䘀䌀㤀䘀䔀䘀㔀䐀䘀䈀䌀䘀䘀䌀　䘀䄀㐀　䌀䐀㜀㔀㘀㜀䘀䄀㠀䔀㜀䌀㜀䄀䄀㘀　㜀䈀㠀㈀㜀㜀㌀㜀䌀㄀㌀䌀䌀䈀㄀　㤀㄀　䄀㈀㌀㤀㤀㠀㌀㜀䄀㈀㌀䈀䄀㐀㘀㌀㌀㐀㈀䔀䌀㤀㜀䄀㌀䈀㠀㄀　　㔀㌀䈀䌀䌀㄀㘀䌀㌀㜀㄀㈀㄀㠀㌀　㈀㄀䐀㤀㠀㐀㐀㘀䌀㠀䈀㜀㄀䈀㤀㤀䌀䄀㐀䐀㠀䌀䌀㤀䔀䌀㌀㌀㄀㠀䔀䌀㐀㘀㔀㌀　㐀㄀䄀㄀　㔀　䄀㜀㌀䔀䈀㘀㜀㔀㤀㘀㤀㌀㈀㔀㈀䌀䄀䄀㘀　㘀　㘀㈀䈀䌀㄀㐀䌀㈀䘀㌀　䄀㔀㔀㌀　　㠀䔀㈀䌀㜀䘀䈀㠀䘀㜀㔀䔀㔀㈀䌀䈀㠀䔀㘀䈀䈀㌀㜀㠀㘀㌀䔀㔀䌀㌀㜀㠀䔀㠀䈀㈀䔀㌀䘀䘀㘀㤀㔀䐀㐀䌀䄀　䐀㈀㔀㄀䘀㜀㈀　㌀㜀㤀䌀䐀㌀䈀㈀䈀㄀䈀㘀䔀䔀䔀㈀㤀　䐀㌀㔀㌀㈀㐀䈀　㜀䈀㘀䔀㘀㈀䘀㐀䄀㌀㄀㈀㄀㜀㔀䈀㐀㌀䘀㠀㐀䐀㄀䌀㘀㈀　㈀㜀䐀䄀㄀㜀㈀䌀䐀䘀㘀㔀䈀䘀䐀㄀䌀䔀䈀　㈀㐀䘀㘀㠀㠀㤀㘀㔀㄀䈀㐀㌀㔀㔀䄀㐀　䌀㠀䔀䌀㤀㈀䔀㈀㜀㄀㜀䌀䈀䌀䔀㠀䐀㘀䐀㤀㤀䌀㠀㈀㔀㌀㄀　䈀䌀䄀㈀㔀䔀㄀㘀䘀㔀㜀䄀䈀䘀㔀㠀　䔀䈀㠀㄀䐀㠀䐀㘀䌀䈀䔀㈀㠀䄀䈀㤀㔀䌀㔀㌀䄀㤀䐀䔀㠀䘀㐀䔀㤀㠀㤀䈀㈀㄀㄀　㌀㔀㐀㤀㔀㠀䐀㌀㠀䐀䌀䄀㠀㄀㈀䐀　㌀㔀㈀　䈀䔀　　㈀䐀　　䌀䄀䌀㤀㘀䈀㘀䄀㔀㌀䄀㤀䈀㤀㄀㜀　㈀㄀㄀㈀䘀㔀㄀㌀㄀㌀㜀㜀㤀㔀䄀䄀䐀䐀㄀㘀䄀䌀㄀䐀　㠀　㔀㄀䈀䄀㤀䄀䔀㄀䔀㘀䘀㘀䘀䘀䘀㠀㘀㠀㔀䌀㔀䔀䐀㤀䈀㈀䐀䌀㐀㜀㜀䄀䌀㜀䘀䘀䌀㐀㄀㠀㔀䘀㜀㠀䘀㔀㘀㜀䐀䘀䌀㌀䔀㔀㠀䐀㈀㤀㤀㌀㔀䘀䌀㌀䘀㌀㠀䔀㌀䐀䐀㘀䈀㜀㌀㌀䘀㐀㈀䌀㈀䔀㈀䄀䄀䌀䌀䄀䈀㐀㠀㐀㈀㐀㘀䔀䔀　䘀　㜀㔀　䘀㜀䐀䐀㌀䌀䔀䌀㔀㜀㘀䐀㔀䔀㌀䘀䄀䔀䔀㤀䔀䔀䄀㈀䄀䘀㈀㌀䔀㄀㐀䌀㐀㈀㤀　䈀㐀　㈀㌀㐀䈀䐀　䘀㌀䌀㄀䔀㄀䌀䄀㈀㈀㔀䌀㔀㐀㠀㐀㔀㌀㠀䄀䘀　㄀䔀㌀䘀䈀䔀㈀㤀　㤀㔀䘀䔀㜀䌀㘀㐀㌀㘀䔀䐀䌀䔀㠀䔀䔀㜀㘀㌀㌀㐀㌀㌀㘀㌀䌀㄀䌀㠀㌀䌀㜀㜀㐀䘀㠀㐀㘀㄀㘀䄀㜀㤀㠀　䈀䌀䐀㤀㔀㘀㘀䐀㘀㈀䌀䌀䄀䄀䔀䐀㐀㄀㈀㄀㜀㐀㈀㤀䈀㜀䐀㔀㠀䔀䘀㔀䈀䔀㜀㘀㌀㜀䌀㈀㠀㔀㔀㐀䄀㘀㔀㔀㈀㔀㌀㜀㌀䔀㜀㌀㤀㔀䐀　䔀㠀㜀䔀㠀䔀䄀䌀䘀䌀㔀㔀㜀䔀㔀㘀㈀㜀䘀㘀䔀㜀㤀䔀䔀䘀㈀㔀䌀㌀㘀䈀㜀㠀㐀䈀䌀䌀㔀䌀䄀㠀　䐀　㜀㠀㜀㌀䄀㄀䌀㌀䔀㤀䘀㐀䘀㠀䔀䌀㌀䔀䔀䌀䈀㌀䘀㌀䌀䔀㐀㈀㄀㈀䐀㐀㜀㠀㤀䌀䘀㘀㜀　㔀　䐀㌀䄀䄀㈀䌀㄀䔀㤀㘀䐀　㌀　㤀䘀㤀㠀㘀㈀䔀䈀䐀㐀㤀㈀㘀㈀㈀䈀㌀㠀㈀㐀㈀　㈀㔀䐀㈀㘀䄀㔀㘀䄀　㌀㌀㄀䐀䐀㠀䐀㠀㄀䌀㈀䌀㤀䐀㜀䐀㔀　䔀㄀䐀㐀䄀㈀㤀㠀㤀㠀㜀　㌀㠀㤀　　䄀㤀㄀㄀䌀　䐀㠀㌀㘀㈀㘀䌀䔀䌀㄀㠀㠀䔀㈀䘀㘀㤀　㤀㈀䔀䔀㠀䄀䐀䘀㌀㈀㔀㈀䔀䐀䄀㔀䌀䐀㜀㜀　㔀㌀㜀䈀䐀㄀䔀㈀　㌀䔀㌀䄀㌀　㜀㤀䔀䔀䐀㈀䈀䐀　㤀䌀䔀㈀㠀䘀㄀䐀䄀㤀䔀䌀䄀䘀㐀䈀㠀䈀㔀䘀䈀䌀䄀㌀䄀㤀䘀㔀䘀䄀㌀㔀㘀㤀㜀㔀䐀㜀㌀䘀䐀㌀䘀䔀䐀䄀䄀䈀㌀䌀䔀䈀䌀䌀䄀䈀㈀䈀㠀㠀㠀䘀䘀㔀㤀㔀㈀㔀䈀䈀䘀㌀㜀䐀㐀㤀㔀㈀㤀㐀䄀䘀㘀䄀㔀㌀㘀䐀䘀䐀䄀㄀䈀㘀䔀㈀䌀㈀䄀䔀㔀䈀㤀䈀　䐀㜀䈀䘀㘀䈀䄀　䄀䄀䈀㔀㌀㤀㌀㠀䈀䈀㌀㤀㈀䄀䐀䐀㘀䐀㈀䐀䄀㠀䐀䄀㔀㈀䈀㜀㘀㌀㜀㘀㐀㜀䌀䘀㌀㈀㤀㤀　䔀䐀㔀㌀䄀　㐀㄀㠀㜀㘀㤀㜀㐀䈀䈀㌀㐀㤀㠀䄀䌀　㤀䘀㈀㈀䈀䌀　䘀䘀㠀　㈀㜀䄀㜀䐀䘀㤀　䔀䄀㘀㔀㌀㤀㄀㤀䐀䌀䐀㌀㜀㈀㜀㘀　㌀䌀䈀㈀　㔀㘀㘀㈀㐀㄀䈀㔀㌀㠀㄀䘀㜀㄀㐀㤀㈀㜀㄀㠀㤀㘀㐀㈀㄀㤀㠀䐀㔀㠀㔀㔀䌀㔀䄀　㄀㄀㌀㠀㐀㐀　䘀䄀䐀㌀㐀䘀䄀㈀㜀㘀䄀　　㄀㠀䐀䈀㄀䈀䐀䄀㜀㌀䘀㄀䐀䌀䌀㔀䐀　㜀䔀　䘀䘀䈀㈀㈀䘀䈀䐀㘀㘀㔀㌀䘀䘀䈀䐀㘀䌀㌀䌀㐀㠀䘀㔀䔀　䈀䘀㌀䘀㤀　䈀䈀㠀䄀㜀㄀䈀㜀㔀　㐀䈀㌀䄀䈀㄀㌀䔀㠀㐀䈀䘀䘀䔀䄀䘀㈀㠀㜀䌀㌀䔀㐀䈀㔀㔀䄀㈀䌀㔀䔀䌀㤀㈀㐀㐀䈀㤀㈀㐀㤀㈀㜀㘀㄀㘀㤀䈀㤀䔀㤀㌀㘀㄀㌀䄀㌀䈀䌀䔀㐀䔀䌀㜀㘀㔀㤀㈀㐀䈀㠀䘀㤀㔀㤀㠀㜀㌀㔀䌀䔀㘀㤀䌀㈀䐀䄀䔀㤀㐀㐀㘀　㐀㈀㄀㤀㠀㘀䔀䄀　　䐀㔀　㔀䈀㔀㈀㤀䌀㔀䌀㐀㈀㘀㜀䔀㌀䄀㄀㌀㘀　㈀㌀䐀㘀㄀㐀䌀㄀　䘀㈀䔀䐀㜀㌀䈀䘀㌀䔀䈀㐀㜀㄀䔀䔀䐀䐀䈀㜀䐀㘀䌀㜀䐀㤀㈀㐀㤀㜀䘀䐀䐀䈀㤀㠀㌀㜀䄀㔀㌀㜀㐀㐀㄀䘀㌀䔀㈀㤀䔀䔀䈀㔀㘀䘀䄀䄀㐀䌀㌀䐀䘀䌀㈀䔀䘀㄀㘀䔀䌀䔀㠀䔀䘀㔀㠀䔀㘀㈀䈀㔀㠀䈀㜀㜀䈀㐀㤀㔀䔀㐀䘀㌀䔀䈀㌀㘀㤀䘀㈀䐀㘀㤀䌀㤀㘀䈀㐀䌀䌀䌀䄀㐀　㐀㈀㘀䔀䌀䈀䐀䔀㔀䄀䔀㘀㜀㘀㤀㈀㌀䘀䐀䐀　䐀䘀㈀㜀䈀㠀㤀㘀㈀䌀㈀䘀㔀䌀㄀㜀䄀䈀䐀䌀㠀㘀䄀㤀㄀㐀䔀　　䘀㄀䘀㄀　㈀　㜀㜀　㈀㈀䈀㈀㄀䄀㔀䌀㈀䐀䔀　䌀䘀　㐀㤀䌀㈀㘀㄀㐀　䈀䐀㔀䌀㈀䈀䐀䌀㈀㌀㤀䔀㄀㘀㜀䌀㈀㠀㜀㠀㈀㔀㘀㘀　㐀㔀㌀㘀䌀　　㤀㠀　䈀㠀㠀㈀㄀㘀㜀　㐀㈀　㐀㠀　㤀㠀㐀䄀㄀㠀㌀㠀㈀㌀　㐀㠀㤀㔀䄀㔀㄀䐀　㈀㠀䔀㘀䌀㠀㜀㈀䐀㌀䈀䔀㤀䘀㘀㐀㔀䌀䘀㐀㜀䐀㘀㘀䘀㈀㘀㄀㜀䘀㄀㈀䘀䄀㄀　㤀㘀　㤀䐀㤀䐀䄀㌀䄀㐀　㌀䔀㜀㈀㐀㄀䈀㌀　㈀㐀䌀㌀䘀㐀䘀㐀㄀㌀䔀　䄀䘀　䘀㄀㔀䈀㜀䘀　䌀㔀㔀䈀䌀䌀㜀㌀㐀㠀㐀㜀䔀䘀䌀䈀䐀㌀㜀䘀㄀㔀䐀㌀䘀㤀䔀䘀䌀　䐀䘀䔀㘀㄀㈀㠀㠀䈀㔀㤀䌀䐀㈀㐀㠀㘀䐀㘀䔀㌀㐀㜀㈀㜀㜀䘀　䐀㌀㌀㜀㄀㈀䈀䐀䌀䔀䔀䈀㜀䐀㐀䐀䈀䔀䐀　䌀㈀䔀㈀㐀䌀　㘀䌀䐀　㘀㤀㌀㐀　㄀㤀䔀㤀㌀㜀㤀　䔀䈀㐀䌀　㘀　㌀㈀　㔀䌀㠀㤀㌀㈀䈀㠀㠀㐀㈀　䔀㘀㄀㌀䌀㐀䄀㜀㈀㜀㘀㔀㔀㈀㜀㠀䄀䔀㤀䈀㜀䐀㌀䐀䌀䌀　㐀㄀䌀㐀䄀　㌀㌀㠀㠀㄀䌀䔀㘀㔀㤀㤀㌀　㘀䘀㄀㄀㄀㤀䄀㄀㄀䌀㘀䔀䔀㌀　㐀㘀䈀㔀䈀㘀䔀㘀䄀㤀㐀㤀　䌀　䐀䐀㤀㔀㐀㠀䄀㤀㠀　㠀䌀㘀䄀　㈀䈀㤀㠀䌀㈀㌀㈀㐀㄀㘀㔀䔀䔀䈀㜀㤀㌀　䘀㜀㘀㠀䘀㜀㜀㠀㜀㔀䔀㜀㤀䔀㌀㌀㄀䐀㤀㈀㔀㔀䄀㐀䈀䘀㌀㜀　㄀㔀䌀　䘀　䘀㘀㤀　㄀㌀䘀䘀㠀䄀䈀㤀㌀䐀㜀㐀㈀㐀䈀㌀䐀㘀㤀䈀㔀㠀㔀㔀㠀䌀䈀㜀㐀㄀㤀䔀㔀㘀㐀䘀䈀䔀㔀㌀㤀䘀䘀䘀㠀　㐀㤀㄀㄀䐀㌀䔀㠀㜀㜀䘀䈀䘀䔀䘀䌀䐀㐀㜀㈀㄀㐀㄀㌀㄀㐀㌀㄀䔀㈀㌀㠀㠀㘀　㤀㘀㈀䌀䌀㌀䐀䌀㜀㤀䌀㔀　䈀䔀㜀㌀䄀㈀　　䈀㈀䈀　㔀㈀䈀㔀㔀䌀㠀䈀䔀䔀㤀䘀㈀䄀䔀䘀㐀䘀㄀㜀　㠀䄀䈀䘀䔀䈀㄀䈀㈀　㌀䌀䄀㤀䘀㤀㤀㈀㄀㔀㈀㔀㠀㈀䈀㤀㐀㈀䐀䈀㐀㤀䌀䔀㔀㐀䐀㔀　䔀䔀䐀　㄀㠀䄀㄀䈀䌀䄀㈀䈀䐀㐀㘀䘀䈀㄀䈀䄀㔀䔀㠀䈀䔀㈀㜀䄀䌀㤀䈀㔀㤀㐀㐀㈀㌀㤀㐀　㌀㜀䄀㤀䐀䘀䔀㘀㄀䘀䐀䌀㌀㠀㘀䄀䈀　䐀㔀㜀㄀䈀㌀㌀㘀㠀㌀㤀㘀䈀㜀䄀䌀㠀㔀䌀㘀㘀䘀䔀㠀㘀䈀㐀㄀㄀䌀䄀䄀㜀㤀㘀㔀㌀㔀㄀㐀㤀㔀㄀㘀䘀㤀　㘀㈀䐀䐀㘀㤀䘀䐀䐀䐀䘀䘀㘀䘀㐀㔀㘀䔀㤀䈀㈀䄀䐀㜀䌀䌀㤀㔀䈀㤀㌀㈀㔀㜀䔀㘀䌀䄀㔀䌀㤀㤀㈀䈀㜀㌀㘀㔀䄀䔀䌀䌀㤀㔀䈀㤀㌀㈀㔀㜀䔀㘀䌀䄀㔀䌀㤀㤀㈀䈀䘀䘀㤀䐀㐀䄀䘀㐀䌀䐀㜀㌀䔀㔀㌀䘀䈀㔀䐀䌀㌀㤀㔀㜀䔀㘀䌀䄀㌀䘀㔀㌀㘀㈀䐀㘀䌀㘀䘀䌀䐀㘀䐀㘀㄀㠀䄀䈀㠀䘀䐀䐀㄀㔀㜀䈀㠀䔀㄀㐀㜀䈀㄀㤀㈀䐀㠀㜀䄀　䈀䌀㄀䄀䈀㜀㤀㄀㤀㘀㘀㌀㜀㄀䘀䘀㄀㘀䘀㜀㜀㄀䘀䌀㔀㔀㔀　㜀䔀㤀䄀㔀　㤀䌀㜀　㈀　䔀㄀㐀　㈀㈀㠀㘀㤀㈀㐀䄀㐀䈀㘀㌀䔀㈀㔀䘀㄀䌀䈀䐀㠀䔀　䘀㤀䐀䔀㔀㔀　㐀䔀䈀㠀㌀㘀䈀䄀䔀䔀㜀㜀㈀㌀㔀䄀㌀㘀䈀㠀㔀䘀䘀㠀㈀䘀㈀㤀㌀䘀㤀䄀㈀䈀㜀㌀㘀㔀䄀䔀䌀䌀㤀㔀䈀㤀㌀㈀㔀䐀䔀㠀㠀㜀㔀　㔀㘀䈀㄀䈀䘀㐀㔀䔀䄀㌀䘀㐀䐀㘀㐀䔀㈀㘀㠀　䐀㐀䈀䘀䘀㘀㔀㠀䐀㐀㠀㠀䘀　㠀䌀䐀㈀　　㌀䘀㌀　䐀㄀㐀䘀䔀　䘀㤀㤀　䐀䌀䌀㌀䔀㤀㔀䔀㘀㔀　㈀䌀㜀㌀㔀㄀䄀㔀㜀㤀䄀　㌀䘀㔀㐀㘀㤀　䐀㐀䄀㘀　䌀㌀䘀䐀㘀㠀㔀㄀䔀㜀㔀㐀㌀䘀㌀䄀㤀㐀䌀㌀㘀㘀䄀㠀䈀㐀㠀　㘀䔀䔀㈀㐀䈀㔀㔀䐀䄀㘀㠀䔀㈀䘀㠀㠀㤀䘀　㈀㜀㘀㌀䈀　䐀㄀㜀䄀㐀㄀䄀㔀㌀㄀䔀㈀䔀㔀㄀䘀䄀䈀㌀㐀㠀㌀㌀㐀䐀㄀㠀㤀㈀䄀䌀䐀䄀㈀䘀㐀㘀㠀㠀䐀㐀䄀㜀㌀䌀㠀㄀　䔀䐀㔀㜀㘀㤀㄀䔀䔀㠀㜀㤀㈀䄀䄀䐀㐀㄀䄀㘀䔀㠀㈀䄀㤀㔀䐀㘀䄀㈀䐀䌀䄀㤀㜀䔀㜀㐀㈀㠀䐀㘀䘀䄀䄀㘀㐀䄀　䈀䄀㠀㈀㈀㜀䄀㠀䐀㐀䄀㄀䈀䈀㔀㐀䌀䘀㐀䘀䐀䔀㐀㌀䘀㜀䔀㜀㈀㈀䌀䐀䌀䌀䈀㤀㐀䘀　㠀㐀㐀䄀㜀㌀㈀㠀㈀䔀䔀㄀㐀㄀㐀䄀䘀㌀䈀㐀䘀䔀㄀㔀㤀㔀㈀㘀䘀㔀㘀㜀㈀㠀䄀䐀㈀㄀䘀㈀㐀㤀䘀㠀㔀㜀㤀㔀　㘀㤀㤀㈀㐀㔀䌀䄀㐀䈀㐀㤀㘀䐀㘀㜀䘀䄀㈀䐀㈀䄀㐀䘀䔀㐀㌀㐀䄀䔀䈀㐀㠀㜀䐀䄀㈀䄀䌀䐀㈀㔀　㤀䘀䄀㠀䄀㌀䈀㐀　　㐀䌀㌀䄀䐀㠀　㐀㤀㔀㔀㘀䔀㐀䄀䘀䐀　㠀䄀䘀䌀㄀㔀㔀䄀㤀㄀䈀䘀㐀㈀㈀䈀䘀㈀㔀㜀㘀㠀㐀㔀䘀䔀　䄀䄀䐀䌀㠀㔀䘀䄀㄀䈀㔀䄀㠀㌀䐀䐀㄀䄀㔀䐀㈀㠀䄀䘀䌀㄀㔀㔀䄀㤀㄀䈀䘀㐀㈀㄀䈀㐀䐀㜀㈀䔀㈀䈀㔀㤀㐀㄀㘀㈀㌀㜀㠀㄀㜀㈀㌀㜀㠀䐀㜀㐀㌀䈀䐀䄀䌀䘀㈀䄀㈀㠀㜀㜀䄀㤀㜀䌀䄀㠀䈀　㄀䔀䄀䄀㔀䌀䌀㐀㜀㔀㐀㤀䄀㐀㌀　㤀㤀㤀㜀㜀㔀㌀䐀䄀　㐀䘀㔀䈀䄀䌀䌀㄀㜀㔀㔀㤀䄀㐀㌀㜀㈀䔀㘀　㤀㐀䄀㤀㌀㈀䘀㄀䐀㌀㈀㘀㔀䘀䔀㐀　䄀㔀䄀㄀䘀䘀䌀䌀䔀䘀㔀　䐀䄀㐀䄀䔀䈀㜀䘀䄀䘀䐀㈀䄀㐀䘀䔀㌀䐀㐀䄀䌀䈀㄀㄀㌀㈀㤀㐀㈀㌀㘀㐀㄀㠀㐀䐀䐀䄀䘀䈀㌀㐀㈀䄀㐀䐀䐀䄀䘀䘀㠀䐀䐀㈀㌀㄀䈀㐀䐀䔀䄀㔀䐀㈀㔀　䔀䘀㔀㌀䔀㐀㘀䌀㈀㜀䘀䐀䘀㠀㐀䄀㔀㔀㄀䄀䘀䄀䘀㄀㘀㔀㔀㌀㌀䄀㤀䔀䈀㘀㘀䘀㔀　㘀㤀䐀㈀䈀䔀㤀㈀䐀㈀㠀㤀㄀㄀䘀㜀㐀䐀㠀䌀䈀㠀䄀䘀㤀㌀䘀㘀䈀㌀㔀㔀䄀㔀㐀㤀㌀䘀㄀䈀㈀㤀㤀䐀㐀㐀䘀䈀䈀㤀㔀䔀䄀㔀㐀㤀㌀䘀㌀䈀㈀㤀㤀䐀㐀㄀䔀䈀䈀䘀䄀㈀䐀㈀䄀㐀䘀䔀　䔀㐀䄀㘀㜀䐀㄀㜀䔀䌀䔀䄀㤀㌀㐀䔀㤀㠀㜀䌀䔀䄀䘀㈀䔀㐀㈀䘀䔀䈀䄀　㠀䘀㤀䔀䈀㈀㈀䘀㠀䐀㈀㐀㔀䘀　㘀㔀㠀㠀㘀㠀㘀䘀㠀㠀㘀㠀㘀䘀㠀㠀㤀㠀㄀㜀㐀㌀㜀㠀㔀䔀䈀䔀㠀䔀㔀䌀㈀㠀　䘀䔀㔀䌀　㔀䘀　㄀㔀　䄀䈀䐀㄀㈀㘀䐀㐀　㔀䘀䈀㌀䄀䐀㐀㠀䘀䘀䄀䔀　㘀䘀　㠀䔀䐀㐀㈀䐀䈀㘀㤀䌀䐀㘀㈀㌀㠀㄀䄀　㐀㤀䄀㘀䌀䐀䈀䄀　䈀䔀㤀㜀䈀㘀䌀㠀㠀㘀㌀㌀　䈀䐀㄀㔀㘀㈀㠀㈀䔀䐀㐀　　㜀㔀㌀䐀㜀　䘀䐀㄀　䐀䄀㐀㄀㠀䘀䈀䄀㘀　䐀䘀　㔀䄀䐀㐀㜀㘀　䐀䈀㐀㤀㔀䈀㄀䄀䄀㄀㔀㐀䌀㌀㔀㄀㌀䈀䐀㐀㜀㘀䄀㄀㔀㄀䄀㠀㔀㤀㐀䔀㜀䈀䔀䘀㠀㌀䘀䈀㠀㘀䔀䘀㔀㌀　䈀䈀䐀䔀䘀㠀㈀䈀䔀㠀㜀䄀㄀㄀䘀㄀㜀䘀㐀䐀䈀㐀䘀䘀䘀㐀㜀㘀䄀　㜀䐀　㄀䐀㐀　㤀㌀䘀䘀㔀䌀㌀㌀㌀㠀㜀㔀㄀䘀䐀㜀䐀㐀䔀㠀㜀㌀㔀　　　䄀㠀㤀㐀䄀㤀䄀㌀㈀㈀䔀㐀䄀㌀㘀㌀㘀㠀㠀㌀㄀䔀䈀㘀㐀㌀㔀䈀㄀㜀䐀䌀䈀㜀　䐀䔀䔀㐀㌀䘀䄀䔀㠀㐀　㔀䈀䐀㐀䈀㘀㐀䈀䔀㄀㘀㠀㄀㌀䐀㐀㤀㈀䈀㌀䌀㌀㌀　䌀㘀㄀䐀㔀㌀㌀䌀㄀㄀㌀㤀䘀㐀㔀㈀㌀䔀䈀㘀㜀䔀䔀㤀㜀㠀䈀䄀䄀㤀㈀䌀㔀䌀㘀㠀㄀㄀㄀䌀䈀㜀䌀㌀㄀㤀㔀㈀䐀䈀㐀㘀㈀㔀㌀㄀㤀㌀㐀㜀䄀㔀㤀䘀㜀䔀㤀㔀㔀㌀㄀㜀䈀䐀䌀䈀㌀　㤀䌀䔀䐀䄀　䘀䌀㤀㈀䄀㌀㘀䔀䔀㠀㜀䈀㄀㐀䄀䔀㄀䐀䄀㐀㌀㔀䌀㌀䐀　䄀䄀㤀㌀㐀䄀䌀䔀　㔀䘀㔀䔀㄀䘀㤀䄀㠀㠀㄀㌀㄀㄀㄀䔀㤀䘀㐀䐀㈀䔀䈀䘀䄀䄀㠀㘀䌀䔀㜀䐀㄀䔀䈀䈀䈀㘀㠀㠀䈀㈀䔀䈀㐀　䐀䔀䔀㐀㤀㈀㐀䐀䐀㐀㤀䈀㜀㈀䔀㜀㔀㐀㐀䔀㄀䈀㘀㈀䔀㔀䄀䈀䘀　㌀㘀䄀　㘀䔀㤀䘀䘀䘀㘀　㤀䌀䘀䔀　㌀㐀㄀䘀䔀㐀䘀䌀㄀　㠀䌀㠀㈀䘀䌀㐀㜀䐀䄀㄀䐀㈀　㠀㔀㠀㔀䈀㐀䄀㔀䌀㈀㔀㄀㤀㠀㠀䈀㌀㘀㌀䄀㈀㘀䄀㈀　㄀㤀䐀䘀㐀㠀䔀㘀㐀䌀䌀㔀䈀㈀㠀㜀㜀䐀䐀䘀䘀㤀㐀䘀㘀䌀䌀㘀䔀㔀㤀㌀䄀䔀㌀䄀䔀　䐀䘀㐀䘀䘀䔀䄀　䔀䐀㌀㌀㤀㈀　㈀㌀䄀䌀䄀㄀䔀㌀䐀䈀䄀䄀䌀䄀㌀䘀　䐀䄀䔀䔀䔀䄀㔀䘀䌀䘀㐀㐀䘀㐀㤀㌀㄀㜀䐀䌀㘀䘀㔀㤀㄀䔀䐀㄀䈀䄀㤀㐀㐀㜀㜀㐀䌀㜀㄀㔀䐀　㐀㜀㜀䌀䘀　㄀㤀䐀㤀䘀㘀䔀㤀䘀㌀㔀䄀㌀㜀䐀㄀䐀㜀　䘀㌀㜀䘀䐀㜀㌀㘀㐀㐀䘀䄀㌀㜀㘀㜀㄀䘀䘀䘀㔀䐀䔀䌀䔀㌀䘀㌀㜀䄀㌀　㌀䐀㐀䈀㐀䈀䄀㠀㈀㘀㠀䌀㐀㈀䐀䈀㌀䔀㤀　　㜀㤀㤀䌀㜀㘀䔀㈀㠀䈀䐀㈀䄀㐀䘀㔀㤀㔀㐀䘀㘀䘀䐀㌀　㤀䔀㔀䔀㜀䄀㠀㜀㜀䄀㜀䄀㘀㘀㄀㌀䐀㐀㄀　㘀㤀䔀䔀䄀　㜀㌀䈀㌀㠀㈀㘀䄀䐀㈀㈀　㌀䐀䐀㌀㐀䈀䔀䐀㘀䔀㄀㔀㘀䌀䄀㜀㜀㤀㈀㜀㌀㈀䌀䈀㐀㔀㈀㔀䄀㠀㄀㠀㘀㘀䘀㐀䘀㌀㜀㘀㐀　䘀㠀㄀䔀㠀㘀䈀㄀㘀䌀䄀㜀㔀䌀㈀䄀䘀䌀㜀㘀䐀㌀䘀㄀　䔀䐀㄀䘀㤀㔀䈀㐀䈀㘀㔀䔀䌀䄀㈀㄀㘀䈀䌀㠀䈀䌀䄀㔀㐀㤀㄀䌀㄀䐀　䐀㐀䈀䌀㠀㘀㔀䈀㤀㌀䈀䄀㜀䔀䄀䄀㔀䐀㐀㐀䘀䄀㘀㐀㐀䌀㔀䐀㜀㐀㜀䌀㤀䐀䈀㐀䐀䐀㜀㘀㜀㔀䘀䔀㜀䐀䐀㐀㌀㜀䘀㐀䐀㄀䘀䈀㘀䌀䄀㜀䄀㌀㔀㘀䄀䔀䔀䐀㔀　㜀䈀䔀㤀㔀㈀㠀䘀䐀䈀㘀㠀䐀䘀䐀䈀㈀㤀　㜀䐀䈀䄀　䐀㔀㄀　㌀䐀㐀㜀䄀䔀㘀䄀䄀㜀䔀㌀　㠀䌀䘀䔀㜀䔀䌀䈀㤀㄀㤀㔀㈀䄀䘀㔀　㌀㐀㘀㔀䘀　㜀㌀㌀㔀䐀䐀㔀㌀㌀䌀䘀㠀䄀㘀㠀䔀䄀㜀㜀㔀䔀㌀䘀㌀䐀㈀䐀㤀㐀䔀㠀䘀㌀䈀䔀㄀㤀䄀　䔀㌀㠀䘀㘀䄀㤀㜀䄀㐀㈀䔀䌀㔀㄀䈀㤀䄀䘀㘀䘀䔀䄀㌀䔀䈀㌀㌀㤀㔀　㘀㘀㘀䌀㤀㐀䌀䄀䄀㤀㠀㌀㔀䄀䌀䔀㄀㜀䌀㤀㘀䌀㔀㐀䔀㔀䈀㐀㤀㜀䐀䄀䐀㐀㔀㘀㘀䄀㌀䐀㘀㄀㐀䈀㤀䘀㈀䐀㜀䈀㜀㈀䌀䐀㔀㘀㐀䄀䄀㔀㐀㄀䘀䈀䘀㐀㄀㤀䈀䄀䘀䄀䌀㔀䈀䐀㈀䈀㘀㌀䘀㠀㘀㜀㘀㔀㄀䈀㘀㤀　㤀㘀㄀䘀䐀㄀䌀䄀㐀䈀䄀㄀䘀䐀㘀䈀㜀䈀　䔀䔀㜀䘀㄀㄀　㜀䔀㄀䈀䈀㜀䘀㜀䔀㔀䌀䘀㌀㈀㈀㜀㐀㠀　㜀　䄀㈀䘀　㌀㈀㐀㐀䔀䘀㄀㜀䘀㘀㠀䐀㠀㌀䐀㐀㜀䄀㜀㘀㔀㄀䘀䐀㈀㄀䐀䘀㜀㈀䐀　㐀㜀㌀䐀㐀㘀䐀䈀㤀㜀㜀㈀䄀䄀䔀㠀㔀䔀䐀䈀　䌀䄀䐀㔀㈀㈀䌀䈀䘀㔀䘀䐀䐀㈀䄀㔀䌀㈀㤀㌀㐀䘀㄀㐀㄀䐀䈀㔀㔀㐀䘀㐀㐀㐀㘀㄀䈀㤀䔀䌀䐀㜀　㌀䘀䄀㐀㈀㔀䘀㄀㜀㜀㜀䘀㐀䘀㐀㜀㄀㔀䄀䘀䐀䐀䄀㜀䌀䔀䌀䌀㜀㐀䔀䘀㘀㄀　䈀䔀㤀㔀㔀䄀㔀㌀䌀㐀㠀㜀䐀㘀㌀㈀䘀䈀㔀䔀㄀㈀㄀㜀㔀㘀䔀㐀㤀㜀䌀㄀㌀㐀㘀㠀㤀㘀䔀㘀䄀䌀䐀㔀䈀㈀㤀㤀㜀㘀㄀㈀㤀䌀䘀䐀㐀㘀䄀㄀䘀㤀䐀㤀㤀㌀㘀㐀䄀㜀㜀䄀䄀㜀䄀䘀　㜀㤀㠀䘀㌀㘀䐀䈀㄀㈀䐀㈀䄀㠀㘀㜀㈀㜀㜀䌀㤀㘀㈀㈀㌀䘀㤀㐀㈀䔀䔀䄀㤀㄀䌀㤀㌀䐀䈀㘀㔀　䈀䘀䐀㔀㐀㔀㘀㜀䈀㔀　䐀䔀䄀㠀㠀㠀㐀㜀䄀䄀　㐀㔀䘀㠀㤀䌀㔀䘀䔀䐀㜀㌀䌀㌀㈀䌀㈀䘀㤀㤀䄀䔀㔀䄀䔀䘀䈀㐀䈀㜀䐀㠀㌀㄀㈀㔀䈀㄀䘀　㘀㠀䘀䔀㐀䘀㜀　䔀㠀㄀䘀䘀㐀䘀䈀䄀䔀㠀㐀㔀㤀㜀䐀䐀㐀㠀㘀䘀䈀㜀　㈀㔀㐀䔀㘀㤀䘀㌀㘀㘀䄀㠀㔀㌀䔀㘀㈀㤀䄀䌀㌀㔀㔀䐀㄀㐀㌀㌀䈀㜀䄀䄀㜀㠀㌀㄀䄀䐀䐀䐀㜀䘀　䘀䌀䈀䌀㈀㔀䄀䘀㤀䔀㔀㜀㠀㐀㘀㘀㘀㘀䔀䌀㔀㤀㐀䔀㔀䔀䌀㠀㠀㠀㠀㄀㌀㤀㐀䘀㤀㔀㘀䈀㐀䄀　㐀䈀䈀䐀㔀㜀　䘀䐀㔀䔀㔀㌀䔀㜀㔀䐀䔀㜀䐀㤀㐀䔀㜀㐀㄀㄀㔀㘀㜀㄀㐀䐀䘀㐀㌀㌀䌀㐀㌀㄀䈀㤀㔀䈀䘀㌀㈀䌀䘀㘀㄀㌀䐀㔀㘀䘀㐀㘀䄀䈀䈀䔀䄀䌀㄀㤀㔀㌀䈀㄀　㄀䌀㔀　㜀　䄀㔀㘀䘀㐀䄀㔀㌀䐀䄀䐀　㌀㐀㤀䔀䌀䘀䘀㘀㘀㜀䘀䘀　㤀㜀㌀㌀㄀㈀㔀䄀㄀㌀㘀䌀䄀㜀䈀䈀䘀㠀䄀㌀㤀㘀㄀䘀䘀䐀㄀㐀㤀㘀䈀㠀㘀㐀㄀㌀㘀㠀䄀㠀䐀㐀䌀䌀㜀㌀㠀㈀䔀㠀䄀㘀䄀㔀䈀㔀㔀㤀䐀㐀㤀　䈀㠀䘀䘀㄀䌀䈀䔀㜀㄀㘀㄀㄀㄀䌀㤀䈀㠀㄀䔀㠀㌀　䐀䈀䔀㤀㄀㄀㌀㈀䔀䄀䄀㐀㈀㠀䈀㌀㜀㔀㠀㘀㤀䘀䘀㤀㌀䌀㠀䘀㜀䘀䄀㜀㌀䘀䔀䄀㜀䐀㜀䈀䔀㤀㜀㔀䔀㄀䐀㘀㔀䘀䔀䌀䐀䐀㜀䌀䈀㌀䈀䌀㔀䈀㔀㠀䘀㘀䈀㌀䄀䘀㈀㘀㔀㈀㔀㌀䘀䌀㘀㤀㈀㐀䐀䘀䔀㄀㜀㄀㐀䐀㐀㜀㔀䈀䐀㌀㔀㘀㌀㌀㠀䐀㐀㐀䔀㄀㌀㤀䘀㐀㔀㄀㜀䘀䐀䘀㐀䘀䔀䘀䐀㈀㌀䐀㜀㔀䐀䌀㄀㔀䄀㄀㈀㄀䌀㐀㘀䘀㈀㤀㌀㌀䈀㐀　㌀㜀䄀㤀䈀㐀㘀㔀㠀㘀㔀䐀㐀䔀䐀㜀㐀㈀䌀㔀䐀㈀䄀㔀㈀　䐀㐀䘀䌀䐀㘀㔀䄀㐀㈀䘀㔀㄀䔀㘀䐀　䄀䘀䌀䔀䘀㠀　䔀㘀䄀㈀㔀㔀䈀䄀㜀䌀㘀㄀　䈀㘀䔀䈀㤀㤀䈀䄀䘀㐀㠀䘀㐀䈀㌀㔀㄀㈀䔀㄀㄀㔀㈀䔀㈀㌀㤀㄀㘀㘀䄀㘀㐀䔀㐀䘀㐀䈀㘀㈀㤀㐀䌀䄀㜀㄀䐀䈀㌀䘀㌀㤀㠀䘀㘀㄀㌀㐀㈀　䐀㄀㘀　㤀䘀㈀䄀㤀㤀䄀䔀㠀㠀㄀㄀㜀㐀䐀㈀㈀䐀䈀㤀䔀㜀䈀㐀㔀䌀㌀㘀㐀㌀㠀䈀㠀䔀　㠀䔀䌀㄀㠀䘀䄀㌀䈀䘀䔀㔀㠀䘀㄀䘀䌀㤀䐀㤀㐀㠀㌀㌀　䔀㈀㤀㔀䌀䔀䘀　䔀㈀㘀䐀䐀　㘀㌀㌀䘀䘀㔀㌀㠀㔀䘀㄀䌀㔀䘀㈀䈀䘀㄀㔀䘀㄀㠀㘀㔀䄀㘀䔀㔀㄀㌀㐀㘀䈀㈀㘀㤀㄀㤀㐀㔀䘀䄀㤀㐀㤀㤀㔀㜀䔀䐀䄀　䈀䔀㐀㈀㤀㤀䄀䈀㜀㘀㤀㔀䔀䘀㈀䘀䌀㘀䐀䌀䈀㘀㈀䘀㤀㤀䐀㄀䌀㄀㈀㤀䔀䔀㜀㜀㔀　㈀䐀䔀䐀䄀㌀䈀䐀㈀䈀㔀㘀䄀㐀㈀　㘀䘀㈀㐀䄀㈀䘀䘀䈀㌀㄀䄀㄀　䌀㘀䈀㜀㘀䄀㔀㐀㐀㄀䌀䘀㈀䔀㐀㜀㤀㔀㜀　䐀㐀　㐀㘀㠀䐀㤀㐀　㘀䈀㘀䄀䄀　㠀䔀䌀㐀䄀䐀　䐀㜀　䄀㘀㄀㄀㠀䔀㤀㘀㐀　䔀䐀㄀㈀䄀㠀㐀㤀㠀㔀㄀㘀䄀䈀䐀㐀䘀㌀䄀㤀㜀㐀䄀㘀㤀䄀㈀㠀　䔀㔀㔀㐀㌀䈀䈀㌀㔀㄀㐀䔀㌀㤀㐀㌀䔀㄀䄀㘀　㔀䈀　䘀䌀㜀㘀䈀䄀㤀㠀䘀䄀䈀㐀㐀㈀䔀㜀䄀㐀䌀㠀䔀㤀㘀䐀㄀䘀䘀㘀㘀䈀䈀㠀㐀㔀䔀㔀䈀㠀㄀㤀䄀䔀㤀㌀䐀㈀䄀䄀　䈀㜀㔀㔀䈀㐀㘀㔀　㌀䔀䐀䈀䈀　䔀㘀䄀㘀䈀㘀㄀㔀䘀䄀㄀䈀㘀㈀㌀㔀㜀㈀䌀㠀㘀㤀䄀㌀㔀㜀　㐀䌀䔀㠀㈀䄀䔀䄀　㔀㤀㔀䘀䈀䐀㔀䌀㌀㔀㔀㐀䄀䈀㘀㔀　䄀㌀㘀㈀䄀㈀㌀㈀䐀㈀䐀㔀㔀　䔀䘀㤀䄀䔀㈀㜀　䔀㘀䄀㠀㘀䄀䔀㠀㄀䐀䌀㌀㈀㌀䄀䈀㠀㌀䄀㌀　㘀䔀㠀䈀䘀㔀䄀㌀䐀䈀䈀㄀　䘀䄀䄀䔀䄀㄀䘀䐀㤀㄀䘀㄀㤀㌀䘀䈀㔀㜀㔀㈀䈀䄀㜀䔀㘀䄀㤀䌀㤀㔀䔀䄀㐀㠀㄀㜀㔀㈀㄀㤀㤀㄀㤀䔀㐀㤀㤀䘀㠀䈀㘀㄀㐀㐀䈀㔀䘀䘀䄀䈀䈀䐀䄀䈀䔀䈀㜀㄀䐀䌀䄀䌀䌀㈀㐀䔀㄀䌀　䘀㠀㤀䄀㘀䐀㌀㈀䐀㌀㜀㔀䌀㈀　㤀　䌀䔀　㔀䔀䐀䌀䔀㄀㐀㌀㜀㌀㌀㈀䌀䄀䄀䈀䄀㘀䌀㈀㔀䄀㠀㈀㜀䘀㄀㐀䌀㐀䌀㌀㌀㜀㄀㜀　㌀㈀㌀䈀䔀䌀　䐀㤀㔀㄀㌀䈀䘀㐀㤀䈀䌀䔀㌀䈀㄀㠀㌀䔀䐀䔀䌀㌀　䘀䐀　㔀　㠀䈀㄀䐀䈀㔀䔀㈀　㄀　䔀䐀䘀㈀㜀㄀㠀㔀㠀㐀㔀㐀㘀㠀䄀㄀㐀㔀㜀㐀䄀㄀䌀䈀㐀㜀㤀㄀䘀㠀　㄀䐀䐀㌀䈀㠀䄀䌀㐀䐀㜀㄀䐀㄀䘀㜀㜀䐀䌀㈀㈀㜀㠀䌀䔀㘀䈀㈀㜀㤀㌀㐀䌀㘀㜀㔀㜀䐀䌀㈀　㐀　䌀䄀䌀䔀䌀㘀㌀䔀䔀䘀䐀㜀㌀㤀䔀㜀㜀㤀䌀䔀㌀㤀㘀䘀䌀㘀㘀䘀㌀㘀㔀䄀䐀㤀䔀㈀䐀䔀㜀䐀䐀䌀䐀䈀㤀㠀䐀㜀㤀㄀䘀㘀　䐀㠀㤀㌀㤀䘀㌀䈀㘀㈀㔀㌀㄀䔀䌀㘀　㌀䌀䌀㌀㘀㈀㐀䄀　䘀䐀㠀㜀㈀㌀㔀䌀㜀㤀䄀䌀䐀㘀㌀㜀䔀䄀䔀䔀㘀㈀㌀㄀䌀㈀㌀䘀㘀䄀䘀㠀㤀㤀䘀㔀㌀㔀㐀㠀㘀䔀㐀䄀　㈀㄀䈀䐀㌀㤀䔀㔀䄀䘀㠀㘀㜀䈀㄀䈀㤀䔀䈀㌀䘀䔀㔀䐀㠀䌀㜀㘀䔀㔀㌀䈀㠀㐀㠀䐀㤀㔀㜀㔀㠀㤀䈀㐀㈀㌀䐀㤀㌀㌀㜀㌀䌀䔀㄀㠀㘀䐀㔀㌀䈀㘀㐀䔀㔀㄀㘀㔀㤀㄀䄀䄀㐀㤀㌀㐀䌀䌀㈀䄀㜀㌀㔀　㠀㜀䈀䌀㠀㜀䐀㜀䔀䔀㠀䌀㌀䈀㐀㜀㔀䔀㌀㌀㔀䘀㤀䌀㌀㤀㘀䐀㠀䈀䐀䌀㄀䐀䌀㠀䘀㄀䐀㌀㔀㤀㄀㤀㌀䔀㈀㌀䈀䘀䐀㘀㈀㐀㜀㌀䈀㘀㘀䌀㘀㔀䐀㄀䄀㠀䌀㤀㔀㘀㔀㜀䌀㘀㠀䄀㐀㜀䘀㔀㌀䌀㤀㘀㠀䔀䌀㐀㜀㄀䐀㘀䔀䄀㠀㄀䌀䌀㐀㐀㔀㌀䌀䔀㌀㈀㈀㐀䔀㈀䌀䔀㈀䌀㐀㌀㜀㘀㘀㐀䘀㘀㘀㘀䐀䔀㐀䘀䈀㌀㌀㌀䈀㌀㘀㄀䌀䘀㜀㤀㤀㈀䐀㤀䔀㌀䐀㠀䌀䔀䘀䈀㌀㈀䌀䐀㘀䄀㜀䄀㐀　㠀䐀㘀㐀㔀䄀䄀㘀䔀㌀䘀䈀㜀㤀䄀㐀䐀䘀䌀䈀　䈀䈀㌀㘀䔀㐀㠀㐀䔀䐀㠀䄀䘀䌀䔀䌀䌀䘀㈀䘀䐀㌀㐀㔀㜀䈀䘀㐀䈀㤀㜀䈀㘀㈀䔀㌀䐀㐀㤀䐀䐀㤀㄀䄀　䈀䐀㈀㠀㠀䌀䐀㈀㤀㌀䈀㄀䄀　㔀䄀㄀㐀㠀䘀䄀㌀䐀㠀㐀䐀䘀䐀㈀㠀䄀䌀㤀㈀㄀㄀　㐀䔀㐀䘀㠀䌀㌀㔀㄀㤀䄀㤀　㈀㌀㄀㈀㄀㄀䐀䘀㄀　㔀䔀㤀㔀䐀㘀䐀㘀㄀䄀䄀㈀㄀㜀㠀䈀㘀㌀䈀㈀䌀㜀㈀㈀䔀䌀䘀㈀㤀䄀䄀㘀㜀䈀㄀㈀㐀䐀㔀㈀　䄀䄀㈀䄀㄀䐀䘀䄀㜀㜀䔀㌀㐀㌀䔀㠀㤀㜀㤀　䐀䈀㄀䘀䄀䄀䐀㠀䘀䐀㌀㘀㌀㜀䌀㜀䈀㐀䄀㈀㜀䌀㜀　䐀䌀㘀㈀㌀㘀䄀䈀㠀㘀㄀㌀䘀䔀䄀㄀䘀䄀㈀䘀㜀䐀㌀䐀㄀㈀㠀䄀㐀䌀㘀䌀㐀㐀䈀䐀㠀㔀㈀㜀㜀䔀㐀㈀㜀㄀㐀䌀䌀䔀䈀㄀㤀㐀㐀㌀㄀㘀䐀䘀䈀䈀䐀䌀　䔀䘀䈀䈀　㄀䔀㔀㄀㘀㌀㄀㈀㜀㠀㈀㔀㄀㐀䄀䄀㈀㐀㤀䐀䌀㄀㜀䈀㠀　䐀䐀㈀㘀㌀㌀㜀㄀㘀㌀㐀　㤀㌀䐀㄀㄀㔀㌀䌀䄀㌀㠀䄀䌀㈀䔀㌀㔀䘀䐀䈀䔀　㠀㄀㌀䘀㄀㌀㐀㈀㔀㐀㈀㤀　㌀㠀䔀䄀　㤀䌀䘀㄀㌀㄀䔀　㔀㔀㤀㈀䘀㜀㤀㈀㈀䔀㤀䌀㜀䘀䔀㤀㠀　㄀㐀䄀㄀䈀㤀䔀㐀㠀㔀䐀㌀䘀㐀㠀䄀䄀㐀㘀䔀䌀䌀㌀㄀　㈀䌀䈀㠀㤀㐀䌀㘀䄀䔀㈀㜀㠀䔀䐀䌀䘀㠀㤀　䄀㈀䌀㄀䘀䐀䐀㤀㤀㤀㜀㘀㔀䔀䌀㤀㔀㘀㌀䄀㘀㈀㌀㠀　㤀䐀䌀㤀㠀䄀䌀䐀㐀㠀㔀㈀㤀㔀䄀䐀䘀䘀㌀䘀䈀㜀㄀䌀㐀㄀䔀㘀䔀㘀㐀䔀㌀㔀㤀䘀䘀㔀㔀㄀㄀㈀㜀㘀䌀䘀㤀䄀㤀䔀䄀䐀㘀㤀㌀䈀㈀䘀䘀㠀㤀䄀䌀㜀䘀䄀䘀㌀䈀䈀㌀㈀㄀㈀㤀䄀䐀䌀㜀䔀䔀䈀㄀㄀䘀　䔀䌀㤀㄀䔀　䌀䔀　㌀㜀㌀䐀㐀㄀㐀䔀䐀㐀䘀㌀㐀㌀㘀䄀䘀㤀䘀䐀㔀㄀㄀㐀䈀㠀㠀㤀㐀䔀㘀䐀㌀㜀㠀䐀䘀䐀䈀䔀䔀䘀㔀㈀䌀㜀㤀㔀䔀㠀㄀㌀䘀䄀䐀㠀㈀㜀㈀䔀㔀䘀㤀䄀㄀㤀䄀㔀㘀㐀㌀㈀㄀䔀　㜀㌀䔀㜀　　䘀䄀㈀㌀　䄀䐀䐀㈀䈀㔀㘀㠀㐀㈀㐀㜀䔀䔀　㤀㐀䐀䌀　㐀　䌀䄀㔀䌀㜀㌀㌀㜀䄀㔀㄀㄀䘀㔀㘀㌀䔀㄀䄀㘀㐀㈀㈀㜀䌀䘀㐀䘀䌀㘀䔀　㔀䘀㈀㜀㌀㜀䘀㐀㘀㠀㄀䌀䘀䈀㄀㠀䔀䐀㘀㌀㠀䄀䌀　䐀䐀㐀䐀㘀㠀㈀䌀䔀㈀㈀㌀㌀䘀㐀䐀䄀㄀䄀䔀㜀㜀㈀㈀㜀㤀㤀䔀䈀㈀㤀㤀㘀㈀　　㐀㄀㠀㤀䄀㜀䌀㈀㠀　㈀䐀䔀㠀㜀䌀㤀㜀䐀㄀㤀㠀䈀㤀㌀㌀㠀䔀㈀㌀㘀䘀䐀㈀㐀䘀㜀㔀䔀㈀㈀䌀䌀㈀㔀䄀㤀䐀䐀㜀㐀䌀　䐀　　䐀㠀䘀㄀　㠀䌀㠀䔀㘀㌀䌀㌀䈀㠀㘀㔀㄀㌀䘀䔀䌀　㜀㄀㌀㠀䘀㔀㌀㘀䔀䔀䄀㜀䐀㄀㐀　㘀㈀㜀䈀㐀䔀䔀㘀䘀㘀㐀㔀㄀㤀䐀㤀䈀　䔀　䐀　䘀䘀㈀㌀㘀㐀䈀　㈀䔀㘀㌀㌀㄀㘀　㤀䘀㌀䌀㘀　㄀㌀䌀㌀㔀䌀　䌀䈀㘀㜀䈀䄀㤀䔀㤀㘀　䌀䄀䌀䘀䈀䈀　㤀㈀㠀䄀㈀㌀㠀䔀㜀㘀䔀䌀䌀㌀䄀䄀㄀㜀㄀䐀㠀㜀㐀㄀䔀㐀㜀䄀㠀䈀䔀䌀䈀㤀㄀㤀㔀㔀㐀㠀㌀䔀䌀　㠀㤀㘀　　䄀䐀㜀㐀㤀㌀䄀㐀㘀㄀㈀㜀䈀㠀㈀㘀㄀䘀㈀㤀䌀㤀㄀　㠀䌀㘀㠀䈀㠀䌀䄀㈀䈀　䌀㈀㤀㌀㜀䌀㌀䄀　㜀　㐀　䄀䌀㄀䌀䘀䌀㠀䔀䘀䘀㤀䘀　䈀㤀䈀䄀䈀㘀䌀㘀㈀㤀㌀㜀㠀㠀㠀㈀㈀　㤀㈀㈀㤀㤀　㔀㌀䄀䐀㔀㌀䌀䘀㐀䐀䔀　㘀䈀㄀㐀䌀䔀㄀㈀㜀䐀㄀䄀㠀㐀䘀㔀㔀㄀㤀䄀㠀䔀䄀䘀㘀䌀㘀䔀㠀䄀䈀　㜀䄀䔀䌀㄀䘀䘀䄀㘀㌀䔀㄀䘀㤀㘀䔀㌀㔀㠀䄀㠀㜀㤀䈀䐀䌀䐀䄀䌀㐀䌀䌀䔀㜀䘀㈀㤀㈀䐀㠀㐀　㜀㠀㘀㔀㔀䄀㈀㐀䔀䌀㄀㠀䄀䈀㌀㤀䈀䘀㠀㘀䌀䘀䄀䈀䈀䐀㜀㜀䘀㈀㄀㤀㐀䐀㤀䔀㜀㄀㠀䘀㘀㤀䈀䔀㄀䔀　㄀㄀㌀㔀㌀㈀㌀㘀䔀㠀㠀　　㜀㔀㈀㤀䔀㤀㔀䔀䄀䌀㜀㈀䄀㘀㜀㈀䄀㄀䌀䔀䐀㜀䐀㘀䐀䄀㄀䌀㤀䌀㐀㐀㄀㘀　㄀㜀　㠀㌀　㈀㠀㄀㔀㔀䌀㌀䐀㠀　㔀㌀㌀㤀䔀㐀䔀㠀㌀㄀㠀㌀㔀㠀䈀䔀䌀䔀㤀㠀䘀䐀䌀㜀㠀　㠀䌀䌀䌀䌀㌀㄀䈀㠀㐀㈀㐀㐀䈀㄀㤀䌀䄀㈀㄀䔀㘀䄀㌀㔀㘀㐀㔀㈀㔀䌀䈀㤀䌀䘀㐀䌀䘀㌀䔀䌀䐀䘀㐀㜀䌀㄀　䔀䈀㤀㐀㤀㄀㈀䄀㄀㜀㈀㌀㠀㌀䘀䈀䌀䄀㠀㌀䘀㌀㤀㐀㈀㐀㐀䐀䌀㘀䌀㌀䈀䘀　　㌀㌀　䈀㌀䌀䔀㄀䄀㄀㜀䐀　㔀㈀㈀㜀䐀䘀㘀㠀䔀䔀㘀䐀㐀㠀㠀䘀㌀䌀䌀㄀㌀䈀㐀㔀㄀㘀㠀㜀㜀㌀䔀㜀䐀㄀䈀㄀㤀䘀㠀䔀䈀㠀㜀䈀㈀䔀䐀䐀䘀㐀㌀䌀䐀䐀䐀㠀䘀䈀䔀㤀㜀　䔀　㈀㌀㐀䘀㌀㌀䐀䈀䄀䌀㈀䈀䌀䔀䈀㘀㔀䄀㔀㠀㤀　㐀㔀䌀㐀　㠀㜀㔀㌀䄀㠀䄀㌀䌀㜀䘀䌀　㜀㜀㈀㄀　㤀㄀㤀㐀䘀　　㈀㠀㄀㤀䌀㤀㠀㈀㠀㔀䔀䄀䐀䔀㠀㐀㠀䈀㌀㜀䔀㄀䌀䔀㌀䌀㐀䈀㠀　㜀　㄀㌀䌀　㄀㌀㠀㄀䈀䐀㄀䈀㄀䄀㌀㠀䐀㘀㌀㤀㐀䈀䔀㜀䈀䄀㤀䄀㄀㔀㌀䌀㐀䌀㘀㘀㐀㔀㤀㌀㌀㌀㈀䐀㤀䐀㌀㠀㄀䔀㐀㔀㐀㜀　䘀䌀　䌀㠀㘀㔀㌀　㠀㤀㐀㌀㌀㠀㈀㌀䄀㐀　㈀㈀䘀䌀㈀㠀㘀㈀䌀㜀䐀䈀㤀㈀䔀䘀䄀䔀㤀㌀㐀䌀㄀㐀䔀䘀㌀㄀㠀䌀㤀䔀䘀䘀㤀䈀㈀䘀　䄀䔀㘀㐀㈀㤀䔀䔀䘀㘀䄀㈀㄀䈀㘀㈀䔀䔀䘀䐀　㈀䘀䈀㄀䘀㤀㜀㠀䌀䘀㐀㠀㜀㠀䈀㘀䌀㜀䌀㤀䄀㈀㤀䘀㤀㔀　㌀㈀㜀㈀㠀㄀䄀䄀㈀㜀㄀㘀㈀䄀䐀㜀㤀䐀　㌀㄀䄀䈀㌀䘀㤀㈀㐀㐀㔀㌀㈀䘀㄀㤀㘀㠀䈀䔀㈀䌀䐀　䄀䘀䐀㐀㄀　㐀㜀　䈀䐀㌀㔀㐀䌀䔀䄀䐀㠀㌀䈀䐀䐀　㌀䌀㌀㌀㄀䌀㤀䔀䄀㔀　䐀䈀䈀㄀䄀䘀㔀䄀㜀㔀䈀㌀㐀䔀㄀㜀㠀䐀　䔀䐀䄀㄀㜀㜀㔀㌀䄀䈀　䈀䄀　䐀㜀䈀䈀䘀㐀䈀㤀㠀䔀㄀㄀㠀䄀䐀䔀䔀㌀㔀䈀㈀㜀㜀䌀㠀㘀㠀㔀䐀䄀㌀㘀㜀䄀䐀㔀㘀㔀䐀㈀㜀䘀㌀䈀㌀㘀䐀䌀㜀䔀䌀㜀㐀䌀㠀㜀㘀䌀㠀䐀䄀㘀䈀㌀㜀㈀䐀㄀㌀㜀䐀㔀㘀䄀䈀䐀㘀䐀䌀䄀䘀㔀䈀䄀䐀㔀䐀䐀䄀䌀㘀䈀䄀㤀㘀㠀䐀䈀㜀㈀㔀　䈀㤀㔀　㠀䄀㔀㔀䐀㤀䈀䐀㠀㘀　䄀䔀䌀䄀㌀㈀㌀䈀䄀䌀㘀䌀䌀䘀㜀㐀㘀䄀　䐀㌀㐀㠀䐀㘀䐀䄀䈀㘀㤀㜀㔀䄀䘀䔀㤀䈀㐀㘀㌀㜀㔀㔀䈀䄀䌀㜀㌀　㜀㐀䄀　䐀㘀䄀㄀䈀㐀䔀䐀㜀䄀䄀䔀䐀㌀㜀　䐀㠀㜀䐀䄀䘀䈀㐀䔀䐀䈀䔀䔀㤀㠀㌀　㔀䘀㠀㜀䐀䄀㤀㘀䐀㔀䐀䄀㜀㄀㘀　䌀㔀䐀䌀㌀㌀㔀䈀䐀䐀㈀䄀䄀䌀䄀㈀㠀䘀䌀䌀䄀䈀㘀㠀㔀　䄀㜀㘀㄀㌀㐀㤀䈀䐀㈀㤀㐀䈀㄀　䘀䔀䘀㄀䐀䔀㤀㔀䘀䌀䐀㘀䔀㔀䘀㜀㌀䄀䌀䐀䐀㐀㘀㤀㜀㄀䄀㜀㘀䈀㌀㘀䔀䄀㈀㜀㌀䐀䈀㠀㐀㘀㜀䌀㘀㜀㘀䐀㌀䌀䌀㐀䌀　㄀㔀㐀䄀䐀㘀㤀㔀㠀㜀䈀㌀䄀䐀㔀㠀䐀㌀䐀㘀㌀䐀㜀㤀㐀䄀䈀㘀䌀㘀㠀㜀㄀䔀㐀䈀㐀䐀䌀䈀䈀㠀㌀㠀㘀㈀㤀䈀䈀㘀　䌀䘀䌀　䐀䘀㔀䄀䐀㜀䈀㈀㔀䈀　䌀䄀㌀㘀㘀䈀㜀䈀䄀　䔀㤀䄀㌀䄀㔀　㌀䄀䐀䐀䐀㤀䐀㈀　㌀䄀䈀㘀㌀䔀䄀㘀㐀㌀㠀㔀㘀㠀㜀　㤀䐀㤀㜀㄀㘀䌀䄀㠀㘀㜀㌀䄀䈀㄀䌀㈀㤀㘀㐀䄀䈀　䄀䔀㘀㔀㘀㘀㔀䄀㤀㠀㘀䄀㔀䄀㠀㠀　㠀䄀㘀㜀　㜀䈀䈀䘀㘀㌀㤀䔀䘀䄀㔀㈀㌀㜀㠀䐀㈀㘀㜀㐀㜀㔀㜀㠀䘀㄀䘀䌀䔀㐀䌀㔀㐀䘀䄀　㘀䄀䘀㈀㈀㤀㤀　㤀䘀䄀㄀㘀䔀䄀　㘀㜀㜀䔀䔀㐀㔀　㠀䔀㌀䌀䄀䘀䘀䌀䔀䐀㌀䔀㈀㌀䐀㤀㤀䄀䘀㤀䘀䔀㘀㜀䔀㜀䘀䄀㈀㌀䘀㤀䘀㐀㌀㜀㤀㤀㄀䘀㔀㜀䈀䘀䄀䐀䘀䔀㔀㐀㜀䐀㐀㔀㜀䐀㔀䐀䈀䐀䄀㌀䘀䔀㘀　㘀㄀䐀䐀㜀䘀䔀䄀㌀㌀䈀　䔀㔀䔀㤀䘀䐀䘀㈀䘀㐀㜀䔀㜀㤀㜀䄀䘀䘀䐀䘀㌀䘀䈀䐀䌀䘀㌀䔀㠀㄀㔀䐀㤀䔀䔀　䘀䘀㜀䘀㤀䔀䔀　㘀㜀䐀㄀㔀䈀㤀䔀䔀㈀㈀䘀㐀䘀䘀㄀㤀㜀䄀㜀䘀㠀䌀䈀㔀㌀䘀䌀䈀㌀䈀䈀䘀㤀䘀㈀㈀㐀㜀䘀䘀㄀㈀㐀㜀䘀䌀䄀䌀䔀䘀㈀㌀㐀㜀䘀㜀㤀㤀䄀䈀䘀㌀䌀䌀䐀䘀䘀㄀䘀㌀䈀䌀䐀䈀䘀䌀䘀䈀䘀㘀㈀䘀䌀㌀䌀㘀䄀㔀䈀㈀䌀㠀䌀䐀㔀　䈀㤀䘀䌀㄀㌀䐀㌀䐀䘀㌀䄀㐀㄀䌀䌀䐀㌀䐀䐀䐀㤀䔀䘀䘀　䌀㈀䐀䈀　㄀䘀㤀䌀䘀㜀㐀㐀㜀䌀㈀㈀䘀㜀㠀㠀䈀㌀䐀㘀䘀䘀㤀　䈀䘀㐀䘀㈀䐀㘀㠀㈀䈀㜀䐀䈀　㔀㐀㈀䈀㌀䐀㔀㌀㌀㈀㐀䄀㤀㜀㐀䈀㤀㜀䌀䔀䐀㄀㜀㔀䌀䔀䘀㌀㜀㠀㘀㄀㘀䈀㠀㘀䔀㐀㜀　㘀㄀㐀㔀㔀䈀㠀㤀　䄀䄀䔀䘀䌀䈀䐀㌀　㌀䌀䔀㌀㜀㄀㈀㠀䘀㜀㘀㜀㔀䘀䘀㤀䈀㌀㤀㐀䔀㘀㐀㜀㐀䌀䔀㠀㜀䄀㔀䔀䔀䔀㤀　㘀䔀䘀㘀㜀䐀㠀㄀㜀䘀䘀䔀㄀䐀䄀䘀㠀䈀䌀䄀㔀㜀㤀㔀䘀㌀䘀䘀㄀㐀䘀㈀䘀䈀㌀䄀㜀䘀㘀䈀䌀　　䈀䌀㈀㘀㄀㈀䔀㜀䘀㈀　䌀㤀䔀㐀㐀䘀䔀㈀䘀㔀㈀㄀㈀㌀㌀䔀　䄀㜀㔀䄀䄀㤀䐀䌀㐀㠀㄀㐀䔀䈀䈀䈀㄀㌀㠀䐀㐀䄀㤀䔀㤀䄀㘀䔀㄀㜀䈀㜀䈀䘀㤀　㐀㌀㈀㄀䈀䌀䈀㌀㔀㌀䘀㠀㐀䐀䈀㔀㘀䔀㄀䈀㈀㔀㈀㔀㐀䈀㘀䄀　䘀䔀䌀䈀㐀䄀䄀㄀㜀㠀䈀㌀䘀㠀㜀㔀㐀㔀㈀䐀䈀䔀㔀㐀㜀䌀　㤀䘀㈀䌀䈀䌀㔀㤀㜀㈀㄀䐀䘀㈀䔀䐀䔀㠀㘀䘀䌀㠀䐀䔀㈀㌀㜀㈀㄀㜀䘀㐀䈀㜀䐀㤀䘀㔀㈀㔀　䌀䈀㘀䄀㔀㤀㔀㄀䐀㔀㠀䄀䈀䄀　㘀䘀㤀㘀㄀䘀㔀㘀㄀䌀㠀㄀㜀䐀㐀㐀㜀㈀㄀㌀䘀䄀㘀㔀䔀㠀㐀䈀䌀䄀䔀䄀䔀㐀㌀䐀䔀㔀　㌀㜀㈀　㌀䘀䄀䔀䈀䔀　㔀䘀㤀䄀䔀㜀䄀㄀㜀䘀㈀䌀䘀㐀䄀䈀䘀㔀㄀　䄀䄀㔀㜀㜀㐀䈀䔀䘀㈀䄀㘀䄀䔀㤀䈀㜀䄀㔀䈀䘀㐀　䘀䔀䄀䈀㜀㘀䄀䌀㄀㐀䈀㔀㈀䘀㘀㠀㌀䘀㔀㐀㔀㐀䔀䐀㜀㔀䔀䐀　䐀䄀㔀䄀　䘀䐀㐀㠀䘀䈀㈀㔀䔀㐀䈀㜀䈀㔀䈀㜀㈀㄀䘀䘀㐀䄀㜀䈀　㜀䘀㈀䈀䐀㤀㔀㠀䘀㈀㠀㠀㔀㤀㔀㐀㜀㔀㜀㄀䔀㔀㜀䐀㐀㤀㔀㠀䘀䄀䔀䐀䌀㠀㈀䘀䌀䌀㈀䌀䄀䘀㜀㈀　㜀䘀䈀䘀䘀䌀㈀㤀䄀㔀㔀　㜀䔀䄀㘀㔀䌀㔀㌀䐀㐀㜀㈀䈀䐀䘀䌀㌀㤀䌀㠀䌀䘀㤀㔀㜀䐀䌀㠀䐀㜀䌀䈀䈀䘀㠀㌀䘀䌀䘀䈀䘀㈀㄀䘀㈀㄀䘀䘀䄀㤀㔀㈀㔀　　䄀㤀㔀㘀㈀㐀㔀㔀㌀䐀㐀䌀䄀㐀䄀㘀㔀㤀㔀䘀䘀　䘀䌀㤀　䄀䈀䌀䄀䐀㔀䌀䄀㠀㔀䌀㠀　䘀䌀㐀㠀䔀㔀㄀㄀䌀㠀䔀䘀䄀䘀㜀㠀㤀　㐀㔀㘀㔀　㐀䐀㤀䄀䘀䈀䌀　䄀䘀㤀䈀㔀䌀䄀㤀䈀㤀　䔀䘀䄀䌀䐀䔀㔀㐀　䄀䄀䈀䈀㜀㔀㘀㔀䘀㔀　䐀㐀䐀㔀㄀㜀㄀䘀䘀䄀　㜀䐀㠀㈀䄀䔀㔀㤀䌀㄀㔀㤀㔀　䘀㐀䈀　㘀㌀㈀䔀䌀㄀㤀䔀䄀㄀䌀㈀䘀䈀　㜀䌀㄀㄀㤀䔀㜀䘀㐀㤀䈀䈀　㤀䘀㤀㤀㘀　㘀㘀䘀䈀㔀㄀㜀䈀㔀䄀䘀㐀　䘀䔀㤀䄀　㘀㔀㘀䈀㔀䐀䈀䐀䄀㜀㜀㜀　㜀䐀㐀㔀㜀䈀㄀㔀䐀㜀䐀㜀㠀　㤀䄀䘀㄀䘀䔀㄀㠀䐀㜀㌀㜀㌀㔀㔀㠀䐀㐀䔀䔀㘀㠀㜀㜀㈀　䘀䘀㐀㐀㜀䈀　䈀䘀㈀㔀䐀䔀䐀䔀㜀㤀　㜀䘀㈀㄀䐀㤀䘀㠀㌀㔀㜀㠀㘀　　㘀䐀㘀㜀㌀䈀䌀㐀㔀㈀　㜀㔀㈀㄀䘀㜀䌀䄀　㈀㄀㠀　㜀䔀㔀㠀㄀䌀㐀䄀㠀䌀㈀䔀㜀㔀㈀䄀㔀㈀㐀䈀㄀㜀　䌀䘀䈀　㌀㈀㐀㐀䌀䘀　㠀䈀㠀䔀　䘀㌀䈀䘀　　㈀　䄀㈀㌀䌀㔀䌀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㄀㌀㈀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㐀䐀㘀㔀㜀㐀㘀㄀㘀㐀㘀㄀㜀㐀㘀㄀㈀䘀㔀㌀㜀㔀㘀㈀㜀㐀㜀㤀㜀　㘀㔀㈀䘀㔀㠀㐀䐀㐀䌀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㌀㌀㄀㌀㠀㌀㄀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㌀䌀㌀䘀㜀㠀㜀　㘀㄀㘀㌀㘀䈀㘀㔀㜀㐀㈀　㘀㈀㘀㔀㘀㜀㘀㤀㘀䔀㌀䐀㈀㈀䔀䘀䈀䈀䈀䘀㈀㈀㈀　㘀㤀㘀㐀㌀䐀㈀㈀㔀㜀㌀㔀㐀䐀㌀　㐀䐀㜀　㐀㌀㘀㔀㘀㠀㘀㤀㐀㠀㜀䄀㜀㈀㘀㔀㔀㌀㜀䄀㐀䔀㔀㐀㘀㌀㜀䄀㘀䈀㘀㌀㌀㤀㘀㐀㈀㈀㌀䘀㌀䔀㌀䌀㜀㠀㌀䄀㜀㠀㘀䐀㜀　㘀䐀㘀㔀㜀㐀㘀㄀㈀　㜀㠀㘀䐀㘀䌀㘀䔀㜀㌀㌀䄀㜀㠀㌀䐀㈀㈀㘀㄀㘀㐀㘀䘀㘀㈀㘀㔀㌀䄀㘀䔀㜀㌀㌀䄀㘀䐀㘀㔀㜀㐀㘀㄀㈀䘀㈀㈀㈀　㜀㠀㌀䄀㜀㠀㘀䐀㜀　㜀㐀㘀䈀㌀䐀㈀㈀㌀㌀㈀䔀㌀㄀㈀䐀㌀㜀㌀　㌀㄀㈀㈀㌀䔀　䄀㌀䌀㜀㈀㘀㐀㘀㘀㌀䄀㔀㈀㐀㐀㐀㘀㈀　㜀㠀㘀䐀㘀䌀㘀䔀㜀㌀㌀䄀㜀㈀㘀㐀㘀㘀㌀䐀㈀㈀㘀㠀㜀㐀㜀㐀㜀　㌀䄀㈀䘀㈀䘀㜀㜀㜀㜀㜀㜀㈀䔀㜀㜀㌀㌀㈀䔀㘀䘀㜀㈀㘀㜀㈀䘀㌀㄀㌀㤀㌀㤀㌀㤀㈀䘀㌀　㌀㈀㈀䘀㌀㈀㌀㈀㈀䐀㜀㈀㘀㐀㘀㘀㈀䐀㜀㌀㜀㤀㘀䔀㜀㐀㘀㄀㜀㠀㈀䐀㘀䔀㜀㌀㈀㌀㈀㈀㌀䔀　䄀㌀䌀㜀㈀㘀㐀㘀㘀㌀䄀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀㤀㘀䘀㘀䔀㈀　㜀㈀㘀㐀㘀㘀㌀䄀㘀㄀㘀㈀㘀䘀㜀㔀㜀㐀㌀䐀㈀㈀㈀㈀㈀　㈀　㜀㠀㘀䐀㘀䌀㘀䔀㜀㌀㌀䄀㜀　㘀㐀㘀㘀㌀䐀㈀㈀㘀㠀㜀㐀㜀㐀㜀　㌀䄀㈀䘀㈀䘀㘀䔀㜀㌀㈀䔀㘀㄀㘀㐀㘀䘀㘀㈀㘀㔀㈀䔀㘀㌀㘀䘀㘀䐀㈀䘀㜀　㘀㐀㘀㘀㈀䘀㌀㄀㈀䔀㌀㌀㈀䘀㈀㈀㌀䔀　䄀㌀䌀㜀　㘀㐀㘀㘀㌀䄀㔀　㜀㈀㘀䘀㘀㐀㜀㔀㘀㌀㘀㔀㜀㈀㌀䔀㐀䐀㘀㤀㘀㌀㜀㈀㘀䘀㜀㌀㘀䘀㘀㘀㜀㐀䌀㈀䄀䔀㈀　㔀㜀㘀䘀㜀㈀㘀㐀㈀　㌀㈀㌀　㌀㈀㌀㐀㌀䌀㈀䘀㜀　㘀㐀㘀㘀㌀䄀㔀　㜀㈀㘀䘀㘀㐀㜀㔀㘀㌀㘀㔀㜀㈀㌀䔀㌀䌀㈀䘀㜀㈀㘀㐀㘀㘀㌀䄀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀㤀㘀䘀㘀䔀㌀䔀　䄀㌀䌀㜀㈀㘀㐀㘀㘀㌀䄀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀㤀㘀䘀㘀䔀㈀　㜀㈀㘀㐀㘀㘀㌀䄀㘀㄀㘀㈀㘀䘀㜀㔀㜀㐀㌀䐀㈀㈀㈀㈀㈀　㈀　㜀㠀㘀䐀㘀䌀㘀䔀㜀㌀㌀䄀㘀㐀㘀㌀㌀䐀㈀㈀㘀㠀㜀㐀㜀㐀㜀　㌀䄀㈀䘀㈀䘀㜀　㜀㔀㜀㈀㘀䌀㈀䔀㘀䘀㜀㈀㘀㜀㈀䘀㘀㐀㘀㌀㈀䘀㘀㔀㘀䌀㘀㔀㘀䐀㘀㔀㘀䔀㜀㐀㜀㌀㈀䘀㌀㄀㈀䔀㌀㄀㈀䘀㈀㈀㌀䔀　䄀㌀䌀㘀㐀㘀㌀㌀䄀㜀㐀㘀㤀㜀㐀㘀䌀㘀㔀㌀䔀㌀䌀㜀㈀㘀㐀㘀㘀㌀䄀㐀㄀㘀䌀㜀㐀㌀䔀㌀䌀㜀㈀㘀㐀㘀㘀㌀䄀㘀䌀㘀㤀㈀　㜀㠀㘀䐀㘀䌀㌀䄀㘀䌀㘀㄀㘀䔀㘀㜀㌀䐀㈀㈀㜀㠀㈀䐀㘀㐀㘀㔀㘀㘀㘀㄀㜀㔀㘀䌀㜀㐀㈀㈀㌀䔀㐀㘀㜀㔀㘀䔀㘀㐀㘀㄀㘀䐀㘀㔀㘀䔀㜀㐀㘀㄀㘀䌀㜀㌀㈀　㘀䘀㘀㘀㈀　㐀㌀㘀䘀㘀䔀㜀㐀㜀㈀㘀䘀㘀䌀㘀䌀㘀㔀㘀㐀㈀　㐀㐀㘀䘀㘀㌀㜀㔀㘀䐀㘀㔀㘀䔀㜀㐀㈀　㐀䐀㘀㄀㘀䔀㘀㄀㘀㜀㘀㔀㘀䐀㘀㔀㘀䔀㜀㐀㌀䌀㈀䘀㜀㈀㘀㐀㘀㘀㌀䄀㘀䌀㘀㤀㌀䔀㌀䌀㈀䘀㜀㈀㘀㐀㘀㘀㌀䄀㐀㄀㘀䌀㜀㐀㌀䔀㌀䌀㈀䘀㘀㐀㘀㌀㌀䄀㜀㐀㘀㤀㜀㐀㘀䌀㘀㔀㌀䔀㌀䌀㘀㐀㘀㌀㌀䄀㘀㌀㜀㈀㘀㔀㘀㄀㜀㐀㘀䘀㜀㈀㌀䔀㌀䌀㜀㈀㘀㐀㘀㘀㌀䄀㔀㌀㘀㔀㜀㄀㌀䔀㌀䌀㜀㈀㘀㐀㘀㘀㌀䄀㘀䌀㘀㤀㌀䔀㐀㜀㘀㔀㘀䔀㘀㔀㜀㈀㘀㄀㘀䌀㌀䌀㈀䘀㜀㈀㘀㐀㘀㘀㌀䄀㘀䌀㘀㤀㌀䔀㌀䌀㈀䘀㜀㈀㘀㐀㘀㘀㌀䄀㔀㌀㘀㔀㜀㄀㌀䔀㌀䌀㈀䘀㘀㐀㘀㌀㌀䄀㘀㌀㜀㈀㘀㔀㘀㄀㜀㐀㘀䘀㜀㈀㌀䔀㌀䌀㈀䘀㜀㈀㘀㐀㘀㘀㌀䄀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀㤀㘀䘀㘀䔀㌀䔀　䄀㌀䌀㜀㈀㘀㐀㘀㘀㌀䄀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀㤀㘀䘀㘀䔀㈀　㜀㈀㘀㐀㘀㘀㌀䄀㘀㄀㘀㈀㘀䘀㜀㔀㜀㐀㌀䐀㈀㈀㈀㈀㈀　㈀　㜀㠀㘀䐀㘀䌀㘀䔀㜀㌀㌀䄀㜀㠀㘀䐀㜀　㌀䐀㈀㈀㘀㠀㜀㐀㜀㐀㜀　㌀䄀㈀䘀㈀䘀㘀䔀㜀㌀㈀䔀㘀㄀㘀㐀㘀䘀㘀㈀㘀㔀㈀䔀㘀㌀㘀䘀㘀䐀㈀䘀㜀㠀㘀㄀㜀　㈀䘀㌀㄀㈀䔀㌀　㈀䘀㈀㈀㌀䔀　䄀㌀䌀㜀㠀㘀䐀㜀　㌀䄀㐀㌀㜀㈀㘀㔀㘀㄀㜀㐀㘀䘀㜀㈀㔀㐀㘀䘀㘀䘀㘀䌀㌀䔀㐀䐀㘀㤀㘀㌀㜀㈀㘀䘀㜀㌀㘀䘀㘀㘀㜀㐀䌀㈀䄀䔀㈀　㔀㜀㘀䘀㜀㈀㘀㐀㈀　㌀㈀㌀　㌀㈀㌀㐀㌀䌀㈀䘀㜀㠀㘀䐀㜀　㌀䄀㐀㌀㜀㈀㘀㔀㘀㄀㜀㐀㘀䘀㜀㈀㔀㐀㘀䘀㘀䘀㘀䌀㌀䔀㌀䌀㜀㠀㘀䐀㜀　㌀䄀㐀㌀㜀㈀㘀㔀㘀㄀㜀㐀㘀㔀㐀㐀㘀㄀㜀㐀㘀㔀㌀䔀㌀㈀㌀　㌀㈀㌀㘀㈀䐀㌀　㌀㌀㈀䐀㌀　㌀㠀㔀㐀㌀㄀㌀㜀㌀䄀㌀　㌀㠀㌀䄀㌀　㌀㠀㈀䈀㌀㄀㌀　㌀䄀㌀　㌀　㌀䌀㈀䘀㜀㠀㘀䐀㜀　㌀䄀㐀㌀㜀㈀㘀㔀㘀㄀㜀㐀㘀㔀㐀㐀㘀㄀㜀㐀㘀㔀㌀䔀㌀䌀㜀㠀㘀䐀㜀　㌀䄀㐀䐀㘀䘀㘀㐀㘀㤀㘀㘀㜀㤀㐀㐀㘀㄀㜀㐀㘀㔀㌀䔀㌀㈀㌀　㌀㈀㌀㘀㈀䐀㌀　㌀㌀㈀䐀㌀　㌀㠀㔀㐀㌀㄀㌀㜀㌀䄀㌀　㌀㠀㌀䄀㌀　㌀㠀㈀䈀㌀㄀㌀　㌀䄀㌀　㌀　㌀䌀㈀䘀㜀㠀㘀䐀㜀　㌀䄀㐀䐀㘀䘀㘀㐀㘀㤀㘀㘀㜀㤀㐀㐀㘀㄀㜀㐀㘀㔀㌀䔀㌀䌀㈀䘀㜀㈀㘀㐀㘀㘀㌀䄀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀㤀㘀䘀㘀䔀㌀䔀　䄀㌀䌀㜀㈀㘀㐀㘀㘀㌀䄀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀㤀㘀䘀㘀䔀㈀　㜀㈀㘀㐀㘀㘀㌀䄀㘀㄀㘀㈀㘀䘀㜀㔀㜀㐀㌀䐀㈀㈀㈀㈀㈀　㈀　㜀㠀㘀䐀㘀䌀㘀䔀㜀㌀㌀䄀㜀㠀㘀䐀㜀　㐀䐀㐀䐀㌀䐀㈀㈀㘀㠀㜀㐀㜀㐀㜀　㌀䄀㈀䘀㈀䘀㘀䔀㜀㌀㈀䔀㘀㄀㘀㐀㘀䘀㘀㈀㘀㔀㈀䔀㘀㌀㘀䘀㘀䐀㈀䘀㜀㠀㘀㄀㜀　㈀䘀㌀㄀㈀䔀㌀　㈀䘀㘀䐀㘀䐀㈀䘀㈀㈀㌀䔀　䄀㌀䌀㜀㠀㘀䐀㜀　㐀䐀㐀䐀㌀䄀㐀㐀㘀䘀㘀㌀㜀㔀㘀䐀㘀㔀㘀䔀㜀㐀㐀㤀㐀㐀㌀䔀㜀㔀㜀㔀㘀㤀㘀㐀㌀䄀㐀㔀㌀㠀㌀㐀㐀㘀㌀㐀㐀㈀㌀㠀㌀㔀㈀䐀㌀　㌀㠀㌀㈀㌀㠀㈀䐀㌀㐀㌀㔀㐀㘀㐀㐀㈀䐀㌀㠀㐀㘀㌀㔀㐀㔀㈀䐀㐀㌀㌀㈀㐀㌀㐀㘀㌀㜀㌀㄀㌀㔀㌀㘀㐀㄀㌀㈀㌀㐀㐀㌀㌀䌀㈀䘀㜀㠀㘀䐀㜀　㐀䐀㐀䐀㌀䄀㐀㐀㘀䘀㘀㌀㜀㔀㘀䐀㘀㔀㘀䔀㜀㐀㐀㤀㐀㐀㌀䔀㌀䌀㜀㠀㘀䐀㜀　㐀䐀㐀䐀㌀䄀㐀㤀㘀䔀㜀㌀㜀㐀㘀㄀㘀䔀㘀㌀㘀㔀㐀㤀㐀㐀㌀䔀㜀㔀㜀㔀㘀㤀㘀㐀㌀䄀㐀㔀㌀㠀㌀㐀㐀㘀㌀㐀㐀㈀㌀㠀㌀㔀㈀䐀㌀　㌀㠀㌀㈀㌀㠀㈀䐀㌀㐀㌀㔀㐀㘀㐀㐀㈀䐀㌀㠀㐀㘀㌀㔀㐀㔀㈀䐀㐀㌀㌀㈀㐀㌀㐀㘀㌀㜀㌀㄀㌀㔀㌀㘀㐀㄀㌀㈀㌀㐀㐀㌀㌀䌀㈀䘀㜀㠀㘀䐀㜀　㐀䐀㐀䐀㌀䄀㐀㤀㘀䔀㜀㌀㜀㐀㘀㄀㘀䔀㘀㌀㘀㔀㐀㤀㐀㐀㌀䔀㌀䌀㈀䘀㜀㈀㘀㐀㘀㘀㌀䄀㐀㐀㘀㔀㜀㌀㘀㌀㜀㈀㘀㤀㜀　㜀㐀㘀㤀㘀䘀㘀䔀㌀䔀　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　㈀　　䄀㌀䌀㈀䘀㜀㈀㘀㐀㘀㘀㌀䄀㔀㈀㐀㐀㐀㘀㌀䔀㌀䌀㈀䘀㜀㠀㌀䄀㜀㠀㘀䐀㜀　㘀䐀㘀㔀㜀㐀㘀㄀㌀䔀㌀䌀㌀䘀㜀㠀㜀　㘀㄀㘀㌀㘀䈀㘀㔀㜀㐀㈀　㘀㔀㘀䔀㘀㐀㌀䐀㈀㈀㜀㜀㈀㈀㌀䘀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㄀㌀㌀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㐀㐀㘀㤀㜀㌀㜀　㘀䌀㘀㄀㜀㤀㐀㐀㘀䘀㘀㌀㔀㐀㘀㤀㜀㐀㘀䌀㘀㔀㈀　㜀㐀㜀㈀㜀㔀㘀㔀㌀䔀㌀䔀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㌀㄀㌀㄀㌀㐀㈀　㌀　㈀　㘀䘀㘀㈀㘀䄀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㐀㜀㤀㜀　㘀㔀㈀䘀㔀㠀㔀㈀㘀㔀㘀㘀㈀䘀㔀㌀㘀㤀㜀䄀㘀㔀㈀　㌀㄀㌀㄀㌀㐀㈀䘀㔀㜀㔀䈀㈀　㌀㄀㈀　㌀㐀㈀　㌀㈀㔀䐀㈀　㈀䘀㔀㈀㘀䘀㘀䘀㜀㐀㈀　㌀㄀㈀　㌀　㈀　㔀㈀㈀䘀㐀㤀㘀䔀㘀㘀㘀䘀㈀　㌀㈀㌀㠀㈀　㌀　㈀　㔀㈀㈀䘀㐀㤀㐀㐀㔀䈀㌀䌀㌀㠀㌀㔀㌀㐀㐀㈀㌀㐀㐀㘀㐀㔀㌀㠀㌀㈀㌀㠀㌀　㌀㠀㐀㘀㐀㐀㌀㐀㌀㔀㌀㠀㐀㘀㌀㔀㐀㔀㐀㌀㌀㈀㐀㌀㐀㘀㌀㜀㌀㄀㌀㔀㌀㘀㐀㄀㌀㈀㌀㐀㐀㌀㌀䔀㌀䌀㌀㠀㌀㔀㌀㐀㐀㈀㌀㐀㐀㘀㐀㔀㌀㠀㌀㈀㌀㠀㌀　㌀㠀㐀㘀㐀㐀㌀㐀㌀㔀㌀㠀㐀㘀㌀㔀㐀㔀㐀㌀㌀㈀㐀㌀㐀㘀㌀㜀㌀㄀㌀㔀㌀㘀㐀㄀㌀㈀㌀㐀㐀㌀㌀䔀㔀䐀㈀　㈀䘀㐀㘀㘀㤀㘀䌀㜀㐀㘀㔀㜀㈀㈀䘀㐀㘀㘀䌀㘀㄀㜀㐀㘀㔀㐀㐀㘀㔀㘀㌀㘀䘀㘀㐀㘀㔀㈀䘀㐀䌀㘀㔀㘀䔀㘀㜀㜀㐀㘀㠀㈀　㌀㌀㌀　㌀　㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㜀㠀㤀䌀㌀㔀䐀㈀䌀䈀㈀䔀㐀㌀㔀㄀㄀㐀䌀㘀䘀㄀㜀䐀㔀䄀㐀䄀䄀㤀㐀䈀䈀㔀䄀㜀㌀㜀㜀㔀㌀䘀㈀䔀㐀㔀䔀䈀䈀㐀㜀㔀䄀㜀㌀㜀㜀䄀㜀㠀　㘀䈀㜀㌀　㐀　㈀㈀㄀㄀㄀㈀㌀㄀㌀㔀㌀㘀㄀㜀㈀䘀㈀　㈀㄀䈀䌀㠀䈀㜀㠀　　㄀㌀㄀㄀㠀㤀㄀㠀㤀㠀㤀㠀　㤀㤀㌀䐀䄀㘀㜀䘀䐀㜀㔀　䘀䘀㘀㈀䘀㌀䈀䘀㤀䐀㘀䌀䔀㐀䄀䐀㘀㔀㈀㐀䄀㤀䘀㔀䄀䌀䐀䐀　㜀㜀㔀　㈀㤀㤀㜀㌀䈀䘀㠀㄀㄀㌀䌀㤀㘀㄀　㜀䄀㄀㐀䌀㈀䔀㜀㠀㈀㜀㤀　䄀䈀㜀䘀　㈀䌀㐀㐀㈀䔀㠀㔀䔀㠀㠀㔀㄀　㐀䈀　䈀䘀㄀　䌀䈀䌀　䄀㠀㤀㜀㜀㈀㄀䔀㤀㄀㜀㘀䌀㐀㜀䌀㠀㄀䔀　㤀䐀㔀㠀䄀䔀　䘀　䘀㔀䌀㘀　䔀䈀䌀　㤀㤀䈀　䄀㘀䔀䔀　㔀㌀䐀㠀䘀䄀㄀　䈀㘀䈀䘀㠀㔀㔀䐀㔀㌀䘀㜀䄀䄀㘀㌀㤀㘀㈀䄀㐀㈀　㤀䌀䄀㔀　㠀㄀　㈀䘀䌀㈀㜀㔀㜀㜀㐀䐀䐀㔀䔀䄀䄀䘀䔀㌀㈀䌀　　㌀㔀䔀㘀㠀㠀　㠀㐀㐀䔀䔀䔀䈀䘀䐀㐀㤀㌀㐀䐀䐀　　㠀㌀䔀㘀㠀㠀㄀㘀㘀䘀　㐀㌀㄀䈀䈀㐀㐀㈀　　㌀䄀䄀㄀㄀䐀㌀䄀㈀　　㐀㐀㄀䔀㠀㠀㈀　㠀㠀㐀䌀㄀㠀㐀㌀㠀㐀㐀㈀㄀　㘀䐀䐀㤀　㠀㐀㄀䔀䔀㠀㠀㔀㌀䔀㔀㠀㠀㔀㜀䔀㄀㠀㠀　㐀㄀㄀㠀　㈀　䈀㠀㘀㘀㄀　㐀䌀㘀㘀　㄀㐀䄀䄀㤀　㠀㈀㜀㄀㤀㠀㠀　㐀㤀㐀㠀㐀㌀　㘀䄀㘀䌀　㠀㘀㈀䌀䔀㐀䌀　㠀㄀㌀䌀㐀䌀䌀㌀　䌀䌀䌀䌀㈀㄀䌀䌀䌀䌀㌀　㈀㈀䌀䌀㈀㄀䄀㈀䌀䌀㄀䈀㈀㤀䔀䐀㄀㐀㄀㐀㠀㤀㘀䔀㄀䈀　䔀㐀㘀㈀䐀㠀䔀䈀㐀㈀㔀㘀䐀㘀䐀㐀䌀㠀㜀䐀　㤀䘀㤀㈀䈀㄀㜀㐀䘀䔀㄀㐀㐀㈀㠀㔀䔀　䈀䘀㜀㘀㜀䌀㈀䌀㌀䈀㄀䘀　㄀䈀㜀　䘀㄀䘀䄀㤀䔀㤀㐀䘀䄀　㌀　㌀㔀䄀㌀㔀㌀㌀　䐀　䄀㘀㔀㘀䔀㘀㐀㜀㌀㜀㐀㜀㈀㘀㔀㘀㄀㘀䐀　䐀　䄀㘀㔀㘀䔀㘀㐀㘀䘀㘀㈀㘀䄀　䐀　䄀㜀㠀㜀㈀㘀㔀㘀㘀　䐀　䄀㌀　㈀　㌀㄀㌀㄀㌀㔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㤀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㄀㌀㜀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㄀㌀㘀㌀㔀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㐀㌀㤀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㐀㌀㠀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀　㌀㘀㌀㜀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㈀㌀㌀㌀㘀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㐀㌀㠀㌀㜀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㔀㌀㐀㌀　㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㔀㌀㤀㌀㌀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㜀㌀㘀㌀㜀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀　㌀㄀㌀㌀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㄀㌀㠀㌀㤀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㐀㌀㐀㌀㘀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㘀㌀㈀㌀㐀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㠀㌀㠀㌀㔀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㄀㌀㜀㌀㜀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㄀㌀㈀㌀㌀㌀㔀㌀㜀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㄀㌀㈀㌀㘀㌀㐀㌀㤀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㄀㌀㜀㌀㐀㌀㜀㌀㌀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㄀㌀㜀㌀㜀㌀㜀㌀㔀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㈀㌀㠀㌀㜀㌀㜀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㌀㌀　㌀㄀㌀　㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㌀㌀　㌀㐀㌀　㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㌀㌀㈀㌀　㌀㄀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㌀㌀㈀㌀㜀㌀㔀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㌀㌀㔀㌀㈀㌀㜀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㌀㌀㜀㌀㤀㌀㤀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㐀㌀㌀㌀㐀㌀㄀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀　㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀㄀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀㈀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀㌀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀㐀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀㔀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀㘀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀㜀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀㠀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㌀㌀㤀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㐀㌀　㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㐀㌀㄀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㐀㌀㌀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㔀㌀㠀㌀㈀㌀㈀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㐀㌀㐀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㐀㌀㔀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㐀㌀㘀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㐀㌀㜀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㐀㌀㠀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㐀㌀㤀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀　㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㄀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㈀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㌀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㐀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㔀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㘀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㜀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㠀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㔀㌀㤀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀　㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㄀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㈀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㌀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㐀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㔀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㘀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㜀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㠀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㘀㌀㤀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀　㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㄀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㈀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㌀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㐀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㔀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㘀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㜀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㠀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㤀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀　㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀㄀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀㈀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀㌀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀㐀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀㔀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀㘀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀㜀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀㠀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㠀㌀㤀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀　㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀㄀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀㈀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀㌀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀㐀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀㔀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀㘀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀㜀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀㠀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㤀㌀㤀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㄀㌀　㌀　㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀㄀㌀　㌀㄀㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㌀　㈀　㌀㘀㌀㔀㌀㔀㌀㌀㌀㔀㈀　㘀㘀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㔀㌀㠀㌀㜀㌀㔀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㈀㌀㘀㌀㄀㌀㜀㌀㔀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㜀㌀㠀㌀㤀㌀㔀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㠀㌀㈀㌀㐀㌀㐀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㠀㌀㔀㌀㜀㌀㘀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀　㌀㜀㌀㠀㌀㜀㌀㌀㌀㠀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀㄀㌀㐀㌀㘀㌀㜀㌀㤀㌀㠀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀㄀㌀㐀㌀㜀㌀　㌀㤀㌀㈀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀㄀㌀㜀㌀㌀㌀㤀㌀㌀㌀㠀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀㄀㌀㜀㌀㐀㌀㄀㌀㠀㌀㠀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀㄀㌀㤀㌀㔀㌀　㌀㠀㌀㐀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀㄀㌀㤀㌀㠀㌀㌀㌀㐀㌀㤀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㌀　㌀　㌀　㌀　㌀㄀㌀㤀㌀㠀㌀㌀㌀㤀㌀㔀㈀　㌀　㌀　㌀　㌀　㌀　㈀　㘀䔀　䐀　䄀㜀㐀㜀㈀㘀㄀㘀㤀㘀䌀㘀㔀㜀㈀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㌀㘀㤀㜀䄀㘀㔀㈀　㌀㄀㌀㄀㌀㔀㈀䘀㔀㈀㘀䘀㘀䘀㜀㐀㈀　㌀㄀㈀　㌀　㈀　㔀㈀㈀䘀㐀㤀㘀䔀㘀㘀㘀䘀㈀　㌀㈀㌀㠀㈀　㌀　㈀　㔀㈀㈀䘀㐀㤀㐀㐀㔀䈀㌀䌀㌀㠀㌀㔀㌀㐀㐀㈀㌀㐀㐀㘀㐀㔀㌀㠀㌀㈀㌀㠀㌀　㌀㠀㐀㘀㐀㐀㌀㐀㌀㔀㌀㠀㐀㘀㌀㔀㐀㔀㐀㌀㌀㈀㐀㌀㐀㘀㌀㜀㌀㄀㌀㔀㌀㘀㐀㄀㌀㈀㌀㐀㐀㌀㌀䔀㌀䌀㌀㠀㌀㔀㌀㐀㐀㈀㌀㐀㐀㘀㐀㔀㌀㠀㌀㈀㌀㠀㌀　㌀㠀㐀㘀㐀㐀㌀㐀㌀㔀㌀㠀㐀㘀㌀㔀㐀㔀㐀㌀㌀㈀㐀㌀㐀㘀㌀㜀㌀㄀㌀㔀㌀㘀㐀㄀㌀㈀㌀㐀㐀㌀㌀䔀㔀䐀㈀　㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㘀㄀㜀㈀㜀㐀㜀㠀㜀㈀㘀㔀㘀㘀　䐀　䄀㌀㄀㌀㤀㌀㠀㌀㠀㌀㤀㌀㠀　䐀　䄀㈀㔀㈀㔀㐀㔀㐀䘀㐀㘀　䐀　䄀㜀㠀㜀㈀㘀㔀㘀㘀　䐀　䄀㌀　㈀　㌀　　䐀　䄀㜀㐀㜀㈀㘀㄀㘀㤀㘀䌀㘀㔀㜀㈀　䐀　䄀㌀䌀㌀䌀㈀䘀㔀㌀㘀㤀㜀䄀㘀㔀㈀　㌀㄀㌀㄀㌀㔀㈀䘀㔀㈀㘀䘀㘀䘀㜀㐀㈀　㌀㄀㈀　㌀　㈀　㔀㈀㈀䘀㐀㤀㘀䔀㘀㘀㘀䘀㈀　㌀㈀㌀㠀㈀　㌀　㈀　㔀㈀㈀䘀㐀㤀㐀㐀㔀䈀㌀䌀㌀㠀㌀㔀㌀㐀㐀㈀㌀㐀㐀㘀㐀㔀㌀㠀㌀㈀㌀㠀㌀　㌀㠀㐀㘀㐀㐀㌀㐀㌀㔀㌀㠀㐀㘀㌀㔀㐀㔀㐀㌀㌀㈀㐀㌀㐀㘀㌀㜀㌀㄀㌀㔀㌀㘀㐀㄀㌀㈀㌀㐀㐀㌀㌀䔀㌀䌀㌀㠀㌀㔀㌀㐀㐀㈀㌀㐀㐀㘀㐀㔀㌀㠀㌀㈀㌀㠀㌀　㌀㠀㐀㘀㐀㐀㌀㐀㌀㔀㌀㠀㐀㘀㌀㔀㐀㔀㐀㌀㌀㈀㐀㌀㐀㘀㌀㜀㌀㄀㌀㔀㌀㘀㐀㄀㌀㈀㌀㐀㐀㌀㌀䔀㔀䐀㈀　㈀䘀㔀　㜀㈀㘀㔀㜀㘀㈀　㌀㄀㌀㤀㌀㠀㌀㠀㌀㤀㌀㠀㈀䘀㔀㠀㔀㈀㘀㔀㘀㘀㔀㌀㜀㐀㘀䐀㈀　㌀㄀㌀㤀㌀㠀㌀㌀㌀㤀㌀㔀㌀䔀㌀䔀　䐀　䄀㜀㌀㜀㐀㘀㄀㜀㈀㜀㐀㜀㠀㜀㈀㘀㔀㘀㘀　䐀　䄀㌀㈀㌀　㌀㄀㌀㌀㌀㔀㌀㠀　䐀　䄀㈀㔀㈀㔀㐀㔀㐀䘀㐀㘀⤀ 
SET IDENTITY_INSERT [base].[file_storage] OFF਀䜀伀 
INSERT [base].[file_thumbnails] ([file_id], [thumbnail]) VALUES (1000, 0x89504E470D0A1A0A0000000D49484452000001180000018B08060000001C7C8D61000000097048597300000EC400000EC401952B0E1B000093EF49444154789CEC9D09DC5D5575F65708210910204C321326111915101484808A200E75C2A956C46AAD5AB59F7568AD356A076D6DD56A55B4AD4815ABE28038A3184004444064168137CC100843082421C377FEDF79D677D6DDEF39F7DE77B8C9BDF7DDCFEF777EEF7DCFB0E7BDF6DEEBD96BED0D2D232323A347C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367C802262323A367E81701B3D6323232261BD3D67702FA45C0ACF782C8C8C8987CF48B80C9C8C818426401939191D1336401939191D1336401939191D1336401939191D1336401939191D1336401939191D133640133F8D8A0B8D6B479666D9E4F461C13452FC39E681AFA216D038D611030D38BEB33C5F542FDFF9DE2FA6571BDA2B8FEB4B81E2AAEFF28AE1B8BEB96E2FA68717DAEB83E555CEF2BAE8D8AEBB4E2FA5A71ED545C4B8BEBC7C5F5B1E2BABBB8F6D1F3DF17D79F17D723C5F5E2E2FAB7E2FA6971FD65713DAAB8FEA6B84E2FAE6B8AEB5FAD2CDF257AF6C7C57584C2202D9F2DAEDF16D71B8B6B96D2BEBCB8DE565CE72A4F0715D729C5F5BBE27A7971BD5A61DD5F5C4716D7A78B6B1BBDFF16A50DEC515C9F28AEE714D7AAE2FA86F27A94EE93AE452AA35BF5CDEE7AF6DCE2BAABB8DE5C5CB38BEB1F8A6B6FDDFBA7E23A5565FDCF49396E555C0717D75E0A8FDDD9FF5B5C9B14D70B8A6BA5EAE56F8B6BB1BEA12C362FAECB8BEB9D2AEF2F16D787F4EEBCE4FF5D8BEBEBC5B58B951DFFE3C5759BEA0261704771FD57717D59F18197363CDFB0210D172B7FB4933D55B6C4FF91E25A6055DB7AB9EE9FAABC522FD715D7018AE33ED5DDDF59D5362F29AEFFA929BB99C5B57171BDCAAA4DA7B437EAFB4E1B600C8380A1429E60A550A021D1F9A8D01DADCC1F0D6B5B2B3BFA83C535D7CAC6704E716D6965E7E69A636567BFDDCA4643837A6B713D5BCF9E565CFB5AD94808634671CD2FAEFD8AEB0F56363A1AFDF60A83CE42C7BA47E9784F716D67A5407A9FDEFB56713DBFB8FEDECA46FA012B3B3E1DFA102B3BE709560A9839499EFE58EF1EA1FC2D5779D05869F834D8275B293469F0AF55FE1F50BE68B877846F165829AC9E5A5C9B59D999E91C675AD911E82C7F555CBF56FED3724418BD41F94138D171E924084104CD7F2BAC13AD1484A4FF4F943784E907AD143E3B14D7A6215DF17FAF27D2F263DD3B4565FC329505429041E51B7ABE79C3F3590D69F86B2B85CB4F8AEB582BEB7D2395BDA783F2D95EFF6FA97492EF1BAC1C7C88739AE27882F2FF6E2BDBC72956DF0669033FB452F030207E5FE91E680C838071EC6C6583B8B4C37B5715D76A2B2B38C55A3DFF8A959D8591F2B8E2FA92951D9D19C1257A9791FFE1E23A5EF7E8605784B0E818747466335F56D8341A661E47E91D84028D72A9D27483FE3EABB86E565A98519C9AA4738D9E21D4980931DB5AA5675B17D7FE563654666C8CF0CC94985DFCDCCA4E411A108A772A3E04D453AC1444D72A1C84211D8B8E8A70FE6E71BDA9B89ED8508E6B9466663A2BF5DB3B08A3FAEBAC148C081D3AFBD556CE0E56286C667F5B5867CC549C472ABD0EC261F6CA2CE099560AB3350DCF29FF190D6938DCCA0E4F9D31487CCFCA596C13F8F67C2BDBC159C575B495C2E9B0F00EF131A375A158D706EF51DE283BCAF0661B020C9B80A1613DA0FFA759BD8D13CB99D3AC1C31A8C49B6ADE99AEBFCC2498267FDBCACE8AB0F9AC9ED11068307416960508361AA6EB3D101ED7EB3BEFFCD72BFE3FB3B2F3D681D18FC64A47A7D1B17439A0E63D84CEBD568EB8CC8498B5213436D4F5B8DE43B0ADB6CAA09419C0E18AE71CA593FCCEB06A5961FA7F6D48FBDA709975578E0E467C3A1ECB10CAE9D50A77B59EC7F475024263C44A61FC68F26C03E5A5292C7F0E366A4803F99E6655BE23EADA13DFFCCACA19E71B143E034D14302C97A84FEA6B471B5BD90D348649C030BDF46928233B3A0166208C0A089F0BAC1AD1CEB372664147F691629ADE65A467EACCE876A8954283692FCB15741B07E97D1AD68556EA3E18D55F535C7F64958061D447AFE34B24402366A9C0747ACB867CB00C733DC61EFAD6D349D8B3759137465796845FB072CAFE07C5CB126DBE9553F3DDAC1450FFA93047AC147071FA7DBFEE9FA03493B7471537CB8A1B159ECF400E6C538E75406FF14D2BF50F8483AEE2F55696DBADFA9E4EC6E0403DD0F95D58A7FF23387F66D56CC0741FC1799CD27686B5CE5EEA9EEFD09086DFE9FDE3944E04C27485C792F317569627B3CE150A9FA52A020FFDD9A7559E110897FF52184F1963D90D348645C0ACB2D61187464043614940A53272323D3E4AEFA103F8F7E27ABA952338F7E8B4CC5458F6B83EE75FF49746C3BA999902CB301A22C262A4B82EB25219C93204FD828FFA34C6CBACEC346F0E694470B104430FE23386C7ADEA10F3957646F9C78AEBFD562E93101A34EC5BF49C3C316BA1F19FA57B60A9D2FD792B974774961F58A97C7EBEE24A4778BE413781A0A2B3AC50BC2C0D99DA7F4CDF7C44F9DCAFA11C4DE5B232C4B14A715EA56F11D67FA3BAB858CF492742EF21D5C3590AFB5D35FFFBF265B9E25EAC724118A0536286F99D90B7550DCFB76848C36FAC5C5EA20F4327C432E9152ABFBFD5B5CCCAFA7B58DF525E675B398366A09BA33C7BDE99D99C64E5ECEDAC3665B74665E7B3AA81C73008182AEBA4E41E53D19758A947A003D2B0A83C3AE797F5CE422B477DC76E35611F177E23288E0DFF7F497F5F17EEBD33FC3E2D09EBC2F0FB83BA1C712DFE8FC9771FD1053E9B3C237FE4EBDEE43E233C028E519ACEB058F7BF6C55FE5330A2EEAF6FE8384B74FF93562A7FEF515869380BADB51CCFD4E58875F3F2F0FB0556E979A81FEF54693D7CA1C3FFE0746BC6E90DCF1F6D930694BC285AC9377A2A0400029265E996E11E38447F59269D11C2FF81FEBEA226EEA6B2632675B00D118641C034818E37D0145F17B8BBCD3346C291318657F7CD525DBDC0DDB6FED19486BA7C3FA82BA34B0CB380C9C8C858CFC802262323A367C802262323A367C80226632CC8B639196342163083099831B6EFB36F658195FB4BD8A10B9D0EED092DBED046DB513DA6EF529B28D89173ADDEEE8A7D20305BD0CBB417D891775849E3461B1B1834F6DD34D9E540EFC2CC443B2228F16E6C9A6067DE6B59B80D1CB280194CB0F90C3A195A95FD326C736703A06F739FABF7523BAACBF45D6A13B569C3FBEC48FD70713D49CF468AEB182B77BBA63636EC7A6E679733C7EAED88BAB169BAD6B2701948640133D86093189BDED81DCA263F36DBEDAE67088DD48E0A01536713D5F43E142E5BDE996DB0998C7D2CCC6A7C3F4CB4B119B1CE763975764463B169CA1830640133D860631633162C8259DEB009ED2D7AC60C24B5A3F24D6A75365175EFB32B953682E0C054824D65F3AD32888C3636A0935D4E9D1DD194B1CB998AC80266B0C136F41F59B9E59C99C0E5E1193390D48ECA6D88EA6CA2EADE77FB26F743C337D1882FDAD8ECAD7BEDEC72EAEC88C094B0CB998AC8026670E1B62E187162A7840E83CECCB20241C1F225B5A3427FB2DA46DB44CD68781F8531260D2867DDFE8AB896D9681B9BF7587BBB1C4F57B423BACFBAB769CA184064013398A053461B97E8AFE499FAFBB5702FB5A372449BA86FB579FF19562A8611440898D5566F63D3C92E678F9A6FBAB569CA1840640193D10DA6825D57460F90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CF90054C464646CFD02F02E688E23AC1CA43D6175879B6F195561EACBEA8B89616D7378AEB6F8BEB17C5F5CBE2FAEBE29A5E5CFF545C6F2CAE9717D7342B0F4FFF90C238BCB89E575C3F2FAEF75B79A8FBE78AEB342B8F43053B288CFF2DAE1F85346D5B5C7F67E581ECE717D7478AEB89C5F5012BCF69FE8EC279AF95672FFFAEB8DE515CB7266921DD2F2DAED9569EF9FC49A5ED142B0F8F7FD4CA43E7399AF5254A0B87C11F9CFC7FA8F2B5899567437FB6B89EA3343DA07C9DA3B4FBBB1C367F43717DB4B81E53DA39BB9A83EF3FA8B2F574DCA33CF2EDFDC5F5DDE2FA9BE2BA58E9B8A3B83E5D5CFF505C4B94FF343D4777280BAF978C29827E1130741084C16F8AEB59C5B579716D5C5C5B5A294478BE819587BC5F535CBB15D78BF4EC9B561EA03E6265A37E6771DDAC70B72EAEFD8A6B9BE2BAA4B8BE5F5C2F2BAE2DACEC24A6F88EB4B22C105ECB15D75B8B6B6671BD5061D279DE525C5FB5F2A0763AD4C3C57598959DF2FF14D7BE5676D29896DDAD14667F66A5C07C93C27DAD95829103DFE9F8FFA9EFBD4EB6A8F99F7010068F280C7EFF8B9E2140AFB55210F8BB7FA1F8DE6DA59046C83D57F940787EA5B85EA3700E51596CABB29FAEF86F29AEFD8BEBC9C57551713DDB4A0152979EF774280BAF978C29827E11308CDE7480E75B395BD8AAB88EB57244DED3CA067AB295339033AD6CE4975B3932D2613E61A5105A595CF715D78A10F65A7D43637F6571FDB795B30640473ADECA5905020B61849073618640A2C3D241E96033AC142E8CCC74B6BD15DF4656CE04F8EE91242D3B15D78156CE9048EF3F5B2974FE60A5B0BC4DEF6FD745393DC5CA19C28356CE40E8E008CADF2AFE1D945EF07871DD6EE5ECED4FF5EED7AC9CA950AE083584C05DC5759D95B39A0D94BE5876A6F4CD501991F7E50DE9E95416B15E32A600FA45C0301318B1520030D2316B606982E0D8A3B83E65E532E27FAC1C85FFC84A6100E8E45F6E13360DFDA0E2FA2B2B1B38D3FCB3ADEC5084C192815908B325041C828BCE88D07B92954B00960ABF5358BB58D92911122C3176B472F6C1F47F55431A1000A75B39B2DFA26F98B930536396B5999502B6137E6DA5A07DA8B89E10EE239067E87E0AE2A2A3B344A2AC9899ECA6FFEFD0B7A4E1282BCB1A613047E16DA83C21AC46AC14302CF9B669480FDF762A8B8C29847E11307468660EE861E88C8CC4E816466ADEA573906EA6E23462A6F90888BACEE5613363F99295232F3A0946768405FA196637089FF9560A1296087717D767AC146AA407E1828E8365C117AD1454B7E91D84D78DC5F5F9E27A7D431A4827B3865D14C7DBAD1466E892E8F0CC6E583EB04CB94479F99FE47FF2F9342B3B353A8F53AD148ACC4A1ED7FF37853879F7522B8537427B99D2F812C5C972E63CA5FF3C3DE71EB316746108796626D72B3C746208FDDF5B2560D2F4581765913185D02F02067C551740087C42BFDF1BDE7945CD77CF0DBF9F9F3CFBBE2E40876549C454DD15BC0BC2BBE7EA72B084796112DEA90A67D310CE1FE9D95556764CF0AB909673AC52BEFEAB2E40074440D0395D38EE94C4F7E9E4FF7F4FFEFF94D583F876ACB9FF0C2B672BBE6C01EFD715C1D207614A1E118E5E0E9FD7DFCFE96F1A87A7A7A92C32A618FA49C0F41A8FE89A281EB54A8733512CB1750B84D93D5DBCC74CEF6ECBC89820A69280C9C8C858C7C802262323A367E8170183C2155D06AC0D4AC9D3AC7E39037303D57B53721FE523CA5F14B2D726E13AF5FDA0EEA13845FFF0BBC949FAFF537442F34616E870FD7FCD38C2835D82D6FEF118BE81F58146BF24B90FAD3FAFB8AED0FF941FBA95B5E15E5D58FB291D3FB5D67AA88B87F29CA5DF28DB5986A1B0FEDE18D24DDDC06ADD1AD25957CF9435FA23D8AE6ECB87BD47CBBB4C4F9AB6A6724851D706C61A17FB9560377F6F43847E1130F3AC54187ECCCA7D2F0758D949175BA90BA002EFB592FDA0D340A1222076D73B543E0DE12E7D4783BF4EE12078D88D0A254C63839D42E0A0F064CF0642E020858FE081156163D9CE5656FC2ADD47598920A3816FA538A0BAD99C06C382F214C6857D213B28CD302AD0DEECE981E9B95FFF93A6ED14C65956D2C508423A1B9D6ABE95FB707EAE746EAA77F8E612A583C67C9FCA8B7C3F5569DE517120A4E8B42B542628A4A9EFCD54763B2A3EF2B0AB9E7F5565FA4AE51B5A1B260AAA1EE1FFA0FEA2845F1BCA93327B82DE5FABB23F45F9A37E505EDFAE72B95CE54BD92E511AD8418D02FEE5CA1703C36CFDDE4865F490D275BECA7C1F95FBBE2A57E28159F45DC308851195155B03FE526577B8DEF7CD9C5EBFA72BEDAF529C74F41342395CA2FB7B2BDCFD95AE5B942EB62CFCC44AA1B4B3F2F01BE5636FD5EBCEA19CA787B86827BB5935080E0DFA45C050C8340A2A9886C416F81F5AB947655E715D606543A44331C3A1C16F1DDEF11194918D8AA7011D67E5FE9863F58CEF1122B7EABD3BF5DE8B8BEBBFAC1464AF51D8741676A6B2996E7B857FA2958D66AED2C9567A1A2B8D03A1F3243D072B95363A010D99464AC7657487F5A263210016EB3E7942507C56FF13070DD61B24B4F00C95C3528577A0D20CDBB6A3BE612FCB6D2A83194AFF914A0369A4336CA67067293E84D6217A6E2A63842E42ED1CE5917B740804C47556ED60F6F29CABE797AB6C6686FC214810686C68BC5D699BA9F279AEC2DB48F1AD52995DA83AD83F9411F7106C08D32B553E2F505A3657FC97AA9EAF521EC9C7B5AA8F5B5447C4CBAEEC6D953FAFDFB9FA4D99D22EF648CA617E71EDA5F23D40EFF90CF506950383C41D8A0FA1F932A5836708C2D90ADBF4BFC7B5BBCAE83E1B32F48B80F146CA8E592A9406C2E8C8E84BC3A063D270698034A0DB74F93B34363A0E15C66849A76404628440109DA9388ED3FFEC3F394061328233723EACB4F8EFC715EF6ADDA711D1F89D4172AA9BCE4103611FC93C2BCB744DF8CE37EB31B2228CE85467EB1BB0446132DB78979582CF296404CBCE4AE7860A735F85B74679E79B9B952F3AF06C95C7B67A6786C28312A77322C8EE5098EFB2AA436CA93A58A1327C2C7C7FA0EE930684D95649795E6CAD201D2EB0284B6698D72B3F316DAB15DE529507F5BB81EE23349CBE77B68DB266B6F5B8FE1F51BABDFC5659D55622D658B559F024FD7ED85AEB17D0A69EADEF1168F3433990FF1B94F7FBACAA234F1771B3CF89AD0E6CA7789D95C26DA9F28DA09C665539C7B828BFDD6C08D12F028606C21675840B15BABAE69D0BF5F7BBE1DECF6ADEFBBE35E34336B968D2B1FC507F2FAC79F653FD5D90DC3FD5BAC34536365C6163C7DF85DFEDF448EDCAF3F2E4FF0B6ADE6917F6776AEEA5FB82CEA979E717C9FF5F4CFE3FD7DAE3C30DEFB64B2BE962F041D03388203C58063D60EDF1611B72F48B80714CC63E958C8CF50166745FB072B0644362369530CB347546C6246159F89D858BD06F02665D50C811B011281F6910E7E9DE58E8E15EA289AA45F139DF4ADB2AF45163A56D412F68D5755D77EB0AE88BC81BE54B9A3A6D3F88543EFA2494E12C53975BF37602078C177AA76B6D48D02F02665D52C811D0C0284C6934281FA13253FAF35B0AF34FAC2C2F462A14A328FD50E0D278F6547AE810302DCE3CC0EACC555A76B47A3AF5978A8B34D3F09E6B95421545E4A98AE778AB5899E97ADE8EB6253F875BA500774ADCE95E74396E4F85527757E58B32DC4DF9DA5EE9A6DCD02DC092C0A43C6815ADBA2EEB6E5F9503F535A2FF9DFE861246E7B59FD289F2F40295819B895C61AD5B049C42C7EEEC00A5F51EBD830E690BDDA79E7EACB220AD37290D97EADEB9AAD3A39427060714BB7BAB2EC8F33CABB613A02C86223F45F5E36D8834AD56DE631DD6B5DD8140BF0898754921B7431DFD395771D0191F51DA0ED27B74741A208D02C5EE315636301AD791CACFF54ADF43564FA7F21EEC038D9D464603BF5DCFAF53BA0EB78A92279CBB94BE76B42D69DD5AF9DEC946D3BDC44D47845141B0A01C7DAAF28070D85FCF36571AF84BDDA0BCC479D6D52A934857F7BAEEF8EB54F6A32ADB487F23A00F5118CF52DA9C96263E6623718BC01C950782E4027DCB2CE5F7FAEB3E748E51FCC479A6BEDF566977A5F2462AEF1B547EBE0FE6503DC3507547E59F3A7256EF21A56307DD3F58F1A4753890E81701B3AE28643A3395DFA4DDAFA33FF976633D5B63ADD42DF768304B757F0BC549DA1F543E9CD2DDDCEAE9543AE71CC54B639B6515858B90B9C02A7A9599CD5D21BDED685B53DA675A3DDDBB55483760564347BD52E98109996BD50CE726C58F07BBC5210DEB92FE778ADE3B5CA4BF61705685B24298FD22941B420D7F36718B8053D55EDECC5498CDCC56B8E409675DDE5EB8FF6C9523B335F6B9DC189E915604C52CFDE6BD950ADFB71350965BE99B554AC309CAD7157A673B6BAD436642D4D5421B30F48B8061045D5714728AB885DC5D3AA6F4E7526B75F7F8CB2EE2A481E3E680C60D357D75F26E4AA7A68869485D49383AD1B64DDBE3F90E81F754A58D99073E693A51E09FADB9B72EEBEE7F6BEEA5F437021C218CB060B3DB99E1D9F9FABBA021FC0BAD3DBEAD0B0187B0A24E9CF9FC99D56F9B686A2B08696F530BDBC4491D3248EC6F03887E1130C308963AE86F18CD3BED87581F6064C4B70D332D46EDB5361C60F9C9AC8A325F6EBD0133928556CDCE7A0D06A9DFD800A21F058C33146EDBD1894570633B3A4C34EA8B0C4C93F67EAC0C4127A42CC0164AC7BA1430A48165123A965BDBBCC7F4DC6D5FD28D8D6E7CCAEC861901FA14F2C0085FD7699FA630167788B30E9C28812E83CECAACEE121B1BD232A7F3DFD5F06E64E03AEDB96A67583B53D74F9267299316DBD71A9B389AD2D4B7E81701C3743D1A7EB1E684AD6054654DEBEC8B1B3D6298865089C6766BF49C8A275F54049D03FD098D0FFBA6680CD82D43B0D04A2FFCBEA51E45ECF58A77AEDE239DACB7694C2866611336553A96EA5B9621983DB872F761A5F90EE5CDF37F8FF28C1D15FA8A572B4FE8460EB67A43BD9B95973B14AEFBE875E3C1112B958DF7AAACD023A07C7D50F9710686B41DAF38F6D5F52BA587F8D03B1DA3B2BD4DE573ADEE5DADEF5E66A38D5479A7890D212FD7287ED2FC5ADD1FD1F7CB542EEDF28B5EA38979F13C45068E3A77E3D2CB5506C4C1129176E22CDE237A9FBADD2CDC43A021C4DDA013C1887E8F36815219017DA2D24859CDD3B72CA150D4539FB7E8DA53F9F27749DBEFF54DDAEEA72B1DCBF4CD57ADCF37A7F68B80490DBFFCC4002A8C0A74F6C58D1EB7D07BD1D88E30E8B8080B3A3879833940018802ED16AB8C01C7C2104C53DC74704E3740114A63A631BA8271BAC2709B233750F4F4D188680C6FB3B203B02EC765E6E35659177BFE51983232BAC082A9612681A06932D4DB5669857141B8D00869A89171F1B23B526544C37C9755C6916E69EC71D088CFB0528FE4829E0EEA0CCD745D0C06372A2E581B847F6AA44A676C6243B8B797CA02E1E7F4F76F43FA2983F3DBE4776FAB675E36B07A066EB655C6A54F0F650F3B18593CEA773F3D7B24D40F69DB59F12100E65BC99E51D76E4745FBA47D7134CDB57A0F41B748E57F9CB5B247915974219DB67BCAE15EA5A91F97DDA3D02F022635FC62B4674461F4A54139FB120DD952633B0AFCC9BA18E16898D3F4FE06D66A0C38568660B5D2E202059D05954CE346581CA8FF1F54B86EA0E8A3179D07F6C57DDC3E601583B334C9FFBD562D5918A14F509EC86F93A11E69779701E41101138D073D0F6BF5DC6736CCD636B7D10CCCE30AE3642B599E2D95564FC34ECA2BF998A9F711AE7759BD91AA2F61298B94C99BA63283AAA7CE7DD679B4558C91B33C4DF9AD635EE6E95BCF5364E0A271E96DCA8FFBC8D92AC4B74F28B317EBB73368D1B73365F44CE5E3DB2A5BCAC48F8BF1AD0CB453049EB751678F2EB356667191CA206DF7BCB3BFFEBAD1649EC174012A391A7E9D63CD889AFEC9642FDA31049FD15F77761D1922844E642ABA019D9ACEE4868F69FE1D74888F74111EA7233013EAC40279D99DD5F0BC89AD721C6615438353EF65D6199D9899B3758D059DF21BD9B3A63C75322E4DDBE0551DDE4FE3F8ACD5A35DDBFE45F237A2CED8B7EFD12F02A69FD00D4330518628323893819FD8BA6181D60543D30DD6557E3326882C60EAD18DD098C8890091C1990CACB67583760CCDBAC4BACA6FC604D12F0226F51D1B51670056E76B37452763B94E614CB6F11E986CDAB29B724869EBD4002F23A367E8170183D20E1608A5177A0DA6C0EC8F4081C86C0225211DC36D75101EB00D28DCE8B06E94886EE3A556EA37F6D23D180628631475288F51A232D53FDA2AC6020A7799D241989B28AE8B940EF7A3FA88D2F1E74AD3E54A3761388D19A94894774F551E50D8A1345CA9F4900658AD5D955F377844C1073BD264E0E77473CC03CA43D888D7EB3D84F10156F92B762F6C27288F8FA89C8FB06AB6B6ADE2BBC132322609FD2260E85850904E1162914B87703A8FC60FA587B61FB6810E89AF5D3A181DC68D12012C0F331E1820A6F37B59AB4FDBFDF49D87110DE8E8903EEB19B15293CFB771C9344D7FF1B8C6EC011A31D298918A7CA3D205C3C16C0121F52CFDBF89558ECAA90737C00391D24D0DFCEAF2E06578ABE2E678589C1EB9BF62CA6E5F95294AC637281D08BA2D95F6CD2C236392D12F02C6414762B64047A043B89535B30BA7F4A085DDD72E9D85634EDD289191DAFDCBB24E67B44F7DDA72DD1DC2586D151DCA7B303A2FD3B35F85F088070180E042C8B9CF550450A431231509558B807950F1405B22FCA01EA18A114E085584820BB195D6DEC0AF2E0FB05808BEA31456F469CCFF739476F679ECA7787FADF2719FB35C2E8C9BEC673232C6847E1130EC09F897E4DEB7DBBC1FFDB546DA8E99C7473BC4E5745FBBF0EBCC055882CCD6EF3A9FAB91C66C4745366141C3FD3A03BFBA3C301B4130C04E35E977523AB89DFFE28C8C09A35F04CC20E0CEF0BB1F7DAE8E58B9449A0CE57146C6A4200B98F1A1DF840BF0654E4646DF200B988C8C8C9E210B988C8C8C9E210B988C8C8C9EA15F040C96BF50AEEC0B81217137937596A2D0AFEC297183B6760E801C6CB6838E1DAB33A48876474E34850F1D8CE1E44FF53D7B5DBA3D5E64FB31BEDF2E8DE94EE9DD95B6ADADBB1DBD6371D4D4940658386872F6E5A4759BEE70EE6687F25830708E9A8605FD2260A0A9F19DC12635F6742CB0B2D3B24D1FCB653F72030344040A0DF4CD56EED87507405B877BEC55612F091D940EB497E2A191B3AF861DB66CE063DF0A478BD2A831FF87EAC545021BE110746CA9F75DC234528E2ED957CF0E54B8EE6E019689BD3AEE1C8A0EF3A8D24E39CFD6FB742668F067288DEC7B89C75FB823243AC37C2B37D8FD5CEFC7F45DA2B2207EF60DB1F3D88FC5888EB54827C20FA17DB8F2EAF57EAF55476AE0306A57AB762D2380DC09161B0E97EB223DCFD3B78FA85CFC6079E2B84E657BB4CAC477385FA1BC9387E3ADD9F117797F8EC2E5D9362A9FCDACF2D14299610B86E0A37D747304CC23FA06C19D772CAF23F48B8049C1A6303A150D9C064963F62337D8DC46A38F0E9A7000E40D967B38AAA2133272D348EFD26FDF05CB0E57F6CFE06CCA0F87772751BEE3974D68082DDF254C274670B0C90D67540831662C74AE678577E82474B655FA7BB7F24427A063E190E97085CD370F58E5DC8AD1DF1D21EDAEE76C94DBB9267D4B15C7818AE3132A03BE71C75AFBEB7D4C1E8E545E1E509A113A4FB1EA480DCAEB10ABF6F644276094D7EF14DFC1CA23C211B38CE848EB56D51775B489B5EE707633098415BE6F10A0A9E3AF0D748F992882769E95C7B16202B142E582B9C7014AA30B9F6E8E804130ED66D5312C19EB00FD2A607C472F0DD38FE488D6CB3E5B880E8078EE4766D001982DD0E80ED45F1A56DC05EB475BB0598D994DBAE397119D6DF8BE4B78B6DE63DACE2C019B237CC2ECAA34F84E591AF3237ADFBDAA99C2661686B903B3906DF5DEE54A0B02EB31AB1C2191C795FA769B9AF4F90E5FCA698555C76244C75A8B148F1FB5E2BB9211B8F34239BFCB2A97A0EEC8283AC18A16D484E90EAB484774A4E58E9A76523EE20E670681AD94D61B95F6D4F117DF8F5839B06CABDF6FD0DFCD944E842375EB5EDDBA3D0266BF904684D834C59FD143F49380A173B8931E77F054B7A3F68BFA7B6987F09A9EFBD287C6CEB49A4ECE48F7819A77CF0BBFE95038858ACEA8D29DB3ED1C27A14BF84272AFCEB9552747488E8B6C6CB8C2C68E3A275817D8E8A34252C4DDD59D1C35A55868633FFF672C47C064AC43F49380599718AFE3A4E88C6AAD4D7CE7ECBA3EFE2223639D62AA0A9889384E8AF64793B17376209C3767648C075355C0646464AC036401939191D1336401939191D1330CB28061BF03FB1ECEA879063BF3D756D2912850F13553E75B172A942352BF60E307719D6CE51E99CB6CF2C1FE1068E3D47F0D1BFA3871F2477ACE1E0FA8E06BAD339A76B642C3CFB7727BC0201F8B1A8FBE659B019BFE2EB1EADC244737470ACF1B63BA26C3E7F16497ED7AC3A00A183687B18B75A786E73408766C624EC03E1876C15261EC1085DE656F0D4A5E1A181BF14ED133F6A9D0C9D8434107662F0934349BBBD84C066B04CD4DE365A72BBB8E5FADB8DCA136BB89E72B6EF6C8B0D98EC609EBC4E62FF68020084EB67247298DF131BD738DD23B62E52636C264AF469D3B4B36136EAAEF1F501ABC138CF758D42B94FF4DACBB6351572AEC3D94F65DADF55854BE41F0B107C78F7DC54B2075D7CDB1A8A4C97758B325807D3908F27936DA0FF31AE59F3D4E7B2BCDFBEA3BF6F6B0C991BD441C933B57E553B7F339DD597C8CE258AEF440C1B3BFE72D2ABB8D5506D72BDD1B297EF779BC42F5334D699EAD72DCC746FB5ABE4F65B24F887FA031A80286864AC37F499B77A8E81758D9597010C5216D6C5E63A4A421D3E8111EF3ADAC5C9EB1518E8670A2FE2208D8BF8240A221D0F9E9F46C87A791B28B981984EF2CE51B770CFE54C5C119D3AFD63D7EBF52615DA474B0710F4149276053197B722E49E2ABC3914A039D3AEED789BB81C77A2CEA3E0AA3DB63511164081784C17BAC7417FA036B3D1675636B3DF6F544954537C7A2C6637889D33708C61DD66695DF64FE5FA6B8C83703C00B142F828E13390F55FC944FBAF3B9EE48E11195CB9D2A23EAE40EAB84F3612A27E278A2BEE199FB3C26BC2D75216C2EB2CADE2AF5B57CA8F27246887FA031A80226824AA4F3A47E64A9B47FB372D463D72F8D8B8EC7663876F032CA30CA223C9855ECA567082F3A0D957F95FE3F44DF800DF48D1F29CAE889A0603A4E239B6F65C740C021DCDE6A65E39FAEDF34D2650A873431E3A1C17DD2CAADFB0897FD93F8E84C7F69A53900A0B1D271FFD6CACECCF67D370A9CC8B1A8BF555EBA3D1695E527C2E90DCACB3E2A573F161521E347E1AE0EE179A7EA742C2A69F11DCC1BE9D9D52AE33A3FCC778578A98393ADDA2DFC7BD5C722855DB7F3B9EE48E1C755FEEEBFD93753F2FBD6F01EE1B26C5FA17846AC141894D712A59DC1E016BD5FE76B99F29891C43FD018640143C3FDBC7EA7C285CA7AA77E9FAFBF54249D32B5067E73CDB3D40F2E3A9AD3AC7E4D4DC35F19FE7F93C2230D1FB772A4645AFF312B6D7E2EB7D683C316EA2F0DF04521AD4DF1011AECBFEAF7776DF471A2133916B56E3772B7C7A28E17ED8E45ADDB611D77EEA67E98D3637CB1B162B947D98FE71CE7F3AD6A4311BEDB7C41B897EE3C6FE7F3B89DAFE5A1C1200B98B18211F991713CF3E74D9D7D65F27F74A7F93E2B47C035C9EFA6F7BB892F636C60968540ECEB43E287155349C08C17D1A74BDA48D141A0D4FC56B8D7E4CB64C538E31F0FBBE2A75AB2847036A5AE838DC5CF8BA31BFF3B9381588E2C5FEA7CE374937E9652086BD24D7B6719D874DA678AB1FAE4A93B85B41B747B8AE8C0B14BC32A60689C28F76070DC1F8C9FC4F864FD1EB15217C0F41F252D4B1D1A074A38743AACFBE9DC3448949569596DA2F0F9CEDD2EF4CA9709A330CB1E742147846FAED4F325497AC8EF69CAFB210AD73B2A3A129814A6E3B88D4087C5194FD39577E24589B97D88E762A597771F545EF7B2CACD05EFA3B7898C0F4A4E57661FA7DF2899D109A18065E9C292027D097A95DD748FFC5FA73AF1532B67AB3EC9070CCCD3F51E71AD0A657E8BCAF99C50963083E866F6507E1F53FE9D69BB5D794D4FCE3C3D89F7329581B357E87E4E49E242A0DFAA7866A9BE9F62D5699B87E9DE6AD503BFD1DB44862EB6DB3D553E97292D91DD1A080CAB8071D069A8143AAA9FC4B856BF711E45C7A0529D69A101C072DCA96FE2F729689C7BE97B94AC08AA5EF932A1C3D191E724DFD0017D8936DB5A4FB5BC5DF76F579A70B1006B4207A0A35CA4F766A91C9C69BA4BBF6F0FF1EC64ADFE6810300F2ADF2CFB10DC1B5A2BE3E3BE720E08BF51B8233CE940304FAF517E116A08C903ADF2F103E3E6A7569AD28BD29AFAD959DF21781729BEE897269E94C933EA1725F0CDCA5764DAF6539A239B43BEB748E2457822789CBD9A65A34FE59CA3F2D95FFF539FCE14D1A6501433D81CAE743C4BE13B43E7F076C73D04CF31BA17D9AD81C0B00A189F52D3F899CA33B5F493189FAADF34163A278D87868CE04148D01119814F08DF232018D918F9E85C08151A008A434644E8F285D63B5F2634F80BF47FFC86D1EC490AEF0A6B3DD51261462347A89C6C257B43B874A69BAD9A622FB6CA8F4E649A623C84B9837ECFD077CBF43FEF3242338A3BE34399B1F708D6E43295CFAE5679C15BA1B2211DB03BD0F82897775778BFB7D6532B019D92511F4A7E53DD23DE474378EE97269E9419FD08CD50B9302B72A66D53ABEAD4429E1D1EEFA5CA83B3571BD7C445DE1066BE3FCB0532616FA2EF98B5DEA832FD83CADE19BAB4DD2EB54A1FC7CC74E0D8A561153054A4FB3241F273583D231C23DE3636FA54C6E8F7C435F9EDFCCD50E9FF15FEFFB8FE2EB4DEFA32F96197DF44BCBFCDB3851DBEFD45F23782919C59E04FF53FCB1D677C5C50B0CF689E8DF69B93FA93F11DD00B1AD281607A5BF8FF67C9F33A7F2F6958FF9EFCDF8E698B6CCEDB1ADEA1F3DFDC10D7444ECCACF3C153E717692030AC02268211299EC4D88FA7320E2210E2088D3AA7DC2356F9CA89BF33A618A6828001AB1A7E678C1F946393C7FF78CA643E71720A63AA089876E89622CCC8C818238655C0A07761FB3B6B7B946828E4A022175A75364F6AC497919131C918560103D85381E6DE6D7A504A224C9C529C6FAD467C191919938C6115304E334239431D422DAED17D678FA2119FEFCDC8C75864644C228655C0204C3E639D71AE656464F40CC32A60323232FA00832A60D87DC94E4F94B7ECF4BC23791E5D66B2D3126753F78F217CF74CC7F1B5ECBA644319B63C37DBBA07E60BEC243D3DB94F1A49171B02D9418BDD103B41BF1D9E9F6C6377E5D9E4A2937BAFB5725732F659759BC9DA1D7C3FDF06CB152779C1F5063B8C7FDFE537900BEC5A66D72D3650D100933A64F7709303B13A4483CFD5E348CF7AC7A00A18B65FB3657C6F5DA980A141EDA877D8358AC2F79FACAC601AFFCBACEC40E8601056CBF40CBDCC7C2BDD5DEE615547E11DBC9E7D48EFD061D9DE7EA3BEBD50CFD96A7FB295E607E87DD85A8ECD098DED2FACDCCA8EC0C360F12B567A7FC370AFCE1D27CEA5B063DA4BE16EA9B0DD9D270A6CB783C1F70D1D9EEDF9272A6FEECA9374BC43E1CF5138E4017D138C1A1D0FA537068308110452EA82C25456985A2CB4D2D606966E2C07DFEFA07CE126B2C9D0AFCE1567341665DF0D2E37B1235AA577BB31165D6BADAE382913372A5CA4F052579CC48DAD1724C1F3759FB27B58F736509877281EC272C358EA075393AB94EE1FEB5BDA037A41DA0D83016D14F313064A4C1AB6D33BF7ABAC8FB6CAE0730795F7E14A3B6D703FC54F7BED4BA26250050C8A5A2A749EB56ED98FA0016016806D0D9DDF5D53D2A13130A382A8402A98CAA1D34477970E1A30953CA2F0B01F9969954D0FCF680C7B2A4C77758990C181120DED7956CE86E81C382047E8206468784DEE38FDFCE42F296D6E47E4EE3C7DC4E72F1DF80EC5015B165D79BA2738CAE9642B1B2569FB13950D1D00E1FBA09EDDADE72910EACBAD3ADF990E8890ECF6E07BD3FD43ACDED0AFC915673416A51CDD15271DBD5B63D145D6EA8AD3315D653B62A35D71F23D56DE084304206D0521413B7A8AF2E66E56175965A0E81B3997281F3ED8CCB5CA33DE4DCA07FF7B5B02C7285F73758FD99E1B7C929E3F5865EAF21AD583CF6EFA12832A6068B0EFB652B22368180152AF7674064675660554BABBA6A433BA3F9055BAE8E43490F956B9BB7C3C098F7BD8C430E22ED26F661754FC29FA9EC6E6B438E14437912CE998252008E82067EB79933B4E3A2633903FB6B2A1F3EE958AD3DD793E59BFB7B1CA5979EACAF36A95C5D6562D47788E004320EDAE6FFC196D2275D1698A9B7C3293A93330EC74F0FD664AC7F55609EA68E8D7E48A73C42A6351D287A040505D66DD1B8BEE6BADAE3879DF8D0A9B5C71BA3F5DE23FC9AA81608D558EC3B86658AB81A20B189631F8118A76523315F6EE56B9BAF0ED13E4CBDD7992776639A9C127E5373D948B1BA6F62D0655C030CAB773F81D5D66028CE316EA773415F8F3F01B1B25CA834E9E2E11DEA5BF34EC150AE39BFA1D1D38F3F73FACD51B9D6FE23BDBAA8E18DD73B673C7F9BD901FF0BF56EF6A71A1559DCD115D79BAFEE6A55635ECD4ED657C56070402C68CEEF7A4094D07DFD7B9E24C311E579CE33DF8BECEA83075C5E9C7D9A4C6955784DFE9C0E6601064867BA3FE6FB799F3CC86FBE9379FB301C3A00A98F1A01B1BA44EEF2C6BF81DED6E9A5C5DC6FB51F9D7EE9B6EA7BE75FE6AEAF428EDDC7076E3A293F42CB38C6EC0D20F01F5A84D614C25019391B12E9105B16501D30D9A7CEC021480E8135C49195D198ED788723C7E72C70A9808960013F13382CE87B44EA65F5EB72143198BEE8CF26B2AFB8C01C0B00A986E8C1DA18E9DDE4609989EB287D21096C2A9C25F5B490F3EA4FF79EEEE32511AA2A865DD8DE294BD2B4FD4372FB4B223A3D863545BAC8B305090EEA73410173B8BE9FC2823D1FB5CA9EF78FF6EA5CB69591C3D5DDB904FEEA30C76CA9574A128451989FE00260D0521FA0128DD636CF4498BA7EB9D93AD5C822128DD15E437ACA459B753FE882BD2D5E7A8DC5058FEC22A9FC87C8B12F8CB4A27E1A32B82F541403BCDBBB1E27A8655346DC6006258050CE864EC48C775015377CA1E1D9F4EE254A1EB4AB847C7806A649DCDC88AA0C03F2B2CC0910A976773751F651F142A339E25218C5B142FC2E2694A079D1E16860E0C8380A20FE6669EB5D2B26CAEBBB6219F74CCB55651AECC084ED46F7CCDFAE991E4D74F3E4C4F5ADC42F779173A167FBA5F525ADC2524694418467FB8B7AA0CFCD8DBFD956FF7597BA1CA80F43D47E1B8CF5C84246CCC0E7A37D2B4190388611530DD183B222CE808BE412B3D658F8B861FA942040553763A0F33193A03028211D8F78E30FA1FA46F2ED6F3183EEF1D11C2703A3405CB0304151429B3021746D1676C533E99896D6E15E54A87A6C322980ED45F5720FB86BBF4A4458753F97787B430DBD94A65489E52BA9A323840EFB0D7C5CBFCE110EF03FA9EF79F6815CDEB1430E5E365CF5EA52D2D1BA30E1C8655C07463EC4863DE5FBFDB9DB217B7CCD371DED145FC6776787E51CD3DD7872C4CEEA714694ACB7663D409DE5773CFF3F89D86FBC0CD2352BA97995BD3F67B6653CC961046E4EBEB0DEF7DDEDAA31B6A3BA38F31AC02A61BD0F87F6319BD00CB2A743F71C698310531A802866505B636A49FD1B1CE9011E52B9BED98CDB015BE97D36B1491E80D7CE44749E9E609E3DD07C192806DF26CF1770605E5318A5E964F5F08EFB2D463E7EC885546906BF4DDF7AC159E365F924CD49B5F535E5996A1C84D77043BFC544C3FE80E7D4FD30994114D0695ED0C0D5303CA76CCE078D094A6B17E3BD69324FB1E832A60000D13C523D3F154C0F819325FB4EA0C9BB75BC9EACCB7523F8172944E4047669B380DF00C2B2B1B9D001D16BD07467317E81B9627B03C2C4B50D49E6CA552D6ED5050AE2200D8698C0DD2DF2B2C0E2643698CB293ADE5083C14A26FB6CAB87247BD7B872EF24607C4733F0AD70F5AC9C6FCC12A5B1EE247A783ED14B3310CE5304B785079E6FC27589E8556EA57A0D499B9FDB95527022CB052407E5969F7BCFF83E2FF6BA58D4E7BBCC241D9FB46AB4C11D8058C0D110A600C380FD37B6728CD29E22994943102804183F6488763F04081CCEC071DCC65AA9739AAB3272B2F94A79F12E906953395CE1D55EE5B58EB89887EFAE66E0A9F3CA3807E44698DA76F52E7072B5DCB54D68F28DE112B756B6EE4F95CFDBF85CA8076F1670A6395C2A46EA85B7476E8C90ED2FDDDF58C3CA38C7736F2192A17DAF78556198292763F9D3332A0A75B9F9D693EA802C60FB8723B9C148C5074645772F29B4AA1D2F7D473840F763E7402CCE0614A50BE3292B2DD1D3B122A1E0B6A149834163A95DB36CDB0CAA6E606C5B55861331241B9D220A97C3A2C0D9EC68792138134CD5A8D2BA7295E04028CD3A7ACB4FD017B5865F87894D275B5550697347068643A18DBED390B09E1F17DE5E710A513F687CE7A85D2CB684927FF6F2B47FFD55619686EAA78E9D4E89D10866E30CA8C89B6F303ABA86FC243E86F16DE3BD4EA114FC5DC2F79B6B7CA9B111D252F82D00DFB986D3D57F9E55B58343F25F28F957E3A29C219FDD0D3F49D9F88B88155A76FF2CEC10AF3398AF7A3D67AFAE6164A8B1B3632B8508FB7EB1DDA6034F2743B2E407DF90C6D7BD503CC1F8AEE1DF41DC293B6738DEE33D8B1356191DEF59332295B040F02F1298ADF4FE78C0CA8DB7BF50D0655C050F8275BB9C6E77236C84121A32064D4A7337FC44A41438725CF08022A8D8AA101217868F074182A6EB59E3172300BB95CE12374FC90351A8C1B3F62D8E6E7594F539C34161A23A32BECCB22C549A3A2F3415FCFB756E34A67AF68486F571C80C6ED868F4EAD7BFC7B293F08A91556990D10EEF12A8B73F49B7898C5B97124F1D0B1DE6A65A77BB2B59A27D090618210C650E4B892A0D17F29BCBB3A84479E10646F0EEF31C2BEC5CA1199CE949E8AF926ABEC754CF93B41F5401E52C3BED52AD7A54A9F1B5D2E523A562A3C6649D7ABBCFD4444375E7476EA5CAB0C19A9EBF4F4CD2BADD5B0718555C69AF75965BB459A5C78F0FF4E2A0767FDBC4C972A6FA48D3A5BA6729BA5FC995546B6DB58755226E57AB4D2EB4704FBE99C91A19C6E7D86411530CC0C5866D419263ACED2E5B8C42A69EF78BBFED290A2012270DD04954745D249A09D9D3961A4A7E3BAF1E3594A8BA7C92D6B9996D34868641BE9B98F326FAAC983FB46D930B9FF6AFD8D02C0E307D3C36F37CEDC20E4F90B21BC1F58D5F87DB617ED99A25EE64F9496E556B517BEFD917E7F33E4D5D3B6B0E63D477A2A66CA6E31F3FA883523DD7D7C818D0D0BAD95A9FBD618BEFD659B67DFADB9D72DC3E740E834393573A6EFCAE47E1D03DA3718540103C67A805ABB03C0B8DFA45C749B127C9FD0F857D63C03A932B71B03C4A63CACA979B7CEF031C65F1756CC730C6F45F24E5D5A63B8ABC2EF3AA4DFE7C3ED32FE1F0659C0AC6BDC6319191963421630E307CA42948DEEBC6A2CBE5F79173D007A1594B523369A9A8CE18DD59F6BBFD0B0934DBBA6653C96321F8F8FDD6ED230D968F2493C9027900EB380A183D12952DA110AF54EFD464988920D252E4A451A21CACC8DF52D0AB71F59E55715851A2C0E0A4528443A1C0A3D840C9DDA7DDAA200742A964602CB119760ACB3613650BCB253179626A526A91B4C094EB552618CFEE6C4243CE274DFB29729ACB1D0B0E4199A3F1A50A240ADA3610913252D02E388F0CDC50A6753E5DDCD05EED0DF89D2AE30232F555894090AD1C754471BEABDC5AAB768F0E954F1F395EF07150F7F9D0A4777748B2E94F57B2A6D9401CCD83C1B6D04EA0CE0A94AD3B6217D089DBB15D61EBA47BE668732DD5FEFEDA0BA58AD6791525FABE7D4F9409F403AAC028606446381B24D694734F26E9CE8143295EE9BCE8ED26FBEA57346BFAA5438EC8353D3343858223A109D83C6EE6C876BFBBBD9C95A474D12F675FA1FC1E53E86EBC2F37D380B6D6C342CE145034AF27184D5D3B04EA5CE49BED929A47996E241305FAE7B13A55D63BE110474EEED43195DAF7753834FFFEBBE7DD966C06C91BA7FAAFE32681C67959F5FEAF7B7FA769E553E7AA311E87DBA7C7611D3473D3933C43728905FA6BCDF1ACAD4CB97FC1D6E950B53A7D461BDB653FEE6DB009F403AAC02C60DF7EA68471F6119D19D72A4036C6B9572758DBE75CFF76E8783D0A001CDB3B2A1FB8E581A9953957314D7150A8BD9079D68B135EF26AEA326099F06ED2C89BBC0243C36D99DAFFFA33FD8B1D2B00F58AB01E563D64CC322485C78C66F48CF0EFACDFBEEB776A9C29928ED3A33E49BEF0E52D97819EDA37753834FD2CB4CC169ECC5A1BC9D0A7FB2E2E537F5766FC85FF4D11B8D4079F654FDE6D48A5949FA3C2C9839363A5E1BCAC2CBD4DB1102F146AB0C399D525F63F52790329B4EB764F4358655C0D0184EEDE2BD3A8A33D2A0345E464BDFA7F1331B6D7C385ED0B0DD07ED1F3ABC9B4E8D110E7E1447EA5B76A18D9D86FD45E757FE3F0DEB69F945F217B84B8C9FEAFF9B6D7268D78F86DF9D0C4953D4F9F94510B4A3C2DDE76E5A2E6E0A120D65476AD2876064B73433A7A619EC4FAD7BF809A431DE81C0B00A98C942BFFA55BDDAFA13083C374118667432946580C3527CB2E9FA8133D09D0A0286E9333B50DB19D2E1E10D85EAB5FABFD74C0160947B91E2BD2BC40D220BC4B262BEF5C68566376E2FF7575A280F664337D4BC13CB2B0A17CA75A6AE7E38D1D197AFCC4AD3F6301183C514D4ED0BAD3BE3CDC9C6BA68BB5D6358058C7750740D281B69B8ACED99E2B2168625385FF7D16DD008D04DA070634D0D13C168BC486138C341034431ECA7FC8D5869A8C8B28043C1586BB3F6668DCD3A196F6C8C3A742E94A77434D81ED6F07444D6D57759A557A93BD1EF708589A2D64F52241DEC1CBECAAA9312AF54BEE8B4D3ADDA4E3FA27C3AEBF35BAB7CF2B21440C7748A8D76230A681F28414FB3723446AFF16695D9DD2A1B6756E62A9D2C21FDC037CAF521E5CFE348599178A223699CA77809E799369AE9D94DF1B8012187D93DDDEAD99ECDACF54447CAEF95FA9F324359ED6CDF83FAEB0294F736553D3EDB469FFC18DD89A2A37B86F2CC52F24E9515420661168D3551DCEF6AEDDD89A2B7EAC472D1A6FC24CB7B959F3A966BBD6258054C640F3094A3C2519051E1CBF49C8AA593506174221ABAFB9CA563C01C6158E70C07231B1D339EF2078DCA7418B6E6C70A9B0E8F10A331FBE982343E672D30989CABEF5D014AA7F0D3FFD213FD6EB4EAD4C3E89A125D11ACD8098AC33B072E1E389BC97D04136E647DE8A02CFD68B434CA9D157EEA46D4542634563A328ACE5D92323BC72A66058669B6BE89EFFC368963BEB5B222F14447CAE65ABD77BCF299323D087F060737203C5171D6B13D74B878A2E37D2AB74D95F6C3756FBAC2BE4EF9202C67BC481B83C03C6B3DF9D1DD8952F6472A4FE4F940FD9EA56F30248DC69AAF527DB473277A887566B9FCD860FFB689E55AAF185601C3E8ECECC1889592FE64AB8CE0BCF07DCF813BD5765FB334483A221BB218A95054AEB2FA53FE001D011663B65506987E6220EFDCA734D000E8D834D047AD724D49F8D0924D27FAD59DA468D6CA8421186058182DFFC8AABD3966A35D6DC27EEDAA776379D0F19E6415DBB55265F0768575959EFB498A9159216FB7E93A3694AB596B838FAC487AA223EF1CA0707DF656C7F4440342C273419AB23DFB5BEB898E94A19F3C194F65F433AC991950DF2CD79CF16A3AF97163ABEA77B1556DC9BDF0F9A17CA9B1E612BD4B7A9ADC8976C3722DAAF936D6C505D607B4F6B00A180A793CA7047EBFC3F373ADD2E8475C609D8DEEBE6DDD23B246F7EA6FDD098534B66E4FFB7346848649F9FC8FBEFF91B5074B40740934DE3A9B256756A2B15FDDA98911691936D555D3A98C9D509726C7DF85DF4DC7B620303E50733F3DF9B18921039F6AB88FB06526FD9835BB13ED96E55A90DCBFD0FA0CC32A60329A3162E5F2642C53E8BEF23132E09852EE44B380A96C8A98F676629B1C4C6FE75939C566EACAF2CA47C3F1DA014D96AD4C27440B6BF40BE86AD243E3FC99B311EDDE9B4CC4BAC0A48391BA49B875C33AA5F66211E48965A91F8F32564CC4DE6B894D110CAB80A1F2537785B0122829A95C14BC342EB729C2AB1D8DD9D92658235722C2AC309D456FC17A1C451EEBF865FAD6CFF44177824E0305F0EE0A077D044C06EB756FE8EE01CEDD3EFA216728A577D3772FB0CA15A43308D16DE3998A9BB57774BF186D5B9CF93A546947684D53DE5132D231F0F286F2301E1A57670B95BE87103E4CE5B3D42A25F28F5546CEC0DCA13CB8CD97A789323AD2AAC3ED8E5538FBAB2C2ED7FB28B17D5BFFFD2A23CA0E76E5003D7FD42ABF37FBE83D3707D84579DAC1EA59268414FA1FDFB17C87EA9A74D04EA23DD9AF95E63AA62FA301C32A60EADC15D298DCBD260D33DA14DDAEFBFC653483A9A16C98CEEE1EC2A141A18718B172E4735799343204831FD4F66CC5C177CF52BC848D1088879FC543CEF89F3D210888E80A92B4B0A44198C04EB81D1142CD8DE2DCFD62B46D71DB1EB79FE2DBED14264AE40B950F3A941F1AD7640B95BE473E9DFD20BDD15E6B660883191EAC47B4F9BAC82AD6038607E1E5CCDCBD7ACFED8DEE0BEFD1D9110A080804EDD7142F82649555EE2A9D4D82BE66098270AE3B588EB0972A2DB0806E3F15DB49B4273BC62A062965FA321A30AC0206A4EE0A69FC34361A2B0D39DA143132D25960114EB67236B2ADBE5BA2B07C44837DB94DEFD27969A06E47C3FD57E95B3A3D23BEB3118F58FDE167F19033B3CA4E2AB246D16DA3038193BA5F8CB62D9EA668F7B24A61DEAC7809371E1AD7640B95BE774F281F6614B8F27485EC0E218C0DAD95E9F234B97DD36A85E9CC1C97D78559E509907010E0AEB370D6E901E58D6BC4CA0E1FD924EA072132CBEA59A67DF5DD5AABECA7986D7A3B89F66408FDCD6D34D3C7F7910DCA081856014323AA7357F8EB0EDFBDBFCDB3AF5B7BD41DD4067E157ED7B15451F31F8F226962A5DCD0ED7C5D9DD0CE7EAADB30EADE731B279625080EB7D74217953230695E9C256BC77AC4FAEB961D392FF9BFE9BBC8322134700BEAB64108CF3A06097C33FC1E38D709EB03C32A6032D61DFAD55EAB5B4C15FBA9F5822C6032268A6536D860A994854B8F30C80206C5E82BAC6480521A1246E12FACD40B5C6B6303DF626F03FBC0B49FE933CB03DF54959EE2D82DB045C25EC93DC7D1A8D1E7A08F41190A33D40D3D3D11579A13416A103A11A0EC9D6FE337E0ACA39F07ED64C7588F6E1B768D0D190655C0D040B01362FD3FA3E639158752128AF7AD7A079B90D7EA373A01A6F4281EE930D0C2ACC5FFD14AA5239D1ED6800AA70142F372009B9FE248074111885211EA1536CA95A73FD6F7ACD763C7A711B2831556059B1B1A2394F026BAD84A8E507C40E9421780C27123BD4B7E7D4B3B0ADED495A6294F5B294D7CBB44E9A59C5074C200B929C00F94E757290CE243707E59EF629C180DFC1064D0F36E94799DF2EF4A56D2BCD0AA63602F54FEDCC5E7F41017695BAE2B759149FDB43BD9F16AA501060F2ABCEE6447F2F8747DFFA8F2DFE96447183CD8BF95AAC7C536B6931DDDA52879FB93F00DECDD6AE5E108ABB64E6CA8B2A11E77547AAF51D94617A2038D411530340AE8492A1376A469E31282C84F539C117ED3686122E83094010D100A16C1E0742B4A3C581A463F1A503CC59106C29E884F5AE9588878601268447831A3E1DED79026B7514110D0886954509F87285DFC5EAB380FD33B084B37AC7BB2D5BBD244E8D08969C033ADA25A19299D5236C5E1364A74906898F81395659D811FC2E90095CDE67AEEAE2D1759E56CCA0DF076B356179F312E6C917EA7EF531799BB58FB931D19ED6F543A10E0E9C98E80C101E183E059AEE7ED4E767CA6FEF77D3C6E0F3596931DE3E98CF19B83947606916D9547CAE016BDB3467961064B7D1FADB09CD2EF0BA3C5F16250058CCF2C18E968084D6E04C99F9FA6B873F88DB06114A43131F231D2D0297D1944A53E1EC2E1BD788A238D9A4EF56EDD5FAAB808EB7D4ACBC9569D66688A9325D23395FE54291A8DE9000DD73B274B935956D1BB75AE341158CBF58E7776A85636B239A5BCD22A7A9EF4224CE958D178D1911AF8ADB0CA28F35185B189C2D948F1C6EDEF8F5A45F1CE4DE2BA2BC493BAC8EC74B2A3E7F909BA9F9EEC0810C00C420F2A4F9D4E76240CB60DBC5CEF6FA2321ECBC98EEE52D4AC7E5BC1CB95C7C7AC72AF8930A51EFDB85BEA19C1BBA95594FE406350050C929F8EFB41FD9FEA2EA8F0BFD06F8CF5A8583ADF99E137B30F3F8CEC3BE13EF09311231549A38BA738FAA6326F4C80D1870E8C60490DE1CEB6CAD2B609A98BC60535EF4403C07654E9990DBF23E8F4758689D1D56537EE349B90BA85AC8BABCE45E6649CECD864B8BAD09A5D8A76A29EBB39D9313D9DB11BFFB9DFB6B119C30E0C0655C08C052BC7F8BB0975A738A6D6C5E857F0C79259898C0CB3294753334BE9644407EA5C49C66F5947D719DA31C54511F974FDCFEC86A518A358AAB08B2E235D5FD16923601D587EB0CC60D656E70AB25BA465E3069D57586F3099E1B76361E6E839CBA1F5EE1F65AA6158050C6BF9175BA9744550B0D6DD44FFD3B0A18751D6A1A44308A0A7A0C3A3BB607DCFDA9BA346A2111CD3DE9D14164A571750180F8E582BA380C2F4728587EE0481D5CE65241DE02A6B755DC91A1DEB6E57A29EA1B4A03444C0B9D124EBF53D149EBB8244417AAE8D6668DC756564877C2B3FE1CED0F7BC078B81EEE63095090AC7E7288F2C2BD011B95B52CA753F95D32FF41EFA1B04E776CA136942B7E2878E2D56FC3B2B0C949E4F4AC267BBC09C50965E9F7E3C8C1BB2326344E91A5998CB5546A469A6CAA89756EA19351856010368D87E18171DC719081471746AD6FEC7E87FDE43A0D0595176D28069B4D1080E85230D17E185A11DD4309D173D46CA28407DC340D0691EB0EA90AD3A979184EB7E829D8181C57954E940B03C3BE4EB01C5ED4693172A7FD115E4D3ACB2308E0C0D1D3D65872E577877EA9E592568113A089AFBF5DB992C842CB3B5E89614E1C7BE1298143A34B4FA9290A73D15B73330BCB7ABDE8DAE406F55F8B725F58622F47AD5676AC84A9DD4B13033ACF2BDCCBB59C0AC630CAB8071034234F734E4A88865E641838459A0933CA6F71809236B33C35A8DE0F86685EEFFA9C245D18C80AA63141E0BE9B9DF5A5D3C4697917EE0D9BD217ED278A0C244A783FE874EC6EC884E1A8D26F97F5F6B7505E948191A90B243E88D9871B95B830D14061DD2DD3B92C62BAC6272A6D968B7A4FE8C8B0E0E6D8C527BF750A6080337BE24BD6EC51E5D817AF8A6324B9918AFCF68C83A4BCF220B130FD3E3B9EF8F693AFC2EA30718560143A3AA33768C6B7446496606A7593D1D981AC1D1989BDC20A6F86E87E7A9CB4884057B7A16847B08043A391D9E1940349A7C5FF2FD75C9FF9ECF3A86A68E1D7AA7FE8EF560F52657975758B35B47D0EDA1635E8713D9E14AB92270D2DDBD19EB00C32A60BA015371F4124D7B0DD6A5111CCADD8D937B0834E8739642F758C678C12C90721C5463CC81C654163060558767EB8A6E761F3029582ADD651913C12A9BFC131633BAC4A00A18D6D327EB2FCB91D4D88F65C55F5BA9F41B29AE8F59C96C44A3C53AC0EED0A93143F8828D1D6E088982949947D3E6297403304428836F571A9B30D693152348CB7C2B7540FD70B262B718AFF15F3B1FBCA09391635A2663057946F1EE3AAB298F41153028146125A03EEB6C7E9C99F9672B85CCCBAC5C72609CF7712B159ADCA731C2BA6010E9466C84490345FF02C5892215DB9797EBFD4F58A938E5F80B84084E8E68ACB01B2855D19BFC5071C2CEC038B11D1D052C8684E83B606C98B2BF4861DF14EEC56344DA9DAC186963F71C87DE06C5EC6656992EECA0F47673B2E24A850D3B44E7769667B24E56F4345236B066D12893F4EEAFF8F8662F95CD57ACAC6BA7DBAF55DDB9C1A6FB1C76FFCA97A89CFC54CB43ADF2FDEBFE92A93737907CA2EA6F13C5E3651229783F41F15AAB982BA7DDAF51987E0E1561BBB9839FFA78B4EEFF40E14D190CAA80812DF8A295AC0095D774B60F230902884E066B4343A26130CAF89E11580D040E23FC7BAC1CBDA0AFF1B34B67A6716E16DE67A45FA6B0F6B3CA2E89460D553D6295B9008A6284C8F97A7EA4C241E86024099BC35677663350E21F4FD2DFEE64C5481B633773BDD2E37B5BF8BB8FC2E9F664453A9553CFEF5119D02926EB6445537EE6D868A34C3772F4D30C7FA8F46F61AD74BBD3E96EB0E93E87DD109538B7B3EA3036F7E91BFD259BD2EA468DEE9F77249449A4E05D8FF356AB2CCF9D76BF5969273EB60CC072ED68ADA73EDEAAFAD9D4A6180655C03083C1D09146E723726AF34123C6F6E531FD7D85EEFB61F38C6CEC8B80A68552A5E1D138D80F432760331AA3DAC50AE320BDEFA73EFA749A518AD19586E7E7323FA0FB0838467E0408CB8ED3ACDA4CE6FE66FD4444EE2398FED2CA599259FB9315236D4C38FBE83E8DFAC5FA4DDE108EDD9EAC48FE114ED0C67F509808D5C9385991725DACF29861A38D327FADB2E0BADBAA03E740A4DB37B15683CDD9D6EA5FF928E5C70590A79530317244303EA83A9AA9FC53FE2F4BCA2452F0CC625FA7BCEEA0709D768F69239E3DADB2595BA37C1CA0BAEA648B3674185401C388F0F756566A9D1D1115FD86E45EBA0D1F61E00DE1875629027DBF0B7851C3FBCC725E6AD5DE17B768068CF02963F1EFFAEB71016630943FA31FCB2D68543ADF27926F3B9DAC08D21310AF0ABFEB1A75B7272B8E1775272BD2311106E4219E46190D31A3E1610CA78E6E77B4F3399C86D3CEA030D5F77899D01E58DE309BE9C6B1F77792FF9F60D5B1B5538E0D1C54010326CA0C44E3C56897D4146EEA1A327E13855C1D1DDA1426F79971BCD72A7F2D7518869315EFB4C10483D5E76DFCED6D4A9DE4986290054CAF301E366522A732229CDA8D6C7586978E764C4D933BCD76AE25C70B66929CB78C70453FD3241027C2B250C62CA5DA1974BAE1274BA426F7952C67582EB34446898C6E041D5A3A8389A74C1E6AF506B2E4C73D1CB63332A59FF50B43B74E31AC028606CF12843532B636343AD6DDCEAE30A5460FC11A1CAD3EB47474AF48A7472107F340E39967A51EC35D58A6EE20510852E9D0ABB8DF64A9832E810ECC72051D0D1D9E863C47691CB1B211BB72910648A3A111FFD62AAA9686CD322A1A42DEA1308E519EEEB6CAA668969E13263A0ED82F3F076A2F85EDAE254F50FAFC544658A3E7295EF4242C69D06DA19F620682F05DAC7B2832CFB5CA0525F9476F75ACF2EAA7395EAB673355F6FC45BF83AE22358874234FCAD095E7D4DB12D5012E275DD97EA9EAC30D2549C745FA8EDFFBAA9E3C9D0ECA01360FBD100C15FA3B5CA9D25969037B28CD94ED192AD79DAD320245E9ED5B058E51BA77D47396CE4F48F2D22D43B7A7F2C6BBDE0E7E69158375AFE270868E7770B7D9D74EA98655C0B82D0BEB6198112A24B22B74781A2F9D0AFFB84E5BBA7BC56759ABB1A4D3BFEEC2327507C90CE40FBA170DF768488CD87464EF70DB2A2C3ABA332308363F7EF52A85CFCC838647A38A2C109DD505CC8895B3011A380D9991DB3B190D9946FC0D2B1BFAD15631273EDD5F62ADA7321EAC3259A632DAC62AF799F7298FBB2A2E94EBA90BCA27289CEBAD3ACD1181432745F77494CA7A53A5353588F4B82CA4D53BF36A6B35E8A473CF48CA9B8B01E14ABDEFE96C87954A9B2B6BA7ABCC6FB4D65326C1E6C9B723FA4B3A600D5F6595C1AC1BAC8E85A143C91EDB01C26F17958D9F86E90C5D54DCF72D8655C0002A06CD3FA3911FDDEAEC0A95CB0C81CAA213D3E8A37BC56804E9C675D18565EA0E920EEB4694D1700FC4930D7987CECBC84B8777F6C1AC3A89D20D35E98C74E6CBF45E34D674D68C74B16C6039C0BE1DF695702EB45B25DFAD3C90973956B906F5B4B19C4391ED4AE2457A7FB6D2C1B591558C08F1D1F031C0BCD15A5D50FA69967E8AA5E79999C19374C146D1C910687506914B14F78156B92C6586423D5167D1A0D3DD83A6E54D19D25959AA3133BDCB9A5DAA9A552C1C42C24F8F744F857ECAA45BA6AF517AB609E57F8055469EF787749397B13074EE4E24B6030495CF781FB65686CEDDA6F6B58F9B61163034E254F31FD9959479E9060BC2EFD460EF73568F356D9EA5F0D1968E4E23FA1F7D1FF7F9D0F8F7D76F3A110D1D21C13280C60CE3725197F1A5A7325E60CD2E28C106212ED7372CB45617948E76E1389A0C22EB5C6B82C8D034EDF2FDB4B5A6F36E5D11744ADF73D4CD299391D94BCBFFFC0E691A0F43D76ED63550270D0CAB8099A8E67F7D63C4CAD940DD1418BAF337E17FDE5968E50807D2B3AEDB8138C6722A631A57BFA297E94CCB3FA30D8655C000172EDDBAC904EDDC3876A3B9471F8170635A7DAB750661A2B7606DFFE3707F8D551BC7BA610A7C9616990F36F735311BF1E033DE6D67B3D4145727BB9EF58D294709F7238655C0D0F8DDDD244B25D6ED74229648081B7420E84B523668B6DEC3B686B52F6B65775A4459C1D8B056FF95FE679D8D8215414127A3E3C224D0C96163D05F303D67DDCE7A1A7D10BA1FB7A33946F13D4169FDB9D2B3A9C24717045300E30583E2ECC295217EC24621EDB638301F08485829740AE72B5FACF7FD30AFC315C7EB540E6EB3449EDDD6896513C2C75D736EABBCDEAF7CA04342197DB16564346058050C3302773789961E26874E0FAB807071BA35658366E999BB6A847E8D0765F19BCE4A673E5CDFC0BCC012A04CF41DBDEE42D30F3443DF83520EA570B4A319B152F8DDA53049F31AA5E95EAB0E58A3E3A72C936FEEDBC25A6D71DC4B1C7F998DA0B4453030A3F2C3BC6EB48ACE8E364BBC77B9EEB1851FC1E5AE399D1A9DABF411F6B19691D106C32A60D0DEBBBB493A3023319D0F01C3FE84A3F55ECA0639DC55E38CF01C21C05E053F3ED46D68E8A4CE36D1016103E8ECEE6AD26D77F83DCB5AED681E0F61023AEECE7A97B09C29202D915D6016F324C57FAFB5DAE238F381B03859F97E4861C7C3BC168734BACD527491C9928DD991BBE6E4FF23947704941F5E3662A5D0CA4B928C51185601430761C9E2EE26BFA1FBEE1A326AE9533628FA8B69E78FE4031DD290BACDACD3FEA72C44139CE918CB2168EF6FF36C61CDBD3A9BA54B93FF6359753AA42C23C3869945CAEE263332D6338655C080EC6E3223633D6350050C9B9DD07BC07CA060BD2D79EE2E3351C4A23CE5ACE37426E36E2B53D798E85BD0DD5CA370C6B214680AB31DD06BC03821105982B0B4AB335274B8811DFA8F6EA8F70894C5E875FCD891BA25603B83C1C934B2F3B4A471B433C64C0D51279B2A6F4A5337C09CC0755519C2A00A18285798149892BACD7474021A23BB28F1DB4227867A865D4217C22E4FF432283611545802C39EA02C853942808D58C938FDA3950A5376734241A37B9967A5A11E8D9DA5181D8F5DA3EE261166E91D560A373AC87D0A13068ADDB9D199D21C7D8BA215BBA84B14FE1656D92F412FD3F19FACFB2896111028612FB5F60683BF551C6C43777B18770389A07043423F9DF131E59B3C616E118D21A1D5315F38CF2A179EBB2A3D97E9390CD4B7F4FDF394D747F4FF650A6B8EE2E537CA67EAF36EABDC58BA31E6F156315BE41B05F472A5C58D2CC93B0A662C9E172B2ECA85AD002B15CFE6AA13DA3B75EC8A7AE21DB1D653399FABFF892F1A36D29E684B6B546EA4774F95F92EBA37DF4A468E36716BA803F47A5B5BB51D62CA1C9F32A802863D1C74043A2E0DAD6E29049B8327383A835B49F31E9EE9603DE8C818E8D1003EA977290FCE3EC272190F64304534748405233A828B3D2BD0DFB867C0C2184F6D0FEB7B3A331D988E4107A4F3D1988ED3B73C6F1A6969E06B142F8DF16AAB0C06E93C8CD608CC63941FEF149D0C06A1A6E968D72B2FEC6181556266E6271E32E3F2D319291BF6DD30BBA1234663C8112B05C653541E7E542C65F852AB5C67220CA3E124CFE209903F54BAAFD337D72A0CDEC13E091DDA6CD50F1DF769FAEE6BCA7F6A6479B055DB0A101A1F553D1CA0724058DCA7BAA0CE98D9EE68D52993E9A99C1BDA68C346E2F42D0D73952FCA9A76F609AB7CFD32A8EC62D50C74BAEA0ADC6F530C832A606874583CD3D071BD5067CC4663C2EB1D33163ABA1BFA319AB8D77977F8F46EABFCB2222866E939C2000186FF5F4C0F16EA1BDE85AA65A4847DA1F32244E8A834348483BBE4A4136DABEFE8B418BEB1A1CE4746A870467AEFD474643FC6C40D0669B434DE7759292C3CFD3C7FA1B537189CA96F98A9D171E7E87B1A3BB3019622E9E98C7E3A25E9A4B3B8DD16E1ED6C95236FE0C695780C3C5CE95F6695E1E452AB3C0CA671ECA8E7D481BBA85CA43CAF54196FA27C6EADB27BC05A8D2CB9CF0CF024A5EF7E95D32DAA1F6665575A75BAE71AC5E5659B9ECA49FE1EB6D1868DB3AC75CB82BB10BD53F1DD69D5DEA469491D30237CD0AAED107906D3E7409FC2D2858AAC5B22D150DE19FEA7D1E2F3835128EA2CDEACBF6E3D0B2893E8A16E435DFEDDDBF597464BC3F1C6728CFE3AED1C5D6C7EA94D5ECEB6D114B1EB7DBA31183C4F7F1724F79B0C06239A0CE7DC54223586246FE41BCB6D3A35B384685C198D323B194EA6FA9F6EF21AB1D05AE9F66F59F7F8659B67717B41346C1CB17266E488AE3E9BD04D1D0C350655C080B19AA9AF6CF32CFABA4DDF6B3AB8ABE9B034C7321B7CD41943C6132FD9503816E3CA4143366C9C200659C0748B6E9881766E327B65D437D143BEC61A1EBA00FCE1B0C460E6C28CAC9D7127A81392F1C4CB54C8776B6CD90E4DAE3E9B30D907C6B54B47B7AE411DED0E904BDB15F503F9309632EB7783D3A11530F1702FD7EE53191803BA2E863535AC066B657769C87D14BB2CA9DCA523FA1B980A4633D6F36EA808603BA0B469442C139EAB6FD087A070A5B3A3844489F8A0C2E4FB5D14CFA50AC3B7E8230CE9FC1864FAD6FB6D151FCB146725AE5058BC4F877E82B51EA416DD85F2CE5E56B1332CEBE824F3F42D02C35D7A52566E0F15D90E4C2B26CBD892727A8B950AE295CAC7127D4F98E868E8D82FB2CA8DE97DAA0314CC9B2BBF4DCC1279B95FCF66A98CCF555AFCF0B6D3ADDA8EC0FFE8989EAEF7A937F44FD7EAFF97E9DE55561DDC46FEFDAC25EAF6EB56EA038F52FDBA99C7064A0775C700E72C9B1B8BB2C4DC46E93B40F13A73E686A931DD2336FA20B9BE36381D5601130FF7A291BAF2D45D54D260A073A9708411ECC4B3F4AD332F8C5C344237EA43191B0D15C12CAB5C5BD240EED13B747494B608171A3E1D1545E06D8AE7A210BE1F3CC677E8060ED5EF2DF5DD6649DEE28161C483A2F352AB0E528BEE42FD444B67679CD9E21E47A9D0595090BB0F5D1A33C220653B26D3D8F2D7CA039DF41D7A6F5B9503E943F01CA3BC537F744E3A128207E52A02106154C72C1DAE32395A69FA86DE738F745EFF9469AC3B94ECD135E585CA1782FE748587129F2364DC35A8B364775875740D71C244C1CC7D56E1DEAD385FA038A3B1E8B3957777CDBAB155CC991BA6C674D71D24D7D706A7C32A6068C07EB81715C8C8E08776F177AD556E176918B013CC6CE8082BACB28AA6213B53B1D82AA3423A2542CB0FFA72D796C445833B49E1D0199D49A1D1D061DC109230175AD969FDF4433A3E33201A8DBB865CA3F4D3112333B454CF18FDA1DE11487EEE4F74174AC77476666B7D4FDE9CF9A00C9C5159AC3CC583D2AEB7C937B65CADF47BBCD7E8EF63BA28ABE8DF9799D1ADCAEBC37AB789597236C9CBC7110F4873CB70AF3BDC6FA4AE29F9F62EABEA923446D7A00C16D42D3353F4547E00DC76A17C89CBFD275FAF7A8AC6A2DB8470FCB03767CEBCAC62BACD461F24471974A3705E2F185601D3EE70AF886E0E573FB7E61E1DCB7DD632EB70D7968E781058A79DC075ECC779568F3A5622CD039DA7CE5DE858E107A581C936B6FC8CFE76EB4AF41D5DBE77AE8DAE2F2F9FF4F036666FB1EEEAEA39C5F793FF63DDB63B00CED9BAE8F2B3DB1DE27587CE7573905C5F6058054CAF71B5FE32DA35B9B65C5F982C77A1837A505AB718B1FEABBBA143163013832F61FA0D83EA8B785DA25FEB6EA83055054C272AB45BEAB39BF73A51C14D986C1ABB1DD234764BED731E11E53862A5B2B553B89DD00D45DD2D353BDE721F0F60A0D0335D3BC6EFD0EFA0CFFA9E0D298655C0D0083B51A12827F170B746BF518CD6519F753421B4298ACC7DC27BF3AD548C460345D6CAE83150881EAEB850F6213C50E6A14C76C343DF9A1E696CA79DA3E122E943815A475DF3FD2CA5F349D64C9FDFA334DCA5F01ED6FD5DF4DD83FACB728BCEE3068C7143E22CE51DA6E61195B71B556EA6B2795869711FC7A4C14F3E74138F941ADE41D7BD0A0BF6065D17E61A2850DDC071BAF2738FCAC3CF69DA48E925BC25216E287914BA7355267B5A45C7D32630798001BA43F1F87601CFFBECF00EFFC33E21E89EAC70A89BA3F41C45FE1E4AD3ECA4BE9EAF7ABA4669EB7B3DCA4430AC020686A013153A47FFD369D0EEA3B54FA94F5047131EAA6FCF08EFD1B0E28986D0984FD1B7B03E4E993B9D0953E2A747D2616874298D1D37B2393DFD908D36C4F367E40545225BF96F511C75F439542F0A5B3A071DEE7CBDB74461D1C1E9904FD7776EC0989E2FB48DCA8CB4BA1F63A7FE291B675DFC593CF9907C22C42235BC99E2732A96B47E5761CEB4CAC0F15895DBA54A17F1D1A1A99F5D550E230A2BC6CDFBD75B55F7AE04A7BDB82FE41956D571CCFB8AF00E7130C820A49C8E8E61ACB0AA8E7DBB84E9AF9FEEF81AA5A5EFCF979E088655C0804E54A81BAFD1501108B36D34F509EA6842BE9F91BC971A2822B0DC6DC14BAC3294E31974E6AEFACE294AE85C665691C6FEB6B51ACD91663786ACA3AEE9CCD0D3745A660708923AFA1C41C1688C4073C3BE19212CDA85BB49D85A7132F3D842F9736CAA3836B28ADA5DAEB05EAFF4DE139EC5930FAF5798661535ECE518A9D893F41E65316215357BA1D219D3EC869EBB2A6F3B86B87D3323C2E2526BF5C5BC9955BE9037B4D6ED026EBCB94B7867A6EED30EDEA56FAE0DCF37B5CADADA0D29A9AF9BAC32EA1CD17B438D6115303490B152A14D6847134634192822683E6E13C387BB78C628CE0E5E46473A0D42AB893E67C44D4F806CD2559CD5709F59CB1B6BEE23384ED2EFE80F19A4947A1DED1D4F5A648982D0456821BC17DA687FC2DDD0CB8019073B98110ACC6CBF9A3CAFF3B11CB70B5C53F3CEA936768CE7A4C781C5B00A98A988484FB38C6A47C1B2CCE89591E264FA43F61DCACC12C7E2B9AF0EA48519E55ACB2720AC334C6501D3C494B43BE530657626DBD02EBAA46C32947383C2A5361A4E4F77A260BBB5446FE7BEB2099EBE267FC89E2FDE61BB3BE59F1E5D1BEB268613CB7B9E8DDD7DA72F912753C08CE534CFF1B8D55C976CE2A46398058C6BF8D123A08CA393B024808570F788301434723695B10EA73CDC2890CEE5468075CC0E0C941B491236CA3B8401EB7FD6E8B7E822EE557AD78D05D9418A6E071DC5BD8AE35EABB6B033F5467FF074A5930E88411B8D8D6DF34CEFD1D538AB4178D8B030F59F6715F341F8287C994DB01C7196898EFB5C95C3154A0BDFB08CC006C69999DFAA2C281B963D17EAFEB92AB723F5CD7D8AF71A95290A5E3A5B9D8BC9CD15875B5DA3E83D42F13FA63422549E6AA54EA3C965E631561D1E47D95FAA72988821E5652A9357D9E85339B1494A99A4C5FA1F7DCD4871BDDAEADD724646F1052A6FEA0A6183B0457FC3729076B6DAEADBDC406258050C23A06BF8E9A47ECA226C119D07E5A8BB47DC44CF1EB1D6530EB97F88DE4D991D3A09B30DD826F7734BA77F8F9582004AF238A5830E8A12331A0BD231A371DD057AE69D954E49E3C7C48146B8B7BEA393FD5E698AAC85BBC99C67ADCCC76E4A338D757F85B35865E3E5F002A58F6FA65B2B3343874638A244A5C321545D6FE2E9866D4109EB6E376F54B8752E2677D0FF9E2F84CBCEAA8B6D15CFBF592954F806DA978E5AC7EE8D58691CB8A7CAFE552AFBF11A522204F1E0479DD79DCA49D9BBC2D6992404D70D56298C9BDC721EAB7831F4BC4879DACF2A76F24ED5DB66FAAEAECD0D248655C0440D3F9589069FB537A375EA1692F7A8D0175BEB2987D1083065761875E80CB048744E1AD51BF41E0D868E8C7217B78A082A46C6682CC888981AD7ADD53B7E9AA3FBA4654F0A9DD34F8FE49D3D74DF598B8D749F9174BE55CCC7AD0A833CC7D317D1D1CCB2CA4070CB5066919999A970798FD909D6D9EEDDCECBD019356746B656FA7C16115D4C6EA234BA912069642673A8D2F4B8EACC9D64B763F778779EFEBE41DFACB5F11B523EA4F4DEA6324B4FE5043B582B93642AFB39CA7B935B4ED2E08C228A66DA076D0661E846B8CB94AE1B5566699B1B480CAB80A15174A3E18FEE11AF0ABFEB4E394C311E36A09DB160CA4C7DDB3A37AC3AE623C6C108CF68ECD6C05FAF79FF9C9A7B293343277891EEBB1E26B23D4D68E762923D4038575F68A38D08BB41D3A9981335A444C0A4AC9DE791595F5AE69F6E08B7CE2D2742F06D368530AC0226A3C46431278CC80BAD9C414D16080B213D651C604F454C3501D3CE8561CA0835B9301C0FBB3316305B40E1D7EE50356716586E74724DB9A426FCB1BA59640980BE647BEBECD231BACD6C978F476D347B943164185601135D66B2598A0EC99A99460F2B105D183A9B80EE844E8BC2114567930B4367771030B044CEBCB0ADFDBFAD643CA27D102C009D9CE58AD3BDE824DE92DC67BDBE4ABFF7567A31374091E81ED858FE1C6915B330CD2AD794BFD47BE9415FBFD637D155A3BB5944D1D9C498CC0ACF502C9FA0F4EDADB2F3748E28FF67A93C60556E5039DEAF341CA3B4DEA9325D6495BB4DFFFE97AA83297738D9306358054C74994967420830338115A063461786E802186169D4CFB2CA3EA8C985A1B33BFC0F83817E03252A9DCBDD4582E8DA92CEC468EE07A3DDADE7F13E697962F816E5A6BBE8DC49EFCCB7B2934666C15D53BE40F7D383BE8EB18A5572578DEE66715F6B664CF608CF9C82DF54EF900EB79DF283CB7C467783550A5494C50840745D30503BAB9C51743E2DF91E21066B9437C10D118655C04497997450465A3A0E0DD98F6D7517862C13E8AC30143009300DED5C183ABB83706086C2C84EC74388EDA1EF52D796BE1BD5AC5AB2AC4EEEFB89802B141F02C71D943FA477E8BCCC9422B3E0AE2949DF7E36FAA02F662D0898E8AAD1DD2CB6634CE233666EF3AD72E3B9C22ADB293FB8CCE1ACCA2D7A973CB28786E5D58895364ACB6BBE8F079B45779D19038C611530A9CBCC14752E0CBB45CAEED46D82AAB31D5A90FCFF999AFBA95EA72E7D29C3D3CE35A5E39BE1779ADE26C6247D16E36DE76A34B22A2C7B98A1B124447820C4107EA98D92E3A396315418560193D13F88F64460326C9432060459C064F41AEE9DDFD164A39431841854018302163B1714B24CF9D383A7D0BBBCD5CABD1B2874D161FC243CC33E079AF6E62EE3C3566673C5C5941F9DCEE935EF31FDF7C3B7509AA2B3401F837EA56943160C0F3A096C6FBED0657AC803F4348C11FB494EB37AD6A5893A870543F9CDAEE5E8E6B18EC29E6C63BB89D0F9133939B21BFA1FB05B17057E34748DDFC2D43519B8A27BDA4FBFD185411AB04CF465673476AC8B67E830A8028629360675275BC93EA4F0F379681030302866DF6B254BC3167614AD4CD5FFD94A21C52E5E949950CC301D2889318AFC8A957645285A61603E61955BCB7FB152E8FCA7954E9E6878EC4B41F07D44E1B2051E060AC1C3C1673029B0302834E75BE99FE5458A970E87721986054A9C8E7492D2B2C04A21E59867A572F7635632593031ECCF41B781229B8EF8B0D2CA81F4075BABCB4C3A258DDD3B4113857D92CA0C81C3967A14B8E85F508EA34F41F04083EFAF72A383ADD27DCE1A4290B134DA4A79BE5AF1612BB4B555A764B63B391285F7931437F939CDDA9F1C79A1D2FAB0D2BEBBCA10730DEA7C5795DDDDCAFFA5D6EAB2F42EE5FD15560A60DE5D68653BDA45E5ED02CA6976BE8F06B4972B8C59CAFB8B9407B751DA57E54678A7E83D687E3F43696830A80206D0C0A8D0250DCF111834583F688D598FD3A57E901A0D133605DA96060CE58B607203341A3DA30DC2653F85F72585C1C63C1A239D8D72A4A3303AD1F861609EA7DF08C0F95636C60F59D9994F50BA6874745866075837D3213E69A5E3A835CA1F9D828618050C695DAE7C313B4318BA3BCC7956B99CBC4DE593BACC9CA57010448F5A3D850DEB8610B9556572A7D28ECDD67F59D941316E744A1F210C8DBFBDC23F51799CAB7452F6742E98AC079477F712D8EEE4C8D94ADB435619529A359F1C491AB6549C3B58D579897B2BC589B3AD63F47FEAB2D44FB98CC69DD3ACF203FC35DD3FDE5A6976E277035A68FE5BAC12AEEE8A943CB3876891E2412823887CFB4216307D021AC93C2BAD5FA9543A79B4FD806EA563C3B050B1B021075AAB552AF4281DE3CD7A97190723369D9D864C833B3B7C4303A7013313A1013A857C9BE277378F74863D92F432AAD308FFDECA519CB4D368A1D2E9484FD1B784F56E2B3BB65B38D3510E56B8CE5ED198E7EA5DF27F9555EE306FB18A6EA693ECAA38A2CB4CDFBC77B3F25D476113C771561D697B80C2746345371BF0DF8F873200D0D0EEC718F8728234ED6ED569901B5AFB9323AFB08ABE5E6DDD9D1C497A10E27354961E37E1D21EEAB624386D7EBFD24299BEDE2AE34ECACDDDA43E6CA369F6D480D6115D919277965AB42D66891B27693BD2EA6D980616832A60A894FF0CFFD7550A34352E23A9581A87BBB28C342D028A868880F82BABAC71116054BEAFEFDD4870BAFEF2CE467A8F86F123DD870E760BE47862E357F497D1F231ABCE4AA6616EA870DD63FF4CABAC729B40A76579B7A9C2AB33E7AF33426C3A79D09152D81FB2C94513BD3DD92747D61942C6B89911B2C7E734AB2FE73AE3CE4F7599AEEF5AC6FFC7A00A986ED149018820A071FFC45A0F2B7307DE2962475E69F55861CD5816C28F698871B7FB3E45DE4E3F3E303B4349DF24C47B61DC392531CC028629364C03A3D10536DA19B7234EEB53A0A49CA92B6AFBDDA523CB1C77FF58C750B43B48AC5B56C3D12B3607A1F77CDD3B4C69819D7157A2CE58A58CCD440F36EBD6283205CBD4F956EAC23C3DE37145896EA7DDE172D964611230AC02C6DD5DC234B1A69E67A50215456A6435502CBAD11E9A7F1A29F42CFA09DF6ECFFBAC997D9D8D2E83A5CE2BF50D8C004C1182C60D149D1D416F800EE4E5E1DE097A9F65D90C3DE782E5F899B51EF476BAC2AC63737817852D1D6599FE6FC7E6500EE82E22C374BAF2803294CECD9200E684D302D041B0148B069591B119511C75079B914F04861B7D7ADE60D5A0F117291FD12812C52854FD7D2AF73DF5DE190AE378AB3C004E577AD1F13C4FF5B2A7FEFFB9C28EAE44591EEDAE32F5F38CEADC721EA8B2DC58798B469769BDD046DC25A81B94D2561850E659334B356215EBC4A07584EA9874A14772266C2830CC02C6F346E79C6795EBC6C86ACCB78A3DA073D2E16121A052FD102EBEA3C12338683034441A178D1645214B2C1ACCEEFADF0D144D716D9EDC83518085809571A5A21B469E6BAD07BD110F4ACD3A3687C64E0784F6C6A35B2736C75D624686291A673AFC80B1E9E15E1D637380D25277B0593CEF27E6CD0F9DC35B5B348AA4EC975BEBA17674EE672BED875BC58051C677A98CA8931F2B0D080614DC3BDB6857A2287FD1BB2040E8F89FB0D16E39BDFE99D160899FCE60D27A892E41DDA0743B95DF57AC99A58AAC138210C182C2F76FACB22CBFC886E4DCEC6115308CDC8CC4EC316044A153C37ED09822AB118DF6E8AC50CF7452778B3843EF2ED3FF7CC308C628BE93EEDF1FE27503C5795695EDCCE41E34269DF1E70A83CEFEB0552E18E3416F74CE2636874679B8BEE7BD6ED81C57083BC3E4C2CB9457149B74E26B948E1B14661D63E3BE83EB0E363BDB5A0F8CF3BCF96C8BB2708BF75BF4CC15ECEEB6F3F57AD7DD7A3A031677022F52BE37B46A194ADA5257A25EA65EE7756E39BDFE9DD94B8D2ED37A9919DE7383D207145F3B962AB24EF729DCFDADDA36E14CD8506058050C604ABED0CA3CFADAFEE7C93B4DACC6AF92FF693CECFEFDA9FEA7532E08CFE394361A28D61942D2D8DEA9DF75FA94BA83DE9AD89C736C7C48A7E09FAF7907C1E59DBE1B83CA78B019FB6E100EA921E5CFAC9EC98A2C2082136142C7A5D3D1D9CEB5FA03D6DAE9D626822BF597A5E36CFDAEAB97689C190D4A3BB1541103EB6FB71B0CB380012943335ED059A0BCBBF500370CB87A8CEF4F967BCEC93CB86DA2B8739CDF7562A9A60C865DC04C1610525349B88C174B6C72C08C73D08D222763601B786401D3DE4FEFBA88B31D950DE3834290B57B3B3A98F7E658AB67B96EC0376FB25267F27BCBC898640CAB8041118709001DC80DCFA04AEB685C66262827E998286C77B38AB28492FE9E9542E0783D473730A2FB4E9F3A75898290D3FD58B7B34CD85AF1EEA334D4C589520FB683F53EBA1D684AEC81508E42A7B24B18E5227B45D2D3295992A0FB8032BF5B694BFD0DA3F464A9E1BE7FD92D7BB47EDFA8FCE6D959464F30AC02C6ED7C50B2325BF0C3BBEA685C18016C6FE8C0743C3ABD5396ECFB586B154DCA733A31C2C44D0A227589728F0E4F078729426FF31A85511727F1C0E43043F1D31D5D102174DC5891BD12089EF4744AE263E6E394EFC5D6EA6FD82979DF0888D214C1E3543771FC4E69CEC898740CAB80014E9F3A9A68DC597A06AD4867630F8753967E4ADF8895CC06DF2E0DE1A6D425331E36D2213810727EDAE1560D71223C589ACCB58A3E7E52081361B8AB5514707A3AE53485E77E70DDBF8DFB1B764A3E7A9423BE67584575338341805E6779F76AC6246358050C9DD57DDE4E866EA58926ADA32E3F328178C6BB83333AB36AF237BC20FCEE64F498913129185601939191D107C802262323A367C802262323A367C802262323A367C802262323A367E817010325FC362B77B48E58B5C7042BDEBA5DA6EE299E8D6C758E8A7A7124C4441D2C81613B466432CAA40EEED0EB129B3C9056B61550D6D0F63802AF6B37D0FB6C23A83B128576DA746449BB1DD9296238F3ACDC6E7053F24EB73BCC090B3F47EC65FA91F519FA45C050A15436C78952716FB7CABB3C4E81D85BC246331A891FCECE9E132A003F1B97EADDED1416D6B098DA472751EC09C1229A3C2FD33D76C3B2EF840EC2AE59779C4443F383DE8F52BC3815DA5A6959A167475BE560891DBBCF57FAD820C7A6BA413D4664BECA0FCAFB306B76A444D9F84640FEFA6EE1452A570F8FFA7AA5CA94DDC774427CAEECA83ABC40699EAD74DCA434446750FB59EB6EE8D315973B7DBA5569BE43E9A5DC629B718758F354BEFBA97C29B765561D59B281CAE724E5DF8F2DC1AF0E7B91E291253759E57F061F376CB66427F75AD5DF010A9F4D96BEB39A76B88FC2F9B1EECF52BAF750B952BFB4C1A7298E07AC3A86C7DBE9652AAF0354AE9435BBCAE3F12DEB1DFD2260005BDA29501A2795E3875CD191E8B03822A2F23F6B65A55051EE190C094E03677B3F1D964A4F9D44B90F133A333B590F525CEE108959D30F15F64ABD8F97321A2E9547C34708F82EDAF88C0AA6D2A97C5C1FBCD606FB1811F273A9CA9C74363952226C775A4EBE7CB7B059AB932D46687702B5ABCA81F2DA5CBF9FAFFC6C64955F15FCC4446750B392FC908FC7AC72FA8470C30CE2A94AE335D6DA6676D77595F2E7CEAA102A475B75AC0882C24F00F0634B36D7B7E99125B4BFD95699901C18CA08A1EABBB37D6735E58860F9AADE01234AFB9EBACF0E7084036DD09D996D62F5EDD48F517985DE61F0BBDDFAC869553F09182A1DC1B051B8973A84A251E12C88C2F7293D1D1C3F242CA576D73D76E5B2D53F3A89A221BAB7FE35D67A9CC44CAB76E86EA134F0ADDB0C11FF650A7B95DEBB373C236E77E8F497563682413F4664B5C246C0353952A2812FD6BB71B7F0CA243C466377023553DFCD503C74384C1ECEB372D9C0BD6DADDE1954EA3F7996554E9FC8EF51FA8619D91C6B6D33A9EB85DB9487C7F4EE32ABDA1E69404031CBBA51697CDC461F5942DEA7297EEE23ACA85304FCAFACAA77DF59FDA0EEFD6928ABC7554EFC65E7F7CD56B5DBD52AA77DF57E6CA7CB955EC24288DEA378E2F12DEB1DFD2260689C6FACB9DFEDDAFE3CFD5D10EEA54EA26EB6D6A3629BCE9F896B5E1A0AC26B85D27275F26CAE9E51B9348653DBA471108F1101E785DF9D1C292D6813CF07927B9FD35F84DE1E7AE7D2F0FC4CEB0EEEF409DFBC08968BAC7BFCB0E17EDDB1259FED223C6670BE8C628688D06ADA59EDA83B6225A6AD69A9B32EADFFC78D7E1130BDC06438896AE74469B21C2C0D127AE14889303993FB519B18584EAEB5C9C1788F2D4140FA4CAE9B1312861EFD2260FCD070D6D76339D0BC09E36537EA34F7ED9C28F18CE50553E49405485905F42BCC72165B774C43BF62B21D292DB3C9C16A9B5C8C67D040300DBAA3AC4945BF08183A292C038D978E093DE9C7892024103CAECD771AF12C7D8B428B8ECE9208A51E4B16963F3BEB7F3A3F4ADE0DF41E3A0EF42028E6BEA578D0FCBB736ED8811BF5CDB1BA871E00A1B056CFAF539AF86643DD5FAAB0483BCAB6112BD7F9275A75703B615EA3E733150F4A40675B3232860AFD22606077E8784E0DCFB7D6E34450802140A0689D294228A1B8DB4661A09C7586078A12C5181DDABDC7FB090168DFFDDC67663A3B297E180594A8AC7DA383A87D149F53C3D315C6AFF4EE514A8B7B86F73377589ACDB1D683DB572A5D1EDFD3AC956DC9C8182AF48B804180F8A1E1E971220899B9BA1FF51DCC46584A2174585EA1E0738607CD3E9DD8591E1495FBEA3D671658F3FB7E186614CC24A07AFD188FE897C5D90F679D96EB7DDE4180218C1ED277FC75DA99994B3CB87D86F2759055FB654803333566400B2D236388D02F02864EFD77E1FFB168C83FD0E139EE2597B7798F8E9DFA7069D2DC7FD82607675B46C61440BF08985EE25CCBC8C8582F980A0266B2D9858C8C8C2E3115044C4646C67A4216301919193D4316301919193D4316301919193D4316301919193D4316301919193D4316301919193D4316301919193D43BF08186C83701C846D0F763FD80EE1BBF6C37A8673A21FE87F9CFAE08A708195DEC3701788ED1176445FB6D28524EF61EB83FB440C119FA878B01BC21608D70ADFB4D279D2EB8AEB6FAC3419789F952E0FA363292CB271F484453576509FB4D2668A7BD82AB191EF63561A50FEAD95D6DA587A7FA9B8FEA2B8FEDB4A7BA4B758E94409C7483F559C1EE6BF5B695419F3822F9B3F2BAEFFB0D28892FCE21A73FB31E699BC7EDD4AAF6E5E96A75969B345FD9F62A527356CB3FE4D617ADEB038FF2BAB1C75E199EE9FAC3C32373A98C6DB1CA61EF8FCC528F4238AFF032A8FEF28CEF75A598F382C7F879516EA2F575EDC27F34B93B2FE554D1A31727D89D2823DDAC1C9FF5E675E3F388B7A8ED2F480CAE01CA5DDDFC57E8CB6413B7C4C69C79D296DE18356DAB0793AEE511E0F5519E15C8AFABC58E9C0BE8DE37CFFC14A9BB9EFD4A4E7E80E65F121E57DA0D12F0206A340BCA551B9B867A0432EB0D2F5C1F7AD745D48A163254DE7A2A2692CF3AC6CD0FFB7BD7301D6ABAAEEF84A08492098F04A0209C8E52969486046B1F13136A1B468114B719C69C796416B3B582BB576EAD841DAD8699D56713A0845ABE838F8C03EB04825581F7841295201D1129A80C01512300F42080192E641E737E7BFE6ECBB73CEF9BE7BB9879CFBB9FE3377EEF79DEF9CBDD75E7BEFB5F75EAFC380A1E3985C0C500611291508A0A4E3DF6745DE5304C15F58996E90340DE4D6258AFA462B82216767B411A5CD6464B223D0FED00A21C43506DB76958520F9B215395CC9CB4B343511D6445413BC49E0E5B015419777656592CDEFF1AC2D445A3371981804453279578DB3CD9766BCA44D0C7C22C17F4FF523B82E533BBC6D08CD27135EFCAAF8354DED848F0483BEC78A60D0B7A85E260F02F54B6AF3D52A8BC58149F97EF181493A62C504E3B9132A783DA382C66BF4BC8FDF432BBEA7FD33439F3FA6DFE007799FD727F7BE57F5FDB9158B0D42EE1CB503E1499FBF5DE5BC4ABC98271E1FA0FA498F4A9F23E8C9ACC702F6931A7A3ED0831769F6C5498BAE08184027B05A336899A0AC92975B912786414F8E173A8C3493EC60586991F60C3C0623A919D89590D4992CF7AC16EC8658FD3D5BDA662BB39E11C1CC80654524674B53CCD2E9A287FA3E6AC5C426833D2B1082E41FACE02565B012112C79728FF6A6655EAEEF695B58F51864085584C6FDA27DAC6D2690F43A1BCD4BFF0D1A49724D7029420C21353F691B7CBE44F733914876CDAE827492086304250286DD17C28B09CB04658211393E2C7E30D9E037FC4718BF53CF6D579DFFA7DF8EA9E0F50915341E65BD91F60F3B10263842F55ED5BF40F40222E449F3F11D2B72DCEE15CFD8A9B0D341A8210448C38110BF4FF47F34A9CFC7D5536AFB6FAAED9ED92EA7A7172F76DA00A04B0286CE276136DB4CE8BAD88AED398C66BB4967DFA96BA458E4A841A75E61655E56567B060D472CB6A7FFDA501F93855D02938CC9B3A4E15E0625A922596D58A5D895F07A908BAC48CFC0EEEBDD2A8BD5ED343D73A2CAF6ACFA4D652ECDDA420A898DAA8BA38D47988FB5CDF0925D4ECA4BA2B999240C64842CE926C84BC3EEED99AC6D0EDAC491815D08E9277813C03D6A17BB2F4F6FC1EE89557BAAF8C2A4444870C4206918BB0FB6FF7599F172BE2CACA1B117D236CC4FAE93BEE3C0AC6D0EEA62A273444220B233395EDFD7EB596860E747DF220C5EA6F2A6A94D08AB112B040C473ECF5794D3C3B3BD7831E9D12501C3A0E58801E3D9AD70FE448FC10AC0D998AC6FAC9E6C6399B06C77C94CC796F2222B260BFA082620BA8E731AEA6222B0E2B3F526F113FA0B263413996D3D03EA3356EC4C000380958C09C304FABC15C28941C36E86DD012B1E3B30061CE77972C492A3F5D356BE6A22455A26C73626D385495BBE68E58BE8C8CEE77970A68CB1CDD4C30E24E5E53AFDC68A8DA080DF4CA6AF888E1C088BDF501D08AAE5E203470476925759B1134438205C38BE1D2A1E22D41ED33DE4C121F1163BD4775835725E5F5241233B3B04390B0E13F60BD9777897F60FC9D8195FF4D12E7D4F539C722F7DC5318EE3C9B3A2F102D5C971E656D17FAB7EE71A7CA7CF391AB23359A3F2C84DC491961706CE4DEA48E9B13E7831E9D11501C3EEE43515D75901D80130915829C928C70AC26E0741C480FA40F6CC67F4FF82E4DADF269FDF5751CF871A68FB96950AC18FEB0F7CB5E25E565EB2F2319811562865118A4C50D7657C5DFF6FAC28F392ACBC4FD5D034D636732CCA79099814EFB0322196AFEA79FA4EEE5F997CBFC5461F2939C2BC257B8649C4C43F24A9F37CFDC691EE1FF59985E4CDFA5CC7EB2A1A8FC9EABB32FBFE89ECFB15560DEA5B5871DDC79A1F5BC0A5FA4BC1D107614A1B118ECE07EF3B7F7B425E87D353C78B814057044C1DB6DBE804E074E0CFADBB784E7F1B936B5D79E340CECB144D89CD5F0C9C1F1381B668AC03C26C431FF7B12BECF298DCAFE8BA8009040293185D11306C7F31A7E6FE039CC153DF0BF41AE860D8BAA283411188C916C5307A8C03F42C67634C8A288AD15970FE47D7F2112B7D6D788E150AC525960F740C284CDDFFA4CE6781630CC7239473075BF91A568E429CB7FFC64A5F1D68FE5DD18F4E0173F22AD5E73E295887FE2A290B1F99E3FAA0135DC88805021D4657040CE6BA2AFF0190FA5EA060437B8F690F7F19262113144D3F5A7B040C5614CEC4981B1106080A2636AF7ECD7D6D3EA4B211084C5CCCAD0889269F05AC29F845E0378130C412E06F8F5C66A37D75106E2815717243518B031EEF294E7D52566565A128BDAA0F3A0FB640A0E3E88A800155FE0355BE174C7E762CEFB5D2C7008184C994098D2585DDCF3AFDA1D465922368525F9B4FAB2CFC1AB020E158E52FCDEAE5B390FA2A708F9B4D111C78D5BAAF0ED6139479EC7810845861B01CA43E295B458F97B57D0C7406029D4697044C95FF40EE7B71AEEE6502633244E3CE31E47CDD0BF05F6072E2B38050C0FCC80E04D7F6D4D7C61DA5FE57E570ED652A63BC3E0B3863E5BE3AFC47F871D4418854F9A4ACCBCAE997CE40A0D3E8928001A9FF003E16B9EF052642261A2B3B3E2AF83EE0C4453B38C230F9F181D8A5FB102A1C9BF04FC0BB35F5B5C1DB965D137A1F7604088137888EF1FA2C5007BA24F7D5F9FBECF7269F9414FDD21908741A5D113098F9EAFC071CB9EF0558ACFF1F49AEB9B319AEF6ACF4284ADD3C5BE56B035C105CAEFFD764BF57F92C709C393FBB0FEFD8DC5707A442A9CE27252DAB5F3A03814EA32B02A62DF4E3523ED1E8C757A7C927251018180CBA80090402FB1121600281406B08011308045A4308984020D01A42C0040281D61002261008B4862E09183C7371F9C7298EC044F2889070A99FD48178BB123CF8A44D2C481C450CD0B7F59D2455780C638AC663F7BEEC7EFC573051A7499B28E3403D97FFD604421BF0A921360B93360190E440B9DD02814982AE0818522212718C231D09A4F1642521370987C8ADE2C206AF574F99C8DF6BF43B419204181214C8E447D078D02221031BF41FA73B4FF308089624B40061314BF5CCD177A2B84963C95B07103008B1B7A97E62A5C8867791EAA15C8214095E4420CC50B978261301ED5EB87806E3C9FB4ADDBF53F55006C28A8C6AAFD73DC4315D2CBAF02246509192136F611C083D0C02C145322304CF560B043A84AE08188405C20321416C0E930B6F58DE1C80972E91D04C70D2352054883266F2238810281B74FF0A3D834070CF60A2AF490D493C13139A9498A45760C78310638213E1FC9CCA60B2F39A0F926A13A0785C4227EEFFEC22F0C2C553F72C2B3C7029F73ADD734852EE05BA171A11A2842D9056820C70EF111D08B00754FF5DAA97EF045B122EC11B0FC86C4F8435E110EC6A66AB5CD248120C8A873102F45A0B043A84AE081856695E8341D434396070B1274934291B1036A42E202A9A090ECD1C3998E8C409B1F2BF4EDF3982B02B61222390D8F5303117E93984D80CD5C904654740E432B13EEC1E98F0C437CDD777C2165201C34EE52ED5418A868515E5CEC8CA7D4434922D7F8EDA461C15F96C1068EC648899220A9B9489CBAD08F0A41E0427714B1F4C6820CEEA7AD188101BB64240EE0FAFE540A0115D1130EC009824A4604078B01B60A7422E18CFD4FEB87EE7A8C0D18063CC4A3DCBCACDA4E77842A022BB168E4E1C853896B0D213A344ECD2BFA94E841A139404CEA44078C1CA574F787E5512591F99D0C9EFE888D8E1109F4440E2212AD773F4CEC8CA25229B340B4FA95C04C1E744DFA3BAD7C1AE0C4189709B2EFA5FB0D138507C40D812A9CDAE6F93F81208740A5D1130E80EC840C7AACFC4446878F26757F292B280DD489AE3D5DF9AC81F49B4D9B1104D8D70D893D5C151628ACA071C43103A7BAD0C4A04FEDA0F021EA725F573DF9F26F72DD7FF2F26E5BA32D873B8502EBBA99949BDBC0580DDD30EDDF3255DF744DB37ABBCED6A1F786B720F82CDD33C5006C2189D4CD56B380281FD8AAE0818E02FC67254598FF204D269C0A04FE03AAB5355F2E91D568F3DB6AF901A4FB994F16CF67B5322EC671B7EA32C84CB96A40E846957128B0702A3D0250113E80F6B2D10982408011308045A4308984020D01A42C0040281D6D01501435EDDDFB1C2190D8F5414B5F89934657DE35E7C4BBE31867AB0B6E0F57B67761DA7BB212B1CF89C1E2C5A2F24D79AC02B57965BE1B3D22B535D1D0D0B54065EC8FF99FD86C31DFE39B41565383E3E24002791F84478EFD25E2C570F55FC46DD3830E21C78B7AEE56DA86B13D7F134A6AFF2FE4C9F69BA6FBC48CBE77532B807ACB6F691F60D3C1DB2FEC6501370BD20C7F4A4F375EA8A80E165E6985B3125E3A7B2D20A577B1CED7028C3CCCB3B8570B9A7F318384C86E55638D1E1A98B87EB21BA87C98A931A8E7077EB799EC15D9FACFEC7EA37C20610521EF3C4406402C397D9AA7FA19EC559EE382B4DCB989F118AF8ABB8D97987E82159397E2E4C14262FCE76A7AA0E060ADEB9BCCCED71D5437D3F12DD07880FAF107D08BAA52AFB1BA2E5D7AC1482781EFF50E5F01B7E3A98C7B1342D11FFA6E879FC81168B1F4CBC7344D334D1CA334C72CCE184279CABBA67E877E73D7C24DCE1242BFC76B6AA7D58B9F05F42485E2F1A793DCB6EB5073A67E95E7F66ADF89ADE77A7F8CAE7CDE2D35EF52D16B80B45F3B3FA6D8FFA79A9FA8236F8F858AB3E84AED5A2614542E3115979EBC51368FB99DAE06E133EC6F84CE27516A6FB543EE5DDAF7EE5DD583F5099F0FB4D2A83FAF07D3A4FE54333AE0D67AA3CEAA3FF71BE44E0CE131F70DCFC17F19BBE636C9D92F42B42196FEECEA12B0226078E63080D26301D0A43E9681CD060F2D5FA4E07D329080C0620930D47B4DBF51B9D85F4DFA16716EA3A9D8987F012DD8F831E314078DABAF7ED6C953B53CF1E65C52EC24DC20C1C3C87195878DE228C98204C3C04018315FF1584D11F8BCE47D51E06E22C3DBB5DFF17A9DC59AA679D68A75D085F26C5545D6387C3641FB2C2E786A4E23B45274E864B55960B1F84C2FFA88D2F177FE1E306D5E382E978F1C0F4FF04D54DF80242607AC2479C089F138F118C084E26F1917A163E231C565B392997E95AFACCB68AFB965B31A91E13DF17AA7DF7A84D9BC53784CB19E2117C9B9FD0FE94CADC263A59B896A84FA62634CEAC28CF273AF78FA8DFD231F67A5D836708E1A755D65CF5CD59A283B28F4EF8FC723D672A9F7EBA457C856F3F155FCF557F2D56D9087BC6E3E956C6A2A5FD7AAC8580191398A87426136F97AEB1BA3250D86DF0A64406833BC8D1B1309923CD34FD9DAE67A726CFB053A223E96C3A9281344F751DA8F2886F62856602AE57997FA6CFFE3B8389C17FB67E4F5F8446990445B29D6565E50D91EE19EC9EC5C75819BCF95B56064B328810866BD4A635A297B7543EA5E747AC10BCF3F4F9F7F57FB6E8443832394FD333EE74481D086A7FA71203776642934789EF157D0F897FEF120F37E93EE7E39015C26CABF8ED3BC223D54FEEC9EC6D751ED32F3B93678E503DE97DFCBE56BFAD56997BC5D3B9BA7FAF9541AB269E6F57DD7BC59F6354C641EA2BC6102118AF4E683C382BCF69E4DAF48427E918A3CD4B553602638EEA7E507D03BDEE316E491953448B97EFE12507891604108B1D0B0C82CAC71B7C4720F9E2B6CD46F76B67D12501C3A0BD5A9FAFD2FFAA33F33F597FB8C5C686F19C93FFBAE2DAF7F4D7841B92CFE9CAF31F7DD439ACBFB1E0BB3D7EFF56CDF5AB6DECF85AF21981F097C9F7261D48DD7D4C5E8E30FE7ADE87F5E7F87E43993EC9BF6A652807B829F9FCCC18CA73B0532298D6758569DA8E55C96704FAC72A9ECFC7CDB7AD8CD8E7C5838CDDD5B62FBFBE967DEFD5AFFB1D5D123081401558D9BF60DD4A45C191077D0ABB8789F4A26697336CC50E6520D05501936AFD51F4B175662B8A84273D426A69188F8580D40D23560C942ACC54B9EC44FA0917006CA1D1B570C4411F7353F63BFA0C563E56E4B158BEFA05DB7E8E3FE8855E0A6B493FA8B34EA1D3814F37563C836E06DD875BD2383EB87EEA47D61CDE51376E7ADD9BA25F8BCD969AEB6E45E2D87C98E8E0388A80BCD17A83A30F47A43B6D00D015018362CD95580C2294859C6F39D3A2F8625272C6F6E4526E69602BC9807CB5EE45078082ED59FD31E999E89CE75116BEDB8A36A3CC442BCF391ADD0226C545BA1FBD024A5814792836BFAFDF86AC3807736667D270544B33E8715EE7CCFCCF565A82B688F65FD63556A8F92AEF9BBAEE161D2C0DE8798EB6D23A708768A4EC0D6AEBED7ACEAD206CD3518E628541B81C2E5E50665BD6127876A6555BA736AA7F36AACDCEAB53C513168625E23F93F18FC4A783D5CE1FAB7F2EB652218ED5ED5EF5875B06190708D47BD466AEEFD27F1F3727889FEBF51DA1825EEB26ABB62CC19733C43B746C3E1EE7256DDF2EFAEE513B5CE17A8B9516BEE3C5BB33C59F93542651F0EC78186723568C9793F479B1955646CA60CC7669D7362E7445C0C07434E70C644CAF4C263A848988A20E931C03920944E7D079081506289DB44AF7329977EBF3CFACB488805DFA633565C0B142A1FF6070BA39917AC98AC7047E5ECF33B0DC94CCC4C20CB95974E6293AE78AAE27F4D9741FDF1FD5B527441BE5BCC24A8BCE132ACFAD3AD0C644FFA9AE33C958D519B4A9A5069EA0B05CABFF3F50FB3185CEB489B796CCD13375D62926DCF7F4DB66FD8165EAA75F11CDF4C31495B5453CDFA4FA2DA101EB1042E628DDFB592B22EFF7AA3C7FCDEE1CF1D0C702E386BE454F81705B20BE4DD5FD5596A5C3C4FF07C46F1F8F2E28A161BE78CD7333541F7D3ECD4A0BDF59A26793EE3D5E7FD35526472B04E99FA8BEA5E2895B19DDFA35E9D11501C3C0606032584FD7FFF46802F3D9C138D353EBC1DEE45E0612039276793E15061A9DCC24F001C3E062B2B02A2358487F897041907DD88A49CD8ACAA060A2B093A0F3114AAC320C9C8354DF9A84162C38A47B602063B5C032C340F29C360892C7742FF5CDD3E7D4A2935A07A867A99516A03DA2F92CB5C157BDA7D55E78E80A4BE83AC326DE5AE296BC3AEBD4B6E4FA6EF10F813362C5D188FA5247BA3D2ADB75194F8BEF07AB0C263E7DC842C26EC0AD664758E974E8BB43B7B838E0293B3B04E993E2C39015E3A3CEB284209965A3C72347DAD7891F9BF55B6A81341B6DE1A3FFF3DCC96BC44B8FA47FC64A6BE166B52FB532D2BE4D36C9D1150103733F5871BD29C1B59F9D5D6BDF2B19361A7834F50CD203AD3CCB7B394C8634C993F3C627A5E3B68A6B805DD115FA8CF0B8AC8286E1ECFBF535B4F6B20EDCAAFFA7895668B932F9DD79F1EFC9B589B696F4A233EF8F5BACDAB2E716C395C9B59BAD7F54E99BBC6E1C1E115C77E87BAA0369B22C81E1ECFB37AD1E4EC3B0355BF8F2FEFE64CD7D37D880A02B02E6A582E75A4957B9DDC9E734F1549D72B79FB71CBC54B8CFDA455BD692970A1C573AED2732E8E8BA804149C7F6972D27B4B2BD64DBF8A8BD38A4D68DF1C6A934C542A5960426694A6F1E5794029DCC5C3DC3199F5593DDD690EDEBA73316AB5453AC91A3CE7A52672D01E8886827C2071F9E3536B1A0EFF10BA98A4FF25823DA55D77F2C12F405BBB0F15A75EAE2AC7AD1371E8C25A66D52A02B0206C516E7F3BA1819CEF52801D1DCB36A9FAD7BD90A33C83D3E08656C5D9C0A676857024FD3335837526B02E774CEFF77A9EC53444B95E504C523930B3D087A16B748716EF7781494D108010621931001B9C8CAB8A2DC7A8607EEB1AA0FBA980C0FA92DD0985A2CB07A2CB06AAB14C7418E716FB5D1B15508ABFFD2F72DAA03E1C3645B22DAE1FF49E21BFFD7A91EE7498AD9E2034736745BEF170F36882FA4073D32E1E146DD3755FD407BD1650CD968EBD65CB5E35ED5FD46D19AD2E0714EF7A8AE2ACB1916C15E561DEEDDAC32BCAD23566DD5412FF44E2BFA7B487CA37DA7AA7F9E52F9278AF64345F7B0157D5D3566EB62DA16ABDD08CF6BADD93CDF597445C030B83DCEA22A460666A33FE0087386BE732F0387C1E8DBF72A4B89C7A9B073604230A01ED13DFCE6D60426278261B5E8E1DCCEC0728B4D6E39395EF73021F0CDF9A49EC7FAC0CAE8968457AA2E2C100C1206D50AD19B5BCF5865B7AACD0883EFE8F74DFAEE160B26E88815CAD62AAB1493EFC184371E5BE5E111CB543FB45DA732DCCC8E1063926D131D6F545F384FD25D173C3959ED5B20FA88CB3A4EBC4288B9D2135E30E9083DF8B895819D4B44D3B6A4CF106EE88FCEB35219FB504683C72F3D6DA5E528B59C1D61FD5975BC6FD3B6D659753C8C64486DE23B827C85EE3B4CCF789C915BDD58A87C7CE763B62EA6CD85F0222B4348261DBA22601860A915218D9181C1309B09C624C584E899F8110E697C10A88B53F198241F249855B16EF800A65E3A9781F2B09E4F2D36B9E5042C13DDDCC70E8C158FC1985A129818EC32B6EA598F2B32ABB69E2D509BF336ECC9BE3759A5B68887796C15F7220C18F02888D75B699D9B221EE18F8340BE5BF7BAA5039E3061D726F4431366F19BC527E7C12356EAB0521ED24694CBF8D6CC114FA7DBBE7D46DFF0BE28374F3F289A521A3C7E895D8FBB0BA4963356FE11EBCFAAF37CD6D63AAB0ED8AD362DD7B3FEA6893345930BDC9956C645A53AAC7CCCD6C5B42D569BDD4A3629D11501C3CAB5B2E27A5D8C4C7A76CEB5FB63B594E4D68414B75A69B1717C37FB5F85AF5B7FA8B39EA5585DF3FD36FDA5C8AD147F5753E665D63F9AE2AA52DD4F9D95A88A874D60878243243BBD2AC5B25BCE386EAD4CAE5759CE866D6C569DBAB6BA55871D888FAFBCFFFBED73908FD9AA98B6AFD800A02B02261070B063E08577BB6B7E6FDB721698408480097411BB2D3010982C02A6570A4B34F8E850EEAF797EA2534C36992E7B015A51F4A1F0ACA2370FF6ABAB2B35770F59B5191A7D05C78C13AD9D004BEAE798F793092ACF4DE5E855DEAC6B28DF3D6B5B15BFB96F867E6F3305A763ACE95441DBFDD0597445C030A9C8CA86628EB32D26654F7F89920F4519263C5CF8E92C06D423FAF334824CB03759A9DC733329CFBBA9924E4619C7599A4981728D09F2B0AEB9D5C74DA6AE14F5F4951EDC861295C1ECEF28FAED8CDE3C20111ADDE48802D1533AF61BEC07FD699ACF3C8DE60AD1BE43B4DFA032A10BA1CA2B7817A9ECC5095D3CE3A66CCA7D83DAED26D3DDE20FA6ED341526FC46A17B8ACA7FAD9E413F849275A39EFB6FF1EC58F1ADAABC4DEA5314CD2848AF152D0BD41EF43A08E33FB042099EBEB4CED36F4E579D1758EF149C6EEAF634950FA81F3CE873C8AAFBDF9F83D708778E6ACBAC747DA8E2531A88DAD40F5D72DE9C507445C0306031EF213098B869FA4B146F08142C31740A838C4985393835A97AEC0B1DC820C44CCA6E05272B7603081384879B52CF56390C3C262B677F266E6AE6660031A9DD4CEBC16DF87578BAC73915F4E60189A9C9D11367837E83FDE08BA7F9CCD3688211950DCD0C5AAC351E458E658201CDE4392FA1D9AD6E6E324D6984074C88A3D537E7DAE8349308407FB7F68949BD64E7231811B3EBDBAD4C6309DFEEA829EF00F1EC34B56F9DED8B9D6A736E4D61AC9CACB25824DC9CDC9482D34DDD699A4AB36A9379DEFF7758E91E70648F76E581A84DFDF0731B507445C030D19840AC3CAC0C69FA4B26BE9B643906FD92FE18506E5265AB7A82959E9B66A55977C44A5325ABA19B5211546FD37DB354E68F6DB4C994FBDC749906B7F18CA77B9C57416F6A9A65255C6EA5C9D1E973F413EC97A6F9CCD3689A689EA3EB94E799F1A68BA79E76145E1C9ED005FD6E327D5542A3B7D14DCD4C9045C973D0FBEBAA0F4B9D0764DE67A38352FDF3AE86F29EB7D2F40FBD08AC8DBA0F818D93220B020263B19566F2A9AAF7132AE3425DEB9582D35D103C4D258287856A87ED6B324FFBDF9FF3B1C86ED5DD16AADA856065C17AA08F7E18587445C030B818A8642EA313AB82BD6EB3F161D8469B2A53D3E42A6B469D993B351DB3EBA832FBA6A6D92693E38B0DF60355266B7065F63D37FB7364AB33653781E73E6C138BDC4FE5533DEE679C7C36F9BE32FBBD57AA4E4F53D984AAFEAFE3750E76D608B13C1015D4B95F0C1CBA226046AC5815F75A20301878DC029D1130BE25ED8255A20E1E30883E244FDBD90B53556FAF948F81C040A12B0206FDC1445825389B73CE46E1863E00ADFD97ADD92A814216AB950731A287F16040B75278C020FFAFB142102E16AD6C83532B03B4FBFB9BA00F852B4A478E159EF211A51EE7F11FAA1CCA3DD9AA030A0381498BAE081814AC136195F07484E870B00010C3D2CB2A91BFC40A05ABE7854178A401831E20499958A650622E14DD6E65385C34B875CB2D2428FF503AA28FC1FA7384DA437DB985238E8A8181405704CC445A25804FD05E5689676CDF3495EC62D8B5201438D2A4018304E1B15B42A85CA47AB1FAA45606E84B0306BDDC9DFA7B979E79DECA17B4B985833A5E6BFDC55005029D4757040C26BF89B64AE496833AAB845B92C6F212AB4B1B7EABB232A4C71E84143E389FB7D8A904061C5D1130BF4860B786B76A0897C0C02304CCFE4104F3057E211002261008B48610308140A0358480090402AD21044C2010680D21600281406B08011308045A4308984020D01A42C0040281D61002261008B48610308140A0358480090402AD21044C2010680D21600281406B08011308045A4308984020D01A42C0040281D6D01501F3820502813630657F56DE1501B35F99100804DA4157044C20109818F04A1FDE31C66B7536DA7E4608984060B0C0BBB578EDCEADD60184800904060BBCC574A9750421600281406B080113080C1678DFD6E7AC2308011308045A4308984020D01A42C0040281D61002261008B48610308140A0358480090402AD21044C2010680D21600281406B08011308045A4308984020D01A42C0040281D61002261008B48610308140A0358480090402ADE1FF01DE7DB6E662B1A4700000000049454E44AE426082)਀䜀伀 
SET IDENTITY_INSERT [base].[global_settings_groups] ON ਀ 
INSERT [base].[global_settings_groups] ([setting_group_id], [setting_group_name], [setting_group_description], [language_id], [is_register_code_applied], [register_code], [auto_gen_doc_id_length], [use_auto_gen_doc_id_on_null], [doc_id_format], [doc_id_last_integer], [date_style], [culture_code], [doc_autogen_max_tries], [default_filter_group_id], [default_form_id], [default_doc_free_text_name_id], [default_tag_tree_id], [default_tag_browsing_tree_id], [duplicate_management], [created_last_minutes], [enforced_retention], [file_read_log], [file_delete_log], [store_plain_text_content], [store_thumbnails], [default_doc_date_name_id], [booking_in_time_box], [never_delete_files]) VALUES (1, N'Master', NULL, N'EN', N'No', N'XQ', 4, N'Yes', N'Alpha', 1000, 23, N'en-GB     ', 40, 10006, 21, 1, 2, 1, N'On', 60, N'Off', N'Off', N'On ', N'On ', N'On ', 6, 4320, N'Off')਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 伀一  
਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀Ⰰ 嬀甀渀椀琀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀瀀✀Ⰰ 一✀一甀洀戀攀爀 漀昀 瀀愀最攀猀✀Ⰰ ㄀⤀ 
INSERT [base].[units_of_measure] ([unit_id], [unit], [descr], [list_position]) VALUES (2, N'Words', N'Number of words', 4)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀Ⰰ 嬀甀渀椀琀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㠀Ⰰ 一✀挀栀愀爀✀Ⰰ 一✀䌀栀愀爀愀挀琀攀爀猀✀Ⰰ 一唀䰀䰀⤀ 
INSERT [base].[units_of_measure] ([unit_id], [unit], [descr], [list_position]) VALUES (12, N'm', N'Months', NULL)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀Ⰰ 嬀甀渀椀琀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㌀Ⰰ 一✀礀✀Ⰰ 一✀夀攀愀爀猀✀Ⰰ 一唀䰀䰀⤀ 
INSERT [base].[units_of_measure] ([unit_id], [unit], [descr], [list_position]) VALUES (14, N'%', N'Percent', NULL)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀Ⰰ 嬀甀渀椀琀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㔀Ⰰ 一✀欀最✀Ⰰ 一✀䬀椀氀漀最爀愀洀✀Ⰰ ㄀⤀ 
SET IDENTITY_INSERT [base].[units_of_measure] OFF਀䜀伀 
SET IDENTITY_INSERT [doc_attr].[doc_date_field_names] ON ਀ 
INSERT [doc_attr].[doc_date_field_names] ([doc_date_name_id], [mnem], [attr_name], [descr]) VALUES (6, N'Review', N'Next Review Date', NULL)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀吀椀琀氀攀✀Ⰰ 一✀吀椀琀氀攀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 琀椀琀氀攀✀⤀ 
INSERT [doc_attr].[doc_free_text_field_names] ([doc_free_text_name_id], [mnem], [attr_name], [descr]) VALUES (3, N'Descr', N'Description', N'Document description')਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㐀Ⰰ 一✀䄀戀猀✀Ⰰ 一✀䄀戀猀琀爀愀挀琀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 愀戀猀琀爀愀挀琀✀⤀ 
INSERT [doc_attr].[doc_free_text_field_names] ([doc_free_text_name_id], [mnem], [attr_name], [descr]) VALUES (8, N'Rel', N'Release', N'Document revision or version')਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开椀渀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀甀渀椀琀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀刀攀瘀䤀渀琀✀Ⰰ 一✀刀攀瘀椀攀眀 䤀渀琀攀爀瘀愀氀✀Ⰰ 一✀✀Ⰰ ㄀㌀⤀ 
SET IDENTITY_INSERT [doc_attr].[doc_integer_field_names] OFF਀䜀伀 
SET IDENTITY_INSERT [doc_attr].[doc_radio_button_attributes] ON ਀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10010, 20226, N'RES', N'Reserved', N'Document ID is reserved prior to a file being created or registered.', 1)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㄀㄀Ⰰ ㈀　㈀㈀㘀Ⰰ 一✀倀唀䈀✀Ⰰ 一✀倀甀戀氀椀猀栀攀搀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 椀猀 爀攀氀攀愀猀攀搀 愀渀搀 瀀甀戀氀椀猀栀攀搀⸀✀Ⰰ ㈀⤀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10012, 20226, N'SUPD', N'Superseded Document', N'Document has been superseded by another document', 4)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㄀㌀Ⰰ ㈀　㈀㈀㘀Ⰰ 一✀䌀䄀一✀Ⰰ 一✀䌀愀渀挀攀氀氀攀搀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 栀愀猀 戀攀攀渀 挀愀渀挀攀氀氀攀搀 昀爀漀洀 甀猀攀 愀渀搀 椀猀 渀漀琀 猀甀瀀攀爀猀攀搀攀搀 戀礀 愀渀漀琀栀攀爀 搀漀挀甀洀攀渀琀⸀✀Ⰰ ㌀⤀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10014, 20226, N'NP', N'Not Published', N'Document ID was registered and created but is not published.', 5)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㌀㠀Ⰰ 㔀　㈀㤀㘀Ⰰ 一✀倀刀伀䌀✀Ⰰ 一✀倀爀漀挀攀搀甀爀攀✀Ⰰ 一✀䄀 瀀爀漀挀攀搀甀爀攀 琀礀瀀椀挀愀氀氀礀 搀攀昀椀渀攀猀 愀挀琀椀漀渀猀 眀栀椀挀栀 洀甀猀琀 戀攀 昀漀氀氀漀眀攀搀⸀✀Ⰰ ㄀⤀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10039, 50296, N'STD', N'Standard', N'A standard typically defines outcomes which must be achieved, as opposed to actions which must be followed.', 2)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㐀　Ⰰ 㔀　㈀㤀㘀Ⰰ 一✀倀伀䰀✀Ⰰ 一✀倀漀氀椀挀礀✀Ⰰ 一✀䄀 瀀漀氀椀挀礀 琀礀瀀椀挀愀氀氀礀 搀攀昀椀渀攀猀 漀瘀攀爀愀爀挀栀椀渀最 最漀瘀攀爀渀椀渀最 爀甀氀攀猀⸀✀Ⰰ ㌀⤀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10041, 50296, N'WI', N'Work Instruction', N'A work instruction is typically a task-specific procedure.', 4)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㐀㈀Ⰰ 㔀　㈀㤀㘀Ⰰ 一✀䘀刀䴀✀Ⰰ 一✀䘀漀爀洀✀Ⰰ 一✀䄀 昀漀爀洀 椀猀 琀礀瀀椀挀愀氀氀礀 甀猀攀搀 琀漀 琀爀愀渀猀昀攀爀 搀愀琀愀⸀✀Ⰰ 㔀⤀ 
SET IDENTITY_INSERT [doc_attr].[doc_radio_button_attributes] OFF਀䜀伀 
SET IDENTITY_INSERT [doc_attr].[doc_radio_button_list_names] ON ਀ 
INSERT [doc_attr].[doc_radio_button_list_names] ([doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position], [restricted]) VALUES (20226, N'PubStat   ', N'Publication Status', N'The publication status of the document ID.  e.g.  Reserved, Published etc.', 1, 1)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀Ⰰ 嬀爀攀猀琀爀椀挀琀攀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㔀　㈀㤀㘀Ⰰ 一✀䐀漀挀吀礀瀀攀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 吀礀瀀攀✀Ⰰ 一✀吀栀攀 琀礀瀀攀 漀昀 搀漀挀甀洀攀渀琀⸀✀Ⰰ ㈀Ⰰ 一唀䰀䰀⤀ 
SET IDENTITY_INSERT [doc_attr].[doc_radio_button_list_names] OFF਀䜀伀 
INSERT [doc_attr].[doc_radiob_attr_fgroup_links] ([doc_radiob_attr_id], [filter_group_id]) VALUES (10011, 10006)਀䜀伀 
SET IDENTITY_INSERT [file_attr].[file_date_field_names] ON ਀ 
INSERT [file_attr].[file_date_field_names] ([file_date_name_id], [mnem], [attr_name], [descr]) VALUES (1, N'DOI', N'Date of Issue', N'')਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀崀 ⠀嬀昀椀氀攀开椀搀崀Ⰰ 嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀Ⰰ 嬀搀愀琀攀开瘀愀氀甀攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　Ⰰ ㄀Ⰰ 䌀䄀匀吀⠀一✀㈀　㈀㘀ⴀ　㌀ⴀ　㠀吀　　㨀　　㨀　　⸀　　　　　　　✀ 䄀匀 䐀愀琀攀吀椀洀攀㈀⤀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀刀䔀䰀✀Ⰰ 一✀刀攀氀攀愀猀攀 一甀洀戀攀爀✀Ⰰ 一✀✀⤀ 
INSERT [file_attr].[file_free_text_field_names] ([file_free_text_name_id], [mnem], [attr_name], [descr]) VALUES (3, N'Author', N'Author', N'')਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　㐀Ⰰ 一✀䌀栀愀渀最攀猀✀Ⰰ 一✀䌀栀愀渀最攀 一漀琀攀猀✀Ⰰ 一✀✀⤀ 
SET IDENTITY_INSERT [file_attr].[file_free_text_field_names] OFF਀䜀伀 
INSERT [file_attr].[file_free_text_values] ([file_id], [file_free_text_name_id], [text_value]) VALUES (1000, 1, N'A')਀䜀伀 
SET IDENTITY_INSERT [file_attr].[file_radio_button_attributes] ON ਀ 
INSERT [file_attr].[file_radio_button_attributes] ([file_radiob_attr_id], [file_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (1, 3, N'SRC', N'Source File', N'A source file such as .doc', 1)਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀Ⰰ ㌀Ⰰ 一✀䐀䤀匀吀✀Ⰰ 一✀䐀椀猀琀爀椀戀甀琀椀漀渀 䘀椀氀攀✀Ⰰ 一✀䄀 搀椀猀琀爀椀戀甀琀椀漀渀 昀椀氀攀 猀甀挀栀 愀猀 ⸀瀀搀昀✀Ⰰ ㈀⤀ 
INSERT [file_attr].[file_radio_button_attributes] ([file_radiob_attr_id], [file_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (4, 2, N'CUR', N'Current', NULL, NULL)਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㔀Ⰰ ㈀Ⰰ 一✀匀唀倀✀Ⰰ 一✀匀甀瀀攀爀猀攀搀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
SET IDENTITY_INSERT [file_attr].[file_radio_button_attributes] OFF਀䜀伀 
INSERT [file_attr].[file_radio_button_links] ([file_id], [file_radiob_attr_id], [file_radiob_list_id]) VALUES (1000, 4, 2)਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀椀氀攀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　Ⰰ ㈀Ⰰ ㌀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀Ⰰ 嬀爀攀猀琀爀椀挀琀攀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀Ⰰ 一✀䘀匀吀䄀吀✀Ⰰ 一✀䘀椀氀攀 匀琀愀琀甀猀✀Ⰰ 一✀圀栀攀琀栀攀爀 琀栀攀 昀椀氀攀 椀猀 瀀甀戀氀椀猀栀攀搀 漀爀 愀渀漀琀栀攀爀 猀琀愀琀甀猀✀Ⰰ ㄀Ⰰ 　⤀ 
INSERT [file_attr].[file_radio_button_list_names] ([file_radiob_list_id], [mnem], [attr_name], [descr], [list_position], [restricted]) VALUES (3, N'FORMAT', N'File Format', N'Whether the file is a source file such as .doc or is a distribution format such as .pdf', 3, NULL)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀Ⰰ ㄀　　　㘀⤀ 
INSERT [file_attr].[file_radiob_attr_fgroup_links] ([file_radiob_attr_id], [filter_group_id]) VALUES (4, 10006)਀䜀伀 
SET IDENTITY_INSERT [forms].[filter_groups] ON ਀ 
INSERT [forms].[filter_groups] ([filter_group_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10006, N'Published', N'Published Documents', N'Filters files which are current latest revision and document status is published.', 1)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀渀琀猀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㐀　Ⰰ 一✀夀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀　Ⰰ 一✀圀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀　Ⰰ 一✀圀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㔀Ⰰ 一✀嘀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ 㔀Ⰰ 一✀伀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_booking_status_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 5, N'O', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_booking_user_id_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (21, NULL, N'P', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀　Ⰰ 一✀倀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ ㈀　Ⰰ 一✀儀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_booking_usernm_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 20, N'Q', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_created_by_id_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 10, N'O', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_created_by_nm_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 20, N'N', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_created_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 15, N'N', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_date_field_links] ([form_id], [doc_date_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 6, NULL, 15, N'N', 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 (21, 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 (21, 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 (22, 3, NULL, 50, N'F', 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, 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 (33, 8, NULL, 10, N'C', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_function_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (21, 2, NULL, 20, N'N', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㈀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一✀一✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㌀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一✀伀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_function_list_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 4, NULL, 20, N'P', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_lock_status_links] ([form_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3], [lock_status_default]) VALUES (33, NULL, 8, N'K', 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 (21, 20226, NULL, 25, N'L', N'', N'', N'', 10011)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ 㔀　㈀㤀㘀Ⰰ 一唀䰀䰀Ⰰ ㈀㔀Ⰰ 一✀䴀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
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, 20226, NULL, 25, N'L', 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, 20226, NULL, 25, N'L', NULL, NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㔀　㈀㤀㘀Ⰰ 一唀䰀䰀Ⰰ ㈀㔀Ⰰ 一✀䴀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 一唀䰀䰀Ⰰ ㄀　Ⰰ 一✀䰀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㈀Ⰰ 一唀䰀䰀Ⰰ ㄀　Ⰰ 一✀䠀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_user_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 3, NULL, 10, N'H', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㐀Ⰰ 一唀䰀䰀Ⰰ ㄀　Ⰰ 一✀䠀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㔀Ⰰ 一✀娀娀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀　Ⰰ 一✀夀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀㔀Ⰰ 一✀夀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀㔀Ⰰ 一✀夀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ ㄀Ⰰ 一唀䰀䰀Ⰰ 㔀　Ⰰ 一✀䴀✀Ⰰ 一✀✀Ⰰ 一✀✀Ⰰ 一✀✀⤀ 
INSERT [forms].[form_file_date_field_links] ([form_id], [file_date_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 1, NULL, 50, N'M', N'', N'', N'')਀䜀伀 
INSERT [forms].[form_file_free_text_links] ([form_id], [file_free_text_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (21, 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, 1, NULL, 8, N'B', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀　　　㐀Ⰰ 一唀䰀䰀Ⰰ 㔀　Ⰰ 一✀娀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ 一唀䰀䰀Ⰰ ㄀　　Ⰰ 一✀䐀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_file_name_links] ([form_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (22, NULL, 100, N'D', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 一唀䰀䰀Ⰰ ㄀　　Ⰰ 一✀䐀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ ㈀Ⰰ 一唀䰀䰀Ⰰ ㄀㔀Ⰰ 一✀䜀✀Ⰰ 一✀✀Ⰰ 一✀✀Ⰰ 一✀✀Ⰰ 一唀䰀䰀⤀ 
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, 3, NULL, 20, N'H', N'', N'', N'', 2)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㈀Ⰰ ㈀Ⰰ 一唀䰀䰀Ⰰ ㄀㔀Ⰰ 一✀䜀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
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, 3, NULL, 20, N'H', 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, 3, NULL, 20, N'H', NULL, NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_retention_date_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 50, N'N', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_size_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (21, 10, N'K', N'', N'', N'')਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀　Ⰰ 一✀䬀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一✀䬀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀㠀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_file_user_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 19, NULL, 20, NULL, NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㈀㄀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀漀爀洀开最爀漀甀瀀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀昀漀爀洀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ 一唀䰀䰀Ⰰ 一✀䈀愀猀攀✀Ⰰ 一✀䈀愀猀攀 䘀漀爀洀✀Ⰰ 一✀✀Ⰰ ㄀⤀ 
INSERT [forms].[form_identifier_names] ([form_id], [form_group_id], [mnem], [form_name], [descr], [list_position]) VALUES (22, NULL, N'Short', N'Short Form', N'', 2)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀漀爀洀开最爀漀甀瀀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀昀漀爀洀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 一唀䰀䰀Ⰰ 一✀䰀漀渀最✀Ⰰ 一✀䰀漀渀最 䘀漀爀洀✀Ⰰ 一✀✀Ⰰ ㌀⤀ 
SET IDENTITY_INSERT [forms].[form_identifier_names] OFF਀䜀伀 
INSERT [messaging].[language_list] ([language_id], [language_name_english], [language_name_language]) VALUES (N'EN', N'English', N'English')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀氀愀渀最甀愀最攀开氀椀猀琀崀 ⠀嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开渀愀洀攀开攀渀最氀椀猀栀崀Ⰰ 嬀氀愀渀最甀愀最攀开渀愀洀攀开氀愀渀最甀愀最攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀刀✀Ⰰ 一✀䘀爀攀渀挀栀✀Ⰰ 一✀䰀攀 昀爀愀渀愀椀猀✀⤀ 
INSERT [messaging].[language_list] ([language_id], [language_name_english], [language_name_language]) VALUES (N'ZH', N'Chinese', N'中文')਀䜀伀 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NotUnique', N'EN', N'Data was not unique.  A record with the same data already exists.਀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䄀氀爀攀愀搀礀 䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TooLong10', N'EN', N'String was at least 10 characters and may have been truncated.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀漀漀䰀漀渀最㔀　✀Ⰰ 一✀䔀一✀Ⰰ 一✀匀琀爀椀渀最 眀愀猀 愀琀 氀攀愀猀琀 㔀　 挀栀愀爀愀挀琀攀爀猀 愀渀搀 洀愀礀 栀愀瘀攀 戀攀攀渀 琀爀甀渀挀愀琀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'Unspecified', N'EN', N'An unspecified error occurred.਀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NotINT', N'EN', N'Incorrect data type supplied.  Integer expected.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀漀漀䰀漀渀最䴀愀砀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀琀爀椀渀最 眀愀猀 琀漀漀 氀漀渀最⸀  ✀Ⰰ 一✀䴀愀砀椀洀甀洀 氀攀渀最琀栀 昀漀爀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀✀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoData', N'EN', N'No data was supplied. ', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀渀 攀爀爀漀爀 漀挀挀甀爀攀搀 甀瀀漀渀 椀渀猀攀爀琀椀渀最 琀栀攀 爀攀挀漀爀搀⸀  吀爀愀渀猀愀挀琀椀漀渀 爀漀氀氀攀搀 戀愀挀欀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀猀攀爀琀 䔀爀爀漀爀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'Success', N'EN', N'Transaction successful.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 昀愀椀氀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NotExist', N'EN', N'The supplied record does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀伀渀攀 漀爀 洀漀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 攀砀椀猀琀 眀栀椀挀栀 洀甀猀琀 戀攀 搀攀氀攀琀攀搀 戀攀昀漀爀攀 琀栀椀猀 爀攀挀漀爀搀 挀愀渀 戀攀 搀攀氀攀琀攀搀⸀✀Ⰰ 一✀䘀氀愀最猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀漀渀猀琀爀愀椀渀琀⸀✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'InvalidFilename', N'EN', N'The filename was not a valid Windows filename.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀渀愀洀攀吀漀漀䰀漀渀最✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀椀氀攀渀愀洀攀 攀砀挀攀攀搀攀搀 琀栀攀 洀愀砀椀洀甀洀 愀氀氀漀眀愀戀氀攀 氀攀渀最琀栀 漀昀 ㈀㔀㔀 挀栀愀爀愀挀琀攀爀猀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TGNotExist', N'EN', N'The transaction 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'DocNotUnique', N'EN', N'The document ID was not unique.', NULL, N'Not Unique')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀娀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FileIDNotExist', N'EN', N'Either the file ID does not exist or the connected user does not have permission to access the file.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 搀漀挀甀洀攀渀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFileID', N'EN', N'No file ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀䤀䐀䰀漀挀欀攀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 栀愀猀 戀攀攀渀 氀漀挀欀攀搀 愀最愀椀渀猀琀 愀氀琀攀爀愀琀椀漀渀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䰀漀挀欀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoTGroup', N'EN', N'No transaction 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'FGNotExist', N'EN', N'The filter 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'AttrNotExist', N'EN', N'The attribute ID and attribute list ID pair does not exist. ', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 渀愀洀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoAttrListID', N'EN', N'No attribute list 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'NoAttrID', N'EN', N'No attribute ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀琀琀爀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 愀琀琀爀椀戀甀琀攀 挀氀愀猀猀 栀愀猀 愀氀爀攀愀搀礀 戀攀攀渀 愀猀猀椀最渀攀搀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'MaxDocTries', N'EN', N'The maximum number of attempts at creating a unique random document ID has been reached.  Extend the auto generated document ID length or create a new document ID prefix.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀洀䜀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀漀爀洀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FormNotExist', N'EN', N'The form 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'FormGroupNotOwned', N'EN', N'The form group is not owned by the user.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 甀猀攀爀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoAttrName', N'EN', N'No attribute name was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀愀琀攀䘀漀爀洀愀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀愀琀攀 昀漀爀洀愀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'AttrLinked', N'EN', N'The attribute is already linked to an object and cannot be re-assgigned to a different list.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀甀瀀氀椀挀愀琀攀䘀椀氀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 搀甀瀀氀椀挀愀琀攀 昀椀氀攀 攀砀椀猀琀猀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䐀甀瀀氀椀挀愀琀攀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoDateNameID', N'EN', N'No date 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'TextIDNotExist', 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'IsAuthoriser', N'EN', N'The user ID is assigned a role as an authorizer.  Changes to authorizer permissions can only be made by a database administrator.', NULL, N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀椀搀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 甀猀攀爀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FrmMandInvalid', N'EN', N'The form field mandatory flag supplied was invalid.  Valid options are ''Yes'', ''No'' or NULL.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀愀搀椀漀䈀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoDocGroupPermission', N'EN', N'Either the document group does not exist or the user does not have permission for the document group', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀洀伀戀樀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 愀琀琀爀椀戀甀琀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NameNotUnique', N'EN', N'The name field must be unique.  A duplicate name already exists.', NULL, N'Already Exists')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀䔀一✀Ⰰ 一✀唀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFormGroupID', N'EN', N'No form 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'InvalidDocId', N'EN', N'The document ID is invalid due to non-printable characters or other reason.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀攀挀甀爀椀琀礀 椀搀攀渀琀椀昀椀攀爀 ⠀匀䤀䐀⤀ 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 挀漀甀氀搀 渀漀琀 戀攀 爀攀猀漀氀瘀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DocGrpLinkExists', N'EN', N'The document group cannot be deleted because a document link exists.', NULL, N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀嘀椀攀眀倀攀爀洀䔀砀椀猀琀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀 戀攀挀愀甀猀攀 愀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 攀砀椀猀琀猀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'AttrListIDNotExist', N'EN', N'The attribute 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'ComObjectNotExist', N'EN', N'The common object does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoComObject', N'EN', N'No common object ID was supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 氀椀猀琀ⴀ椀琀攀洀 䤀䐀 瀀愀椀爀 椀猀 椀渀瘀愀氀椀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'SelfAuth', N'EN', N'An authorizer cannot self-authorize.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀攀䜀爀漀甀瀀倀攀爀洀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFileGroupID', N'EN', N'No file 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'FileEdPermNotFree', N'EN', N'The connected user is not permitted to link the file to the selected file group.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀攀䜀爀瀀䔀搀倀攀爀洀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoName', N'EN', N'No name was supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䤀䐀䄀挀挀攀猀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䔀椀琀栀攀爀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀Ⰰ 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 洀攀琀愀搀愀琀愀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoWindowsName', N'EN', N'No Windows name was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀圀椀渀搀漀眀猀一愀洀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 圀椀渀搀漀眀猀 渀愀洀攀 眀愀猀 椀渀瘀愀氀椀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FGroupNotUnique', N'EN', N'The filter group has already been assigned to an attribute in the given radio button list.  A filter group may only be assigned to one element of a given radio button list. ', NULL, N'Constraint')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 昀漀爀洀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀 愀渀搀 琀栀攀 搀攀昀愀甀氀琀 昀漀爀洀 䤀䐀 椀猀 戀氀愀渀欀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DefFrTextIdNotExist', N'EN', N'A document free text ID was not supplied and the default document free text ID is empty.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 昀椀氀琀攀爀 最爀漀甀瀀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 愀渀搀 琀栀攀 搀攀昀愀甀氀琀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 攀洀瀀琀礀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DefDcRBAtrIdNotExist', N'EN', N'A document radio button attribute ID was not supplied and the default document radio button ID is empty. ', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀攀昀愀甀氀琀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀攀昀愀甀氀琀 䤀䐀 猀甀瀀瀀氀椀攀搀 眀愀猀 椀渀瘀愀氀椀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoMSListID', N'EN', N'No multi-select 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'NoFileIDAccess', N'EN', N'Either the file does not exist, the user does not have view permission for the file 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'InvalidConFileGrp', N'EN', N'The controller level file group either does not exist or the user does not have have access to it. ', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀渀䐀漀挀䜀瀀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ConFileGpNotExist', N'EN', N'The controller level file 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'XrefTypeIDNotExist', N'EN', N'The cross-reference type 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'DateStyleInvalid', N'EN', N'The supplied date style was invalid.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀爀攀攀吀攀砀琀一愀洀攀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 渀愀洀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'RefIntegrityError', N'EN', N'A referential integrity constraint failure occured.', NULL, N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀渀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 甀瀀搀愀琀椀渀最 琀栀攀 爀攀挀漀爀搀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'RecordExists', N'EN', N'A record matching the new record already exists.', NULL, N'Already Exists')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 椀渀琀攀最攀爀 昀椀攀氀搀 渀愀洀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoRealNameID', N'EN', N'No real field name ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀爀攀攀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 渀愀洀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
GO਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀愀琀攀 昀椀攀氀搀 渀愀洀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'IntIDNotExist', N'EN', N'The integer 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'NoFunctionID', N'EN', N'No duty function ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'AttrIDNotExist', N'EN', N'The 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'NoConFileGroup', N'EN', N'No controller level file 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'WorkflowRuleInvalid', N'EN', N'The supplied workflow rule ID doesn''t exist.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀漀爀欀昀氀漀眀匀琀攀瀀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WorkflowStepInvalid', N'EN', N'The workflow step ID supplied doesn''t exist.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀漀爀欀昀氀䴀漀搀攀氀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WorkflModelInvalid', N'EN', N'The workflow model ID supplied doesn''t exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WfInstStepIdInvalid', N'EN', N'The supplied workflow instance step ID doesn''t exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀昀伀甀琀瀀甀琀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 漀甀琀瀀甀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WfOutputIDInvalid', N'EN', N'The supplied workflow output ID doesn''t exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀倀攀爀猀漀渀匀琀攀瀀䰀椀渀欀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 瀀攀爀猀漀渀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFunctionStepLink', N'EN', N'The function 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'WfFunctOutFRef', N'EN', N'A file is linked to the workflow instance step id and function 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'WfActionIdNotExist', N'EN', N'The supplied workflow action 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'WFInstanceNotAuth', N'EN', N'The user does not have permission for this workflow instance because they do not have access permission for the related document. ', NULL, N'Authentication')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 戀攀挀愀甀猀攀 琀栀攀礀 搀漀 渀漀琀 栀愀瘀攀 愀挀挀攀猀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 搀漀挀甀洀攀渀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䄀甀琀栀攀渀琀椀挀愀琀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WfFromStepInvalid', N'EN', N'The From 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'NoWflTransID', N'EN', N'No workflow step transition ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 琀愀最 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TagGroupNotExist', N'EN', N'The supplied tag 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'NoTagTree', N'EN', N'A tag tree ID has not been supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 琀愀最 琀爀攀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoTagBrTreeID', N'EN', N'A tag browsing tree 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'NoTagPermission', N'EN', N'The connected user does not have permission to edit the given tag.', NULL, N'No Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀渀 攀爀爀漀爀 漀挀挀甀爀攀搀 搀甀爀椀渀最 琀栀攀 搀愀琀愀 猀攀氀攀挀琀椀漀渀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoDocGroupId', N'EN', N'No 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'WfFromStepNotSupl', N'EN', N'The From 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'NoTagTreePerm', N'EN', N'The connected user does not have edit permission for the given tag tree.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 琀愀最 琀爀攀攀 渀漀搀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoNode', N'EN', N'No tree node ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀猀刀漀漀琀一漀搀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 爀漀漀琀 渀漀搀攀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoLinkPermission', N'EN', N'The given attribute list is restricted to controller use only.  The connected user does not have controller permission.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䴀甀氀琀椀䐀甀瀀氀䘀椀氀攀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䴀漀爀攀 琀栀愀渀 漀渀攀 搀甀瀀氀椀挀愀琀攀 昀椀氀攀 攀砀椀猀琀猀⸀  吀栀攀 昀椀氀攀 挀愀渀渀漀琀 戀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䌀漀渀猀琀爀愀椀渀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoRequestID', N'EN', N'A request 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'NoSelfCancel', N'EN', N'An authorizer cannot cancel a pending request to revoke their own authorizer privileges.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀倀攀渀搀椀渀最✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 爀攀焀甀攀猀琀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 栀愀瘀攀 愀 猀琀愀琀甀猀 攀焀甀愀氀 琀漀 ✀✀倀攀渀搀椀渀最✀✀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoSidNoRequ', N'EN', N'No user ID or request ID was supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀猀攀爀匀攀氀昀䄀甀琀栀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 甀猀攀爀 挀漀渀渀漀琀 猀攀氀昀ⴀ愀甀琀栀漀爀椀稀攀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'Approver1Complete', N'EN', N'One of two approvals complete for authorizer privilege grant request.', NULL, N'Transaction')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀瀀瀀爀漀瘀愀氀䘀愀椀氀攀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 愀瀀瀀爀漀瘀愀氀 爀攀焀甀攀猀琀 昀愀椀氀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DuplApprover', N'EN', N'The second approver must not be the same as the first.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀攀氀昀刀攀瘀漀欀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀匀攀氀昀ⴀ爀攀瘀漀欀椀渀最 漀昀 愀甀琀栀漀爀椀稀攀爀 瀀爀椀瘀椀氀攀最攀猀 椀猀 渀漀琀 瀀攀爀洀椀琀琀攀搀 戀攀挀愀甀猀攀 椀琀 挀愀渀 爀攀猀甀氀琀 椀渀 琀栀攀 渀甀洀戀攀爀 漀昀 愀甀琀栀漀爀椀稀攀爀猀 昀愀氀氀椀渀最 戀攀氀漀眀 琀眀漀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ThumbnailTooBig', N'EN', N'The thumbnail exceeds 1MB.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀刀攀琀攀渀琀椀漀渀䤀渀䘀漀爀挀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䘀椀氀攀 爀攀琀攀渀琀椀漀渀 椀猀 攀渀昀漀爀挀攀搀 愀渀搀 琀栀攀 昀椀氀攀 爀攀琀攀渀琀椀漀渀 搀愀琀攀 栀愀猀 渀漀琀 礀攀琀 攀砀瀀椀爀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoSearchString', N'EN', N'No search string was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀攀昀䐀漀挀䐀愀琀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 䤀䐀 栀愀猀 戀攀攀渀 猀攀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoSidId', 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'NoDocForGroup', N'EN', N'A document group ID was supplied but no corresponding document ID was supplied.', NULL, N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䰀愀猀琀䐀漀挀䜀爀瀀嘀椀攀眀攀爀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 氀愀猀琀 搀漀挀甀洀攀渀琀 瘀椀攀眀椀渀最 最爀漀甀瀀 瘀椀攀眀攀爀 瀀攀爀洀椀猀猀椀漀渀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀 眀栀椀氀攀 搀漀挀甀洀攀渀琀猀 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䌀漀渀猀琀爀愀椀渀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'InvalidRetention', N'EN', N'Invalid retention period: ', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'GFNameIDInvalid', N'EN', N'The general field name ID supplied was invalid.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀䤀搀䤀猀嘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 瘀愀氀椀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀伀欀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FileInserted', N'EN', N'File inserted', NULL, N'Transaction')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀猀攀爀䐀攀愀挀琀椀瘀愀琀攀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 甀猀攀爀 椀猀 愀氀爀攀愀搀礀 搀攀ⴀ愀挀琀椀瘀愀琀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DocBookedOut', N'EN', N'The document is already booked out', NULL, N'Exists')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䈀䤀刀攀挀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 戀漀漀欀攀搀ⴀ椀渀 爀攀挀漀爀搀 椀猀 椀渀瘀愀氀椀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'BkgTimeBoxExp', N'EN', N'The booking in time limit has expired.', NULL, N'Expired')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䔀搀倀攀爀洀䌀栀攀挀欀倀愀猀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 挀栀攀挀欀 瀀愀猀猀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀伀欀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NotBOUser', N'EN', N'The document was not booked out by this user', NULL, N'Authentication')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀一漀琀䈀漀漀欀攀搀伀甀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 椀猀 渀漀琀 戀漀漀欀攀搀 漀甀琀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WfTransIDInvalid', N'EN', N'The supplied workflow step transition 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'RootNodeExists', N'EN', N'A root node already exists for the supplied tree ID.  Parent ID must not be NULL.', 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')਀䜀伀 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ComObjInvalid', N'EN', N'The common object ID does not exist in the given listed ID.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 琀愀最 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
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'FileDeleteDisabled', N'Deleting of files is disabled in global settings', N'Constraint')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀䔀搀倀攀爀洀一漀琀䘀爀攀攀✀Ⰰ 一✀吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 渀漀琀 瀀攀爀洀椀琀琀攀搀 琀漀 氀椀渀欀 琀栀攀 昀椀氀攀 琀漀 琀栀攀 猀攀氀攀挀琀攀搀 昀椀氀攀 最爀漀甀瀀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FileGroupIdNotExist', N'The file group ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 昀椀氀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FileInserted', N'File successfully inserted', N'Transaction')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀渀愀洀攀吀漀漀䰀漀渀最✀Ⰰ 一✀吀栀攀 昀椀氀攀渀愀洀攀 攀砀挀攀攀搀攀搀 ㈀㔀㔀 挀栀愀爀愀挀琀攀爀猀✀Ⰰ 一✀匀椀稀攀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FileRetentionInForce', N'File retention is enforced and the file retention date has not yet expired.', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀吀漀漀䰀愀爀最攀✀Ⰰ 一✀吀栀攀 昀椀氀攀 椀猀 琀漀漀 氀愀爀最攀✀Ⰰ 一✀匀椀稀攀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FmGNotExist', N'Form group does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀漀爀洀䜀爀漀甀瀀一漀琀伀眀渀攀搀✀Ⰰ 一✀䘀漀爀洀 最爀漀甀瀀 椀猀 渀漀琀 漀眀渀攀搀 戀礀 琀栀攀 甀猀攀爀⸀✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FormNotExist', N'The form name does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀爀攀攀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 渀愀洀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FrmMandInvalid', N'Form field mandatory flag is invalid', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FunctListIDInvalid', N'The function list ID was invalid', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 䤀䐀 猀甀瀀瀀氀椀攀搀 眀愀猀 椀渀瘀愀氀椀搀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'IndTagBrTrNotExist', N'No personal tag browsing tree is registered for the connected user. ', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ 一✀䔀爀爀漀爀 漀挀挀甀爀攀搀 甀瀀漀渀 椀渀猀攀爀琀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀 䔀爀爀漀爀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'IntIDNotExist', N'The integer field name ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䈀䤀刀攀挀✀Ⰰ 一✀䤀渀瘀愀氀椀搀 戀漀漀欀攀搀 椀渀 爀攀挀漀爀搀⸀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'InvalidConDocGrp', N'The controller level document 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'InvalidDocId', N'The document ID contains non-printable characters or is otherwise invalid.', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䘀椀氀攀渀愀洀攀✀Ⰰ 一✀䘀椀氀攀渀愀洀攀 椀猀 渀漀琀 愀 瘀愀氀椀搀 圀椀渀搀漀眀猀 昀椀氀攀渀愀洀攀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'InvalidListItem', N'The list-item pair is invalid.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀刀攀琀攀渀琀椀漀渀✀Ⰰ 一✀䤀渀瘀愀氀椀搀 爀攀琀攀渀琀椀漀渀 瀀攀爀椀漀搀⸀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'InvalidWindowsName', N'The Windows name was invalid', N'Not valid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀猀䄀甀琀栀漀爀椀猀攀爀✀Ⰰ 一✀吀栀攀 猀椀搀 椀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 愀渀搀 挀愀渀 漀渀氀礀 戀攀 搀攀氀攀琀攀搀 戀礀 愀 搀愀琀愀戀愀猀攀 愀搀洀椀渀椀猀琀爀愀琀漀爀✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'IsRootNode', N'The root node cannot be deleted. ', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䰀愀猀琀䐀漀挀䜀爀瀀嘀椀攀眀攀爀✀Ⰰ 一✀吀栀攀 氀愀猀琀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 瘀椀攀眀椀渀最 最爀漀甀瀀 漀眀渀攀爀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀 眀栀椀氀攀 搀漀挀甀洀攀渀琀猀 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀✀Ⰰ 一✀䌀漀渀猀琀爀愀椀渀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'MaxDocTries', N'Maximum tries reached for finding unique random document id.', NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䴀匀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'MultiDuplFiles', N'More than duplicate file exists. ', N'Constraint')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ 一✀吀栀攀 渀愀洀攀 昀椀攀氀搀 洀甀猀琀 戀攀 甀渀椀焀甀攀✀Ⰰ 一✀一漀琀 唀渀椀焀甀攀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoAttrID', N'No attribute ID was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ 一✀一漀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 渀愀洀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoAttrName', N'No attribute name was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ 一✀一漀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoComObjList', N'No common object list id was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䌀漀渀䐀漀挀䜀爀漀甀瀀✀Ⰰ 一✀一漀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ ✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoConFileGroup', N'No controller level file group ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀愀琀愀✀Ⰰ 一✀一漀 搀愀琀愀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  刀攀挀漀爀搀 渀漀琀 猀愀瘀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoDateNameID', N'No date name field was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀愀琀攀匀琀礀氀攀✀Ⰰ 一✀䄀 搀愀琀攀 猀琀礀氀攀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoDefDocDate', N'No default document date ID has been set.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀搀攀䤀猀䐀攀猀挀攀渀搀愀渀琀✀Ⰰ 一✀䌀愀渀渀漀琀 洀漀瘀攀 愀 渀漀搀攀 琀漀 椀琀猀 漀眀渀 搀攀猀挀攀渀搀愀渀琀⸀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoDocForGroup', N'If a document group is supplied then a document ID must also be supplied', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ 一✀一漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoDocGroupPermission', N'Either the user does not have permission for the document group or the document group doe s not exist', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䤀䐀✀Ⰰ 一✀一漀 搀漀挀甀洀攀渀琀 䤀䐀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoDocIDAccess', N'Either the doc 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'NoFileGroupPerm', N'The 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'NoFileID', N'No file ID supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀✀Ⰰ 一✀䔀椀琀栀攀爀 琀栀攀 昀椀氀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀Ⰰ 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 漀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFileSupplied', N'No file was supplied, or the file was empty.', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀琀攀爀䜀爀漀甀瀀✀Ⰰ 一✀一漀 昀椀氀琀攀爀 最爀漀甀瀀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
GO਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀漀爀洀䜀爀漀甀瀀䤀䐀✀Ⰰ 一✀一漀 昀漀爀洀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFormID', N'No form ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀唀猀攀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFreeTextNameID', N'No free text name field was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀甀渀挀琀椀漀渀䤀䐀✀Ⰰ 一✀一漀 搀甀琀礀 昀甀渀挀琀椀漀渀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFunctionListID', N'A function list ID was not supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀甀渀挀琀椀漀渀匀琀攀瀀䰀椀渀欀✀Ⰰ 一✀吀栀攀 昀甀渀挀琀椀漀渀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoGFNameID', N'No generaly field name id was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䤀䐀猀✀Ⰰ 一✀䔀椀琀栀攀爀 愀 搀漀挀 䤀䐀 漀爀 愀 昀椀氀攀 䤀䐀 洀甀猀琀 戀攀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoIntNameID', N'No integer field name was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䰀椀渀欀倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 氀椀渀欀 琀栀攀 最椀瘀攀渀 愀琀琀爀椀戀甀琀攀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoMatch', N'No matching records exist', NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䴀匀䰀椀猀琀䤀䐀✀Ⰰ 一✀一漀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoName', N'No name was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀一愀洀攀䤀䐀✀Ⰰ 一✀一漀 渀愀洀攀 椀搀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoNode', N'No tree node ID was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ 一✀一漀 瀀攀漀瀀氀攀 氀椀猀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoPermission', N'User does not have permission for this action', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀倀攀爀猀漀渀匀琀攀瀀䰀椀渀欀✀Ⰰ 一✀吀栀攀 瀀攀爀猀漀渀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoRealNameID', N'No real value field name ID was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ 一✀一漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoRequestID', N'A request ID was not supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀攀愀爀挀栀匀琀爀椀渀最✀Ⰰ 一✀一漀 猀攀愀爀挀栀 猀琀爀椀渀最 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoSelfCancel', N'An authoriser cannot self-cancel a revoke request.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀攀氀昀刀攀瘀漀欀攀✀Ⰰ 一✀匀攀氀昀ⴀ爀攀瘀漀欀椀渀最 椀猀 渀漀琀 瀀攀爀洀椀琀琀攀搀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoSID', N'No SID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀椀搀䤀搀✀Ⰰ 一✀一漀 匀䤀䐀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 猀甀瀀瀀氀椀攀搀⸀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoSidNoRequ', N'No user SID or request ID supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀琀攀瀀匀琀愀琀甀猀䤀䐀✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 猀琀攀瀀 猀琀愀琀甀猀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTagBrTreeID', N'A tag browsing tree ID was not supplied.', N'Not supplied.')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ 一✀一漀 琀愀最 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTagGrpName', N'No tag group name was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最䜀爀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀吀栀攀 甀猀攀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 最椀瘀攀渀 琀愀最 最爀漀甀瀀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTagID', N'No tag ID was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最一愀洀攀✀Ⰰ 一✀䄀 琀愀最 渀愀洀攀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀⸀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTagPermission', N'The connected user does not have permission to edit the given tag.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最吀爀攀攀✀Ⰰ 一✀䄀 琀愀最 琀爀攀攀 䤀䐀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTagTreePerm', N'The connected user does not have edit permission for the given tag tree.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀䈀伀唀猀攀爀✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 眀愀猀 渀漀琀 戀漀漀欀攀搀 漀甀琀 戀礀 琀栀椀猀 甀猀攀爀 愀渀搀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀 挀漀渀琀爀漀氀氀攀爀✀Ⰰ 一✀䄀甀琀栀攀渀琀椀挀愀琀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NotExist', N'Record doesn''t exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀攀砀琀一愀洀攀䤀搀✀Ⰰ 一✀一漀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTGroup', N'No transaction group id was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀䤀一吀✀Ⰰ 一✀䤀渀挀漀爀爀攀挀琀 琀礀瀀攀⸀  䤀渀琀攀最攀爀 攀砀瀀攀挀琀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NotLastBkIn', N'Not the latest booked in record', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀倀攀渀搀椀渀最✀Ⰰ 一✀刀攀焀甀攀猀琀 搀漀攀猀 渀漀琀 栀愀瘀攀 猀琀愀琀甀猀 㴀 倀攀渀搀椀渀最✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NotUnique', N'Data is not unique', N'Constraint')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ 一✀一漀 甀猀攀爀 匀䤀䐀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoWFInstanceID', N'A workflow instance ID was not supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoWflTransID', N'No workflow transition ID was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀昀伀甀琀瀀甀琀䤀䐀✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 漀甀琀瀀甀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ ✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀⸀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoWindowsName', N'A Windows name was not supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀漀爀欀昀氀䴀漀搀攀氀䤀䐀✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoWorkflowRuleID', N'No workflow rule ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀漀爀欀昀氀漀眀匀琀攀瀀䤀䐀✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoXrefTypeID', N'No cross-reference type ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀倀愀爀攀渀琀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 瀀愀爀攀渀琀 渀漀搀攀 猀琀攀瀀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'PeopleListIDNotExist', N'The people list ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀倀爀攀猀攀渀琀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 愀渀搀 猀琀攀瀀 䤀䐀 瀀愀椀爀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'RadioBNotExist', N'The radio button does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀䈀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'RealIDNotExist', N'The real field name ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 一✀䄀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀✀Ⰰ 一✀䄀氀爀攀愀搀礀 䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'RefIntegrityError', N'Transaction failed due to referential integrity constraint', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀焀甀攀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 爀攀焀甀攀猀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'RevAppr1Complete', N'One of two approvals complete for authoriser privilege revoke request.', N'Transaction')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀漀氀攀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 爀漀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'RootNodeExists', N'A root node already exists.', N'Already Exists')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ 一✀䔀爀爀漀爀 漀挀挀甀爀攀搀 漀渀 猀攀氀攀挀琀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀 䔀爀爀漀爀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'SelfAuth', N'Authoriser cannot self-authorise document viewer group.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀椀搀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 匀䤀䐀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'StepStatusIDInvalid', N'The supplied step status ID was inavlid.', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀甀挀挀攀猀猀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀 猀甀挀挀攀猀猀昀甀氀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TagBrTreeIDNotExist', N'The supplied tag browsing tree ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀愀最䐀甀瀀䤀渀吀爀攀攀✀Ⰰ 一✀吀栀攀 琀愀最 愀氀爀攀愀搀礀 攀砀椀猀琀猀 椀渀 琀栀攀 最椀瘀攀渀 琀愀最 琀爀攀攀⸀✀Ⰰ 一✀䄀氀爀攀愀搀礀 䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TagGroupNotExist', N'The supplied tag group ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 琀愀最 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TagTreeNotExist', N'The supplied tag tree ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 渀愀洀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TGNotExist', N'The transaction group does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀栀甀洀戀渀愀椀氀吀漀漀䈀椀最✀Ⰰ 一✀吀栀攀 琀栀甀洀戀渀愀椀氀 攀砀挀攀攀搀猀 ㄀䴀䈀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TooFewAuthorisers', N'The number or authorisers may not be reduced below two because two authorisers are required to grant privileges to a new authoriser.', N'Constraint')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀漀漀䰀漀渀最㄀　✀Ⰰ 一✀匀琀爀椀渀最 琀漀漀 氀漀渀最⸀  䴀愀砀 ㄀　 挀栀愀爀猀✀Ⰰ 一✀匀椀稀攀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TooLong50', N'String too long.  Max 50 chars', N'Size')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀漀漀䰀漀渀最䴀愀砀✀Ⰰ 一✀䰀漀渀最攀爀 琀栀愀渀 瀀攀爀洀椀琀琀攀搀 戀礀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀✀Ⰰ 一✀匀椀稀攀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TreeNodeNotExist', N'The supplied tag tree node ID does not exist. ', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀渀椀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 甀渀椀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'Unspecified', N'Unspecified error', NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ 一✀䔀爀爀漀爀 甀瀀搀愀琀椀渀最 愀 爀攀挀漀爀搀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀 䔀爀爀漀爀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'UserDeactivated', N'The user is already deactivated', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 甀猀攀爀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'UserIsActive', N'The user record is already active', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀猀攀爀匀攀氀昀䄀甀琀栀✀Ⰰ 一✀䄀 甀猀攀爀 挀愀渀渀漀琀 猀攀氀昀ⴀ愀甀琀栀漀爀椀猀攀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'ViewPermExists', N'Document group cannot be deleted because a view permission entry exists', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䄀挀琀椀漀渀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfFromStepInvalid', N'The From workflow step ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䘀爀漀洀匀琀攀瀀一漀琀匀甀瀀氀✀Ⰰ 一✀吀栀攀 䘀爀漀洀 眀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfFunctOutFRef', N'A file is linked to the workflow instance step id and function id.  This must be removed before this record can be changed. ', N'Referenctial Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䤀渀猀琀愀渀挀攀䔀砀椀猀琀猀✀Ⰰ 一✀䄀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 挀漀爀爀攀猀瀀漀渀搀椀渀最 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 攀砀椀猀琀猀⸀✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WFInstanceIDInvalid', N'The supplied workflow instance ID doesn''t exist.', N'Not Exist')਀䜀伀 
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'WfOutputIDInvalid', N'The supplied workflow output ID doesn''t exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀倀攀爀猀伀甀琀䘀刀攀昀✀Ⰰ 一✀䄀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 愀渀搀 瀀攀爀猀漀渀 椀搀⸀  吀栀椀猀 洀甀猀琀 戀攀 爀攀洀漀瘀攀搀 戀攀昀漀爀攀 琀栀椀猀 爀攀挀漀爀搀 挀愀渀 戀攀 挀栀愀渀最攀搀⸀ ✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WFStepNotAuth', N'The user does not have permission for this workflow instance step because they do not have access permission for the associated document.', N'Authentication')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀吀漀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 吀漀 眀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfToStepNotSupl', N'The To workflow step ID was not supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀吀爀愀渀猀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 琀爀愀渀猀椀琀椀漀渀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WorkflModelInvalid', N'The workflow model ID supplied doesn''t exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀漀爀欀昀氀漀眀刀甀氀攀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 爀甀氀攀 䤀䐀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WorkflowStepInvalid', N'the supplied worflow step ID doesn''t exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 一✀䄀 爀攀昀攀爀攀渀挀攀 攀砀椀猀琀猀 攀砀椀猀琀猀 椀渀 愀渀漀琀栀攀爀 琀愀戀氀攀✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'XrefTypeIDNotExist', N'The cross-reference type ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ 一✀娀攀爀漀 爀攀挀漀爀搀猀 爀攀琀爀椀攀瘀攀搀⸀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀✀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀Ⰰ 一✀伀眀渀攀爀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 伀眀渀攀爀✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 漀眀渀攀爀✀Ⰰ ㄀⤀ 
INSERT [people].[general_field_names] ([general_field_name_id], [mnem], [name], [description], [list_position]) VALUES (3, N'Reviewers', N'Document Reviewers', N'The default list of document reviewers', 2)਀䤀一匀䔀刀吀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㐀Ⰰ 一✀䄀瀀瀀爀漀瘀攀爀猀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 䄀瀀瀀爀漀瘀攀爀猀✀Ⰰ 一✀吀栀攀 氀椀猀琀 搀漀挀甀洀攀渀琀 搀漀挀甀洀攀渀琀 愀瀀瀀爀漀瘀攀爀猀✀Ⰰ ㌀⤀ 
INSERT [people].[general_field_names] ([general_field_name_id], [mnem], [name], [description], [list_position]) VALUES (18, N'Revd By', N'Reviewed By', N'The list of who reviewed a draft', 5)਀䤀一匀䔀刀吀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㤀Ⰰ 一✀䄀瀀瀀爀瘀搀 䈀礀✀Ⰰ 一✀䄀瀀瀀爀漀瘀攀搀 䈀礀✀Ⰰ 一✀吀栀攀 氀椀猀琀 漀昀 眀栀漀 愀瀀瀀爀漀瘀攀搀 愀 爀攀氀攀愀猀攀✀Ⰰ 㘀⤀ 
INSERT [people].[general_field_names] ([general_field_name_id], [mnem], [name], [description], [list_position]) VALUES (21, N'Prepd By', N'Prepared By', N'The list of who prepared a release', 4)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀 伀一  
਀䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀 ⠀嬀琀愀最开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀琀愀最开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀吀吀刀✀Ⰰ 一✀吀愀最 吀爀攀攀 刀漀漀琀✀Ⰰ 一✀䄀 搀甀洀洀礀 琀愀最 甀猀攀搀 愀猀 琀栀攀 爀漀漀琀 渀漀搀攀 昀漀爀 琀愀最 琀爀攀攀猀⸀✀⤀ 
SET IDENTITY_INSERT [tagging].[doc_tags] OFF਀䜀伀 
SET IDENTITY_INSERT [tagging].[tag_browsing_tree_names] ON ਀ 
INSERT [tagging].[tag_browsing_tree_names] ([tag_browsing_tree_id], [mnem], [name], [descr], [list_position], [sid_id]) VALUES (1, N'DTBT', N'Default Tag Browsing Tree', N'This is the browsing tree that will be used by the database if no browsing tree ID is supplied', 1, NULL)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀 ⠀嬀戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀崀Ⰰ 嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀Ⰰ 嬀琀愀最开椀搀崀Ⰰ 嬀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀崀Ⰰ 嬀椀渀瘀攀爀琀开琀愀最崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㐀Ⰰ ㄀Ⰰ ㄀Ⰰ 一✀⼀✀Ⰰ 一唀䰀䰀⤀ 
SET IDENTITY_INSERT [tagging].[tag_browsing_tree_nodes] OFF਀䜀伀 
SET IDENTITY_INSERT [tagging].[tag_tree_names] ON ਀ 
INSERT [tagging].[tag_tree_names] ([tag_tree_id], [mnem], [name], [descr], [list_position]) VALUES (2, N'DTRT', N'Default Tag Relationship Tree', N'Defines hierarchical relationships between tags.', 1)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀愀洀攀猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀 ⠀嬀琀愀最开琀爀攀攀开渀漀搀攀开椀搀崀Ⰰ 嬀琀愀最开琀爀攀攀开椀搀崀Ⰰ 嬀琀愀最开椀搀崀Ⰰ 嬀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㐀㠀Ⰰ ㈀Ⰰ ㄀Ⰰ 一✀⼀✀⤀ 
SET IDENTITY_INSERT [tagging].[tag_tree_nodes] OFF਀䜀伀 
INSERT [user_restr].[role_list] ([role_name], [role_description]) VALUES (N'Configurator', N'Creates metadata lists.')਀䤀一匀䔀刀吀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀爀漀氀攀开氀椀猀琀崀 ⠀嬀爀漀氀攀开渀愀洀攀崀Ⰰ 嬀爀漀氀攀开搀攀猀挀爀椀瀀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 一✀䄀猀猀椀最渀猀 洀攀琀愀搀愀琀愀⸀✀⤀ 
INSERT [user_restr].[role_list] ([role_name], [role_description]) VALUES (N'Editor', N'Adds files, tags files.')਀䤀一匀䔀刀吀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀爀漀氀攀开氀椀猀琀崀 ⠀嬀爀漀氀攀开渀愀洀攀崀Ⰰ 嬀爀漀氀攀开搀攀猀挀爀椀瀀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀愀搀攀爀✀Ⰰ 一✀刀攀愀搀猀 搀愀琀愀⸀  䌀愀渀 挀爀攀愀琀攀 琀栀攀椀爀 漀眀渀 瀀攀爀猀漀渀愀氀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀⸀✀⤀ 
INSERT [user_restr].[role_list] ([role_name], [role_description]) VALUES (N'Reviewer', N'Reviews documents for an editor.')਀䜀伀 
SET IDENTITY_INSERT [xref].[cross_reference_types] ON ਀ 
INSERT [xref].[cross_reference_types] ([xref_type_id], [mnem], [attr_name], [descr], [list_position]) VALUES (1, N'SUP', N'Superseded', N'The cross-referenced doc ID is superseded by the source doc ID', 3)਀䤀一匀䔀刀吀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀 ⠀嬀砀爀攀昀开琀礀瀀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀Ⰰ 一✀刀䔀䘀✀Ⰰ 一✀刀攀昀攀爀攀渀挀攀搀✀Ⰰ 一✀吀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀搀 搀漀挀 䤀䐀 椀猀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀搀 戀礀 琀栀攀 猀漀甀爀挀攀 搀漀挀 䤀䐀✀Ⰰ ㈀⤀ 
INSERT [xref].[cross_reference_types] ([xref_type_id], [mnem], [attr_name], [descr], [list_position]) VALUES (3, N'PART', N'Subset Part', N'The cross-referenced doc ID is a subset part of the source doc ID', 3)਀䤀一匀䔀刀吀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀 ⠀嬀砀爀攀昀开琀礀瀀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㐀Ⰰ 一✀䄀吀吀✀Ⰰ 一✀䄀琀琀愀挀栀洀攀渀琀✀Ⰰ 一✀吀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀搀 搀漀挀 䤀䐀 椀猀 愀渀 愀琀琀愀挀栀洀攀渀琀 琀漀 琀栀攀 猀漀甀爀挀攀 搀漀挀 䤀䐀✀Ⰰ 㐀⤀ 
INSERT [xref].[cross_reference_types] ([xref_type_id], [mnem], [attr_name], [descr], [list_position]) VALUES (5, N'SET', N'Set', N'The cross-referenced doc ID is part of a set with the source doc ID', 5)਀䤀一匀䔀刀吀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀 ⠀嬀砀爀攀昀开琀礀瀀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㘀Ⰰ 一✀匀唀䈀✀Ⰰ 一✀匀甀戀 䐀漀挀甀洀攀渀琀✀Ⰰ 一✀吀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀搀 搀漀挀 䤀䐀 椀猀 愀 猀甀戀ⴀ搀漀挀甀洀攀渀琀 琀漀 琀栀攀 猀漀甀爀挀攀 搀漀挀 䤀䐀✀Ⰰ 㘀⤀ 
SET IDENTITY_INSERT [xref].[cross_reference_types] OFF਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_global_setting_group_name]    Script Date: Tue 12-05-2026 5:43:19 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_units]    Script Date: Tue 12-05-2026 5:43:19 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_com_obj_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_docs_com_obj_list_name]    Script Date: Tue 12-05-2026 5:43:19 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_com_obj_name]    Script Date: Tue 12-05-2026 5:43:19 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_date_name_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_free_text_name_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_int_name]    Script Date: Tue 12-05-2026 5:43:19 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_sm_attr_and_list_combined_key]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开搀开猀洀开愀琀琀爀开愀渀搀开氀椀猀琀开挀漀洀戀椀渀攀搀开欀攀礀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_ms_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀漀挀开猀洀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_multi_select_attributes] ADD  CONSTRAINT [UN_doc_sm_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀漀挀开猀攀氀攀挀琀开洀愀渀礀开氀椀猀琀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_multi_select_list_names] ADD  CONSTRAINT [UN_doc_select_many_list_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀开爀戀开愀琀琀爀开愀渀搀开氀椀猀琀开挀漀洀戀椀渀攀搀开欀攀礀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_radio_button_attributes] ADD  CONSTRAINT [UN_d_rb_attr_and_list_combined_key] UNIQUE NONCLUSTERED ਀⠀ 
	[doc_radiob_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_radiob_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_radiob_attr_list_name]    Script Date: Tue 12-05-2026 5:43:19 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_real_name_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_file_date_name_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_file_free_text_field_name]    Script Date: Tue 12-05-2026 5:43:19 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_file_int_name_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_file_sm_attr_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_file_sm_attr_and_list_combined_key]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀 䤀一䐀䔀堀 嬀唀一开昀椀氀攀开猀洀开愀琀琀爀开愀渀搀开氀椀猀琀开挀漀洀戀椀渀攀搀开欀攀礀崀 伀一 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 
(਀ऀ嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀 䄀匀䌀Ⰰ 
	[file_ms_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开猀洀开氀椀猀琀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [file_attr].[file_multi_select_list_names] ADD  CONSTRAINT [UN_file_sm_list_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀开爀戀开愀琀琀爀开愀渀搀开愀琀琀爀开氀椀猀琀开挀漀洀戀椀渀攀搀开欀攀礀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [file_attr].[file_radio_button_attributes] ADD  CONSTRAINT [UN_f_rb_attr_and_attr_list_combined_key] UNIQUE NONCLUSTERED ਀⠀ 
	[file_radiob_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_file_radiob_attr_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_file_radiob_list_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_file_real_name_attr_name]    Script Date: Tue 12-05-2026 5:43:19 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_filter_group_name]    Script Date: Tue 12-05-2026 5:43:19 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_form_group_name]    Script Date: Tue 12-05-2026 5:43:19 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_form_name]    Script Date: Tue 12-05-2026 5:43:19 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_language_message]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀 䤀一䐀䔀堀 嬀唀一开氀愀渀最甀愀最攀开洀攀猀猀愀最攀崀 伀一 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 
(਀ऀ嬀洀攀猀猀愀最攀开椀搀崀 䄀匀䌀Ⰰ 
	[language_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀甀渀挀琀椀漀渀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [people].[duty_functions] ADD  CONSTRAINT [UN_function_name] UNIQUE NONCLUSTERED ਀⠀ 
	[name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀甀渀挀琀椀漀渀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [people].[function_list_names] ADD  CONSTRAINT [UN_function_field_name] UNIQUE NONCLUSTERED ਀⠀ 
	[name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开洀甀猀琀开戀攀开甀渀椀焀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE UNIQUE NONCLUSTERED INDEX [UN_general_field_name_must_be_unique] ON [people].[general_field_names]਀⠀ 
	[name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀开洀甀猀琀开戀攀开甀渀椀焀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [people].[people_list_names] ADD  CONSTRAINT [UN_people_list_name_must_be_unique] UNIQUE NONCLUSTERED ਀⠀ 
	[name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开琀愀最开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [tagging].[doc_tags] ADD  CONSTRAINT [UN_tag_name] UNIQUE NONCLUSTERED ਀⠀ 
	[tag_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [tagging].[tag_browsing_tree_names] ADD  CONSTRAINT [UN_browsing_tree_name] UNIQUE NONCLUSTERED ਀⠀ 
	[name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [tagging].[tag_browsing_tree_nodes] ADD  CONSTRAINT [UN_browsing_tree_hierarchyid] UNIQUE NONCLUSTERED ਀⠀ 
	[tag_browsing_tree_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_group_name]    Script Date: Tue 12-05-2026 5:43:19 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_id_doc_id]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开琀愀最开椀搀开搀漀挀开椀搀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀搀崀 䄀匀䌀Ⰰ 
	[tag_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开琀愀最开琀爀攀攀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [tagging].[tag_tree_names] ADD  CONSTRAINT [UN_tag_tree_name] UNIQUE NONCLUSTERED ਀⠀ 
	[name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [tagging].[tag_tree_nodes] ADD  CONSTRAINT [UN_tag_tree_hierarchyid] UNIQUE NONCLUSTERED ਀⠀ 
	[tag_tree_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_restore_sid_must_be_unique]    Script Date: Tue 12-05-2026 5:43:19 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_sid_must_be_unique]    Script Date: Tue 12-05-2026 5:43:19 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_step_status_name]    Script Date: Tue 12-05-2026 5:43:19 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_output_definition_name]    Script Date: Tue 12-05-2026 5:43:19 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_workflow_action_names]    Script Date: Tue 12-05-2026 5:43:19 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_workflow_definition_name]    Script Date: Tue 12-05-2026 5:43:19 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_workflow_rule_name]    Script Date: Tue 12-05-2026 5:43:19 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 [GRAPH_UNIQUE_INDEX_576D54DB81404D6E99F60B7078968F32]    Script Date: Tue 12-05-2026 5:43:19 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]਀䜀伀 
/****** Object:  Index [GRAPH_UNIQUE_INDEX_6F43B73C521B48C58DA77BBBD0EAC16D]    Script Date: Tue 12-05-2026 5:43:19 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_controller_doc_group_names]    Script Date: Tue 12-05-2026 5:43:19 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_controller_file_group_names]    Script Date: Tue 12-05-2026 5:43:19 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_xref_type_name]    Script Date: Tue 12-05-2026 5:43:19 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_group_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀䌀刀䔀䄀吀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀 䤀一䐀䔀堀 嬀唀一开最爀漀甀瀀开渀愀洀攀崀 伀一 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 
(਀ऀ嬀愀琀琀爀开渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = 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_group_name]    Script Date: Tue 12-05-2026 5:43:19 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]਀䜀伀 
ALTER TABLE [base].[booked_in_files] ADD  CONSTRAINT [DF_booked_in_files_booked_date]  DEFAULT (sysdatetime()) FOR [booked_date]਀䜀伀 
ALTER TABLE [base].[booking_log] ADD  CONSTRAINT [DF_booking_log_system_username]  DEFAULT (original_login()) FOR [system_username]਀䜀伀 
ALTER TABLE [base].[booking_log] ADD  CONSTRAINT [DF_booking_log_date_time]  DEFAULT (sysdatetime()) FOR [booking_date]਀䜀伀 
ALTER TABLE [base].[document_id_list] ADD  CONSTRAINT [DF_document_id_list_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [base].[document_id_list] ADD  CONSTRAINT [DF_document_id_list_created_by]  DEFAULT (original_login()) FOR [created_by_username]਀䜀伀 
ALTER TABLE [base].[eula] ADD  CONSTRAINT [DF_eula_created_at]  DEFAULT (sysdatetime()) FOR [created_at]਀䜀伀 
ALTER TABLE [base].[file_delete_log] ADD  CONSTRAINT [DF_file_delete_log_date_time]  DEFAULT (sysdatetime()) FOR [date_time]਀䜀伀 
ALTER TABLE [base].[file_delete_log] ADD  CONSTRAINT [DF_file_delete_log_deleted_by_username]  DEFAULT (original_login()) FOR [deleted_by_username]਀䜀伀 
ALTER TABLE [base].[file_metadata] ADD  CONSTRAINT [DF_file_metadata_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [base].[file_metadata] ADD  CONSTRAINT [DF_file_metadata_created_by_username]  DEFAULT (original_login()) FOR [created_by_username]਀䜀伀 
ALTER TABLE [base].[file_read_log] ADD  CONSTRAINT [DF_file_read_log_date_time]  DEFAULT (sysdatetime()) FOR [date_time]਀䜀伀 
ALTER TABLE [base].[file_read_log] ADD  CONSTRAINT [DF_file_read_log_read_by_username]  DEFAULT (original_login()) FOR [read_by_username]਀䜀伀 
ALTER TABLE [people].[duty_function_sid_links] ADD  CONSTRAINT [DF_duty_function_sid_links_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [people].[duty_function_sid_links] ADD  CONSTRAINT [DF_duty_function_sid_links_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [people].[people_lists] ADD  CONSTRAINT [DF_people_lists_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [people].[people_lists] ADD  CONSTRAINT [DF_people_lists_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [tagging].[tag_browsing_tree_nodes] ADD  CONSTRAINT [DF_tag_browsing_tree_nodes_invert]  DEFAULT ((0)) FOR [invert_tag]਀䜀伀 
ALTER TABLE [user_restr].[authoriser_privilege_requests] ADD  CONSTRAINT [DF_authoriser_privilege_requests_status]  DEFAULT (N'Pending') FOR [status]਀䜀伀 
ALTER TABLE [user_restr].[authorisers] ADD  CONSTRAINT [DF_authorisers_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[authorisers] ADD  CONSTRAINT [DF_authorisers_created_by]  DEFAULT (original_login()) FOR [created_by]਀䜀伀 
ALTER TABLE [user_restr].[controller_doc_group_sid_links] ADD  CONSTRAINT [DF_controller_doc_group_sid_links_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[controller_doc_group_sid_links] ADD  CONSTRAINT [DF_controller_doc_group_sid_links_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[controller_file_grp_sid_links] ADD  CONSTRAINT [DF_controller_file_grp_sid_links_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[controller_file_grp_sid_links] ADD  CONSTRAINT [DF_controller_file_grp_sid_links_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_funct_lst] ADD  CONSTRAINT [DF_doc_group_edit_perm_funct_lst_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_funct_lst] ADD  CONSTRAINT [DF_doc_group_edit_perm_funct_lst_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_people_lst] ADD  CONSTRAINT [DF_doc_group_edit_perm_people_lst_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_people_lst] ADD  CONSTRAINT [DF_doc_group_edit_perm_people_lst_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_view_permissions] ADD  CONSTRAINT [DF_doc_group_view_permissions_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_view_permissions] ADD  CONSTRAINT [DF_doc_group_view_permissions_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_funct_lst] ADD  CONSTRAINT [DF_file_group_edit_perm_funct_lst_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_funct_lst] ADD  CONSTRAINT [DF_file_group_edit_perm_funct_lst_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_ppl_lst] ADD  CONSTRAINT [DF_file_group_edit_perm_ppl_lst_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_ppl_lst] ADD  CONSTRAINT [DF_file_group_edit_perm_ppl_lst_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[form_group_owners] ADD  CONSTRAINT [DF_form_group_owners_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[form_group_owners] ADD  CONSTRAINT [DF_form_group_owners_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[sid_list] ADD  CONSTRAINT [DF_sid_list_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_flist] ADD  CONSTRAINT [DF_tag_br_tree_permissions_flist_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_flist] ADD  CONSTRAINT [DF_tag_br_tree_permissions_flist_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_plist] ADD  CONSTRAINT [DF_tag_br_tree_permissions_plist_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_plist] ADD  CONSTRAINT [DF_tag_br_tree_permissions_plist_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_flist] ADD  CONSTRAINT [DF_tag_group_permissions_flist_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_flist] ADD  CONSTRAINT [DF_tag_group_permissions_flist_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_plist] ADD  CONSTRAINT [DF_tag_group_permissions_plist_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_plist] ADD  CONSTRAINT [DF_tag_group_permissions_plist_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_flist] ADD  CONSTRAINT [DF_tag_tree_permissions_flist_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_flist] ADD  CONSTRAINT [DF_tag_tree_permissions_flist_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_plist] ADD  CONSTRAINT [DF_tag_tree_permissions_plist_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_plist] ADD  CONSTRAINT [DF_tag_tree_permissions_plist_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [user_restr].[user_privilege_revoke_log] ADD  CONSTRAINT [DF_user_privilege_revoke_log_revoked_on]  DEFAULT (sysdatetime()) FOR [revoked_on]਀䜀伀 
ALTER TABLE [user_restr].[user_role_link] ADD  CONSTRAINT [DF_user_role_link_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [user_restr].[user_role_link] ADD  CONSTRAINT [DF_user_role_link_granted_by]  DEFAULT (original_login()) FOR [granted_by]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_instance_definitions] ADD  CONSTRAINT [DF_workflow_instance_definitions_create_date]  DEFAULT (getdate()) FOR [create_date]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_track_log_index] ADD  CONSTRAINT [DF_workflow_track_log_index_create_date]  DEFAULT (getdate()) FOR [create_date]਀䜀伀 
ALTER TABLE [xref].[controller_doc_group_links] ADD  CONSTRAINT [DF_controller_doc_group_links_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [xref].[controller_doc_group_links] ADD  CONSTRAINT [DF_controller_doc_group_links_created_by]  DEFAULT (original_login()) FOR [created_by]਀䜀伀 
ALTER TABLE [xref].[controller_doc_group_names] ADD  CONSTRAINT [DF_controller_doc_group_names_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [xref].[controller_doc_group_names] ADD  CONSTRAINT [DF_controller_doc_group_names_created_by]  DEFAULT (original_login()) FOR [created_by]਀䜀伀 
ALTER TABLE [xref].[controller_file_group_links] ADD  CONSTRAINT [DF_controller_file_group_links_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [xref].[controller_file_group_links] ADD  CONSTRAINT [DF_controller_file_group_links_created_by]  DEFAULT (original_login()) FOR [created_by]਀䜀伀 
ALTER TABLE [xref].[controller_file_group_names] ADD  CONSTRAINT [DF_controller_file_group_names_created]  DEFAULT (sysdatetime()) FOR [created]਀䜀伀 
ALTER TABLE [xref].[controller_file_group_names] ADD  CONSTRAINT [DF_controller_file_group_names_created_by]  DEFAULT (original_login()) FOR [created_by]਀䜀伀 
ALTER TABLE [base].[document_id_list]  WITH CHECK ADD  CONSTRAINT [FK_document_id_list_has_booking_id] FOREIGN KEY([booking_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀戀漀漀欀椀渀最开氀漀最崀 ⠀嬀戀漀漀欀椀渀最开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀开栀愀猀开戀漀漀欀椀渀最开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀甀洀攀渀琀开欀攀礀开栀愀猀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [base].[transaction_groups] ([transaction_group_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE SET NULL਀䜀伀 
ALTER TABLE [base].[document_id_list] CHECK CONSTRAINT [FK_document_key_has_transaction_group]਀䜀伀 
ALTER TABLE [base].[file_metadata]  WITH CHECK ADD  CONSTRAINT [FK_file_metadata_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开猀琀漀爀愀最攀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀攀琀愀搀愀琀愀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀攀琀愀搀愀琀愀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [base].[transaction_groups] ([transaction_group_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE SET NULL਀䜀伀 
ALTER TABLE [base].[file_metadata] CHECK CONSTRAINT [FK_file_metadata_transaction_group]਀䜀伀 
ALTER TABLE [base].[file_plain_text_content]  WITH CHECK ADD  CONSTRAINT [FK_file_plain_text_content_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开猀琀漀爀愀最攀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [base].[file_plain_text_content] CHECK CONSTRAINT [FK_file_plain_text_content_file_id]਀䜀伀 
ALTER TABLE [base].[file_thumbnails]  WITH CHECK ADD  CONSTRAINT [FK_file_thumbnails_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开猀琀漀爀愀最攀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [base].[file_thumbnails] CHECK CONSTRAINT [FK_file_thumbnails_file_id]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_culture_code_is_global_setting] FOREIGN KEY([culture_code])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀挀甀氀琀甀爀攀开挀漀搀攀猀崀 ⠀嬀挀甀氀琀甀爀攀开挀漀搀攀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀甀氀琀甀爀攀开挀漀搀攀开椀猀开最氀漀戀愀氀开猀攀琀琀椀渀最崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀愀琀攀开猀琀礀氀攀开椀猀开最氀漀戀愀氀开猀攀琀琀椀渀最崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀愀琀攀开猀琀礀氀攀崀⤀ 
REFERENCES [base].[datetime_styles] ([datetime_style])਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_date_style_is_global_setting]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_global_settings_groups_def_doc_free_text_name_id] FOREIGN KEY([default_doc_free_text_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开搀攀昀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开搀攀昀开昀椀氀琀攀爀开最瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [forms].[filter_groups] ([filter_group_id])਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_global_settings_groups_def_filter_gp]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_global_settings_groups_default_doc_date_field] FOREIGN KEY([default_doc_date_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开昀椀攀氀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开搀攀昀愀甀氀琀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀攀昀愀甀氀琀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀⤀ 
REFERENCES [tagging].[tag_browsing_tree_names] ([tag_browsing_tree_id])਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_global_settings_groups_default_tag_browsing_tree]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_global_settings_groups_has_def_tag_tree_id] FOREIGN KEY([default_tag_tree_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开琀爀攀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开栀愀猀开搀攀昀开琀愀最开琀爀攀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开栀愀猀开搀攀昀愀甀氀琀开昀漀爀洀开䤀䐀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀攀昀愀甀氀琀开昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_global_settings_groups_has_default_form_ID]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_global_settings_groups_has_default_language_id] FOREIGN KEY([language_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀洀攀猀猀愀最椀渀最崀⸀嬀氀愀渀最甀愀最攀开氀椀猀琀崀 ⠀嬀氀愀渀最甀愀最攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开栀愀猀开搀攀昀愀甀氀琀开氀愀渀最甀愀最攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开氀愀渀最甀愀最攀开椀猀开最氀漀戀愀氀开猀攀琀琀椀渀最崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀氀愀渀最甀愀最攀开椀搀崀⤀ 
REFERENCES [messaging].[language_list] ([language_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开氀愀渀最甀愀最攀开椀猀开最氀漀戀愀氀开猀攀琀琀椀渀最崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀洀开漀戀樀开氀椀猀琀开栀愀猀开愀琀琀爀椀戀甀琀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_attributes] ([common_object_attribute_id])਀䜀伀 
ALTER TABLE [com_obj].[common_object_list_names] CHECK CONSTRAINT [FK_com_obj_list_has_attribute]਀䜀伀 
ALTER TABLE [com_obj].[common_object_lists]  WITH CHECK ADD  CONSTRAINT [FK_com_obj_ms_list_has_list_name] FOREIGN KEY([common_object_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开栀愀猀开氀椀猀琀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀洀洀漀渀开漀戀樀攀挀琀开洀猀开氀椀猀琀开栀愀猀开漀戀樀攀挀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_objects] ([common_object_id])਀䜀伀 
ALTER TABLE [com_obj].[common_object_lists] CHECK CONSTRAINT [FK_common_object_ms_list_has_object]਀䜀伀 
ALTER TABLE [com_obj].[common_objects]  WITH CHECK ADD  CONSTRAINT [FK_common_obj_has_attribute] FOREIGN KEY([common_object_attribute_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀洀洀漀渀开漀戀樀开栀愀猀开愀琀琀爀椀戀甀琀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开挀漀洀洀漀渀开挀漀洀开漀戀樀开猀攀氀开洀甀猀琀开洀愀琀挀栀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_lists] ([common_object_list_id], [common_object_id])਀䜀伀 
ALTER TABLE [com_obj].[doc_to_com_obj_ms_list_links] CHECK CONSTRAINT [FK_doc_common_com_obj_sel_must_match_list]਀䜀伀 
ALTER TABLE [com_obj].[doc_to_com_obj_ms_list_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_is_linked_to_a_ms_com_obj] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开椀猀开氀椀渀欀攀搀开琀漀开愀开洀猀开挀漀洀开漀戀樀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开椀猀开氀椀渀欀攀搀开琀漀开爀愀搀椀漀戀开氀椀猀琀开漀昀开挀漀洀开漀戀樀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [com_obj].[doc_to_com_obj_radiob_links] CHECK CONSTRAINT [FK_doc_is_linked_to_radiob_list_of_com_obj]਀䜀伀 
ALTER TABLE [com_obj].[doc_to_com_obj_radiob_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_to_com_obj_link_must_match_list] FOREIGN KEY([common_object_list_id], [common_object_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开挀漀洀开漀戀樀开氀椀渀欀开洀甀猀琀开洀愀琀挀栀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开挀漀洀洀漀渀开挀漀洀开漀戀樀开猀攀氀开洀甀猀琀开洀愀琀挀栀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_lists] ([common_object_list_id], [common_object_id])਀䜀伀 
ALTER TABLE [com_obj].[file_to_com_obj_ms_list_links] CHECK CONSTRAINT [FK_file_common_com_obj_sel_must_match_list]਀䜀伀 
ALTER TABLE [com_obj].[file_to_com_obj_ms_list_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_com_obj_ms_list_links_has_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀开栀愀猀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开氀椀渀欀攀搀开琀漀开爀愀搀椀漀戀开氀椀猀琀开挀漀洀开漀戀樀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [com_obj].[file_to_com_obj_radiob_links] CHECK CONSTRAINT [FK_file_linked_to_radiob_list_com_obj]਀䜀伀 
ALTER TABLE [com_obj].[file_to_com_obj_radiob_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_com_obj_must_match_list] FOREIGN KEY([common_object_list_id], [common_object_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀甀猀琀开洀愀琀挀栀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开搀愀琀攀开昀椀攀氀搀开栀愀猀开瘀愀氀甀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_date_field_names] ([doc_date_name_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_date_values] CHECK CONSTRAINT [FK_doc_date_field_has_values]਀䜀伀 
ALTER TABLE [doc_attr].[doc_date_values]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_date_data] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开搀愀琀攀开搀愀琀愀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_free_text_field_names] ([doc_free_text_name_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_free_text_values] CHECK CONSTRAINT [FK_doc_free_text_field_has_name]਀䜀伀 
ALTER TABLE [doc_attr].[doc_free_text_values]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_free_text_data] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开昀爀攀攀开琀攀砀琀开搀愀琀愀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开栀愀猀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀甀渀椀琀开椀搀崀⤀ 
REFERENCES [base].[units_of_measure] ([unit_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_integer_field_names] CHECK CONSTRAINT [FK_doc_integer_field_has_unit_of_measure]਀䜀伀 
ALTER TABLE [doc_attr].[doc_integer_values]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_integer_data] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开椀渀琀攀最攀爀开搀愀琀愀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀渀琀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_integer_field_names] ([doc_int_name_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_integer_values] CHECK CONSTRAINT [FK_doc_integer_field_has_name]਀䜀伀 
ALTER TABLE [doc_attr].[doc_ms_attr_fgroup_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_ms_attr_group_links_filter_group_id] FOREIGN KEY([filter_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀 ⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开洀猀开愀琀琀爀开最爀漀甀瀀开氀椀渀欀猀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开洀猀开愀琀琀爀开最爀漀甀瀀开氀椀渀欀猀开琀漀开搀漀挀开洀甀氀琀椀开猀攀氀开愀琀琀爀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_multi_select_attributes] ([doc_ms_attr_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_ms_attr_fgroup_links] CHECK CONSTRAINT [FK_doc_ms_attr_group_links_to_doc_multi_sel_attr_id]਀䜀伀 
ALTER TABLE [doc_attr].[doc_multi_select_attributes]  WITH CHECK ADD  CONSTRAINT [FK_doc_ms_attribute_comprises_list] FOREIGN KEY([doc_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开洀猀开愀琀琀爀椀戀甀琀攀开挀漀洀瀀爀椀猀攀猀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开洀猀开愀琀琀爀开愀猀猀椀最渀洀攀渀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [doc_attr].[doc_multi_select_links] CHECK CONSTRAINT [FK_doc_has_ms_attr_assignment]਀䜀伀 
ALTER TABLE [doc_attr].[doc_multi_select_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_multi_select_list] FOREIGN KEY([doc_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开洀猀开愀琀琀爀开愀渀搀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_multi_select_attributes] ([doc_ms_attr_id], [doc_ms_list_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_multi_select_links] CHECK CONSTRAINT [FK_doc_ms_attr_and_list]਀䜀伀 
ALTER TABLE [doc_attr].[doc_radio_button_attributes]  WITH CHECK ADD  CONSTRAINT [FK_list_has_doc_db_attribute] FOREIGN KEY([doc_radiob_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开氀椀猀琀开栀愀猀开搀漀挀开搀戀开愀琀琀爀椀戀甀琀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开爀愀搀椀漀开戀甀琀琀漀渀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_radio_button_links] CHECK CONSTRAINT [FK_doc_has_radio_button]਀䜀伀 
ALTER TABLE [doc_attr].[doc_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_radio_button_list] FOREIGN KEY([doc_radiob_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开爀愀搀椀漀戀开愀猀猀椀最渀洀攀渀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [doc_attr].[doc_radio_button_links] CHECK CONSTRAINT [FK_doc_has_radiob_assignment]਀䜀伀 
ALTER TABLE [doc_attr].[doc_radiob_attr_fgroup_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_radiob_attr_fgroup_links_to_doc_radiob_attr_id] FOREIGN KEY([doc_radiob_attr_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀开琀漀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀开琀漀开昀椀氀琀攀爀开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [forms].[filter_groups] ([filter_group_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_radiob_attr_fgroup_links] CHECK CONSTRAINT [FK_doc_radiob_attr_fgroup_links_to_filter_group]਀䜀伀 
ALTER TABLE [doc_attr].[doc_real_number_field_names]  WITH CHECK ADD  CONSTRAINT [FK_doc_real_number_field_has_unit_of_meausre] FOREIGN KEY([unit_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开栀愀猀开甀渀椀琀开漀昀开洀攀愀甀猀爀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开爀攀愀氀开渀甀洀戀攀爀开搀愀琀愀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [doc_attr].[doc_real_number_values] CHECK CONSTRAINT [FK_doc_has_real_number_data]਀䜀伀 
ALTER TABLE [doc_attr].[doc_real_number_values]  WITH CHECK ADD  CONSTRAINT [FK_doc_real_number_field_has_name] FOREIGN KEY([doc_real_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [file_attr].[file_date_field_names] ([file_date_name_id])਀䜀伀 
ALTER TABLE [file_attr].[file_date_values] CHECK CONSTRAINT [FK_file_date_field_has_name]਀䜀伀 
ALTER TABLE [file_attr].[file_date_values]  WITH CHECK ADD  CONSTRAINT [FK_file_has_date_value] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开搀愀琀攀开瘀愀氀甀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [file_attr].[file_free_text_field_names] ([file_free_text_name_id])਀䜀伀 
ALTER TABLE [file_attr].[file_free_text_values] CHECK CONSTRAINT [FK_file_free_text_field_has_name]਀䜀伀 
ALTER TABLE [file_attr].[file_free_text_values]  WITH CHECK ADD  CONSTRAINT [FK_file_has_free_text_value] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀开栀愀猀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀甀渀椀琀开椀搀崀⤀ 
REFERENCES [base].[units_of_measure] ([unit_id])਀䜀伀 
ALTER TABLE [file_attr].[file_integer_field_names] CHECK CONSTRAINT [FK_file_integer_field_name_has_unit_of_measure]਀䜀伀 
ALTER TABLE [file_attr].[file_integer_values]  WITH CHECK ADD  CONSTRAINT [FK_file_has_integer_value] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开椀渀琀攀最攀爀开瘀愀氀甀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [file_attr].[file_integer_field_names] ([file_int_name_id])਀䜀伀 
ALTER TABLE [file_attr].[file_integer_values] CHECK CONSTRAINT [FK_file_integer_field_has_name]਀䜀伀 
ALTER TABLE [file_attr].[file_ms_attr_fgroup_links]  WITH CHECK ADD  CONSTRAINT [FK_file_ms_attr_fgroup_links_to_filter_group_id] FOREIGN KEY([filter_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀 ⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀开琀漀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀开琀漀开洀猀开愀琀琀爀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀⤀ 
REFERENCES [file_attr].[file_multi_select_attributes] ([file_ms_attr_id])਀䜀伀 
ALTER TABLE [file_attr].[file_ms_attr_fgroup_links] CHECK CONSTRAINT [FK_file_ms_attr_fgroup_links_to_ms_attr_id]਀䜀伀 
ALTER TABLE [file_attr].[file_multi_select_attributes]  WITH CHECK ADD  CONSTRAINT [FK_file_ms_attribute_comprises_list] FOREIGN KEY([file_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀猀开愀琀琀爀椀戀甀琀攀开挀漀洀瀀爀椀猀攀猀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [file_attr].[file_multi_select_list_names] ([file_ms_list_id])਀䜀伀 
ALTER TABLE [file_attr].[file_multi_select_links] CHECK CONSTRAINT [FK_file_has_multi_select_list]਀䜀伀 
ALTER TABLE [file_attr].[file_multi_select_links]  WITH CHECK ADD  CONSTRAINT [FK_file_ms_attr_and_list] FOREIGN KEY([file_ms_attr_id], [file_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀猀开愀琀琀爀开愀渀搀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀开昀椀氀攀开栀愀猀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [file_attr].[file_multi_select_links] CHECK CONSTRAINT [FK_file_multi_select_links_file_has_file_id]਀䜀伀 
ALTER TABLE [file_attr].[file_radio_button_attributes]  WITH CHECK ADD  CONSTRAINT [FK_file_rb_attrib_comprises_list] FOREIGN KEY([file_radiob_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
ON UPDATE CASCADE਀䜀伀 
ALTER TABLE [file_attr].[file_radio_button_attributes] CHECK CONSTRAINT [FK_file_rb_attrib_comprises_list]਀䜀伀 
ALTER TABLE [file_attr].[file_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_file_has_radio_button_list] FOREIGN KEY([file_radiob_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开氀椀渀欀攀搀开琀漀开爀愀搀椀漀戀开愀琀琀爀椀戀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [file_attr].[file_radio_button_links] CHECK CONSTRAINT [FK_file_linked_to_radiob_attrib_link]਀䜀伀 
ALTER TABLE [file_attr].[file_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_radiob_attrib_assigned_to_file__link] FOREIGN KEY([file_radiob_attr_id], [file_radiob_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开爀愀搀椀漀戀开愀琀琀爀椀戀开愀猀猀椀最渀攀搀开琀漀开昀椀氀攀开开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀开琀漀开愀琀琀爀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀⤀ 
REFERENCES [file_attr].[file_radio_button_attributes] ([file_radiob_attr_id])਀䜀伀 
ALTER TABLE [file_attr].[file_radiob_attr_fgroup_links] CHECK CONSTRAINT [FK_file_radiob_attr_fgroup_link_to_attr_id]਀䜀伀 
ALTER TABLE [file_attr].[file_radiob_attr_fgroup_links]  WITH CHECK ADD  CONSTRAINT [FK_file_radiob_attr_fgroup_link_to_filter_group] FOREIGN KEY([filter_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀 ⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀开琀漀开昀椀氀琀攀爀开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀开栀愀猀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀甀渀椀琀开椀搀崀⤀ 
REFERENCES [base].[units_of_measure] ([unit_id])਀䜀伀 
ALTER TABLE [file_attr].[file_real_number_field_names] CHECK CONSTRAINT [FK_file_real_number_field_name_has_unit_of_measure]਀䜀伀 
ALTER TABLE [file_attr].[file_real_number_values]  WITH CHECK ADD  CONSTRAINT [FK_file_real_field_has_name] FOREIGN KEY([file_real_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀攀愀氀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀开栀愀猀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [file_attr].[file_real_number_values] CHECK CONSTRAINT [FK_file_real_number_values_has_file_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_comnts_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_booking_comments_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀渀琀猀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀洀攀渀琀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_date_links] CHECK CONSTRAINT [FK_form_doc_booking_date_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_id_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_booking_id_links_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_release_links] CHECK CONSTRAINT [FK_form_doc_booking_release_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_status_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_booking_status_link_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_user_id_links] CHECK CONSTRAINT [FK_form_doc_booking_user_id_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_usernm_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_booking_username_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀愀洀攀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_lists] ([common_object_list_id], [common_object_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_defaults] CHECK CONSTRAINT [FK_form_doc_com_obj_ms_default_common_object_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_com_obj_ms_default_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀开漀开洀猀开氀椀猀琀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_list_names] ([common_object_list_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_lst_links] CHECK CONSTRAINT [FK_form_doc_c_o_ms_list_link]਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_com_obj_ms_list] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀开挀漀洀洀漀渀开漀戀樀攀挀琀开搀攀昀愀甀氀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_lists] ([common_object_list_id], [common_object_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_rb_lst_links] CHECK CONSTRAINT [FK_form_doc_com_obj_rb_lst_links_common_object_default]਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_rb_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_com_obj_rb_lst_links_common_object_list] FOREIGN KEY([common_object_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀开挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀椀猀琀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_rb_lst_links] CHECK CONSTRAINT [FK_form_has_doc_com_obj_rb_list_link]਀䜀伀 
ALTER TABLE [forms].[form_doc_created_by_id_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_created_by_id_links_form_identifier_names] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_created_by_nm_links] CHECK CONSTRAINT [FK_form_doc_created_by_nm_links_form_identifier_names]਀䜀伀 
ALTER TABLE [forms].[form_doc_created_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_created_link] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开 搀漀挀开搀愀琀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_date_field_links] CHECK CONSTRAINT [FK_form_has_ doc_date]਀䜀伀 
ALTER TABLE [forms].[form_doc_date_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_date_field] FOREIGN KEY([doc_date_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开搀愀琀攀开昀椀攀氀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_free_text_field_names] ([doc_free_text_name_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_free_text_field_links] CHECK CONSTRAINT [FK_form_doc_free_text_name_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_free_text_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_free_text] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开昀爀攀攀开琀攀砀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_function_links] CHECK CONSTRAINT [FK_form_doc_function_links_general_field_names]਀䜀伀 
ALTER TABLE [forms].[form_doc_function_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_function_links_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_function_list_links] CHECK CONSTRAINT [FK_form_doc_function_list_links_general_field_names]਀䜀伀 
ALTER TABLE [forms].[form_doc_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_function_list_links_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开椀渀琀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀渀琀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_integer_field_names] ([doc_int_name_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_integer_field_links] CHECK CONSTRAINT [FK_form_doc_int_name_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_integer_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_int] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开椀渀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_lock_status_links] CHECK CONSTRAINT [FK_form_has_doc_lock_status_link]਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_multi_sel_defaults_doc_multi_select_attributes] FOREIGN KEY([doc_ms_attr_id], [doc_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_defaults] CHECK CONSTRAINT [FK_form_doc_multi_sel_defaults_form_identifier_names]਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_multi_select_list_id] FOREIGN KEY([doc_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_list_links] CHECK CONSTRAINT [FK_form_has_doc_multi_select]਀䜀伀 
ALTER TABLE [forms].[form_doc_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_people_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_people_list_links] CHECK CONSTRAINT [FK_form_doc_people_list_links_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_radio_button_has_default] FOREIGN KEY([default_doc_rb_attr_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开栀愀猀开搀攀昀愀甀氀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开爀愀搀椀漀戀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links] CHECK CONSTRAINT [FK_form_has_doc_radiob]਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_radiob_list] FOREIGN KEY([doc_radiob_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开爀愀搀椀漀戀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开爀攀愀氀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_real_number_field_names] ([doc_real_name_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_real_number_links] CHECK CONSTRAINT [FK_form_doc_real_name_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_real_number_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_real] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开爀攀愀氀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开椀搀开栀愀猀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_transaction_grp_links] CHECK CONSTRAINT [FK_form_id_has_transaction_group]਀䜀伀 
ALTER TABLE [forms].[form_doc_user_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_user_links_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_user_links] CHECK CONSTRAINT [FK_form_doc_user_links_has_general_field_name_id]਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_ms_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_file_com_obj_ms_defaults_common_objects] FOREIGN KEY([common_object_list_id], [common_object_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀开挀漀洀洀漀渀开漀戀樀攀挀琀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_ms_defaults] CHECK CONSTRAINT [FK_form_file_com_obj_ms_defaults_form_id]਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_ms_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_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_file_com_obj_ms_lst_links] CHECK CONSTRAINT [FK_form_has_file_com_obj]਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_rb_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_c_o_rb_list_link] FOREIGN KEY([common_object_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀开漀开爀戀开氀椀猀琀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀开搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_lists] ([common_object_list_id], [common_object_id])਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_rb_lst_links] CHECK CONSTRAINT [FK_form_file_com_obj_rb_lst_links_default_common_object]਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_rb_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_to_com_obj_rb_lst_link] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_content_hash_links] CHECK CONSTRAINT [FK_form_has_content_hash_link]਀䜀伀 
ALTER TABLE [forms].[form_file_created_by_id_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_created_by_id_links_form_identifier_names] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_created_by_nm_links] CHECK CONSTRAINT [FK_form_file_created_by_nm_links_form_identifier_names]਀䜀伀 
ALTER TABLE [forms].[form_file_created_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_created_link] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [file_attr].[file_date_field_names] ([file_date_name_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_date_field_links] CHECK CONSTRAINT [FK_form_file_date_name_id]਀䜀伀 
ALTER TABLE [forms].[form_file_date_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_date] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开搀愀琀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [file_attr].[file_free_text_field_names] ([file_free_text_name_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_free_text_links] CHECK CONSTRAINT [FK_form_file_free_text_name_id]਀䜀伀 
ALTER TABLE [forms].[form_file_free_text_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_free_text] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开昀爀攀攀开琀攀砀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [forms].[form_file_function_links] CHECK CONSTRAINT [FK_form_file_function_links_general_field_names]਀䜀伀 
ALTER TABLE [forms].[form_file_function_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_function_links_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [forms].[form_file_function_list_links] CHECK CONSTRAINT [FK_form_file_function_list_links_general_field_names]਀䜀伀 
ALTER TABLE [forms].[form_file_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_function_list_links_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [file_attr].[file_integer_field_names] ([file_int_name_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_integer_field_links] CHECK CONSTRAINT [FK_form_file_int_name_id]਀䜀伀 
ALTER TABLE [forms].[form_file_integer_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_int] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开椀渀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀开椀猀开搀攀昀愀甀氀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [file_attr].[file_multi_select_attributes] ([file_ms_attr_id], [file_ms_list_id])਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_defaults] CHECK CONSTRAINT [FK_file_multi_select_attr_is_default]਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_ms_defaults] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开洀猀开搀攀昀愀甀氀琀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [file_attr].[file_multi_select_list_names] ([file_ms_list_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_list_links] CHECK CONSTRAINT [FK_form_file_multi_select_list_id]਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_multi_select] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀渀愀洀攀开氀椀渀欀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_name_links] CHECK CONSTRAINT [FK_form_has_filename_links]਀䜀伀 
ALTER TABLE [forms].[form_file_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_people_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_people_list_links] CHECK CONSTRAINT [FK_form_file_people_list_links_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_radio_button_links_default] FOREIGN KEY([default_file_rb_attr_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀开搀攀昀愀甀氀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [file_attr].[file_radio_button_list_names] ([file_radiob_list_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links] CHECK CONSTRAINT [FK_form_file_radiob_list_id]਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_radiob] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开爀愀搀椀漀戀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [file_attr].[file_real_number_field_names] ([file_real_name_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_real_number_links] CHECK CONSTRAINT [FK_form_file_real_name_id]਀䜀伀 
ALTER TABLE [forms].[form_file_real_number_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_real] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开爀攀愀氀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_retention_date_links] CHECK CONSTRAINT [FK_form_file_retention_date_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_file_size_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_size_links] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀开氀椀渀欀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_transactn_grp_links] CHECK CONSTRAINT [FK_form_has_file_transaction_status_links]਀䜀伀 
ALTER TABLE [forms].[form_file_user_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_user_links_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [forms].[form_file_user_links] CHECK CONSTRAINT [FK_form_file_user_links_has_general_field_name_id]਀䜀伀 
ALTER TABLE [forms].[form_identifier_names]  WITH CHECK ADD  CONSTRAINT [FK_form_belongs_to_form_group] FOREIGN KEY([form_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开戀攀氀漀渀最猀开琀漀开昀漀爀洀开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀开搀漀挀开琀愀最猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开椀搀崀⤀ 
REFERENCES [tagging].[doc_tags] ([tag_id])਀䜀伀 
ALTER TABLE [forms].[form_tag_defaults] CHECK CONSTRAINT [FK_form_tag_defaults_doc_tags]਀䜀伀 
ALTER TABLE [forms].[form_tag_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_tag_defaults_form_identifier_names] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开昀椀攀氀搀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开琀愀最猀开昀椀攀氀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_tag_fields] CHECK CONSTRAINT [FK_form_has_tags_field]਀䜀伀 
ALTER TABLE [forms].[form_tag_group_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_has_tag_group_field] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开最爀漀甀瀀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开琀愀最开最爀漀甀瀀开昀椀攀氀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开最爀漀甀瀀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开戀攀氀漀渀最猀开琀漀开昀漀爀洀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [tagging].[tag_group_identifier_names] ([tag_group_id])਀䜀伀 
ALTER TABLE [forms].[form_tag_group_defaults] CHECK CONSTRAINT [FK_tag_group_belongs_to_form]਀䜀伀 
ALTER TABLE [forms].[form_tag_group_fields]  WITH CHECK ADD  CONSTRAINT [FK_form_has_tag_group] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开最爀漀甀瀀开昀椀攀氀搀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开琀愀最开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开洀攀猀猀愀最攀开搀攀琀愀椀氀开栀愀猀开氀愀渀最甀愀最攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀氀愀渀最甀愀最攀开椀搀崀⤀ 
REFERENCES [messaging].[language_list] ([language_id])਀䜀伀 
ALTER TABLE [messaging].[message_details] CHECK CONSTRAINT [FK_message_detail_has_language]਀䜀伀 
ALTER TABLE [messaging].[message_details]  WITH CHECK ADD  CONSTRAINT [FK_message_id_has_details] FOREIGN KEY([message_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开洀攀猀猀愀最攀开椀搀开栀愀猀开搀攀琀愀椀氀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开搀漀挀开栀愀猀开搀漀挀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[doc_to_function_links] CHECK CONSTRAINT [FK_doc_to_function_links_doc_has_doc_id]਀䜀伀 
ALTER TABLE [people].[doc_to_function_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_to_function_links_has_function_id] FOREIGN KEY([function_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀甀渀挀琀椀漀渀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀氀攀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [people].[doc_to_function_links] CHECK CONSTRAINT [FK_doc_to_function_links_has_general_file_name_id]਀䜀伀 
ALTER TABLE [people].[doc_to_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_function_list_link_has_doc_id] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀开栀愀猀开搀漀挀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [people].[doc_to_function_list_links] CHECK CONSTRAINT [FK_doc_to_function_list_links_has_general_field_name_id]਀䜀伀 
ALTER TABLE [people].[doc_to_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_function_list_is_linked_to_document] FOREIGN KEY([function_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[doc_to_function_list_links] CHECK CONSTRAINT [FK_function_list_is_linked_to_document]਀䜀伀 
ALTER TABLE [people].[doc_to_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_person_list_link_has_doc_id] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开瀀攀爀猀漀渀开氀椀猀琀开氀椀渀欀开栀愀猀开搀漀挀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [people].[doc_to_people_list_links] CHECK CONSTRAINT [FK_doc_to_people_list_links_general_field_names]਀䜀伀 
ALTER TABLE [people].[doc_to_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_people_list_is_linked_to_document] FOREIGN KEY([people_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[doc_to_people_list_links] CHECK CONSTRAINT [FK_people_list_is_linked_to_document]਀䜀伀 
ALTER TABLE [people].[doc_to_user_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_to_user_links_has_doc_id] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开搀漀挀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [people].[doc_to_user_links] CHECK CONSTRAINT [FK_doc_to_user_links_has_general_field_name_id]਀䜀伀 
ALTER TABLE [people].[doc_to_user_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_to_user_links_has_user_id] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开甀猀攀爀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开猀椀搀开氀椀渀欀开琀漀开甀猀攀爀开昀甀渀挀琀椀漀渀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [people].[duty_function_sid_links] CHECK CONSTRAINT [FK_sid_link_to_user_function]਀䜀伀 
ALTER TABLE [people].[duty_function_sid_links]  WITH CHECK ADD  CONSTRAINT [FK_user_function_link_to_sid] FOREIGN KEY([function_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开甀猀攀爀开昀甀渀挀琀椀漀渀开氀椀渀欀开琀漀开猀椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [people].[file_to_function_links] CHECK CONSTRAINT [FK_file_to_function_links_general_field_names]਀䜀伀 
ALTER TABLE [people].[file_to_function_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_function_links_has_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀甀渀挀琀椀漀渀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
REFERENCES [people].[duty_functions] ([function_id])਀䜀伀 
ALTER TABLE [people].[file_to_function_links] CHECK CONSTRAINT [FK_file_to_function_links_has_function_id]਀䜀伀 
ALTER TABLE [people].[file_to_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_file_function_list_link_has_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀开栀愀猀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [people].[file_to_function_list_links] CHECK CONSTRAINT [FK_file_to_function_list_links_general_field_names]਀䜀伀 
ALTER TABLE [people].[file_to_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_function_list_is_linked_to_fileid] FOREIGN KEY([function_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[file_to_function_list_links] CHECK CONSTRAINT [FK_function_list_is_linked_to_fileid]਀䜀伀 
ALTER TABLE [people].[file_to_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_file_person_list_link_has_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开瀀攀爀猀漀渀开氀椀猀琀开氀椀渀欀开栀愀猀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [people].[file_to_people_list_links] CHECK CONSTRAINT [FK_file_to_people_list_links_general_field_names]਀䜀伀 
ALTER TABLE [people].[file_to_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_people_list_is_linked_to_file] FOREIGN KEY([people_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[file_to_people_list_links] CHECK CONSTRAINT [FK_people_list_is_linked_to_file]਀䜀伀 
ALTER TABLE [people].[file_to_user_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_user_links_has_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开最攀渀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [people].[file_to_user_links] CHECK CONSTRAINT [FK_file_to_user_links_has_gen_field_name_id]਀䜀伀 
ALTER TABLE [people].[file_to_user_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_user_links_has_sid_id] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开猀椀搀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀甀渀挀琀椀漀渀开戀攀氀漀渀最猀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
REFERENCES [people].[duty_functions] ([function_id])਀䜀伀 
ALTER TABLE [people].[function_lists] CHECK CONSTRAINT [FK_function_belongs_to_function_list]਀䜀伀 
ALTER TABLE [people].[function_lists]  WITH CHECK ADD  CONSTRAINT [FK_function_list_has_function_list_name] FOREIGN KEY([function_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀甀渀挀琀椀漀渀开氀椀猀琀开栀愀猀开昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀开栀愀猀开瀀攀爀猀漀渀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[people_list_names] ([people_list_id])਀䜀伀 
ALTER TABLE [people].[people_lists] CHECK CONSTRAINT [FK_people_list_name_has_person]਀䜀伀 
ALTER TABLE [people].[people_lists]  WITH CHECK ADD  CONSTRAINT [FK_people_lists_sid_id] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀猀开猀椀搀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀开栀愀猀开猀椀搀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [tagging].[tag_browsing_tree_names] CHECK CONSTRAINT [FK_tag_browsing_tree_names_has_sid_id]਀䜀伀 
ALTER TABLE [tagging].[tag_browsing_tree_nodes]  WITH CHECK ADD  CONSTRAINT [FK_tag_browsing_tree_has_nodes] FOREIGN KEY([tag_browsing_tree_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开栀愀猀开渀漀搀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀猀开琀愀最崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开椀搀崀⤀ 
REFERENCES [tagging].[doc_tags] ([tag_id])਀䜀伀 
ALTER TABLE [tagging].[tag_browsing_tree_nodes] CHECK CONSTRAINT [FK_tag_browsing_tree_node_is_tag]਀䜀伀 
ALTER TABLE [tagging].[tag_to_document_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_tag] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开琀愀最崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开搀漀挀开氀椀渀欀开琀愀最开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开椀搀崀⤀ 
REFERENCES [tagging].[doc_tags] ([tag_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开搀漀挀开氀椀渀欀开琀愀最开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开栀愀猀开琀愀最开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开椀搀崀⤀ 
REFERENCES [tagging].[doc_tags] ([tag_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [tagging].[tag_to_tag_group_links] CHECK CONSTRAINT [FK_tag_has_tag_group]਀䜀伀 
ALTER TABLE [tagging].[tag_to_tag_group_links]  WITH CHECK ADD  CONSTRAINT [FK_tag_to_taggroup_link_tag_group_id] FOREIGN KEY([tag_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀琀愀最开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀漀开琀愀最最爀漀甀瀀开氀椀渀欀开琀愀最开最爀漀甀瀀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开渀漀搀攀猀开搀漀挀开琀愀最猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开椀搀崀⤀ 
REFERENCES [tagging].[doc_tags] ([tag_id])਀䜀伀 
ALTER TABLE [tagging].[tag_tree_nodes] CHECK CONSTRAINT [FK_tag_tree_nodes_doc_tags]਀䜀伀 
ALTER TABLE [tagging].[tag_tree_nodes]  WITH CHECK ADD  CONSTRAINT [FK_tag_tree_nodes_tag_trees] FOREIGN KEY([tag_tree_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开琀爀攀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开渀漀搀攀猀开琀愀最开琀爀攀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀开栀愀猀开猀椀搀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [user_restr].[authoriser_privilege_requests] CHECK CONSTRAINT [FK_authoriser_privilege_requests_has_sid_id]਀䜀伀 
ALTER TABLE [user_restr].[authorisers]  WITH CHECK ADD  CONSTRAINT [FK_sid_is_authoriser] FOREIGN KEY([authoriser_sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开猀椀搀开椀猀开愀甀琀栀漀爀椀猀攀爀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [xref].[controller_doc_group_names] ([controller_doc_group_name_id])਀䜀伀 
ALTER TABLE [user_restr].[controller_doc_group_sid_links] CHECK CONSTRAINT [FK_controller_doc_group_sid_links_controller_doc_group_name_id]਀䜀伀 
ALTER TABLE [user_restr].[controller_doc_group_sid_links]  WITH CHECK ADD  CONSTRAINT [FK_controller_doc_group_sid_links_sid_id] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀开猀椀搀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [xref].[controller_file_group_names] ([controller_file_group_name_id])਀䜀伀 
ALTER TABLE [user_restr].[controller_file_grp_sid_links] CHECK CONSTRAINT [FK_controller_file_grp_sid_links_controller_file_grp_name_id]਀䜀伀 
ALTER TABLE [user_restr].[controller_file_grp_sid_links]  WITH CHECK ADD  CONSTRAINT [FK_controller_file_grp_sid_links_sid_id] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀开猀椀搀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开椀猀开氀椀渀欀攀搀开琀漀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀开搀甀琀礀开昀甀渀挀琀椀漀渀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [xref].[doc_group_names] ([doc_group_id])਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_funct_lst] CHECK CONSTRAINT [FK_doc_group_is_linked_to_edit_permission_duty_function_list]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_funct_lst]  WITH CHECK ADD  CONSTRAINT [FK_duty_function_list_is_linked_to_document_group_edit_permission] FOREIGN KEY([function_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀甀琀礀开昀甀渀挀琀椀漀渀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开搀漀挀甀洀攀渀琀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开椀猀开氀椀渀欀攀搀开琀漀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀开瀀攀漀瀀氀攀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [xref].[doc_group_names] ([doc_group_id])਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_people_lst] CHECK CONSTRAINT [FK_doc_group_is_linked_to_edit_permission_people_list]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_people_lst]  WITH CHECK ADD  CONSTRAINT [FK_people_list_is_linked_to_doc_group_edit_permission] FOREIGN KEY([people_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开栀愀猀开瘀椀攀眀开爀攀猀琀爀椀挀琀椀漀渀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [xref].[doc_group_names] ([doc_group_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[doc_group_view_permissions] CHECK CONSTRAINT [FK_doc_group_has_view_restriction]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_view_permissions]  WITH CHECK ADD  CONSTRAINT [FK_doc_group_view_permissions_has_sid] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀开栀愀猀开猀椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀甀琀礀开昀甀渀挀琀椀漀渀开氀椀猀琀开栀愀猀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[function_list_names] ([function_list_id])਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_funct_lst] CHECK CONSTRAINT [FK_duty_function_list_has_file_group_edit_permission]਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_funct_lst]  WITH CHECK ADD  CONSTRAINT [FK_file_group_has_edit_permission_function_list] FOREIGN KEY([file_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开最爀漀甀瀀开栀愀猀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀开昀甀渀挀琀椀漀渀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开最爀漀甀瀀开栀愀猀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀开瀀攀漀瀀氀攀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [xref].[file_group_names] ([file_group_id])਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_ppl_lst] CHECK CONSTRAINT [FK_file_group_has_edit_permission_people_list]਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_ppl_lst]  WITH CHECK ADD  CONSTRAINT [FK_people_list_has_file_group_edit_permission] FOREIGN KEY([people_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开栀愀猀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开漀眀渀攀爀猀开栀愀猀开猀椀搀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [user_restr].[form_group_owners] CHECK CONSTRAINT [FK_form_owners_has_sid_id]਀䜀伀 
ALTER TABLE [user_restr].[form_group_owners]  WITH CHECK ADD  CONSTRAINT [FK_user_owns_form_group] FOREIGN KEY([form_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开最爀漀甀瀀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开甀猀攀爀开漀眀渀猀开昀漀爀洀开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开昀氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[function_list_names] ([function_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开昀氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀⤀ 
REFERENCES [tagging].[tag_browsing_tree_names] ([tag_browsing_tree_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开戀爀漀眀猀椀渀最开琀爀攀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀⤀ 
REFERENCES [tagging].[tag_browsing_tree_names] ([tag_browsing_tree_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开戀爀漀眀猀椀渀最开琀爀攀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开瀀氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[people_list_names] ([people_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开瀀氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开昀甀渀挀琀椀漀渀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[function_list_names] ([function_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开昀甀渀挀琀椀漀渀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开琀愀最开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [tagging].[tag_group_identifier_names] ([tag_group_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开琀愀最开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开琀愀最开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [tagging].[tag_group_identifier_names] ([tag_group_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开琀愀最开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[people_list_names] ([people_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开昀氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[function_list_names] ([function_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开昀氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开琀愀最开琀爀攀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开琀爀攀攀开椀搀崀⤀ 
REFERENCES [tagging].[tag_tree_names] ([tag_tree_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开栀愀猀开琀愀最开琀爀攀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开瀀氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[people_list_names] ([people_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开瀀氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开琀愀最开琀爀攀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开琀爀攀攀开椀搀崀⤀ 
REFERENCES [tagging].[tag_tree_names] ([tag_tree_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开栀愀猀开琀愀最开琀爀攀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开爀漀氀攀开氀椀渀欀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开爀漀氀攀开栀愀猀开甀猀攀爀开猀椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [user_restr].[user_role_link] CHECK CONSTRAINT [FK_role_has_user_sid]਀䜀伀 
ALTER TABLE [user_restr].[user_role_link]  WITH CHECK ADD  CONSTRAINT [FK_user_has_role] FOREIGN KEY([role_name])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀爀漀氀攀开氀椀猀琀崀 ⠀嬀爀漀氀攀开渀愀洀攀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开爀漀氀攀开氀椀渀欀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开甀猀攀爀开栀愀猀开爀漀氀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开愀渀搀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开琀漀开昀椀氀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀Ⰰ 嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
REFERENCES [workflow_instances].[workflow_step_duty_functions] ([workflow_instance_step_id], [function_id])਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_function_output_files] CHECK CONSTRAINT [FK_workflow_instance_step_and_function_links_to_file]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_function_output_files]  WITH CHECK ADD  CONSTRAINT [FK_workflow_instance_step_has_file_output] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开栀愀猀开昀椀氀攀开漀甀琀瀀甀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀甀洀攀渀琀开栀愀猀开眀漀爀欀昀氀漀眀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_instance_definitions] CHECK CONSTRAINT [FK_document_has_workflow]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_instance_steps]  WITH CHECK ADD  CONSTRAINT [FK_workflow_definition_has_step] FOREIGN KEY([workflow_instance_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀崀 ⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_instance_steps] CHECK CONSTRAINT [FK_workflow_definition_has_step]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_instance_steps]  WITH CHECK ADD  CONSTRAINT [FK_workflow_step_has_status] FOREIGN KEY([step_status_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀崀 ⠀嬀猀琀攀瀀开猀琀愀琀甀猀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_instance_steps] CHECK CONSTRAINT [FK_workflow_step_has_status]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_person_output_files]  WITH CHECK ADD  CONSTRAINT [FK_workflow_person_output_files_has_file] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀开栀愀猀开昀椀氀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开愀渀搀开瀀愀爀琀椀挀椀瀀愀渀琀开栀愀猀开漀甀琀瀀甀琀开昀椀氀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀Ⰰ 嬀猀椀搀开椀搀崀⤀ 
REFERENCES [workflow_instances].[workflow_step_participants] ([workflow_instance_step_id], [sid_id])਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_person_output_files] CHECK CONSTRAINT [FK_workflow_step_and_participant_has_output_file]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_duty_functions]  WITH CHECK ADD  CONSTRAINT [FK_duty_function_belongs_to_workflow_step] FOREIGN KEY([function_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀甀琀礀开昀甀渀挀琀椀漀渀开戀攀氀漀渀最猀开琀漀开眀漀爀欀昀氀漀眀开猀琀攀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开栀愀猀开搀甀琀礀开昀甀渀挀琀椀漀渀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀⤀ 
REFERENCES [workflow_instances].[workflow_instance_steps] ([workflow_instance_step_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开栀愀猀开搀甀琀礀开昀甀渀挀琀椀漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀开栀愀猀开漀甀琀瀀甀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀漀甀琀瀀甀琀开椀搀崀⤀ 
REFERENCES [workflow_instances].[workflow_output_definitions] ([output_id])਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_duty_functions] CHECK CONSTRAINT [FK_workflow_step_duty_function_has_output]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_input_files]  WITH CHECK ADD  CONSTRAINT [FK_workflow_step_has_input_files] FOREIGN KEY([workflow_input_step_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀崀 ⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_input_files] CHECK CONSTRAINT [FK_workflow_step_has_input_files]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_participants]  WITH CHECK ADD  CONSTRAINT [FK_person_is_workflow_participant] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀爀猀漀渀开椀猀开眀漀爀欀昀氀漀眀开瀀愀爀琀椀挀椀瀀愀渀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开漀甀琀瀀甀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀漀甀琀瀀甀琀开椀搀崀⤀ 
REFERENCES [workflow_instances].[workflow_output_definitions] ([output_id])਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_participants] CHECK CONSTRAINT [FK_workflow_step_has_output]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_participants]  WITH CHECK ADD  CONSTRAINT [FK_workflow_step_has_participant] FOREIGN KEY([workflow_instance_step_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀崀 ⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_participants] CHECK CONSTRAINT [FK_workflow_step_has_participant]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_track_log]  WITH CHECK ADD  CONSTRAINT [FK_workflow_track_log_to_log_index] FOREIGN KEY([wf_log_index_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开椀渀搀攀砀崀 ⠀嬀眀昀开氀漀最开椀渀搀攀砀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_track_log] CHECK CONSTRAINT [FK_workflow_track_log_to_log_index]਀䜀伀 
ALTER TABLE [workflow_models].[workflow_rule_links]  WITH CHECK ADD  CONSTRAINT [FK_workflow_step_has_rule] FOREIGN KEY([rule_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开爀甀氀攀猀崀 ⠀嬀爀甀氀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开爀甀氀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀崀⤀ 
REFERENCES [workflow_models].[workflow_actions] ([workflow_action_id])਀䜀伀 
ALTER TABLE [workflow_models].[workflow_step_transitions] CHECK CONSTRAINT [FK_workflow_action_id]਀䜀伀 
ALTER TABLE [xref].[controller_doc_group_links]  WITH CHECK ADD  CONSTRAINT [FK_controller_doc_group_links_controller_doc_group_name] FOREIGN KEY([controller_doc_group_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀开搀漀挀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [xref].[controller_doc_group_links] CHECK CONSTRAINT [FK_controller_doc_group_links_doc_id]਀䜀伀 
ALTER TABLE [xref].[controller_file_group_links]  WITH CHECK ADD  CONSTRAINT [FK_controller_file_group_links_controller_file_group_name_id] FOREIGN KEY([controller_file_group_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [xref].[controller_file_group_links] CHECK CONSTRAINT [FK_controller_file_group_links_controller_file_id]਀䜀伀 
ALTER TABLE [xref].[doc_cross_references]  WITH CHECK ADD  CONSTRAINT [FK_doc_cross_references_xref_doc_id] FOREIGN KEY([xref_doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀开砀爀攀昀开搀漀挀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开砀爀攀昀开琀漀开砀爀攀昀开琀礀瀀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀砀爀攀昀开琀礀瀀攀开椀搀崀⤀ 
REFERENCES [xref].[cross_reference_types] ([xref_type_id])਀䜀伀 
ALTER TABLE [xref].[doc_cross_references] CHECK CONSTRAINT [FK_doc_xref_to_xref_type]਀䜀伀 
ALTER TABLE [xref].[doc_cross_references]  WITH CHECK ADD  CONSTRAINT [FK_source_doc_id] FOREIGN KEY([source_doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开猀漀甀爀挀攀开搀漀挀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开戀攀氀漀渀最猀开琀漀开搀漀挀开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [xref].[doc_group_links] CHECK CONSTRAINT [FK_doc_belongs_to_doc_group]਀䜀伀 
ALTER TABLE [xref].[doc_group_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_group_has_linked_document] FOREIGN KEY([doc_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀搀漀挀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开栀愀猀开氀椀渀欀攀搀开搀漀挀甀洀攀渀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀开最爀漀甀瀀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [xref].[file_group_names] ([file_group_id])਀䜀伀 
ALTER TABLE [xref].[file_group_links] CHECK CONSTRAINT [FK_file_group_link_group_id]਀䜀伀 
ALTER TABLE [xref].[file_group_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_file_group_link] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀甀洀攀渀琀开氀椀渀欀开琀漀开昀椀氀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀䜀伀 
ALTER TABLE [xref].[file_to_document_links] CHECK CONSTRAINT [FK_document_link_to_file]਀䜀伀 
ALTER TABLE [xref].[file_to_document_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_document_links_file_metadata] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
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਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䌀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开洀愀渀搀愀琀漀爀礀崀 
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਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开挀漀渀琀爀开搀挀开最爀瀀开甀猀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into user_restr.controller_doc_group_sid_links 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. 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_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 a matching record already 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 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  ਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 
		             (controller_doc_group_name_id,     sid_id,       notes, granted_by)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀Ⰰ  䀀甀猀攀爀开猀椀搀开椀搀Ⰰ 䀀椀渀瀀甀琀渀漀琀攀猀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀㬀  
਀ 
       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.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            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 [authorising].[usp_AUTHORISE_contr_fl_grp_usr]    Script Date: Tue 12-05-2026 5:43:19 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 a matching record already 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 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  ਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 
		             (controller_file_group_name_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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_AUTHORISE_doc_group_viewer]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 琀漀 愀甀琀栀漀爀椀猀攀 愀 甀猀攀爀 
-- to view a restricted document group. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ  
-- the viewer group id and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_AUTHORISE_doc_group_viewer] ਀ 
     @docgroupid bigint               = NULL,  -- 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਀ऀ     䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 
		    SET @docgroupid = NULL;਀ऀऀ 䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoDocGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀⸀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the document group exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀 
				                  FROM xref.doc_group_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'DocGroupIdNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					 ELSE ਀ऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ    䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF EXISTS (SELECT doc_group_id, sid_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀  
						 WHERE doc_group_id = @docgroupid਀ऀऀऀऀऀऀ       䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   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.doc_group_view_permissions਀ऀऀ             ⠀搀漀挀开最爀漀甀瀀开椀搀Ⰰ 猀椀搀开椀搀Ⰰ       渀漀琀攀猀Ⰰ       最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@docgroupid,  @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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_AUTHORISE_form_group_owner]    Script Date: Tue 12-05-2026 5:43:19 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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 　 
		    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਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ   䔀一䐀 
਀ऀ     䤀䘀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 　 
		    SET @formgroupid = NULL;਀ऀऀ 䤀䘀 䀀昀漀爀洀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFormGroupID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		     ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䜀爀漀甀瀀䤀䐀⸀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the form group exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀 
				                  FROM forms.form_group_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀昀漀爀洀最爀漀甀瀀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'FmGNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀漀爀洀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					 ELSE ਀ऀऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀洀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ    䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF EXISTS (SELECT form_group_id, sid_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀  
						 WHERE form_group_id = @formgroupid਀ऀऀऀऀऀऀ       䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   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.form_group_owners਀ऀऀ             ⠀昀漀爀洀开最爀漀甀瀀开椀搀Ⰰ 猀椀搀开椀搀Ⰰ                  渀漀琀攀猀Ⰰ 最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@formgroupid,  @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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_AUTHORISE_user_role]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 
-- to authorise a user for a particular role.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ  
-- and the role.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_AUTHORISE_user_role] ਀ 
     @role_to_add nvarchar(50)        = '',    -- Role to grant to the new user਀ऀ 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 @new_user_sid_id = 0਀ऀऀ    匀䔀吀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF NOT EXISTS (SELECT sid_id ਀ऀऀऀऀ  ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
					     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';਀ऀऀ   䔀一䐀 
਀            䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀 ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 猀椀搀 椀猀 渀漀琀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 猀椀搀 
				        FROM user_restr.sid_list AS sl਀                        圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀  
							AND sl.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 SelfAuth.');਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀        ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀漀氀攀 攀砀椀猀琀猀 
	     IF @role_to_add = ''਀ऀऀ    匀䔀吀 䀀爀漀氀攀开琀漀开愀搀搀 㴀 一唀䰀䰀㬀 
	     IF NOT EXISTS (SELECT role_name਀ऀऀ                  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀爀漀氀攀开氀椀猀琀  
						 WHERE role_name = @role_to_add)਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀漀氀攀一漀琀䔀砀椀猀琀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ' | ', ISNULL(@role_to_add, 'NULL'), '  ', @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RoleNotExist.');਀ 
		   END਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀漀氀攀开渀愀洀攀Ⰰ 猀椀搀开椀搀 
				   	      FROM user_restr.user_role_link ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀漀氀攀开渀愀洀攀 㴀 䀀爀漀氀攀开琀漀开愀搀搀 
						       AND 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';਀ऀऀऀ   䔀一䐀 
		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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   ਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 ⠀爀漀氀攀开渀愀洀攀Ⰰ     猀椀搀开椀搀Ⰰ         最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES                           (@role_to_add, @new_user_sid_id, @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਀ 
	  ਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_DEL_contr_doc_group_name]    Script Date: Tue 12-05-2026 5:43:19 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_doc_group_name] ਀ 
     @contr_doc_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_doc_group_names ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀    挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀  
							       = @contr_doc_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਀ 
਀ 
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  ਀ऀ     䐀䔀䰀䔀吀䔀  
		   FROM xref.controller_doc_group_names  ਀ऀऀ  圀䠀䔀刀䔀   挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀  
		        = @contr_doc_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਀ 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
 END -- END IF @userauthentication_status = 'Pass' ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开猀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Delete a record from user_restr.controller_doc_group_sid_linksser group where individual users਀ⴀⴀ 愀爀攀 愀搀搀攀搀 愀琀 琀栀攀 䄀挀琀椀瘀攀 䐀椀爀攀挀琀漀爀礀 氀攀瘀攀氀⸀ 
-- 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. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开猀椀搀崀  
਀     䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䌀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @user_sid_id bigint              = NULL,  -- User sid_id from the sid_list table਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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 NOT EXISTS (SELECT controller_doc_group_name_id, sid_id਀ऀऀऀऀ   ऀ          䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀  
						     WHERE controller_doc_group_name_id = @contr_doc_ed_grp_name_id਀ऀऀऀऀऀऀ           䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   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਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  ਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 ⴀⴀ 䌀爀攀愀琀攀 愀渀 愀甀搀椀琀 氀漀最 攀渀琀爀礀 
	              (privilege, privilege_name, sid_id, username, granted_on, granted_by, revoked_by)਀ऀ       嘀䄀䰀唀䔀匀 ⠀✀䌀漀渀琀爀漀氀氀攀爀 䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀✀Ⰰ 
		          (SELECT attr_name FROM xref.controller_doc_group_names਀ऀऀऀऀ                   圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀   
								 		 = @contr_doc_ed_grp_name_id),਀ऀऀ          䀀甀猀攀爀开猀椀搀开椀搀Ⰰ 
		          (SELECT username FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 
				                 WHERE  controller_doc_group_name_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 
										AND     sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
		          (SELECT granted_by 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 ਀ऀऀऀऀ    㴀 䀀甀猀攀爀开猀椀搀开椀搀㬀  
਀         䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 of IF authentication status = Pass.਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a controller level file 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.਀    䈀䔀䜀䤀一 
	-- Data validation਀     ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			 IF NOT EXISTS (SELECT controller_file_group_name_id਀ऀऀऀऀ   ऀ          䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀  
						     WHERE    controller_file_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_file_group_name_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਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开猀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Delete a record for user_restr.controller_file_grp_sid_links ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
-- 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਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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 NOT EXISTS (SELECT controller_file_group_name_id, sid_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀  
						 WHERE controller_file_group_name_id = @contr_file_ed_grp_name_id਀ऀऀऀऀऀऀ       䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   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਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ 
-- Execute the delete query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  BEGIN TRANSACTION;਀ 
	  INSERT INTO user_restr.user_privilege_revoke_log -- Create an audit log entry਀ऀ              ⠀瀀爀椀瘀椀氀攀最攀Ⰰ 瀀爀椀瘀椀氀攀最攀开渀愀洀攀Ⰰ 猀椀搀开椀搀Ⰰ 甀猀攀爀渀愀洀攀Ⰰ 最爀愀渀琀攀搀开漀渀Ⰰ 最爀愀渀琀攀搀开戀礀Ⰰ 爀攀瘀漀欀攀搀开戀礀⤀ 
	       VALUES ('Controller File Group',਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀 䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 
				                   WHERE controller_file_group_name_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀⤀Ⰰ 
		          @user_sid_id,਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 甀猀攀爀渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
		          (SELECT created FROM user_restr.controller_file_grp_sid_links਀ऀऀऀऀ                 圀䠀䔀刀䔀  挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀   
								 		= @contr_file_ed_grp_name_id਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀     猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 最爀愀渀琀攀搀开戀礀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 
				                WHERE  controller_file_group_name_id  ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 
										AND     sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
				  @username)਀ 
਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 
			   WHERE    controller_file_group_name_id  ਀ऀऀ             㴀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 
		             AND     sid_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਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_DEL_doc_group_viewer_perm]    Script Date: Tue 12-05-2026 5:43:19 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਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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 ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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 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 NotExist.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
਀       ⴀⴀ 䐀漀 渀漀琀 瀀攀爀洀椀琀 琀栀攀 氀愀猀琀 甀猀攀爀 琀漀 戀攀 爀攀洀漀瘀攀搀 甀渀氀攀猀猀 琀栀攀爀攀 愀爀攀 渀漀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 琀栀攀 最爀甀漀瀀 
	   -- Otherwise removing the last user will render all the previously-restricted documents in the group visible to all users.  ਀ऀ   䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	      BEGIN਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 渀甀洀戀攀爀 漀昀 氀椀渀欀攀搀 甀猀攀爀猀 椀猀 ㄀ 
			IF (਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀 䌀伀唀一吀⠀⨀⤀ 
				FROM (਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 吀伀倀 ⠀㈀⤀ ㄀ 䄀匀 挀漀氀 
					FROM user_restr.doc_group_view_permissions਀ऀऀऀऀ⤀ 䄀匀 琀 
			) = 1 )਀ 
			AND  -- Check if number of linked documents is > 0਀ऀऀऀ ⠀ 
				(SELECT COUNT(*)਀ऀऀऀऀ䘀刀伀䴀 ⠀ 
					SELECT TOP (2) 1 AS col਀ऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
					WHERE dgl.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 LastDocGrpViewer.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 ⴀⴀ 䌀爀攀愀琀攀 愀渀 愀甀搀椀琀 氀漀最 攀渀琀爀礀 
	              (privilege, privilege_name, sid_id, username, granted_on, granted_by, revoked_by)਀ऀ       嘀䄀䰀唀䔀匀 ⠀✀䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀✀Ⰰ 
		          (SELECT attr_name FROM xref.doc_group_names਀ऀऀऀऀ                   圀䠀䔀刀䔀 搀漀挀开最爀漀甀瀀开椀搀   
								 		= @docgroupid),਀ऀऀ          䀀甀猀攀爀开猀椀搀开椀搀Ⰰ 
		          (SELECT username FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 
				                 WHERE  doc_group_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀搀漀挀最爀漀甀瀀椀搀 
										AND     sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
		          (SELECT granted_by FROM user_restr.doc_group_view_permissions਀ऀऀऀऀ                 圀䠀䔀刀䔀  搀漀挀开最爀漀甀瀀开椀搀   
								 		= @docgroupid਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀     猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀऀऀ  䀀甀猀攀爀渀愀洀攀⤀ 
਀ 
	     DELETE FROM user_restr.doc_group_view_permissions਀               圀䠀䔀刀䔀     搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
			         AND       sid_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਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_DEL_form_group_owner]    Script Date: Tue 12-05-2026 5:43:19 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਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@recordnotexistmessage nvarchar(200) = '',     -- Communicates that the record does not਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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 a matching record does not exist਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀Ⰰ 猀椀搀开椀搀 
				   	          FROM user_restr.form_group_owners ਀ऀऀऀऀऀ    ऀ 圀䠀䔀刀䔀         昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
						           AND sid_id = @user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 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 ('Form Group Owner',਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 
				                   WHERE form_group_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀昀漀爀洀最爀漀甀瀀椀搀⤀Ⰰ 
		          @user_sid_id,਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 甀猀攀爀渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
		          (SELECT created FROM user_restr.form_group_owners਀ऀऀऀऀ                 圀䠀䔀刀䔀  昀漀爀洀开最爀漀甀瀀开椀搀   
								 		= @formgroupid਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀     猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 最爀愀渀琀攀搀开戀礀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 
				                 WHERE  form_group_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
										AND     sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
				  @username)਀ 
	     DELETE FROM user_restr.form_group_owners਀               圀䠀䔀刀䔀     昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
			         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.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  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;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_DEL_sid]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 刀攀瘀漀欀攀猀 愀 甀猀攀猀 昀爀漀洀 琀栀攀 猀礀猀琀攀洀 戀礀 爀攀瀀氀愀挀椀渀最 琀栀攀 猀椀搀 眀椀琀栀 愀 甀渀椀焀甀攀 戀甀琀 椀渀瘀愀氀椀搀 瘀愀氀甀攀⸀   
-- The user can be restored by copying the sid back from sid_restore. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 匀䤀䐀 䤀䐀⸀ 
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开猀椀搀崀  
਀     䀀猀椀搀爀攀挀漀爀搀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ    ⴀⴀ 匀䤀䐀 䤀䐀 爀攀挀漀爀搀 渀甀洀戀攀爀 ⠀渀漀琀 琀栀攀 匀䤀䐀⤀ 
	 @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਀ 
       -- End checking that the sid  is valid਀ 
	   -- Check if the sid is assigned a role as authoriser.  ਀       䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
	                FROM user_restr.authorisers਀ऀऀऀऀ   圀䠀䔀刀䔀 愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'IsAuthoriser', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀椀猀愀甀琀栀漀爀椀猀攀爀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀椀猀愀甀琀栀漀爀椀猀攀爀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀猀䄀甀琀栀漀爀椀猀攀爀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	-- Check if the user is already de-activated.਀      䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀  
			 	      FROM user_restr.sid_list ਀ऀऀऀऀ     圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀 
					   AND sid = 0) ਀ऀऀ   䈀䔀䜀䤀一 
			 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 UserDeactivated';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 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 ਀ 
	   BEGIN TRANSACTION;਀ 
	  INSERT INTO user_restr.user_privilege_revoke_log -- Create an audit log entry਀ऀ              ⠀瀀爀椀瘀椀氀攀最攀Ⰰ 瀀爀椀瘀椀氀攀最攀开渀愀洀攀Ⰰ 猀椀搀开椀搀Ⰰ 甀猀攀爀渀愀洀攀Ⰰ 最爀愀渀琀攀搀开漀渀Ⰰ 最爀愀渀琀攀搀开戀礀Ⰰ 爀攀瘀漀欀攀搀开戀礀⤀ 
	       VALUES ('SID',     'SID Revoked',       @sidrecordid, ਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 甀猀攀爀渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ 
		          (SELECT created FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @sidrecordid),਀ऀऀऀऀ  ✀✀Ⰰ 
				  @username)਀ 
਀ऀऀऀ唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
			SET sid =਀ऀऀऀऀⴀⴀ 䤀渀瘀愀氀椀搀 匀䤀䐀 漀渀 瀀甀爀瀀漀猀攀Ⰰ 戀甀琀 洀甀猀琀 戀攀 甀渀椀焀甀攀㨀 
				-- Revision = 0x00  (invalid, must be 1)਀ऀऀऀऀⴀⴀ 匀甀戀䄀甀琀栀漀爀椀琀礀䌀漀甀渀琀 㴀 　砀　㄀ 
				-- IdentifierAuthority = NULL (0x000000000000)਀ऀऀऀऀⴀⴀ 匀甀戀䄀甀琀栀漀爀椀琀礀嬀　崀 㴀 猀椀搀开椀搀 ⠀攀渀猀甀爀攀猀 甀渀椀焀甀攀渀攀猀猀⤀ 
				0x00                                   -- Revision (invalid)਀ऀऀऀ  ⬀ 　砀　㄀                                   ⴀⴀ 匀甀戀䄀甀琀栀漀爀椀琀礀 挀漀甀渀琀 
			  + 0x000000000000                         -- NULL identifier authority (invalid)਀ऀऀऀ  ⬀ 䌀䄀匀吀⠀猀椀搀开椀搀 䄀匀 䈀䤀一䄀刀夀⠀㐀⤀⤀              ⴀⴀ 唀渀椀焀甀攀 瀀愀礀氀漀愀搀 
			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_DEL_user_role]    Script Date: Tue 12-05-2026 5:43:19 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_to_delete 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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the require 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';਀ 
  -- 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.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			 IF NOT EXISTS (SELECT role_name, sid_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀  
						 WHERE role_name = @role_to_delete਀ऀऀऀऀऀऀ       䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   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 delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 ⴀⴀ 䌀爀攀愀琀攀 愀渀 愀甀搀椀琀 氀漀最 攀渀琀爀礀 
	              (privilege, privilege_name, sid_id, username, granted_on, granted_by, revoked_by)਀ऀ       嘀䄀䰀唀䔀匀 ⠀✀唀猀攀爀 刀漀氀攀✀Ⰰ 
		          (SELECT role_name FROM user_restr.user_role_link਀ऀऀऀऀ                   圀䠀䔀刀䔀   爀漀氀攀开渀愀洀攀   
								 		= @role_to_delete਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀 猀椀搀开椀搀  
										 = @user_sid_id_to_delete),਀ऀऀ           䀀甀猀攀爀开猀椀搀开椀搀开琀漀开搀攀氀攀琀攀Ⰰ 
		          (SELECT username FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @user_sid_id_to_delete),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀  
								 WHERE   role_name  ਀ऀऀऀऀऀऀऀऀ       㴀 䀀爀漀氀攀开琀漀开搀攀氀攀琀攀  
										AND sid_id ਀ऀऀऀऀऀऀऀऀऀऀ 㴀 䀀甀猀攀爀开猀椀搀开椀搀开琀漀开搀攀氀攀琀攀⤀Ⰰ 
		          (SELECT granted_by FROM user_restr.user_role_link ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀   爀漀氀攀开渀愀洀攀   
								       = @role_to_delete ਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀 猀椀搀开椀搀  
										 = @user_sid_id_to_delete),਀ऀऀऀऀ  䀀甀猀攀爀渀愀洀攀⤀ 
਀ 
	     DELETE ਀ऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀  
		  WHERE role_name  = @role_to_delete ਀ऀऀ        䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀开琀漀开搀攀氀攀琀攀㬀  
਀       䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_INS_contr_doc_group_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 挀漀渀琀爀漀氀氀攀爀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 渀愀洀攀 
-- by inserting a record into xref.controller_doc_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)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- 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਀ 
	  BEGIN TRANSACTION;਀ 
	     INSERT INTO xref.controller_doc_group_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description); ਀ऀ   
	  SET @newrecordid = SCOPE_IDENTITY();਀ 
	   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   = '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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document controller file group name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀⸀ 
-- Input is the parameters 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_file_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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- 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਀ 
	  BEGIN TRANSACTION;਀ 
	     INSERT INTO xref.controller_file_group_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description); ਀ 
	      SET @newrecordid = SCOPE_IDENTITY();਀ऀ    
	   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.');਀ 
		 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_grant_authoriser]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 䄀瀀瀀爀漀瘀攀猀 爀攀焀甀攀猀琀 昀漀爀 愀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀猀⸀    
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_INS_grant_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 connected username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@connectedusersid_id bigint          = NULL,  -- SID ID of the connected user.਀ऀऀ䀀猀甀戀樀攀挀琀开猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀          㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 甀猀攀爀 爀攀氀愀琀椀渀最 琀漀 琀栀攀 爀攀焀甀攀猀琀 ⸀  
		@subject_username nvarchar(128)      = '',  -- The username of the user to be granted authoriser privileges. ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 EXISTS (SELECT a.authoriser_sid_id 	     -- Check that the sid_id of the request is already 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 RecordExists.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
				   ELSE -- If it is not already in the list of authorisers, check that it is not the same as the approver.਀ऀऀऀऀ     䈀䔀䜀䤀一 
					   IF EXISTS (SELECT sl.sid_id਀ऀऀऀऀऀ                䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
								   WHERE sl.sid ਀ऀऀऀऀऀऀऀऀ         㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
									 AND sl.sid_id਀ऀऀऀऀऀऀऀऀऀ     㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
							BEGIN਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'UserSelfAuth', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
								 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 = '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 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 not 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 = 'Grant'਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀⤀ 
					  -- 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 = 'Grant'਀ऀऀऀऀऀऀऀऀऀऀऀऀऀ 䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀⤀ 
਀ऀऀऀऀऀऀऀ     䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
								              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਀ 
	  -- 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)਀ऀऀऀऀऀ匀䔀吀 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀 㴀 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀猀甀戀樀攀挀琀开猀椀搀⤀Ⰰ ✀✀⤀㬀 
			    IF NOT EXISTS (SELECT apr.request_id  -- If no record then create a new one and populate approver 1਀ऀऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
								WHERE apr.sid_id = @user_sid_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀琀礀瀀攀 㴀 ✀䜀爀愀渀琀✀ 
								  AND apr.status = 'Pending')਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
							  INSERT INTO user_restr.authoriser_privilege_requests਀ऀऀऀऀऀऀऀ              ⠀猀椀搀开椀搀Ⰰ       琀礀瀀攀Ⰰ    甀猀攀爀渀愀洀攀Ⰰ         愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀Ⰰ 愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㄀Ⰰ 愀瀀瀀爀漀瘀攀搀开漀渀开㄀Ⰰ 猀琀愀琀甀猀⤀ 
								   VALUES (@user_sid_id, 'Grant', @subject_username, @connectedusersid_id, @username,              SYSDATETIME(), 'Pending')਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'Approver1Complete', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀⤀㬀 
								 ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀瀀瀀爀漀瘀攀爀㄀䌀漀洀瀀氀攀琀攀⸀✀⤀㬀 
								 SET @transaction_status = 'Good';਀ऀऀऀऀऀऀऀ䔀一䐀 
					ELSE -- The record exists.  Update it with approver 2.਀ऀऀऀऀऀ  䈀䔀䜀䤀一 
					   UPDATE user_restr.authoriser_privilege_requests਀ऀऀऀऀऀ      匀䔀吀 愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀ 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀Ⰰ 
						      approved_by_username_2 = @username,਀ऀऀऀऀऀऀ      愀瀀瀀爀漀瘀攀搀开漀渀开㈀ 㴀 匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀Ⰰ 
						      status = 'Approved'਀ऀऀऀऀऀ    圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀 
						  EXEC internal.usp_AUTHORISE_authoriser਀ऀऀऀऀऀऀ       䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀Ⰰ 
							   @request_result = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 㴀 ✀倀愀猀猀✀ 
						    BEGIN਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'Success', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀Ⰰ ✀䄀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀猀 最爀愀渀琀攀搀✀⤀㬀 
								 ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
								 SET @transaction_status = 'Good';਀ऀऀ                   䔀一䐀 
						   ELSE਀ऀऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
									 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀瀀瀀爀漀瘀愀氀䘀愀椀氀攀搀✀Ⰰ  
										  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
										SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ApprovalFailed.');਀ऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
							   END						   ਀ऀऀऀऀऀ  䔀一䐀 
			  END਀ऀऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 攀砀椀猀琀猀 愀渀搀 椀猀 爀攀昀攀爀爀攀搀 琀漀 戀礀 䀀爀攀焀甀攀猀琀开椀搀⸀  倀漀瀀甀氀愀琀攀 愀瀀瀀爀漀瘀攀爀 ㈀⸀  
			    BEGIN਀ 
					  SET @subject_sid = (SELECT sl.sid਀ऀऀऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 愀猀 猀氀 
										   WHERE sl.sid_id = (SELECT apr.sid_id਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
															   WHERE apr.request_id = @request_id))਀ऀऀऀऀऀ  匀䔀吀 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀 㴀 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀猀甀戀樀攀挀琀开猀椀搀⤀Ⰰ ✀✀⤀㬀 
਀ऀऀऀऀऀ   唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 
					      SET approved_by_sid_id_2 = @connectedusersid_id,਀ऀऀऀऀऀऀ      愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㈀ 㴀 䀀甀猀攀爀渀愀洀攀Ⰰ 
						      approved_on_2 = SYSDATETIME(),਀ऀऀऀऀऀऀ      猀琀愀琀甀猀 㴀 ✀䄀瀀瀀爀漀瘀攀搀✀ 
					    WHERE request_id = @request_id਀ 
						  EXEC internal.usp_AUTHORISE_authoriser਀ऀऀऀऀऀऀ       䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀Ⰰ 
							   @request_result = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 㴀 ✀倀愀猀猀✀ 
						    BEGIN਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'Success', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀Ⰰ ✀䄀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀猀 最爀愀渀琀攀搀✀⤀㬀 
								 ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
								 SET @transaction_status = 'Good';਀ऀऀ                   䔀一䐀 
						   ELSE਀ऀऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
									 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀瀀瀀爀漀瘀愀氀䘀愀椀氀攀搀✀Ⰰ  
										  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
										SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ApprovalFailed.');਀ऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
							   END		਀ऀऀऀऀ䔀一䐀 
       COMMIT TRANSACTION;਀ 
   	  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 to revoke 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   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀऀऀ   䔀䰀匀䔀 ⴀⴀ 䤀昀 椀琀 椀猀 愀氀爀攀愀搀礀 椀渀 琀栀攀 氀椀猀琀 漀昀 愀甀琀栀漀爀椀猀攀爀猀Ⰰ 挀栀攀挀欀 琀栀愀琀 椀琀 椀猀 渀漀琀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 愀瀀瀀爀漀瘀攀爀⸀ 
				        -- Self revoking can result in the number of authorisers falling below two, resulting in the need for dba਀ऀऀऀऀऀऀⴀⴀ 猀甀瀀瀀漀爀琀 琀漀 爀攀ⴀ戀漀漀琀猀琀爀愀瀀 琀栀攀 愀甀琀栀漀爀椀猀攀爀猀 猀琀爀甀挀琀甀爀攀⸀ 
				     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 NoSelfRevoke.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								 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 = '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 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 = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
				-- Check current number of authorisers before proceeding with revocation਀ऀऀऀऀⴀⴀ 吀眀漀 愀甀琀栀漀爀椀猀攀爀猀 愀爀攀 爀攀焀甀椀爀攀搀 琀漀 最爀愀渀琀 瀀爀椀瘀椀氀攀最攀猀 琀漀 愀 渀攀眀 愀甀琀栀漀爀椀猀攀爀⸀   
				-- Therefore if there are not two authorisers then DBA access is required to re-bootstrap the authorisers. ਀ऀऀऀऀ䤀䘀 ⠀匀䔀䰀䔀䌀吀 䌀伀唀一吀⠀⨀⤀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀⤀ 㰀㴀 ㈀ 
					BEGIN਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'TooFewAuthorisers', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TooFewAuthorisers.');਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						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਀ 
	  BEGIN TRANSACTION਀ 
		    IF @request_id IS NULL AND @user_sid_id IS NOT NULL਀ऀऀऀ  䈀䔀䜀䤀一 ⴀⴀ 䤀昀 猀椀搀开椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 挀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
							   -- Retrieve the username of the user related to the request.਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀猀甀戀樀攀挀琀开猀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
													FROM user_restr.sid_list as sl਀ऀऀऀऀऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
								SET @subject_username = ISNULL(SUSER_SNAME(@subject_sid), '');਀ 
			    IF NOT EXISTS (SELECT apr.request_id  -- If no record then create a new one and populate approver 1਀ऀऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
								WHERE apr.sid_id = @user_sid_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀琀礀瀀攀 㴀 ✀刀攀瘀漀欀攀✀ 
								  AND apr.status = 'Pending')਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
							  INSERT INTO user_restr.authoriser_privilege_requests਀ऀऀऀऀऀऀऀ              ⠀猀椀搀开椀搀Ⰰ       琀礀瀀攀Ⰰ    愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀Ⰰ 愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㄀Ⰰ 愀瀀瀀爀漀瘀攀搀开漀渀开㄀Ⰰ 猀琀愀琀甀猀⤀ 
								   VALUES (@user_sid_id, 'Revoke', @connectedusersid_id, @username,              SYSDATETIME(), 'Pending')਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'Approver1Complete', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀⤀㬀 
								 ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀瀀瀀爀漀瘀攀爀㄀䌀漀洀瀀氀攀琀攀⸀✀⤀㬀 
								 SET @transaction_status = 'Good';਀ऀऀऀऀऀऀऀ䔀一䐀 
					ELSE -- The record exists.  Update it with approver 2.਀ऀऀऀऀऀ  䈀䔀䜀䤀一 
					   UPDATE user_restr.authoriser_privilege_requests਀ऀऀऀऀऀ      匀䔀吀 愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀ 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀Ⰰ 
						      approved_by_username_2 = @username,਀ऀऀऀऀऀऀ      愀瀀瀀爀漀瘀攀搀开漀渀开㈀ 㴀 匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀Ⰰ 
						      status = 'Approved'਀ऀऀऀऀऀ    圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀 
						  AND type = 'Revoke'਀ऀऀऀऀऀऀ  䄀一䐀 猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀ 
						  EXEC internal.usp_REVOKE_authoriser਀ऀऀऀऀऀऀ       䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀Ⰰ 
							   @request_result = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 㴀 ✀倀愀猀猀✀ 
						    BEGIN਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'Success', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀Ⰰ ✀䄀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀 爀攀瘀漀欀攀搀✀⤀㬀 
								 ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
								 SET @transaction_status = 'Good';਀ऀऀ                   䔀一䐀 
						   ELSE਀ऀऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
									 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀瀀瀀爀漀瘀愀氀䘀愀椀氀攀搀✀Ⰰ  
										  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
										SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ApprovalFailed.');਀ऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
							   END						   ਀ऀऀऀऀऀ  䔀一䐀 
			  END਀ऀऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 攀砀椀猀琀猀 愀渀搀 椀猀 爀攀昀攀爀爀攀搀 琀漀 戀礀 䀀爀攀焀甀攀猀琀开椀搀⸀  倀漀瀀甀氀愀琀攀 愀瀀瀀爀漀瘀攀爀 ㈀⸀  
			    BEGIN਀ऀऀऀऀऀ ⴀⴀ 刀攀琀爀椀攀瘀攀 琀栀攀 甀猀攀爀渀愀洀攀 漀昀 琀栀攀 甀猀攀爀 爀攀氀愀琀攀搀 琀漀 琀栀攀 爀攀焀甀攀猀琀⸀ 
					  SET @subject_sid = (SELECT sl.sid਀ऀऀऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 愀猀 猀氀 
										   WHERE sl.sid_id = (SELECT apr.sid_id਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
															   WHERE apr.request_id = @request_id))਀ऀऀऀऀऀ  匀䔀吀 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀 㴀 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀猀甀戀樀攀挀琀开猀椀搀⤀Ⰰ ✀✀⤀㬀 
਀ऀऀऀऀऀ   唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 
					      SET approved_by_sid_id_2 = @connectedusersid_id,਀ऀऀऀऀऀऀ      愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㈀ 㴀 䀀甀猀攀爀渀愀洀攀Ⰰ 
						      approved_on_2 = SYSDATETIME(),਀ऀऀऀऀऀऀ      猀琀愀琀甀猀 㴀 ✀䄀瀀瀀爀漀瘀攀搀✀ 
					    WHERE request_id = @request_id਀ 
						  EXEC internal.usp_REVOKE_authoriser਀ऀऀऀऀऀऀ       䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀Ⰰ 
							   @request_result = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 㴀 ✀倀愀猀猀✀ 
						    BEGIN਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'Success', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀Ⰰ ✀䄀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀 爀攀瘀漀欀攀搀✀⤀㬀 
								 ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
								 SET @transaction_status = 'Good';਀ऀऀ                   䔀一䐀 
						   ELSE਀ऀऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
									 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀瀀瀀爀漀瘀愀氀䘀愀椀氀攀搀✀Ⰰ  
										  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
										SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ApprovalFailed.');਀ऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
							   END		਀ऀऀऀऀ䔀一䐀 
       COMMIT TRANSACTION;਀ 
   	  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: 09-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all 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'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
	   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 @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_all_doc_group_viewers]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 漀眀渀攀爀猀   
-- Output is a table of document group owners, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_all_doc_group_viewers] ਀ 
	 @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 ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- 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 @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 搀最瘀瀀⸀猀椀搀开椀搀            䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				ISNULL(sl.name, '')    AS 'Database Username',਀ऀऀ        䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀    䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
 		        dgvp.doc_group_id      AS 'Doc Group ID',਀ऀ            搀最渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(dgvp.notes, '') AS 'Notes',਀                䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀最瘀瀀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				dgvp.granted_by        AS 'Granted By',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'਀ऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
	 INNER JOIN xref.doc_group_names AS dgn਀ऀ         伀一  搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
			    = dgn.doc_group_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	         ON  dgvp.sid_id਀ऀऀऀ    㴀  猀氀⸀猀椀搀开椀搀 
	   ORDER BY 'User 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;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all form group owners  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 昀漀爀洀 最爀漀甀瀀 漀眀渀攀爀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@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਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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 @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 昀最漀⸀猀椀搀开椀搀            䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				ISNULL(sl.name, '')   AS 'Database Username',਀ऀऀ        䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀    䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
 		        fgo.form_group_id     AS 'Form Group ID',਀ऀ            昀最渀⸀愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(fgo.notes, '') AS 'Notes',਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀最漀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				fgo.granted_by        AS 'Granted By',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                 AS 'Windows Account Current'਀ऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 䄀匀 昀最漀 
	 INNER JOIN forms.form_group_names AS fgn਀ऀ         伀一   昀最漀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
			    = fgn.form_group_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	         ON   fgo.sid_id਀ऀऀऀ    㴀  猀氀⸀猀椀搀开椀搀 
	   ORDER BY 'User 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;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开甀猀攀爀开爀漀氀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all records from user_restr.user_role_link਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 require permission਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@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 @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 爀漀氀攀开渀愀洀攀               䄀匀 ✀刀漀氀攀 一愀洀攀✀Ⰰ  
		        urlk.sid_id             AS 'User ID', ਀ऀऀऀऀ䤀匀一唀䰀䰀⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
				ISNULL(sl.username, '') AS 'System Username',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀猀氀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				CONVERT(NVARCHAR(30), urlk.created, 120) AS 'Created',਀ऀऀऀऀ甀爀氀欀⸀最爀愀渀琀攀搀开戀礀         䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀         
		   FROM user_restr.user_role_link AS urlk਀     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	         ON sl.sid_id ਀ऀऀ    㴀 甀爀氀欀⸀猀椀搀开椀搀 
	   ORDER BY 'User 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_authoriser_requests]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀甀琀栀漀爀椀猀攀爀开爀攀焀甀攀猀琀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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 ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- 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   apr.request_id                     AS 'Request ID',਀ऀऀऀऀ  愀瀀爀⸀猀椀搀开椀搀                         䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				  apr.type                           AS 'Type',਀ऀऀऀऀ  愀瀀爀⸀甀猀攀爀渀愀洀攀                       䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				  apr.approved_by_sid_id_1           AS 'Approver 1 User ID',਀ऀऀऀऀ  愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㄀         䄀匀 ✀䄀瀀瀀爀漀瘀攀爀 ㄀✀Ⰰ 
		          CONVERT(NVARCHAR(30), apr.approved_on_1, 120) AS 'First Approval',਀ऀऀऀऀ  愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀           䄀匀 ✀䄀瀀瀀爀漀瘀攀爀 ㈀ 唀猀攀爀 䤀䐀✀Ⰰ 
				  apr.approved_by_username_2         AS 'Approver 2',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开漀渀开㈀Ⰰ ㄀㈀　⤀ 䄀匀 ✀匀攀挀漀渀搀 䄀瀀瀀爀漀瘀愀氀✀Ⰰ 
				  ISNULL(apr.status, '')             AS 'Status'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
	   LEFT JOIN user_restr.sid_list AS sl਀ऀ          伀一    猀氀⸀猀椀搀开椀搀 
				  = apr.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 = @message + ' | ' + @tempmessage + ' | ' + ਀ऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_authorisers]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀甀琀栀漀爀椀猀攀爀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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', ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 ਀ऀ     匀䔀䰀䔀䌀吀   猀氀⸀猀椀搀开椀搀                          䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
		          ISNULL(sl.name, '')                AS 'Database Username',਀ऀऀऀ      䤀匀一唀䰀䰀⠀猀氀⸀搀攀猀挀爀Ⰰ ✀✀⤀               䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		          ISNULL(sl.username, '')            AS 'System Username',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀唀猀攀爀 䤀䐀 䌀爀攀愀琀攀搀✀Ⰰ 
				  a.notes                            AS 'Notes',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 愀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䜀爀愀渀琀 䌀爀攀愀琀攀搀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ऀऀऀऀ   
			FROM user_restr.sid_list AS sl਀ऀ  䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀 
	             ON             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 = @message + ' | ' + @tempmessage + ' | ' + ਀ऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_contr_doc_group_names]    Script Date: Tue 12-05-2026 5:43:19 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_contr_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.controller_doc_group_name_id AS 'Controller Doc Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀洀渀攀洀Ⰰ ✀✀⤀ऀऀऀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
	            dgn.attr_name					 AS 'Controller Doc Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ऀऀऀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				CONVERT(NVARCHAR(30), dgn.created, 120) AS 'Created',਀ऀऀऀऀ搀最渀⸀挀爀攀愀琀攀搀开戀礀                   䄀匀 ✀䌀爀攀愀琀攀搀 䈀礀✀ 
		   FROM xref.controller_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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_contr_doc_group_sids]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀栀攀 甀猀攀爀 䤀䐀猀 昀漀爀 愀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀ 
-- Input is the controller level document group ID.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_contr_doc_group_sids] ਀ 
     @contr_doc_ed_grp_name_id bigint = NULL,  -- Document group ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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';਀ 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
	਀  
  -- 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 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਀ऀऀ    䔀一䐀 
਀  
	  -- 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਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀  䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀          䄀匀 ✀䌀漀渀琀爀漀氀氀攀爀 䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
		         cdgsl.sid_id                       AS 'User ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀 ⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀               䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀洀攀✀Ⰰ 
		         ISNULL(sl.username, '')            AS 'System Username',਀ऀऀऀऀ 䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 挀搀最猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				 cdgsl.granted_by                   AS 'Granted By',਀ऀऀऀऀ 挀搀最猀氀⸀渀漀琀攀猀                        䄀匀 一漀琀攀猀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ 
	     FROM user_restr.controller_doc_group_sid_links AS cdgsl਀     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	         ON      sl.sid_id ਀ऀऀ        㴀 挀搀最猀氀⸀猀椀搀开椀搀 
		  WHERE cdgsl.controller_doc_group_name_id਀ऀऀ        㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀㬀 
      SET @numrecords = @@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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_contr_file_group_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀猀   
-- Output is a table of file groups, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_contr_file_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 cfgn.controller_file_group_name_id AS 'Controller File Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀挀昀最渀⸀洀渀攀洀Ⰰ ✀✀⤀ऀऀऀ   䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
	            cfgn.attr_name					   AS 'Controller File Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀挀昀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ऀऀऀ   䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				CONVERT(NVARCHAR(30), cfgn.created, 120) AS 'Created',਀ऀऀऀऀ挀昀最渀⸀挀爀攀愀琀攀搀开戀礀                    䄀匀 ✀䌀爀攀愀琀攀搀 䈀礀✀ 
		   FROM xref.controller_file_group_names   AS cfgn਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䌀漀渀琀爀漀氀氀攀爀 䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀㬀 
	   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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_contr_file_group_sids]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀栀攀 甀猀攀爀 䤀䐀猀 昀漀爀 愀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀⸀ 
-- Input is the controller level file group ID.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_contr_file_group_sids] ਀ 
     @contr_file_ed_grp_name_id bigint = NULL,  -- Controller level file group 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 ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@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਀ 
		   -- 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 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਀ऀऀ    䔀一䐀 
਀  
	  -- 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਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀  䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀         䄀匀 ✀䌀漀渀琀爀漀氀氀攀爀 䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
		         cfgsl.sid_id                       AS 'User ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀 ⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀               䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
		         ISNULL(username, '')               AS 'System Username',਀ऀऀऀऀ 䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 挀昀最猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				 cfgsl.granted_by                   AS 'Granted By',਀ऀऀऀऀ 挀昀最猀氀⸀渀漀琀攀猀                        䄀匀 一漀琀攀猀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ 
	     FROM user_restr.controller_file_grp_sid_links AS cfgsl਀     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	         ON      sl.sid_id ਀ऀऀ        㴀 挀昀最猀氀⸀猀椀搀开椀搀 
		  WHERE cfgsl.controller_file_group_name_id਀ऀऀ        㴀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀㬀 
      SET @numrecords = @@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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_privileges_by_user]    Script Date: Tue 12-05-2026 5:43:19 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 ਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀            㴀 一唀䰀䰀Ⰰ 
		@temp_userauth_status nchar(10)      = 'Fail', ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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_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');਀ऀ䔀一䐀 
਀ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  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 @userid = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀椀搀 㴀 一唀䰀䰀㬀 
		 IF @userid IS NULL ਀ऀऀ    䈀䔀䜀䤀一 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					 EXEC internal.usp_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'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY ਀ 
	  -- Check if the user has Controller role. ਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 甀爀氀欀⸀猀椀搀开椀搀 
	               FROM user_restr.user_role_link AS urlk਀ऀऀऀऀ  圀䠀䔀刀䔀 甀爀氀欀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀椀搀 
				    AND urlk.role_name = 'Controller')਀ऀऀ 匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 
਀ 
	     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਀ऀऀ         㴀 䀀甀猀攀爀椀搀 
਀ 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
		SELECT 'Tag Relationship Tree'   AS 'Privilege Type',਀ऀऀऀऀ琀琀渀⸀琀愀最开琀爀攀攀开椀搀          䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				ttn.name                 AS 'Privilege Name',਀ऀऀऀ    ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
			    ''                       AS 'Granted By'਀ऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀 
		WHERE @iscontroller = 'Pass'਀ 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
			 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_id = @userid਀ऀऀऀऀऀऀऀ    䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㰀㸀 ✀倀愀猀猀✀ 
        UNION ਀ 
					  ( SELECT 'Tag Relationship Tree'  AS 'Privilege Type',਀ऀऀऀऀऀ           琀琀渀㈀⸀琀愀最开琀爀攀攀开椀搀         䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
					           ttn2.name                AS 'Privilege Name',਀ऀऀऀ                   ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
			                   ''                       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_id = @userid਀ऀऀऀऀऀऀऀ    䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㰀㸀 ✀倀愀猀猀✀ 
							  )਀ 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
		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_id = @userid਀ 
਀ऀऀ唀一䤀伀一 䄀䰀䰀  
	     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਀ 
				 ; ਀ 
	     SET @message = CONCAT(@message, ' | Username: ', ਀ऀऀऀऀ   䤀匀一唀䰀䰀⠀⠀匀䔀䰀䔀䌀吀 猀氀⸀甀猀攀爀渀愀洀攀 
				            FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀椀搀⤀Ⰰ ✀✀⤀⤀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 [authorising].[usp_SEL_revoke_log]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开爀攀瘀漀欀攀开氀漀最崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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', ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 ਀ऀ     匀䔀䰀䔀䌀吀   甀瀀爀氀⸀瀀爀椀瘀椀氀攀最攀                     䄀匀 ✀倀爀椀瘀椀氀攀最攀✀Ⰰ 
				  uprl.privilege_name                AS 'Privilege Name',਀ऀऀऀऀ  甀瀀爀氀⸀猀椀搀开椀搀                        䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				  uprl.username                      AS 'System Username',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 甀瀀爀氀⸀最爀愀渀琀攀搀开漀渀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  uprl.granted_by                    AS 'Granted By',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 甀瀀爀氀⸀爀攀瘀漀欀攀搀开漀渀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䄀挀琀椀漀渀攀搀 伀渀✀Ⰰ 
				  uprl.revoked_by                    AS 'Revoked By'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 䄀匀 甀瀀爀氀 
		ORDER BY 'Actioned On' 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 = @message + ' | ' + 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
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 user.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 甀猀攀爀 椀搀⸀ 
-- 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_roles_by_user] ਀ 
     @userid 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਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀 瀀攀爀洀椀猀猀椀漀渀 
		@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਀ 
਀ 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
  BEGIN਀ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
-- Check that the user id is valid਀  䤀䘀 䀀甀猀攀爀椀搀 㴀 　 
     SET @userid = NULL;਀   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 甀猀攀爀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀渀✀琀⸀ 
  IF @userid 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 NoUserSidID.';਀ऀ 䔀一䐀 
  ELSE -- A user id has been supplied਀     䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀搀 攀砀椀猀琀猀 
         IF NOT EXISTS (SELECT sid_id਀                          䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
                         WHERE sid_id = @userid) ਀             䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 爀漀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
               EXEC internal.usp_SEL_message ਀                    䀀洀攀猀猀愀最攀开椀搀 㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
			        @message_text = @tempmessage OUTPUT;਀  ऀ           䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	              SET @invaliduseridmessage = 'User ID: ' + CONVERT(nvarchar, @userid) + '... ' + @tempmessage;਀ऀ           䔀䰀匀䔀  
				    SET @invaliduseridmessage = 'A database level message error occurred on UserIdNotExist.';਀ऀ         䔀一䐀 
	 END਀  䔀一䐀 ⴀⴀ 䔀一䐀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 甀爀氀欀⸀猀椀搀开椀搀 䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
		        urlk.role_name  AS 'Role Name',਀ऀऀ        䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 甀爀氀欀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				urlk.granted_by AS 'Granted By',਀ऀऀऀऀ甀爀氀欀⸀渀漀琀攀猀 䄀匀 一漀琀攀猀 
		   FROM user_restr.user_role_link AS urlk਀     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	         ON     sl.sid_id ਀ऀऀ        㴀 甀爀氀欀⸀猀椀搀开椀搀 
	  	  WHERE urlk.sid_id = @userid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 (@invaliduseridmessage <> '')       SET @message = @message + ' | ' + @invaliduseridmessage;਀ऀ䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_users_by_role]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 昀漀爀 愀 最椀瘀攀渀 爀漀氀攀⸀ 
-- Input is a role name string.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 愀 氀椀猀琀 漀昀 甀猀攀爀猀 昀漀爀 琀栀愀琀 爀漀氀攀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@invalidroleidmessage 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.';਀ऀ䔀一䐀 
਀ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
-- Check that the role name is valid਀  䤀䘀 䀀爀漀氀攀渀愀洀攀 㴀 ✀✀ 
     SET @rolename = NULL;਀   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀漀氀攀 渀愀洀攀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀渀✀琀⸀ 
  IF @rolename 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 role name has been supplied਀     䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀漀氀攀 渀愀洀攀 攀砀椀猀琀猀 
         IF NOT EXISTS (SELECT role_name਀                          䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀爀漀氀攀开氀椀猀琀  
                         WHERE role_name = @rolename) ਀             䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 爀漀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
               EXEC internal.usp_SEL_message ਀                    䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀漀氀攀一漀琀䔀砀椀猀琀✀Ⰰ  
			        @message_text = @tempmessage OUTPUT;਀  ऀ           䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	              SET @invalidroleidmessage = 'Role name: ' + LEFT(@rolename, 20) + '... ' + @tempmessage;਀ऀ           䔀䰀匀䔀  
				    SET @invalidroleidmessage = 'A database level message error occurred on RoleNotExist.';਀ऀ         䔀一䐀 
	 END਀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀  䀀爀漀氀攀渀愀洀攀                          䄀匀 ✀刀漀氀攀 一愀洀攀✀Ⰰ 
		         urlk.sid_id                        AS 'User ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀 ⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀               䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
		         ISNULL(sl.username, '')            AS 'System Username',਀ऀऀऀऀ 䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 甀爀氀欀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				 urlk.granted_by                    AS 'Granted By',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'		਀ऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 䄀匀 甀爀氀欀 
     INNER JOIN user_restr.sid_list AS sl਀ऀ         伀一     猀氀⸀猀椀搀开椀搀  
		        = urlk.sid_id਀ऀ  ऀ  圀䠀䔀刀䔀 甀爀氀欀⸀爀漀氀攀开渀愀洀攀 㴀 䀀爀漀氀攀渀愀洀攀 
	   ORDER BY 'User 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;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@invalidroleidmessage <> '')       SET @message = @message + ' | ' + @invalidroleidmessage;਀ऀ䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_UPD_cancel_authoriser_requ]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood S11-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Cancels an authoriser pending grant request.   ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀愀渀挀攀氀开愀甀琀栀漀爀椀猀攀爀开爀攀焀甀崀  
਀ऀ 䀀爀攀焀甀攀猀琀开椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @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 ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@subject_sid varbinary(100)          = NULL, -- The SID of the user relating to the request being cancelled. ਀ऀऀ䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 漀昀 琀栀攀 甀猀攀爀 爀攀氀愀琀椀渀最 琀漀 琀栀攀 爀攀焀甀攀猀琀 戀攀椀渀最 挀愀渀挀攀氀氀攀搀⸀ 
		@request_type nvarchar(20)           = '', -- The type of privilege change request.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 request_id has been supplied਀ऀऀ 䤀䘀 䀀爀攀焀甀攀猀琀开椀搀 㴀 　 
		    SET @request_id = NULL;਀ऀऀ 䤀䘀 䀀爀攀焀甀攀猀琀开椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoRequestID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		     ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀焀甀攀猀琀䤀䐀⸀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀         䔀䰀匀䔀  
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀攀焀甀攀猀琀开椀搀 ऀ     ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀焀甀攀猀琀开椀搀 攀砀椀猀琀猀 
				  				  FROM user_restr.authoriser_privilege_requests ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀⤀  
					   BEGIN਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'RequestIDNotExist', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀爀攀焀甀攀猀琀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀焀甀攀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					   END਀ऀऀ   䔀一䐀 
਀ऀऀ   䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		      BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀攀焀甀攀猀琀开椀搀 ऀ     ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀琀愀琀甀猀 㴀 倀攀渀搀椀渀最 
				  				  FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀 
								   AND apr.status = 'Pending') ਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 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 NotPending.');਀ऀऀऀऀऀ   䔀一䐀 
				END਀ 
਀ऀऀ   䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		     BEGIN਀ऀऀऀऀⴀⴀ 䄀甀琀栀漀爀椀猀攀爀 挀愀渀渀漀琀 挀愀渀挀攀氀 愀 爀攀焀甀攀猀琀 琀漀 爀攀瘀漀欀攀 琀栀攀椀爀 漀眀渀 愀甀琀栀漀爀椀猀愀琀椀漀渀 瀀爀椀瘀椀氀攀最攀⸀ 
                  IF EXISTS (SELECT apr.sid_id ਀ऀऀऀऀ               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
						  LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀ         伀一  愀瀀爀⸀猀椀搀开椀搀 
								    = sl.sid_id਀                              圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀 
							        AND sl.sid = @connectedusersid)਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀匀攀氀昀䌀愀渀挀攀氀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoSelfCancel.');਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 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 update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  BEGIN TRANSACTION;਀ 
	  SET @subject_sid = (SELECT sl.sid਀ऀ                        䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 愀猀 猀氀 
						   WHERE sl.sid_id = (SELECT apr.sid_id਀ऀऀऀऀऀऀ                        䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
											   WHERE apr.request_id = @request_id))਀ऀ  匀䔀吀 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀 㴀 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀猀甀戀樀攀挀琀开猀椀搀⤀Ⰰ ✀✀⤀㬀 
	  SET @request_type = (SELECT apr.type਀ऀ                         䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
							WHERE apr.request_id = @request_id)਀ 
	     UPDATE user_restr.authoriser_privilege_requests ਀ऀऀ    匀䔀吀 猀琀愀琀甀猀 㴀 ✀䌀愀渀挀攀氀氀攀搀✀ 
		  WHERE request_id = @request_id; ਀ 
        COMMIT TRANSACTION;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage, @subject_username, @request_type, 'Request cancelled.');਀ऀऀ 䔀䰀匀䔀  
			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_contr_doc_group_name]    Script Date: Tue 12-05-2026 5:43:19 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 [authorising].[usp_UPD_contr_doc_group_name] ਀ 
     @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_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 @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 controller_doc_group_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀  
							 WHERE controller_doc_group_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 controller_doc_group_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਀ 
	  BEGIN TRANSACTION;਀ 
	     UPDATE xref.controller_doc_group_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE controller_doc_group_name_id = @recordid; ਀ 
	 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਀ 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开猀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record for user_restr.controller_doc_group_sid_links ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ  
-- the controller level document group id and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_UPD_contr_doc_group_sid] ਀ 
     @contr_doc_ed_grp_name_id bigint = NULL,  -- Controller level document group.  Mandatory ਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀⸀  䴀愀渀搀愀琀漀爀礀 
	 @inputnotes nvarchar(max)        = '',    -- Notes for the doc group entry. Optional਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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 NOT EXISTS (SELECT controller_doc_group_name_id, sid_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀  
						 WHERE controller_doc_group_name_id = @contr_doc_ed_grp_name_id਀ऀऀऀऀऀऀ       䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   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 @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 
		    SET notes = @inputnotes਀ऀऀ  圀䠀䔀刀䔀  挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀   
		        = @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   = '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_contr_file_group_name]    Script Date: Tue 12-05-2026 5:43:19 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 [authorising].[usp_UPD_contr_file_group_name] ਀ 
     @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_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 @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 controller_file_group_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀  
							 WHERE controller_file_group_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 controller_file_group_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਀ 
	   BEGIN TRANSACTION;਀ 
	     UPDATE xref.controller_file_group_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE controller_file_group_name_id = @recordid; ਀ 
		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਀ 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开猀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates 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_UPD_contr_file_group_sid] ਀ 
     @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 NOT EXISTS (SELECT controller_file_group_name_id, sid_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀  
						 WHERE controller_file_group_name_id = @contr_file_ed_grp_name_id਀ऀऀऀऀऀऀ       䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   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 @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  BEGIN TRANSACTION;਀ 
	     UPDATE user_restr.controller_file_grp_sid_links਀ऀऀ    匀䔀吀 渀漀琀攀猀 㴀 䀀椀渀瀀甀琀渀漀琀攀猀 
		  WHERE  controller_file_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: 13-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the notes in user_restr.doc_group_view_permissions. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ  
-- the viewer group id and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_UPD_doc_grp_viewer_notes] ਀ 
     @docgroupid bigint               = NULL,  -- 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)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)     = '',     -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@sidnotexistmessage nvarchar(200)    = '',     -- Communicates that the user id does not exist਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@docgroupnotexistmsg nvarchar(200)	 = '',     -- Communicates that the document group does not exist਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transactionmessage2 nvarchar(200)   = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    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਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀猀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀猀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ   䔀一䐀 
਀ऀ     䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 
		    SET @docgroupid = NULL;਀ऀऀ 䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoDocGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀渀漀琀攀砀椀猀琀洀猀最 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀渀漀琀攀砀椀猀琀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the document group exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀 
				                  FROM xref.doc_group_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'DocGroupIdNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀渀漀琀攀砀椀猀琀洀猀最 㴀  䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀ 簀 ✀  ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀  
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀渀漀琀攀砀椀猀琀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ    䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 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਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  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 @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	   BEGIN TRANSACTION;਀ 
	     UPDATE user_restr.doc_group_view_permissions਀ऀऀ    匀䔀吀 渀漀琀攀猀 㴀 䀀椀渀瀀甀琀渀漀琀攀猀 
		  WHERE doc_group_id = @docgroupid਀ऀऀ    䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀㬀  
਀ऀऀ䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 (@sidnotexistmessage <> '')         SET @message = @message + ' | ' + @sidnotexistmessage;਀ऀ䤀䘀 ⠀䀀搀漀挀最爀漀甀瀀渀漀琀攀砀椀猀琀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀最爀漀甀瀀渀漀琀攀砀椀猀琀洀猀最㬀 
	IF (@recordnotexistsmessage <> '')     SET @message = @message + ' | ' + @recordnotexistsmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a form group owner record.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 愀渀搀  
-- the form group id and a new user sid.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_UPD_form_group_owner] ਀ 
     @formgroupid bigint              = NULL,  -- Form group to delete ownership of਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @new_user_sid_id bigint          = NULL,  -- User sid_id from the sid_list table for the new user਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@recordnotexistmessage nvarchar(200) = '',     -- Communicates that the record does not਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ 䤀䘀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀 㴀 　 
		    SET @new_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਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ   䔀一䐀 
਀ 
      -- Check if the record exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀Ⰰ 猀椀搀开椀搀 
				   	          FROM user_restr.form_group_owners ਀ऀऀऀऀऀ    ऀ 圀䠀䔀刀䔀    昀漀爀洀开最爀漀甀瀀开椀搀  
							       = @formgroupid਀ऀऀऀऀऀऀ       䄀一䐀             猀椀搀开椀搀  
							       = @user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 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 EXISTS (SELECT form_group_id, sid_id਀ऀऀऀऀ   ऀ          䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀  
					    	 WHERE    form_group_id ਀ऀऀऀऀऀऀऀ       㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
						       AND             sid_id ਀ऀऀऀऀऀऀऀ       㴀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀 
							   AND        @user_sid_id਀ऀऀऀऀऀऀऀ       㰀㸀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀⤀ 
			   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਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 
		    SET             sid_id ਀ऀऀ        㴀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀 
          WHERE    form_group_id ਀ऀऀ        㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
		    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   = '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;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_UPD_restore_sid]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ㄀㈀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 刀攀猀琀漀爀攀猀 愀 甀猀攀爀 戀礀 挀漀瀀礀椀渀最 琀栀攀 猀椀搀 昀爀漀洀 爀攀猀琀漀爀攀开猀椀搀 琀漀 猀椀搀⸀   
-- Input is the SID ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_UPD_restore_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 @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		 IF EXISTS (SELECT sid_id ਀ऀऀऀ ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
				     WHERE sid_id = @sidrecordid਀ऀऀऀऀऀ   䄀一䐀 猀椀搀 㴀 爀攀猀琀漀爀攀开猀椀搀⤀  
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'UserIsActive', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀猀䄀挀琀椀瘀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ䔀一䐀 
਀ 
       -- End checking that the sid  is valid਀ 
	   -- Check if the sid is assigned a role as authoriser.  ਀ऀ   ⴀⴀ 䤀昀 琀栀攀 猀椀搀 椀猀 愀猀椀最渀攀搀 琀漀 愀渀 愀甀琀栀漀爀椀猀攀爀 琀栀攀渀 琀栀攀 愀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀 洀甀猀琀 戀攀 爀攀瘀漀欀攀搀 戀攀昀漀爀攀 琀栀攀  
	   -- user can be restored. ਀       䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
	                FROM user_restr.authorisers਀ऀऀऀऀ   圀䠀䔀刀䔀 愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'IsAuthoriser', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 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;਀ 
	  INSERT INTO user_restr.user_privilege_revoke_log -- Create an audit log entry਀ऀ              ⠀瀀爀椀瘀椀氀攀最攀Ⰰ 瀀爀椀瘀椀氀攀最攀开渀愀洀攀Ⰰ 猀椀搀开椀搀Ⰰ 甀猀攀爀渀愀洀攀Ⰰ 最爀愀渀琀攀搀开漀渀Ⰰ 最爀愀渀琀攀搀开戀礀Ⰰ 爀攀瘀漀欀攀搀开戀礀⤀ 
	       VALUES ('SID',     'SID Restored',       @sidrecordid, ਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 甀猀攀爀渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ 
		          SYSDATETIME(),਀ऀऀऀऀ  䀀甀猀攀爀渀愀洀攀Ⰰ 
				  '')਀ 
਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
		    SET sid = restore_sid਀ऀऀ  圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀㬀  
਀ऀ    䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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: 02-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the notes column for user_restr.user_role_link਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ  
-- the role and the notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_UPD_user_role_link_notes] ਀ 
     @rolename nvarchar(50)           = '',    -- Role name਀ऀ 䀀甀猀攀爀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀  
	 @recordnotes  nvarchar(max)      = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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਀        䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@rolenotexistmessage nvarchar(200)	 = '',     -- Communicates that the role does not exist਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@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਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- 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਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀漀氀攀开渀愀洀攀Ⰰ 猀椀搀开椀搀 
				   	          FROM user_restr.user_role_link ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀 爀漀氀攀开渀愀洀攀 㴀 䀀爀漀氀攀渀愀洀攀 
						       AND sid_id    = @userid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 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';਀ऀऀऀ   䔀一䐀 
		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 = @recordnotes਀ऀऀऀ圀䠀䔀刀䔀 爀漀氀攀开渀愀洀攀 㴀 䀀爀漀氀攀渀愀洀攀 
			  AND sid_id    = @userid; ਀ 
	   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 (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开愀渀礀开昀漀爀洀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a form id਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 
-- Output is a message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 form group id does not exist਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@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_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 IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
		       WHERE form_id = @id_to_delete;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        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;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀洀开漀戀樀开愀琀琀爀椀戀甀琀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 13-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Deletes a common object record਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀攀挀漀爀搀 椀搀 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_com_obj_attribute]਀ 
     @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 com_obj.common_object_attributes ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀  䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀  
			  FROM com_obj.common_object_list_names  ਀ऀऀऀ 圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		OR EXISTS (SELECT common_object_attribute_id ਀ऀऀऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀   
					WHERE common_object_attribute_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਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
		       WHERE common_object_attribute_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: 14-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Deletes a common object list name record਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_com_obj_list_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;਀ 
  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਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@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਀ऀ     匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
		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_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_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_list_id ਀ऀऀऀ        䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀  
			       WHERE common_object_list_id = @id_to_delete) ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			        FROM forms.form_doc_com_obj_ms_lst_links ਀ऀऀऀ       圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		OR EXISTS (SELECT common_object_list_id ਀ऀऀऀ        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀  
			       WHERE common_object_list_id = @id_to_delete) ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			        FROM forms.form_file_com_obj_ms_lst_links ਀ऀऀऀ       圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		OR EXISTS (SELECT common_object_list_id ਀ऀऀऀ        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀  
			       WHERE common_object_list_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 com_obj.common_object_list_names.common_object_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 (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	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 item 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_date_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_date_values ਀ऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 
					WHERE doc_date_name_id = @id_to_delete) ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
					 FROM base.global_settings_groups਀ऀऀऀऀऀ圀䠀䔀刀䔀 搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  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_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: 06-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_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 doc_attr.doc_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 doc_attr.doc_integer_values ਀ऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 
					WHERE doc_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 doc_int_name_id = @id_to_delete;਀ऀ  䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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: 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਀ऀऀऀ 䔀一䐀 
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			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 @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_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  doc_attr.doc_ms_attr_fgroup_links ਀ऀऀ       圀䠀䔀刀䔀       搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀 
			          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   = '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_doc_ms_attribute]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_multi_select_attributes਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_doc_ms_attribute] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @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 multi-select 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_ms_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
						   WHERE doc_ms_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_ms_attr_id ਀ऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
				  WHERE doc_ms_attr_id = @id_to_delete)  ਀ऀ  伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
	               FROM doc_attr.doc_ms_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_multi_select_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_doc_ms_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_multi_select_list_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_doc_ms_list] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @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_ms_list_id ਀ऀऀऀऀऀऀ    䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
					       WHERE doc_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 doc_ms_list_id ਀ऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
				  WHERE doc_ms_list_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀  
					 FROM forms.form_doc_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 doc_attr.doc_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_doc_radiob_attr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ　㘀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_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',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- 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_radio_button_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_radio_button_links ਀ऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
	  OR EXISTS (SELECT doc_radiob_attr_id ਀ऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
				  WHERE doc_radiob_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_radiob_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_doc_radiob_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ　㘀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_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)                 = '',     ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @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਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  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 @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_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 doc_attr.doc_radio_button_attributes ਀ऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT doc_radiob_list_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
					WHERE doc_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 doc_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;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开爀戀开愀琀琀爀开昀最开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a radio button 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 @docradiobattrid = NULL;਀  
		  -- Check if a multi-select attribute id was supplied. ਀ऀऀ  䤀䘀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A  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_radio_button_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀⤀ 
					 BEGIN -- radio button attribute id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 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.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_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  doc_attr.doc_radiob_attr_fgroup_links ਀ऀऀ       圀䠀䔀刀䔀      搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 
			          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   = '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 the id of the item to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 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';਀ 
  -- 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 doc_real_name_id ਀ऀऀऀऀऀऀ    䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
					       WHERE doc_real_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_real_name_id ਀ऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀  
				  WHERE doc_real_name_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
					 FROM forms.form_doc_real_number_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_real_number_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_doc_text_field_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_text_field_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 椀琀攀洀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀崀  
     @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_free_text_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_free_text_values ਀ऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT doc_free_text_name_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀 
					WHERE doc_free_text_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_free_text_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_date_field_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_date_field_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 椀琀攀洀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀崀  
     @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 file_attr.file_date_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_date_values ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT file_date_name_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 
					WHERE file_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 file_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_file_int_field_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_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 file_int_name_id ਀ऀऀऀऀऀऀ    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
					       WHERE file_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 file_int_name_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀  
				  WHERE file_int_name_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
					 FROM forms.form_file_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 file_attr.file_integer_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: 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 multi-select attribute id was supplied. ਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A  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਀ऀऀऀ 䔀一䐀 
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			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.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_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  file_attr.file_ms_attr_fgroup_links ਀ऀऀ       圀䠀䔀刀䔀      昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 
			          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   = '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_file_ms_attribute]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_multi_select_attributes਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_file_ms_attribute] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @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 multi-select 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_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
						   WHERE file_ms_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_ms_attr_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
				  WHERE file_ms_attr_id = @id_to_delete)  ਀ऀ  伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀  
				   FROM file_attr.file_ms_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_multi_select_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: 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 file_attr.file_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 file_attr.file_multi_select_attributes ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT file_ms_list_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀  
					WHERE file_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 file_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: 02-08-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_file_radiob_attr] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @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';਀ 
  -- 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_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_radio_button_links ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
      OR EXISTS (SELECT file_radiob_attr_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
				  WHERE file_radiob_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 IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
		       WHERE file_radiob_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: 31-07-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_file_radiob_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_radiob_list_id ਀ऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
					   WHERE file_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 file_radiob_list_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
				  WHERE file_radiob_list_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
					 FROM forms.form_file_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 file_attr.file_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;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开爀戀开愀琀琀爀开昀最开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a radio button 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 @file_radiobattrid = NULL;਀  
		  -- Check if an attribute id was supplied. ਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- An 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_radio_button_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀⤀ 
					 BEGIN -- attribute id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			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 @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_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  file_attr.file_radiob_attr_fgroup_links ਀ऀऀ       圀䠀䔀刀䔀      昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 
			          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   = '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: 14-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_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',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- 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_real_name_id ਀ऀऀऀऀऀऀ    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
					       WHERE file_real_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_real_name_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀  
				  WHERE file_real_name_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
					 FROM forms.form_file_real_number_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_real_number_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_file_text_field_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_text_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 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 file_attr.file_free_text_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_free_text_values ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT file_free_text_name_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀 
					WHERE file_free_text_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_free_text_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: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a filter group਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀 
-- Output is a message and transaction 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਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @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 filter_group_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
						   WHERE filter_group_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 filter_group_id FROM doc_attr.doc_ms_attr_fgroup_links       WHERE filter_group_id = @id_to_delete) ਀ऀ   伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀   圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
	   OR EXISTS (SELECT filter_group_id FROM file_attr.file_ms_attr_fgroup_links  	  WHERE filter_group_id = @id_to_delete)਀ऀ   伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		  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 forms.filter_groups ਀ऀऀ       圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	   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;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a form group਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 最爀漀甀瀀 椀搀 
-- Output is a message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 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 form_group_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀  
						   WHERE form_group_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 form_group_id ਀ऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀   
			 WHERE form_group_id = @id_to_delete) ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀  
					 FROM user_restr.form_group_owners  ਀ऀऀऀऀऀ圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
		  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 forms.form_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਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
-- Input is the id of the item to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_general_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 general_field_name_id ਀ऀऀऀऀऀऀ䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀  
					   WHERE general_field_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਀ 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		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 general_field_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: 02-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a unit of measure਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_unit_of_measure]਀ 
     @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 base.units_of_measure ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 甀渀椀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
			   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_integer_field_names  ਀ऀऀऀ 圀䠀䔀刀䔀 甀渀椀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		OR EXISTS (SELECT unit_id ਀ऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀   
					WHERE unit_id = @id_to_delete)਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 甀渀椀琀开椀搀 
					 FROM file_attr.file_integer_field_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 甀渀椀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
		OR EXISTS (SELECT unit_id਀ऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀   
					WHERE unit_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 unit_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-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀 琀愀戀氀攀⸀ 
-- Input is the recordid.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 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਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀  
		       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   = '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-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀 琀愀戀氀攀⸀ 
-- Input is the recordid.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 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਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀  
		       WHERE workflow_action_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਀ 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀漀爀欀昀氀漀眀开洀漀搀攀氀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开洀漀搀攀氀⸀眀漀爀欀昀氀漀眀开渀愀洀攀猀 琀愀戀氀攀  
-- plus cascade deleting corresponding records in workflow_step_definitions,਀ⴀⴀ 眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 愀渀搀 眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀⸀ 
-- Input is the recordid.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 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 @workflow_model_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_model_names਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 攀砀椀猀琀猀⸀  䄀 洀漀搀攀氀 洀愀礀 渀漀琀 戀攀 搀攀氀攀琀攀搀 椀昀 愀 挀漀爀爀攀猀瀀漀渀搀椀渀最 椀渀猀琀愀渀挀攀 攀砀椀猀琀猀⸀ 
਀ऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
		              FROM workflow_instances.workflow_instance_definitions AS wid਀ऀऀऀऀऀ 圀䠀䔀刀䔀 眀椀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀  
					       =  @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 WfInstanceExists.');਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		-- Delete any rule links਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀 
			  WHERE step_transition_id IN (਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 眀爀氀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
					  FROM workflow_models.workflow_step_transitions AS wst਀ऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀 䄀匀 眀爀氀 
				        ON   wst.step_transition_id਀ऀऀऀऀऀऀ   㴀 眀爀氀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
				INNER JOIN workflow_models.workflow_step_definitions AS wsd਀ऀऀऀऀ        伀一   眀猀琀⸀␀昀爀漀洀开椀搀 
						   = wsd.$node_id਀ऀऀऀऀऀऀ伀刀   眀猀琀⸀␀琀漀开椀搀 
						   = wsd.$node_id਀ऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 䄀匀 眀洀渀 
				        ON   wsd.workflow_model_id਀ऀऀऀऀऀऀ   㴀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
					 WHERE wmn.workflow_model_id਀ऀऀऀऀऀ       㴀  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀⤀ 
਀ 
     -- Delete related edges / step transitions. ਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 
				WHERE $from_id IN (਀ऀऀऀऀऀ  匀䔀䰀䔀䌀吀 ␀渀漀搀攀开椀搀 
					    FROM workflow_models.workflow_step_definitions AS wsd਀ऀऀऀऀ  䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 䄀匀 眀洀渀 
				          ON   wsd.workflow_model_id਀ऀऀऀऀऀऀ     㴀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
					   WHERE wmn.workflow_model_id਀ऀऀऀऀऀ         㴀  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
					  )਀ऀऀऀऀ伀刀 ␀琀漀开椀搀 䤀一 ⠀ 
					  SELECT $node_id਀ऀऀऀऀऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀 
				  INNER JOIN workflow_models.workflow_model_names AS wmn਀ऀऀऀऀ          伀一   眀猀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
						     = wmn.workflow_model_id਀ऀऀऀऀऀ   圀䠀䔀刀䔀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
					         =  @workflow_model_id਀ऀऀऀऀऀ  ⤀㬀 
਀ 
     -- Delete related step definitions. ਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
  		      WHERE     workflow_model_id਀ऀऀऀऀऀ㴀  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀㬀 
					  ਀ 
        -- Delete records from the model names table਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀  
		       WHERE workflow_model_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਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ   䤀䘀 䀀䀀吀刀䄀一䌀伀唀一吀 㸀 　    刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     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-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 琀愀戀氀攀⸀ 
-- Input is the recordid.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 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਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀  
		       WHERE output_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਀ 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀漀爀欀昀氀漀眀开爀甀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开洀漀搀攀氀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 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_rules਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀甀氀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 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 insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀  
		       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   = '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-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,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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਀ 
		  -- 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             rule_id ਀ऀऀऀऀऀऀ㴀 䀀眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀ऀऀऀऀऀऀऀ       
					AND     step_transition_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: 09-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀 琀愀戀氀攀⸀ 
-- Input is the recordid.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
        @deleted_node hierarchyid,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 @model_step_id = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @model_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 NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE workflow_model_step_id = @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 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'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
     -- Delete related edges / step transitions. ਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 
				WHERE $from_id IN (਀ऀऀऀऀऀ  匀䔀䰀䔀䌀吀 ␀渀漀搀攀开椀搀 
					    FROM workflow_models.workflow_step_definitions AS wsd਀ऀऀऀऀऀ   圀䠀䔀刀䔀 眀猀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 
					  )਀ऀऀऀऀ伀刀 ␀琀漀开椀搀 䤀一 ⠀ 
					  SELECT $node_id਀ऀऀऀऀऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀 
					   WHERE wsd.workflow_model_step_id = @model_step_id਀ऀऀऀऀऀ  ⤀㬀 
਀ 
       -- Delete the step਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀  
		       WHERE workflow_model_step_id = @model_step_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;਀ 
	   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_step_transn]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Deletes the record for a given workflow step transition. ਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀㬀 ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
      -- 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 @transaction_ready = 'Ready'  ਀   䈀䔀䜀䤀一 
	BEGIN TRY਀ऀ䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		-- First delete any rule links਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀  
			  WHERE step_transition_id਀ऀऀऀऀऀ㴀  䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 
਀ऀ   ⴀⴀ 䐀攀氀攀琀攀 琀栀攀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 䤀䐀 
	   DELETE FROM workflow_models.workflow_step_transitions਀ऀऀऀ 圀䠀䔀刀䔀     猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀  
				   =  @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.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	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 -- END IF @transaction_ready = 'Ready'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开砀爀攀昀开琀礀瀀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a cross reference type.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_xref_type] ਀ 
     @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 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 @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		DELETE FROM xref.cross_reference_types਀ऀऀ      圀䠀䔀刀䔀 砀爀攀昀开琀礀瀀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   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: 13-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 愀琀琀爀椀戀甀琀攀 
-- Input is the text fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  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';਀ऀऀऀ䔀一䐀 
਀ 
	  -- 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)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀⤀㬀  
		 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_com_obj_list_name]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀洀开漀戀樀开氀椀猀琀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @listname 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'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  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 @listname = NULL;਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 氀椀猀琀开渀愀洀攀  
		 		 	 FROM com_obj.common_object_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        = @listname,਀ऀऀ 䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
		 @data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀ 䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	   IF @tempvalidationstatus = 'Fail'਀ऀ      䈀䔀䜀䤀一 
		      SET @transaction_ready      = '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਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO com_obj.common_object_list_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      氀椀猀琀开渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀Ⰰ   挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀⤀ 
		      VALUES (@mnemonic, @listname, @description, @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਀    䔀一䐀 
਀ 
-- 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: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document cross doc date field name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀⸀ 
-- 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_doc_date_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 ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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 doc_attr.doc_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            = @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_INS_doc_int_field_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 昀椀攀氀搀 渀愀洀攀 
-- by inserting a record into doc_int_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_integer_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 -- End IF @unitid IS NOT NULL਀ 
		-- 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਀ 
਀ 
-- 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 (@unitnotexistmessage <> '')        SET @message = @message + ' | ' + @unitnotexistmessage;	਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_doc_ms_attr_fg_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Inserts 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_INS_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਀ 
      -- 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_ms_attr_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				WHERE      doc_ms_attr_id = @docmsattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
				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_ms_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_ms_attribute]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Creates a document 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_doc_ms_attribute] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ 
	  -- Check that the multi_select list name id exists਀ऀ  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　  
		 SET @docmslistid = NULL;਀ऀ  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN  ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
							  FROM doc_attr.doc_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 doc_attr.doc_multi_select_attributes ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ       氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ  搀漀挀开洀猀开氀椀猀琀开椀搀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @listposition,    @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(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_doc_multi_select_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀 
-- Input is the paramters for a document multi-select list name.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- 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_multi_select_list_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 @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 (@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 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.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@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਀ 
	  -- Check that the radio button list name id exists਀ऀ  䤀䘀 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 ✀✀  
		 SET @doc_radioblistid = NULL;਀ऀ  䤀䘀 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN  ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
							  FROM doc_attr.doc_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਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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_radio_button_attributes ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @listposition, @doc_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 @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_doc_radiob_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀⼀⨀  
   Creates a new document radio button list 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,਀ऀ 䀀爀攀猀琀爀椀挀琀攀搀 戀椀琀                  㴀 　Ⰰ 
	 @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_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 (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开爀戀开愀琀琀爀开昀最开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a document radio button 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 @docradiobattrid = NULL;਀  
		  -- Check if an attribute id was supplied. ਀ऀऀ  䤀䘀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- An 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_radio_button_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀⤀ 
					 BEGIN --  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_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 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_radiob_attr_fgroup_links ਀ऀऀ             ⠀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀Ⰰ 昀椀氀琀攀爀开最爀漀甀瀀开椀搀⤀ 
		      VALUES (@docradiobattrid,  @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: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document real number field name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀⸀ 
-- Input is the paramters for a document real number 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_real_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਀ 
਀ 
-- 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 (@unitnotexistmessage <> '')        SET @message = @message + ' | ' + @unitnotexistmessage;	਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_doc_text_field_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 渀愀洀攀 
-- by inserting a record into doc_free_text_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 doc_attr.doc_free_text_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 doc_attr.doc_free_text_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਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new file date field name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀⸀ 
-- Input is the paramters for a file date 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_date_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਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_file_int_field_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 昀椀氀攀 椀渀琀攀最攀爀 昀椀攀氀搀 渀愀洀攀 
-- by inserting a record into file_int_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_integer_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 -- End IF @unitid IS NOT NULL਀ऀऀऀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		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_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਀    䔀一䐀 
਀ 
-- 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 (@unitnotexistmessage <> '')        SET @message = @message + ' | ' + @unitnotexistmessage;	਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_file_ms_attr_fg_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Inserts 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_INS_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਀ 
      -- 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_ms_attr_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				WHERE     file_ms_attr_id = @filemsattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
				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_ms_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਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开洀猀开愀琀琀爀椀戀甀琀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-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.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @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 @file_mslistid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀攀开洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  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਀ 
	  -- 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,   file_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਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_file_multi_select_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀 
-- Input is the paramters for a file multi-select list name.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		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 file_attr.file_multi_select_list_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 @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_file_radiob_attr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Creates a file radio button attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 琀攀砀琀 昀椀攀氀搀猀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 昀椀氀琀攀爀 最爀漀甀瀀 愀渀搀 氀椀猀琀 渀愀洀攀 椀搀⸀ 
-- Output is a message, transaction status and the new record 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.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @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(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 @file_radioblistid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  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 @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਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
		             (mnem,      attr_name,       descr,        list_position,  file_radiob_list_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀Ⰰ 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀⤀㬀  
	     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 [configuring].[usp_INS_file_radiob_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀⼀⨀  
   Creates a new file radio button list 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,਀ऀ 䀀爀攀猀琀爀椀挀琀攀搀 戀椀琀                  㴀 　Ⰰ 
	 @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 file_attr.file_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 (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开爀戀开愀琀琀爀开昀最开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a radio button 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 @file_radiobattrid = NULL;਀  
		  -- Check if an attribute id was supplied. ਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- An 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_radio_button_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀⤀ 
					 BEGIN --  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_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 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_radiob_attr_fgroup_links ਀ऀऀ             ⠀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀Ⰰ 昀椀氀琀攀爀开最爀漀甀瀀开椀搀⤀ 
		      VALUES (@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   = '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: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new file real number field name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀⸀ 
-- Input is the paramters for a file real number 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_real_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਀ 
਀ 
-- 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 (@unitnotexistmessage <> '')        SET @message = @message + ' | ' + @unitnotexistmessage;	਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_file_text_field_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 渀愀洀攀 
-- by inserting a record into file_free_text_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';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  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_free_text_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_free_text_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਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_filter_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Creates a filter group਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 瀀漀猀椀琀椀漀渀 
-- Output is message, 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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- 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 forms.filter_groups ਀ऀऀऀऀऀ 圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀ 
		   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 failed data validation 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਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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: 01-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
/* ਀   䌀爀攀愀琀攀猀 愀 渀攀眀 昀漀爀洀 最爀漀甀瀀 渀愀洀攀 
   by inserting a record into forms.form_group_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_form_group_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		਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@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 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.form_group_names (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 (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_general_field_name]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀崀  
਀     䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ              
	 @generalfield_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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@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 = '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 must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀氀渀⸀渀愀洀攀 
				   FROM people.general_field_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,       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਀    䔀一䐀 
਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_step_status_definition]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Creates a workflow instance step status 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_step_status_definition] ਀ 
	 @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.step_status_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: 02-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䄀搀搀猀 愀 甀渀椀琀 漀昀 洀攀愀猀甀爀攀 琀漀 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 
-- Input is the units, description and list position.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_unit_of_measure] ਀ 
	 @unitofmeasure 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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- 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 @description IS NULL SET @description = '';਀ 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 甀渀椀琀 漀昀 洀攀愀猀甀爀攀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  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) ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			  SET @notuniquemessage = LEFT(@unitofmeasure, 10) + '... | ' + @tempmessage;਀ऀऀ   䔀䰀匀䔀  
				SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = '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;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀  
		             (unit,           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 (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_workflow_action]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Creates a workflow action 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_action] ਀ 
	 @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_actions ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      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_model_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 @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਀ 
਀䔀一䐀 
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.workflow_output_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਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    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]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Creates a workflow rule 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_rule] ਀ 
	 @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_rules ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      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: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 爀甀氀攀 琀漀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 猀琀攀瀀 氀椀渀欀⸀ 
-- Input is a workflow rule ID and a workflow step definition ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀崀 
     ਀ऀ 䀀眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀 㴀 　  
			 SET @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 @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 = @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 = @workflow_rule_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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀  
		             (step_transition_id, 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: 11-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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀崀  
਀ऀ 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @model_stepmnem nvarchar(10)     = NULL,਀ऀ 䀀洀漀搀攀氀开猀琀攀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @model_stepdescr 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.਀    䈀䔀䜀䤀一 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀攀 洀漀搀攀氀 椀搀 
	  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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀऀ ⴀⴀ 䤀渀猀攀爀琀 琀栀攀 渀攀眀 渀漀搀攀 
		INSERT INTO workflow_models.workflow_step_definitions ਀ऀऀऀ⠀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀Ⰰ 洀漀搀攀氀开猀琀攀瀀开洀渀攀洀Ⰰ 洀漀搀攀氀开猀琀攀瀀开渀愀洀攀Ⰰ 洀漀搀攀氀开猀琀攀瀀开搀攀猀挀爀Ⰰ 洀漀搀攀氀开猀琀攀瀀开漀爀搀攀爀⤀ऀऀऀऀऀऀ  
			VALUES (@workflow_model_id, @model_stepmnem, @model_stepname, @model_stepdescr, @model_steporder); ਀ऀ    匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   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_step_transn]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Inserts a record into workflow_models.workflow_step_transitions to create 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_INS_workflow_step_transn] ਀ 
	 @workflow_actionid bigint         = NULL,਀ऀ 䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀Ⰰ 
	 @steptransition_name nvarchar(50) = NULL,਀ऀ 䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开搀攀猀挀爀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀ 㴀 一唀䰀䰀Ⰰ 
	 @from_step_id bigint              = 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.਀    䈀䔀䜀䤀一 
਀ 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀攀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀 椀搀 
	  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਀ 
	  IF @from_step_id = 0਀ऀऀ 匀䔀吀 䀀昀爀漀洀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if a model step id was supplied.਀ऀ  䤀䘀 䀀昀爀漀洀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'WfFromStepNotSupl', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   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 = 'WfFromStepInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䘀爀漀洀匀琀攀瀀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  IF @to_step_id = 0਀ऀऀ 匀䔀吀 䀀琀漀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if a model step id was supplied.਀ऀ  䤀䘀 䀀琀漀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'WfToStepNotSupl', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   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 = 'WfToStepInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀吀漀匀琀攀瀀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
-- Check that an existing record does not exist.਀ 
				IF EXISTS (    SELECT step_transition_id਀ऀऀऀऀ䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀琀 
				WHERE wt.$from_id = (਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 ␀渀漀搀攀开椀搀  
					FROM workflow_models.workflow_step_definitions ਀ऀऀऀऀऀ圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀昀爀漀洀开猀琀攀瀀开椀搀 
				)਀ऀऀऀऀ䄀一䐀 眀琀⸀␀琀漀开椀搀 㴀 ⠀ 
					SELECT $node_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 RecordExists.');਀ऀऀऀऀ 䔀一䐀 
਀ 
	  -- 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;਀ऀऀ ⴀⴀ 䤀渀猀攀爀琀 琀栀攀 渀攀眀 渀漀搀攀 
		INSERT INTO workflow_models.workflow_step_transitions ਀ऀऀऀ⠀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀Ⰰ ␀昀爀漀洀开椀搀Ⰰ ␀琀漀开椀搀Ⰰ 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开洀渀攀洀Ⰰ 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开渀愀洀攀Ⰰ 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开搀攀猀挀爀⤀ऀऀऀऀऀऀ  
			VALUES (@workflow_actionid, ਀ऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 ␀渀漀搀攀开椀搀  
					 FROM workflow_models.workflow_step_definitions ਀ऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀昀爀漀洀开猀琀攀瀀开椀搀⤀Ⰰ 
					(SELECT $node_id ਀ऀऀऀऀऀ 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀  
					 WHERE workflow_model_step_id = @to_step_id),਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开洀渀攀洀Ⰰ ✀✀⤀Ⰰ 
					 ISNULL(@steptransition_name, ''),਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开搀攀猀挀爀Ⰰ ✀✀⤀ऀऀऀऀऀ  
			       ); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
		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_xref_type]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 琀礀瀀攀 
-- by inserting a record into xref.cross_reference_types.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 昀椀攀氀搀 渀愀洀攀㨀 
-- 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 xref.cross_reference_types ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀⤀ 
		      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: 13-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the com_obj.common_object_attributes 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_com_obj_attribute] ਀ 
     @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 common_object_attribute_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE common_object_attribute_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage =  CONVERT(nvarchar(10), @recordid) + ' | ' + @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 common_object_attribute_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 com_obj.common_object_attributes ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE common_object_attribute_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_com_obj_list_name]    Script Date: Tue 12-05-2026 5:43:19 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 [configuring].[usp_UPD_com_obj_list_name] ਀ 
     @recordid bigint	              = NULL,਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @listname 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'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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਀ 
	  -- Record id check਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
	     SET @recordid = 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਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀ  ⴀⴀ 䤀渀挀氀甀搀攀猀 挀栀攀挀欀椀渀最 椀昀 琀栀攀 渀愀洀攀 椀猀 渀甀氀氀 
	  ਀ऀ   䤀䘀 䀀氀椀猀琀渀愀洀攀 㴀 ✀✀ 
		  SET @listname = NULL;਀ 
	   EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀ 䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
		 @attr_name        = @listname,਀ऀऀ 䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
		 @data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀ 䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	   IF @tempvalidationstatus = 'Fail'਀ऀ      䈀䔀䜀䤀一 
		      SET @transaction_ready      = 'Fail';਀ऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					   FROM com_obj.common_object_list_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 氀椀猀琀开渀愀洀攀 㴀 䀀氀椀猀琀渀愀洀攀 
							AND common_object_list_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@listname, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = '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;਀ऀ     唀倀䐀䄀吀䔀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
		    SET mnem        = ISNULL(@mnemonic, ''),਀ऀऀऀ    氀椀猀琀开渀愀洀攀   㴀 䀀氀椀猀琀渀愀洀攀Ⰰ 
				description = ISNULL(@description, ''),   ਀ऀऀऀऀ挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀 
          WHERE com_obj.common_object_list_names.common_object_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਀ 
਀ 
-- 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;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
	IF (@xrefinvalidmessage <> '')         SET @message = @message + ' | ' + @xrefinvalidmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀攀昀愀甀氀琀开搀愀琀攀开猀琀礀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the default date style.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 渀攀眀 搀攀昀愀甀氀琀 搀愀琀攀 猀琀礀氀攀 
-- Output is a message and transaction status.਀ⴀⴀ⌀⌀ 一伀吀䔀 琀栀愀琀 琀栀攀 搀攀昀愀甀氀琀 猀琀礀氀攀 椀猀 椀渀琀攀渀搀攀搀 琀漀 椀渀昀漀爀洀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 漀昀 琀栀攀 搀攀昀愀甀氀琀 猀琀礀氀攀 昀漀爀 搀椀猀瀀氀愀礀椀渀最 搀愀琀攀猀⸀ 
-- The date style does not affect how dates are stored. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_default_date_style] ਀ 
     @datetimestyle 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 @datetimestyle = ''਀ऀऀ 匀䔀吀 䀀搀愀琀攀琀椀洀攀猀琀礀氀攀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀搀愀琀攀琀椀洀攀猀琀礀氀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoDateStyle', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀匀琀礀氀攀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀愀琀攀琀椀洀攀开猀琀礀氀攀 
							  FROM base.datetime_styles ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀愀琀攀琀椀洀攀开猀琀礀氀攀 㴀 䀀搀愀琀攀琀椀洀攀猀琀礀氀攀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DateStyleInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   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 date_style = @datetimestyle਀ऀऀ  圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀㬀  
	   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-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the doc_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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @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_date_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_date_field_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND doc_date_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_int_field_name]    Script Date: Tue 12-05-2026 5:43:19 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_int_field_name] ਀ 
     @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 doc_attr.doc_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 doc_attr.doc_integer_field_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND doc_int_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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   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_doc_ms_attr_fg_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Updates 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_UPD_doc_ms_attr_fg_link]਀      
	 @docmsattrid bigint              = NULL,਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @newdoc_msattrid 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 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਀ 
-- doc multi select attribute validation਀     䤀䘀 䀀渀攀眀搀漀挀开洀猀愀琀琀爀椀搀 㴀 　 
	    SET @newdoc_msattrid = 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_multi_select_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_ms_attr_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				WHERE      doc_ms_attr_id = @newdoc_msattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
				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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_ms_attr_fgroup_links ਀ऀऀ    匀䔀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀渀攀眀搀漀挀开洀猀愀琀琀爀椀搀 
		  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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_ms_attr_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list assignment for 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_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 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਀ 
		  -- Validate the multi-select list id.  Null is permitted. ਀ऀऀ  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　 
			 SET @docmslistid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
			 BEGIN  -- Check that the multi-select list id exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
								  FROM doc_attr.doc_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 doc_multi_select_links਀ऀऀⴀⴀ 䤀昀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀猀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 琀栀攀渀 椀琀 挀愀渀渀漀琀 戀攀 
		-- re-assigned to a different list.਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		   BEGIN਀ऀऀ     䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
			              FROM doc_attr.doc_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 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;਀    䤀䘀 ⠀䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀㬀 
    IF (@list_invalidmessage <> '')        SET @message = @message + ' | ' + @list_invalidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀猀开愀琀琀爀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 17-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 漀昀 愀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 
-- Input is a record id and new 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 ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @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_multi_select_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_doc_ms_attr_text]    Script Date: Tue 12-05-2026 5:43:19 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਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_ms_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 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 @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
					   FROM doc_attr.doc_multi_select_attributes਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND doc_ms_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;਀ 
਀䔀一䐀 
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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- 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 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਀ऀऀ 䔀一䐀 
਀ 
	  -- 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 ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  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 (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀猀开氀椀猀琀开琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the doc_multi_select_list_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 唀瀀搀愀琀椀渀最 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 椀猀 挀愀爀爀椀攀搀 漀甀琀 瘀椀愀 甀猀瀀开唀倀䐀开搀漀挀开洀猀开氀椀猀琀开瀀漀猀渀 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_ms_list_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';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT doc_ms_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਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- 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_radiob_attr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name, description and position਀ⴀⴀ 昀漀爀 琀栀攀 搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name, description and list position.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Updating just the list position only can be carried out via usp_UPD_doc_rb_list_posn਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_radiob_attr] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@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_radiob_attr_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE doc_radiob_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_radiob_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_radio_button_attributes ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			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 (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_rb_attr_fg_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Updates 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_UPD_doc_rb_attr_fg_link]਀      
	 @docradiobattrid bigint          = NULL,਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @newdoc_radiobattrid 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 @docradiobattrid = 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_radio_button_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 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਀ 
਀ⴀⴀ 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 瘀愀氀椀搀愀琀椀漀渀 
     IF @newdoc_radiobattrid = 0਀ऀ    匀䔀吀 䀀渀攀眀搀漀挀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
	 IF @newdoc_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 doc_radiob_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
						   WHERE doc_radiob_attr_id = @newdoc_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਀ⴀⴀ 
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
							 FROM doc_attr.doc_radiob_attr_fgroup_links਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀      昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							      = @filtergroupid   ਀ऀऀऀऀऀऀ     䄀一䐀      搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
							      = @newdoc_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 update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
		    SET doc_radiob_attr_id = @newdoc_radiobattrid਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 
		    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: 23-07-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_doc_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਀ऀऀ䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀猀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 琀漀 愀渀 漀戀樀攀挀琀 
		@list_invalidmessage nvarchar(200)      = '', -- Communicates that the radio button list id was 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 @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_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE doc_radiob_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 radio button list id.  Null is permitted. ਀ऀऀ  䤀䘀 䀀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　 
			 SET @radioblistid = NULL;਀ऀऀ  䤀䘀 䀀爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
			 BEGIN  -- Check that the radio button list id exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
								  FROM doc_attr.doc_radio_button_list_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀爀愀搀椀漀戀氀椀猀琀椀搀⤀  
					 BEGIN -- Radio button list id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RBListNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀䈀䰀椀猀琀一漀琀䔀砀椀猀琀⸀✀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 䌀栀攀挀欀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 眀椀琀栀 搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 
		-- If the attribute is already linked with a document then it cannot be਀ऀऀⴀⴀ 爀攀ⴀ愀猀猀椀最渀攀搀 琀漀 愀 搀椀昀昀攀爀攀渀琀 氀椀猀琀⸀ 
		IF @data_validation_status = 'Pass'਀ऀऀ   䈀䔀䜀䤀一 
		     IF EXISTS (SELECT doc_radiob_list_id਀ऀऀऀ              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
						 WHERE doc_radiob_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਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  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_attributes ਀ऀऀ    匀䔀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀爀愀搀椀漀戀氀椀猀琀椀搀 
		  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 (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀    䤀䘀 ⠀䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀㬀 
    IF (@list_invalidmessage <> '')        SET @message = @message + ' | ' + @list_invalidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开愀琀琀爀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 漀昀 愀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 
-- Input is a record id and new list position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_rb_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_radiob_attr_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE doc_radiob_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_radio_button_attributes ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  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 (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_rb_list_posn]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the document radio button list position਀ⴀⴀ 䤀渀瀀甀琀 椀猀 爀攀挀漀爀搀 椀搀 愀渀搀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_rb_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';਀ 
  -- 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 doc_attr.doc_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਀ऀ 
-- 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਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Description:	Updates the mnemonic, name, description and position ਀ⴀⴀ 昀漀爀 琀栀攀 搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 琀愀戀氀攀⸀ 
-- 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_rb_list_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 doc_attr.doc_radio_button_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_radio_button_list_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND doc_radiob_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;਀ 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开爀攀猀琀爀椀挀琀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-10-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 爀攀猀琀爀椀挀琀椀漀渀 昀氀愀最 眀栀椀挀栀 爀攀猀琀爀椀挀琀猀 氀椀渀欀椀渀最 
-- of an attribute in that list to a document to controller roles only. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 爀攀挀漀爀搀 椀搀 愀渀搀 爀攀猀琀爀椀挀琀椀漀渀 昀氀愀最 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_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';਀ 
  -- 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 doc_attr.doc_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਀ऀ 
-- 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_doc_real_field_name]    Script Date: Tue 12-05-2026 5:43:19 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_real_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_real_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE doc_real_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_real_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_real_number_field_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE doc_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;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the doc_free_text_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_free_text_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_free_text_field_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND doc_free_text_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_file_date_field_name]    Script Date: Tue 12-05-2026 5:43:19 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_date_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_date_field_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND file_date_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;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开椀渀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the file_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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_int_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_int_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_int_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_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            = @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_file_ms_attr_fg_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Updates 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_UPD_file_ms_attr_fg_link]਀      
	 @filtergroupid 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਀ 
	    @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 multi-select attribute id was supplied. ਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A  multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 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਀ 
--=====================਀ⴀⴀ 䌀栀攀挀欀 渀攀眀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 
     IF @newfilemsattrid = 0਀ऀ    匀䔀吀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
	 IF @newfilemsattrid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_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_ms_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
						   WHERE file_ms_attr_id = @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 AttrIDNotExist.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ 
		 -- Check for a duplicate record਀ऀऀ   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀  
							FROM file_attr.file_ms_attr_fgroup_links ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀    昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							     = @filtergroupid਀ऀऀऀऀऀऀऀ 䄀一䐀    昀椀氀攀开洀猀开愀琀琀爀开椀搀  
							     = @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਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	         UPDATE file_attr.file_ms_attr_fgroup_links ਀ऀऀऀ    匀䔀吀       昀椀氀攀开洀猀开愀琀琀爀开椀搀  
				    = @newfilemsattrid਀ऀऀ       圀䠀䔀刀䔀      昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 
			          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: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 愀猀猀椀最渀洀攀渀琀 昀漀爀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 
-- Input is a record id and new list id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开愀琀琀爀开氀椀猀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @filemslistid 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 file_attr.file_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
					 BEGIN -- Record id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀ  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀⸀  一甀氀氀 椀猀 瀀攀爀洀椀琀琀攀搀⸀  
		  IF @filemslistid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filemslistid IS NOT NULL਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT file_ms_list_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
								 WHERE file_ms_list_id = @filemslistid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   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 fileument then it cannot be਀ऀऀⴀⴀ 爀攀ⴀ愀猀猀椀最渀攀搀 琀漀 愀 搀椀昀昀攀爀攀渀琀 氀椀猀琀⸀ 
		IF @data_validation_status = 'Pass'਀ऀऀ   䈀䔀䜀䤀一 
		     IF EXISTS (SELECT file_ms_list_id਀ऀऀऀ              䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 
						 WHERE file_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 file_ms_list_id = @filemslistid਀ऀऀ  圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
       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;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开愀琀琀爀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 漀昀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 
-- Input is a record id and new 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 ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @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_multi_select_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: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the file_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.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_ms_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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 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_multi_select_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_multi_select_attributes਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND file_ms_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_ms_list_posn]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the file multi-select list position਀ⴀⴀ 䤀渀瀀甀琀 椀猀 爀攀挀漀爀搀 椀搀 愀渀搀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_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';਀ 
  -- 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_multi_select_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_multi_select_list_names ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE file_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 (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开氀椀猀琀开琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the file_multi_select_list_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 唀瀀搀愀琀椀渀最 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 椀猀 挀愀爀爀椀攀搀 漀甀琀 瘀椀愀 甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开氀椀猀琀开瀀漀猀渀 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_ms_list_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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT file_ms_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_multi_select_list_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE file_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: 19-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_rb_attr_fg_link]਀      
	 @filtergroupid bigint            = NULL,਀ऀ 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @newfile_radiobattrid 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 @file_radiobattrid = NULL;਀  
		  -- Check if an attribute id was supplied. ਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- An attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 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਀ 
--=====================਀     䤀䘀 䀀渀攀眀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 　 
	    SET @newfile_radiobattrid = 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_radio_button_attributes ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀渀攀眀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'AttrIDNotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
		   IF EXISTS (SELECT file_radiob_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
						   WHERE    filter_group_id ਀ऀऀऀऀऀऀऀ     㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
							 AND    file_radiob_attr_id ਀ऀऀऀऀऀऀऀ     㴀 䀀渀攀眀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀⤀ 
			   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_radiob_attr_id ਀ऀऀऀऀ     㴀 䀀渀攀眀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 
		       WHERE      file_radiob_attr_id ਀ऀऀऀ         㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 
			     AND    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_UPD_file_rb_attr_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list assignment for a file 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਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@list_invalidmessage nvarchar(200)      = '', -- Communicates that the radio button 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_radiob_attr_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE file_radiob_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 radio button list id.  Null is permitted. ਀ऀ  䤀䘀 䀀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　 
		 SET @radioblistid = NULL;਀ऀ  䤀䘀 䀀爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN  -- Check that the radio button list id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
							  FROM file_attr.file_radio_button_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀爀愀搀椀漀戀氀椀猀琀椀搀⤀  
				 BEGIN -- Radio button list id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RBListNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   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਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
		    SET file_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 (@list_invalidmessage <> '')        SET @message = @message + ' | ' + @list_invalidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开愀琀琀爀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 漀昀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 
-- Input is a record id and new list position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_rb_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_radiob_attr_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE file_radiob_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_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;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开愀琀琀爀开琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08--2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the file_radio_button_attributes 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_attr_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE file_radiob_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_radiob_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_radio_button_attributes ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  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 (@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: 31-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Input is record id and position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_rb_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 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 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_list_text]    Script Date: Tue 12-05-2026 5:43:19 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_list_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 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_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_radio_button_list_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND file_radiob_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_restriction]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ㄀　ⴀ㈀　㈀㐀 
-- Description:	Updates the file 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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  
  -- 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: 14-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the file_attr.file_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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_real_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_real_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_real_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_real_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;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the file_free_text_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 file_attr.file_free_text_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_free_text_field_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND file_free_text_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_free_text_field_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE file_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: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 漀昀 愀 昀椀氀琀攀爀 最爀漀甀瀀 
-- Input is a record id and new list position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_filter_group_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';਀ 
  -- 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 filter_group_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_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_filter_group_text]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- 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';਀ 
  -- 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਀  匀䔀吀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
  SET @username = SUSER_SNAME(@connectedusersid);਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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 filter_group_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
								 WHERE filter_group_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 filter_group_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 forms.filter_groups ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  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;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开最爀漀甀瀀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 漀昀 愀 昀漀爀洀 最爀漀甀瀀 
-- Input is a record id and new list position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_form_group_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';਀ 
  -- 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 form_group_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀  
								 WHERE form_group_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 forms.form_group_names ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE form_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: 01-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the text fields for a form group.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- 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';਀ 
  -- 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 form_group_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀  
							 WHERE form_group_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 form_group_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 forms.form_group_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE form_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;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开最攀渀开昀椀攀氀搀开渀愀洀攀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 漀昀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 
-- Input is a record id and new list position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_gen_field_name_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 general_field_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE general_field_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਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  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 people.general_field_names ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE general_field_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 (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_general_field_name]    Script Date: Tue 12-05-2026 5:43:19 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)           = '',             ਀ऀ 䀀最攀渀攀爀愀氀昀椀攀氀搀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 ✀✀Ⰰ 
	 @description 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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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 @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.general_field_names AS gfn਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀ 
				 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 gfn.name਀ऀऀ ऀऀ       䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
				      WHERE gfn.name = @generalfield_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 -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_unit_of_measure]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Updates a a record in base.units_of_measure਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 䤀䐀Ⰰ 甀渀椀琀猀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @unitofmeasure 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਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@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 @description IS NULL SET @description = '';਀ 
	-- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
		  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 base.units_of_measure ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 甀渀椀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
					 BEGIN -- Record id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
					 END਀ऀऀऀ 䔀一䐀 
	  -- 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਀ 
	  -- New attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 甀渀椀琀  
				    FROM base.units_of_measure ਀ऀऀऀऀ   圀䠀䔀刀䔀 甀渀椀琀 㴀 䀀甀渀椀琀漀昀洀攀愀猀甀爀攀  
				   AND   unit_id <> @recordid) ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			  SET @notuniquemessage = LEFT(@unitofmeasure, 10) + '... | ' + @tempmessage;਀ऀऀ   䔀䰀匀䔀  
				SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = '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;਀ऀ     唀倀䐀䄀吀䔀  戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀  
		       SET           unit = @unitofmeasure,਀ऀऀऀ                搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
					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 (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_unlock_document_id]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Unlocks a document id਀ⴀⴀ 戀礀 猀攀琀琀椀渀最 琀栀攀 䰀漀挀欀 匀琀愀琀甀猀 琀漀 唀渀氀漀挀欀攀搀⸀ 
-- Input is a document ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_unlock_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;਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
        @nodatamessage nvarchar(200)            = '', -- Communicates that no data 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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀  
		           SET document_id_list.lock_status = 'Unlocked'਀ऀऀऀ     圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
	   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 (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀              匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀愀琀愀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_wf_step_status_def_psn]    Script Date: Tue 12-05-2026 5:43:19 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.step_status_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_instances.step_status_definitions 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 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਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT step_status_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_instances.step_status_definitions ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  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਀ 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开愀挀琀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the workflow_models.workflow_actions 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_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਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT workflow_action_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_actions ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE workflow_action_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 action.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_workflow_action_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_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਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE workflow_models.workflow_actions ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE workflow_action_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_model_name]    Script Date: Tue 12-05-2026 5:43:19 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_model_name] ਀ 
     @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_model_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 workflow_models.workflow_model_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND workflow_model_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_model_nm_posn]    Script Date: Tue 12-05-2026 5:43:19 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_model_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 @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the workflow_instances.workflow_output_definitions 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 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਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT output_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_instances.workflow_output_definitions ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE output_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 output position name.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_workflow_output_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 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਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE workflow_instances.workflow_output_definitions ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE output_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_rule]    Script Date: Tue 12-05-2026 5:43:19 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_rule] ਀ 
     @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_rules਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀甀氀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 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_rules਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND rule_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_rule_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Updates 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_UPD_workflow_rule_link]਀      
	 @workflow_rule_id bigint         = NULL,਀ऀ 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @new_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 old 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 @new_workflow_rule_id = 0 ਀ऀऀऀ 匀䔀吀 䀀渀攀眀开眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 眀漀爀欀昀氀漀眀 爀甀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @new_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 @new_workflow_rule_id IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT rule_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀  
								 WHERE rule_id = @new_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 @new_step_transitionid = 0 ਀ऀऀ 匀䔀吀 䀀渀攀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
		IF @new_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 = @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 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਀        䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM workflow_models.workflow_rule_links ਀ऀऀऀऀ圀䠀䔀刀䔀             爀甀氀攀开椀搀  
						= @workflow_rule_id							      ਀ऀऀऀऀऀ䄀一䐀     猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀  
						=  @step_transitionid਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀  
		             (step_transition_id, 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   = '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_rule_posn]    Script Date: Tue 12-05-2026 5:43:19 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_rules਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀甀氀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 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: 17-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 昀漀爀 愀 爀攀挀漀爀搀 椀渀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 琀漀 甀瀀搀愀琀攀 愀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 猀琀攀瀀 渀漀搀攀⸀  
-- All values must be re-sent, otherwise they will be set to NULL. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀Ⰰ 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀 愀渀搀 愀 琀攀砀琀 爀攀瀀爀攀猀攀渀琀愀琀椀漀渀 漀昀 琀栀攀 栀椀攀爀愀爀挀栀礀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀崀  
਀     䀀洀漀搀攀氀开猀琀攀瀀开椀搀 椀渀琀Ⰰ  
	 @workflow_model_id bigint        = NULL,਀ऀ 䀀洀漀搀攀氀开猀琀攀瀀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @model_stepname nvarchar(50)     = NULL,਀ऀ 䀀洀漀搀攀氀开猀琀攀瀀搀攀猀挀爀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀   㴀 一唀䰀䰀Ⰰ 
	 @model_steporder int             = 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.਀    䈀䔀䜀䤀一 
਀ऀ  䤀䘀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 　 
		 SET @model_step_id = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @model_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 NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE workflow_model_step_id = @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 NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	-- 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਀ऀऀ ⴀⴀ 䤀渀猀攀爀琀 琀栀攀 渀攀眀 渀漀搀攀 
	   BEGIN TRANSACTION;਀ऀऀ唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀  
			SET model_step_name = ISNULL(@model_stepname, ''), ਀ऀऀऀ    洀漀搀攀氀开猀琀攀瀀开洀渀攀洀 㴀 䤀匀一唀䰀䰀⠀䀀洀漀搀攀氀开猀琀攀瀀洀渀攀洀Ⰰ ✀✀⤀Ⰰ  
				model_step_descr = ISNULL(@model_stepdescr, ''),਀ऀऀऀऀ洀漀搀攀氀开猀琀攀瀀开漀爀搀攀爀 㴀 䤀匀一唀䰀䰀⠀䀀洀漀搀攀氀开猀琀攀瀀漀爀搀攀爀Ⰰ ✀✀⤀ऀऀऀऀऀ  
		WHERE  workflow_model_step_id਀ऀऀ      㴀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 
		  AND workflow_model_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: 17-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 琀漀 甀瀀搀愀琀攀 愀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 攀搀最攀⸀  
-- Note that becuase this is a graph table, the from and to columns cannot be updated.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀渀崀  
਀ऀ 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @workflow_actionid bigint         = NULL,਀ऀ 䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀Ⰰ 
	 @steptransition_name nvarchar(50) = 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਀ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀      ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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 ਀ऀऀ 䔀一䐀   
਀ 
	-- 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਀ऀऀ 䔀一䐀 
਀ऀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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਀ऀऀ唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀  
		   SET workflow_action_id = @workflow_actionid, ਀ऀऀऀ   猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开洀渀攀洀  㴀 䤀匀一唀䰀䰀⠀䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开洀渀攀洀Ⰰ ✀✀⤀Ⰰ  
			   step_transition_name  = ISNULL(@steptransition_name, ''), ਀ऀऀऀ   猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开搀攀猀挀爀 㴀 䤀匀一唀䰀䰀⠀䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开搀攀猀挀爀Ⰰ ✀✀⤀ 
		 WHERE    step_transition_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਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开砀爀攀昀开琀礀瀀攀开氀椀猀琀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the list position for a cross reference type.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_xref_type_list_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 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਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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 ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  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 [configuring].[usp_UPD_xref_type_text]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 琀攀砀琀 昀椀攀氀搀猀 昀漀爀 愀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 琀礀瀀攀⸀ 
-- 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_xref_type_text] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name 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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
			AND	EXISTS (SELECT xref_type_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਀ 
	  -- 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 @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀洀洀漀渀开漀戀樀开氀椀猀琀开椀琀攀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀琀攀洀 
-- Input is common object list id and a common object id. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_common_obj_list_item] ਀ 
     @commonobjlistid 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 ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@recordnotexistmessage nvarchar(200)    = '', -- Communicates that the record does not exist਀ऀऀ䀀渀漀挀漀洀漀戀樀氀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 
		@nocomobjectmessage nvarchar(200)       = '', -- Communicates that a common object id was not supplied਀ऀऀ䀀挀漀洀漀戀樀氀椀猀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 眀愀猀 椀渀瘀愀氀椀搀 
		@comobjectinvalidmessage nvarchar(200)  = '', -- Communicates that the comon object id was invalid਀ऀऀ䀀昀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@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਀ऀऀ  䔀一䐀 
਀ 
    -- Check the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                   FROM com_obj.common_object_lists਀ऀऀऀऀऀ      圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					            AND common_object_id = @commonobjectid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @recordnotexistmessage = CONVERT(nvarchar(10), @commonobjlistid) + '  ' + CONVERT(nvarchar(10), @commonobjectid) + ' | ' + @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @recordnotexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀    ⴀⴀ 刀攀昀攀爀攀渀挀攀 挀栀攀挀欀猀 
      -- Check for any referential constraints਀      䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  ⴀⴀ 䐀漀渀✀琀 瀀攀爀昀漀爀洀 琀栀攀 爀攀昀攀爀攀渀挀攀 挀栀攀挀欀猀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
	  IF     EXISTS (SELECT common_object_id ਀ऀऀऀ           䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀   
			          WHERE          common_object_id = @commonobjectid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
          OR EXISTS (SELECT common_object_id ਀ऀऀऀ           䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀  
			          WHERE          common_object_id = @commonobjectid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
          OR EXISTS (SELECT common_object_id ਀ऀऀऀ           䘀刀伀䴀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀  
			          WHERE          common_object_id = @commonobjectid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
          OR EXISTS (SELECT common_object_id ਀ऀऀऀ           䘀刀伀䴀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀  
			          WHERE          common_object_id = @commonobjectid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @commonobjlistid) + '  ' + CONVERT(nvarchar(10), @commonobjectid) + ' | ' + @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_lists ਀ऀऀ      圀䠀䔀刀䔀          挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
			        AND common_object_list_id = @commonobjlistid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         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 (@nocomobjectmessage <> '')         SET @message = @message + ' | ' + @nocomobjectmessage;਀ऀ䤀䘀 ⠀䀀挀漀洀漀戀樀氀椀猀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀挀漀洀漀戀樀氀椀猀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@comobjectinvalidmessage <> '')    SET @message = @message + ' | ' + @comobjectinvalidmessage;਀ऀ䤀䘀 ⠀䀀昀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀洀洀漀渀开漀戀樀攀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 13-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Deletes a common object record਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_common_object] ਀ 
     @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;਀ 
  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਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@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਀ 
	  -- 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_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
				   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  ਀ऀऀऀ       圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  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_objects ਀ऀऀ      圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	   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 [controlling].[usp_DEL_contr_doc_group_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 搀漀挀甀洀攀渀琀 琀漀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a document id and a controller level document 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 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਀ 
  -- 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 @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 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 NoDocIDAccess.'); ਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ 
	 -- 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਀ 
  -- Check if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
  		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
							  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 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀  
		  WHERE doc_id = @documentid਀ऀऀऀ    䄀一䐀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   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-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes 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_DEL_contr_file_group_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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@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';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  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 @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  -- 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 or edit it਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'NoFileIDAccess', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀  
						 END਀ऀऀऀऀ䔀一䐀 
਀ 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 
	 -- This also returns fail if the id does not exist਀    䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开挀漀渀琀开昀椀氀攀开最爀瀀崀 
	     @contr_file_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 InvalidConFileGrp');਀ऀऀ䔀一䐀 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
  IF @data_validation_status = 'Pass'਀  ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT controller_file_group_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀  
							 WHERE controller_file_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_file_group_links ਀ऀऀ  圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
			    AND controller_file_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_doc_gp_ed_perm_funct]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record for a document group edit permission for duty function list.਀⨀ 
*/਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开最瀀开攀搀开瀀攀爀洀开昀甀渀挀琀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀            Ⰰ  ⴀⴀ 䐀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @functionlistid bigint        ,  -- 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 = @message + ' | ' + ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @message = @message + ' | A database level message error occurred on NoPermission. ';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀 
		 IF @docgroupid 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';਀ऀऀ   䔀一䐀 
	     ELSE਀ऀऀऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
			 -- 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 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਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF NOT EXISTS (SELECT doc_group_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 = @message + ' | ' + @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @message = @message + ' | ' + 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 
		  WHERE         doc_group_id = @docgroupid਀ऀऀऀ    䄀一䐀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀㬀  
	   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 = @message + ' | ' +  ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_doc_gp_ed_perm_people]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record for a document group edit permission for people list.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - ``@docgroupid 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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀Ⰰ 漀爀 渀漀渀ⴀ攀砀椀猀琀椀渀最 爀攀挀漀爀搀 椀渀 搀愀琀愀戀愀猀攀⸀ 
* - Delete Operation Fail: In case of an exception during the update, returns an error message with details.਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes a record in 'user_restr.doc_group_edit_perm_people_lst' table if all conditions are met.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䈀漀琀栀 䀀搀漀挀最爀漀甀瀀椀搀 愀渀搀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 瘀愀氀椀搀⸀ 
* - There must be an existing record matching @docgroupid and @peoplelistid.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
CREATE PROCEDURE [controlling].[usp_DEL_doc_gp_ed_perm_people] ਀ 
     @docgroupid bigint               = NULL,  -- 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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- 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਀ऀऀ   䈀䔀䜀䤀一 
			 -- 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 = 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਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  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 PeopleListIDInvalid');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF NOT EXISTS (SELECT doc_group_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 = @message + ' | ' + @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @message = @message + ' | ' + 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀 
		  WHERE         doc_group_id = @docgroupid਀ऀऀऀ    䄀一䐀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀㬀  
	   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 = @message + ' | ' +  ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
  END -- End of IF authentication status = Pass.਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_doc_group_name_rstr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㠀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a document group name. ਀ⴀⴀ 伀渀氀礀 昀漀爀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀⸀ 
-- Input is a document group id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_doc_group_name_rstr] ਀ 
     @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;਀ 
  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)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@nodocgroup_permissionmsg nvarchar(200)	= '', -- Communicates that the user does not have permission to modify the document group਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀搀漀挀最爀漀甀瀀椀搀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀             㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@recordnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied document group id does not exist਀ऀऀ䀀搀漀挀最爀瀀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀甀洀攀渀琀 琀漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 氀椀渀欀 攀砀椀猀琀猀 
		@docpermexistsmessage nvarchar(200)     = '', -- Communicates that a document group view permission entry exists਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@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;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    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 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 @id_to_delete = 0਀ऀऀ 匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	  -- Check document group id has been supplied਀ऀ  䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoDocGroupId', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀椀搀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀椀搀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀⸀✀㬀 
		 END਀ 
      -- Check for any references to documents.  Fail if any exist.਀      䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 
	              FROM xref.doc_group_links AS dgl਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
			       ON dgl.doc_group_id਀ऀऀऀऀ    㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
				WHERE dgl.doc_group_id = @id_to_delete)਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䜀爀瀀䰀椀渀欀䔀砀椀猀琀猀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @docgrpexistsmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @docgrpexistsmessage = 'A database level message error occurred on DocGrpLinkExists.';਀ऀऀ 䔀一䐀 
਀ 
	  -- Check for any document group view permission entries.  Fail if any exist. ਀      䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
	              FROM xref.doc_group_names AS dgn਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
			       ON dgvp.doc_group_id਀ऀऀऀऀ     㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
				WHERE dgn.doc_group_id = @id_to_delete)਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀嘀椀攀眀倀攀爀洀䔀砀椀猀琀猀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @docpermexistsmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @docpermexistsmessage = 'A database level message error occurred on ViewPermExists.';਀ऀऀ 䔀一䐀 
਀ 
	  -- 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 doc_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਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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 (@nodocgroup_permissionmsg <> '')   SET @message = @message + ' | ' + @nodocgroup_permissionmsg;਀ऀ䤀䘀 ⠀䀀搀漀挀最爀瀀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀最爀瀀攀砀椀猀琀猀洀攀猀猀愀最攀㬀 
	IF (@docpermexistsmessage <> '')       SET @message = @message + ' | ' + @docpermexistsmessage;	਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_duty_function]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
-- Input is record id ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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.਀⨀ ⴀ 一漀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 洀甀猀琀 攀砀椀猀琀 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @id_to_delete must be valid and free from referential constraints਀⨀ 
* **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਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 @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.duty_functions AS df਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
	  -- Check for any referential constraints਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
					   FROM people.function_lists AS fl਀ऀऀऀऀऀ  圀䠀䔀刀䔀 昀氀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
			OR EXISTS (SELECT dfsl.function_id ਀ऀऀऀऀऀऀ 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						WHERE dfsl.function_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਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM people.duty_functions਀ऀऀ  圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀  
	   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'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record in people.duty_function_sid_links਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀甀渀挀琀椀漀渀 椀搀 愀渀搀 猀椀搀 氀椀猀琀 椀搀   
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record in 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਀⨀ ⴀ 䀀猀椀搀爀攀挀漀爀搀椀搀㨀 䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀⸀ 一漀琀 瀀攀爀洀椀琀琀攀搀 琀漀 戀攀 攀洀瀀琀礀 漀爀 一唀䰀䰀 
* - 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_DEL_duty_function_sid_link] ਀ 
     @functionid 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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
	 -- 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.');਀ऀऀऀ 䔀一䐀 
਀ 
	 -- 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');	਀ऀऀऀ䔀一䐀 
਀ 
     -- Check that a matching record exists਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    AND NOT EXISTS ਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
				   FROM people.duty_function_sid_links AS dfsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
						AND dfsl.sid_id  = @sidrecordid)਀ऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_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਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the delete query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  INSERT INTO user_restr.user_privilege_revoke_log -- Create an audit log entry਀ऀ              ⠀瀀爀椀瘀椀氀攀最攀Ⰰ 瀀爀椀瘀椀氀攀最攀开渀愀洀攀Ⰰ 猀椀搀开椀搀Ⰰ 甀猀攀爀渀愀洀攀Ⰰ 最爀愀渀琀攀搀开漀渀Ⰰ 最爀愀渀琀攀搀开戀礀Ⰰ 爀攀瘀漀欀攀搀开戀礀⤀ 
	       VALUES ('Function List',਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 渀愀洀攀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
				                   WHERE    function_id ਀ऀऀऀऀऀऀऀऀ         㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀Ⰰ 
		          @sidrecordid,਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 甀猀攀爀渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ 
		          (SELECT created FROM people.duty_function_sid_links਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀  
									   AND sid_id = @sidrecordid),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 最爀愀渀琀攀搀开戀礀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 
									WHERE    function_id ਀ऀऀऀऀऀऀऀऀऀ      㴀 䀀昀甀渀挀琀椀漀渀椀搀  
										  AND sid_id ਀ऀऀऀऀऀऀऀऀऀऀ    㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ 
				  @username)਀ 
	     DELETE people.duty_function_sid_links          ਀ऀऀ  圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀  
		        AND sid_id = @sidrecordid; ਀ऀ  䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from user_restr.file_group_edit_perm_funct_lst to de-authorise ਀ⴀⴀ 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀昀 甀猀攀爀猀 琀漀 攀搀椀琀 昀椀氀攀 洀攀琀愀搀愀琀愀 眀椀琀栀椀渀 愀 昀椀氀攀 最爀漀甀瀀⸀  
-- Input is a file group ID, a function list ID.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 琀漀 搀攀ⴀ愀甀琀栀漀爀椀猀攀 愀 昀甀渀挀椀漀渀 氀椀猀琀 琀漀 攀搀椀琀 洀攀琀愀搀愀琀愀 昀漀爀 昀椀氀攀猀 眀椀琀栀椀渀 愀 昀椀氀攀 最爀漀甀瀀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @functionlistid 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 or no matching record.਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes 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_DEL_file_gp_ed_perm_funct] ਀ 
     @filegroupid bigint              = NULL,             -- File 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 @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 function list id has been supplied਀ऀ     䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
		    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਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  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਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM user_restr.file_group_edit_perm_funct_lst਀ऀऀ       圀䠀䔀刀䔀     昀椀氀攀开最爀漀甀瀀开椀搀    㴀 䀀昀椀氀攀最爀漀甀瀀椀搀 
			         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: 07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from user_restr.file_group_edit_perm_ppl_lst to de-authorise ਀ⴀⴀ 愀 瀀攀漀瀀氀攀 氀椀猀琀 漀昀 甀猀攀爀猀 琀漀 攀搀椀琀 昀椀氀攀 洀攀琀愀搀愀琀愀 眀椀琀栀椀渀 愀 昀椀氀攀 最爀漀甀瀀⸀  
-- Input is a file group ID, a people list ID.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 people list ID or no matching record.਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes a record in 'user_restr.file_group_edit_perm_ppl_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_DEL_file_gp_ed_perm_people] ਀ 
     @filegroupid bigint              = NULL,             -- File 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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- 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 @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   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 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਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM user_restr.file_group_edit_perm_ppl_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 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-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a file group name record.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 最爀漀甀瀀 椀搀   
-- Output is a status message.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀 爀攀挀漀爀搀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀   䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最Ⰰ 椀渀瘀愀氀椀搀 漀爀 搀甀瀀氀椀挀愀琀攀 䀀愀琀琀爀开渀愀洀攀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 ✀砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀✀ 琀愀戀氀攀 椀昀 愀氀氀 挀漀渀搀椀琀椀漀渀猀 愀爀攀 洀攀琀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @id_to_delete must be provided and valid.਀⨀ ⴀ 吀栀攀爀攀 洀甀猀琀 戀攀 渀漀 爀攀昀攀爀攀渀挀攀猀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_file_group_name] ਀ 
	 @id_to_delete 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਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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਀ 
-- Data validation਀  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 昀椀氀攀 最爀漀甀瀀 椀搀 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	 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 @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 file_group_id ਀ऀऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
					   WHERE fgn.file_group_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.');਀ऀऀऀ   䔀一䐀 
		 END਀  䔀一䐀  ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
਀ 
  -- Check for any referential constraints਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
    BEGIN਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
				   FROM xref.file_group_links AS fgl਀ऀऀऀऀ  圀䠀䔀刀䔀 昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT fgepfl.file_group_id ਀ऀऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 
					WHERE fgepfl.file_group_id  = @id_to_delete) ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
					 FROM user_restr.file_group_edit_perm_ppl_lst AS fgeppl਀ऀऀऀऀऀ圀䠀䔀刀䔀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  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਀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM xref.file_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 @message = CONCAT(' | ', @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');਀ऀऀ䔀一䐀 
਀ 
  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 common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
		   SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			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.');਀ऀऀऀ䔀一䐀 
਀ 
    -- 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਀ 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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_com_obj_ms_defaults ਀ऀऀ       圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			         AND common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ 䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀㬀  
	   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_dc_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_doc_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਀ 
਀ 
਀䔀一䐀 
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_dc_c_ob_rb_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 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_doc_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਀ 
਀ 
਀䔀一䐀 
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_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_bk_stat_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Deletes a link between a form and base.booking_log.booking_status.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- 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_booking_status_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_status_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_usrid_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_usrnm_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Deletes a link between a form and base.document_id_list.system_username. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- 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_usernm_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_usernm_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_cmts_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_date_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Deletes a link between a form and base.document_id_list.booking_date. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- 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_date_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_date_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_rel_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_id_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Deletes a link between a form and a document-created-by-id 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_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_created_by_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_crtd_by_nm_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_funct_lst_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a document duty function list. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_doc_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਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    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_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਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_fl_c_ob_ms_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes 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,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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_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 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_rb_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਀ 
਀ 
  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_file_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਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
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');਀ऀऀ䔀一䐀 
਀ 
  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 common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		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਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		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.');਀ऀऀऀ䔀一䐀 
਀ 
    -- Check if a record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                   FROM forms.form_file_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਀ 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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_defaults ਀ऀऀ       圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			         AND common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ 䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀㬀  
	   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_fl_crtd_by_id_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Deletes a link between a form and a file-created-by-id 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_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_file_created_by_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: 07-07-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_nm_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_funct_lst_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a file duty function list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- 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');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    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_file_function_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-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 挀爀攀愀琀攀搀 昀椀攀氀搀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_doc_created_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_doc_date_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a link between a form and a document date name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开搀愀琀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @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 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 @docdatenameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docdatenameid 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_date_field_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND doc_date_name_id = @docdatenameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
					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: 20-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_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 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 @docintnameid = 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_int_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_integer_field_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND doc_int_name_id = @docintnameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         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_lock_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a document lock 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_doc_lock_status_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_lock_status_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਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_doc_ms_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㠀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Deletes 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,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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 @docmslistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docmslistid 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 NoAttrListID.';਀ऀऀ 䔀一䐀 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
						   FROM forms.form_doc_multi_sel_list_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND doc_ms_list_id = @docmslistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					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: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 漀戀樀攀挀琀⸀  
-- Input is a form id, a document multi-select list id and a multi-select attribute id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀崀 
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @docmslistid 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਀ऀऀ䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　 匀䔀吀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		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.');਀ऀऀऀ䔀一䐀 
਀ 
	-- Check the multi-select attribute id reference਀ऀ    䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 㴀 　  
           SET @docmsattrid = 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 doc_ms_list_id਀ऀऀ                   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀 
					      WHERE doc_ms_list_id = @docmslistid਀ऀऀऀऀऀ            䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀 
							    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 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 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: 06-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  
-- Input is a form id and a document radio button list id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_doc_radiob_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਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@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਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@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 @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.';਀ऀऀ 䔀一䐀 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
						   FROM forms.form_doc_radio_button_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND doc_radiob_list_id = @docradioblistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   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 (@noattrnameidmessage <> '')        SET @message = @message + ' | ' + @noattrnameidmessage;਀    䤀䘀 ⠀䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最㬀ऀ 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_doc_real_link]    Script Date: Tue 12-05-2026 5:43:19 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਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开爀攀愀氀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docrealnameid 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 @docrealnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docrealnameid 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 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 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 = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@noformidmessage <> '')            SET @message = @message + ' | ' + @noformidmessage;਀    䤀䘀 ⠀䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@noattridmessage <> '')            SET @message = @message + ' | ' + @noattridmessage;਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_doc_tr_grp_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a document transaction group 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_doc_transaction_grp_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_transaction_grp_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: 07-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 挀爀攀愀琀攀搀 昀椀攀氀搀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_file_created_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_date_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a link between a form and a file date name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开搀愀琀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @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 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 @filedatenameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filedatenameid 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_date_field_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND file_date_name_id = @filedatenameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					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_file_hash_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਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     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_int_link]    Script Date: Tue 12-05-2026 5:43:19 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਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开椀渀琀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @fileintnameid 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਀ 
  -- 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 @fileintnameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file 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 file_int_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_integer_field_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND file_int_name_id = @fileintnameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         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_ms_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㄀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Deletes 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,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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 @filemultiselectlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filemultiselectlistid 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 NoAttrListID.';਀ऀऀ 䔀一䐀 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  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 @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_file_name_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');਀ऀऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    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_name_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_name_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਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_file_plist_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a file people list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- 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');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    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_file_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: 01-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  
-- Input is a form id and a file radio button list id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_file_radiob_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਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattrnameidmessage nvarchar(200)      = '', -- Communicates that a file radio button list id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@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 @file_radioblistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @file_radioblistid 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.';਀ऀऀ 䔀一䐀 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  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 @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 (@noattrnameidmessage <> '')        SET @message = @message + ' | ' + @noattrnameidmessage;਀    䤀䘀 ⠀䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最㬀ऀ 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀ 
਀䔀一䐀 
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_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 file 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 @filerealnameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file 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 file_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_file_real_number_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND file_real_name_id = @filerealnameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         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_retentn_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㌀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Deletes 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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀渀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @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_retention_date_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_retention_date_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਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_file_size_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a file field 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_size_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_size_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਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_file_tr_grp_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes 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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开琀爀开最爀瀀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @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_transactn_grp_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_transactn_grp_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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_frm_doc_free_txt_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a link between a form and a document free text name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀爀洀开搀漀挀开昀爀攀攀开琀砀琀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docfreetextnameid 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 @docfreetextnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 昀爀攀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docfreetextnameid 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_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 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 = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@noformidmessage <> '')            SET @message = @message + ' | ' + @noformidmessage;਀    䤀䘀 ⠀䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@noattridmessage <> '')            SET @message = @message + ' | ' + @noattridmessage;਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_frm_doc_funct_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a document 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_doc_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਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
	   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_frm_doc_ppl_lst_lnks]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a document people list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- 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_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_frm_doc_user_lnks]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Deletes a link between a form and a document 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_doc_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_frm_file_free_txt_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a link between a form and a file free text name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 昀爀攀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀爀洀开昀椀氀攀开昀爀攀攀开琀砀琀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @filefreetextnameid 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 @filefreetextnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 昀爀攀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filefreetextnameid 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_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 @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: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 搀甀琀礀 昀甀渀挀琀椀漀渀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_frm_file_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_file_function_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			    AND general_field_name_id = @genfield_nameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	   COMMIT TRANSACTION;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			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: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 搀攀昀愀甀氀琀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 漀戀樀攀挀琀⸀  
-- Input is a form id, a file multi-select list id and a multi-select attribute 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਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 爀攀昀攀爀攀渀挀攀 
	    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.');਀ऀऀऀ䔀一䐀 
਀ 
    -- Check if a 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਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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_multi_sel_defaults ਀ऀऀ       圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			         AND file_ms_list_id = @filemslistid਀ऀऀऀऀऀ 䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀㬀  
	   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: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 琀漀 甀猀攀爀 椀搀 氀椀渀欀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_frm_file_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_file_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਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from people.function_lists਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 愀渀搀 愀 昀甀渀挀琀椀漀渀 椀搀⸀   
-- Output is a status message and transation status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record from people.function_lists਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @functionlistid bigint: Must be a non-null and non-empty valid identifier from the function_list_names table.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀㨀 䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 搀甀琀礀开昀甀渀挀琀椀漀渀猀 琀愀戀氀攀 
* - The pair of @functionlistid and @functionid must match an existing record਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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_function_list] ਀ 
         ਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀      䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   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 exists.  Only perform this check if both parameters have been supplied.਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    AND NOT EXISTS ਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			   FROM people.function_lists AS fl਀ऀऀऀ  圀䠀䔀刀䔀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
					AND fl.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 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 function_list_id = @functionlistid਀ऀऀ        䄀一䐀  昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀㬀  
	   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_function_list_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 琀漀 搀攀氀攀琀攀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 渀愀洀攀 
-- Input is a record id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 琀漀 搀攀氀攀琀攀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 渀愀洀攀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀㨀 䴀愀渀搀愀琀漀爀礀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - None਀⨀ 
* **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_function_list_name] ਀ 
     @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 ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 @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 fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_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 function_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 -- End IF @userauthentication = 'Pass'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开瀀攀漀瀀氀攀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from people.people_list ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 愀渀搀 愀 瀀攀爀猀漀渀 椀搀⸀   
-- Output is a status message, transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record from people.people_list ਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @peoplelistid bigint: Must be a non-null and non-empty valid identifier from the people_list_names 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.people_lists ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开瀀攀漀瀀氀攀开氀椀猀琀崀  
਀          
	 @peoplelistid 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 people list id਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀      䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoPeopleListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   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 a matching record exists.  Only perform this check if both input values have been supplied. ਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    AND NOT EXISTS ਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
				   FROM people.people_lists AS pl਀ऀऀऀऀ  圀䠀䔀刀䔀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
						AND pl.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 NotExist.');਀ऀऀ䔀一䐀 
਀ऀऀⴀⴀ 刀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀 攀爀爀漀爀 洀攀猀猀愀最椀渀最 椀猀 栀愀渀搀氀攀搀 椀渀 琀栀攀 䌀䄀吀䌀䠀 戀氀漀挀欀⸀  
਀ 
	  -- 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਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  INSERT INTO user_restr.user_privilege_revoke_log -- Create an audit log entry਀ऀ              ⠀瀀爀椀瘀椀氀攀最攀Ⰰ 瀀爀椀瘀椀氀攀最攀开渀愀洀攀Ⰰ 猀椀搀开椀搀Ⰰ 甀猀攀爀渀愀洀攀Ⰰ 最爀愀渀琀攀搀开漀渀Ⰰ 最爀愀渀琀攀搀开戀礀Ⰰ 爀攀瘀漀欀攀搀开戀礀⤀ 
	       VALUES ('People List',਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 渀愀洀攀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
				                   WHERE    people_list_id ਀ऀऀऀऀऀऀऀऀ         㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ 
		          @sidid,਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 甀猀攀爀渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀猀椀搀椀搀⤀Ⰰ 
		          (SELECT created FROM people.people_lists਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
								       = @peoplelistid਀ऀऀऀऀऀऀऀऀ  ऀ   䄀一䐀 猀椀搀开椀搀  
									    = @sidid),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 最爀愀渀琀攀搀开戀礀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 
								    WHERE    people_list_id ਀ऀऀऀऀऀऀऀऀ          㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
								  	      AND sid_id ਀ऀऀऀऀऀऀऀऀऀ       㴀 䀀猀椀搀椀搀⤀Ⰰ 
				  @username)਀ 
	     DELETE FROM people.people_lists਀ऀऀ  圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
		        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਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from people.people_list_names to delete a people list name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 爀攀挀漀爀搀   
-- Output is a status message, transaction.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record from people.people_list_names to delete a people list name਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @id_to_delete਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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_name] ਀ 
     @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 ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 @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.people_list_names AS pln਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
				 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 update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM people.people_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 -- End IF @userauthentication = 'Pass'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开爀攀猀琀爀椀挀琀攀搀开昀漀爀洀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a form id but not if owned by others਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 
-- Output is a message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开爀攀猀琀爀椀挀琀攀搀开昀漀爀洀开椀搀崀 
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the form group 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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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.';਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀愀琀 昀漀爀洀 最爀漀甀瀀 
	  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   = '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 ਀ऀऀ       圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	   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 (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	਀ 
਀䔀一䐀 
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 edit a tag browsing tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开戀爀开琀爀开瀀攀爀洀开昀氀椀猀琀崀  
਀     䀀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @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 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਀ 
		-- 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    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_br_tr_perm_plist]    Script Date: Tue 12-05-2026 5:43:19 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_plist] ਀ 
     @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 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_br_tree_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
					      = @tag_br_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 @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_plist ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
		        = @tag_br_treeid਀ऀऀऀ䄀一䐀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			    = @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: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a tag browsing tree, both the name details and the nodes.਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀ  ऀ  䤀䘀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 　  
			 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.');਀ऀऀऀऀऀ 䔀一䐀 
			 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: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a new tag group identifier name record.਀ⴀⴀ 䄀氀氀 瀀愀爀愀洀攀琀攀爀猀 洀甀猀琀 戀攀 猀攀渀琀Ⰰ 漀琀栀攀爀眀椀猀攀 琀栀攀礀 眀椀氀氀 戀攀 猀攀琀 琀漀 渀甀氀氀⸀  
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_tag_group_id_name] ਀ 
	 @tag_groupid 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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 琀愀最 最爀漀甀瀀 䤀䐀⸀ 
	  ਀ऀ  ऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 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 @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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 tagging.tag_group_identifier_names ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
		        = @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਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            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_perm_flist]    Script Date: Tue 12-05-2026 5:43:19 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_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_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਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_group_permissions_flist ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
		        = @tag_groupid਀ऀऀऀ䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			    = @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 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 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_group_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
					      = @tag_groupid਀ऀऀऀऀऀ  䄀一䐀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					      = @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 @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_group_permissions_plist ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
		        = @tag_groupid਀ऀऀऀ䄀一䐀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			    = @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: 28-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a tag tree, both the name details and the nodes.਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 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਀ 
		-- 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_tree_id ਀ऀऀऀऀ  㴀 䀀琀愀最开琀爀攀攀椀搀㬀  
਀      ⴀⴀ 䐀攀氀攀琀攀 琀栀攀 琀愀最 琀爀攀攀 渀愀洀攀 搀攀琀愀椀氀猀 
	     DELETE tagging.tag_tree_names ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
				= @tag_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: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀爀攀瘀漀欀攀 愀甀琀栀漀爀椀猀琀椀漀渀 昀漀爀 洀攀洀戀攀爀猀 漀昀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 琀漀 攀搀椀琀 愀 琀愀最 琀爀攀攀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_tag_tree_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_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 @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_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE    tag_tree_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开琀爀攀攀椀搀 
					  AND    function_list_id਀ऀऀऀऀऀ      㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				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਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE user_restr.tag_tree_permissions_flist ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
		        = @tag_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 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 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 @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_tree_permissions_plist ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
		        = @tag_treeid਀ऀऀऀ䄀一䐀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			    = @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: 31-08-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a transaction group note.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @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 delete query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM base.transaction_groups ਀ऀऀ       圀䠀䔀刀䔀    琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀  
			         = @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   = '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਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_wf_step_duty_funct]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 
-- Input is an instance step id and a function 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਀ऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
		 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.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 椀搀 
	  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.');਀ऀऀऀ 䔀一䐀 
਀   䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ⴀⴀ 䘀甀琀栀攀爀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    BEGIN ਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			(SELECT workflow_instance_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 
			  WHERE workflow_instance_step_id ਀ऀऀऀ        㴀        䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
				AND    function_id਀ऀऀऀऀ    㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀爀攀 椀猀 愀 挀漀爀爀攀猀瀀漀渀搀椀渀最 昀漀爀攀椀最渀 欀攀礀 昀漀爀 琀栀攀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 ⼀ 昀甀渀挀琀椀漀渀开椀搀 椀渀 眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀⸀ 
  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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 
			   WHERE workflow_instance_step_id ਀ऀऀऀ         㴀        䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
				 AND    function_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: 09-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from workflow_instances.workflow_instance_definitions਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀⸀    
-- Output is a status message and transation status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_workflow_instance_def] ਀ 
         ਀ऀ 䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @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 nvarchar(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_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਀ 
	  -- 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 workflow_instances.workflow_instance_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 -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_workflow_instance_step]    Script Date: Tue 12-05-2026 5:43:19 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_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
			  WHERE workflow_instance_step_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_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 = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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_step_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: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from workflow_instances.workflow_step_participants਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 愀渀搀 愀 瀀攀爀猀漀渀 椀搀⸀    
-- Output is a status message and transation status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_workflow_participant] ਀ 
         ਀ऀ 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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.');਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀爀猀漀渀 椀搀 
	  IF @sidid = 0਀ऀ     匀䔀吀 䀀猀椀搀椀搀 㴀 一唀䰀䰀㬀 
      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.');਀ऀऀऀ 䔀一䐀 
਀   䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  ⴀⴀ 䘀甀琀栀攀爀 挀栀攀挀欀猀 愀昀琀攀爀 椀渀椀琀椀愀氀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    BEGIN ਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			(SELECT workflow_instance_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 
			  WHERE workflow_instance_step_id ਀ऀऀऀ        㴀        䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
				AND    sid_id਀ऀऀऀऀ    㴀 䀀猀椀搀椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					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਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀爀攀 椀猀 愀 挀漀爀爀攀猀瀀漀渀搀椀渀最 昀漀爀攀椀最渀 欀攀礀 昀漀爀 琀栀攀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 ⼀ 猀椀搀开椀搀 椀渀 眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀⸀ 
  IF EXISTS ਀    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	   FROM workflow_instances.workflow_person_output_files਀ऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	    AND 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 WfPersOutFRef.');਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM workflow_instances.workflow_step_participants਀ऀऀऀ   圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
			         =        @instance_step_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 IF @transaction_ready = 'Ready'਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀洀洀漀渀开漀戀樀攀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 13-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a common object 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 [controlling].[usp_INS_common_object] ਀ 
	 @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 ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 check਀ऀऀ䤀䘀 䀀漀戀樀攀挀琀渀愀洀攀 㴀 ✀✀ 
			SET @objectname = NULL;਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 漀戀樀攀挀琀开渀愀洀攀  
		 		 	 FROM com_obj.common_objects ਀ऀऀऀऀऀ圀䠀䔀刀䔀 漀戀樀攀挀琀开渀愀洀攀 㴀 䀀漀戀樀攀挀琀渀愀洀攀⤀  
			   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        = @objectname,਀ऀऀ 䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
		 @data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀ 䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	   IF @tempvalidationstatus = 'Fail'਀ऀ      䈀䔀䜀䤀一 
		      SET @transaction_ready      = '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਀ 
	     INSERT INTO com_obj.common_objects ਀ऀऀ             ⠀洀渀攀洀Ⰰ      漀戀樀攀挀琀开渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀Ⰰ   挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀⤀ 
		      VALUES (@mnemonic, @objectname, @description, @commonobjattrid); ਀ 
         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਀ 
-- Check the entry and retrieve the new row id਀  䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀⤀ 
    BEGIN TRY਀ऀ  匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	 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.';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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 [controlling].[usp_INS_common_object_lst_item]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀挀漀爀搀 
-- Input is a common object list id, a common object id (as element of a list)਀ⴀⴀ 氀椀猀琀 瀀漀猀椀琀椀漀渀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_common_object_lst_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'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 @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਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		               FROM com_obj.common_object_lists਀ऀऀऀऀऀ  圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					        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 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਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀  
		             (common_object_list_id, common_object_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਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_contr_doc_group_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Inserts a document to controller level document group link.਀ⴀⴀ 伀渀氀礀 瀀攀爀洀椀琀猀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 愀渀搀 搀漀挀甀洀攀渀琀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
-- Input is a document id, controller level document group id and notes.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @contr_doc_ed_grp_name_id bigint = NULL,਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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਀ 
		IF @contr_doc_ed_grp_name_id = 0਀ऀऀ   匀䔀吀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ䤀䘀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoConDocGroup', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀渀䐀漀挀䜀爀漀甀瀀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	 -- 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';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_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 @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 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 controller_doc_group_name_id = @contr_doc_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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- 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,      controller_doc_group_name_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 [controlling].[usp_INS_contr_file_group_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Inserts a file to controller level file group link.਀ⴀⴀ 伀渀氀礀 瀀攀爀洀椀琀猀 愀 昀椀氀攀 最爀漀甀瀀 愀渀搀 昀椀氀攀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
-- Input is a file id, controller level file group id and notes.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @contr_file_ed_grp_name_id bigint = NULL,਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '', ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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';਀ 
  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 @contr_file_ed_grp_name_id = 0਀ऀऀ   匀䔀吀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ䤀䘀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoConFileGroup', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀渀䘀椀氀攀䜀爀漀甀瀀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   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, ' | ', @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidConFileGrp');਀ऀऀ䔀一䐀 
਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ 
		   ELSE਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
					   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 edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ 
 ਀ऀऀऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最爀漀甀瀀 栀愀猀 戀攀攀渀 氀椀渀欀攀搀 琀漀 琀栀愀琀 昀椀氀攀 愀氀爀攀愀搀礀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀 
							 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 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,  controller_file_group_name_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 [controlling].[usp_INS_doc_gp_ed_perm_funct]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_doc_gp_ed_perm_funct] ਀ 
     @docgroupid bigint               = NULL,  -- Document group ਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	 @inputnotes nvarchar(max)        = '',    -- Notes for the entry਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@tempuserauth_status nchar(10)       = '',਀ऀऀ䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
        @nodocgroupmsg nvarchar(200)         = '',     -- Communicates that a document group id was not supplied਀ऀऀ䀀渀漀昀甀渀挀琀椀漀渀氀椀猀琀椀搀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@functionlistinvalid nvarchar(200)   = '',     -- Communicates that the function list was invalid਀ऀऀ䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 爀椀最栀琀猀 琀漀 椀琀 
	    @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਀ 
	     IF @docgroupid = 0਀ऀऀ    匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		 IF @docgroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @nodocgroupmsg = @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				SET @nodocgroupmsg = '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 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਀ ऀऀ    䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF EXISTS (SELECT doc_group_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀  
						 WHERE         doc_group_id = @docgroupid਀ऀऀऀऀऀऀ       䄀一䐀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
			   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 @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 
		             (doc_group_id, function_list_id,   notes, granted_by)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀Ⰰ   䀀椀渀瀀甀琀渀漀琀攀猀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀㬀  
         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 (@docgroupinvalidmsg <> '')         SET @message = @message + ' | ' + @docgroupinvalidmsg;਀ऀ䤀䘀 ⠀䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nofunctionlistidmsg <> '')        SET @message = @message + ' | ' + @nofunctionlistidmsg;਀ऀ䤀䘀 ⠀䀀昀甀渀挀琀椀漀渀氀椀猀琀椀渀瘀愀氀椀搀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀渀瘀愀氀椀搀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开最瀀开攀搀开瀀攀爀洀开瀀攀漀瀀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 17-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into user_restr.doc_group_edit_perm_people_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਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Inserts a document group to people list link record.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @docgroupid bigint: Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
* - ``@message nvarchar(1000) OUTPUT``: Descriptive status message of the procedure's execution.਀⨀ ⴀ 怀怀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀怀怀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 洀甀猀琀 戀攀 漀渀攀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀 昀漀爀⸀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀Ⰰ 漀爀 渀漀渀ⴀ攀砀椀猀琀椀渀最 爀攀挀漀爀搀 椀渀 搀愀琀愀戀愀猀攀⸀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_doc_gp_ed_perm_people] ਀ 
     @docgroupid bigint               = NULL,  -- Document 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';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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, @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਀ऀऀ 䔀䰀匀䔀 
			 -- 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 @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 doc_group_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀  
						 WHERE         doc_group_id = @docgroupid਀ऀऀऀऀऀऀ       䄀一䐀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
			   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਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀 
		             (doc_group_id, people_list_id,   notes, 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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_doc_group_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 渀愀洀攀 
-- by inserting a record into doc_group_names.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 渀愀洀攀㨀 
-- mnemonic, name, description.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开最爀漀甀瀀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' 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 ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the roles਀    䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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 = 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO xref.doc_group_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀⤀ 
		      VALUES (@mnemonic, @attribute_name, @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   = '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 (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀甀洀攀渀琀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 12-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 䤀䐀 爀攀挀漀爀搀⸀ 
-- Input is a document ID, a transaction group id (optional) and an ID lock status.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀⸀ 
-- See editing.usp_INS_document_id_restr for creating document ID by editor਀ⴀⴀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_document_id] ਀ऀ 
     @documentid nvarchar(50)         = NULL, ਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @idlockstatus nvarchar(10)       = 'Unlocked',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status 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਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @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 ਀ऀ    䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 猀琀爀椀渀最 眀愀猀 氀漀渀最攀爀 琀栀愀渀 㔀　 挀栀愀爀愀挀琀攀爀猀 愀渀搀 洀愀礀 栀愀瘀攀 戀攀攀渀 琀爀甀渀挀愀琀攀搀 
		@notuniquemessage nvarchar(200)      = '', -- Communicates that the document ID was not unique਀ऀऀ䀀椀渀瘀愀氀椀搀搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 椀渀瘀愀氀椀搀 
		@tg_invalidmessage nvarchar(200)     = '', -- Communicates that the transaction group id does not exist਀ऀऀ䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 椀渀琀ऀ             㴀 一唀䰀䰀Ⰰ ⴀⴀ 䴀愀砀椀洀甀洀 渀甀洀戀攀爀 漀昀 愀琀琀攀洀瀀琀猀 琀漀 愀甀琀漀最攀渀攀爀愀琀攀 愀 搀漀挀甀洀攀渀琀 䤀䐀 
		@has_non_printable_char int          = NULL, -- A count of the number of non-printable characters in the 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਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  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਀ 
਀  ⴀⴀ 匀攀氀攀挀琀 琀栀攀 匀䤀䐀 䤀䐀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	  SELECT @sidid = sl.sid_id਀ऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	   WHERE sl.sid = @connectedusersid;਀ 
		  -- Data validation਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 一唀䰀䰀 
		  IF @documentid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一 
				IF (SELECT use_auto_gen_doc_id_on_null਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⤀ 㴀 ✀一漀✀ 
					BEGIN਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id = 'NoData', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @nodatamessage = @tempmessage;਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
							  SET @nodatamessage = 'A database level message error occurred on NoData.';਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀一䐀 
				ELSE -- The document ID is NULL and the auto generate option is not 'No'਀ऀऀऀऀ   䈀䔀䜀䤀一 ⴀⴀ 䄀甀琀漀 最攀渀攀爀愀琀攀 愀 搀漀挀甀洀攀渀琀 䤀䐀 
						WHILE @maxiterationcount > 0਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
								SET @maxiterationcount = @maxiterationcount - 1;਀ऀऀऀऀऀऀऀऀ䤀䘀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀开昀漀爀洀愀琀 
								      FROM base.global_settings_groups) = 'Integer'਀ऀऀऀऀऀऀऀऀ  䈀䔀䜀䤀一 
								    SELECT @documentid = CONVERT(NVARCHAR(50), ISNULL(doc_id_last_integer, 0) + 1)਀ऀऀऀऀऀऀऀऀ      䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀㬀 
									UPDATE base.global_settings_groups਀ऀऀऀऀऀऀऀऀऀ  匀䔀吀 搀漀挀开椀搀开氀愀猀琀开椀渀琀攀最攀爀 㴀 搀漀挀开椀搀开氀愀猀琀开椀渀琀攀最攀爀 ⬀ ㄀㬀 
								  END਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 昀漀爀洀愀琀 椀猀 渀漀琀 䤀渀琀攀最攀爀⸀  
									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';਀ऀऀऀऀऀऀ   䔀一䐀 
						-- Add the prefix if prefix is selected in the global settings table਀ऀऀऀऀऀऀ䤀䘀 ⠀匀䔀䰀䔀䌀吀 椀猀开爀攀最椀猀琀攀爀开挀漀搀攀开愀瀀瀀氀椀攀搀  
							  FROM base.global_settings_groups) = 'Yes'਀ऀऀऀऀऀऀऀ   䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
							SET @documentid = (SELECT register_code਀ऀऀऀऀऀऀऀऀऀ                䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⤀ 
													+ '-' + @documentid                    ਀ऀऀऀऀ   䔀一䐀 ⴀⴀ 䔀渀搀 愀甀琀漀最攀渀攀爀愀琀攀 搀漀挀甀洀攀渀琀 䤀䐀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 搀漀挀甀洀攀渀琀 䤀䐀 猀甀瀀瀀氀椀攀搀⸀ 
			BEGIN   -- Check that the document ID is unique.਀ऀऀऀ   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀  
   								FROM base.document_id_list ਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀  
				  BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						 @message_id   = 'DocNotUnique', ਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ   匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 㘀⤀ ⬀ ✀⸀⸀⸀✀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀一漀琀唀渀椀焀甀攀⸀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  END -- End checking the uniqueness of the document ID਀ 
			 -- Check if the document ID might have been automatically truncated਀ऀऀऀ 䤀䘀 ⠀䰀䔀一⠀䀀搀漀挀甀洀攀渀琀椀搀⤀ 㸀㴀 㔀　⤀ 
				BEGIN਀ऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					   @message_id   = 'TooLong50', ਀ऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				  IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ 匀䔀吀 䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 㠀⤀ ⬀ ✀⸀⸀⸀✀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				  ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀漀漀䰀漀渀最㔀　⸀✀㬀 
					 -- Don't fail the transaction.  The string is just truncated. ਀ऀऀऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 
		  END -- End of else for no document is supplied਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 挀漀渀琀愀椀渀猀 愀渀礀 渀漀渀ⴀ瀀爀椀渀琀愀戀氀攀 挀栀愀爀愀挀琀攀爀猀 
		  SET @has_non_printable_char = PATINDEX(N'%[' + NCHAR(0) + '-' + NCHAR(31) + N']%', @documentid);਀ऀऀ  䤀䘀 䀀栀愀猀开渀漀渀开瀀爀椀渀琀愀戀氀攀开挀栀愀爀 㸀 　 
				  BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						 @message_id   = 'InvalidDocId', ਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ   匀䔀吀 䀀椀渀瘀愀氀椀搀搀漀挀椀搀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀椀渀瘀愀氀椀搀搀漀挀椀搀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䐀漀挀䤀搀⸀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  END -- End checking for any non-printable characters in the document ID਀ 
਀ 
			 -- 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਀ऀऀऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 爀攀昀攀爀攀渀挀攀 
਀ऀऀ  䤀䘀 䀀椀搀氀漀挀欀猀琀愀琀甀猀 㰀㸀 ✀䰀漀挀欀攀搀✀ 
			 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਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 ⠀搀漀挀开椀搀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀Ⰰ 氀漀挀欀开猀琀愀琀甀猀Ⰰ 挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀⤀ 
		      VALUES (@documentid, @transactiongroup, @idlockstatus, @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 @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 (@toolong50message <> '')           SET @message = @message + ' | ' + @toolong50message;਀    䤀䘀 ⠀䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀椀渀瘀愀氀椀搀搀漀挀椀搀 㰀㸀 ✀✀⤀               匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀渀瘀愀氀椀搀搀漀挀椀搀㬀 
	਀ 
  IF @transaction_status = 'Good'਀     匀䔀吀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
  ELSE SET @newdocumentid = '';਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀甀琀礀开昀甀渀挀琀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into people.duty_functions to create a duty function਀ⴀⴀ 䤀渀瀀甀琀 椀猀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- Output is a status message, transaction status and new record id.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Inserts a record into people.duty_functions to create a duty function਀⨀  
* **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.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_INS_duty_function] ਀ 
     @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.duty_functions AS df਀ऀऀऀऀ  圀䠀䔀刀䔀 搀昀⸀渀愀洀攀 㴀 䀀昀甀渀挀琀椀漀渀开渀愀洀攀⤀ 
		   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 -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_duty_function_sid_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 
-- Input is a function is, a sid record 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 unique਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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_duty_function_sid_link] ਀ 
     @functionid bigint               = NULL,਀ऀ 䀀猀椀搀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ             ⴀⴀ 䄀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ 渀漀琀 愀渀 愀挀琀甀愀氀 匀䤀䐀 
	 @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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
	 -- 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(@message, ' | ', ISNULL(CONVERT(nvarchar, @functionid), 'NULL'), '.  ', @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctionIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ 
	 -- 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਀ 
     -- Check that a matching record doesn't already exist਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    AND EXISTS ਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
				   FROM people.duty_function_sid_links AS dfsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
						AND dfsl.sid_id  = @sidrecordid)਀ऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_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 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_id,  sid_id,              notes,  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਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_file_gp_ed_perm_funct]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 琀漀 愀甀琀栀漀爀椀猀攀 琀栀攀 甀猀攀爀猀 眀栀漀 愀爀攀 洀攀洀戀攀爀猀 漀昀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 琀漀 攀搀椀琀 昀椀氀攀猀 眀椀琀栀椀渀 愀 昀椀氀攀 最爀漀甀瀀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @functionlistid 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_funct_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_funct] ਀ 
     @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਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_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 -- 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, ' | ', ISNULL(CONVERT(nvarchar(10), @functionlistid), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message =  CONCAT_WS(' | ', @message, 'A database level message error occurred on FileGroupIdNotExist');਀ 
				END਀            䔀一䐀 
਀ 
      -- Check the function list id has been supplied਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一唀䰀䰀   
	     BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 
	        BEGIN -- Check the function list exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
				                  FROM people.function_list_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀⤀㬀 
				   END਀ ऀऀ    䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF EXISTS (SELECT file_group_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀  
						 WHERE        file_group_id = @filegroupid਀ऀऀऀऀऀऀ       䄀一䐀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
			   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 @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 
		             (file_group_id, function_list_id,              notes, 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: 07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into user_restr.file_group_edit_perm_ppl_lst to authorise people list members਀ⴀⴀ 琀漀 攀搀椀琀 昀椀氀攀猀 眀椀琀栀椀渀 愀 昀椀氀攀 最爀漀甀瀀⸀  
-- Input is a file group ID, a people 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 @peoplelistid must be provided and be valid਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开最瀀开攀搀开瀀攀爀洀开瀀攀漀瀀氀攀崀  
਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀    Ⰰ               ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @peoplelistid 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਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_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 -- 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, ' | ', ISNULL(CONVERT(nvarchar(10), @filegroupid), 'NULL'), '  ', @tempmessage); ਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message =  CONCAT_WS(' | ', @message, 'A database level message error occurred on FileGroupIdNotExist');਀ 
				END਀            䔀一䐀 
਀ 
      -- Check the people list id has been supplied਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀   
	     BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 
	        BEGIN -- Check 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਀ ऀऀ    䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF EXISTS (SELECT file_group_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀  
						 WHERE      file_group_id = @filegroupid਀ऀऀऀऀऀऀ       䄀一䐀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
			   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 @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 
		             (file_group_id, people_list_id,              notes,      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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_file_group_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀 
-- by inserting a record into file_group_names.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀㨀 
-- mnemonic, name, description.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀⼀⨀⨀ 
* Creates a new file group name record.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @mnemonic nvarchar(10)਀⨀ ⴀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @description nvarchar(max)਀⨀ 
* **Return Values:**਀⨀ 
* - @newrecordid bigint: ID of the new record਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最Ⰰ 椀渀瘀愀氀椀搀 漀爀 搀甀瀀氀椀挀愀琀攀 䀀愀琀琀爀开渀愀洀攀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀搀搀猀 愀 爀攀挀漀爀搀 椀渀 ✀砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀✀ 琀愀戀氀攀 椀昀 愀氀氀 挀漀渀搀椀琀椀漀渀猀 愀爀攀 洀攀琀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @attribute_name must be provided and valid.਀⨀ ⴀ 吀栀攀爀攀 洀甀猀琀 渀漀琀 戀攀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 洀愀琀挀栀椀渀最 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_file_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 ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @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 @attribute_name = ''਀ऀऀ   匀䔀吀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 			FROM xref.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            = @validationmessage 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO xref.file_group_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ                   愀琀琀爀开渀愀洀攀Ⰰ              搀攀猀挀爀⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @attribute_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਀ 
	  ਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_dc_c_ob_ms_def]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates 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_INS_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਀ 
  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 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਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
							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਀ऀऀ䔀一䐀 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀猀 瘀愀氀椀搀 
	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਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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 forms.form_doc_com_obj_ms_defaults ਀ऀऀ             ⠀昀漀爀洀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀⤀ 
		      VALUES (@formid, @commonobjlistid,     @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   = '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_dc_c_ob_ms_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and a document common object multi-select 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';   -- 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 @commonobjlistid = 0 ਀ऀ    匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if 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਀ऀऀ 䔀一䐀 
਀ 
		-- 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_dc_c_ob_rb_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㘀 
-- Description:	Creates 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,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @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 a 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਀ऀऀ 䔀一䐀 
਀ 
	-- 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';਀ऀऀऀऀ   䔀一䐀 
਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		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_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 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_rb_lst_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3, default_common_object_id)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀Ⰰ   䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''), @defcommonobjid)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀戀漀漀欀椀渀最开椀搀⸀  
-- 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_doc_bk_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_doc_booking_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: 17-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最⸀戀漀漀欀椀渀最开猀琀愀琀甀猀⸀  
-- 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_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',  -- 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_doc_booking_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-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最⸀甀猀攀爀开椀搀 
-- 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_doc_bk_usrid_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_doc_booking_user_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: 17-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最⸀猀礀猀琀攀洀开甀猀攀爀渀愀洀攀 
-- 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_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',  -- 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_doc_booking_usernm_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-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最⸀挀漀洀洀攀渀琀猀 
-- 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_doc_bkg_cmts_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_doc_booking_comnts_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-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最⸀戀漀漀欀椀渀最开搀愀琀攀 
-- 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_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',  -- 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_doc_booking_date_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-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最⸀爀攀氀攀愀猀攀开渀甀洀戀攀爀 
-- 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_doc_bkg_rel_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_doc_booking_release_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_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',  -- 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_doc_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_doc_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_doc_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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 昀椀攀氀搀⸀  
-- 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_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_fm_fl_c_ob_ms_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and a file common object multi-select 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';   -- 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 @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਀ऀऀ 䔀一䐀 
਀ 
		-- 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: 27-06-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  
-- Input is a form id and a file 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_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';   -- 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 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਀ 
      -- 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 ComObjectNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		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_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 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_rb_lst_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3, default_common_object_id)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀Ⰰ   䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''), @defcommonobjid)਀ऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_com_obj_ms_def]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a default file multi-select common object. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀Ⰰ 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_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਀ 
  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 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਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
							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 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਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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, 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 @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_fl_crtd_by_id_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Creates a link between a form and the file-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_file_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_fl_crtd_by_nm_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Creates a link between a form and the 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';   -- 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_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_fl_funct_lst_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a file duty function 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_file_function_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਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 07-07-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_form_doc_created_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_doc_created_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: 16-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 昀椀攀氀搀⸀  
-- Input is a form id and a document date field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_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(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 date 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 @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 @recordexistsmessage = @tempmessage;਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
								SET @recordexistsmessage = 'A database level message error occurred on RecordExists.';਀ऀऀऀऀ䔀一䐀 
			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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_doc_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 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_free_text_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਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @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 @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 @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_free_text_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 (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_doc_int_lnk]    Script Date: Tue 12-05-2026 5:43:19 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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开椀渀琀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docintnameid 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 @docintnameid = 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_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 @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_integer_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: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 氀漀挀欀 猀琀愀琀甀猀 昀椀攀氀搀⸀  
-- Input is a form id and a real number name field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_doc_lock_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 = 0਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    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 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_doc_ms_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Creates 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਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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 @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਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the list id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
							  FROM doc_attr.doc_multi_select_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 @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = 'A database level message error occurred on FrmMandInvalid.';਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
						   FROM forms.form_doc_multi_sel_list_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND doc_ms_list_id = @docmslistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					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_multi_sel_list_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: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 漀戀樀攀挀琀⸀  
-- Input is a form id, a document multi-select list id and a multi-select object id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀崀 
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @docmslistid 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 @docmslistid = NULL;਀ऀऀ䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀  
		 		 			 FROM doc_attr.doc_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 @docmsattrid = NULL;਀ऀऀ䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀  
		 		 			 FROM doc_attr.doc_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 doc_ms_list_id਀ऀऀ               䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀 
					  WHERE doc_ms_list_id = @docmslistid਀ऀऀऀऀऀ        䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀 
							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 doc_attr.doc_multi_select_attributes਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
					            AND doc_ms_attr_id = @docmsattrid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT(@message, ' | List: ', CONVERT(nvarchar(10), @docmslistid), ', 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, doc_ms_list_id, 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   = '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_radiob_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Creates 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,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @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 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 @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 @docradioblistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 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.');਀ऀऀ 䔀一䐀 
	  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 @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, '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 @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefaultInvalid.');਀ऀऀऀऀऀ 䔀一䐀 
		 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 already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
						   FROM forms.form_doc_radio_button_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								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 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_radio_button_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3,             default_doc_rb_attr_id)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀Ⰰ   䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''), @defaultdocrb_attrid)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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: 30-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_real_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 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 @docrealnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docrealnameid 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_real_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE doc_real_name_id = @docrealnameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   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_real_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_real_name_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @docrealnameid,   @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_tr_grp_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a document 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_doc_transaction_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਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 07-07-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_form_file_created_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_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: 30-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 搀愀琀攀 昀椀攀氀搀⸀  
-- Input is a form id and a file date field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@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 date field id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀椀氀攀 搀愀琀攀 昀椀攀氀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordexistsmessage nvarchar(200)      = '', -- Communicates that a matching record already exists਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@dateformat nchar(3)                    = 'dmy',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 @filedatenameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file 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 file_attr.file_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 file_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਀ऀऀ   䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  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_date_name_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                   愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @filedatenameid,   @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_free_txt_lnk]    Script Date: Tue 12-05-2026 5:43:19 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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开昀爀攀攀开琀砀琀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @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 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 @filefreetextnameid = 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_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_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 @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_free_text_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_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',  -- 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_content_hash_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_int_lnk]    Script Date: Tue 12-05-2026 5:43:19 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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开椀渀琀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @fileintnameid 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 filefree 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 @fileintnameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if filefree 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_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_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 @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_integer_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: 01-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀⸀  
-- Input is a form id and a file multi-select list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_file_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 file multi-select list id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordexistsmessage nvarchar(200)      = '', -- Communicates that a matching record already exists਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 @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 @filemultiselectlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filemultiselectlistid 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 file multi-select list 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 @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = '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 @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = '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 @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_multi_sel_list_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 昀椀氀攀开洀猀开氀椀猀琀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ       瀀漀猀椀琀椀漀渀Ⰰ      愀琀琀爀椀戀甀琀攀㄀Ⰰ  愀琀琀爀椀戀甀琀攀㈀Ⰰ  愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @filemultiselectlistid,   @ismandatory, @fieldlength, @formposition, @attribute1, @attribute2, @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_file_name_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_file_name_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਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开瀀氀椀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id and a general field name id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  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_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 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: 01-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  
-- Input is a form id and a file radio button list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_file_radiob_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @defaultfile_rb_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 @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਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the list id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
							  FROM file_attr.file_radio_button_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_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 @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਀ऀ   
਀ 
	  -- 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_radio_button_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3,               default_file_rb_attr_id)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀Ⰰ  䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''), @defaultfile_rb_attrid)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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: 01-10-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_real_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 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 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 @filerealnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filerealnameid 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_real_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_real_name_id = @filerealnameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   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_real_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_real_name_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @filerealnameid,   @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;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀渀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 23-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 爀攀琀攀渀琀椀漀渀 搀愀琀攀 昀椀攀氀搀⸀  
-- 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_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',  -- 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_retention_date_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_size_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a file size 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_size_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_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_file_transactn_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_id_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Creates a form identifier name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 洀渀攀洀漀渀椀挀Ⰰ 昀漀爀洀 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 氀椀猀琀 瀀漀猀椀琀椀漀渀 愀渀搀 昀漀爀洀 最爀漀甀瀀 椀搀⸀ 
-- Output is a message, transaction status and the new record id.਀ⴀⴀ 䤀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 戀甀琀 渀漀琀 愀 挀漀渀昀椀最甀爀愀琀漀爀 琀栀攀渀 琀栀攀 昀漀爀洀 最爀漀甀瀀 洀甀猀琀 戀攀 漀眀渀攀搀 戀礀 琀栀攀  
-- connected user. ਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开椀搀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @formname nvarchar(50)           = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @listposition int                = 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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀            㴀 ✀✀Ⰰ 
		@temp_userauth_status nchar(10)       = 'Fail',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
		@iscontroller nvarchar(3)             = 'No',਀ऀऀ䀀椀猀挀漀渀昀椀最甀爀愀琀漀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀           㴀 ✀一漀✀Ⰰ 
		@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਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  SET @connectedusersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀  匀䔀吀 䀀甀猀攀爀渀愀洀攀 㴀 匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' ਀     䈀䔀䜀䤀一 
         SET @userauthentication_status = 'Pass';਀ऀऀ 匀䔀吀 䀀椀猀挀漀渀昀椀最甀爀愀琀漀爀 㴀 ✀夀攀猀✀㬀 
	 END਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
      BEGIN਀ऀऀ  匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
		  SET @iscontroller = 'Yes';਀      䔀一䐀 
਀ 
  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 form_name ਀ऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
				  WHERE form_name = @formname) ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			  SET @message = CONCAT(@message, ' | ', LEFT(@formname, 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.) ਀ऀ    匀䔀吀 䀀琀攀洀瀀洀攀猀猀愀最攀 㴀 一唀䰀䰀㬀 
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @formname,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀漀爀洀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @formgroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formgroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀  
							 WHERE form_group_id = @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 FmGNotExist');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀一䐀  
			 ELSE  -- Exists.  If user is a controller, check if the form group is not one which is owned by the connnected user਀ऀऀऀ   䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀ 䄀一䐀 䀀椀猀挀漀渀昀椀最甀爀愀琀漀爀 㴀 ✀一漀✀ 
				 BEGIN਀ऀऀऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 䄀匀 昀最椀 
									FROM forms.form_group_names AS fgn਀ऀऀऀऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 䄀匀 昀漀 
										ON fgn.form_group_id਀ऀऀऀऀऀऀऀऀऀऀ  㴀 昀漀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
							INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀऀ伀一 昀漀⸀猀椀搀开椀搀 
										 = sl.sid_id਀ऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀  猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀                                          
								         AND fgn.form_group_id = @formgroupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 最爀漀甀瀀 椀猀 渀漀琀 漀眀渀攀搀 戀礀 琀栀攀 甀猀攀爀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FormGroupNotOwned', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀䜀爀漀甀瀀一漀琀伀眀渀攀搀✀⤀㬀 
					 END ਀ऀऀऀऀ 䔀一䐀 
		 END   -- End checking form 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਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
		             (mnem,      form_name, descr,        list_position,  form_group_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀昀漀爀洀渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀Ⰰ 䀀昀漀爀洀最爀漀甀瀀椀搀⤀㬀  
	  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: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 搀甀琀礀 昀甀渀挀琀椀漀渀 昀椀攀氀搀⸀  
-- Input is a form id and a general field name id field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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_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: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id and a general field name id field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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_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 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: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 搀漀挀甀洀攀渀琀 琀漀 甀猀攀爀 䤀䐀 昀椀攀氀搀 氀椀渀欀⸀  
-- Input is a form id and a general field name id field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_frm_doc_user_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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_doc_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 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: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 昀椀攀氀搀⸀  
-- Input is a form id and a general field name id field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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 = 0਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    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_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_frm_file_multi_sel_def]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a default file multi-select object. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀Ⰰ 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 漀戀樀攀挀琀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_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.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT file_ms_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
							WHERE file_ms_list_id  = @filemslistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀琀琀爀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @filemslistid), '  ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListIDNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 爀攀昀攀爀攀渀挀攀 
	    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.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT file_ms_attr_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
							WHERE file_ms_attr_id  = @filemsattrid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT( @message, ' | ', CONVERT(nvarchar(10), @filemsattrid), '  ', @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_file_multi_sel_defaults਀ऀऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
					        AND file_ms_attr_id = @filemsattrid਀ऀऀऀऀऀऀऀ䄀一䐀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
		  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 file_ms_list_id਀ऀऀ                   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 
					      WHERE file_ms_list_id = @filemslistid਀ऀऀऀऀऀ            䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䰀椀猀琀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀Ⰰ ✀Ⰰ 伀戀樀攀挀琀㨀 ✀Ⰰ  
					                        CONVERT(nvarchar(10), @filemsattrid), '  ', @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_file_multi_sel_defaults ਀ऀऀ             ⠀昀漀爀洀开椀搀Ⰰ 昀椀氀攀开洀猀开氀椀猀琀开椀搀Ⰰ 昀椀氀攀开洀猀开愀琀琀爀开椀搀⤀ 
		      VALUES (@formid, @filemslistid,     @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 a general field name id field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_frm_file_user_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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_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 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਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into people.function_lists to create a element in a function list਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀Ⰰ 愀 昀甀渀挀琀椀漀渀 椀搀Ⰰ 氀椀猀琀 瀀漀猀椀琀椀漀渀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀⸀   
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Inserts a record into people.function_lists to create a element in a function list਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @functionlistid bigint: Must be a non-null and non-empty valid identifier from the function_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.function_lists ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀甀渀挀琀椀漀渀开氀椀猀琀崀  
਀          
	 @functionlistid 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 @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 -- 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 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 EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		   FROM people.function_lists AS fl਀ऀऀ  圀䠀䔀刀䔀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
		        AND fl.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 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 people.function_lists਀ऀऀ             ⠀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀Ⰰ  昀甀渀挀琀椀漀渀开椀搀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (@functionlistid,  @functionid,  ISNULL(@listposition, 0)); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_function_list_name]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 琀漀 挀爀攀愀琀攀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 渀愀洀攀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
* - @functionlist_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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀搀搀猀 愀 渀攀眀 爀攀挀漀爀搀 琀漀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @functionlist_name must be unique਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀崀  
਀     䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ              
	 @functionlist_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 fln.name਀ऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
				  WHERE fln.name = @functionlist_name)਀ऀऀ   䈀䔀䜀䤀一 
			 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO people.function_list_names਀ऀऀ             ⠀洀渀攀洀Ⰰ                                渀愀洀攀Ⰰ            搀攀猀挀爀椀瀀琀椀漀渀⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @functionlist_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਀ 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_people_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 琀漀 挀爀攀愀琀攀 愀渀 攀氀攀洀攀渀琀 椀渀 愀 瀀攀漀瀀氀攀 氀椀猀琀 
-- Input is a people list id, a person id, list position and filter group id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 渀攀眀 爀攀挀漀爀搀 椀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 琀漀 挀爀攀愀琀攀 愀渀 攀氀攀洀攀渀琀 椀渀 愀 瀀攀漀瀀氀攀 氀椀猀琀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀 昀爀漀洀 琀栀攀 瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 琀愀戀氀攀⸀ 
* - @sidid bigint: Must be a valid id from the SID list 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_people_list] ਀ 
         ਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @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 ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Output 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 people list id਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀      䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoPeopleListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names AS i਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   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 EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		   FROM people.people_lists AS pl਀ऀऀ  圀䠀䔀刀䔀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
		        AND pl.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 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 people.people_lists਀ऀऀ             ⠀瀀攀漀瀀氀攀开氀椀猀琀开椀搀Ⰰ  猀椀搀开椀搀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ    最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@peoplelistid,  @sidid,  ISNULL(@listposition, 0), @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'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_people_list_name]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 琀漀 挀爀攀愀琀攀 愀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
* - @peoplelist_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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀搀搀猀 愀 渀攀眀 爀攀挀漀爀搀 琀漀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @peoplelist_name must be unique਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀崀  
਀     䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ              
	 @peoplelist_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';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 = @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 NameNotUnique.');਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO people.people_list_names਀ऀऀ             ⠀洀渀攀洀Ⰰ                              渀愀洀攀Ⰰ           搀攀猀挀爀椀瀀琀椀漀渀⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @peoplelist_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਀ 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
਀䔀一䐀 
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 browsing tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开戀爀开琀爀开瀀攀爀洀开昀氀椀猀琀崀  
਀ 
     @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, @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, @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_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 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_browsing_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 browsing tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开戀爀开琀爀开瀀攀爀洀开瀀氀椀猀琀崀  
਀ 
     @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, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagBrTreeIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 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_br_tree_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
					      = @tag_br_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_browsing_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: 22-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new tag tree name.਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@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 @browsing_tree_name = ''਀ऀऀ   匀䔀吀 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 渀愀洀攀  
		 			 FROM tagging.tag_browsing_tree_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,                                 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਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_tag_group_id_name]    Script Date: Tue 12-05-2026 5:43:19 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_group_id_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_group_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT tag_group_name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
					WHERE tag_group_name = @tag_group_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ' | ', ISNULL(LEFT(@tag_group_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_group_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_group_identifier_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ                   琀愀最开最爀漀甀瀀开渀愀洀攀Ⰰ              搀攀猀挀爀Ⰰ    氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @tag_group_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਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_tag_group_perm_flist]    Script Date: Tue 12-05-2026 5:43:19 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_group_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_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 EXISTS (SELECT tag_group_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE    tag_group_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_group_permissions_flist ਀ऀऀ             ⠀ 琀愀最开最爀漀甀瀀开椀搀Ⰰ   昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀⤀ 
		      VALUES (@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_INS_tag_group_perm_plist]    Script Date: Tue 12-05-2026 5:43:19 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_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਀ऀऀऀ 䔀一䐀 
਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     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 duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
		             FROM user_restr.tag_group_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
					      = @tag_groupid਀ऀऀऀऀऀ  䄀一䐀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					      = @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_group_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: 22-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new tag tree name.਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开琀爀攀攀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @tag_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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@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_tree_name = ''਀ऀऀ   匀䔀吀 䀀琀愀最开琀爀攀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 渀愀洀攀  
		 			 FROM tagging.tag_tree_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,                   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਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_tag_tree_perm_flist]    Script Date: Tue 12-05-2026 5:43:19 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_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_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਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	  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_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE    tag_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_tree_permissions_flist ਀ऀऀ             ⠀ 琀愀最开琀爀攀攀开椀搀Ⰰ  昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀⤀ 
		      VALUES (@tag_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_tree_perm_plist]    Script Date: Tue 12-05-2026 5:43:19 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_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.');਀ऀऀऀ 䔀一䐀 
		  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਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  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_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE    tag_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_tree_permissions_plist ਀ऀऀ             ⠀ 琀愀最开琀爀攀攀开椀搀Ⰰ  瀀攀漀瀀氀攀开氀椀猀琀开椀搀⤀ 
		      VALUES (@tag_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_transaction_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀⸀ 
-- Input is transaction note਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_transaction_group] ਀ 
	 @transaction_note nvarchar(MAX)      = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀              㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)     = NULL OUTPUT,਀ऀ 䀀渀攀眀最爀漀甀瀀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
		@nopermissionmessage nvarchar(200)       = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀         㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                  = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)               = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀  渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @transactionmessage2 nvarchar(200)       = ''; -- Communicates that there was an issue with the scope identity check਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 -- There is no data validation applicable.਀  
-- 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਀ऀऀऀ  䈀䔀䜀䤀一 吀刀夀 
				 INSERT INTO base.transaction_groups (transaction_group_note)਀ऀऀऀऀऀ  嘀䄀䰀唀䔀匀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀开渀漀琀攀⤀㬀  
			  SET @newgroupid = 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਀ऀऀऀ䔀一䐀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 椀昀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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 (@transactionmessage2 <> '')        SET @message = @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀昀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into workflow_instances.workflow_step_duty_functions to create a new workflow step to duty function link.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_wf_step_duty_funct] ਀ 
         ਀ऀ 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @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 ਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- 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 @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਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀  
		  -- Check function id has been supplied਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 瀀攀爀猀漀渀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the person 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 the output id exists  ਀ऀ  䤀䘀 䀀漀甀琀瀀甀琀椀搀 㴀 　  
		 SET @outputid = NULL; ਀ऀऀ䤀䘀 䀀漀甀琀瀀甀琀椀搀 䤀匀 一伀吀 一唀䰀䰀  ⴀⴀ 一唀䰀䰀 漀甀琀瀀甀琀 䤀䐀 椀猀 瀀攀爀洀椀琀琀攀搀 
     -- Workflow output ID has been supplied.  Check if it exists. ਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT output_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀  
							 WHERE output_id = @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 EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀搀猀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_step_duty_functions AS wdsf਀ऀऀ  圀䠀䔀刀䔀 眀搀猀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =            @instance_step_id਀ऀऀ    䄀一䐀 眀搀猀昀⸀昀甀渀挀琀椀漀渀开椀搀  
				=   @functionid਀ऀऀ    䄀一䐀 眀搀猀昀⸀漀甀琀瀀甀琀开椀搀 
			    =   @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 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_duty_functions਀ऀऀ             ⠀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ  昀甀渀挀琀椀漀渀开椀搀Ⰰ  漀甀琀瀀甀琀开椀搀⤀ 
		      VALUES (        @instance_step_id, @functionid,  @outputid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 [controlling].[usp_INS_workflow_instance_def]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 琀漀 挀爀攀愀琀攀 愀 渀攀眀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀⸀   
-- Also clones the model steps into the instance steps. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 渀攀眀 爀攀挀漀爀搀 椀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_workflow_instance_def] ਀ 
         ਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ 
	 @workflow_model_id bigint        = NULL, ਀ऀ 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @notes 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)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@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 = '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 @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 edit 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   -- End checking if doc id exists਀ 
	  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਀ऀऀ 䔀一䐀 
਀ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 
  	  -- 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਀ऀऀऀऀऀऀऀ   䄀一䐀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀⤀  
				 BEGIN  -- The step ID does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WorkflowStepInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   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਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO workflow_instances.workflow_instance_definitions਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ        眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀Ⰰ   瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀Ⰰ 渀漀琀攀猀⤀ 
		      VALUES (@documentid,  @workflow_model_id,  @present_step_id, @notes); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
਀ऀऀ ⴀⴀ 䌀氀漀渀攀 琀栀攀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 琀爀攀攀 椀渀琀漀 琀栀攀 椀渀猀琀愀渀挀攀 琀爀攀攀⸀ 
		INSERT INTO workflow_instances.workflow_instance_steps (workflow_instance_id, workflow_model_step_id)਀ऀऀ     匀䔀䰀䔀䌀吀 䀀渀攀眀爀攀挀漀爀搀椀搀Ⰰ 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
		       FROM workflow_models.workflow_step_definitions਀ऀऀ      圀䠀䔀刀䔀    眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀  
			        = @workflow_model_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_INS_workflow_instance_step]    Script Date: Tue 12-05-2026 5:43:19 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਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀崀  
਀          
	 @instanceid bigint               = NULL,਀ऀ 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  
	 @step_status_id bigint           = NULL,਀ऀ 䀀搀愀琀攀㄀ 搀愀琀攀琀椀洀攀㈀⠀㜀⤀              㴀 一唀䰀䰀Ⰰ 
	 @date2 datetime2(7)              = 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਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 @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਀ऀऀ 䔀一䐀 
਀ऀ  䤀䘀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 　 
		 SET @model_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀漀搀攀氀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @model_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.');਀ऀऀ 䔀一䐀 
	  ELSE -- A model step id been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 洀漀搀攀氀 猀琀攀瀀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE workflow_model_step_id = @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 = @step_status_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 StepStatusIDInvalid.');਀ऀऀऀऀ 䔀一䐀  
		 END  ਀ऀऀ  
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	 IF EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_instance_steps AS wis਀ऀऀ  圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀  
		        =           @instanceid਀ऀऀ    䄀一䐀 眀椀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
				=           @model_step_id਀ऀऀ    䄀一䐀 眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
			    =  @step_status_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.');਀ऀऀ䔀一䐀 
਀ऀ 
	  -- 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_id, workflow_model_step_id,   step_status_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀        䀀椀渀猀琀愀渀挀攀椀搀Ⰰ          䀀洀漀搀攀氀开猀琀攀瀀开椀搀Ⰰ  䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀⤀㬀  
	  SET @newrecordid = SCOPE_IDENTITY();਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 [controlling].[usp_INS_workflow_participant]    Script Date: Tue 12-05-2026 5:43:19 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਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 @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 = @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 @sidid = 0਀ऀऀऀ 匀䔀吀 䀀猀椀搀椀搀 㴀 一唀䰀䰀㬀  
		  -- Check sid id has been supplied਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 猀椀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the sid 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 output id exists  ਀ऀ  䤀䘀 䀀漀甀琀瀀甀琀椀搀 㴀 　  
		 SET @outputid = NULL; ਀ऀऀ䤀䘀 䀀漀甀琀瀀甀琀椀搀 䤀匀 一伀吀 一唀䰀䰀  ⴀⴀ 一唀䰀䰀 漀甀琀瀀甀琀 䤀䐀 椀猀 瀀攀爀洀椀琀琀攀搀 
     -- Workflow output ID has been supplied.  Check if it exists. ਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT output_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀  
							 WHERE output_id = @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 EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀椀猀瀀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_step_participants AS wisp਀ऀऀ  圀䠀䔀刀䔀 眀椀猀瀀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =            @instance_step_id਀ऀऀ    䄀一䐀 眀椀猀瀀⸀猀椀搀开椀搀  
				=   @sidid਀ऀऀ    䄀一䐀 眀椀猀瀀⸀漀甀琀瀀甀琀开椀搀 
			    =   @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 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_participants਀ऀऀ             ⠀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ  猀椀搀开椀搀Ⰰ  漀甀琀瀀甀琀开椀搀⤀ 
		      VALUES (        @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   = '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 [controlling].[usp_SEL_all_people_list_names]    Script Date: Tue 12-05-2026 5:43:19 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. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists all people list names from people.people_list_names.਀⨀  
* **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 [controlling].[usp_SEL_all_people_list_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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ   
	    @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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 
				 pln.people_list_id          AS 'People List ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀瀀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				 pln.name                    AS 'People List Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀瀀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 pln.list_position           AS 'List Position'਀ऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀   
			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 [controlling].[usp_SEL_all_people_lists]    Script Date: Tue 12-05-2026 5:43:19 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 records from people.people_lists.਀⨀  
* **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 [controlling].[usp_SEL_all_people_lists] ਀ 
	 @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 ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀䘀愀椀氀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT਀ऀऀऀऀ 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀          䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 pln.mnem                    AS 'People List Mnemonic',਀ऀऀऀऀ 瀀氀渀⸀渀愀洀攀                    䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 pln.description             AS 'People List Description',਀ऀऀऀऀ 瀀氀⸀猀椀搀开椀搀                   䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ  
				 sl.name                     AS 'Database Username',਀ऀऀ         䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				 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 people.people_list_names AS pln਀ऀ          伀一     瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			      = pln.people_list_id਀ऀ   䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	          ON   pl.sid_id਀ऀऀऀ     㴀 猀氀⸀猀椀搀开椀搀 
		ORDER BY 'People List Name' ASC, 'Person 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: 10-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all records from user_restr.sid_list which have been created after a given time਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- plus all records from the sid list.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_all_recent_sids] ਀ 
	 @minutes int                      = NULL,   -- Optional input parameter.  Number of minutes before present਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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਀ 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 洀椀渀甀琀攀猀⸀  刀攀琀爀椀攀瘀攀 瘀愀氀甀攀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 椀昀 一唀䰀䰀⸀   
		 IF @minutes =''਀ऀऀ    匀䔀吀 䀀洀椀渀甀琀攀猀 㴀 一唀䰀䰀㬀 
		 IF @minutes IS NULL਀ऀऀ    䈀䔀䜀䤀一 
			  SET @minutes = (਀ऀऀऀ     匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀开氀愀猀琀开洀椀渀甀琀攀猀  
			       FROM base.global_settings_groups਀ऀऀऀ      圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			END਀ 
਀ऀ     匀䔀䰀䔀䌀吀   猀椀搀开椀搀                          䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
		          ISNULL(name, '')                AS 'Database Username',਀ऀऀऀ      䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀               䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		          ISNULL(sl.username, '')         AS 'System Username',਀ऀऀऀऀ  䤀匀一唀䰀䰀⠀攀洀愀椀氀开愀搀搀爀攀猀猀Ⰰ ✀✀⤀       䄀匀 ✀䔀洀愀椀氀 䄀搀搀爀攀猀猀✀Ⰰ 
		          CONVERT(NVARCHAR(30), sl.created, 120) AS 'Created',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		   WHERE (sl.created > DATEADD(MINUTE, -@minutes, SYSDATETIME())); ਀ऀऀऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
         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: 02-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all records from user_restr.sid_list਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- plus all records from the sid list.  ਀ⴀⴀ 䤀昀 䌀甀爀爀攀渀琀 爀攀琀甀爀渀猀 一漀 琀栀攀渀 攀椀琀栀攀爀 琀栀攀 甀猀攀爀 爀攀挀漀爀搀 栀愀猀 戀攀攀渀 搀攀ⴀ愀挀琀椀瘀愀琀攀搀 漀爀 
-- the Windows Account has been removed.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_all_sid_list] ਀ 
	 @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.';਀ऀ䔀一䐀 
਀ 
-- 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; ਀ऀऀऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
         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: 16-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 匀攀氀攀挀琀猀 愀氀氀 戀漀漀欀椀渀最 䤀䐀猀 昀漀爀 戀攀琀眀攀攀渀 最椀瘀攀渀 搀愀琀攀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开戀漀漀欀椀渀最开椀搀猀开戀礀开搀愀琀攀崀 
਀ऀ 䀀攀愀爀氀椀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀       㴀 一唀䰀䰀Ⰰ 
	 @later_date 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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@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਀ 
		-- 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਀ 
         EXEC internal.usp_SEL_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_docid]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description: Selects all booking IDs for a given document ID.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_booking_ids_by_docid]਀ 
	 @documentid nvarchar(50)         = '',  -- Mandatory਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀⴀⴀ 刀攀琀爀椀攀瘀攀 甀猀攀爀 䤀䐀 
		SET @userid = (SELECT sid_id਀ऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						WHERE sl.sid = @connectedusersid)਀ 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 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 data 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਀ 
		  -- 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.doc_id = @documentid਀ऀ 伀刀䐀䔀刀 䈀夀 嬀䈀漀漀欀椀渀最 䐀愀琀攀崀 䐀䔀匀䌀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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਀ 
 	 -- 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');	਀ऀऀऀ䔀一䐀 
		ELSE -- @sidrecordid is not NULL਀ऀऀ  䈀䔀䜀䤀一 
			   IF NOT EXISTS (SELECT sid_id ਀ऀऀऀऀ  ऀऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								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');਀ऀऀऀऀ   䔀一䐀 
		   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_contr_dc_grp_lnks_rstr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 搀漀挀甀洀攀渀琀猀 眀栀椀挀栀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
-- Input is a an optional form id.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ 
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');਀ऀ䔀一䐀 
਀ 
  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)    ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- 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: 05-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all controller level document groups which the connected user has rights to ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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',਀ ऀ            䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				dgn.created_by                   AS 'Created By'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀  䄀匀 搀最渀 
	 INNER JOIN user_restr.controller_doc_group_sid_links AS cdgsl਀ऀऀ     伀一     搀最渀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
				= cdgsl.controller_doc_group_name_id਀     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	         ON  cdgsl.sid_id਀ऀऀ        㴀   猀氀⸀猀椀搀开椀搀 
	 	  WHERE sl.sid = @usersid ਀ऀ         伀刀䐀䔀刀 䈀夀 ✀䌀漀渀琀爀漀氀氀攀爀 䐀漀挀 䜀爀漀甀瀀 䤀䐀✀㬀 
	   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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_contr_file_groups_rstr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀猀 氀椀渀欀攀搀 琀漀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_contr_file_groups_rstr] ਀ 
	 @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_file_group_name_id AS 'Controller File Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀洀渀攀洀Ⰰ ✀✀⤀ऀऀऀ  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
	            dgn.attr_name					  AS 'Controller File Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ऀऀऀ  䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
 	            CONVERT(NVARCHAR(30), sl.created, 120) AS 'Created'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀  䄀匀 搀最渀 
	 INNER JOIN user_restr.controller_file_grp_sid_links AS cfgsl਀ऀऀ     伀一     搀最渀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
				= cfgsl.controller_file_group_name_id਀     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	         ON  cfgsl.sid_id਀ऀऀ        㴀   猀氀⸀猀椀搀开椀搀 
	 	  WHERE sl.sid = @usersid ਀ऀ         伀刀䐀䔀刀 䈀夀 ✀䌀漀渀琀爀漀氀氀攀爀 䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀㬀 
	   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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_contr_fl_grp_lnks_rstr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㌀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for all the files which a controller connected user has rights to਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开昀氀开最爀瀀开氀渀欀猀开爀猀琀爀崀  
	  @formid bigint                    = NULL,   ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50)  = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                   㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles 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.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- 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',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		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;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
  ਀ 
   -- 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਀ 
    -- 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਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN xref.controller_file_group_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀऀ   ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(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 @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀漀氀氀攀爀猀开昀漀爀洀开最爀漀甀瀀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all form groups which the connected user has permission to edit.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 琀栀攀 昀漀爀洀 最爀漀甀瀀猀Ⰰ 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀漀氀氀攀爀猀开昀漀爀洀开最爀漀甀瀀猀崀 
਀ 
	 @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)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@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;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    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਀ऀ     匀䔀䰀䔀䌀吀 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				fgn.attr_name     AS 'Form Group Name',਀ऀऀऀऀ昀最渀⸀洀渀攀洀          䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				fgn.descr         AS 'Description',਀ऀऀऀऀ昀最渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀 䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		   FROM    forms.form_group_names AS fgn਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 䄀匀 昀漀 
		            ON fgn.form_group_id਀ऀऀऀऀऀ  㴀 昀漀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
		 INNER JOIN user_restr.sid_list AS sl  ਀ऀऀ            伀一 昀漀⸀猀椀搀开椀搀 
					 = sl.sid_id਀ऀऀऀ  圀䠀䔀刀䔀   猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀ऀऀऀ          
		   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.');਀ऀऀऀ䔀一䐀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all forms which the connected user has permission to edit.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 琀栀攀 昀漀爀洀猀Ⰰ 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀漀氀氀攀爀猀开昀漀爀洀猀崀 
਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
     @numrows bigint                  = 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)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
        @zerorecordsmessage nvarchar(200)       = '', -- Communicates that zero records were retrieved਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@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 = '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.';਀ऀ䔀一䐀 
਀ 
  -- Execute the query.  Selecting forms which the connected user owns or which are not owned by anyone.਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT fin.form_id       AS 'Form ID',਀ऀऀऀ    昀椀渀⸀洀渀攀洀          䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				fin.form_name     AS 'Form Name',਀ऀऀऀ    昀椀渀⸀搀攀猀挀爀         䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		        fin.form_group_id AS 'Form Group ID',਀ऀऀऀऀ昀最渀⸀愀琀琀爀开渀愀洀攀     䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
			    fin.list_position AS 'List Position'਀ऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
	  LEFT JOIN forms.form_group_names      AS fgn਀ऀऀ     伀一   昀椀渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
		        = fgn.form_group_id਀ऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 䄀匀 昀漀 
		     ON  fin.form_group_id਀ऀऀ ऀ    㴀 昀漀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
      LEFT JOIN user_restr.sid_list AS sl਀ऀऀ     伀一   昀漀⸀猀椀搀开椀搀 
				 = sl.sid_id਀ऀऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀ऀऀऀ      
			     OR fin.form_group_id IS NULL਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	    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਀ 
-- 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: 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_file_id] ਀ 
      @fileid 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਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@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਀ 
		  -- 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਀ऀऀऀ   圀䠀䔀刀䔀  昀搀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					  ਀ 
	--=======================================================਀ 
		  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_filename]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file delete log where the filename 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_by_sid_id] ਀ 
      @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਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@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';਀ 
਀ 
  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.਀ ⴀⴀ 吀栀攀 氀漀最 洀愀礀 挀漀渀琀愀椀渀 爀攀挀漀爀搀猀 漀昀 匀䤀䐀 䤀䐀猀 琀栀愀琀 栀愀瘀攀 猀椀渀挀攀 戀攀攀渀 搀攀氀攀琀攀搀 昀爀漀洀 琀栀攀 匀䤀䐀 氀椀猀琀⸀   
਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀椀搀 椀猀 瘀愀氀椀搀 
		 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'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ  匀䔀䰀䔀䌀吀  
					 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'਀ 
				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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 昀爀漀洀 琀栀攀 昀椀氀攀 搀攀氀攀琀攀 氀漀最 眀栀攀爀攀 琀栀攀 甀猀攀爀渀愀洀攀 椀渀挀氀甀搀攀猀 琀栀攀 最椀瘀攀渀 猀琀爀椀渀最⸀   
-- 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_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'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ  匀䔀䰀䔀䌀吀  
					 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.deleted_by_username 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_date_between]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file delete log where the delete date is between given dates.  Only returns files for which ਀ⴀⴀ 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  一漀琀攀 栀漀眀攀瘀攀爀 琀栀愀琀 琀栀椀猀 眀椀氀氀 椀渀挀氀甀搀攀 琀栀攀 搀愀琀愀 昀漀爀 愀渀礀 搀攀氀攀琀攀搀 昀椀氀攀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀攀氀开氀漀最开搀愀琀攀开戀攀琀眀攀攀渀崀  
਀ऀ  䀀攀愀爀氀椀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀           㴀 一唀䰀䰀Ⰰ 
	  @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'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ  匀䔀䰀䔀䌀吀  
					 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.date_time < @later_date AND fdl.date_time > @earlier_date)਀ऀऀऀ   伀刀䐀䔀刀 䈀夀 䐀攀氀攀琀攀搀 䐀䔀匀䌀 
					  ਀ 
	--=======================================================਀ 
		  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_dg_ed_perm_funct_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Lists all document group to duty function list link records਀ⴀⴀ 伀渀氀礀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 昀漀爀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 眀椀氀氀 戀攀 氀椀猀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '', -- Communicates what was the outcome of the transaction਀        䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@nopermissionmessage nvarchar(200)   = ''; -- Communicates that the user does not have the required permission਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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਀ 
		BEGIN TRY਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀     䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
						            dgn.attr_name        AS 'Doc Group Name',਀ऀऀऀऀऀऀऀऀऀ昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
									fln.name             AS 'Function List Name',਀ऀऀऀऀऀऀऀऀऀ搀最攀瀀昀氀⸀渀漀琀攀猀         䄀匀 ✀一漀琀攀猀✀Ⰰ 
									CONVERT(NVARCHAR(30), dgepfl.created, 120) AS 'Created',਀ऀऀऀऀऀऀऀऀऀ搀最攀瀀昀氀⸀最爀愀渀琀攀搀开戀礀    䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
					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  dgvp.sid_id ਀ऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
					WHERE sl.sid = @connectedusersid਀ऀऀऀऀ 伀刀䐀䔀刀 䈀夀 ✀䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀㬀   
਀ 
 			  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.';਀ऀऀऀऀ䔀一䐀 
਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @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਀    䔀一䐀 
	 ਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_dg_ed_perm_people_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 琀漀 瀀攀漀瀀氀攀 氀椀猀琀 氀椀渀欀 爀攀挀漀爀搀猀⸀ 
* ਀⨀ 
* **Return Values:**਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 瀀攀漀瀀氀攀 氀椀猀琀 氀椀渀欀 爀攀挀漀爀搀猀⸀ 
* - ``@message nvarchar(1000) OUTPUT``: Descriptive status message of the procedure's execution.਀⨀ ⴀ 怀怀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀怀怀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 伀渀氀礀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 昀漀爀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 眀椀氀氀 戀攀 爀攀琀甀爀渀攀搀⸀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
--===============================================================================਀ 
CREATE PROCEDURE [controlling].[usp_SEL_dg_ed_perm_people_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)           = '';਀ 
  -- 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਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
					SELECT DISTINCT dgn.doc_group_id     AS 'Doc Group ID',਀ऀऀऀऀऀऀ            搀最渀⸀愀琀琀爀开渀愀洀攀        䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
									pln.people_list_id   AS 'People List ID',਀ऀऀऀऀऀऀऀऀऀ瀀氀渀⸀渀愀洀攀             䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
									dgeppl.notes         AS 'Notes',਀ऀऀऀऀऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀最攀瀀瀀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
									dgeppl.granted_by    AS 'Granted By'਀ऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
				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਀ऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
				 ORDER BY 'Doc Group Name', 'People List Name';  ਀ऀ      
਀ ऀऀऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
					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 IF @userauthentication_status = 'Pass'਀ऀ  
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开最爀漀甀瀀猀开戀礀开昀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 愀氀氀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 
-- for which the connected user has edit permission.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀⼀⨀⨀ 
* Selects all document groups for a given function list.਀⨀  
* **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.਀⨀ ⴀ 怀怀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀怀怀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 伀渀氀礀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 昀漀爀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 眀椀氀氀 戀攀 爀攀琀甀爀渀攀搀⸀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀Ⰰ 漀爀 渀漀渀ⴀ攀砀椀猀琀椀渀最 爀攀挀漀爀搀 椀渀 搀愀琀愀戀愀猀攀⸀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ 
CREATE PROCEDURE [controlling].[usp_SEL_doc_groups_by_f_list] ਀ 
	 @functionlistid 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)           = '',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- 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.');਀ऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  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਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT function_list_id਀ऀऀऀऀ                  䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 
								 WHERE function_list_id = @functionlistid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 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');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 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਀ 
			BEGIN TRY਀ 
						(SELECT DISTINCT @functionlistid  AS 'Function List ID',਀ऀऀऀऀऀऀ                 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 䄀匀 ✀䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
										 dgn.attr_name    AS 'Document Group Name'਀ऀऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
					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  dgvp.doc_group_id ਀ऀऀऀऀऀऀऀ   㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀ऀऀऀऀ 
					LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀ伀一  搀最瘀瀀⸀猀椀搀开椀搀  
								= sl.sid_id਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
								 = @functionlistid਀ऀऀऀऀऀऀऀऀ䄀一䐀 
								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: 26-12-2023਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀⼀⨀⨀ 
* Selects all document groups for a given function list.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - ``@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.਀⨀ ⴀ 怀怀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀怀怀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 伀渀氀礀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 昀漀爀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 眀椀氀氀 戀攀 爀攀琀甀爀渀攀搀⸀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 漀爀 渀漀渀ⴀ攀砀椀猀琀椀渀最 爀攀挀漀爀搀 椀渀 搀愀琀愀戀愀猀攀⸀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开最爀漀甀瀀猀开戀礀开瀀开氀椀猀琀崀  
਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	 @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';਀ 
  -- 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.');਀ऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  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 = @message + ' | ' +  ISNULL(CONVERT(nvarchar(10), @peoplelistid), 'NULL') + ' | '  + @tempmessage; ਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDInvalid');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
਀ऀऀ䔀一䐀 
		  -- 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.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   pln.people_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_docs_by_contr_doc_grp]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 洀攀琀愀搀愀琀愀 昀漀爀 愀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀ 
-- Input is a controller level document group ID and an optional form id.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开挀漀渀琀爀开搀漀挀开最爀瀀崀  
      @contr_doc_ed_grp_name_id 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(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਀ 
	 -- 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';਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_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');਀ऀऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    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਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.controller_doc_group_name_id = @contr_doc_ed_grp_name_id)     --### 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: 19-12-2023਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀⼀⨀⨀ 
* Selects all duty function 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.਀⨀ ⴀ 吀栀攀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀开氀椀猀琀开戀礀开搀漀挀开最爀漀甀瀀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @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';਀ 
  -- 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 @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਀ऀऀऀऀऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 䀀搀漀挀最爀漀甀瀀椀搀                䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
						                dgepfl.function_list_id    AS 'Function List ID',਀ऀऀऀऀऀऀ                昀氀渀⸀渀愀洀攀                   䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
										ISNULL(dgepfl.notes, '')   AS 'Notes'									਀ऀऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
					INNER JOIN user_restr.doc_group_edit_perm_funct_lst AS dgepfl਀ऀऀऀऀऀऀऀ伀一       搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
								= dgepfl.doc_group_id਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							ON  dgepfl.function_list_id਀ऀऀऀऀऀऀऀऀ㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						WHERE  dgn.doc_group_id = @docgroupid;਀ऀऀऀऀऀऀ      
਀ ऀऀऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
					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 IF @transaction_ready = 'Ready'਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀ  
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀最攀瀀昀氀开戀礀开昀椀氀攀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects records user_restr.file_group_edit_perm_funct_lst for a given file group. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀  
-- Output is a list of function list data plus status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Selects all of the user function lists which have edit permission for a given file group਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ 
* **Return Values:**਀⨀ 
* - A table of function list names comprising ID, mnemonic, name and description਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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 must be provided and be valid਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀最攀瀀昀氀开戀礀开昀椀氀攀开最爀漀甀瀀崀  
਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ             ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @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');਀ऀऀ   䔀一䐀 
		 ELSE -- Check if the file group exists਀ऀऀ   䈀䔀䜀䤀一 
		     IF NOT EXISTS (SELECT fgn.file_group_id਀ऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
							 WHERE fgn.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 FileGroupIdNotExist');਀ऀऀऀ   䔀一䐀 
		   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਀ऀ     匀䔀䰀䔀䌀吀 䀀昀椀氀攀最爀漀甀瀀椀搀                  䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
		        fln.function_list_id          AS 'Function List ID',਀                䤀匀一唀䰀䰀⠀昀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				fln.name                      AS 'Function List 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਀ऀऀ  圀䠀䔀刀䔀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀㬀  
਀ ऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
				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਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀最攀瀀瀀氀开戀礀开昀椀氀攀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects records user_restr.file_group_edit_perm_ppl_lst for a given file group. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀  
-- Output is a list of people list data plus status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Selects all of the user people lists which have edit permission for a given file group਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ 
* **Return Values:**਀⨀ 
* - A table of people list names comprising ID, mnemonic, name and description਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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 must be provided and be valid਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀最攀瀀瀀氀开戀礀开昀椀氀攀开最爀漀甀瀀崀  
਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ             ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @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 @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');਀ऀऀ   䔀一䐀 
		 ELSE -- Check if the file group exists਀ऀऀ   䈀䔀䜀䤀一 
		     IF NOT EXISTS (SELECT fgn.file_group_id਀ऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
							 WHERE fgn.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 FileGroupIdNotExist');਀ऀऀऀ   䔀一䐀 
		   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 'People List ID',਀                䤀匀一唀䰀䰀⠀瀀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				pln.name                      AS 'People List Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀瀀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀   䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ISNULL(fgeppl.notes, '')      AS 'Record Notes',਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀最攀瀀瀀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				fgeppl.granted_by             AS 'Granted By'਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
	 INNER JOIN user_restr.file_group_edit_perm_ppl_lst AS fgeppl਀ऀ         伀一      瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			    = fgeppl.people_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(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀漀甀瀀猀开戀礀开昀最攀瀀昀氀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects records user_restr.file_group_edit_perm_funct_lst for a given user function list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 甀猀攀爀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀  
-- Output is a list of file group data plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Selects all of the file groups which a given function list have edit permission਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @functionlistid bigint  Must be a non-null and non-empty valid identifier.਀⨀ 
* **Return Values:**਀⨀ 
* - A table of filegroup names comprising ID, mnemonic, name and description਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 漀爀 椀渀瘀愀氀椀搀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @functionlistid must be provided and be valid਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀漀甀瀀猀开戀礀开昀最攀瀀昀氀崀  
਀     䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ             ⴀⴀ 䘀甀渀挀琀椀漀渀 氀椀猀琀  
	 @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 @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 -- Check if the function list exists਀ऀऀ   䈀䔀䜀䤀一 
		     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 FunctionListIdNotExist');਀ऀऀऀ   䔀一䐀 
		   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਀ऀ     匀䔀䰀䔀䌀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀          䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
		        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.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਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀漀甀瀀猀开戀礀开昀最攀瀀瀀氀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects records user_restr.file_group_edit_perm_ppl_lst for a given user people list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 甀猀攀爀 瀀攀漀瀀氀攀 氀椀猀琀 䤀䐀  
-- Output is a list of file group data plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Selects all of the file groups which a given people list have edit permission਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @peoplelistid bigint  Must be a non-null and non-empty valid identifier.਀⨀ 
* **Return Values:**਀⨀ 
* - A table of filegroup names comprising ID, mnemonic, name and description਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 漀爀 椀渀瘀愀氀椀搀 瀀攀漀瀀氀攀 氀椀猀琀 䤀䐀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @peoplelistid must be provided and be valid਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀漀甀瀀猀开戀礀开昀最攀瀀瀀氀崀  
਀     䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ             ⴀⴀ 瀀攀漀瀀氀攀 氀椀猀琀  
	 @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 @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 -- Check if the people list exists਀ऀऀ   䈀䔀䜀䤀一 
		     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');਀ऀऀऀ   䔀一䐀 
		   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਀ऀ     匀䔀䰀䔀䌀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀            䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ 
		        fgn.file_group_id        AS 'File Group ID',਀                䤀匀一唀䰀䰀⠀昀最渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				fgn.attr_name            AS 'File Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ISNULL(fgeppl.notes, '') AS 'Record Notes',਀                䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀最攀瀀瀀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				fgeppl.granted_by        AS 'Granted By'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
	 INNER JOIN user_restr.file_group_edit_perm_ppl_lst AS fgeppl਀ऀ         伀一      昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
			    = fgeppl.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_file_grp_ed_prm_f_lsts]    Script Date: Tue 12-05-2026 5:43:19 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_funct_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_f_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(fln.mnem, '')          AS 'Function List Mnemonic',਀ऀऀऀऀ         昀氀渀⸀渀愀洀攀                      䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				         ISNULL(fln.description, '')   AS 'Function List Description',਀ऀऀऀऀऀऀ 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀             䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
						 ISNULL(fgn.mnem, '')          AS 'File Group Mnemonic',਀ऀऀऀऀऀऀ 昀最渀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
						 ISNULL(fgn.descr, '')         AS 'File Group Description',਀ऀऀऀऀ         䤀匀一唀䰀䰀⠀昀最攀瀀昀氀⸀渀漀琀攀猀Ⰰ ✀✀⤀      䄀匀 ✀刀攀挀漀爀搀 一漀琀攀猀✀Ⰰ 
				         CONVERT(NVARCHAR(30), fgepfl.created, 120)  AS 'Created',਀ऀऀऀऀऀऀ 昀最攀瀀昀氀⸀最爀愀渀琀攀搀开戀礀             䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
				    FROM people.function_list_names AS fln਀ऀऀऀ  䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 
					  ON      fln.function_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਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀瀀开攀搀开瀀爀洀开瀀开氀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all records from user_restr.file_group_edit_perm_ppl_lst. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 爀攀挀漀爀搀猀 瀀氀甀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 漀昀 琀栀攀 爀攀挀漀爀搀猀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀Ⰰ 椀⸀攀 琀栀攀 爀攀挀漀爀搀猀 眀栀椀挀栀 氀椀渀欀  
* file groups with people lists.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - None required਀⨀ 
* **Return Values:**਀⨀ 
* - A table of people 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 pln.people_list_id            AS 'People List ID',਀                         䤀匀一唀䰀䰀⠀瀀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				         pln.name                      AS 'People List Name',਀ऀऀऀऀ         䤀匀一唀䰀䰀⠀瀀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀   䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
						 fgn.file_group_id             AS 'File Group ID',਀ऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀最渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䴀渀攀洀漀渀椀挀✀Ⰰ 
						 fgn.attr_name                 AS 'File Group Name',਀ऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				         ISNULL(fgeppl.notes, '')      AS 'Record Notes',਀ऀऀऀऀ         䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀最攀瀀瀀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
						 fgeppl.granted_by             AS 'Granted By'਀ऀऀऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
			  INNER JOIN user_restr.file_group_edit_perm_ppl_lst AS fgeppl਀ऀऀऀऀऀ  伀一      瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 = fgeppl.people_list_id਀ऀऀऀ  䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
					  ON  fgeppl.file_group_id਀ऀऀऀऀऀऀ 㴀   昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
				ORDER BY 'People 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਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开挀漀渀琀爀开昀椀氀攀开最爀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-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਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_files_by_contr_file_grp] ਀ऀ  䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ 
	  @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     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)     = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @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;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
  ਀ 
   -- 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');਀ऀ䔀一䐀 
 ਀ ऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
    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਀ 
-- 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਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀⸀   
	-- and hence has access to the files within that file group. ਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN xref.controller_file_group_links 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 [controlling].[usp_SEL_p_list_by_doc_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 瀀攀漀瀀氀攀 氀椀猀琀猀 眀栀椀挀栀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 怀怀䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀怀怀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
* - 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:**਀⨀ 
* - 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.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀开氀椀猀琀开戀礀开搀漀挀开最爀漀甀瀀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @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'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    EXEC internal.usp_SEL_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਀ऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		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',਀ऀऀऀऀऀऀ                瀀氀渀⸀渀愀洀攀                   䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
										dgeppl.people_list_id      AS 'People List ID',਀ऀऀऀऀऀऀऀऀऀऀ䤀匀一唀䰀䰀⠀搀最攀瀀瀀氀⸀渀漀琀攀猀Ⰰ ✀✀⤀   䄀匀 ✀一漀琀攀猀✀ऀऀऀऀऀऀऀऀऀ 
						FROM xref.doc_group_names AS dgn਀ऀऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀 䄀匀 搀最攀瀀瀀氀 
							ON       dgn.doc_group_id਀ऀऀऀऀऀऀऀऀ㴀 搀最攀瀀瀀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
					LEFT JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀऀ伀一  搀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
								=  pln.people_list_id਀ऀऀऀऀऀऀ圀䠀䔀刀䔀  搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
						ORDER BY pln.name;਀ऀऀऀऀऀऀ      
਀ ऀऀऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
					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਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
	 ਀ 
਀䔀一䐀 
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_file_id] ਀ 
      @fileid 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) = '', -- Communicates if the user is not authorised to access the file਀ऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ ऀ 
਀ऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	@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');	਀ऀऀऀ䔀一䐀 
         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਀ऀऀ 䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_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(frl.filename, '') AS 'Filename',਀ऀऀऀऀऀ 昀爀氀⸀爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀     䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
					 frl.read_by_sid_id       AS 'User ID'					 ਀ 
				FROM base.file_read_log  AS frl਀ऀऀऀ   圀䠀䔀刀䔀 昀爀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
			   ORDER BY 'Read' DESC;਀ऀ 
	--=======================================================਀ 
		  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_filename]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file read log where the filename includes the given string.  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	਀  
 		-- 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), frl.date_time, 120) AS 'Read',਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀爀氀⸀昀椀氀攀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀氀攀渀愀洀攀✀Ⰰ 
					 frl.read_by_username     AS 'System Username',਀ऀऀऀऀऀ 昀爀氀⸀爀攀愀搀开戀礀开猀椀搀开椀搀       䄀匀 ✀唀猀攀爀 䤀䐀✀ऀऀऀऀऀ  
				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਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_read_log_by_sid_id] ਀ 
      @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਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@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 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), frl.date_time, 120) AS 'Read',਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀爀氀⸀昀椀氀攀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀氀攀渀愀洀攀✀Ⰰ 
					 frl.read_by_username AS 'System Username'					 ਀ 
				FROM base.file_read_log  AS frl਀          䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
                  ON frl.file_id = perm.file_id ਀ऀऀऀ   圀䠀䔀刀䔀 昀爀氀⸀爀攀愀搀开戀礀开猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀 
			   ORDER BY 'Read' DESC;਀ऀ 
	--=======================================================਀ 
		  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_username]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file read log where the username includes the given string.  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	਀  
 		-- 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), frl.date_time, 120) AS 'Read',਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀爀氀⸀昀椀氀攀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀氀攀渀愀洀攀✀Ⰰ 
					 frl.read_by_username     AS 'System Username',਀ऀऀऀऀऀ 昀爀氀⸀爀攀愀搀开戀礀开猀椀搀开椀搀       䄀匀 ✀唀猀攀爀 䤀䐀✀ऀऀऀऀऀ  
਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开爀攀愀搀开氀漀最  䄀匀 昀爀氀 
          INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀                  伀一 昀爀氀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  
			   WHERE frl.read_by_username 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_date_between]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file read log where the where the date is between given dates.  Only returns files for which ਀ⴀⴀ 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  一漀琀攀 栀漀眀攀瘀攀爀 琀栀愀琀 琀栀椀猀 眀椀氀氀 椀渀挀氀甀搀攀 琀栀攀 搀愀琀愀 昀漀爀 愀渀礀 搀攀氀攀琀攀搀 昀椀氀攀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
CREATE PROCEDURE [controlling].[usp_SEL_read_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), frl.date_time, 120) AS 'Read',਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀爀氀⸀昀椀氀攀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀氀攀渀愀洀攀✀Ⰰ 
					 frl.read_by_username     AS 'System Username',਀ऀऀऀऀऀ 昀爀氀⸀爀攀愀搀开戀礀开猀椀搀开椀搀       䄀匀 ✀唀猀攀爀 䤀䐀✀ऀऀऀऀऀ  
਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开爀攀愀搀开氀漀最  䄀匀 昀爀氀 
          INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀                  伀一 昀爀氀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  
			   WHERE frl.date_time < @later_date AND frl.date_time > @earlier_date਀ऀऀऀ   伀刀䐀䔀刀 䈀夀 ✀刀攀愀搀✀ 䐀䔀匀䌀㬀 
					 ਀ऀ 
	--=======================================================਀ 
		  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_sid_by_username]    Script Date: Tue 12-05-2026 5:43:19 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਀ 
਀ 
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 @likestring = '' ਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 一唀䰀䰀㬀 
	  IF @likestring IS NULL਀ऀऀ 䈀䔀䜀䤀一  
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_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.');਀ऀऀ 䔀一䐀   
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_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 ਀ऀ     匀䔀䰀䔀䌀吀   猀椀搀开椀搀                          䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
		          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'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		   WHERE (sl.username LIKE '%' + @likestring + '%') -- Filter by @likestring਀                  伀刀 ⠀猀氀⸀渀愀洀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀⤀   
			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_UPD_common_obj_list_item]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Updates a common object list position਀ⴀⴀ 䤀渀瀀甀琀 椀猀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀Ⰰ 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀Ⰰ 昀椀氀琀攀爀 最爀漀甀瀀  愀渀搀 瀀漀猀椀琀椀漀渀 
-- Both data values must be supplied even if only one is being changed਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 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 the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    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, ' | ', 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਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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 list_position = @listposition਀ऀ    圀䠀䔀刀䔀  挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
			    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_WS(@message, ' | ', @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀洀洀漀渀开漀戀樀攀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 13-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Updates a common object 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 ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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਀ 
	  -- Record id check਀ऀ    䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		   SET @recordid = NULL;਀ऀऀ䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀爀攀挀漀爀搀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀爀攀挀漀爀搀椀搀⤀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
      -- End record ID check਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀ  ⴀⴀ 䤀渀挀氀甀搀攀猀 挀栀攀挀欀椀渀最 椀昀 琀栀攀 渀愀洀攀 椀猀 渀甀氀氀 
	  ਀ऀ   䤀䘀 䀀漀戀樀攀挀琀渀愀洀攀 㴀 ✀✀ 
		  SET @objectname = NULL;਀ 
	   EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀ 䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
		 @attr_name        = @objectname,਀ऀऀ 䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
		 @data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀ 䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	   IF @tempvalidationstatus = 'Fail'਀ऀ      䈀䔀䜀䤀一 
		      SET @transaction_ready      = 'Fail';਀ऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					   FROM com_obj.common_objects਀ऀऀऀऀऀ  圀䠀䔀刀䔀 漀戀樀攀挀琀开渀愀洀攀 㴀 䀀漀戀樀攀挀琀渀愀洀攀 
							AND common_object_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@objectname, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = '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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE com_obj.common_objects ਀ऀऀ    匀䔀吀 洀渀攀洀        㴀 䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
			    object_name = @objectname,਀ऀऀऀऀ搀攀猀挀爀椀瀀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀Ⰰ    
				common_object_attribute_id = @commonobjattrid਀          圀䠀䔀刀䔀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀 
         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਀ 
਀ 
-- 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;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
    IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates 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_UPD_contr_doc_group_link]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @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 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਀ 
  -- 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 @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 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 NoDocIDAccess.'); ਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ 
	 -- 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਀ 
  -- Check if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
  		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
							  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 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 xref.controller_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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_contr_file_group_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 昀椀氀攀 琀漀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a file id, a controller level file 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.਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    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 @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  -- 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 or edit it਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'NoFileIDAccess', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀  
						 END਀ऀऀऀऀ䔀一䐀 
਀ 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 
	 -- This also returns fail if the id does not exist਀    䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开挀漀渀琀开昀椀氀攀开最爀瀀崀 
	     @contr_file_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 InvalidConFileGrp');਀ऀऀ䔀一䐀 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
  IF @data_validation_status = 'Pass'਀  ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT controller_file_group_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀  
							 WHERE controller_file_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_file_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: 17-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 渀漀琀攀猀 昀漀爀 愀 猀瀀攀挀椀昀椀挀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 愀渀搀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀 椀渀 琀栀攀 搀愀琀愀戀愀猀攀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 怀怀䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀怀怀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - ``@functionlistid 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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀Ⰰ 漀爀 渀漀渀ⴀ攀砀椀猀琀椀渀最 爀攀挀漀爀搀 椀渀 搀愀琀愀戀愀猀攀⸀ 
* - Update Operation Fail: In case of an exception during the update, returns an error message with details.਀⨀ 
* **Side Effects:**਀⨀ 
* - Modifies the 'notes' column in 'user_restr.doc_group_edit_perm_funct_lst' table if all conditions are met.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䈀漀琀栀 䀀搀漀挀最爀漀甀瀀椀搀 愀渀搀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 瘀愀氀椀搀⸀ 
* - There must be an existing record matching @docgroupid and @functionlistid.਀⨀ 
* **Postconditions:**਀⨀ 
* - If successful, the 'notes' column is updated for the specified record.਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
CREATE PROCEDURE [controlling].[usp_UPD_dc_gp_ed_prm_fct_notes] ਀ 
     @docgroupid bigint               = NULL,  -- Document group ਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	 @inputnotes nvarchar(max)        = '',    -- Notes for the entry਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 栀愀猀 愀氀爀攀愀搀礀 戀攀攀渀 氀椀渀欀攀搀 琀漀 琀栀愀琀 搀漀挀甀洀攀渀琀 
		@nodocgroupmessage nvarchar(200)     = '',     -- Communicates that no document group 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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	     IF @docgroupid = 0 ਀ऀऀ    匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		 IF @docgroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @nodocgroupmessage = @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				SET @nodocgroupmessage = '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 @docgroupinvalidmsg = 'Document group ID: ' + ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL') + '  ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @docgroupinvalidmsg = 'A database level message error occurred on NoDocGroupPermission.';਀ऀऀऀऀ䔀一䐀ऀऀ    
਀ 
      -- 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਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF NOT EXISTS (SELECT doc_group_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 @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 
		    SET notes = @inputnotes਀ऀऀ  圀䠀䔀刀䔀         搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
			    AND function_list_id = @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 @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 (@nodocgroupmessage <> '')          SET @message = @message + ' | ' + @nodocgroupmessage;਀ऀ䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@docgroupinvalidmsg <> '')         SET @message = @message + ' | ' + @docgroupinvalidmsg;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀甀渀挀琀椀漀渀氀椀猀琀椀搀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀甀渀挀琀椀漀渀氀椀猀琀椀搀洀猀最㬀 
਀ 
਀䔀一䐀 
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.਀⨀ ⴀ 怀怀䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀怀怀㨀 䌀愀渀 戀攀 愀 猀琀爀椀渀最 椀渀挀氀甀搀椀渀最 攀洀瀀琀礀 漀爀 渀甀氀氀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 怀怀䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀怀怀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - ``@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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀Ⰰ 漀爀 渀漀渀ⴀ攀砀椀猀琀椀渀最 爀攀挀漀爀搀 椀渀 搀愀琀愀戀愀猀攀⸀ 
* - Update Operation Fail: In case of an exception during the update, returns an error message with details.਀⨀ 
* **Side Effects:**਀⨀ 
* - Modifies the 'notes' column in 'user_restr.doc_group_edit_perm_people_lst' table if all conditions are met.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䈀漀琀栀 䀀搀漀挀最爀漀甀瀀椀搀 愀渀搀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 瘀愀氀椀搀⸀ 
* - There must be an existing record matching @docgroupid and @peoplelistid.਀⨀ 
* **Postconditions:**਀⨀ 
* - If successful, the 'notes' column is updated for the specified record.਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
CREATE PROCEDURE [controlling].[usp_UPD_dc_gp_ed_prm_ppl_notes] ਀ 
     @docgroupid bigint               = NULL,  -- Document 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_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';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
					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਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  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 PeopleListIDInvalid');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF NOT EXISTS (SELECT doc_group_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 @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀 
		    SET notes = @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਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_doc_group_name_rstr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 琀愀戀氀攀⸀  伀渀氀礀 愀瀀瀀氀椀攀猀 昀漀爀 爀攀挀漀爀搀猀 
-- which the connected user has rights to.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- 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 [controlling].[usp_UPD_doc_group_name_rstr] ਀ 
     @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਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
	    @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)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @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.';਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	 -- This also returns negative if the id does not exist਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
			@docgroupid_to_check_vp = @recordid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @nodocgroup_permissionmsg =  ISNULL(CONVERT(nvarchar(10), @recordid), '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 @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਀ 
਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT doc_group_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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE xref.doc_group_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE doc_group_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਀    䔀一䐀 
਀ 
-- 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: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a duty function record in people.duty_functions਀ⴀⴀ 䤀渀瀀甀琀 椀猀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- Output is a status message, transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Updates a duty function record in people.duty_functions਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @recordid bigint: Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
* - @function_name nvarchar(50): Must be a non-null and non-empty valid identifier which ਀⨀ ⴀ 椀猀 渀漀琀 愀 搀甀瀀氀椀挀愀琀攀 漀昀 愀 搀椀昀昀攀爀攀渀琀 爀攀挀漀爀搀⸀ 
* - @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.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @function_name must be unique਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀甀琀礀开昀甀渀挀琀椀漀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
     @mnemonic nvarchar(10)           = '',             ਀ऀ 䀀昀甀渀挀琀椀漀渀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀      㴀 ✀✀Ⰰ 
	 @description 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਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
			 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 df.function_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
							WHERE df.function_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.duty_functions AS df਀ऀऀऀऀ      圀䠀䔀刀䔀 搀昀⸀渀愀洀攀 㴀 䀀昀甀渀挀琀椀漀渀开渀愀洀攀 
				            AND df.function_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE people.duty_functions਀ऀऀ    匀䔀吀 洀渀攀洀        㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    name        = @function_name,਀ऀऀऀऀ搀攀猀挀爀椀瀀琀椀漀渀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE function_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਀    䔀一䐀 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the notes column of a record in people.duty_function_sid_links਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀甀渀挀琀椀漀渀 椀搀Ⰰ 猀椀搀 氀椀猀琀 椀搀 愀渀搀 渀漀琀攀猀  
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Updates the notes column of a record in 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਀⨀ ⴀ 䀀猀椀搀爀攀挀漀爀搀椀搀㨀 䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀⸀ 一漀琀 瀀攀爀洀椀琀琀攀搀 琀漀 戀攀 攀洀瀀琀礀 漀爀 一唀䰀䰀 
* - @notes: 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:**਀⨀ 
* - Updates the notes column of 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਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ 
	 @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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
	 -- 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.');਀ऀऀऀ 䔀一䐀 
਀ 
	 -- 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');	਀ऀऀऀ䔀一䐀 
਀ 
     -- Check that a matching record exists਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    AND NOT EXISTS ਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
				   FROM people.duty_function_sid_links AS dfsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
						AND dfsl.sid_id  = @sidrecordid)਀ऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_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਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 
            SET notes = ISNULL(@inputnotes, '')਀ऀऀ  圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀  
		        AND 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 @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_file_group_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:        Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀   　㜀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:   Updates an existing file group name਀ⴀⴀ 戀礀 甀瀀搀愀琀椀渀最 愀 爀攀挀漀爀搀 椀渀 昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀⸀ 
-- Input is the parameters for a file group name:਀ⴀⴀ 爀攀挀漀爀搀 䤀䐀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- Output is a status message and a transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 愀渀 攀砀椀猀琀椀渀最 昀椀氀攀 最爀漀甀瀀 渀愀洀攀 爀攀挀漀爀搀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀㨀 䤀䐀 漀昀 琀栀攀 爀攀挀漀爀搀 琀漀 甀瀀搀愀琀攀⸀ 
* - @mnemonic nvarchar(10): Can be null.਀⨀ ⴀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @description nvarchar(max): Can be null.਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid @attribute_name or if the @recordid does not exist.਀⨀ ⴀ 唀渀椀焀甀攀渀攀猀猀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀 椀昀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀 ✀砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀✀ 琀愀戀氀攀 椀昀 愀氀氀 挀漀渀搀椀琀椀漀渀猀 愀爀攀 洀攀琀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @attribute_name must be provided and be unique.਀⨀ ⴀ 䀀爀攀挀漀爀搀椀搀 洀甀猀琀 挀漀爀爀攀猀瀀漀渀搀 琀漀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_file_group_name] ਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
     @mnemonic nvarchar(10)           = NULL,਀     䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 ✀✀Ⰰ 
     @description nvarchar(max)       = NULL,਀     䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
     @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀    匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀    䐀䔀䌀䰀䄀刀䔀 
	    @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',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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', ਀            䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
        SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀    䔀一䐀 
਀    ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀ऀ䈀䔀䜀䤀一 
		  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 xref.file_group_names AS fgn਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
਀       
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT fgn.file_group_id਀ऀऀऀऀऀ   䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
					  WHERE attr_name = @attribute_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਀ 
			-- Update the record਀ऀऀऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
			BEGIN਀ऀऀऀऀ䈀䔀䜀䤀一 吀刀夀 
					UPDATE xref.file_group_names਀ऀऀऀऀऀ匀䔀吀 洀渀攀洀      㴀 䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ 洀渀攀洀⤀Ⰰ 
						attr_name = @attribute_name,਀ऀऀऀऀऀऀ搀攀猀挀爀     㴀 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 搀攀猀挀爀⤀ 
					WHERE file_group_id = @recordid;਀ 
					SET @transaction_status = 'Good';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'Success', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					 IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
				END TRY਀ऀऀऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
					SET @transaction_status = 'Bad';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'UpdateError', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					SET @message = CONCAT(@message, @tempmessage, ' | ',਀ऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
				END CATCH਀ऀऀऀ䔀一䐀 
	END  -- End IF @userauthentication_status = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fl_gp_ed_prm_fct_notes]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 挀漀氀甀洀渀 漀昀 愀 爀攀挀漀爀搀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀⸀  
-- Input is a file group ID, a function list ID and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 漀昀 愀 爀攀挀漀爀搀 昀漀爀 愀 昀甀渀挀椀漀渀 氀椀猀琀 琀漀 攀搀椀琀 洀攀琀愀搀愀琀愀 昀漀爀 昀椀氀攀猀 眀椀琀栀椀渀 愀 昀椀氀攀 最爀漀甀瀀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @functionlistid 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 must match an existing record਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀氀开最瀀开攀搀开瀀爀洀开昀挀琀开渀漀琀攀猀崀  
਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ             ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@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 @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 function list id has been supplied਀ऀ     䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
		    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਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  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 function_list_id = @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਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀氀开最瀀开攀搀开瀀爀洀开瀀瀀氀开渀漀琀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the notes column of a record from user_restr.file_group_edit_perm_ppl_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 people list ID.਀⨀ 
* **Side Effects:**਀⨀ 
* - Updates the notes of a record in 'user_restr.file_group_edit_perm_ppl_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_ppl_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';਀ 
  -- 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 @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 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 userauthentication_status = Pass.਀ 
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE user_restr.file_group_edit_perm_ppl_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_fm_dc_c_ob_ms_def]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a default document multi-select common object. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 @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਀ऀ    䤀䘀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		   SET @newcommonobjectid = NULL;਀ऀऀ䤀䘀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			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_doc_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_doc_com_obj_ms_defaults ਀ऀऀ    匀䔀吀       挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
				= @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: 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_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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 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_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 insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    UPDATE forms.form_doc_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਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_dc_c_ob_rb_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates 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,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀऀ 䔀一䐀 
	 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 @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਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		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_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 insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    UPDATE forms.form_doc_com_obj_rb_lst_links ਀ऀऀ   匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
		          length = @fieldlength,਀ऀऀऀऀ瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
			  attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			  attribute3 = ISNULL(@attribute3, ''),਀搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀 
	     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: 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_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_booking_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_bk_stat_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Updates 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';਀ 
  -- 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_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    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_usrid_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_user_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_bk_usrnm_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Updates a link between a form and base.document_id_list.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';਀ 
  -- 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_usernm_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_cmts_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_comnts_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_date_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Updates a link between a form and base.document_id_list.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';਀ 
  -- 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_date_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_rel_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_release_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_id_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Updates a link between a form and a document-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';਀ 
  -- 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_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: 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_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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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_nm_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_funct_lst_links]    Script Date: Tue 12-05-2026 5:43:19 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_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@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_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਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_function_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: 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_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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 @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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_fl_c_ob_rb_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates 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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 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   = 'DefaultInvalid', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀愀甀氀琀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   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_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 insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    UPDATE forms.form_file_com_obj_rb_lst_links ਀ऀऀ   匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
		          length = @fieldlength,਀ऀऀऀऀ瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
			  attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			  attribute3 = ISNULL(@attribute3, ''),਀搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀 
	     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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_fl_com_obj_ms_def]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Updates a default file multi-select common object. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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_file_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 parameters਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
		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_list_id ਀ऀऀऀ    㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀Ⰰ 
			          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_fl_crtd_by_id_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Updates a link between a form and a file-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';਀ 
  -- 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_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: 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_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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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_nm_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_funct_lst_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file function 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_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@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_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਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_function_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-07-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_form_doc_created_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_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_doc_date_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Updates 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)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @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 date field id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 搀漀挀 搀愀琀攀 昀椀攀氀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@ismandinvalidmessage nvarchar(200)     = '', -- Communicates that the ismandatory flag is invalid਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ 
		@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਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  SET @connectedusersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀  匀䔀吀 䀀甀猀攀爀渀愀洀攀 㴀 匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀㬀 
  -- 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 NOT EXISTS (SELECT doc_date_name_id਀ऀऀऀऀऀऀऀ     䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 
							    WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ      䄀一䐀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExists',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							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 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 @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 (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 17-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_UPD_form_doc_free_text_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 free text field 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਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  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 NOT EXISTS (SELECT doc_free_text_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 @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_free_text_name_id = @docfreetextnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_doc_int_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㌀ⴀ㄀㄀ⴀ㈀　㈀㌀ 
-- Description:	Update a link between a form and a document integer field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开椀渀琀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docintnameid 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 integer field 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 @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 integer 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 NOT EXISTS (SELECT doc_int_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 @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_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 @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 (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_doc_lock_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a document lock status 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_doc_lock_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_doc_lock_status_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-11-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_UPD_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(300)      = '', -- 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਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@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਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  SET @connectedusersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀  匀䔀吀 䀀甀猀攀爀渀愀洀攀 㴀 匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀㬀 
  -- 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 @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਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the list id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
							  FROM doc_attr.doc_multi_select_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 @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = 'A database level message error occurred on FrmMandInvalid.';਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if the record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
						   FROM forms.form_doc_multi_sel_list_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND doc_ms_list_id = @docmslistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					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_multi_sel_list_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.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  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 (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 21-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 漀戀樀攀挀琀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_doc_multi_sel_def]਀ 
     @formid bigint                   = NULL,਀     䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @docmsattrid 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 doc_ms_list_id਀ऀऀ                   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀 
					      WHERE doc_ms_list_id = @docmslistid਀ऀऀऀऀऀ        䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀 
							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਀ऀऀ䔀一䐀 
--==================================਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @newdocmsattrid = 0਀ऀऀ   匀䔀吀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		IF @newdocmsattrid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_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 @newdocmsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE    doc_ms_list_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
								   AND    doc_ms_attr_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 doc_ms_attr_id਀ऀऀ                   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀  
					      WHERE form_id = @formid਀ऀऀऀऀऀऀ    䄀一䐀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
					        AND doc_ms_attr_id = @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';਀ 
		  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_doc_multi_sel_defaults ਀ऀऀ    匀䔀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀 
		  WHERE form_id = @formid਀ऀ        䄀一䐀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
			AND doc_ms_attr_id = @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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_doc_radiob_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ㄀㄀ⴀ㈀　㈀㌀ 
-- Description:	Updates 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,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @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..਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(300)      = '', -- 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਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@docrbnotexistmessage nvarchar(200)     = '', -- Communicates that the supplied document radio button does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied doc radio button 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਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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 = 'RadioBNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   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_radio_button_links਀ऀऀऀऀऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								    AND doc_radiob_list_id = @docradioblistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					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_radio_button_links ਀ऀऀ   匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
		          length = @fieldlength,਀ऀऀऀऀ瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
			  attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			  attribute3 = ISNULL(@attribute3, ''),਀ऀऀऀ  搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀 㴀 䀀搀攀昀愀甀氀琀搀漀挀爀戀开愀琀琀爀椀搀 
	     WHERE form_id = @formid AND doc_radiob_list_id = @docradioblistid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀    䤀䘀 ⠀䀀搀漀挀爀戀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀爀戀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_doc_real_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ㄀㄀ⴀ㈀　㈀㌀ 
-- Description:	Update a link between a form and a document real number 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)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @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 integer field 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 @docrealnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docrealnameid 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 real number field id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_real_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE doc_real_name_id = @docrealnameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   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  NOT EXISTS (SELECT doc_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਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  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_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 @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 (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_doc_tr_grp_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a document 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_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';਀ 
  -- 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_doc_transaction_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਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 07-07-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_form_file_created_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_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_date_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file date field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀愀琀攀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开搀愀琀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @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 ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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 @filedatenameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 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 NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A 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 @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_date_field_links਀ऀऀऀऀऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								    AND file_date_name_id = @filedatenameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_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_date_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਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开昀爀攀攀开琀砀琀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-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_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@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 @filefreetextnameid = 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_free_text_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_free_text_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_free_text_name_id = @filefreetextnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 plus other attribute fields to be updated.਀ⴀⴀ 吀栀椀猀 甀猀瀀 椀猀 昀漀爀 挀漀渀琀爀漀氀氀攀爀猀 ⠀愀猀 漀瀀瀀漀猀攀搀 琀漀 挀漀渀昀椀最甀爀愀琀漀爀猀⤀ 
-- 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');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    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_content_hash_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_int_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file integer field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开椀渀琀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @fileintnameid 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 @fileintnameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file integer name 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_integer_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_int_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_int_name_id = @fileintnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 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_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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@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 @filemultiselectlistid = 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_multi_select_list_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_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਀ऀऀऀ䔀一䐀 
਀ 
		-- 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_ms_list_id = @filemultiselectlistid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_name_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file filename 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_name_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');਀ऀऀ䔀一䐀 
਀ 
਀ 
  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_name_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਀    䔀一䐀 
਀ 
਀䔀一䐀 
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਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开爀愀搀椀漀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 昀椀攀氀搀⸀ 
-- Input is a form id and a file radio button id 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_radiob_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @defaultfile_rb_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 ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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 @file_radioblistid = 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_radio_button_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀⤀   
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 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 @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 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_radio_button_links ਀ऀऀऀ    匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
				       length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, ''),਀      搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀 㴀 䀀搀攀昀愀甀氀琀昀椀氀攀开爀戀开愀琀琀爀椀搀 
			  WHERE form_id = @formid AND file_radiob_list_id = @file_radioblistid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 file real 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_real_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਀ऀऀ 䔀一䐀 
਀ऀ 䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 　  
	    SET @filerealnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 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 NoAttrID.');਀ऀऀ 䔀一䐀 
	  ELSE -- An attribute id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_real_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_real_name_id = @filerealnameid)    ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_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_real_number_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								  AND file_real_name_id = @filerealnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_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_real_number_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: 23-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 爀攀琀攀渀琀椀漀渀 搀愀琀攀 昀椀攀氀搀⸀ 
-- 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. 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_file_retention_date_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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @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_size_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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开琀爀开最爀瀀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @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_transactn_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਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开椀搀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 漀昀 愀 昀漀爀洀 椀搀 
-- Input is a record id and new list position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_id_posn] ਀ 
	 @formid 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)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@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 = @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 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 forms.form_identifier_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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE forms.form_identifier_names ਀ऀऀ    匀䔀吀    氀椀猀琀开瀀漀猀椀琀椀漀渀  
			    = @listposition਀ऀऀ  圀䠀䔀刀䔀    昀漀爀洀开椀搀  
		        = @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 (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_id_text]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- 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 ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
        @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 = @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 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_identifier_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_identifier_names਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							   AND form_id <> @formid)਀ऀऀ   䈀䔀䜀䤀一 
			 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਀ऀ     唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
		         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 (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
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');਀ऀऀ䔀一䐀 
਀ 
  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_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਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_function_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: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 昀漀爀 搀漀挀甀洀攀渀琀 瀀攀漀瀀氀攀 氀椀猀琀 昀椀攀氀搀⸀ 
-- Input is a form id, 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_doc_user_lnks]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Updates a link between a form and a general field name linked to user ID.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- 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_user_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_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਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_user_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: 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');਀ऀऀ䔀一䐀 
਀ 
  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_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਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_function_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: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 搀攀昀愀甀氀琀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 漀戀樀攀挀琀⸀  
-- Input and output parameters are as declared below.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_frm_file_multi_sel_def]਀ 
     @formid bigint                   = NULL,਀     䀀昀椀氀攀洀猀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @filemsattrid 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 @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਀ऀऀ䔀一䐀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check the new parameter਀ⴀⴀ 䌀栀攀挀欀 渀攀眀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 
     IF @newfilemsattrid = 0਀ऀ    匀䔀吀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
	 IF @newfilemsattrid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_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 @newfilemsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE    file_ms_list_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
								   AND    file_ms_attr_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀⤀  
							  BEGIN਀ऀऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
										@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  									IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀ 䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀Ⰰ ✀  伀戀樀攀挀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
									ELSE ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
									SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							  END਀ 
			 END਀ 
    -- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 
		                   FROM forms.form_file_multi_sel_defaults ਀ऀऀऀऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
						    AND file_ms_list_id = @filemslistid਀ऀऀऀऀऀ        䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 
						    AND       @filemsattrid  ਀ऀऀऀऀऀऀऀ    㰀㸀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀⤀ 
		  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 file_ms_attr_id = @newfilemsattrid਀ऀऀ       圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			     AND file_ms_list_id = @filemslistid਀ऀऀऀऀ 䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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_user_lnks]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Updates a link between a form and a general field name linked to user ID for a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- 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_user_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_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਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_user_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਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record in people.function_lists਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀甀渀挀琀椀漀渀开氀椀猀琀崀  
਀          
	 @functionlistid 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਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀      䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   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 exists.  Only perform this check if both parameters have been supplied.਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    AND NOT EXISTS ਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			   FROM people.function_lists AS fl਀ऀऀऀ  圀䠀䔀刀䔀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
					AND fl.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 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE people.function_lists਀            匀䔀吀   氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE 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   = '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-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record into people.function_list_names to update a duty function list name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Updates a record ino people.function_list_names to update a duty function list name਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @recordid bigint: Mandatory਀⨀ ⴀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
* - @functionlist_name nvarchar(50): Must be a non-null and non-empty valid identifier which is unique.਀⨀ ⴀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
*਀⨀ 
* **Return Values:**਀⨀ 
* - None਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @functionlist_name must be unique or match the existing for the given record id.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
     @mnemonic nvarchar(10)           = '',             ਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 ✀✀Ⰰ 
	 @description 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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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਀ऀऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- 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਀ 
	  -- Attribute name must be unique. Only perform this check if the id is valid.  Otherwise a NameNoteUnique error may be misleading.਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
	     AND EXISTS (SELECT fln.name਀ऀऀ ऀऀ       䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
				      WHERE fln.name = @functionlist_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 -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_lock_document_id]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Locks a document id਀ⴀⴀ 戀礀 猀攀琀琀椀渀最 琀栀攀 䰀漀挀欀 匀琀愀琀甀猀 琀漀 䰀漀挀欀攀搀⸀ 
-- Input is a document ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_lock_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;਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(300)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
        @nodatamessage nvarchar(200)            = '', -- Communicates that no data 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';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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 @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 authenticaton = Pass਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀  
		           SET document_id_list.lock_status = 'Locked'਀ऀऀऀ     圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
         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;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_people_list]    Script Date: Tue 12-05-2026 5:43:19 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_people_list] ਀ 
         ਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @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 ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@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 people list id਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀      䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoPeopleListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   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਀ 
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	 IF NOT EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		   FROM people.people_lists AS pl਀ऀऀ  圀䠀䔀刀䔀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
		        AND pl.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 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE people.people_lists਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀   㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE 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   = '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-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record in people.people_list_names to update a people list name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 爀攀挀漀爀搀 椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- Output is a status message, transaction.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Updates a record in people.people_list_names to update a people list name਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @recordid bigint: Mandatory.  Must be a valid existing id. ਀⨀ ⴀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
* - @peoplelist_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.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Updates a record in people.people_list_names ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
     @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਀ 
	      -- 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 pln.people_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
							WHERE pln.people_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.people_list_names AS pln਀ऀऀऀऀ  圀䠀䔀刀䔀 瀀氀渀⸀渀愀洀攀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀 
				        AND pln.people_list_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 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 NameNotUnique.');਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE people.people_list_names਀ऀऀ    匀䔀吀 洀渀攀洀 㴀 䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
			    name = @peoplelist_name,਀ऀऀऀऀ搀攀猀挀爀椀瀀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 
		  WHERE people_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਀    䔀一䐀 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开猀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the text fields of a record in user_restr.sid_list਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 匀䤀䐀 䤀䐀Ⰰ 
-- plus an optional name and description.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开猀椀搀崀  
਀     䀀猀椀搀爀攀挀漀爀搀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 匀䤀䐀 䤀䐀 爀攀挀漀爀搀 渀甀洀戀攀爀 ⠀渀漀琀 琀栀攀 匀䤀䐀⤀ 
	 @sid_name nvarchar(150)           = NULL,  -- Optional name of SID for use within this database਀ऀ 䀀猀椀搀开搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀    㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 搀攀猀挀爀椀瀀琀椀漀渀 漀爀 渀漀琀攀猀 
	 @email_address nvarchar(255)      = NULL,  -- Optional email address਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@invalidsidmessage  nvarchar(200)      = '',     -- Communicates that the supplied SID is invalid਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀       㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@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 @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Replace NULL name and description fields with empty.਀ऀ  䤀䘀 䀀猀椀搀开渀愀洀攀 䤀匀 一唀䰀䰀 匀䔀吀 䀀猀椀搀开渀愀洀攀 㴀 ✀✀㬀 
	  IF @sid_description IS NULL SET @sid_description = '';਀ 
	  -- 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';਀ऀऀ   䔀一䐀 
਀       ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀愀琀 琀栀攀 猀椀搀  椀猀 瘀愀氀椀搀 
਀ऀऀⴀⴀ 匀愀渀椀琀椀猀攀 琀栀攀 攀洀愀椀氀 愀搀搀爀攀猀猀 
				SET @email_address = LOWER(@email_address);਀ 
				-- Remove control characters (char codes 0-31)਀ऀऀऀऀ圀䠀䤀䰀䔀 倀䄀吀䤀一䐀䔀堀⠀✀─嬀✀ ⬀ 䌀䠀䄀刀⠀　⤀ ⬀ ✀ⴀ✀ ⬀ 䌀䠀䄀刀⠀㌀㄀⤀ ⬀ ✀崀─✀Ⰰ 䀀攀洀愀椀氀开愀搀搀爀攀猀猀⤀ 㸀 　 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀攀洀愀椀氀开愀搀搀爀攀猀猀 㴀 匀吀唀䘀䘀⠀䀀攀洀愀椀氀开愀搀搀爀攀猀猀Ⰰ 倀䄀吀䤀一䐀䔀堀⠀✀─嬀✀ ⬀ 䌀䠀䄀刀⠀　⤀ ⬀ ✀ⴀ✀ ⬀ 䌀䠀䄀刀⠀㌀㄀⤀ ⬀ ✀崀─✀Ⰰ 䀀攀洀愀椀氀开愀搀搀爀攀猀猀⤀Ⰰ ㄀Ⰰ ✀✀⤀㬀 
				END;਀ 
				-- Remove any spaces within the string਀ऀऀऀऀ匀䔀吀 䀀攀洀愀椀氀开愀搀搀爀攀猀猀 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀攀洀愀椀氀开愀搀搀爀攀猀猀Ⰰ ✀ ✀Ⰰ ✀✀⤀㬀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  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  name = ISNULL(@sid_name, ''),਀ऀऀऀऀ    搀攀猀挀爀 㴀 䤀匀一唀䰀䰀⠀䀀猀椀搀开搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
		    email_address = ISNULL(@email_address, '')਀ऀऀ      圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀㬀  
         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 (@invalidsidmessage <> '')          SET @message = @message + ' | ' + @invalidsidmessage;਀ऀ䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
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 browsing tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开戀爀开琀爀开瀀攀爀洀开昀氀椀猀琀崀  
਀ 
     @tag_br_treeid bigint            = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
     @newtag_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 @newtag_br_treeid = '' ਀ऀऀऀ 匀䔀吀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @newtag_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 @newfunctionlistid = '' ਀ऀ     匀䔀吀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		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_br_tree_permissions_flist਀ऀऀऀऀऀ圀䠀䔀刀䔀       琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
					      = @newtag_br_treeid਀ऀऀऀऀऀ  䄀一䐀       昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					      = @newfunctionlistid਀ऀऀऀऀ  䄀一䐀 一伀吀 ⠀       䀀琀愀最开戀爀开琀爀攀攀椀搀 
					         = @newtag_br_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_browsing_tree_id਀ऀऀऀ    㴀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀Ⰰ 
				      function_list_id਀ऀऀऀ    㴀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
		  WHERE    tag_browsing_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਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            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: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a new tag link permissions record to authorise members of a people list to edit a tag browsing tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开戀爀开琀爀开瀀攀爀洀开瀀氀椀猀琀崀  
਀ 
     @tag_br_treeid bigint            = NULL,਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
     @newtag_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 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_br_tree_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
					      = @tag_br_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_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @newtag_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 @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਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF EXISTS (SELECT tag_browsing_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE       tag_browsing_tree_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 
					  AND       people_list_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 
				  AND NOT (       @tag_br_treeid਀ऀऀऀऀऀ         㴀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 
					       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_br_tree_permissions_plist ਀ऀऀ    匀䔀吀       琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
			    = @newtag_br_treeid,਀ऀऀऀऀ      瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			    = @newpeoplelistid਀ऀऀ  圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
		        = @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_UPD_tag_browsing_tree_name]    Script Date: Tue 12-05-2026 5:43:19 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_browsing_tree_name] ਀ 
     @tag_br_treeid bigint          = NULL,਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @browsing_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਀ 
	-- Check the browsing tree ID਀ऀ  ऀ  䤀䘀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 　  
			 SET @tag_br_treeid = NULL;਀  
		  -- Check if a browsing tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开戀爀开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A 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, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagBrTreeIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
਀ 
	  -- 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਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            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 new tag group identifier name record.਀ⴀⴀ 䄀氀氀 瀀愀爀愀洀攀琀攀爀猀 洀甀猀琀 戀攀 猀攀渀琀Ⰰ 漀琀栀攀爀眀椀猀攀 琀栀攀礀 眀椀氀氀 戀攀 猀攀琀 琀漀 渀甀氀氀⸀  
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_tag_group_id_name] ਀ 
	 @tag_groupid bigint              = NULL,਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @tag_group_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 琀愀最 最爀漀甀瀀 䤀䐀⸀  一漀琀攀 琀栀愀琀 甀瀀搀愀琀椀渀最 愀 琀愀最 最爀漀甀瀀 椀猀 漀渀氀礀 愀瘀愀椀氀愀戀氀攀 琀漀 挀漀渀琀爀漀氀氀攀爀猀⸀   
	                              -- A controller can edit any tag group. ਀ऀ   
	  	  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਀ऀऀऀ 䔀一䐀 
਀ 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀琀愀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀✀ 
		   SET @tag_group_name = NULL;਀ऀऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀开渀愀洀攀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagGrpName', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀瀀一愀洀攀⸀✀⤀㬀 
			 END਀ 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开渀愀洀攀  
		 			 FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 琀愀最开最爀漀甀瀀开渀愀洀攀  
					      = @tag_group_name਀ऀऀऀऀऀ  䄀一䐀 琀愀最开最爀漀甀瀀开椀搀  
					      <> @tag_groupid) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ' | ', ISNULL(LEFT(@tag_group_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_group_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_group_identifier_names ਀ऀऀ    匀䔀吀    洀渀攀洀 
			    = @mnemonic,਀ऀऀऀऀ   琀愀最开最爀漀甀瀀开渀愀洀攀 
				= @tag_group_name,਀ऀऀऀऀ   搀攀猀挀爀 
				= @description,਀ऀऀऀऀ   氀椀猀琀开瀀漀猀椀琀椀漀渀 
				= @listposition਀ऀऀ  圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
		        = @tag_groupid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 link tags to a tag group਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开最爀漀甀瀀开瀀攀爀洀开昀氀椀猀琀崀  
਀ 
     @tag_groupid bigint              = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
     @newtag_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.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
--================================਀ⴀⴀ䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
	  	  IF @newtag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @newtag_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 @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_group_permissions_flist਀ऀऀऀऀऀ圀䠀䔀刀䔀       琀愀最开最爀漀甀瀀开椀搀 
					      = @newtag_groupid਀ऀऀऀऀऀ  䄀一䐀       昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					      = @newfunctionlistid਀ऀऀऀऀ  䄀一䐀 一伀吀 ⠀    䀀琀愀最开最爀漀甀瀀椀搀 
					      = @newtag_groupid਀ऀऀऀऀऀ      䄀一䐀     䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
					         = @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_group_id਀ऀऀऀ    㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀Ⰰ 
				      function_list_id਀ऀऀऀ    㴀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
		  WHERE    tag_group_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਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            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: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a new tag link permissions record to authorise members of a people list to link tags to a tag group਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开最爀漀甀瀀开瀀攀爀洀开瀀氀椀猀琀崀  
਀ 
     @tag_groupid bigint              = NULL,਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
     @newtag_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 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_group_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
					      = @tag_groupid਀ऀऀऀऀऀ  䄀一䐀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					      = @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_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @newtag_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 @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_group_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀       琀愀最开最爀漀甀瀀开椀搀 
					      = @newtag_groupid਀ऀऀऀऀऀ  䄀一䐀       瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					      = @newpeoplelistid਀ऀऀऀऀ  䄀一䐀 一伀吀  ⠀   䀀琀愀最开最爀漀甀瀀椀搀 
					      = @newtag_groupid਀ऀऀऀऀऀ      䄀一䐀  䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
					      = @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_group_id਀ऀऀऀ    㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀Ⰰ 
				     people_list_id਀ऀऀऀ    㴀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 
		  WHERE    tag_group_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 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.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 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 @tag_tree_name = ''਀ऀऀ   匀䔀吀 䀀琀愀最开琀爀攀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 渀愀洀攀  
		 			 FROM tagging.tag_tree_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 渀愀洀攀 㴀 䀀琀愀最开琀爀攀攀开渀愀洀攀 
					  AND     tag_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_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   = '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_tree_perm_flist]    Script Date: Tue 12-05-2026 5:43:19 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_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_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 @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_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE    tag_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_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 ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀       琀愀最开琀爀攀攀开椀搀  
								       = @newtag_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_treeid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 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_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE       tag_tree_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀琀愀最开琀爀攀攀椀搀 
					  AND       function_list_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
				  AND NOT (       @tag_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_tree_permissions_flist ਀ऀऀ    匀䔀吀       琀愀最开琀爀攀攀开椀搀 
			    = @newtag_treeid,਀ऀऀऀऀ      昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			    = @newfunctionlistid਀ऀऀ  圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
		        = @tag_treeid਀ऀऀऀ䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			    = @functionlistid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_UPD_tag_tree_perm_plist]    Script Date: Tue 12-05-2026 5:43:19 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_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_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਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--Check the new parameters਀ऀ  ऀ  䤀䘀 䀀渀攀眀琀愀最开琀爀攀攀椀搀 㴀 　 
			 SET @newtag_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 ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀       琀愀最开琀爀攀攀开椀搀  
								       = @newtag_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_treeid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 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_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE       tag_tree_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀琀愀最开琀爀攀攀椀搀 
					  AND       people_list_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 
				  AND NOT (       @tag_treeid਀ऀऀऀऀऀ         㴀 䀀渀攀眀琀愀最开琀爀攀攀椀搀 
					       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_tree_permissions_plist ਀ऀऀ    匀䔀吀       琀愀最开琀爀攀攀开椀搀 
			    = @newtag_treeid,਀ऀऀऀऀ      瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			    = @newpeoplelistid਀ऀऀ  圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
		        = @tag_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_UPD_transaction_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 渀漀琀攀⸀ 
-- Input is a transaction group id and a new note.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀 
਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 戀椀最椀渀琀                       㴀 一唀䰀䰀Ⰰ 
	 @new_transaction_group_note nvarchar(max)      = 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE base.transaction_groups ਀ऀऀ           匀䔀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀 㴀 䀀渀攀眀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀 
			     WHERE transaction_group_id = @transactiongroup;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the present step for a workflow instance.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 渀攀眀 爀攀挀漀爀搀 椀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_wf_inst_def_pres_step] ਀ 
     @recordid 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਀ 
਀ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 
  	  -- 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  ਀ऀऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 椀渀 眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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_definitions਀ऀऀ    匀䔀吀 瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 㴀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 
		  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 from workflow_instances.workflow_step_duty_functions.  ਀ⴀⴀ 䄀氀氀 漀氀搀 愀渀搀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 洀甀猀琀 戀攀 猀攀渀琀⸀ 
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀昀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀崀  
਀     䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ     
	 @functionid bigint               = NULL, ਀ऀ 䀀漀甀琀瀀甀琀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @new_instance_step_id bigint     = NULL,    ਀ऀ 䀀渀攀眀开昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ  
	 @new_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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@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਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀ 
		@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 function.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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 that a instance step id was supplied਀ऀऀ  䤀䘀 ⠀䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 伀刀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoWfInstanceStepID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- 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 that a instance step id was supplied਀ऀऀ  䤀䘀 ⠀䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 伀刀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoWfInstanceStepID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- Instance step id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀 䤀䐀 攀砀椀猀琀猀 
					IF NOT EXISTS (SELECT workflow_instance_step_id਀ऀऀऀऀऀऀऀऀऀ 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
									WHERE workflow_instance_step_id = @new_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਀ 
਀ⴀⴀ 吀栀攀 昀甀渀挀琀椀漀渀 椀搀 眀椀氀氀 戀攀 挀栀攀挀欀攀搀 氀愀琀攀爀 眀栀攀爀攀 琀栀攀 攀砀椀猀琀愀渀挀攀 漀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 椀猀 挀栀攀挀欀攀搀⸀  
਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 昀甀渀挀琀椀漀渀 椀搀 
	  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਀ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 渀攀眀 昀甀渀挀琀椀漀渀 䤀䐀⸀  
਀ 
	  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_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 a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 
		  WHERE 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 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' 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		  ਀ऀऀ    䄀一䐀    昀甀渀挀琀椀漀渀开椀搀  
		        = @functionid਀ऀऀ    䄀一䐀    漀甀琀瀀甀琀开椀搀  
				= @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: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record for workflow_instances.workflow_instance_definitions to update a workflow instance.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 渀攀眀 爀攀挀漀爀搀 椀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_workflow_instance_def] ਀ 
     @recordid bigint                 = NULL,਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @workflow_model_id bigint        = NULL, ਀ऀ 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @notes nvarchar(max)             = 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਀ऀऀ 䔀一䐀 
਀ 
	  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 edit 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   -- End checking if doc id exists਀ 
	  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਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀  
							       = @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 ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀⤀  
				 BEGIN  -- The step ID does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WorkflowStepInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   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_definitions਀ऀऀ    匀䔀吀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
			    workflow_model_id = @workflow_model_id,਀ऀऀऀऀ瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 㴀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀Ⰰ 
				notes = @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');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  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_step]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 昀漀爀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 琀漀 甀瀀搀愀琀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀⸀   
-- All parameters must be sent਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_workflow_instance_step] ਀ 
     @recordid bigint                 = NULL,    -- workflow_instance_step_id਀ऀ 䀀椀渀猀琀愀渀挀攀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @model_step_id bigint            = NULL, ਀ऀ 䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @date1 datetime2(7)              = NULL,਀ऀ 䀀搀愀琀攀㈀ 搀愀琀攀琀椀洀攀㈀⠀㜀⤀              㴀 一唀䰀䰀Ⰰ 
	 @date3 datetime2(7)              = 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_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
			  WHERE workflow_instance_step_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_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 @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਀ऀऀ 䔀一䐀 
਀ऀ  䤀䘀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 　 
		 SET @model_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀漀搀攀氀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @model_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.');਀ऀऀ 䔀一䐀 
	  ELSE -- A model step id been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 洀漀搀攀氀 猀琀攀瀀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE workflow_model_step_id ਀ऀऀऀऀऀऀऀ       㴀       䀀洀漀搀攀氀开猀琀攀瀀开椀搀⤀  
				 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 ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    猀琀攀瀀开猀琀愀琀甀猀开椀搀  
							       = @step_status_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 StepStatusIDInvalid.');਀ऀऀऀऀ 䔀一䐀  
		 END  ਀ऀऀ  
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀Ⰰ 攀砀挀攀瀀琀 椀昀 琀栀攀 爀攀挀漀爀搀 椀猀 琀栀攀 猀愀洀攀 愀猀 攀砀椀猀琀椀渀最⸀ 
	 IF EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_instance_steps AS wis਀ऀऀ  圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀  
		        =           @instanceid਀ऀऀ    䄀一䐀 眀椀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
				=           @model_step_id਀ऀऀ    䄀一䐀 眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
			    =  @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 RecordExists.');਀ऀऀ䔀一䐀 
਀ 
	  -- 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  ਀ऀऀऀ     眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀  
			    =        @instanceid, ਀ऀऀऀ    眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
				=       @model_step_id,਀ऀऀऀऀ   猀琀攀瀀开猀琀愀琀甀猀开椀搀  
				= @step_status_id,਀ऀऀऀऀ搀愀琀攀开㄀ 㴀 䀀搀愀琀攀㄀Ⰰ 
				date_2 = @date2,਀ऀऀऀऀ搀愀琀攀开㌀ 㴀 䀀搀愀琀攀㌀ 
		  WHERE workflow_instance_step_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');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record from workflow_instances.workflow_step_participants.  ਀ⴀⴀ 䄀氀氀 漀氀搀 愀渀搀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 洀甀猀琀 戀攀 猀攀渀琀⸀ 
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开瀀愀爀琀椀挀椀瀀愀渀琀崀  
਀     䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ     
	 @sidid bigint                    = NULL, ਀ऀ 䀀漀甀琀瀀甀琀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @new_instance_step_id bigint     = NULL,    ਀ऀ 䀀渀攀眀开猀椀搀椀搀 戀椀最椀渀琀                㴀 一唀䰀䰀Ⰰ  
	 @new_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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@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 = '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 that a instance step id was supplied਀ऀऀ  䤀䘀 ⠀䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 伀刀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoWfInstanceStepID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- 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 that a instance step id was supplied਀ऀऀ  䤀䘀 ⠀䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 伀刀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoWfInstanceStepID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- Instance step id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀 䤀䐀 攀砀椀猀琀猀 
					IF NOT EXISTS (SELECT workflow_instance_step_id਀ऀऀऀऀऀऀऀऀऀ 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
									WHERE workflow_instance_step_id = @new_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਀ 
਀ऀⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 渀攀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀爀猀漀渀 椀搀 
	  IF @new_sidid = 0਀ऀ     匀䔀吀 䀀渀攀眀开猀椀搀椀搀 㴀 一唀䰀䰀㬀 
      IF @new_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 the person id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
			                 FROM user_restr.sid_list਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀渀攀眀开猀椀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'SidIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
਀ऀ  䤀䘀 䀀渀攀眀开漀甀琀瀀甀琀椀搀 㴀 　 
		 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    sid_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_participants਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =   @new_instance_step_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 RecordExists.');਀ऀऀ䔀一䐀 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀爀攀 椀猀 愀 挀漀爀爀攀猀瀀漀渀搀椀渀最 昀漀爀攀椀最渀 欀攀礀 昀漀爀 琀栀攀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 ⼀ 猀椀搀开椀搀 椀渀 眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀⸀ 
  IF EXISTS ਀    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	   FROM workflow_instances.workflow_person_output_files਀ऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	    AND 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 WfPersOutFRef.');਀ऀऀ䔀一䐀 
਀ 
਀   䔀一䐀  ⴀⴀ䔀一䐀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 愀昀琀攀爀 椀渀椀琀椀愀氀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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_participants਀ऀऀ    匀䔀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
				sid_id                    = @new_sidid,਀ऀऀऀऀ漀甀琀瀀甀琀开椀搀                 㴀 䀀渀攀眀开漀甀琀瀀甀琀椀搀 
		  WHERE workflow_instance_step_id਀ऀऀ        㴀       䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀ऀऀ   
		    AND    sid_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 [editing].[usp_DEL_book_in_id]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description: Deletes a booking record.਀ⴀⴀ 䐀攀氀攀琀攀 愀 戀漀漀欀攀搀开椀渀 戀漀漀欀椀渀最 爀攀挀漀爀搀 挀漀洀瀀氀攀琀攀氀礀 ⠀椀渀挀氀甀搀椀渀最 昀椀氀攀 氀椀渀欀猀⤀Ⰰ  
-- providing it is the most recent booking id for that user for that document਀ⴀⴀ 愀渀搀 椀琀 椀猀 愀 戀漀漀欀攀搀 椀渀 爀攀挀漀爀搀⸀ 
-- If the booking_id is still that which is against the doc_id then the status ਀ⴀⴀ 椀猀 爀攀瘀攀爀琀攀搀 琀漀 琀栀攀 瀀爀攀瘀椀漀甀猀 戀漀漀欀攀搀ⴀ漀甀琀 椀搀⸀  伀琀栀攀爀眀椀猀攀Ⰰ 椀昀 琀栀攀 戀漀漀欀椀渀最开椀搀 愀最愀椀渀猀琀 琀栀攀 搀漀挀甀洀攀渀琀开椀搀  
-- does not match the one being deleted then the doc_id booking record fields remain unchanged.    ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@documentid nvarchar(50)                = '', -- The document id associated with the record to be deleted. ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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  ਀   
  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'਀ऀऀ  䈀䔀䜀䤀一 
਀ 
	  SELECT @booking_in_time_box = booking_in_time_box਀ऀ    䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
	   WHERE gsg.setting_group_name = 'Master';਀ 
		    SET @documentid = (SELECT doc_id਀ऀऀऀ                     䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
								WHERE booking_id = @booking_id)਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀  
				(਀ऀऀऀऀ匀䔀䰀䔀䌀吀 戀氀⸀戀漀漀欀椀渀最开椀搀 
				  FROM base.booking_log AS bl਀ऀऀऀऀ 圀䠀䔀刀䔀 戀氀⸀甀猀攀爀开椀搀 㴀 䀀甀猀攀爀椀搀 
				   AND bl.booking_id = @booking_id਀ऀऀऀऀ   䄀一䐀 戀氀⸀戀漀漀欀椀渀最开猀琀愀琀甀猀 㴀 ✀䤀渀✀ 
				   AND DATEADD(MINUTE, @booking_in_time_box, bl.booking_date) >= GETDATE()਀ऀऀऀऀ   䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ऀऀऀऀ ⤀ 
਀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotLastBkIn', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					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 query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一 
	  BEGIN TRY਀ 
਀ऀऀ   唀倀䐀䄀吀䔀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 ⴀⴀ 刀攀瘀攀爀琀 琀栀攀 搀漀挀甀洀攀渀琀 爀攀挀漀爀搀 琀漀 琀栀攀 瀀爀攀瘀椀漀甀猀 戀漀漀欀攀搀 漀甀琀 䤀䐀⸀   
		      SET booking_id = ਀ऀऀऀऀ⠀ 
				SELECT bl.booking_id਀ऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
				 WHERE bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
				       AND booking_status = 'Out')਀ऀऀऀऀ ⤀ 
			WHERE doc_id = @documentid਀ 
			 ਀ऀऀ 
਀ 
		 DELETE FROM base.booked_in_files਀ऀऀ       圀䠀䔀刀䔀 戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀 
		 DELETE FROM base.booking_log਀ऀऀ       圀䠀䔀刀䔀 戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ऀऀ䌀伀䴀䴀䤀吀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ऀ     刀伀䰀䰀䈀䄀䌀䬀㬀 
	     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 date name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_date_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.਀ऀऀ䀀搀愀琀攀猀琀礀氀攀 椀渀琀                          㴀 ✀✀Ⰰ ⴀⴀ 䐀愀琀攀 猀琀礀氀攀 昀爀漀洀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@dateformat nchar(3)                    = 'dmy', ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 　 
			 SET @docdatenameid = 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 date name field id਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 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 NOT EXISTS (SELECT doc_date_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 
			 				WHERE doc_date_name_id = @docdatenameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_funct_list_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from document_to_function_list_links਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀⸀   
-- Output is a message and status.਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开昀甀渀挀琀开氀椀猀琀开氀椀渀欀崀  
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀          㴀 一唀䰀䰀Ⰰ 
     @functionlistid 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 @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਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
		                   FROM people.doc_to_function_list_links਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					        AND function_list_id = @functionlistid਀ऀऀऀऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				   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_group_link_restr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㈀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description: Deletes a document to document group link.਀ⴀⴀ 伀渀氀礀 瀀攀爀洀椀琀猀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 愀渀搀 搀漀挀甀洀攀渀琀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
-- Authenticates both controller and editor.਀ 
-- Input is a document id, document group id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_group_link_restr]਀ 
     @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 ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
		@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';  ਀ 
-- 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;਀ 
		  -- 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 @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
						   	     FROM xref.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 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 insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM xref.doc_group_links ਀                圀䠀䔀刀䔀       搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
				  AND doc_group_id = @docgroupid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_int_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Deletes a document to integer value link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_int_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';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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;਀ऀऀ  䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 　 
			 SET @docintnameid = 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 @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 int name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc 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 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਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀  
		  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: 19-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 
-- Input is the multi-select list id - attribute id - doc id triplet to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_multi_select_link] ਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
     @docmslistid 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.਀ऀऀ䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
        @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਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @documentid = ''਀ऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	 IF @docmslistid = 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_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਀ऀ  
		 -- Check if the record does not exist਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀  
							FROM doc_attr.doc_multi_select_links ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀     㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
								 AND 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 @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_ms_list_id     = @docmslistid਀ऀऀऀऀऀ  䄀一䐀 搀漀挀开椀搀         㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					  AND doc_ms_attr_id = @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਀    䔀一䐀 
਀䔀一䐀 
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_people_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;਀  䐀䔀䌀䰀䄀刀䔀  
		@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_people_list_links਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					        AND people_list_id = @peoplelistid਀ऀऀऀऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				   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_radiob_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_radio_button_links਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 ⴀ 搀漀挀 椀搀 瀀愀椀爀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_radiob_link] ਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
     @docradioblistid 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. ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@iscontroller nvarchar(3)               = 'No',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- 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਀ऀऀ   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
		   SET @iscontroller = 'Yes';਀ऀऀ䔀一䐀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀ 
  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 = ''਀ऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	 IF @docradioblistid = 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 -- 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.'); ਀ऀऀऀऀऀ 䔀一䐀ऀ  
਀ऀऀऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀愀搀椀漀戀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			   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਀ 
		਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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_radiob_list_id = @docradioblistid਀ऀऀऀ         䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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਀ 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开爀攀愀氀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 搀漀挀甀洀攀渀琀 琀漀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 氀椀渀欀⸀ 
-- Input is a document id and a document real name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开爀攀愀氀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docrealnameid 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 @docrealnameid = 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 @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 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 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 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 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_real_number_values ਀ऀऀ  圀䠀䔀刀䔀               搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		        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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_tag]    Script Date: Tue 12-05-2026 5:43:19 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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@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਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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    tag_id਀ऀऀ        㴀 䀀琀愀最开椀搀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            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_text_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Deletes a text value to document link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 琀攀砀琀 渀愀洀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀攀砀琀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @doctextnameid 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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 @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਀ऀऀऀ䔀一䐀 
਀ 
 		  -- Check that the record 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 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_free_text_values ਀  ऀऀ       圀䠀䔀刀䔀                     搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		              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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_to_com_obj_ms_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 
-- which links a common object to a document 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_DEL_doc_to_com_obj_ms_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 ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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਀ 
		 -- 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.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਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  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਀ऀऀऀ         䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					 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_DEL_doc_to_com_obj_rb_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 
-- which links a common object to a document via a radio button list਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀漀开挀漀洀开漀戀樀开爀戀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀  渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 一唀䰀䰀Ⰰ 
     @commonobjlistid 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਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@notexistmessage nvarchar(200)          = '', -- Communicates that the list-item ID pair entry does not exist਀ऀऀ䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@docidinvalidmessage nvarchar(200)      = '', -- Communicates that the document id was invalid਀ऀऀ䀀渀漀挀漀洀漀戀樀氀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 
		@nocomobjectmessage nvarchar(200)       = '', -- Communicates that a common object id was not supplied਀ऀऀ䀀挀漀洀漀戀樀氀椀猀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 眀愀猀 椀渀瘀愀氀椀搀 
		@comobjectinvalidmessage nvarchar(200)  = '', -- Communicates that the comon object id was invalid਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
  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 @nodocumentidmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
				   SET @nodocumentidmessage = '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 =  @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਀ 
		 -- 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 if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                  FROM com_obj.doc_to_com_obj_radiob_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀  搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					           AND common_object_list_id = @commonobjlistid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @norecordidmessage = @documentid + ' ' + CONVERT(nvarchar(10), @commonobjlistid) + ' | ' + @tempmessage;਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @norecordidmessage = '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.doc_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 @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 (@comobjlistinvalidmessage <> '')   SET @message = @message + ' | ' + @comobjlistinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀㬀 
    IF (@docidinvalidmessage <> '')        SET @message = @message + ' | ' + @docidinvalidmessage;਀    䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_to_function_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from document_to_function_links਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀崀  
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀          㴀 一唀䰀䰀Ⰰ 
     @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.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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_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: 30-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 昀漀爀 愀 搀漀挀甀洀攀渀琀 䤀䐀⸀ 
-- usp_UPD_document_id will leave the transaction group unchanged਀ⴀⴀ 椀昀 愀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 椀猀 渀漀琀 猀甀瀀瀀氀椀攀搀⸀ 
-- Both controler and editor are authenticated.਀ 
-- Input is a document ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_transaction_group] ਀ 
	 @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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@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਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_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 -- 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਀ऀऀऀऀ䔀一䐀 
 ਀ 
	  -- 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਀    䔀一䐀  ⴀⴀ 䔀渀搀 椀昀 琀爀愀渀猀愀挀琀椀漀渀 爀攀愀搀礀 㴀 刀攀愀搀礀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_user_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Delete a record from document_to_user_links਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开甀猀攀爀开氀椀渀欀崀  
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀          㴀 一唀䰀䰀Ⰰ 
     @sidid 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_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਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开砀爀攀昀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Deletes a cross-reference 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,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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',਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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 @source_docid = ''਀ऀऀ     匀䔀吀 䀀猀漀甀爀挀攀开搀漀挀椀搀 㴀 一唀䰀䰀㬀 
		  IF @source_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 =  @source_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(@source_docid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check the cross-reference document id਀ऀऀ  䤀䘀 䀀砀爀攀昀开搀漀挀椀搀 㴀 ✀✀ 
		     SET @xref_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 @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT xref_type_id਀ऀऀ               䘀刀伀䴀 砀爀攀昀⸀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀 
					  WHERE source_doc_id = @source_docid਀ऀऀऀऀऀ        䄀一䐀 砀爀攀昀开搀漀挀开椀搀 㴀 䀀砀爀攀昀开搀漀挀椀搀⤀ 
		  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 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   = '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_document_id]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀 愀 搀漀挀甀洀攀渀琀 椀搀⸀ 
-- Input is a document id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_document_id] ਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_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 edit 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.');਀ऀऀऀऀ 䔀一䐀 
			 ELSE -- The doc id does exist and the user has permission to access it.  Check if it is locked.਀ऀऀऀ   䤀䘀 ⠀⠀匀䔀䰀䔀䌀吀 氀漀挀欀开猀琀愀琀甀猀 
					  FROM base.document_id_list਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
						   = 'Locked')਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   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 DocIDLocked.');਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀䘀愀椀氀✀㬀 
				 END਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 搀漀挀 椀搀 攀砀椀猀琀猀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM base.document_id_list ਀ऀऀ       圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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: 11-01-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 昀椀氀攀 爀攀挀漀爀搀 
-- Input is a file id.  Output is messages. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL 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 ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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';  -- 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;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Reviewer',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  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 @id_to_delete = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if 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 was 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 EXISTS (SELECT gsg.never_delete_files ਀ऀ               䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		          WHERE gsg.setting_group_name = 'Master'਀ऀऀऀऀ    䄀一䐀 最猀最⸀渀攀瘀攀爀开搀攀氀攀琀攀开昀椀氀攀猀 㴀 ✀伀渀✀⤀ 
		   BEGIN਀ऀऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				  SET @transaction_ready      = 'Fail';਀ऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					   @message_id   = 'FileDeleteDisabled', ਀ऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				  IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				  ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䐀攀氀攀琀攀䐀椀猀愀戀氀攀搀⸀✀⤀㬀 
		   END਀ 
਀    ⴀⴀ  䤀昀 攀渀昀漀爀挀攀搀 爀攀琀攀渀琀椀漀渀 椀猀 琀甀爀渀攀搀 漀渀Ⰰ 挀栀攀挀欀 椀昀 琀栀攀 爀攀琀攀渀琀椀漀渀 搀愀琀攀 栀愀猀 瀀愀猀猀攀搀⸀ 
	  IF EXISTS (SELECT gsg.enforced_retention ਀ऀ               䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		          WHERE gsg.setting_group_name = 'Master'਀ऀऀऀऀ    䄀一䐀 最猀最⸀攀渀昀漀爀挀攀搀开爀攀琀攀渀琀椀漀渀 㴀 ✀伀渀✀⤀ 
		    AND (SELECT fm.retention_date਀ऀऀऀ       䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
				  WHERE fm.file_id = @id_to_delete) > SYSDATETIME()਀ऀऀ   䈀䔀䜀䤀一 
				  SET @data_validation_status = 'Fail';਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀椀氀攀刀攀琀攀渀琀椀漀渀䤀渀䘀漀爀挀攀✀Ⰰ  
					   @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileRetentionInForce.');਀ऀऀ   䔀一䐀 
਀ 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
       BEGIN TRANSACTION;਀  ⴀⴀ 匀攀氀攀挀琀 琀栀攀 匀䤀䐀 䤀䐀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	  SELECT @sidid = sl.sid_id਀ऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	   WHERE sl.sid = @connectedusersid;਀ 
	  --    Write an entry in the file delete log if it is enabled.਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最猀最⸀昀椀氀攀开搀攀氀攀琀攀开氀漀最  
	               FROM base.global_settings_groups AS gsg਀ऀऀ          圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
				    AND gsg.file_delete_log = 'On')਀ऀऀ   䈀䔀䜀䤀一 
				INSERT INTO base.file_delete_log (਀ऀऀऀऀऀ昀椀氀攀开椀搀Ⰰ 
					filename,਀ऀऀऀऀऀ挀爀攀愀琀攀搀开眀栀攀渀Ⰰ 
					created_by_username,਀ऀऀऀऀऀ挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀Ⰰ 
					deleted_by_sid_id਀ऀऀऀऀ⤀ 
				SELECT਀ऀऀऀऀऀ昀洀⸀昀椀氀攀开椀搀Ⰰ 
					fm.filename,਀ऀऀऀऀऀ昀洀⸀挀爀攀愀琀攀搀Ⰰ 
					fm.created_by_username,਀ऀऀऀऀऀ昀洀⸀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀Ⰰ 
					@sidid AS deleted_by_sid_id਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
				WHERE fm.file_id = @id_to_delete;਀ 
		   END਀ 
		   --  Related tables are deleted by CASCADE ਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开猀琀漀爀愀最攀  
		       WHERE file_id = @id_to_delete;਀ 
		 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 [editing].[usp_DEL_file_date_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Deletes a date field to file link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 愀 昀椀氀攀 搀愀琀攀 渀愀洀攀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_date_value]਀ 
     @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.਀ऀऀ䀀搀愀琀攀猀琀礀氀攀 椀渀琀                          㴀 ✀✀Ⰰ ⴀⴀ 䐀愀琀攀 猀琀礀氀攀 昀爀漀洀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@dateformat nchar(3)                    = 'dmy', ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 @filedatenameid = 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 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 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਀ऀऀऀ䔀一䐀 
਀ 
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT file_date_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 
			 				WHERE file_date_name_id = @filedatenameid਀ऀऀऀऀऀऀऀ            䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				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_doc_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 昀椀氀攀 琀漀 搀漀挀甀洀攀渀琀 氀椀渀欀 
਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
-- Input is the file id and document id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_doc_link] ਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@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 @temp_userauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  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 @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check that a document 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 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 (@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 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_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileIDAccess.');਀ऀऀऀऀऀ 䔀一䐀ऀऀऀ  
			 END਀   
		  -- Check that the record exists਀ऀऀ  䤀䘀 ⠀䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
			  AND NOT EXISTS (SELECT doc_id ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
							   WHERE doc_id = @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 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਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
		       WHERE doc_id = @documentid AND਀ऀऀऀ         昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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_funct_list_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_to_function_list_links਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 椀搀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_funct_list_link] ਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
     @functionlistid 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 ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 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 if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀 
		                   FROM people.file_to_function_list_links਀ऀऀऀऀऀ      圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					        AND function_list_id = @functionlistid਀ऀऀऀऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				   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 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_file_group_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 琀漀 甀渀氀椀渀欀 愀 昀椀氀攀 昀爀漀洀 愀 昀椀氀攀 最爀漀甀瀀⸀ 
-- Authenticates both controller and editor਀ 
-- Input is a file ID and a file group ID.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 琀漀 甀渀氀椀渀欀 愀 昀椀氀攀 昀爀漀洀 愀 昀椀氀攀 最爀漀甀瀀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nvarchar(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 @fileid must be provided and be valid and must match an existing record਀⨀ ⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
* - The file must be free from edit restrictions which exclude the current user.਀⨀ ⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀 眀栀椀挀栀 琀栀攀 昀椀氀攀 椀猀 琀漀 戀攀 氀椀渀欀攀搀 琀漀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_group_link] ਀ 
     @fileid 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 ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 -- 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 whether the user has edit permission. ਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@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 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 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM xref.file_group_links਀ऀऀ       圀䠀䔀刀䔀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀 
			         AND   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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_file_int_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Deletes a file to integer value link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 愀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开椀渀琀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @fileintnameid 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)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@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 @fileintnameid = 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 the file int name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file int 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਀ऀऀऀ䔀一䐀 
਀ 
 		  -- 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM file_attr.file_integer_values ਀ऀऀ  圀䠀䔀刀䔀              昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		        AND file_int_name_id = @fileintnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_multi_select_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_multi_select_links਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 ⴀ 愀琀琀爀椀戀甀琀攀 椀搀 ⴀ 昀椀氀攀 椀搀 琀爀椀瀀氀攀琀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_multi_select_link] ਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
     @filemslistid 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 @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 @fileid = NULL;਀ऀ 䤀䘀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 　 
		SET @filemslistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 䤀䐀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF (@fileid IS NULL OR @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 NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一   
	        -- 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.');਀ऀऀऀऀऀ䔀一䐀ऀऀ  
		  -- Check if the record does not exist਀ऀऀऀ  䤀䘀 ⠀䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
				  AND NOT EXISTS (SELECT file_ms_list_id ਀ऀऀऀऀऀऀऀऀ    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
							       WHERE file_ms_list_id     = @filemslistid਀ऀऀऀऀऀऀऀऀऀ     䄀一䐀 昀椀氀攀开椀搀         㴀 䀀昀椀氀攀椀搀 
									     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 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 file_attr.file_multi_select_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 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_people_list_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_to_people_list_links਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE	 PROCEDURE [editing].[usp_DEL_file_people_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;਀  䐀䔀䌀䰀䄀刀䔀  
	    @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 -- 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਀ऀऀऀऀ䔀一䐀 
਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀 
		                   FROM people.file_to_people_list_links਀ऀऀऀऀऀ      圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					        AND people_list_id = @peoplelistid਀ऀऀऀऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				   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 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਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开爀愀搀椀漀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 氀椀渀欀⸀ 
-- Authenticates both controller and editor਀ 
-- Input is a file id and radio button list id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开爀愀搀椀漀戀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @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਀ 
	    @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';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- 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 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 @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.');਀ऀऀऀ 䔀一䐀 
਀  
			--  Check if the record doesn't exist਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND NOT EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀऀऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
			 				    WHERE file_radiob_list_id = @file_radioblistid਀ऀऀऀऀऀऀऀऀ              䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					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_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਀ 
		  -- 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_radio_button_links ਀ऀ           圀䠀䔀刀䔀                 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
			         AND file_radiob_list_id = @file_radioblistid਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_real_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Deletes a file to real number field link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 愀 昀椀氀攀 爀攀愀氀 渀愀洀攀 椀搀⸀ 
-- Output is a 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 ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@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਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_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 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਀ऀऀऀ䔀一䐀 
਀ 
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			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਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀  
		  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 text name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_text_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  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 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਀ऀऀऀ䔀一䐀 
਀ 
 		  -- Check that the record 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 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_free_text_values ਀  ऀऀ       圀䠀䔀刀䔀                     昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		              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: 17-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Deletes a record in table file_to_com_obj_ms_list_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_cm_obj_ms_link]਀ 
     @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)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = 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 @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  file_id = @fileid਀ऀऀऀऀऀ           䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					           AND common_object_id      = @commonobjectid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @fileid), ' ', 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 delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM com_obj.file_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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_file_to_com_obj_rb_link]    Script Date: Tue 12-05-2026 5:43:19 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,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  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;਀ 
		  -- 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਀ऀऀऀऀ䔀一䐀 
		 -- 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਀ऀऀ  䔀一䐀 
਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 
					     WHERE  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_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_function_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_to_function_links਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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;਀  䐀䔀䌀䰀䄀刀䔀  
		@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 @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 if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀 
		                   FROM people.file_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 file_id = @fileid਀ऀऀऀऀ  䄀一䐀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
				  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_file_user_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Delete a record from file_user_links਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE	 PROCEDURE [editing].[usp_DEL_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;਀  䐀䔀䌀䰀䄀刀䔀  
	    @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 -- 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਀ऀऀऀऀ䔀一䐀 
਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀 
		                   FROM people.file_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 file_id = @fileid਀ऀऀऀऀ  䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀椀搀 
				  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਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开搀漀挀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes 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_DEL_tag_doc_link] ਀ 
     @tag_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',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@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 = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   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, ' | Tag ID: ', 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 NotExist.');਀ऀऀऀ 䔀一䐀 
਀ 
		-- 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 delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  BEGIN TRY਀ 
		DELETE tagging.tag_to_document_links਀ऀऀ 圀䠀䔀刀䔀    搀漀挀开椀搀 
			   = @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਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     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.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
   ਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开最爀漀甀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a tag to tag group link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_tag_group_link] ਀ 
     @tag_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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- 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';਀ऀऀऀ 䔀一䐀 
਀ऀऀऀ 䔀䰀匀䔀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 攀搀椀琀 琀栀攀 琀愀最 
				  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਀ऀऀऀऀ  䔀一䐀 
਀ऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 琀愀最 最爀漀甀瀀 䤀䐀⸀ 
	  ਀ऀ  ऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 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਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 吀愀最 最爀漀甀瀀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
				 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 = @tag_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), @tag_groupid), '  ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGrpPermission');		   ਀ऀऀऀऀऀऀऀ䔀一䐀 
					END਀  
 -- Check if the record exists਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
	    AND NOT EXISTS (SELECT tag_group_id ਀ऀऀ                  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 
					     WHERE    tag_id਀ऀऀऀऀऀ           㴀 䀀琀愀最开椀搀 
					       AND    tag_group_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 TRY਀ऀ     䐀䔀䰀䔀吀䔀 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀  
		  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   = '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_tree_branch]    Script Date: Tue 12-05-2026 5:43:19 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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@tag_tree_id 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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- 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 @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 EXISTS (SELECT tag_tree_hierarchyid਀                䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
               WHERE    tag_tree_node_id ਀ऀऀऀ         㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
                 AND tag_tree_hierarchyid = hierarchyid::GetRoot()਀                 䄀一䐀 琀愀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
                                      FROM tagging.tag_tree_nodes਀                                     圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀⤀  
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'IsRootNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				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 @userauthentication_status = 'Pass'਀ 
਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  BEGIN TRY਀     䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀  匀䔀吀 䀀琀愀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
                        FROM tagging.tag_tree_nodes਀ऀऀऀऀऀ   圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
					         = @tag_tree_node_id);਀ 
     -- Delete all descendant nodes਀     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
           WHERE    tag_tree_id ਀ऀऀ         㴀 䀀琀愀最开琀爀攀攀开椀搀 
             AND tag_tree_hierarchyid.IsDescendantOf(਀                 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
                    FROM tagging.tag_tree_nodes਀                   圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀⤀ 㴀 ㄀㬀 
਀ऀऀ ⴀⴀ䐀攀氀攀琀攀 琀栀攀 渀漀搀攀  
		DELETE FROM tagging.tag_tree_nodes਀ऀऀ      圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀  
		            = @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਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     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: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Delete a tag tree node.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_tag_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 ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',	਀        䀀渀漀搀攀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
        @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਀  匀䔀吀 䀀琀愀最开琀爀攀攀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
                       FROM tagging.tag_tree_nodes਀ऀऀऀऀऀ  圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
					        = @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 ਀  
 -- 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 EXISTS (SELECT tag_tree_hierarchyid਀                䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
               WHERE    tag_tree_node_id ਀ऀऀऀ         㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
                 AND tag_tree_hierarchyid = hierarchyid::GetRoot()਀                 䄀一䐀 琀愀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
                                      FROM tagging.tag_tree_nodes਀                                     圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀⤀  
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'IsRootNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				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 @userauthentication_status = 'Pass'਀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	 ਀ऀ 䈀䔀䜀䤀一 吀刀夀 
       BEGIN TRANSACTION;਀ऀऀ 匀䔀䰀䔀䌀吀 䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 㴀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䄀渀挀攀猀琀漀爀⠀㄀⤀ 
		   FROM tagging.tag_tree_nodes਀ऀऀ  圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀㬀 
਀ऀऀ 匀䔀䰀䔀䌀吀 䀀渀漀搀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
		   FROM tagging.tag_tree_nodes਀ऀऀ  圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀㬀 
਀ऀऀ ⴀⴀ䐀攀氀攀琀攀 琀栀攀 渀漀搀攀  
		DELETE FROM tagging.tag_tree_nodes਀ऀऀ      圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀  
		            = @tag_tree_node_id;	਀ 
 WITH RecursiveCTE AS (਀     ⴀⴀ 䄀渀挀栀漀爀 洀攀洀戀攀爀㨀 搀椀爀攀挀琀 挀栀椀氀搀爀攀渀 漀昀 琀栀攀 搀攀氀攀琀攀搀 渀漀搀攀 
     SELECT਀         琀愀最开琀爀攀攀开渀漀搀攀开椀搀Ⰰ 
         tag_tree_hierarchyid,਀         　 䄀匀 䰀攀瘀攀氀 
     FROM tagging.tag_tree_nodes਀     圀䠀䔀刀䔀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䄀渀挀攀猀琀漀爀⠀㄀⤀ 㴀 䀀渀漀搀攀开栀椀攀爀愀爀挀栀礀椀搀 
       AND tag_tree_id = @tag_treeid਀ 
     UNION ALL਀ 
     -- Recursive member: children of children਀     匀䔀䰀䔀䌀吀 
         t.tag_tree_node_id,਀         琀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
         r.Level + 1਀     䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 琀 
     INNER JOIN RecursiveCTE r ON t.tag_tree_hierarchyid.GetAncestor(1) = r.tag_tree_hierarchyid਀     圀䠀䔀刀䔀 琀⸀琀愀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀椀搀 
 ),਀ ⴀⴀ 䌀吀䔀 琀漀 漀爀搀攀爀 琀栀攀 渀漀搀攀猀 昀漀爀 甀瀀搀愀琀攀 
 OrderedNodes AS (਀     匀䔀䰀䔀䌀吀 
         tag_tree_node_id,਀         琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
         Level,਀         刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 䰀攀瘀攀氀⤀ 䄀匀 刀漀眀一甀洀 
     FROM RecursiveCTE਀ ⤀ 
 -- Update the nodes level by level਀ 唀倀䐀䄀吀䔀 琀 
 SET t.tag_tree_hierarchyid = @parent_hierarchyid.GetDescendant(਀     琀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀刀攀瀀愀爀攀渀琀攀搀嘀愀氀甀攀⠀䀀渀漀搀攀开栀椀攀爀愀爀挀栀礀椀搀Ⰰ 一唀䰀䰀⤀Ⰰ 
     NULL਀ ⤀ 
 FROM tagging.tag_tree_nodes t਀ 䤀一一䔀刀 䨀伀䤀一 伀爀搀攀爀攀搀一漀搀攀猀 漀 伀一 琀⸀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 漀⸀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
 OPTION (MAXRECURSION 0);਀ 
 --=================================਀ 
     COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
   ਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀昀开昀甀渀挀琀开漀甀琀瀀甀琀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from workflow_instances.workflow_function_output_files.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_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਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 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 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'਀   䈀䔀䜀䤀一 
	 IF NOT EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_function_output_files਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开椀搀 
		        = @fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =       @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.');਀ऀऀ䔀一䐀 
  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਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
		  WHERE    file_id਀ऀऀ        㴀 䀀昀椀氀攀椀搀ऀऀ   
		    AND workflow_instance_step_id ਀ऀऀ        㴀       䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND    function_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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes 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 ਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- 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 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਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 昀椀氀攀 椀搀 椀猀 瘀愀氀椀搀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
		 -- End checking the file id਀ 
਀ऀ  䤀䘀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 㴀 　 
		 SET @input_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @input_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 = @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 WfInstStepIdInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END		 ਀ 
	 -- Check if the record exists਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
	    (SELECT wsip.file_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 䄀匀 眀猀椀瀀 
		  WHERE wsip.file_id ਀ऀऀ        㴀   䀀昀椀氀攀椀搀 
		    AND wsip.workflow_input_step_id ਀ऀऀऀऀ㴀            䀀椀渀瀀甀琀开猀琀攀瀀开椀搀⤀ 
		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 insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 
		  WHERE    file_id ਀ऀऀ        㴀 䀀昀椀氀攀椀搀 
		    AND workflow_input_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਀  
਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀昀开瀀攀漀瀀氀攀开漀甀琀瀀甀琀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from workflow_instances.workflow_person_output_files.  The connected user can only delete their own records. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_wf_people_output_file] ਀ 
     @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਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  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਀ 
		  -- 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਀ऀऀ 䔀一䐀 
਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀爀猀漀渀 椀搀 
	 -- 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 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 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਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
		  WHERE    file_id਀ऀऀ        㴀 䀀昀椀氀攀椀搀ऀऀ   
		    AND workflow_instance_step_id ਀ऀऀ        㴀       䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND    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਀ 
	     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-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䈀漀漀欀猀 愀 搀漀挀甀洀攀渀琀 椀渀⸀ 
-- An editor can book in any document they have booked out and still਀ⴀⴀ 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 爀椀最栀琀猀⸀ 
-- A controller can book in any document for which they have edit permission rights਀ⴀⴀ 愀渀搀 眀栀椀挀栀 椀猀 挀甀爀爀攀渀琀氀礀 戀漀漀欀攀搀 漀甀琀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开戀漀漀欀开椀渀崀 
਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  ⴀⴀ 䴀愀渀搀愀琀漀爀礀 
	 @comments nvarchar(4000)         = '',  -- Optional਀ऀ 䀀爀攀氀攀愀猀攀开渀甀洀 渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 ✀✀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	 @fileid bigint                   = NULL,  -- Optional਀ऀ 䀀戀漀漀欀椀渀最开椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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.਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀               㴀 ✀一漀✀Ⰰ 
		@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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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  ਀   
  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)਀ 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 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 data 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਀ 
		  ਀ 
਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀ   ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 渀漀琀 戀漀漀欀攀搀 漀甀琀 
			IF NOT 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 DocNotBookedOut.');਀ऀऀऀऀ䔀一䐀 
		  END਀ 
		  ਀ 
	-- If the user is not a controller then check if the document was booked out by that user. ਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		   AND @iscontroller = 'No'਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT bl.booking_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀ऀऀऀऀऀऀऀ  
					   INNER JOIN base.booking_log AS bl਀ऀऀऀऀऀ           伀一  搀椀氀⸀戀漀漀欀椀渀最开椀搀 
							      = bl.booking_id਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
							      AND bl.user_id = @userid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䈀伀唀猀攀爀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotBOUser.');਀ऀऀऀऀ䔀一䐀 
		  END਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 
				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 @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_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, 'In',           @userid, ISNULL(@comments, ''), ISNULL(@release_num, ''))਀         
		SET @booking_id = SCOPE_IDENTITY();਀ 
		UPDATE base.document_id_list਀ऀऀ   匀䔀吀 戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀 
		 WHERE doc_id = @documentid;਀ 
		 IF @fileid IS NOT NULL਀ऀऀ  䈀䔀䜀䤀一 
		   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਀ऀऀ  䔀一䐀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ऀऀ䌀伀䴀䴀䤀吀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ऀ     刀伀䰀䰀䈀䄀䌀䬀㬀 
	     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: 16-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䰀椀渀欀猀 愀 昀椀氀攀 琀漀 愀 戀漀漀欀椀渀最 椀渀 爀攀挀漀爀搀⸀     
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_book_in_file]਀ 
	 @booking_id 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 ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@documentid nvarchar(50)                = '', -- The document id associated with the record to be deleted. ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@deadline DATETIME                      = NULL, -- Deadline for completing a book-in. ਀ऀऀ䀀琀椀洀攀戀漀砀 䤀一吀                            㴀 　Ⰰ  ⴀⴀ 一甀洀戀攀爀 漀昀 洀椀渀甀琀攀猀 昀漀爀 挀漀洀瀀氀攀琀椀渀最 愀 戀漀漀欀ⴀ椀渀⸀  
		@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਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 戀漀漀欀椀渀最 椀搀 攀砀椀猀琀猀⸀ 
਀ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 戀漀漀欀椀渀最 椀搀 椀猀 琀栀攀 洀漀猀琀 爀攀挀攀渀琀 戀漀漀欀椀渀最 爀攀挀漀爀搀 椀搀 昀漀爀 琀栀愀琀 甀猀攀爀 
-- for that document and is a booked-in record਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀ    匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
			                     FROM base.booking_log਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀⤀ 
			IF NOT EXISTS ਀ऀऀऀऀ⠀ 
				SELECT bl.booking_id਀ऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
				 WHERE bl.user_id = @userid਀ऀऀऀऀ   䄀一䐀 戀氀⸀戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀 
				   AND bl.booking_status = 'In'਀ऀऀऀऀ   䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ऀऀऀऀ ⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'InvalidBIRec', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䈀䤀刀攀挀⸀✀⤀㬀 
				END਀ऀऀ  䔀一䐀 
਀ 
		-- Check if the booking-in deadline has expired.਀ऀऀⴀⴀ 吀栀攀 戀漀漀欀椀渀最 搀攀愀搀氀椀渀攀 椀猀 琀栀攀 琀椀洀攀 眀栀攀渀 琀栀攀 搀漀挀甀洀攀渀琀 眀愀猀 戀漀漀欀攀搀 椀渀 瀀氀甀猀 琀栀攀 戀漀漀欀椀渀最 琀椀洀攀 戀漀砀 椀渀 洀椀渀甀琀攀猀⸀  
IF @data_validation_status = 'Pass'਀ऀ䈀䔀䜀䤀一 
		SELECT @timebox = gsg.booking_in_time_box਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master';਀ 
		SET @deadline = DATEADD(MINUTE, @timebox, ਀ऀऀऀऀ⠀ 
				SELECT bl.booking_date਀ऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
				 WHERE bl.user_id = @userid਀ऀऀऀऀ   䄀一䐀 戀氀⸀戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀 
				   AND bl.booking_status = 'In'਀ऀऀऀऀ   䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ऀऀऀऀ ⤀⤀㬀 
਀ऀऀ䤀䘀 䀀搀攀愀搀氀椀渀攀 㰀 䜀䔀吀䐀䄀吀䔀⠀⤀ 
				BEGIN -- Deadline has expired਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'BkgTimeBoxExp', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䈀欀最吀椀洀攀䈀漀砀䔀砀瀀⸀✀⤀㬀 
				END਀     䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid = 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 edit permission for the file਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
  IF EXISTS (SELECT booking_id਀               䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀攀搀开椀渀开昀椀氀攀猀 
			  WHERE booking_id = @booking_id਀ऀऀऀ    䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
			 BEGIN -- A record 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 TRANSACTION਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ   䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀戀漀漀欀攀搀开椀渀开昀椀氀攀猀 
		               (booking_id, file_id)਀ऀऀऀऀ嘀䄀䰀唀䔀匀 ⠀䀀戀漀漀欀椀渀最开椀搀Ⰰ 䀀昀椀氀攀椀搀⤀ 
  ਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				SELECT file_id ਀ऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀  
				 WHERE doc_id = @documentid ਀ऀऀऀऀ   䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
			           )਀ऀऀऀऀ䈀䔀䜀䤀一 
					INSERT INTO xref.file_to_document_links ਀ऀऀऀऀऀ            ⠀搀漀挀开椀搀Ⰰ 昀椀氀攀开椀搀⤀ 
					     VALUES (@documentid, @fileid);਀ऀऀऀऀ䔀一䐀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ऀऀ䌀伀䴀䴀䤀吀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ऀ     刀伀䰀䰀䈀䄀䌀䬀㬀 
	     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: 16-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䈀漀漀欀猀 愀 搀漀挀甀洀攀渀琀 漀甀琀⸀ 
-- An editor or controller can book out any document which they have edit permission for and which਀ⴀⴀ 栀愀猀 渀漀琀 愀氀爀攀愀搀礀 戀攀攀渀 戀漀漀欀攀搀 漀甀琀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开戀漀漀欀开漀甀琀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @comments nvarchar(4000)         = '',਀ऀ 䀀戀漀漀欀椀渀最开椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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)਀ 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 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 data 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 document is aready booked out਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 戀氀⸀戀漀漀欀椀渀最开椀搀 
							 FROM base.document_id_list AS dil							 ਀ऀऀऀऀऀ   䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
					           ON  dil.booking_id਀ऀऀऀऀऀऀऀ      㴀 戀氀⸀戀漀漀欀椀渀最开椀搀 
			 				WHERE dil.doc_id = @documentid਀ऀऀऀऀऀऀऀ      䄀一䐀 戀氀⸀戀漀漀欀椀渀最开猀琀愀琀甀猀 㴀 ✀伀甀琀✀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocBookedOut', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					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਀ऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ऀऀ䌀伀䴀䴀䤀吀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ऀ     刀伀䰀䰀䈀䄀䌀䬀㬀 
	     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-08-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਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_date_value]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @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 ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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਀ऀऀऀ 匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @datevalue = ''਀ऀऀऀ 匀䔀吀 䀀搀愀琀攀瘀愀氀甀攀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  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 date name field id਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 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 a duplicate record already exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
							 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 RecordExists.');਀ऀऀऀऀ䔀一䐀 
           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_date_name_id, date_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_doc_funct_list_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
-- which links a duty function to a document.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开昀甀渀挀琀开氀椀猀琀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀  渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 一唀䰀䰀Ⰰ 
     @functionlistid 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 IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_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 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.doc_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਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO people.doc_to_function_list_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ  昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀Ⰰ     最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀⤀ 
		      VALUES (@documentid, @functionlistid, @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_doc_function_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
-- which links a duty function to a document.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 昀甀渀挀琀椀漀渀 椀搀 愀渀搀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀⸀ 
-- 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.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@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 function list 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 NoFunctionListID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A function list id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			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 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.doc_to_function_links਀ऀऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					        AND function_id = @functionid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
		  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਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO people.doc_to_function_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ  昀甀渀挀琀椀漀渀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀⤀ 
		      VALUES (@documentid, @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਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开最爀漀甀瀀开氀椀渀欀开爀攀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 搀漀挀甀洀攀渀琀 琀漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Only permits a document group and document which the user has rights to.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
-- 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.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 @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(10), @docgroupid), 'NULL'), '  ', @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupPermission.');਀ऀऀ䔀一䐀 
਀ 
		  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.');਀ऀऀऀ 䔀一䐀 
਀ 
		   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.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.doc_group_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ      搀漀挀开最爀漀甀瀀开椀搀Ⰰ  渀漀琀攀猀⤀ 
		      VALUES (@documentid, @docgroupid,   @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 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_INS_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 data 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 integer name field id਀ऀऀ  䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 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਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF EXISTS (SELECT doc_int_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 
			 				WHERE doc_int_name_id = @docintnameid਀ऀऀऀऀऀऀऀ           䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				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_integer_values ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ      搀漀挀开椀渀琀开渀愀洀攀开椀搀Ⰰ  椀渀琀开瘀愀氀甀攀⤀ 
		      VALUES (@documentid, @docintnameid,    @integervalue)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 [editing].[usp_INS_doc_multi_select_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description: Inserts a document to multi-select attribute link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 愀渀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docmslistid 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 @docmslistid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docmsattrid = 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 multi-select list਀ऀऀ  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 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. ਀ऀऀ  䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 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 ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    搀漀挀开洀猀开愀琀琀爀开椀搀  
								       = @docmsattrid਀ऀऀऀऀऀऀऀऀ   䄀一䐀    搀漀挀开洀猀开氀椀猀琀开椀搀  
								       = @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 InvalidListItem.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
		  -- Check if a duplicate record already exists਀ऀऀ  ⴀⴀ 䴀甀氀琀椀瀀氀攀 愀琀琀爀椀戀甀琀攀猀 昀爀漀洀 琀栀攀 猀愀洀攀 氀椀猀琀 愀爀攀 瀀攀爀洀椀琀琀攀搀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀攀礀 愀爀攀 渀漀琀 搀甀瀀氀椀挀愀琀攀搀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
							 FROM doc_attr.doc_multi_select_links਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀     搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
							      AND doc_ms_attr_id = @docmsattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀         搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				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_ms_list_id, 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   = '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_people_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 搀漀挀甀洀攀渀琀⸀ 
-- Input is a document id and a people list id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_people_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਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		     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 @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.doc_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਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO people.doc_to_people_list_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ  瀀攀漀瀀氀攀开氀椀猀琀开椀搀Ⰰ     最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀⤀ 
		      VALUES (@documentid, @peoplelistid, @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: 07-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 搀漀挀甀洀攀渀琀 琀漀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 氀椀渀欀⸀ 
-- Input is a document id, radio button list id and radio button attribute id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- If the user is has only Editor rights then access is restricted to only document ids਀ⴀⴀ 昀漀爀 眀栀椀挀栀 琀栀攀礀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_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਀ 
	    @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',਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀               㴀 ✀一漀✀Ⰰ 
		@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 @temp_userauth_status = 'Pass'   ਀    䈀䔀䜀䤀一 
       SET @userauthentication_status = 'Pass';਀ऀ   匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀㬀 
	END਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@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 @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docradioblistid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docradiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   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਀ 
		   IF @data_validation_status = 'Pass'  -- doc id and radio button list id have 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 NOT EXISTS (SELECT doc_radiob_list_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
			  	 				 WHERE doc_radiob_list_id = @docradioblistid) -- 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.');਀ऀऀऀऀऀ䔀一䐀 
਀ ऀऀऀ 䔀一䐀 
 ਀ऀऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 氀椀猀琀 椀搀 椀猀 瘀愀氀椀搀⸀  䌀栀攀挀欀 椀昀 椀琀 栀愀猀 戀攀攀渀 氀椀渀欀攀搀 琀漀 琀栀愀琀 搀漀挀甀洀攀渀琀 愀氀爀攀愀搀礀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
							 FROM doc_attr.doc_radio_button_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 AttrExist.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 氀椀猀琀 椀搀 椀猀 爀攀猀琀爀椀挀琀攀搀 愀渀搀 椀昀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀⸀ 
			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਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀   
		  -- 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 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 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_radiob_list_id, doc_radiob_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਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开爀攀愀氀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 爀攀愀氀 瘀愀氀甀攀 昀漀爀 愀 搀漀挀甀洀攀渀琀⸀ 
-- Input is a document id, document real name id and a real number.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_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 number name field id਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 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਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF EXISTS (SELECT doc_real_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 
			 				WHERE doc_real_name_id = @docrealnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				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_real_number_values ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ      搀漀挀开爀攀愀氀开渀愀洀攀开椀搀Ⰰ  爀攀愀氀开瘀愀氀甀攀⤀ 
		      VALUES (@documentid, @docrealnameid,    @realnumbervalue)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_tag]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开琀愀最崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @tagname nvarchar(50)            = NULL, ਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @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 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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀     ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀⸀⸀⸀ 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀琀愀最渀愀洀攀 㴀 ✀✀ 
		   SET @tagname = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT tag_name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀  
					WHERE tag_name = @tagname) ਀ऀऀऀ䈀䔀䜀䤀一 
				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);਀ऀऀऀ䔀一䐀 
਀ 
	 -- Check the tag group.਀  ऀ 䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 　  
	   SET @tag_groupid = NULL;਀ 
	 IF @tag_groupid IS NOT NULL਀ऀ   䈀䔀䜀䤀一 
   -- Check that the tag group 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_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀ䔀一䐀 
							਀   ⴀⴀ 䌀栀攀挀欀 甀猀攀爀 爀椀最栀琀猀 琀漀 琀栀攀 琀愀最 最爀漀甀瀀 
            IF @data_validation_status = 'Pass'਀ऀऀऀ   䈀䔀䜀䤀一 
			     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਀ऀऀऀ   䔀一䐀 
਀ 
	   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 TRY਀ 
	  BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀  
		             (mnem,                   tag_name,        descr )਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 䀀琀愀最渀愀洀攀Ⰰ 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ ⤀㬀  
਀ऀऀ 匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
਀ऀऀ 䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		   BEGIN਀ऀऀ    䤀一匀䔀刀吀 䤀一吀伀 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 
			            (tag_id,        tag_group_id)਀ऀऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀渀攀眀爀攀挀漀爀搀椀搀Ⰰ 䀀琀愀最开最爀漀甀瀀椀搀⤀㬀 
		   END਀ 
         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.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_text_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description: Inserts 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 users for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@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 @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 permision 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 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਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the text value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF EXISTS (SELECT doc_free_text_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 
			 				WHERE doc_free_text_name_id = @doctextnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				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_free_text_values ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ      搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀Ⰰ 琀攀砀琀开瘀愀氀甀攀⤀ 
		      VALUES (@documentid, @doctextnameid,        @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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_to_com_obj_ms_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 
-- which links a common object to a document 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_doc_to_com_obj_ms_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਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					        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 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_WS(' | ', 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਀ 
਀ 
	  -- 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,       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 @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_to_com_obj_rb_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 
-- which links a common object to a document 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.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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_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਀ 
਀ 
	  -- 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਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO com_obj.doc_to_com_obj_radiob_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ       挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀⤀ 
		      VALUES (@documentid, @commonobjlistid,      @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   = '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_user_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀 
-- which links a user to a document.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀 猀椀搀开椀搀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开甀猀攀爀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀  渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 一唀䰀䰀Ⰰ 
     @sidid 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 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 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.doc_to_user_links਀ऀऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					        AND sid_id = @sidid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
		  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਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO people.doc_to_user_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ  猀椀搀开椀搀Ⰰ     最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀⤀ 
		      VALUES (@documentid, @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: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a cross-reference 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,਀     䀀砀爀攀昀开琀礀瀀攀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @input_notes nvarchar(max)		  = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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',਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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 @source_docid = ''਀ऀऀ     匀䔀吀 䀀猀漀甀爀挀攀开搀漀挀椀搀 㴀 一唀䰀䰀㬀 
		  IF @source_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 =  @source_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(@source_docid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check the cross-reference document id਀ऀऀ  䤀䘀 䀀砀爀攀昀开搀漀挀椀搀 㴀 ✀✀ 
		     SET @xref_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_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  ਀ 
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT xref_type_id਀ऀऀ               䘀刀伀䴀 砀爀攀昀⸀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀 
					  WHERE source_doc_id = @source_docid਀ऀऀऀऀऀ        䄀一䐀 砀爀攀昀开搀漀挀开椀搀 㴀 䀀砀爀攀昀开搀漀挀椀搀⤀ 
		  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਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @source_docid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @source_docid);਀        匀䔀吀 䀀砀爀攀昀开搀漀挀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀砀爀攀昀开搀漀挀椀搀⤀㬀 
਀ 
	     INSERT INTO xref.doc_cross_references ਀ऀऀ             ⠀ 猀漀甀爀挀攀开搀漀挀开椀搀Ⰰ 砀爀攀昀开搀漀挀开椀搀Ⰰ 砀爀攀昀开琀礀瀀攀开椀搀Ⰰ       渀漀琀攀猀⤀ 
		      VALUES (@source_docid, @xref_docid, @xref_typeid, @input_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_document_id_restr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㠀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Creates a new document ID record.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 ⠀漀瀀琀椀漀渀愀氀⤀Ⰰ 
-- a document group name and an ID lock status.਀ⴀⴀ 吀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 椀猀 洀愀渀搀愀琀漀爀礀 愀渀搀 洀甀猀琀 戀攀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 眀栀椀挀栀  
-- the user already has edit permission for.  This allows the user to਀ⴀⴀ 琀栀攀渀 愀搀搀 洀攀琀愀搀愀琀愀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀⸀   
-- Output is status messages.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀甀洀攀渀琀开椀搀开爀攀猀琀爀崀  
	਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ ⴀⴀ 伀瀀琀椀漀渀愀氀 椀昀 愀甀琀漀ⴀ最攀渀攀爀愀琀椀漀渀 椀猀 漀渀 
	 @docgroupid bigint               = NULL, -- Mandatory਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	 @idlockstatus nvarchar(10)       = 'Unlocked',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status 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਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@sidid bigint                        = NULL,  ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @toolong50message nvarchar(200)      = '', -- Communicates that a string was longer than 50 characters and may have been truncated਀ऀऀ䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@docgroupinvalidmsg nvarchar(200)    = '', -- Communicates that the document group does not exist or the user does not have rights to it਀ऀऀ䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 眀愀猀 渀漀琀 甀渀椀焀甀攀 
		@tg_invalidmessage nvarchar(200)     = '', -- Communicates that the transaction group id does not exist਀ऀऀ䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 椀渀琀ऀ             㴀 一唀䰀䰀Ⰰ ⴀⴀ 䴀愀砀椀洀甀洀 渀甀洀戀攀爀 漀昀 愀琀琀攀洀瀀琀猀 琀漀 愀甀琀漀最攀渀攀爀愀琀攀 愀 搀漀挀甀洀攀渀琀 䤀䐀 
		@transaction_ready nchar(10)         = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀椀搀氀漀挀欀猀琀愀琀甀猀 㴀 ✀唀渀氀漀挀欀攀搀✀㬀 
਀ 
਀匀䔀吀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开愀甀琀漀最攀渀开洀愀砀开琀爀椀攀猀  
                           FROM base.global_settings_groups);਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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 @nopermissionmessage = ISNULL(@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.਀    䈀䔀䜀䤀一 
਀  ⴀⴀ 匀攀氀攀挀琀 琀栀攀 匀䤀䐀 䤀䐀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	  SELECT @sidid = sl.sid_id਀ऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	   WHERE sl.sid = @connectedusersid;਀ 
	IF @docgroupid IS NULL਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			SET @nodocgroupmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
			SET @nodocgroupmessage = 'A database level message error occurred on NoDocGroupId';਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
		ELSE਀ 
	 -- Authenticate the user edit permission for the given document group਀ऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		EXEC [internal].[usp_AUTHENTICATE_doc_grp_ed_pm] ਀ऀऀऀ 䀀搀漀挀开最爀瀀开琀漀开挀栀攀挀欀开攀瀀 㴀 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 
			 @user_authentication_reslt_dgep = @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਀ 
		  -- Data validation਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 一唀䰀䰀 
		  IF @documentid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一 
				IF (SELECT use_auto_gen_doc_id_on_null਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⤀ 㴀 ✀一漀✀ 
					BEGIN਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id = 'NoData', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @nodatamessage = @tempmessage;਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
							  SET @nodatamessage = 'A database level message error occurred on NoData.';਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀一䐀 
				ELSE -- The document ID is NULL and the auto generate option is not 'No'਀ऀऀऀऀ   䈀䔀䜀䤀一 ⴀⴀ 䄀甀琀漀 最攀渀攀爀愀琀攀 愀 搀漀挀甀洀攀渀琀 䤀䐀 
						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਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 搀漀挀甀洀攀渀琀 䤀䐀 猀甀瀀瀀氀椀攀搀⸀ 
			BEGIN   -- Check that the document ID is unique.਀ऀऀऀ   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀  
   								FROM base.document_id_list ਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀  
				  BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						 @message_id   = 'DocNotUnique', ਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ   匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 㘀⤀ ⬀ ✀⸀⸀⸀✀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀一漀琀唀渀椀焀甀攀⸀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  END -- End checking the uniqueness of the document ID਀ 
			 -- Check if the document ID might have been automatically truncated਀ऀऀऀ 䤀䘀 ⠀䰀䔀一⠀䀀搀漀挀甀洀攀渀琀椀搀⤀ 㸀㴀 㔀　⤀ 
				BEGIN਀ऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					   @message_id   = 'TooLong50', ਀ऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				  IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ 匀䔀吀 䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 㠀⤀ ⬀ ✀⸀⸀⸀✀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				  ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀漀漀䰀漀渀最㔀　⸀✀㬀 
					 -- Don't fail the transaction.  The string is just truncated. ਀ऀऀऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 
		  END -- End of else for no document is supplied਀ 
			 -- Check that the transaction group exists਀ 
			 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 = @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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     BEGIN TRANSACTION;਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀  
			             (doc_id,       transaction_group_id, lock_status, created_by_sid_id)਀ऀऀऀऀ  嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀Ⰰ     䀀椀搀氀漀挀欀猀琀愀琀甀猀Ⰰ 䀀猀椀搀椀搀⤀㬀  
			 INSERT INTO xref.doc_group_links ਀ऀऀऀऀऀऀ ⠀搀漀挀开椀搀Ⰰ      搀漀挀开最爀漀甀瀀开椀搀⤀ 
				  VALUES (@documentid, @docgroupid)਀ऀऀ 䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
			 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਀ 
  IF @transaction_status = 'Good'਀     匀䔀吀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
  ELSE SET @newdocumentid = '';਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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 (@nodocgroupmessage <> '')          SET @message = @message + ' | ' + @nodocgroupmessage;਀ऀ䤀䘀 ⠀䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开戀椀渀愀爀礀开椀渀瀀甀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-06-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
/*਀ऀ䤀渀猀攀爀琀猀 昀椀氀攀猀 椀渀琀漀 琀栀攀 昀椀氀攀猀琀爀攀愀洀 挀漀渀琀愀椀渀攀爀 
	Input is a binary file, filename of the record to be ਀ऀ猀愀瘀攀搀Ⰰ 愀渀 漀瀀琀椀漀渀愀氀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀Ⰰ 愀渀 漀瀀琀椀漀渀愀氀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 
	an optional document id autogenerate flag, an optional thumbnail and an optional full text content string.਀ऀ吀栀攀 愀甀琀漀最攀渀攀爀愀琀攀 昀氀愀最 椀渀猀琀爀甀挀琀猀 琀栀攀 挀漀搀攀 琀漀 愀甀琀漀洀愀琀椀挀愀氀氀礀 最攀渀攀爀愀琀攀 
	a document id if none was supplied. @docidautogen must be 'YES' ਀ऀ琀漀 椀渀椀琀椀愀琀攀 愀甀琀漀最攀渀攀爀愀琀椀漀渀 漀昀 愀 搀漀挀甀洀攀渀琀 䤀䐀⸀  
	The filename does not have to be the same as the filename ਀ऀ漀昀 琀栀攀 爀攀挀漀爀搀 琀漀 戀攀 猀愀瘀攀搀Ⰰ 戀甀琀 椀琀 洀甀猀琀 戀攀 愀 瘀愀氀椀搀 昀椀氀攀渀愀洀攀⸀ 䘀椀氀攀渀愀洀攀 椀猀 漀瀀琀椀漀渀愀氀⸀  
	The transaction id is retrieved by the application ਀ऀ昀爀漀洀 愀 搀椀昀昀攀爀攀渀琀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀 愀渀搀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀椀猀 漀渀攀⸀ 
	For example, a group of files being added at the same time਀ऀ挀愀渀 戀攀 最爀漀甀瀀攀搀 戀礀 琀栀攀 猀愀洀攀 琀爀愀渀猀愀挀琀椀漀渀 椀搀⸀  
	The optional document id allows a file to be immediately restricted਀ऀ瘀椀愀 搀漀挀甀洀攀渀琀 瘀椀攀眀 最爀漀甀瀀 瀀攀爀洀椀猀猀椀漀渀猀⸀  
	Output is a status message, a transaction status and਀ऀ琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开戀椀渀愀爀礀开椀渀瀀甀琀崀  
	-- Add the parameters for the stored procedure here਀ 
	@file_content_bin varbinary(max) = NULL,  -- Mandatory਀ऀ䀀猀琀漀爀攀搀开昀椀氀攀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㈀㔀㔀⤀   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	@full_text_content nvarchar(max) = NULL,  -- Optional਀ऀ䀀琀栀甀洀戀渀愀椀氀 瘀愀爀戀椀渀愀爀礀⠀洀愀砀⤀        㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	@transactiongroup bigint         = NULL,  -- Optional਀ऀ䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	@docidautogen nvarchar(5)        = NULL,  -- Optional.  Automatically generates a document ID if none supplied.਀ऀ䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	@docgroupid bigint               = NULL,  -- Optional਀ऀ䀀搀甀瀀氀椀挀愀琀攀开挀栀攀挀欀 渀瘀愀爀挀栀愀爀⠀㌀⤀     㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀⸀  䌀栀攀挀欀猀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 昀椀氀攀 攀砀椀猀琀猀⸀ 
	@retention_months  int           = NULL,  -- Optional.  Number of months of retention.  ਀ऀ䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	@transaction_status nvarchar(50) = NULL OUTPUT,਀    䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	@newdocumentid nvarchar(50)      = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
	DECLARE਀ऀऀ䀀昀椀氀攀开栀愀猀栀 瘀愀爀戀椀渀愀爀礀⠀䴀䄀堀⤀Ⰰ 
	    @temptransmessage nvarchar(300)          = '', ਀ऀऀ䀀昀椀氀攀渀愀洀攀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀Ⰰ         
		@tempmessage nvarchar(300)               = '',਀ऀऀ䀀猀愀渀椀琀椀猀攀搀开琀攀砀琀 一嘀䄀刀䌀䠀䄀刀⠀䴀䄀堀⤀            㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)           = '',  -- Temporary value for authentication sp.਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀         㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                  = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀猀椀搀椀搀 戀椀最椀渀琀                            㴀 一唀䰀䰀Ⰰ   
		@retention_date datetime2(7)             = NULL,਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@docauthenticationstatus nchar(10)       = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@maxiterationcount int	                 = NULL, -- Maximum number of attempts to autogenerate a document ID਀ऀऀ䀀洀愀琀挀栀开挀漀甀渀琀 椀渀琀                         㴀 一唀䰀䰀Ⰰ ⴀⴀ 䌀漀甀渀琀 漀昀 琀栀攀 渀甀洀戀攀爀 漀昀 搀甀瀀氀椀挀愀琀攀 昀椀氀攀猀⸀  
	    @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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀匀䔀吀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开愀甀琀漀最攀渀开洀愀砀开琀爀椀攀猀  
                           FROM base.global_settings_groups AS gsg਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an editor਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Reviewer',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  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.਀    䈀䔀䜀䤀一 
਀ 
  -- Select the SID ID for the connected user਀ऀ  匀䔀䰀䔀䌀吀 䀀猀椀搀椀搀 㴀 猀氀⸀猀椀搀开椀搀 
		FROM user_restr.sid_list AS sl਀ऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀㬀 
਀ 
਀ 
		-- Data validation਀ 
		-- 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਀ऀऀⴀⴀ 䔀渀搀 昀椀氀攀渀愀洀攀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀⴀⴀ 匀琀漀爀攀搀 昀椀氀攀渀愀洀攀 氀攀渀最琀栀 洀甀猀琀 戀攀 氀攀猀猀 琀栀愀渀 ㈀㔀㔀 
		IF LEN(@stored_filename) > 254਀ऀऀ  䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀椀氀攀渀愀洀攀吀漀漀䰀漀渀最✀Ⰰ  
				 @message_text =  @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀ 
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀 
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FilenameTooLong.');਀ऀऀ  䔀一䐀 
		-- End filename length validation਀ 
		-- Check that the transaction group exists.  NULL is allowed.਀ऀऀ  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一伀吀 一唀䰀䰀 
			BEGIN਀ऀऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀  
								FROM base.transaction_groups ਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀  
				  BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id = 'TGNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL)਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				  END਀ऀऀऀ  䔀一䐀 
		-- End checking transaction group reference਀ 
਀ 
	-- If thumbnail storage is on then theck the thumbnail਀ऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最猀最⸀猀琀漀爀攀开琀栀甀洀戀渀愀椀氀猀 
	             FROM base.global_settings_groups AS gsg਀ऀऀऀऀ圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
				  AND gsg.store_thumbnails = 'On')਀      䈀䔀䜀䤀一 
		-- Thumbnail must be smaller than 1MB਀ऀऀ䤀䘀 䐀䄀吀䄀䰀䔀一䜀吀䠀⠀䀀琀栀甀洀戀渀愀椀氀⤀ 㸀 ㄀　㐀㠀㔀㜀㘀 
		  BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				 @message_id   = 'ThumbnailTooBig', ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL)਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀栀甀洀戀渀愀椀氀吀漀漀䈀椀最⸀✀⤀㬀 
		  END਀ऀ   䔀一䐀 
	 ELSE SET @thumbnail = NULL;  -- If full thumbnail is off then delete any thumbnail supplied.਀ 
਀ 
		-- End thumbnail size validation਀ 
਀ऀऀⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  匀䔀吀 䀀搀漀挀椀搀愀甀琀漀最攀渀 㴀 唀倀倀䔀刀⠀䀀搀漀挀椀搀愀甀琀漀最攀渀⤀㬀 
਀          䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		     BEGIN਀ऀऀऀ   䤀䘀 䀀搀漀挀椀搀愀甀琀漀最攀渀 㴀 ✀夀䔀匀✀ 
				   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 @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on MaxDocTries.');਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀一䐀 
				       SET @newdocumentid = @documentid;਀ऀऀऀऀ   䔀一䐀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 匀甀瀀瀀氀椀攀搀 䀀搀漀挀甀洀攀渀琀椀搀 椀猀 渀漀琀 一唀䰀䰀 
		      BEGIN਀                   ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
				   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਀ऀऀऀऀ䔀一䐀 
		-- End document id validation਀ 
਀ऀऀ⼀⨀ 
		 Using OPENROWSET(BULK... is an unsuitable approach in this context਀ऀऀ 戀攀挀愀甀猀攀 椀琀 爀攀焀甀椀爀攀猀 䈀唀䰀䬀 䄀䐀䴀䤀一 瀀爀椀瘀椀氀攀最攀猀Ⰰ 眀栀椀挀栀 椀渀琀爀漀搀甀挀攀猀 
		 security issues.  Hence the approach used is that the application਀ऀऀ 洀甀猀琀 漀瀀攀渀 琀栀攀 昀椀氀攀 愀渀搀 瀀氀愀挀攀 椀琀 椀渀琀漀 愀渀 漀戀樀攀挀琀 眀栀椀挀栀 椀猀 瀀愀猀猀攀搀 
		 to the stored procedure.਀ऀऀ⨀⼀ 
਀ऀऀ ⴀⴀ 䘀椀氀攀 氀攀渀最琀栀 瘀愀氀椀搀愀琀椀漀渀 
		 -- varbinary(max) as a maximum storage of 2 GB" Test at one less than maximum. ਀ऀऀ  䤀䘀 䐀䄀吀䄀䰀䔀一䜀吀䠀⠀䀀昀椀氀攀开挀漀渀琀攀渀琀开戀椀渀⤀ 㸀 ㈀㄀㐀㜀㐀㠀㌀㘀㐀㜀 
			BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀   
  			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'FileTooLarge', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			   IF @tempmessage IS NOT NULL਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀吀漀漀䰀愀爀最攀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 昀椀氀攀 氀攀渀最琀栀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䐀漀渀✀琀 氀漀愀搀 攀洀瀀琀礀 漀爀 渀甀氀氀 昀椀氀攀猀⸀   
		  IF (DATALENGTH(@file_content_bin) = 0) OR (@file_content_bin IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';  ਀  ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀椀氀攀匀甀瀀瀀氀椀攀搀✀Ⰰ  
					@message_text =  @tempmessage OUTPUT;਀ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀 
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀 
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileSupplied.');਀ऀऀऀ䔀一䐀 
		  -- End empty file validation਀ 
਀ 
਀ऀ 
਀         ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 最爀漀甀瀀 椀搀 
	     IF @filegroupid = 0਀ऀऀ    匀䔀吀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀  ⴀⴀ 䄀 昀椀氀攀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 琀栀愀琀 昀椀氀攀 最爀漀甀瀀 椀搀 攀砀椀猀琀猀 
		   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.਀ऀ 
	-- Check document group id਀ऀऀ䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 
		SET @docgroupid = NULL;਀ 
		IF @docgroupid IS NOT NULL਀ऀऀ䈀䔀䜀䤀一 
		 -- 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਀ऀऀ ⴀⴀ 䤀昀 愀 搀漀挀 最爀漀甀瀀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀漀挀甀洀攀渀琀 䤀䐀 洀甀猀琀 愀氀猀漀 戀攀 猀甀瀀瀀氀椀攀搀⸀  
				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 NoDocForGroup.');਀ऀऀ䔀一䐀 ⴀⴀ 䔀一䐀 椀昀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
਀ 
਀ऀऀⴀⴀ 䐀攀琀攀爀洀椀渀攀 椀昀 搀甀瀀氀椀挀愀琀攀 挀栀攀挀欀 椀猀 爀攀焀甀椀爀攀搀 
਀ऀऀⴀⴀ 䌀愀爀爀礀 漀甀琀 搀甀瀀氀椀挀愀琀攀 挀栀攀挀欀⸀ 
		IF @duplicate_check IS NULL OR @duplicate_check = ''਀ऀऀ   䈀䔀䜀䤀一 
		     SET @duplicate_check = (SELECT duplicate_management਀ऀऀऀ                           䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
									  WHERE setting_group_name = 'Master')਀ऀऀ   䔀一䐀 
		IF UPPER(@duplicate_check) = 'ON'਀ऀऀ   䈀䔀䜀䤀一 
		     SET @file_hash = HASHBYTES('SHA2_256', @file_content_bin);਀ऀऀऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 昀椀氀攀 攀砀椀猀琀猀⸀ 
			-- Count the number of matches of duplicate files਀ऀऀऀ  匀䔀䰀䔀䌀吀 䀀洀愀琀挀栀开挀漀甀渀琀 㴀 䌀伀唀一吀⠀⨀⤀ 
                FROM base.file_metadata਀               圀䠀䔀刀䔀 挀漀渀琀攀渀琀开栀愀猀栀 㴀 䀀昀椀氀攀开栀愀猀栀㬀 
			-- Fail if there is more than one match.਀ऀऀऀ䤀䘀 ⠀䀀洀愀琀挀栀开挀漀甀渀琀 㸀 ㄀ 䄀一䐀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一伀吀 一唀䰀䰀⤀ ⴀⴀ 䴀攀猀猀愀最攀 洀攀渀琀椀漀渀猀 甀渀愀戀氀攀 琀漀 氀椀渀欀 琀漀 搀漀挀 椀搀⸀ 
				  BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'MultiDuplFiles', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䴀甀氀琀椀䐀甀瀀氀䘀椀氀攀猀⸀✀⤀㬀 
				  END਀            ⴀⴀ 䘀愀椀氀 椀昀 琀栀攀爀攀 椀猀 洀漀爀攀 琀栀愀渀 　 洀愀琀挀栀攀猀 愀渀搀 愀 搀漀挀甀洀攀渀琀 䤀䐀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  
			IF (@match_count > 0 AND @documentid IS NULL) -- Message does not mention 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 DuplicateFile.');਀ऀऀऀऀ  䔀一䐀 
		   ਀ऀऀऀⴀⴀ 䤀昀 琀栀攀爀攀 椀猀 攀砀愀挀琀氀礀 漀渀攀 洀愀琀挀栀 䄀一䐀 愀 搀漀挀甀洀攀渀琀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 攀砀琀爀愀挀琀 琀栀攀 昀椀氀攀开椀搀 琀漀 䀀昀椀氀攀椀搀⸀ 
		   IF (@match_count = 1 AND @documentid IS NOT NULL)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					  SELECT @fileid = file_id਀ऀऀऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 
					   WHERE content_hash = @file_hash;਀ 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀甀瀀氀椀挀愀琀攀䘀椀氀攀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DuplicateFile.');਀ 
				   END਀ऀऀ  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 唀倀倀䔀刀⠀䀀搀甀瀀氀椀挀愀琀攀开挀栀攀挀欀⤀ 㴀 ✀伀一✀ 
	਀ऀⴀⴀ 䤀昀 昀甀氀氀 琀攀砀琀 猀琀漀爀愀最攀 椀猀 漀渀 琀栀攀渀 猀愀渀椀琀椀猀攀 琀栀攀 猀琀爀椀渀最 
	IF EXISTS (SELECT gsg.store_plain_text_content਀ऀ             䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
				WHERE gsg.setting_group_name = 'Master'਀ऀऀऀऀ  䄀一䐀 最猀最⸀猀琀漀爀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀 㴀 ✀伀渀✀⤀ 
      BEGIN਀ऀऀⴀⴀ 匀愀渀椀琀椀猀攀 琀栀攀 昀甀氀氀 琀攀砀琀 挀漀渀琀攀渀琀 猀琀爀椀渀最 愀渀搀 琀爀甀渀挀愀琀攀 琀漀 ㄀ 洀椀氀氀椀漀渀 挀栀愀爀愀挀琀攀爀猀⸀   
		 SET @sanitised_text = internal.ufn_CHK_sanitise_file_text_SVF(@full_text_content);਀ऀ 䔀一䐀 
	 ELSE SET @full_text_content = NULL;  -- If full text indexing is off then ignore any full text content supplied.਀ 
	 -- Validate the retention period਀ऀऀ䤀䘀 䀀爀攀琀攀渀琀椀漀渀开洀漀渀琀栀猀 㰀 　 伀刀 䀀爀攀琀攀渀琀椀漀渀开洀漀渀琀栀猀 㸀 㤀㤀㤀㤀 
			BEGIN  ਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'InvalidRetention', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ ✀Ⰰ 䀀爀攀琀攀渀琀椀漀渀开洀漀渀琀栀猀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀刀攀琀攀渀琀椀漀渀⸀✀⤀㬀 
			END਀ 
਀ 
਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀऀऀऀ   ऀऀऀ  
	-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
	   ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    -- Calculate retention date਀ऀ  䤀䘀 䀀爀攀琀攀渀琀椀漀渀开洀漀渀琀栀猀 䤀匀 一伀吀 一唀䰀䰀  匀䔀吀 䀀爀攀琀攀渀琀椀漀渀开搀愀琀攀 㴀 䌀䄀匀吀⠀䐀䄀吀䔀䄀䐀䐀⠀䴀伀一吀䠀Ⰰ 䀀爀攀琀攀渀琀椀漀渀开洀漀渀琀栀猀Ⰰ 匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀⤀ 䄀匀 䐀䄀吀䔀⤀㬀 
਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀ऀ      䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
			SET @documentid = (SELECT doc_id਀ऀऀऀऀऀऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
								WHERE dil.doc_id = @documentid);਀ 
         -- Load the file if duplicate checking is not on, or if there are no duplicates.਀          䤀䘀 ⠀唀倀倀䔀刀⠀䀀搀甀瀀氀椀挀愀琀攀开挀栀攀挀欀⤀ 㰀㸀 ✀伀一✀ 伀刀 䀀洀愀琀挀栀开挀漀甀渀琀 㴀 　⤀ 
              BEGIN਀ऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开䤀一匀开昀椀氀攀  
					   @f_ins_file_content       = @file_content_bin,਀ ऀऀऀऀऀ   䀀昀开椀渀猀开猀琀漀爀攀搀开昀椀氀攀渀愀洀攀    㴀 䀀猀琀漀爀攀搀开昀椀氀攀渀愀洀攀Ⰰ 
					   @f_ins_transaction_group  = @transactiongroup,਀ऀऀऀऀऀ   䀀昀开椀渀猀开挀爀攀愀琀攀搀开戀礀开椀搀      㴀 䀀猀椀搀椀搀Ⰰ 
					   @f_ins_plain_text_content = @sanitised_text,਀ऀऀऀऀऀ   䀀昀开椀渀猀开琀栀甀洀戀渀愀椀氀          㴀 䀀琀栀甀洀戀渀愀椀氀Ⰰ 
					   @f_ins_retention_date     = @retention_date,਀ऀऀऀऀऀ   䀀昀开椀渀猀开洀攀猀猀愀最攀            㴀 䀀洀攀猀猀愀最攀 伀唀吀倀唀吀Ⰰ 
					   @f_ins_transaction_status = @transaction_status OUTPUT,਀ऀऀऀऀऀ   䀀昀开椀渀猀开昀椀氀攀开椀搀            㴀 䀀昀椀氀攀椀搀 伀唀吀倀唀吀㬀 
              END਀ 
		  -- If a new document ID has been created then insert it into the document ID list.਀ऀऀऀऀ䤀䘀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
				BEGIN਀ऀऀऀऀऀ䈀䔀䜀䤀一 吀刀夀 
						INSERT INTO base.document_id_list਀ऀऀऀऀऀऀऀ⠀搀漀挀开椀搀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀⤀ 
						VALUES਀ऀऀऀऀऀऀऀ⠀䀀渀攀眀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀㬀 
					END TRY਀ऀऀऀऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
						IF ERROR_NUMBER() NOT IN (2601, 2627)਀ऀऀऀऀऀऀऀ吀䠀刀伀圀㬀 
						-- else: extremely rare collision → ignore਀ऀऀऀऀऀऀⴀⴀ ⠀漀瀀琀椀漀渀愀氀氀礀 礀漀甀 挀漀甀氀搀 爀攀最攀渀攀爀愀琀攀 栀攀爀攀Ⰰ 戀甀琀 渀漀琀 爀攀焀甀椀爀攀搀⤀ 
					END CATCH਀ऀऀऀऀ䔀一䐀 
਀         ⴀⴀ 䤀渀猀攀爀琀 琀栀攀 昀椀氀攀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀 氀椀渀欀 椀昀 椀琀 搀漀攀猀 渀漀琀 愀氀爀攀愀搀礀 攀砀椀猀琀⸀ 
			IF @documentid IS NOT NULL AND @fileid IS NOT NULL਀ऀऀऀ䈀䔀䜀䤀一 
				BEGIN TRY਀ऀऀऀऀऀ䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
						(doc_id, file_id, transaction_group_id)਀ऀऀऀऀऀ嘀䄀䰀唀䔀匀 
						(@documentid, @fileid, @transactiongroup);਀ऀऀऀऀ䔀一䐀 吀刀夀 
				BEGIN CATCH਀ऀऀऀऀऀ䤀䘀 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀ 一伀吀 䤀一 ⠀㈀㘀　㄀Ⰰ ㈀㘀㈀㜀⤀ 
						THROW;਀ऀऀऀऀऀⴀⴀ 攀氀猀攀㨀 搀甀瀀氀椀挀愀琀攀 氀椀渀欀 鈀‡椀最渀漀爀攀 
				END CATCH਀ऀऀऀ䔀一䐀 
				  ਀ऀऀⴀⴀ䤀渀猀攀爀琀 琀栀攀 昀椀氀攀 琀漀 昀椀氀攀 最爀漀甀瀀 氀椀渀欀 椀昀 椀琀 搀漀攀猀 渀漀琀 愀氀爀攀愀搀礀 攀砀椀猀琀ऀऀऀ  
			IF @filegroupid IS NOT NULL AND @fileid IS NOT NULL਀ऀऀऀऀ䈀䔀䜀䤀一 
					BEGIN TRY਀ऀऀऀऀऀऀ䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 
							(file_group_id, file_id)਀ऀऀऀऀऀऀ嘀䄀䰀唀䔀匀 
							(@filegroupid, @fileid);਀ऀऀऀऀऀ䔀一䐀 吀刀夀 
					BEGIN CATCH਀ऀऀऀऀऀऀ䤀䘀 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀ 一伀吀 䤀一 ⠀㈀㘀　㄀Ⰰ ㈀㘀㈀㜀⤀ 
							THROW;਀ऀऀऀऀऀऀⴀⴀ 攀氀猀攀㨀 搀甀瀀氀椀挀愀琀攀 氀椀渀欀 鈀‡椀最渀漀爀攀 
					END CATCH਀ऀऀऀऀ䔀一䐀 ⴀⴀ 䔀一䐀 椀渀猀攀爀琀椀渀最 昀椀氀攀 最爀漀甀瀀 椀搀 氀椀渀欀 
਀ऀऀⴀⴀ 䤀渀猀攀爀琀 琀栀攀 搀漀挀甀洀攀渀琀 琀漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 氀椀渀欀 椀昀 椀琀 搀漀攀猀 渀漀琀 愀氀爀攀愀搀礀 攀砀椀猀琀 
		IF @docgroupid IS NOT NULL AND @documentid IS NOT NULL਀ऀऀ䈀䔀䜀䤀一 
			BEGIN TRY਀ऀऀऀऀ䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 ⠀搀漀挀开椀搀Ⰰ 搀漀挀开最爀漀甀瀀开椀搀⤀ 
				VALUES (@documentid, @docgroupid);਀ऀऀऀ䔀一䐀 吀刀夀 
			BEGIN CATCH਀ऀऀऀऀ䤀䘀 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀ 一伀吀 䤀一 ⠀㈀㘀　㄀Ⰰ ㈀㘀㈀㜀⤀ 
					THROW;਀ऀऀऀऀⴀⴀ 攀氀猀攀㨀 搀甀瀀氀椀挀愀琀攀 氀椀渀欀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 鈀‡椀最渀漀爀攀 
			END CATCH਀ऀऀ䔀一䐀 
਀ऀऀ 䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀          䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @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   = '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_date_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Inserts a date value for a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 昀椀氀攀 搀愀琀攀 渀愀洀攀 椀搀 愀渀搀 愀 搀愀琀攀 瘀愀氀甀攀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开搀愀琀攀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @filedatenameid 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਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@datestyle int                          = '', -- Date style from base.datetime_styles਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 @filedatenameid = NULL;਀ऀऀ  䤀䘀 䀀搀愀琀攀瘀愀氀甀攀 㴀 ✀✀  
			 SET @datevalue = 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 @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 EXISTS (SELECT file_date_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 
			 				WHERE file_date_name_id = @filedatenameid਀ऀऀऀऀऀऀऀ            䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				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_date_name_id, date_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: 21-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a file-document link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀渀 漀瀀琀椀漀渀愀氀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀⸀ 
-- The connected user must have edit permission for the document id and also file id. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023  Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_doc_link]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@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 @temp_userauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  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 @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	  -- NULL document id not permitted਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀   
		 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 -- A documment 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 edit it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoDocIDAccess', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
				 END			 ਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @fileid = 0਀ऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	  IF @fileid 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 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਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀开椀搀 ⴀ 昀椀氀攀开椀搀 氀椀渀欀 瀀愀椀爀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ 䈀䔀䜀䤀一 
		   IF EXISTS (SELECT file_id਀ऀऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
					   WHERE file_id = @fileid ਀ऀऀऀऀऀऀऀ 䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				  SET @transaction_ready      = 'Fail';਀ ऀऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						   @message_id = 'RecordExists', ਀ऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					  IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					  ELSE ਀ऀऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀 椀昀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		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);਀ 
	     INSERT INTO xref.file_to_document_links (doc_id, 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   = '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_funct_list_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
-- which links a duty function list to a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开昀甀渀挀琀开氀椀猀琀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀  戀椀最椀渀琀                  㴀 一唀䰀䰀Ⰰ 
     @functionlistid 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 @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 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_list_links ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀⤀ 
		      VALUES (@fileid, @functionlistid, @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: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table file_to_function_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 琀漀 愀 昀椀氀攀⸀ 
-- Input is a file id and a function id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_function_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 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 function id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀甀渀挀琀椀漀渀 椀搀 攀砀椀猀琀猀 
			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 @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_links਀ऀऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					        AND function_id = @functionid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
		  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_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: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into xref.file_group_links to link a file to a file group.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 䤀䐀Ⰰ 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀 愀渀搀 渀漀琀攀猀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Inserts a record into xref.file_group_links to link a file to a file group.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @fileid 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 @fileid must be provided and be valid਀⨀ ⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
* - The file must be free from edit restrictions which exclude the current user.਀⨀ ⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀 眀栀椀挀栀 琀栀攀 昀椀氀攀 椀猀 琀漀 戀攀 氀椀渀欀攀搀 琀漀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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.਀    䈀䔀䜀䤀一 ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- 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 EXISTS (SELECT file_group_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀  
						 WHERE           file_id = @fileid਀ऀऀऀऀऀऀ       䄀一䐀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
			   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_group_id, file_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_file_int_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Inserts an integer value for a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 椀搀 愀渀搀 愀渀 椀渀琀攀最攀爀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开椀渀琀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @fileintnameid 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 @fileintnameid = 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 @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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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 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 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_integer_values ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀Ⰰ  椀渀琀开瘀愀氀甀攀⤀ 
		      VALUES (@fileid, @fileintnameid,    @integervalue)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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: 09-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 昀椀氀攀 琀漀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 氀椀渀欀⸀ 
-- Input is a file 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_file_multi_select_link]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀洀猀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @filemsattrid 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਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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 @filemslistid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filemsattrid = 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 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਀ 
		  -- Check if a duplicate record already exists਀ऀऀ  ⴀⴀ 䴀甀氀琀椀瀀氀攀 愀琀琀爀椀戀甀琀攀猀 昀爀漀洀 琀栀攀 猀愀洀攀 氀椀猀琀 愀爀攀 瀀攀爀洀椀琀琀攀搀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀攀礀 愀爀攀 渀漀琀 搀甀瀀氀椀挀愀琀攀搀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 
							 FROM file_attr.file_multi_select_links਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀     昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
							      AND file_ms_attr_id = @filemsattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀         昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				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 file_attr.file_multi_select_links ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ      昀椀氀攀开洀猀开氀椀猀琀开椀搀Ⰰ 昀椀氀攀开洀猀开愀琀琀爀开椀搀⤀ 
		      VALUES (@fileid, @filemslistid,   @filemsattrid)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table file_to_people_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 昀椀氀攀⸀ 
-- Input is a file id and a people_list id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_people_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 ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @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਀ऀऀऀऀ䔀一䐀 
 	      -- 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);਀ऀऀऀऀ   䔀䰀匀䔀  
					  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 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_people_list_links ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  瀀攀漀瀀氀攀开氀椀猀琀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀⤀ 
		      VALUES (@fileid, @peoplelistid, @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: 07-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 昀椀氀攀 琀漀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 氀椀渀欀⸀ 
-- Input is a file id, radio button list id and radio button attribute id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_radiob_link]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @file_radiobattrid 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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@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;਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 　  
			 SET @file_radiobattrid = 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਀ऀऀऀऀ䔀一䐀 
਀ऀऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
				 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'  -- file id and radio button list id have been supplied਀ऀऀऀ 䈀䔀䜀䤀一  
				IF NOT EXISTS (SELECT file_id ਀ऀऀऀऀऀऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 
			  	 				WHERE file_id = @fileid) -- Check if file 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 FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
				 IF NOT EXISTS (SELECT file_radiob_list_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
			  	 				 WHERE file_radiob_list_id = @file_radioblistid) -- 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.');਀ऀऀऀऀऀ䔀一䐀 
਀ ऀऀऀ 䔀一䐀 
 ਀ऀऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 氀椀猀琀 椀搀 椀猀 瘀愀氀椀搀⸀  䌀栀攀挀欀 椀昀 椀琀 栀愀猀 戀攀攀渀 氀椀渀欀攀搀 琀漀 琀栀愀琀 昀椀氀攀 愀氀爀攀愀搀礀 
			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 AttrExist.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 氀椀猀琀 椀搀 椀猀 爀攀猀琀爀椀挀琀攀搀 愀渀搀 椀昀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀⸀ 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀攀猀琀爀椀挀琀攀搀 
			                 FROM file_attr.file_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 file radio button attribute id was supplied.  ਀ऀऀ  ⴀⴀ 一唀䰀䰀 椀猀 瀀攀爀洀椀琀琀攀搀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 椀猀 瘀愀氀椀搀⸀ 
		  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਀ऀऀऀऀऀऀऀऀऀ   䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀⤀  
					 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਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
		             (file_id, file_radiob_list_id,  file_radiob_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਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开爀攀愀氀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 爀攀愀氀 瘀愀氀甀攀 昀漀爀 愀 昀椀氀攀⸀ 
-- Input is a file id, file real name id and a real number.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_real_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @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 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;਀ 
		  -- Check the file id਀ऀऀऀ  䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀椀搀 㴀 　⤀  
			 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 @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 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਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 		  -- Check if a duplicate record already 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 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_real_number_values ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀Ⰰ  爀攀愀氀开瘀愀氀甀攀⤀ 
		      VALUES (@fileid, @filerealnameid,    @realnumbervalue)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 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਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_text_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @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 ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the text value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF EXISTS (SELECT file_free_text_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 
			 				WHERE file_free_text_name_id = @filetextnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				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_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਀ 
	਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_to_com_obj_ms_lnk]    Script Date: Tue 12-05-2026 5:43:19 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.  ਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_to_com_obj_ms_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 ਀ 
	    @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਀ 
		  -- 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 @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 file_id = @fileid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					        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 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 @message = CONCAT_WS(' | ', @message, '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 @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table file_to_com_obj_rb_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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@fileauthenticationstatus nchar(10)     = '',  -- Communicates if the user is not authorised to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@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਀ 
		  -- 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 @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  file_id = @fileid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
		  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_radiob_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_user_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀 
-- which links a user to a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 愀 猀椀搀开椀搀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开甀猀攀爀开氀椀渀欀崀 
਀ऀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @sidid 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 = 0਀ऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	  IF @fileid 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 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਀ 
	 -- 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 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_user_links਀ऀऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					        AND sid_id = @sidid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
		  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,  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_personal_people_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 琀漀 挀爀攀愀琀攀 愀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀 愀渀搀 氀椀渀欀猀 椀琀 琀漀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀ 
-- This allows a user to create their own personal people list and link files and documents to it.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 渀攀眀 爀攀挀漀爀搀 椀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀开猀椀搀椀搀 戀椀最椀渀琀          㴀 ✀✀Ⰰ 
		@mnemonic nvarchar(10)               = '',             ਀ऀऀ䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 ✀✀Ⰰ 
		@description nvarchar(max)           = '', ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  匀䔀䰀䔀䌀吀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀开猀椀搀椀搀 㴀 猀椀搀开椀搀  ⴀⴀ 刀攀琀爀椀攀瘀攀 琀栀攀 匀䤀䐀 䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
    FROM user_restr.sid_list AS sl਀   圀䠀䔀刀䔀   猀氀⸀猀椀搀 
         = @connectedusersid਀ 
  SET @peoplelist_name = -- Strip the domain name from the username.  ਀    䌀䄀匀䔀  
        WHEN CHARINDEX('\', @username) > 0 THEN ਀            刀䤀䜀䠀吀⠀䀀甀猀攀爀渀愀洀攀Ⰰ 䰀䔀一⠀䀀甀猀攀爀渀愀洀攀⤀ ⴀ 䌀䠀䄀刀䤀一䐀䔀堀⠀✀尀✀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀⤀ 
        WHEN CHARINDEX('@', @username) > 0 THEN ਀            䰀䔀䘀吀⠀䀀甀猀攀爀渀愀洀攀Ⰰ 䌀䠀䄀刀䤀一䐀䔀堀⠀✀䀀✀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀ ⴀ ㄀⤀ 
        ELSE ਀            䀀甀猀攀爀渀愀洀攀 ⴀⴀ 一漀 搀漀洀愀椀渀 瀀愀爀琀Ⰰ 爀攀琀甀爀渀 愀猀ⴀ椀猀 
    END਀ऀ  
  SET @description = CONCAT('Personal list for ', @username);਀   
  SET @mnemonic = 'Personal'਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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਀ 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀氀渀⸀渀愀洀攀 
				   FROM people.people_list_names AS pln਀ऀऀऀऀ  圀䠀䔀刀䔀 瀀氀渀⸀渀愀洀攀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀⤀ 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RecordExists', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 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਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO people.people_list_names਀ऀऀ             ⠀洀渀攀洀Ⰰ                              渀愀洀攀Ⰰ           搀攀猀挀爀椀瀀琀椀漀渀⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @peoplelist_name,   ISNULL(@description, '')); ਀ 
	  SET @newrecordid = SCOPE_IDENTITY();  -- Retrieve the ID of the new people list਀ 
	     INSERT INTO people.people_lists  -- Link the connected user's ID to the newly-created people list.਀ऀऀ             ⠀瀀攀漀瀀氀攀开氀椀猀琀开椀搀Ⰰ               猀椀搀开椀搀⤀ 
		      VALUES (@newrecordid,  @connecteduser_sidid);਀ऀऀऀऀऀ  
         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 [editing].[usp_INS_tag_doc_link]    Script Date: Tue 12-05-2026 5:43:19 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 NoDocIDAccess.');਀ऀऀऀऀऀऀ 䔀一䐀 
				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 a duplicate record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 䄀一䐀 
     EXISTS (SELECT tag_doc_link_id਀ऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
			  WHERE    doc_id਀ऀऀऀ        㴀 䀀搀漀挀甀洀攀渀琀椀搀 
				AND    tag_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 data validation਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ 
	  -- Set capitalisation to match existing record. ਀ऀऀ匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 搀漀挀开椀搀 
		  FROM base.document_id_list਀ऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
		INSERT INTO tagging.tag_to_document_links਀ऀऀ            ⠀搀漀挀开椀搀Ⰰ       琀愀最开椀搀⤀ 
			 VALUES (@documentid, @tag_id)਀ऀ    匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
         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: 27-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a tag to tag group link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_tag_group_link] ਀ 
     @tag_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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- 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';਀ऀऀऀ 䔀一䐀 
਀ऀऀऀ 䔀䰀匀䔀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 攀搀椀琀 琀栀攀 琀愀最 
				  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਀ऀऀऀऀ  䔀一䐀 
਀ऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 琀愀最 最爀漀甀瀀 䤀䐀⸀ 
	  ਀ऀ  ऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 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਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 吀愀最 最爀漀甀瀀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
				 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 = @tag_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), @tag_groupid), '  ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGrpPermission');		   ਀ऀऀऀऀऀऀऀ䔀一䐀 
					END਀  
     -- Check if a duplicate record exists਀ 
	 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 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_id,  tag_group_id)਀ऀऀऀ  嘀䄀䰀唀䔀匀 ⠀䀀琀愀最开椀搀Ⰰ 䀀琀愀最开最爀漀甀瀀椀搀⤀ 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_tag_tree_node]    Script Date: Tue 12-05-2026 5:43:19 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_treeid bigint               = NULL,਀ऀ 䀀瀀愀爀攀渀琀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid 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 ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',	਀ऀऀ䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
		@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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
	  -- 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਀ 
		 ELSE  -- Tag exists.  Check if the user has rights to edit the tag਀               ⴀⴀ 䄀搀搀椀渀最 愀 琀愀最 琀漀 愀 爀攀氀愀琀椀漀渀猀栀椀瀀 琀爀攀攀 挀栀愀渀最攀猀 琀栀攀 琀愀最 昀甀渀挀琀椀漀渀 
	           -- Hence the user must have edit rights for the tag in order to add it to a tree.਀ऀऀऀ  䈀䔀䜀䤀一 
				EXEC [internal].[usp_AUTHENTICATE_tag_edit]਀ऀऀऀऀऀ 䀀琀愀最开椀搀开攀瀀 㴀 䀀琀愀最开椀搀Ⰰ 
					 @user_authentication_result_tag = @temp_userauth_status OUTPUT;਀ऀऀऀऀ  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'NoTagPermission', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀ ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀⤀㬀ऀऀ    
					 END਀ऀऀऀ  䔀一䐀 
 ਀  
਀ 
  -- Validate the parent ID਀    䤀䘀 䀀瀀愀爀攀渀琀椀搀 㴀 　 
	    SET @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਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开琀爀攀攀椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'ParentNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀愀爀攀渀琀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ 
	   END਀ऀ   ऀऀ  
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 琀爀攀攀 䤀䐀 
	  	  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਀ऀऀऀऀ 䔀䰀匀䔀  ⴀⴀ  䄀 瘀愀氀椀搀 琀愀最 琀爀攀攀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 椀琀⸀  
				  BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开琀爀攀攀崀 
					   @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਀ऀऀऀऀ  䔀一䐀 
          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 = tag_tree_hierarchyid  -- Set the parent to @parentid਀ऀऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
			  WHERE tag_tree_node_id਀ऀऀऀ        㴀 䀀瀀愀爀攀渀琀椀搀 
			 -- Generate new hierarchy id as child of parent਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 㴀 䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䐀攀猀挀攀渀搀愀渀琀⠀ 
			    (SELECT MAX(tag_tree_hierarchyid)਀ऀऀऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
				  WHERE tag_tree_hierarchyid.IsDescendantOf(@parent_hierarchyid) = 1਀ऀऀऀऀ    䄀一䐀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䰀攀瘀攀氀⠀⤀ 㴀 䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䰀攀瘀攀氀⠀⤀ ⬀ ㄀⤀Ⰰ 一唀䰀䰀⤀㬀 
           END਀ऀऀⴀⴀ 䤀渀猀攀爀琀 琀栀攀 渀攀眀 渀漀搀攀 
		INSERT INTO tagging.tag_tree_nodes਀ऀऀ            ⠀琀愀最开琀爀攀攀开椀搀Ⰰ  琀愀最开椀搀Ⰰ 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 
			 VALUES (@tag_treeid, @tag_id,     @new_hierarchyid)਀ऀ    匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
		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 [editing].[usp_INS_wf_input_step_file]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 氀椀渀欀 昀爀漀洀 愀 昀椀氀攀 琀漀 愀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀渀瀀甀琀⸀   
-- Input is a file id and input step id. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_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.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@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 @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 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਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 昀椀氀攀 椀搀 椀猀 瘀愀氀椀搀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
		 -- End checking the file id਀ 
਀ऀ  䤀䘀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 㴀 　 
		 SET @input_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @input_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 = @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 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 if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT wsip.file_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 䄀匀 眀猀椀瀀 
		  WHERE wsip.file_id ਀ऀऀ        㴀   䀀昀椀氀攀椀搀 
		    AND wsip.workflow_input_step_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਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 
		             (file_id,  workflow_input_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਀  
਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开甀猀攀爀开戀漀漀欀椀渀最开椀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 匀攀氀攀挀琀猀 愀氀氀 戀漀漀欀椀渀最 䤀䐀猀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@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;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
    ਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@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.਀    䈀䔀䜀䤀一 
਀ऀऀⴀⴀ 刀攀琀爀椀攀瘀攀 甀猀攀爀 䤀䐀 
		SET @userid = (SELECT sid_id਀ऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						WHERE sl.sid = @connectedusersid)਀ 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the 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 = @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.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     ROLLBACK;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_SEL_book_in_files]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description: Lists all the booked in files for a booking id.    ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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. ਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = 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)              = '',਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀               㴀 ✀一漀✀Ⰰ 
		@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';਀ 
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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- 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 @userid = (SELECT sid_id਀ऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						WHERE sl.sid = @connectedusersid)਀ 
-- Check if the booking id exists.਀ 
-- Check that the booking id is valid.  For editor must be a booking id they created.  For controller, any booking id. ਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ 
			IF NOT EXISTS ਀ऀऀऀऀ⠀ 
				SELECT bl.booking_id਀ऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
				 ) ਀ऀऀऀऀ伀刀 ⠀䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀一漀✀ 䄀一䐀 
				NOT EXISTS਀ऀऀऀऀऀ⠀ 
					SELECT bl.booking_id਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
					 WHERE bl.user_id = @userid਀ऀऀऀऀऀ ⤀ ⤀ 
਀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'InvalidBIRec', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					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 user authentiation = Pass਀ऀ 
-----=============================================================਀ 
  -- Execute the query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given text field਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN base.booked_in_files AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           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਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ 
         EXEC internal.usp_SEL_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 [editing].[usp_SEL_ed_doc_group_ed_perms]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Lists all of the document groups਀ⴀⴀ 昀漀爀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀ 
-- Only document groups for which the user has view permission਀ⴀⴀ 眀椀氀氀 戀攀 氀椀猀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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 ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '', -- Communicates what was the outcome of the transaction਀        䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@nopermissionmessage nvarchar(200)   = ''; -- Communicates that the user does not have the required permission਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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.਀    䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
		       WITH CombinedResults AS ਀ऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
						             dgn.attr_name    AS 'Doc Group Name'਀ऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
				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਀ऀऀऀऀऀऀऀ䄀一䐀 
							dgvp.sid_id ਀ऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
					WHERE sl.sid = @connectedusersid਀ऀऀऀऀऀऀ      
				UNION ALL਀ 
					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.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    pl.sid_id਀ऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
						   AND dgvp.sid_id਀ऀऀऀऀऀऀ       㴀 猀氀⸀猀椀搀开椀搀 
					WHERE sl.sid = @connectedusersid) ਀ऀऀऀऀ 
				SELECT DISTINCT [Doc Group ID], [Doc Group Name]਀                           䘀刀伀䴀  䌀漀洀戀椀渀攀搀刀攀猀甀氀琀猀 
                       ORDER BY [Doc Group Name];਀ 
 			  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.';਀ऀऀऀऀ䔀一䐀 
਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @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਀    䔀一䐀 
	 ਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_doc_date_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Updates a date 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_date_value]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @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 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 @docdatenameid = 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 date name field id਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 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 NOT EXISTS (SELECT doc_date_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 
			 				WHERE doc_date_name_id = @docdatenameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				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 date_value = @datevalue਀ऀऀ  圀䠀䔀刀䔀               搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		        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: 12-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 琀漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Authenticates both controller and editor.਀ 
-- 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 [editing].[usp_UPD_doc_grp_lnk_notes_rstr]਀ 
     @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਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 @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(10), @docgroupid), 'NULL'), '  ', @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupPermission.');਀ऀऀ䔀一䐀 
਀ 
		  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 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'਀ऀऀऀ   䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
						   	     FROM xref.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 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਀ऀ     唀倀䐀䄀吀䔀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 
		    SET notes = @inputnotes਀ऀऀऀ  圀䠀䔀刀䔀       搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
			    AND doc_group_id = @docgroupid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_int_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Updates 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 have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   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 int name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc 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 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE doc_attr.doc_integer_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_multi_select_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Updates a doc_multi_select_links record਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀崀  
     @documentid nvarchar(50)         = NULL,਀     䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @docmsattrid 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.਀ऀऀ䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
        @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਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @documentid = ''਀ऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	 IF @docmslistid = 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_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਀ऀ  
		 -- Check if the record exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀  
							FROM doc_attr.doc_multi_select_links ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀    搀漀挀开洀猀开氀椀猀琀开椀搀      
						         = @docmslistid਀ऀऀऀऀऀऀऀ 䄀一䐀    搀漀挀开椀搀         
							     = @documentid਀ऀऀऀऀऀऀऀ 䄀一䐀    搀漀挀开洀猀开愀琀琀爀开椀搀  
							     = @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਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check the new parameters਀ 
਀          ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 愀渀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 瀀愀椀爀 攀砀椀猀琀猀 
		  IF @newdocmsattrid 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਀ऀऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
										@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  									IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀洀猀氀椀猀琀椀搀⤀Ⰰ ✀  伀戀樀攀挀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
									ELSE ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
									SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							  END਀ 
			 END਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
		   IF EXISTS (SELECT doc_ms_list_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
						   WHERE    doc_ms_list_id     ਀ऀऀऀऀऀऀ         㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
							 AND    doc_id        ਀ऀऀऀऀऀऀऀ     㴀 䀀搀漀挀甀洀攀渀琀椀搀 
							 AND    doc_ms_attr_id ਀ऀऀऀऀऀऀऀ     㴀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀 
							 AND       @docmsattrid ਀ऀऀऀऀऀऀऀऀ 㰀㸀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀⤀ 
			   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਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
		    SET doc_ms_attr_id = @newdocmsattrid਀ऀऀ  圀䠀䔀刀䔀    搀漀挀开洀猀开氀椀猀琀开椀搀      
			    = @docmslistid਀ऀऀ    䄀一䐀    搀漀挀开椀搀          
			    = @documentid਀ऀऀ    䄀一䐀    搀漀挀开洀猀开愀琀琀爀开椀搀  
			    = @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_UPD_doc_radiob_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 搀漀挀甀洀攀渀琀 琀漀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 氀椀渀欀⸀ 
-- Input is a document id, radio button list id and radio button attribute id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀愀搀椀漀戀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docradioblistid 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 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਀ 
  -- Authenticate the connected users 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 @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 @documentid = NULL;਀ऀऀ 䤀䘀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　 
			SET @docradioblistid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 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 NoDocIDAccess.'); ਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  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 id link pair 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਀ 
			-- 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.');਀ऀऀऀ    䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀   
		  -- NULL is permitted, providng that the radio button list id is valid.਀ 
		  IF @docradiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		  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 attribute 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਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
		    SET doc_radiob_attr_id = @docradiobattrid਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
			    AND doc_radiob_list_id = @docradioblistid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀 爀攀愀氀 瘀愀氀甀攀 昀漀爀 愀 搀漀挀甀洀攀渀琀⸀ 
-- Input is a document id, document real name id and an real.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀攀愀氀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @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 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 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਀ 
਀          ⴀⴀ 一漀 瘀愀氀椀搀愀琀椀漀渀 椀猀 瀀攀爀昀漀爀洀攀搀 漀渀 琀栀攀 爀攀愀氀 戀攀挀愀甀猀攀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 
		  -- will result in an error before the procedure is executed. ਀ 
 		  -- Check that the record 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 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_real_number_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_tag]    Script Date: Tue 12-05-2026 5:43:19 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.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开琀愀最崀  
਀     䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @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 ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @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਀ऀऀ  䔀一䐀 
਀     ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀⸀⸀⸀ 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀琀愀最渀愀洀攀 㴀 ✀✀ 
		   SET @tagname = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT tag_name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀  
					WHERE tag_name = @tagname਀ऀऀऀऀऀ  䄀一䐀 琀愀最开椀搀 㰀㸀 䀀琀愀最开椀搀⤀  
			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'਀ऀ䈀䔀䜀䤀一 
	  ਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  ਀ऀ     唀倀䐀䄀吀䔀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀  
		    SET           mnem ਀ऀऀऀ    㴀 䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
			       tag_name ਀ऀऀऀऀ㴀 䀀琀愀最渀愀洀攀Ⰰ 
				          descr਀ऀऀऀऀ㴀 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀  
		  WHERE    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: 04-09-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_UPD_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 ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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;਀ऀऀ  䤀䘀 䀀琀攀砀琀瘀愀氀甀攀 㴀 ✀✀  
			 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 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਀ 
਀          ⴀⴀ 一漀 瘀愀氀椀搀愀琀椀漀渀 椀猀 瀀攀爀昀漀爀洀攀搀 漀渀 琀栀攀 琀攀砀琀 猀琀爀椀渀最 戀攀挀愀甀猀攀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 
		  -- will result in an error before the procedure is executed. ਀ 
 		  -- Check that the record 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 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_free_text_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_to_com_obj_ms_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 唀瀀搀愀琀攀 愀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 
-- which links a common object to a document via a multi-select 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਀ 
		 -- 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਀ऀऀ  䔀一䐀 
਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	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਀ 
-- =======================਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT common_object_list_id਀ऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 
					     WHERE  doc_id = @documentid਀ऀऀऀऀऀ       䄀一䐀     挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
							    = @commonobjlistid਀ऀऀऀऀऀ       䄀一䐀       挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀       
						       = @newcommonobjectid਀ऀऀऀऀऀऀ   䄀一䐀       䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
						       <> @newcommonobjectid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', @documentid, ' ', 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.doc_to_com_obj_ms_list_links ਀ऀऀ    匀䔀吀       挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀       
			    = @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਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Update a record in table doc_to_com_obj_rb_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 搀漀挀甀洀攀渀琀 瘀椀愀 愀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 
-- Input and output parameters are declared below.  ਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_doc_to_com_obj_rb_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਀ऀऀऀऀ䔀一䐀 
਀ 
਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                  FROM com_obj.doc_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 the new parameters਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT common_object_list_id਀ऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 
					     WHERE  doc_id = @documentid਀ऀऀऀऀऀ       䄀一䐀     挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
							    = @commonobjlistid਀ऀऀऀऀऀ       䄀一䐀       挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀       
						       = @newcommonobjectid਀ऀऀऀऀऀऀ   䄀一䐀       䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
						       <> @newcommonobjectid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', @documentid, ' ', 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, ' | ', @documentid, '   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.doc_to_com_obj_radiob_links ਀ऀऀ    匀䔀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
		  WHERE  doc_id  = @documentid਀ऀऀ    䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
			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_doc_transaction_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㠀ⴀ㈀　㈀㐀 
-- Description:	Updates the transaction group for a document ID.਀ⴀⴀ 甀猀瀀开唀倀䐀开搀漀挀甀洀攀渀琀开椀搀 眀椀氀氀 氀攀愀瘀攀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 甀渀挀栀愀渀最攀搀 
-- if a transaction group id is not supplied.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 䤀䐀⸀   
-- This update is permitted even if the document ID is locked. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_doc_transaction_group] ਀ 
	 @documentid nvarchar(50)         = 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 @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 -- A 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 @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 document_id_list.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_doc_xref_text]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 昀漀爀 愀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 氀椀渀欀 戀攀琀眀攀攀渀 琀眀漀 搀漀挀甀洀攀渀琀猀 
-- Input is a source document id, a cross-referenced document id and input notes.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_doc_xref_text]਀ 
     @source_docid  nvarchar(50)      = NULL,਀ऀ 䀀砀爀攀昀开搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @input_notes nvarchar(max)		  = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @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',਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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 @source_docid = ''਀ऀऀ     匀䔀吀 䀀猀漀甀爀挀攀开搀漀挀椀搀 㴀 一唀䰀䰀㬀 
		  IF @source_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 =  @source_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(@source_docid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check the cross-reference document id਀ऀऀ  䤀䘀 䀀砀爀攀昀开搀漀挀椀搀 㴀 ✀✀ 
		     SET @xref_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 @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT xref_type_id਀ऀऀ               䘀刀伀䴀 砀爀攀昀⸀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀 
					  WHERE source_doc_id = @source_docid਀ऀऀऀऀऀ        䄀一䐀 砀爀攀昀开搀漀挀开椀搀 㴀 䀀砀爀攀昀开搀漀挀椀搀⤀ 
		  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਀ऀ   唀倀䐀䄀吀䔀 砀爀攀昀⸀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀  
	      SET notes = @input_notes਀ऀऀ圀䠀䔀刀䔀 猀漀甀爀挀攀开搀漀挀开椀搀 㴀 䀀猀漀甀爀挀攀开搀漀挀椀搀 
		      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: 08-02-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀⸀  伀渀氀礀 愀瀀瀀氀椀攀猀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 昀漀爀 眀栀椀挀栀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 栀愀猀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀⸀ 
-- Input is a document ID, new document ID and optional transaction group.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀⼀⨀⨀ 
* Updates a document ID਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @id_to_update:  Must be a non NULL valid document id which the user has view and metadata edit permission access to.਀⨀ ⴀ 䀀渀攀眀开搀漀挀开椀搀㨀 䴀甀猀琀 戀攀 愀 渀漀渀 一唀䰀䰀 瘀愀氀椀搀 搀漀挀甀洀攀渀琀 椀搀 眀栀椀挀栀 椀猀 渀漀琀 愀 搀甀瀀氀椀挀愀琀攀 漀昀 愀渀 攀砀椀猀琀椀渀最 䤀䐀⸀  
* - @transactiongroup: Optional.  If supplied must be a valid transaction group ID.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - Data validation errors.  Will only return data if the user has view and metadata edit permission access to the document. ਀⨀ 
* **Side Effects:**਀⨀ 
* - Alters a document id਀⨀ 
* **Preconditions:**਀⨀ 
* - The user must have controller role permission਀⨀ ⴀ 吀栀攀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_document_id] ਀ 
	 @id_to_update nvarchar(50)       = NULL,਀ऀ 䀀渀攀眀开搀漀挀开椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@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਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	  IF @id_to_update = ''਀ऀऀ 匀䔀吀 䀀椀搀开琀漀开甀瀀搀愀琀攀 㴀 一唀䰀䰀㬀 
	   -- 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਀ 
	  ELSE -- A doc id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 瘀椀攀眀 琀栀攀 搀漀挀甀洀攀渀琀 
		        -- A controller can edit the ID of any document they have view permission for.਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 	            @doc_id_to_check_ep =  @id_to_update,਀ऀ             䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 漀爀 攀搀椀琀 椀琀 
				   SET @data_validation_status = '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 DocIDNotExist.'); ਀ऀऀऀऀ 䔀一䐀 
			 ELSE -- The doc id does exist and the user has permission to access it.  ਀ऀऀऀऀऀⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 椀猀 氀漀挀欀攀搀⸀ 
					IF ((SELECT lock_status਀ऀऀऀऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 
							WHERE doc_id = @id_to_update)਀ऀऀऀऀऀऀऀऀ㴀 ✀䰀漀挀欀攀搀✀⤀ 
						BEGIN਀ऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀䘀愀椀氀✀㬀 
							SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDLocked', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀椀搀开琀漀开甀瀀搀愀琀攀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
							ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀䰀漀挀欀攀搀⸀✀⤀㬀 
						END਀         䔀一䐀 ⴀⴀ 䔀渀搀 䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
      IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 渀攀眀 搀漀挀甀洀攀渀琀 椀搀 椀猀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 椀猀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 攀砀椀猀琀椀渀最 
				IF (@new_doc_id <> @id_to_update) ਀ऀऀऀऀऀ䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀  
   								FROM base.document_id_list ਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀渀攀眀开搀漀挀开椀搀⤀  
					BEGIN -- Document id is not unique਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id   = 'DocNotUnique', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀渀攀眀开搀漀挀开椀搀Ⰰ 㘀⤀Ⰰ ✀⸀⸀⸀✀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀一漀琀唀渀椀焀甀攀⸀✀⤀㬀 
					END -- End checking the uniqueness of the new document id਀            䔀一䐀 
	  -- Check if the document id might have been automatically truncated਀      䤀䘀 ⠀䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀⤀ 䄀一䐀 ⠀䰀䔀一⠀䀀渀攀眀开搀漀挀开椀搀⤀ 㸀㴀 㔀　⤀ 
			BEGIN਀ऀऀऀऀⴀⴀ 䐀漀渀✀琀 昀愀椀氀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀⸀  吀栀攀 猀琀爀椀渀最 椀猀 樀甀猀琀 琀爀甀渀挀愀琀攀搀⸀  
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀漀漀䰀漀渀最㔀　✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT(@message, ' | ', LEFT(@new_doc_id, 8), '...', ' | ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TooLong50.');਀ऀऀऀ䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
਀ऀऀⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 攀砀椀猀琀猀 
	  IF @transactiongroup = 0 ਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 一唀䰀䰀㬀 ⴀⴀ 一唀䰀䰀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀猀 愀氀氀漀眀攀搀 
	  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(@message, ' | ',  CONVERT(nvarchar(20), @transactiongroup), '  ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TGNotExist.');਀ऀऀऀऀ䔀一䐀 
		END   -- End checking transaction group reference਀ 
		-- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 昀愀椀氀攀搀 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ 
	-- End of validation checks਀ 
  END -- End IF user authentication = Pass਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀    ⴀⴀ 吀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 椀猀 漀瀀琀椀漀渀愀氀⸀ 
    -- If there was no tg id supplied then set it to the same as previous.਀      䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一唀䰀䰀 
         SET @transactiongroup = (SELECT transaction_group_id਀ऀ                                䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 
							       WHERE doc_id = @id_to_update);਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE base.document_id_list ਀ऀऀ           匀䔀吀 搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀搀漀挀开椀搀               㴀 䀀渀攀眀开搀漀挀开椀搀Ⰰ 
			           document_id_list.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਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开搀愀琀攀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开搀愀琀攀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @filedatenameid bigint           = NULL,਀ऀ 䀀搀愀琀攀瘀愀氀甀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 @filedatenameid = NULL;਀ऀऀ  䤀䘀 䀀搀愀琀攀瘀愀氀甀攀 㴀 ✀✀  
			 SET @datevalue = 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 @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 NOT EXISTS (SELECT file_date_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 
			 				WHERE file_date_name_id = @filedatenameid਀ऀऀऀऀऀऀऀ            䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				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 date_value = @datevalue਀ऀऀ  圀䠀䔀刀䔀               昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		        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-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a file to document link.਀ⴀⴀ 䈀漀琀栀 琀栀攀 渀攀眀 搀漀挀甀洀攀渀琀 䤀䐀 愀渀搀 昀椀氀攀 䤀䐀 洀甀猀琀 戀攀 猀攀渀琀⸀  
-- Authenticates both controller and editor਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_file_doc_link] ਀ 
     @documentid nvarchar(50)         = '', ਀     䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀      㴀 ✀✀Ⰰ  
	 @fileid 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਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@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 @temp_userauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  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 @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check that a document 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 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 (@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 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_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileIDAccess.');਀ऀऀऀऀऀ 䔀一䐀ऀऀऀ  
			 END਀   
		  -- Check that the record exists਀ऀऀ  䤀䘀 ⠀䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
			  AND NOT EXISTS (SELECT doc_id ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
							   WHERE doc_id = @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 NotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
਀ऀऀऀ䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
--======================਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
਀  ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @newdocumentid = ''਀ऀऀऀ 匀䔀吀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check that a document 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 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਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Check that a new 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), @newfileid), '.  ', @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਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀    搀漀挀开椀搀  
						         = @newdocumentid ਀ऀऀऀऀऀऀऀ 䄀一䐀       昀椀氀攀开椀搀  
							     = @newfileid਀ऀऀऀऀऀऀऀ 䄀一䐀 䀀昀椀氀攀椀搀 
							     <> @newfileid਀ऀऀऀऀऀऀऀ 䄀一䐀       䀀搀漀挀甀洀攀渀琀椀搀 
							     <> @newdocumentid))਀ऀऀऀ䈀䔀䜀䤀一 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'RecordExists', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ 
			END -- End check for duplicate record਀ 
਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    UPDATE xref.file_to_document_links਀ऀऀ   匀䔀吀       昀椀氀攀开椀搀  
		       = @newfileid,਀ऀऀऀ         搀漀挀开椀搀 
			   = @newdocumentid਀ऀऀ 圀䠀䔀刀䔀    搀漀挀开椀搀  
		       = @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: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the notes column of a record in xref.file_group_links file to file group links.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 䤀䐀Ⰰ 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀 愀渀搀 渀漀琀攀猀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Updates the notes column of a record in xref.file_group_links.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @fileid 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 @fileid must be provided and be valid and match an existing record਀⨀ ⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
* - 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';਀ 
	 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 -- 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਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@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 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 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 xref.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   = '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-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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开椀渀琀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fileintnameid 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 @fileintnameid = 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਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Check the file int name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file int 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਀ऀऀऀ䔀一䐀 
਀ 
          -- No validation is performed on the integer because an invalid value਀ऀऀ  ⴀⴀ 眀椀氀氀 爀攀猀甀氀琀 椀渀 愀渀 攀爀爀漀爀 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 椀猀 攀砀攀挀甀琀攀搀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			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਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀  
		    SET int_value = @integervalue਀ऀऀ  圀䠀䔀刀䔀              昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		        AND file_int_name_id = @fileintnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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: 20-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 爀攀挀漀爀搀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_file_multi_select_link] ਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @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;਀  䐀䔀䌀䰀䄀刀䔀  
		@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';਀ 
  -- 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 @filemslistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 䤀䐀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF (@fileid IS NULL OR @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 NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一   
	        -- 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.');਀ऀऀऀऀऀ䔀一䐀ऀऀ  
		  -- Check if the record exists਀ऀऀऀ  䤀䘀 ⠀䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
				  AND NOT EXISTS (SELECT file_ms_list_id ਀ऀऀऀऀऀऀऀऀ    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
							       WHERE file_ms_list_id     = @filemslistid਀ऀऀऀऀऀऀऀऀऀ     䄀一䐀 昀椀氀攀开椀搀         㴀 䀀昀椀氀攀椀搀 
									     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 NotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		 END਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check the new parameters਀ 
਀          ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 愀渀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 瀀愀椀爀 攀砀椀猀琀猀 
		  IF @newfilemsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE    file_ms_attr_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 
								   AND    file_ms_list_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀  
							  BEGIN਀ऀऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
										@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  									IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀  䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀Ⰰ ✀  伀戀樀攀挀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀⤀Ⰰ  ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
									ELSE ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
									SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							  END਀ 
			 END਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
		   IF EXISTS (SELECT file_ms_list_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
						   WHERE    file_ms_list_id     ਀ऀऀऀऀऀऀ         㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
							 AND    file_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਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
		    SET file_ms_attr_id = @newfilemsattrid਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开洀猀开氀椀猀琀开椀搀      
			    = @filemslistid਀ऀऀ    䄀一䐀    昀椀氀攀开椀搀          
			    = @fileid਀ऀऀ    䄀一䐀    昀椀氀攀开洀猀开愀琀琀爀开椀搀  
			    = @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਀    䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀   䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_file_radiob_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 昀椀氀攀 琀漀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 氀椀渀欀⸀ 
-- Input is a file id, radio button list id and radio button attribute id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_file_radiob_link]਀ 
     @fileid bigint                     = NULL, ਀ऀ 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @file_radiobattrid 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)              = '',਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀               㴀 ✀一漀✀Ⰰ 
		@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਀ऀऀऀ匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 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' -- A record id link pair has been supplied਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 椀搀 氀椀渀欀 瀀愀椀爀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			   IF NOT EXISTS (SELECT file_radiob_list_id ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
							   WHERE file_radiob_list_id = @file_radioblistid਀ऀऀऀऀऀऀऀऀऀ         䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀऀ 䔀一䐀 
		  -- Check if a file radio button attribute id was supplied.  ਀ऀऀ  ⴀⴀ 一唀䰀䰀 椀猀 瀀攀爀洀椀琀琀攀搀Ⰰ 瀀爀漀瘀椀搀渀最 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 椀猀 瘀愀氀椀搀⸀ 
਀ऀऀऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 氀椀猀琀 椀搀 椀猀 爀攀猀琀爀椀挀琀攀搀 愀渀搀 椀昀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀⸀ 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀攀猀琀爀椀挀琀攀搀 
			                 FROM file_attr.file_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਀ 
		  IF @file_radiobattrid = '' ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		  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਀ऀऀऀऀऀऀऀऀऀ   䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀⤀  
					 BEGIN -- Radio button attribute 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਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
		    SET file_radiob_attr_id = @file_radiobattrid਀ऀऀ  圀䠀䔀刀䔀                 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
			    AND file_radiob_list_id = @file_radioblistid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_real_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Updates a real 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_real_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @realnumbervalue real		      = 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)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@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਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- 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 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਀ 
਀          ⴀⴀ 一漀 瘀愀氀椀搀愀琀椀漀渀 椀猀 瀀攀爀昀漀爀洀攀搀 漀渀 琀栀攀 爀攀愀氀 戀攀挀愀甀猀攀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 
		  -- will result in an error before the procedure is executed. ਀ 
 		  -- 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE file_attr.file_real_number_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_text_value]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Updates a text 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_text_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @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਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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਀ 
਀          ⴀⴀ 一漀 瘀愀氀椀搀愀琀椀漀渀 椀猀 瀀攀爀昀漀爀洀攀搀 漀渀 琀栀攀 琀攀砀琀 猀琀爀椀渀最 戀攀挀愀甀猀攀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 
		  -- will result in an error before the procedure is executed. ਀ 
 		  -- Check that the record 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 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_free_text_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_to_cm_obj_ms_link]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 唀瀀搀愀琀攀 愀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 
-- which links a common object to a file via a multi-select 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 file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
		  -- Check the file id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		     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 common_object_list_id਀ऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 
					     WHERE  file_id = @fileid਀ऀऀऀऀऀ           䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					           AND common_object_id      = @commonobjectid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', @fileid, '   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.file_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      = @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: 09-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Update a record in table file_to_com_obj_rb_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 昀椀氀攀 瘀椀愀 愀 爀愀搀椀漀ⴀ戀甀琀琀漀渀 氀椀猀琀 
-- 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 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';਀ 
  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 the file id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		     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 common_object_list_id਀ऀऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀  
					      WHERE  file_id = @fileid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					        AND common_object_id      = @commonobjectid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', @fileid, '   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 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, ' | ', 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਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
	  -- 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_radiob_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_transaction_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㠀ⴀ㈀　㈀㐀 
-- Description:	Updates the transaction group for a file 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)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus 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 @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਀ 
			 -- 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.file_metadata ਀ऀऀ           匀䔀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 
			     WHERE 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: 11-08-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 昀椀氀攀渀愀洀攀⸀ 
-- Input is a file ID  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_filename] ਀ 
	 @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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@filename_validation_status nchar(10),਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀䘀愀椀氀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus 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';਀ 
  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			 ਀ऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 匀琀漀爀攀搀 昀椀氀攀渀愀洀攀 洀甀猀琀 戀攀 愀 瘀愀氀椀搀 昀椀氀攀渀愀洀攀 
		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਀ 
਀ऀऀⴀⴀ 匀琀漀爀攀搀 昀椀氀攀渀愀洀攀 氀攀渀最琀栀 洀甀猀琀 戀攀 氀攀猀猀 琀栀愀渀 ㈀㔀㔀 
		IF LEN(@stored_filename) > 254਀ऀऀ  䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀椀氀攀渀愀洀攀吀漀漀䰀漀渀最✀Ⰰ  
				 @message_text =  @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀ 
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀 
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FilenameTooLong.');਀ऀऀ  䔀一䐀 
		-- End filename length validation਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 昀愀椀氀攀搀 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE base.file_metadata ਀ऀऀ           匀䔀吀 昀椀氀攀渀愀洀攀 㴀 䀀猀琀漀爀攀搀开昀椀氀攀渀愀洀攀 
			     WHERE 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: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates 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_UPD_tag_doc_link] ਀ 
     @tag_id bigint                   = NULL,਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
     @newtag_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',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@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 = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   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, ' | Tag ID: ', 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 NotExist.');਀ऀऀऀ 䔀一䐀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀  
਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
		  -- 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 @newtag_id = 0 ਀ऀ    匀䔀吀 䀀渀攀眀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @newtag_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 = @newtag_id)਀ऀऀ 䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | Tag ID: ', CONVERT(nvarchar(10), @newtag_id), '  ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
਀ 
-- Check for a duplicate of the new record.਀ 
	 IF @data_validation_status = 'Pass' ਀ऀ    䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀  
		              FROM tagging.tag_to_document_links਀ऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开椀搀 
					       = @newtag_id਀ऀऀऀऀऀ   䄀一䐀       搀漀挀开椀搀  
					       = @newdocumentid਀ऀऀऀऀऀ   䄀一䐀 一伀吀⠀䀀琀愀最开椀搀 
					           = @newtag_id਀ऀऀऀऀऀऀ   䄀一䐀      䀀搀漀挀甀洀攀渀琀椀搀   
						       = @newdocumentid						      ਀ऀऀऀऀऀऀ  ⤀⤀ 
			 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 IF @userauthentication_status = 'Pass'਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  -- Set the capitalisation to match the existing record਀ऀ  ऀ匀䔀䰀䔀䌀吀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 㴀 搀漀挀开椀搀 
		  FROM base.document_id_list਀ऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀㬀 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ唀倀䐀䄀吀䔀 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
		   SET       tag_id਀ऀऀऀ   㴀 䀀渀攀眀琀愀最开椀搀Ⰰ 
                     doc_id ਀ऀऀऀ   㴀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 
		 WHERE    doc_id਀ऀऀऀ   㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		   AND    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.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
   ਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开最爀漀甀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a tag to tag group link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_tag_group_link] ਀ 
     @tag_id bigint                   = NULL,਀ऀ 䀀琀愀最开最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
     @newtag_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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@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਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- 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';਀ऀऀऀ 䔀一䐀 
਀ऀऀऀ 䔀䰀匀䔀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 攀搀椀琀 琀栀攀 琀愀最 
				  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਀ऀऀऀऀ  䔀一䐀 
਀ऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 琀愀最 最爀漀甀瀀 䤀䐀⸀ 
	  ਀ऀ  ऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 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਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 吀愀最 最爀漀甀瀀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
				 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 = @tag_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), @tag_groupid), '  ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGrpPermission');		   ਀ऀऀऀऀऀऀऀ䔀一䐀 
					END਀  
 -- Check if the record exists਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
	    AND NOT EXISTS (SELECT tag_group_id ਀ऀऀ                  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 
					     WHERE    tag_id਀ऀऀऀऀऀ           㴀 䀀琀愀最开椀搀 
					       AND    tag_group_id ਀ऀऀऀऀऀ           㴀 䀀琀愀最开最爀漀甀瀀椀搀⤀ 
			 BEGIN -- The record does not exist.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NotExist', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			 END਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check new parameters਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 渀攀眀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @newtag_id = 0 ਀ऀ    匀䔀吀 䀀渀攀眀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @newtag_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), @newtag_id), '  ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
							   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagPermission');		   ਀ऀऀऀऀऀऀ 䔀一䐀 
				  END਀ 
	  --  Check the tag group ID.਀ऀ   
	  	  IF @newtag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @newtag_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 ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀  
								       = @newtag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 吀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						  SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @newtag_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਀ऀऀऀऀऀ䔀一䐀 
਀ 
     -- Check if a duplicate record exists਀ 
	 IF @data_validation_status = 'Pass' ਀ऀ    䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀  
		              FROM tagging.tag_to_tag_group_links਀ऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开椀搀 
					       = @newtag_id਀ऀऀऀऀऀ   䄀一䐀    琀愀最开最爀漀甀瀀开椀搀  
					       = @newtag_groupid਀ऀऀऀऀऀ   䄀一䐀 一伀吀⠀䀀琀愀最开椀搀 
					           = @newtag_id਀ऀऀऀऀऀऀ   䄀一䐀      䀀琀愀最开最爀漀甀瀀椀搀   
						       = @newtag_groupid						      ਀ऀऀऀऀऀऀ  ⤀⤀ 
			 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 update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE tagging.tag_to_tag_group_links ਀ऀऀ    匀䔀吀       琀愀最开椀搀 
			    = @newtag_id,਀ऀऀऀऀ      琀愀最开最爀漀甀瀀开椀搀 
				= @newtag_groupid਀ऀऀ  圀䠀䔀刀䔀   琀愀最开椀搀  
		        = @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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a tag relationship tree node to move it to a different node.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_tag_tree_node] ਀ 
     @tag_tree_node_id bigint         = NULL,਀     䀀渀攀眀开瀀愀爀攀渀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newnode nvarchar(4000)          = 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)         = '',	਀ऀऀ䀀琀愀最开琀爀攀攀椀搀 戀椀最椀渀琀Ⰰ 
        @current_hierarchyid hierarchyid,਀        䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
		@new_sibling_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.਀    䈀䔀䜀䤀一 
਀ऀ匀䔀吀 䀀琀愀最开琀爀攀攀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
	                     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਀ऀ   䔀一䐀 
਀䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
  BEGIN਀  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 瀀愀爀攀渀琀 䤀䐀 
    IF @new_parentid = 0਀ऀ    匀䔀吀 䀀渀攀眀开瀀愀爀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	IF @new_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਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @new_parentid਀ऀऀऀऀऀऀ  䄀一䐀 琀愀最开琀爀攀攀开椀搀  
						      = (SELECT tag_tree_id਀ऀऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
								  WHERE tag_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_tree_nodes਀ऀऀ 圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 㴀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
		  FROM tagging.tag_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;਀ऀ    匀䔀䰀䔀䌀吀 䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 㴀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
		  FROM tagging.tag_tree_nodes਀ऀऀ 圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		       = @tag_tree_node_id;਀ 
             IF @new_parentid IS NULL਀             䈀䔀䜀䤀一 
                 -- Move to root level਀                 匀䔀吀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 㴀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀㬀 
             END਀             䔀䰀匀䔀 
             BEGIN਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 㴀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀  
				   FROM tagging.tag_tree_nodes਀ऀऀऀऀ  圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀渀攀眀开瀀愀爀攀渀琀椀搀㬀  
                 -- Generate new hierarchy id as child of new parent਀                 匀䔀䰀䔀䌀吀 䀀渀攀眀开猀椀戀氀椀渀最开栀椀攀爀愀爀挀栀礀椀搀 㴀 䴀䄀堀⠀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀   
                   FROM tagging.tag_tree_nodes਀                  圀䠀䔀刀䔀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀ 
                    AND tag_tree_hierarchyid.GetLevel() = @new_parent_hierarchyid.GetLevel() + 1;਀ 
                 SET @new_hierarchyid = @new_parent_hierarchyid.GetDescendant(@new_sibling_hierarchyid, NULL);਀ 
             END਀ 
			  IF NOT( @new_parent_hierarchyid IS NOT NULL AND @current_hierarchyid.GetAncestor(1) = @new_parent_hierarchyid) -- If the new parent is same as existing parent do nothing. ਀ऀऀऀ    䈀䔀䜀䤀一 
					-- Calculate the new hierarchy ID for the node being moved਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 㴀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䐀攀猀挀攀渀搀愀渀琀⠀䴀䄀堀⠀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀Ⰰ 一唀䰀䰀⤀ 
					FROM tagging.tag_tree_nodes਀ऀऀऀऀऀ圀䠀䔀刀䔀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䄀渀挀攀猀琀漀爀⠀㄀⤀ 㴀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀㬀 
਀ऀऀऀऀऀⴀⴀ 䤀昀 椀琀✀猀 琀栀攀 昀椀爀猀琀 挀栀椀氀搀Ⰰ 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 眀椀氀氀 戀攀 一唀䰀䰀 昀爀漀洀 琀栀攀 愀戀漀瘀攀Ⰰ  
					-- so handle that:਀ऀऀऀऀऀ䤀䘀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 䤀匀 一唀䰀䰀  
						SET @new_hierarchyid = @new_parent_hierarchyid.GetDescendant(NULL, NULL);਀ 
					-- Apply the move to the entire subtree਀ऀऀऀऀऀ唀倀䐀䄀吀䔀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
					SET tag_tree_hierarchyid = tag_tree_hierarchyid.GetReparentedValue(@current_hierarchyid, @new_hierarchyid)਀ऀऀऀऀऀ圀䠀䔀刀䔀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀㬀 
		        END਀ऀऀऀ䔀䰀匀䔀 
			   SET @newnode = @current_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਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     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: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Replaces the tag at a given tag relationship tree node.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_tag_tree_tag] ਀ 
     @tag_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;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    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਀ 
   -- Validate the new tag id਀ 
   	  -- Check if a tag was supplied਀ऀ  䤀䘀 䀀渀攀眀开琀愀最椀搀 㴀 　  
	    SET @new_tagid = 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਀ 
		 ELSE  -- Tag exists.  Check if the user has rights to edit the tag਀               ⴀⴀ 䄀搀搀椀渀最 愀 琀愀最 琀漀 愀 爀攀氀愀琀椀漀渀猀栀椀瀀 琀爀攀攀 挀栀愀渀最攀猀 琀栀攀 琀愀最 昀甀渀挀琀椀漀渀 
	           -- Hence the user must have edit rights for the tag in order to add it to a tree.਀ऀऀऀ  䈀䔀䜀䤀一 
				EXEC [internal].[usp_AUTHENTICATE_tag_edit]਀ऀऀऀऀऀ 䀀琀愀最开椀搀开攀瀀 㴀 䀀渀攀眀开琀愀最椀搀Ⰰ 
					 @user_authentication_result_tag = @temp_userauth_status OUTPUT;਀ऀऀऀऀ  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'NoTagPermission', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						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਀ऀऀऀ  唀倀䐀䄀吀䔀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
				 SET   tag_id਀ऀऀऀऀ     㴀 䀀渀攀眀开琀愀最椀搀 
			   WHERE   tag_tree_node_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.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 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: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record from workflow_instances.workflow_step_input_files.  ਀ⴀⴀ 䄀氀氀 漀氀搀 愀渀搀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 洀甀猀琀 戀攀 猀攀渀琀⸀ 
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀昀开椀渀瀀甀琀开猀琀攀瀀开昀椀氀攀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ     
	 @input_step_id bigint,਀ऀ 䀀渀攀眀开昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ     
	 @new_input_step_id bigint,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @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 @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 old file ID਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 				@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), @new_fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  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਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 椀搀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 
਀ऀ  䤀䘀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 㴀 　 
		 SET @input_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਀ऀऀऀऀ䔀一䐀 
਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 
਀ऀऀⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 椀渀瀀甀琀 猀琀攀瀀 椀搀⸀  
਀ऀ  䤀䘀 䀀渀攀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀 㴀 　 
		 SET @new_input_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 椀渀瀀甀琀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @new_input_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 input step id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀渀瀀甀琀 猀琀攀瀀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_instance_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
							 WHERE workflow_instance_step_id = @new_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 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 if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
	    (SELECT workflow_input_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 
		  WHERE    file_id਀ऀऀ        㴀 䀀昀椀氀攀椀搀ऀऀ   
		    AND workflow_input_step_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_step_input_files਀ऀऀ  圀䠀䔀刀䔀        昀椀氀攀开椀搀 
		        = @new_fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀  
		        =   @new_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.');਀ऀ    䔀一䐀 
਀ 
   END  --END IF @data_validation_status = 'Pass' Check if a duplicate record already exists਀ 
	  -- 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 file_id                   = @new_fileid,਀ऀऀऀ    眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀    㴀 䀀渀攀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀 
		  WHERE    file_id਀ऀऀ        㴀 䀀昀椀氀攀椀搀ऀऀ   
		    AND workflow_input_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਀  
਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- as an authoriser. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_authoriser] ਀ 
	@user_authentication_result nvarchar(10) = 'Fail' OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@connectedusersid varbinary(100)            = SUSER_SID(ORIGINAL_LOGIN()); -- The SID of the connected user਀ 
਀ऀऀ匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀㬀 
਀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀  栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
਀  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 䄀匀 愀猀椀   
                   FROM user_restr.authorisers AS a਀ऀ     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		            ON a.authoriser_sid_id਀ऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
			  WHERE sl.sid = @connectedusersid)਀    ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	  SET @user_authentication_result = 'Pass';਀  䔀䰀匀䔀 
	  SET @user_authentication_result = 'Fail'; ਀ 
END਀ 
਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_cont_doc_grp]    Script Date: Tue 12-05-2026 5:43:19 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 document 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_doc_grp] ਀ 
	@contr_doc_grp_to_check 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 might be output as null to calling functions.਀  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开挀攀瀀  㴀 ✀䘀愀椀氀✀ 
਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
			  ਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀ऀऀऀ   
਀ 
		IF EXISTS ਀ऀऀऀ  ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
				 FROM user_restr.sid_list AS sl਀ऀऀ   䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀搀最猀氀 
				   ON      sl.sid_id਀ऀऀऀऀऀ  㴀 挀搀最猀氀⸀猀椀搀开椀搀 
		   INNER JOIN xref.controller_doc_group_names AS cdgn ਀ऀऀऀऀ   伀一  挀搀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
					  = cdgn.controller_doc_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: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 
-- of a given controller file 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਀ऀऀ䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀  渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 一唀䰀䰀Ⰰ 
		@iscontroller 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_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;			  ਀ 
਀ऀऀ䤀䘀 䔀堀䤀匀吀匀  
			  (SELECT sl.sid_id਀ऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		   INNER JOIN user_restr.controller_file_grp_sid_links AS cdgsl਀ऀऀऀऀ   伀一      猀氀⸀猀椀搀开椀搀 
					  = cdgsl.sid_id਀ऀऀ   䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 挀搀最渀  
				   ON  cdgsl.controller_file_group_name_id਀ऀऀऀऀऀ  㴀 挀搀最渀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
	 			WHERE cdgsl.controller_file_group_name_id = @contr_file_grp_to_check਀ऀऀऀऀ  䄀一䐀  猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀  
  			           )਀ऀऀ     䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 
		 SET @user_authentication_result_cep = 'Pass';਀ऀऀ 䔀䰀匀䔀 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开挀攀瀀 㴀 ✀䘀愀椀氀✀㬀 
਀    
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_doc_ed_perm]    Script Date: Tue 12-05-2026 5:43:19 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'.਀ 
  -- To have edit permission for a document the user must first have view permission for that document.਀  ⴀⴀ 嘀椀攀眀椀渀最 爀攀猀琀爀椀挀琀椀漀渀猀 漀瘀攀爀爀椀搀攀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀⸀   
  -- Edit permissions work differently from view permissions.  With view permissions a document਀  ⴀⴀ 椀猀 瘀椀攀眀愀戀氀攀 戀礀 搀攀昀愀甀氀琀⸀  圀椀琀栀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 爀攀猀琀爀椀挀琀攀搀 戀礀 搀攀昀愀甀氀琀⸀  
  -- A user has edit permission for a document if there is a chain from the document ID through਀  ⴀⴀ 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 猀椀搀 椀渀 琀栀攀 猀椀搀 氀椀猀琀 眀栀椀挀栀 椀猀 琀栀攀 猀椀搀 昀漀爀 琀栀攀 甀猀攀爀 漀爀 愀 猀椀搀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀⸀ 
  -- If user is a controller then they have editing rights to any document they have viewing rights to਀  ⴀⴀ 攀砀挀攀瀀琀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 眀栀椀挀栀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
  -- If the document 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਀  ⴀⴀ 攀砀挀氀甀搀攀 愀渀搀 漀瘀攀爀爀椀搀攀 愀渀礀 攀搀椀琀漀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  䄀 挀漀渀琀爀漀氀氀攀爀 挀愀渀渀漀琀 搀攀氀攀最愀琀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  
਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
਀ऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀Ⰰ 
	@user_authentication_result_dep nvarchar(10) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)            = NULL, -- The SID of the connected user਀ऀऀ䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀  渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 一唀䰀䰀Ⰰ 
		@iscontroller nvarchar(5)          = NULL,਀ऀऀ䀀搀漀挀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 渀瘀愀爀挀栀愀爀⠀㔀⤀  㴀 一唀䰀䰀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @user_authentication_result_dep  = 'Fail'਀ 
  SET @usersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀ 
਀ 
  -- Check if the user has viewing permission for the document.਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀 
         @doc_id_to_check = @doc_id_to_check_ep,਀ऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀 伀唀吀倀唀吀㬀 
਀  䤀䘀 䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀 㴀 ✀倀愀猀猀✀ ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
    BEGIN ਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀 
      -- If user is a controller then they have editing rights to any document they have viewing rights to਀ऀ  ⴀⴀ 攀砀挀攀瀀琀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 眀栀椀挀栀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⴀⴀ 䤀猀 琀栀攀 搀漀挀 椀搀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀㼀 
	    (SELECT cdgl.doc_id ਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 挀搀最氀 
		  WHERE cdgl.doc_id = @doc_id_to_check_ep)਀ऀ  匀䔀吀 䀀搀漀挀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀夀攀猀✀ 
	  ELSE SET @dociscontrollergroup = 'No';਀ 
਀ऀ  䤀䘀 䀀搀漀挀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀夀攀猀✀ ⴀⴀ 䤀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀Ⰰ 琀攀猀琀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀 琀栀愀琀 最爀漀甀瀀 愀渀搀 椀猀 愀氀猀漀 愀 挀漀渀琀爀漀氀氀攀爀 
	  BEGIN ਀ऀऀ䤀䘀 ⠀䔀堀䤀匀吀匀  
			  (SELECT sl.sid_id਀ऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			LEFT JOIN user_restr.controller_doc_group_sid_links AS cdgsl਀ऀऀऀऀ   伀一      猀氀⸀猀椀搀开椀搀 
					  = cdgsl.sid_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 挀搀最渀  
				   ON  cdgsl.controller_doc_group_name_id਀ऀऀऀऀऀ  㴀 挀搀最渀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
			LEFT JOIN xref.controller_doc_group_links AS cdgl਀ऀऀऀऀ   伀一   挀搀最渀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
					  = cdgl.controller_doc_group_name_id਀ऀ ऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀   ऀऀऀ       
				  AND cdgl.doc_id = @doc_id_to_check_ep))਀ऀऀ 䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 
		 SET @user_authentication_result_dep = 'Pass';਀ऀऀ 䔀䰀匀䔀 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 ✀䘀愀椀氀✀㬀 
	 END਀ऀ 䔀䰀匀䔀 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 ✀倀愀猀猀✀㬀 
		਀ऀ  ⴀⴀ 䤀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 琀栀攀渀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 
	  -- rights to any document they have viewing rights to. ਀ 
਀ऀ  䤀䘀 䀀搀漀挀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀一漀✀ 䄀一䐀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 ✀倀愀猀猀✀ ⴀⴀ 吀栀攀 甀猀攀爀 椀猀 渀漀琀 攀砀挀氀甀搀攀搀 戀礀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 爀攀猀琀爀椀挀琀椀漀渀猀 
	  -- If the user is not excluded by controller level permissions but the document is not part of a controller group then permission will be determined by this segment.਀ऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 琀栀爀漀甀最栀 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 
		   IF @iscontroller = 'Pass' SET @user_authentication_result_dep = 'Pass'  -- If the user is a controller at this step then they are granted permission਀ऀऀ   䔀䰀匀䔀 ⴀⴀ 唀猀攀爀 椀猀 渀漀琀 愀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 椀猀 渀漀琀 攀砀挀氀甀搀攀搀 戀礀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀猀 
		    BEGIN਀ऀऀऀ  䤀䘀   
			        (EXISTS (SELECT df.function_id AS dfid਀ऀऀऀऀऀ           䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
						  LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀऀऀऀ            伀一   搀椀氀⸀搀漀挀开椀搀 
									   = dgl.doc_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
						            ON   dgl.doc_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
						  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 (dil.doc_id = @doc_id_to_check_ep਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀⤀ 
  							         ਀                     唀一䤀伀一 䄀䰀䰀 
਀ऀऀऀऀऀ        ⠀匀䔀䰀䔀䌀吀 瀀氀⸀猀椀搀开椀搀 䄀匀 猀椀搀 
					           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.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_result_dep = 'Pass';਀ऀऀऀऀऀ䔀一䐀 
				ELSE਀ऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 ✀䘀愀椀氀✀㬀 ⴀⴀ 吀栀攀 甀猀攀爀 椀猀 渀漀琀 愀 䌀漀渀琀爀漀氀氀攀爀 愀渀搀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀ 
		END -- END ELSE IF @dociscontrollergroup = 'Yes'਀ऀ 䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀搀漀挀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀一漀✀ 䄀一䐀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 ✀倀愀猀猀✀  
  END  --IF @view_permission = 'Pass' -- The user has viewing permission for the document਀    
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_doc_grp_ed_pm]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㠀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Checks whether the connected user has edit 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_doc_grp_ed_pm] ਀ 
	@doc_grp_to_check_ep bigint = NULL,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开搀最攀瀀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀㬀 ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
 ਀ 
਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀  ⴀⴀ 吀漀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 搀漀挀甀洀攀渀琀 琀栀攀 甀猀攀爀 洀甀猀琀 昀椀爀猀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀愀琀 搀漀挀甀洀攀渀琀 
  -- Edit permissions work differently from view permissions.  With view permissions a document਀  ⴀⴀ 椀猀 瘀椀攀眀愀戀氀攀 戀礀 搀攀昀愀甀氀琀⸀  圀椀琀栀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 爀攀猀琀爀椀挀琀攀搀 戀礀 搀攀昀愀甀氀琀⸀  
  -- A user has edit permission for a document if there is a chain from the document ID through਀  ⴀⴀ 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 猀椀搀 椀渀 琀栀攀 猀椀搀 氀椀猀琀 眀栀椀挀栀 椀猀 琀栀攀 猀椀搀 昀漀爀 琀栀攀 甀猀攀爀 漀爀 愀 猀椀搀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀⸀ 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀ 
਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
		@docgroupid_to_check_vp = @doc_grp_to_check_ep,਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开搀最攀瀀 伀唀吀倀唀吀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 琀栀爀漀甀最栀 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 
			  IF  @user_authentication_reslt_dgep = 'Pass'਀ऀऀऀ      䄀一䐀 
਀ऀऀऀ        ⠀䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 䄀匀 搀昀椀搀 
					           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਀ऀऀऀऀऀऀऀऀऀ   㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						  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 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 dgn.doc_group_id = @doc_grp_to_check_ep਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							         ))) ਀ 
					BEGIN  -- The user has permission for this action਀ऀऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开搀最攀瀀 㴀 ✀倀愀猀猀✀㬀 
					END਀ऀऀऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀⸀  
				  SET @user_authentication_reslt_dgep = 'Fail';਀ऀ  
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_file_ed_free]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀      匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-12-2023਀⼀⨀ 
 Description: Check if a file is free from edit restrictions for the connected user਀ 吀栀椀猀 椀猀 渀漀琀 琀栀攀 猀愀洀攀 愀猀 挀栀攀挀欀椀渀最 椀昀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀⸀ 
 By default a user does not have edit permission for a file unless it is explicitly granted਀ 吀栀椀猀 挀栀攀挀欀 攀猀琀愀戀氀椀猀栀攀猀 椀昀 攀椀琀栀攀爀 琀栀攀 昀椀氀攀 椀猀 昀爀攀攀 昀爀漀洀 愀渀礀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 爀攀猀琀爀椀挀琀椀漀渀猀 
 or the user already has edit permission.  The procedure is used to check if it is ok ਀ 昀漀爀 愀 甀猀攀爀 琀漀 最爀愀渀琀 琀栀攀猀攀氀瘀攀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 最椀瘀攀渀 昀椀氀攀⸀  
 Otherwise permission must be granted by a controler਀ 䤀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 匀䤀䐀 攀砀椀猀琀猀 椀渀 愀渀礀 瀀愀琀栀眀愀礀 琀栀攀渀 琀栀攀 挀栀攀挀欀 瀀愀猀猀攀猀 
 If there are no SIDs for any user linked in any pathway the the check passes਀ 䤀渀 愀氀氀 漀琀栀攀爀 挀愀猀攀猀 琀栀攀 挀栀攀挀欀 昀愀椀氀猀⸀  
 Input is the file ID to check.਀ 伀甀琀瀀甀琀 椀猀 愀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 椀渀搀椀挀愀琀椀渀最 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
*/਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开昀爀攀攀崀  
਀    䀀昀椀氀攀椀搀开琀漀挀栀攀挀欀                         戀椀最椀渀琀Ⰰ 
    @user_authentication_reslt_fgef  nvarchar(10) OUTPUT਀䄀匀 
BEGIN਀    匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀    ⴀⴀ 䐀攀挀氀愀爀攀 瘀愀爀椀愀戀氀攀猀 
    DECLARE਀ऀ    䀀甀猀攀爀猀椀搀  瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀           㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@fileiscontrollergroup nvarchar(5) = NULL;਀ 
	SET @usersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀ 
    -- Default user authentication result to Fail਀    匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀昀 㴀 ✀䘀愀椀氀✀㬀 
਀ऀⴀⴀ 䘀愀椀氀 椀昀 琀栀攀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 愀渀礀 挀漀渀琀爀漀氀氀攀爀 攀搀椀琀 最爀漀甀瀀⸀ 
	-- Otherwise:਀ऀⴀⴀ 倀愀猀猀 椀昀 琀栀攀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 愀 匀䤀䐀 琀栀愀琀 椀渀挀氀甀搀攀猀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀ 
	-- Pass if the file is not linked to any SIDs਀ऀⴀⴀ 䘀愀椀氀 漀琀栀攀爀眀椀猀攀 
਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⴀⴀ 䤀猀 琀栀攀 昀椀氀攀 椀搀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀㼀 
	    (SELECT cfgl.file_id ਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 挀昀最氀 
		  WHERE cfgl.file_id = @fileid_tocheck)਀ऀऀ䈀䔀䜀䤀一 
		 SET @fileiscontrollergroup = 'Yes';਀ऀऀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀昀 㴀 ✀䘀愀椀氀✀㬀 
	    END਀ऀ  䔀䰀匀䔀  匀䔀吀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀一漀✀㬀 
਀ 
 IF @fileiscontrollergroup = 'No'  -- File listed in a controller group overrides other permissions਀   䈀䔀䜀䤀一 
	-- Check if the  connected user SID is linked through either pathway਀    䤀䘀 䔀堀䤀匀吀匀 ⠀ 
            SELECT fgl.file_group_id    -- Check through duty function lists਀              䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        INNER JOIN user_restr.file_group_edit_perm_funct_lst AS fgepfl਀                伀一      昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
			       = fgepfl.file_group_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
                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 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';਀    䔀一䐀 
਀ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 愀渀礀 匀䤀䐀 
    IF  @user_authentication_reslt_fgef = 'Fail' -- The connected user SID has not been already found to be linked਀ऀ   䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
            SELECT fgl.file_group_id    -- Check through duty function lists਀              䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        INNER JOIN user_restr.file_group_edit_perm_funct_lst AS fgepfl਀                伀一      昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
			       = fgepfl.file_group_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
                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਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀开琀漀挀栀攀挀欀 
਀        唀一䤀伀一 
            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਀             圀䠀䔀刀䔀 昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀开琀漀挀栀攀挀欀 
    )਀    䈀䔀䜀䤀一 
        -- If the file is not linked to any users, set result to Pass਀        匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀昀 㴀 ✀倀愀猀猀✀㬀 
    END਀ 
 END -- END IF @fileiscontrollergroup = 'No'  -- File listed in a controller group overrides other permissions਀    ⴀⴀ 吀栀攀 爀攀猀甀氀琀 椀猀 爀攀琀甀爀渀攀搀 瘀椀愀 琀栀攀 伀唀吀倀唀吀 瀀愀爀愀洀攀琀攀爀 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_file_ed_perm]    Script Date: Tue 12-05-2026 5:43:19 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'.਀ 
  -- A user has edit permission for a file if there is a chain from the file ID through਀  ⴀⴀ 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 猀椀搀 椀渀 琀栀攀 猀椀搀 氀椀猀琀 眀栀椀挀栀 椀猀 琀栀攀 猀椀搀 昀漀爀 琀栀攀 甀猀攀爀 漀爀 愀 猀椀搀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀⸀ 
  -- If user is a controller then they have editing rights to any file they have viewing rights to਀  ⴀⴀ 攀砀挀攀瀀琀 椀昀 琀栀攀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀Ⰰ 琀栀攀渀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 渀漀琀 瀀愀爀琀 漀昀 琀栀愀琀 最爀漀甀瀀 
  -- 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_fep nvarchar(10) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)            = NULL, -- The SID of the connected user਀ऀऀ䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀  渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 一唀䰀䰀Ⰰ 
		@iscontroller nvarchar(5)          = NULL,਀ऀऀ䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 渀瘀愀爀挀栀愀爀⠀㔀⤀ 㴀 一唀䰀䰀㬀ऀऀ㬀  
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @user_authentication_result_fep  = 'Fail'਀ 
  SET @usersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀ 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀⸀ 
  EXEC [internal].[usp_AUTHENTICATE_user_file_id]਀         䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀Ⰰ 
		 @user_authentication_result = @view_permission OUTPUT;਀ 
   IF @view_permission = 'Pass' -- The user has viewing permission for the file਀    䈀䔀䜀䤀一  
      ਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀 
਀ 
	  IF EXISTS -- Is the file id linked to a controller group?਀ऀ    ⠀匀䔀䰀䔀䌀吀 挀昀最氀⸀昀椀氀攀开椀搀  
		   FROM xref.controller_file_group_links AS cfgl਀ऀऀ  圀䠀䔀刀䔀 挀昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀⤀ 
	  SET @fileiscontrollergroup = 'Yes'਀ऀ  䔀䰀匀䔀 匀䔀吀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀一漀✀㬀 
਀ 
	  IF @fileiscontrollergroup = 'Yes' -- If the file 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_file_group_names AS cfgn ਀ऀऀऀऀ   伀一  挀昀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
					  = cfgn.controller_file_group_name_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 挀昀最氀 
				   ON   cfgn.controller_file_group_name_id਀ऀऀऀऀऀ  㴀 挀昀最氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
	 			WHERE sl.sid = @usersid   			      ਀ऀऀऀऀ  䄀一䐀 挀昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀⤀⤀ 
		    AND @iscontroller = 'Pass'਀ऀऀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 ✀倀愀猀猀✀㬀 
		 ELSE SET @user_authentication_result_fep = 'Fail';਀ऀ 䔀一䐀 
	 ELSE SET @user_authentication_result_fep = 'Pass';਀ 
	  -- If the file is not linked to a controller group then if the user is a controller then they have editing਀ऀ  ⴀⴀ 爀椀最栀琀猀 琀漀 愀渀礀 昀椀氀攀 琀栀攀礀 栀愀瘀攀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
਀ऀ  䤀䘀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀一漀✀ 䄀一䐀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 ✀倀愀猀猀✀ ⴀⴀ 吀栀攀 甀猀攀爀 椀猀 渀漀琀 攀砀挀氀甀搀攀搀 戀礀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 爀攀猀琀爀椀挀琀椀漀渀猀 
	  -- If the user is not excluded by controller level permissions but the file is not part of a controller group then permission will be determined by this segment.਀ऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 昀椀氀攀 最爀漀甀瀀 琀栀爀漀甀最栀 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 
		   IF @iscontroller = 'Pass' SET @user_authentication_result_fep = 'Pass'  -- If the user is a controller at this step then they are granted permission਀ऀऀ   䔀䰀匀䔀 ⴀⴀ 唀猀攀爀 椀猀 渀漀琀 愀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 椀猀 渀漀琀 攀砀挀氀甀搀攀搀 戀礀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀猀 
		    BEGIN਀ऀऀऀ  䤀䘀   
				     (EXISTS (SELECT fgn.file_group_id    -- Check through duty function lists਀ऀऀऀऀऀ           䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
						  LEFT JOIN xref.file_group_links AS fgl਀ऀऀऀऀऀऀ            伀一    昀洀⸀昀椀氀攀开椀搀 
									   = fgl.file_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
						            ON   fgl.file_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
						  LEFT JOIN user_restr.file_group_edit_perm_funct_lst AS fgepfl਀ऀऀऀऀऀऀ            伀一      昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
									   = fgepfl.file_group_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
						            ON fgepfl.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 fgl.file_id = @file_id_to_check_ep਀ऀऀऀऀऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							          ਀                    唀一䤀伀一 䄀䰀䰀 
				            (SELECT fgn.file_group_id  -- Check through people lists਀ऀऀऀऀऀ           䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
						  LEFT JOIN xref.file_group_links AS fgl਀ऀऀऀऀऀऀ            伀一    昀洀⸀昀椀氀攀开椀搀 
									   = fgl.file_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
						            ON   fgl.file_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
						  LEFT JOIN user_restr.file_group_edit_perm_ppl_lst AS fgeppl਀ऀऀऀऀऀऀ            伀一      昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
									   = fgeppl.file_group_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
						            ON fgeppl.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						  LEFT JOIN people.people_lists AS pl਀ऀऀऀऀऀऀ            伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   = pl.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON   pl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE fgl.file_id = @file_id_to_check_ep਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							         ))) ਀ऀऀऀऀऀ 
					BEGIN  -- The user has permission for this action਀ऀऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 ✀倀愀猀猀✀㬀 
					END਀ऀऀऀऀ䔀䰀匀䔀 
				  SET @user_authentication_result_fep = 'Fail'; -- The user is not a controller and does not have edit permission.਀ऀऀ䔀一䐀 ⴀⴀ 䔀一䐀 䔀䰀匀䔀 䤀䘀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀夀攀猀✀ 
	 END -- END IF @fileiscontrollergroup = 'No' AND @user_authentication_result_dep = 'Pass' ਀  䔀一䐀  ⴀⴀ䤀䘀 䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀 㴀 ✀倀愀猀猀✀ ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
  ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀氀开最爀瀀开攀搀开瀀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:      Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㄀ⴀ㈀　㈀㐀 
/*਀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䌀栀攀挀欀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀⸀ 
 Checks if there is any link from the file group through to the SID list for the connected user.਀ 伀甀琀瀀甀琀 椀猀 愀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 椀渀搀椀挀愀琀椀渀最 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
*/਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀⼀⨀⨀ 
* Check if the connected user has edit permission for a given file group.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @filegroupid_tocheck bigint  Must be a non-null and non-empty valid identifier.਀⨀ 
* **Return Values:**਀⨀ 
* @user_authentication_reslt_fgep  nchar(10).਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - None.  The procedure relies on the calling procedure to validate the input data਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - There must be an existing record with a matching @filegroupid_tocheck.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 愀渀 漀甀琀瀀甀琀 瘀愀氀甀攀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀氀开最爀瀀开攀搀开瀀洀崀  
਀    䀀昀椀氀攀最爀漀甀瀀椀搀开琀漀挀栀攀挀欀                     戀椀最椀渀琀Ⰰ 
    @user_authentication_reslt_fgep  nvarchar(10) OUTPUT਀䄀匀 
BEGIN਀    匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀    ⴀⴀ 䐀攀挀氀愀爀攀 瘀愀爀椀愀戀氀攀猀 
    DECLARE @usersid  varbinary(100) = SUSER_SID(ORIGINAL_LOGIN()); -- The SID of the connected user਀ 
    -- Default user authentication result to Pass਀    匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀瀀 㴀 ✀䘀愀椀氀✀㬀 
਀ 
	-- Check if the  connected user SID is linked through either pathway਀    䤀䘀 䔀堀䤀匀吀匀 ⠀ 
            SELECT fgepfl.file_group_id    -- Check through duty function lists਀              䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 
        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 fgepfl.file_group_id= @filegroupid_tocheck਀ऀऀ           䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀  
  			            ਀        唀一䤀伀一 
            SELECT fgeppl.file_group_id  -- Check through people lists਀              䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀 
        INNER JOIN people.people_lists AS pl਀                伀一  昀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
				   =    pl.people_list_id਀        䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                ON   pl.sid_id ਀ऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
             WHERE fgeppl.file_group_id= @filegroupid_tocheck਀ऀऀ           䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  			        ਀    ⤀ 
    BEGIN਀        ⴀⴀ 䤀昀 琀栀攀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 匀䤀䐀猀 琀栀愀琀 椀渀挀氀甀搀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀Ⰰ 猀攀琀 爀攀猀甀氀琀 琀漀 倀愀猀猀 
        SET @user_authentication_reslt_fgep = 'Pass';਀    䔀一䐀 
਀ 
਀    ⴀⴀ 吀栀攀 爀攀猀甀氀琀 椀猀 爀攀琀甀爀渀攀搀 瘀椀愀 琀栀攀 伀唀吀倀唀吀 瀀愀爀愀洀攀琀攀爀 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_tag_br_tree]    Script Date: Tue 12-05-2026 5:43:19 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.਀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 爀椀最栀琀猀 琀漀 愀渀礀 琀愀最 琀爀攀攀 戀礀 搀攀昀愀甀氀琀⸀  
  -- The user also has permission if the tree is linked directly to the SID_ID via the sid_id column. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开戀爀开琀爀攀攀崀  
਀ऀ䀀琀愀最开戀爀琀爀攀攀椀搀开攀瀀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ 
	@user_authentication_result_bt nvarchar(10) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)            = NULL, -- The SID of the connected user਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 眀椀氀氀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @user_authentication_result_bt  = '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 ਀ 
਀ऀऀ 䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀 㴀 ✀倀愀猀猀✀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 愀琀 琀栀椀猀 猀琀攀瀀 琀栀攀渀 琀栀攀礀 愀爀攀 最爀愀渀琀攀搀 瀀攀爀洀椀猀猀椀漀渀 
਀         䤀䘀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀 㰀㸀 ✀倀愀猀猀✀   ⴀⴀ 唀猀攀爀 椀猀 渀漀琀 愀 挀漀渀琀爀漀氀氀攀爀            
		    BEGIN਀ऀऀऀ  䤀䘀   
			        (EXISTS (SELECT sl.sid_id AS sid਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀 
						 INNER JOIN user_restr.tag_br_tree_permissions_flist AS tbtpf਀ऀऀऀऀऀऀ         伀一    琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
								    = tbtpf.tag_browsing_tree_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
						            ON   tbtpf.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 tbtn.tag_browsing_tree_id = @tag_brtreeid_ep਀ऀऀऀऀऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							         ਀                     唀一䤀伀一 䄀䰀䰀 
਀ऀऀऀऀऀ        ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 䄀匀 猀椀搀 
					           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਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀戀琀渀㈀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开戀爀琀爀攀攀椀搀开攀瀀 
									 AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀ         ⤀⤀⤀  
਀ऀऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					  SET @user_authentication_result_bt = 'Pass';਀ऀऀऀऀऀ䔀一䐀 
	 END -- END IF @user_authentication_result_bt <> 'Pass'਀ 
਀     ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 搀椀爀攀挀琀氀礀 琀漀 琀栀攀 最椀瘀攀渀 戀爀漀眀猀椀渀最 琀爀攀攀 䤀䐀⸀ 
     IF @user_authentication_result_bt <> 'Pass'  ਀ऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀ 匀䔀䰀䔀䌀吀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀    
				    FROM tagging.tag_browsing_tree_names AS tbtn਀ऀऀऀ  䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			  	      ON  tbtn.sid_id਀ऀऀऀऀऀऀ  㴀  猀氀⸀猀椀搀开椀搀 
				   WHERE sl.sid = @usersid਀ऀऀऀऀ     䄀一䐀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
					     = @tag_brtreeid_ep਀  ऀऀऀऀ         ⤀ 
			BEGIN  -- The user has permission for this action਀ऀऀऀऀ匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀 㴀 ✀倀愀猀猀✀㬀 
			END਀ 
਀    
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_tag_edit]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 琀漀 攀搀椀琀 愀 最椀瘀攀渀 琀愀最⸀  
-- Input is a the id of the tag to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 䄀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 琀愀最 椀昀 攀椀琀栀攀爀 琀栀攀爀攀 愀爀攀 渀漀 挀栀愀椀渀 昀爀漀洀 琀栀攀 琀愀最 最爀漀甀瀀 䤀䐀 琀栀爀漀甀最栀 琀漀 愀渀礀 甀猀攀爀Ⰰ  
  -- or if the tag is linked to a tag group that the user has rights to.਀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 爀椀最栀琀猀 琀漀 攀搀椀琀 愀渀礀 琀愀最 戀礀 搀攀昀愀甀氀琀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_tag_edit] ਀ 
	@tag_id_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;਀      ⴀⴀ 䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 爀椀最栀琀猀 琀漀 愀渀礀 琀愀最 最爀漀甀瀀  
਀ऀऀ 䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㴀 ✀倀愀猀猀✀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 愀琀 琀栀椀猀 猀琀攀瀀 琀栀攀渀 琀栀攀礀 愀爀攀 最爀愀渀琀攀搀 瀀攀爀洀椀猀猀椀漀渀 
਀ऀऀ 䤀䘀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㰀㸀 ✀倀愀猀猀✀ 䄀一䐀  ⴀⴀ 唀猀攀爀 椀猀 渀漀琀 愀 挀漀渀琀爀漀氀氀攀爀⸀  䤀昀 琀栀攀爀攀 愀爀攀 渀漀 琀愀最 最爀漀甀瀀猀 氀椀渀欀攀搀 琀栀攀渀 瀀愀猀猀⸀ 
              NOT EXISTS (SELECT tag_id਀ऀऀ                    䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 䄀匀 琀琀琀最氀 
				  		   WHERE tttgl.tag_id਀ऀऀऀऀऀऀ         㴀    䀀琀愀最开椀搀开攀瀀⤀ 
			  BEGIN਀ऀऀऀ    匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㴀 ✀倀愀猀猀✀ 
			  END਀ 
	 -- If there are no users linked to the tag through a tag group then pass਀ऀऀ 䤀䘀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㰀㸀 ✀倀愀猀猀✀ 䄀一䐀 
		   NOT 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਀ 
					UNION ALL਀ 
						(SELECT sl.sid_id ਀ऀऀ                   䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀㈀ 
					 INNER JOIN tagging.tag_to_tag_group_links AS tttgl2਀ऀऀऀऀऀ         伀一      搀琀㈀⸀琀愀最开椀搀 
							    = tttgl2.tag_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最椀渀㈀ 
					         ON    tttgl2.tag_group_id਀ऀऀऀऀऀऀऀ    㴀 琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开椀搀 
					 INNER JOIN user_restr.tag_group_permissions_plist AS tgpp਀ऀऀऀऀऀ ऀऀ 伀一   琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开椀搀 
								= tgpp.tag_group_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
							 ON   tgpp.people_list_id਀ऀऀऀऀऀऀऀऀ㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					 INNER JOIN people.people_lists AS pl਀ऀऀऀऀऀऀऀ 伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
								= pl.people_list_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
							 ON   pl.sid_id਀ऀऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
						  WHERE dt2.tag_id = @tag_id_ep									਀ऀऀऀऀऀऀऀऀ⤀⤀⤀  
 				  BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㴀 ✀倀愀猀猀✀ 
				  END          ਀ 
਀    ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀栀爀漀甀最栀 琀漀 琀栀攀 琀愀最 琀栀爀漀甀最栀 愀 琀愀最 最爀漀甀瀀 琀栀攀渀 瀀愀猀猀 
	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਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 搀琀⸀琀愀最开椀搀 㴀 䀀琀愀最开椀搀开攀瀀 
							  AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀऀ 
					UNION ALL਀ 
						(SELECT sl.sid_id ਀ऀऀ                   䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀㈀ 
					 INNER JOIN tagging.tag_to_tag_group_links AS tttgl2਀ऀऀऀऀऀ         伀一      搀琀㈀⸀琀愀最开椀搀 
							    = tttgl2.tag_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最椀渀㈀ 
					         ON    tttgl2.tag_group_id਀ऀऀऀऀऀऀऀ    㴀 琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开椀搀 
					 INNER JOIN user_restr.tag_group_permissions_plist AS tgpp਀ऀऀऀऀऀ ऀऀ 伀一   琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开椀搀 
								= tgpp.tag_group_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
							 ON   tgpp.people_list_id਀ऀऀऀऀऀऀऀऀ㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					 INNER JOIN people.people_lists AS pl਀ऀऀऀऀऀऀऀ 伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
								= pl.people_list_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
							 ON   pl.sid_id਀ऀऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
						WHERE dt2.tag_id = @tag_id_ep਀ऀऀऀऀऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  									))) ਀ ऀऀऀऀ   
				BEGIN  -- The user has permission for this action਀ऀऀऀऀऀ匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㴀 ✀倀愀猀猀✀㬀 
				END਀    
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_tag_group]    Script Date: Tue 12-05-2026 5:43:19 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'.਀ 
-- This is used to authenticate a user for linking tags to a tag group. ਀ 
  -- A user has permission for a tag group if there is a chain from the tag group ID through਀  ⴀⴀ 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 猀椀搀 椀渀 琀栀攀 猀椀搀 氀椀猀琀 眀栀椀挀栀 椀猀 琀栀攀 猀椀搀 昀漀爀 琀栀攀 甀猀攀爀 漀爀 愀 猀椀搀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀⸀ 
  -- If the user is a controller then they have rights to any tag group by default. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开最爀漀甀瀀崀  
਀ऀ䀀琀愀最开最爀漀甀瀀椀搀开攀瀀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ 
	@user_authentication_result_tg nvarchar(10) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)            = NULL, -- The SID of the connected user਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 眀椀氀氀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @user_authentication_result_tg  = '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 ਀ 
਀ऀऀ 䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀最 㴀 ✀倀愀猀猀✀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 愀琀 琀栀椀猀 猀琀攀瀀 琀栀攀渀 琀栀攀礀 愀爀攀 最爀愀渀琀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		   ELSE -- User is not a controller ਀ऀऀ    䈀䔀䜀䤀一 
			  IF  ਀ऀऀऀ        ⠀䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 䄀匀 猀椀搀 
					           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਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀最椀渀⸀琀愀最开最爀漀甀瀀开椀搀 㴀 䀀琀愀最开最爀漀甀瀀椀搀开攀瀀 
									 AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀ          
                     UNION ALL਀ 
					        (SELECT sl.sid_id AS sid਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最椀渀㈀ 
						 INNER JOIN user_restr.tag_group_permissions_plist AS tgpp਀ऀऀऀऀऀऀ         伀一   琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开椀搀 
								    = tgpp.tag_group_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
						            ON   tgpp.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN people.people_lists AS pl਀ऀऀऀऀऀऀ            伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   = pl.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON   pl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE tgin2.tag_group_id = @tag_groupid_ep਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							         ))) ਀ 
					BEGIN  -- The user has permission for this action਀ऀऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀最 㴀 ✀倀愀猀猀✀㬀 
					END਀ऀऀऀऀ䔀䰀匀䔀 
				  SET @user_authentication_result_tg = 'Fail'; -- The user is not a Controller and does not have edit permission.਀ 
	 END -- END ELSE IF @iscontroller = 'Pass' SET @user_authentication_result_tg = 'Pass'਀ 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开琀爀攀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to edit a given tag tree. ਀ⴀⴀ 䄀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
-- Input is a the id of the tag tree to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- A user has permission for a tag tree if there is a chain from the tag tree ID through਀  ⴀⴀ 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 猀椀搀 椀渀 琀栀攀 猀椀搀 氀椀猀琀 眀栀椀挀栀 椀猀 琀栀攀 猀椀搀 昀漀爀 琀栀攀 甀猀攀爀 漀爀 愀 猀椀搀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀⸀ 
  -- If the user is a controller then they have rights to any tag tree by default. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开琀爀攀攀崀  
਀ऀ䀀琀愀最开琀爀攀攀椀搀开攀瀀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ 
	@user_authentication_result_tt nvarchar(10) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)            = NULL, -- The SID of the connected user਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 眀椀氀氀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @user_authentication_result_tt  = '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 ਀ 
਀ऀऀ 䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀琀 㴀 ✀倀愀猀猀✀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 愀琀 琀栀椀猀 猀琀攀瀀 琀栀攀渀 琀栀攀礀 愀爀攀 最爀愀渀琀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		   ELSE -- User is not a controller ਀ऀऀ    䈀䔀䜀䤀一 
			  IF  ਀ऀऀऀ        ⠀䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 䄀匀 猀椀搀 
					           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 sl.sid = @usersid਀  ऀऀऀऀऀऀऀ          
                     UNION ALL਀ 
					        (SELECT sl.sid_id AS sid਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀㈀ 
						 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 ttn2.tag_tree_id = @tag_treeid_ep਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							         ))) ਀ 
					BEGIN  -- The user has permission for this action਀ऀऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀琀 㴀 ✀倀愀猀猀✀㬀 
					END਀ऀऀऀऀ䔀䰀匀䔀 
				  SET @user_authentication_result_tt = 'Fail'; -- The user is not a Controller and does not have edit permission.਀ 
	 END -- END ELSE IF @iscontroller = 'Pass' SET @user_authentication_result_tt = 'Pass'਀ 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to view a given document group.    ਀ⴀⴀ 䄀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
-- Input is a the id of the form to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
਀ऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 戀椀最椀渀琀Ⰰ 
	@user_authentication_result nchar(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਀ 
  -- User has permission for the document group if either the user is linked to਀  ⴀⴀ 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 瘀椀愀 搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 漀爀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 攀砀椀猀琀猀 戀甀琀 椀猀 渀漀琀 
  -- linked to any users via doc_group_view_permissions.਀       
  IF NOT ਀ऀऀ ⠀䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀最瘀瀀⸀猀椀搀开椀搀 䄀匀 搀最瘀瀀猀椀搀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
				   FROM user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						ON dgvp.sid_id਀ऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
				  WHERE dgvp.doc_group_id = @docgroupid_to_check_vp਀ऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
						 ) ਀ऀऀऀऀऀ  
		  -- Check if the document group is not linked to any user਀ऀऀ  伀刀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀最瘀瀀⸀猀椀搀开椀搀 䄀匀 搀最瘀瀀猀椀搀   
						   FROM user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀऀ  圀䠀䔀刀䔀 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀⤀⤀ 
	਀ऀ  ⴀⴀ 䘀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀ऀऀ   
	  OR NOT EXISTS (SELECT dgn.doc_group_id AS dgi਀ऀ                   䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
					WHERE dgn.doc_group_id = @docgroupid_to_check_vp)਀ऀऀऀऀऀ      
਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		  SET @user_authentication_result = 'Fail';਀ऀऀ䔀一䐀 
	ELSE਀ऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_user_doc_id]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 琀漀 愀挀挀攀猀猀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀⸀  
-- Input is a the id of the document 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਀     ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀  
਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀ 
			SELECT dil.doc_id਀ऀऀऀ䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			WHERE dil.doc_id = @doc_id_to_check਀ऀऀऀ  䄀一䐀 ⠀ 
				  -- Case 1: No group links਀ऀऀऀऀ  一伀吀 䔀堀䤀匀吀匀 ⠀ 
					  SELECT dgl.doc_id਀ऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
					  WHERE dgl.doc_id = dil.doc_id਀ऀऀऀऀ  ⤀ 
          ਀ऀऀऀऀ  ⴀⴀ 䌀愀猀攀 ㈀㨀 䜀爀漀甀瀀 氀椀渀欀猀 攀砀椀猀琀Ⰰ 戀甀琀 渀漀 匀䤀䐀猀 
				  OR NOT 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਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀最氀⸀搀漀挀开椀搀 㴀 搀椀氀⸀搀漀挀开椀搀 
				  )਀           
				  -- Case 3: User's SID is explicitly permitted਀ऀऀऀऀ  伀刀 䔀堀䤀匀吀匀 ⠀ 
					  SELECT sl.sid_id਀ऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
					  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 dgl.doc_id = dil.doc_id਀ऀऀऀऀऀऀ    䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
				  )਀ऀऀऀ  ⤀ 
		)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @user_authentication_result = 'Pass';਀ऀऀऀ䔀一䐀 
		ELSE਀ऀऀऀ䈀䔀䜀䤀一 
				SET @user_authentication_result = 'Fail';਀ऀऀऀ䔀一䐀 
਀  
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to access a given file.  File access is constrained via document groups. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀栀攀 椀搀 漀昀 琀栀攀 昀椀氀攀 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Pass' or 'Fail'.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_user_file_id] ਀ 
	@file_id_to_check bigint,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
਀ 
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 file ਀ 
		IF (਀ऀऀऀ䔀堀䤀匀吀匀 ⠀ 
				SELECT fm.file_id਀ऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
				 WHERE fm.file_id = @file_id_to_check਀ऀऀऀ⤀ 
			AND (਀ऀऀऀऀⴀⴀ 䌀愀猀攀 ㄀㨀 䘀椀氀攀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 愀渀礀 搀漀挀甀洀攀渀琀 
				NOT EXISTS (਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 昀琀搀氀⸀昀椀氀攀开椀搀 
					  FROM xref.file_to_document_links AS ftdl਀ऀऀऀऀऀ 圀䠀䔀刀䔀 昀琀搀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 
				)਀ 
				-- Case 2: Linked document has no group਀ऀऀऀऀ伀刀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
					SELECT dgl.doc_id਀ऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 昀琀搀氀 
					LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀऀऀऀ   伀一 昀琀搀氀⸀搀漀挀开椀搀 㴀 搀最氀⸀搀漀挀开椀搀 
					    WHERE ftdl.file_id = @file_id_to_check਀ऀऀऀऀऀ      䄀一䐀 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
				)਀ 
				-- Case 3: Group exists, but has no permission SIDs਀ऀऀऀऀ伀刀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
					SELECT dgvp.sid_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 ftdl.file_id = @file_id_to_check਀ऀऀऀऀऀ     䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
				)਀ 
				-- Case 4: User has permission਀ऀऀऀऀ伀刀 䔀堀䤀匀吀匀 ⠀ 
					SELECT sl.sid਀ऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 昀琀搀氀 
					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 ftdl.file_id = @file_id_to_check਀ऀऀऀऀऀ      䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
				)਀ऀऀऀ⤀ 
		)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @user_authentication_result = 'Pass';਀ऀऀऀ䔀一䐀 
		ELSE਀ऀऀऀ䈀䔀䜀䤀一 
				SET @user_authentication_result = 'Fail';਀ऀऀऀ䔀一䐀 
਀   
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to alter a given form. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀栀攀 椀搀 漀昀 琀栀攀 昀漀爀洀 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Pass' or 'Fail'.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_user_form] ਀ 
	@form_id_to_check bigint,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@roleauthenticationresult nvarchar(10);਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ  ⴀⴀ 䌀漀渀昀椀最甀爀愀琀漀爀 栀愀猀 爀椀最栀琀猀 琀漀 愀氀氀 昀漀爀洀猀⸀  
		@user_authentication_result = @roleauthenticationresult OUTPUT;਀ 
  IF @roleauthenticationresult = 'Fail'  -- User is not a Configurator਀    䈀䔀䜀䤀一 
਀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 
     -- Check if the form is linked to a form owner ਀ऀ ⴀⴀ 愀渀搀 琀栀攀 昀漀爀洀 漀眀渀攀爀 椀猀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
  IF NOT ਀     ⠀䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀⸀猀椀搀开椀搀 䄀匀 昀椀猀   
               FROM user_restr.form_group_owners AS fo਀ऀ     䤀一一䔀刀 䨀伀䤀一 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
		            ON fo.form_group_id਀ऀऀऀ        㴀 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
		 INNER JOIN forms.form_identifier_names AS fin਀ऀऀ            伀一 昀漀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
					= fin.form_group_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		            ON fo.sid_id਀ऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
			  WHERE fin.form_id = @form_id_to_check਀ऀऀऀ         䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
			         ) ਀ऀऀऀऀऀ  
	  -- Check if the form is not linked to any form owner਀      伀刀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀⸀猀椀搀开椀搀 䄀匀 昀椀猀   
                       FROM user_restr.form_group_owners AS fo਀ऀ             䤀一一䔀刀 䨀伀䤀一 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
		                 ON  fo.form_group_id਀ऀऀऀ              㴀 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
		         INNER JOIN forms.form_identifier_names AS fin਀ऀऀ                 伀一  昀漀⸀昀漀爀洀开最爀漀甀瀀开椀搀  
						  = fin.form_group_id਀ऀऀऀ          圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀⤀⤀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀㬀 
		END਀ऀ䔀䰀匀䔀 
	  SET @user_authentication_result = 'Pass';਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀爀漀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
  ELSE -- User is a Configurator਀    匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
  ਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_user_role]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 昀漀爀 愀 最椀瘀攀渀 爀漀氀攀⸀  
-- Input is the role 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਀  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 䄀匀 猀椀   
               FROM user_restr.sid_list AS sl਀ऀ     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 䄀匀 甀爀氀欀 
		         ON urlk.sid_id਀ऀऀऀ        㴀 猀氀⸀猀椀搀开椀搀 
		 INNER JOIN user_restr.role_list AS rl਀ऀऀ         伀一 甀爀氀欀⸀爀漀氀攀开渀愀洀攀 
			        = rl.role_name਀ऀऀऀ  圀䠀䔀刀䔀 爀氀⸀爀漀氀攀开渀愀洀攀  㴀 䀀爀漀氀攀开琀漀开挀栀攀挀欀 
			   AND  sl.sid = @usersid  ਀ऀऀऀ   ⤀   
		         ਀      ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
      SET @user_authentication_result = 'Pass';਀  䔀䰀匀䔀 
	  SET @user_authentication_result = 'Fail'; ਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_wf_inst_step]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 琀漀 愀挀挀攀猀猀 愀 最椀瘀攀渀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 䤀䐀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 搀漀挀甀洀攀渀琀 䤀䐀⸀  
-- Input is a the id of the step to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀  
਀ऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 戀椀最椀渀琀Ⰰ 
	@step_authentication_result nvarchar(10) OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)   = NULL, -- The SID of the connected user਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀㬀 
਀ 
਀  ⴀⴀ 匀攀氀攀挀琀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 琀栀攀 猀琀攀瀀 
     SELECT @documentid = wid.doc_id਀       䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
 INNER JOIN workflow_instances.workflow_instance_definitions as wid਀ऀ     伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
		    = wid.workflow_instance_id਀ऀ  圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	       = @instance_step_to_check;਀ 
  IF @documentid IS NULL਀   匀䔀吀 䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
  ELSE -- A doc id exists਀     䈀䔀䜀䤀一   ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
			EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
				@user_authentication_result = @step_authentication_result OUTPUT;਀ऀ 䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀愀渀挀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to access a given workflow instance 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_instance] ਀ 
	@wf_instance_to_check bigint,਀ऀ䀀眀昀开椀渀猀琀愀渀挀攀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@documentid nvarchar(50),਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㬀 
਀ 
਀  ⴀⴀ 匀攀氀攀挀琀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 琀栀攀 猀琀攀瀀 
     SELECT @documentid = wid.doc_id਀       䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 愀猀 眀椀搀 
	  WHERE wid.workflow_instance_id਀ऀ       㴀 䀀眀昀开椀渀猀琀愀渀挀攀开琀漀开挀栀攀挀欀㬀 
਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
   SET @wf_instance_auth_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_AUTHORISE_authoriser]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software ਀ⴀⴀ 䐀愀琀攀㨀        ㄀㄀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 䜀爀愀渀琀猀 愀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀猀 漀渀 爀攀焀甀攀猀琀 昀爀漀洀 愀渀 愀甀琀栀漀爀椀猀攀爀 瀀攀渀搀椀渀最 最爀愀渀琀 爀攀焀甀攀猀琀⸀    
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHORISE_authoriser] ਀ 
	 @grant_request_id bigint           = NULL,਀ऀ 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
		@authoriser_sid_id  bigint           = NULL,਀ऀऀ䀀愀甀琀栀漀爀椀猀攀爀开猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀       㴀 一唀䰀䰀Ⰰ 
		@authoriser_notes nvarchar(max)      = '';  ਀ 
 SET @request_result = 'Pass';਀ 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀焀甀攀猀琀开椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @grant_request_id = 0਀ऀऀ    匀䔀吀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ 䤀䘀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 䤀匀 一唀䰀䰀 
			 SET @request_result         = 'Fail1';਀ 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT request_id 	     -- Check if the request_id exists and is approved.਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀  
								 WHERE request_id = @grant_request_id਀ऀऀऀऀऀऀऀऀ   䄀一䐀 琀礀瀀攀 㴀 ✀䜀爀愀渀琀✀ 
								   AND status = 'Approved') ਀ऀऀऀऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㈀✀㬀 
		   END਀ 
		   IF @request_result = 'Pass'਀ऀऀ      䈀䔀䜀䤀一 
਀ऀऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀猀椀搀开椀搀 ऀ     ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 爀攀焀甀攀猀琀 椀猀 渀漀琀 愀氀爀攀愀搀礀 椀渀 琀栀攀 氀椀猀琀 漀昀 愀甀琀栀漀爀椀猀攀爀猀⸀  
				   			  FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀 
						        ON            apr.sid_id ਀ऀऀऀऀऀऀऀऀ   㴀 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
							 WHERE apr.request_id = @grant_request_id) ਀ऀऀऀऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㌀✀㬀 
			  END਀ 
		   IF @request_result = 'Pass'਀ऀऀ     䈀䔀䜀䤀一 
				-- Authenticate both the authorisers against the list of authorisers and check that they are not the same.਀                  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀  
				                   FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀 
						             ON apr.approved_by_sid_id_1਀ऀऀऀऀऀऀऀऀ        㴀 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
                                  WHERE apr.request_id = @grant_request_id)਀ऀऀऀऀऀ 伀刀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀  
				                      FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀ    䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀 
						                ON apr.approved_by_sid_id_2਀ऀऀऀऀऀऀऀऀ           㴀 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
                                     WHERE apr.request_id = @grant_request_id)਀ऀऀऀऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀瀀瀀爀漀瘀攀爀猀 愀爀攀 渀漀琀 琀栀攀 猀愀洀攀 
				                 FROM user_restr.authoriser_privilege_requests AS apr਀                                圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 
								  AND   apr.approved_by_sid_id_1਀ऀऀऀऀऀऀऀऀ      㴀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀⤀ऀऀऀऀऀऀऀऀ  
਀ऀऀऀऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㐀✀㬀 
               END਀ 
		   IF @request_result = 'Pass'਀ऀऀ     䈀䔀䜀䤀一  ⴀⴀ 刀攀ⴀ瘀愀氀椀搀愀琀攀 琀栀攀 匀䤀䐀开䤀䐀 
				IF NOT EXISTS (SELECT sid_id਀ऀऀऀऀऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
								WHERE sid_id = (SELECT apr.sid_id਀ऀऀऀऀऀऀऀऀ                  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
												 WHERE apr.request_id = @grant_request_id))਀ऀऀऀऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㔀✀㬀ऀऀऀ    
		      END਀ 
਀ 
-- Execute the update query਀ 
  IF @request_result = 'Pass'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
		   -- Assemble the data਀ऀऀ   匀䔀吀 䀀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀猀椀搀开椀搀 
									   FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀⤀ 
		   SELECT @authoriser_sid = sl.sid਀ऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		LEFT JOIN user_restr.authoriser_privilege_requests AS apr਀ऀऀऀ   伀一 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
				  = sl.sid_id਀ऀऀऀ圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 
											      ਀ऀऀ   匀䔀吀 䀀愀甀琀栀漀爀椀猀攀爀开渀漀琀攀猀 㴀 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀愀甀琀栀漀爀椀猀攀爀开猀椀搀⤀Ⰰ ✀✀⤀㬀 
਀ऀऀ   匀䔀䰀䔀䌀吀 䀀愀甀琀栀漀爀椀猀攀爀开猀椀搀 㴀 猀氀⸀猀椀搀 
			 FROM user_restr.sid_list AS sl਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
			   ON apr.approved_by_sid_id_2਀ऀऀऀऀ  㴀 猀氀⸀猀椀搀开椀搀 
			WHERE apr.request_id = @grant_request_id਀ 
		   SET @authoriser_notes = CONCAT(@authoriser_notes, ' | ', ISNULL(SUSER_SNAME(@authoriser_sid), ''));਀ 
਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀  
						 (authoriser_sid_id, notes)਀ऀऀऀऀ  嘀䄀䰀唀䔀匀 ⠀䀀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀Ⰰ 䀀愀甀琀栀漀爀椀猀攀爀开渀漀琀攀猀⤀ 
਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀㘀✀㬀 
	  END CATCH਀ 
    END਀ 
END਀ 
਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_INS_file]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀⼀⨀ 
	Inserts files into the filestream container਀ऀ䤀渀瀀甀琀 椀猀 愀 昀椀氀攀Ⰰ 昀椀氀攀渀愀洀攀 漀昀 琀栀攀 爀攀挀漀爀搀 琀漀 戀攀  
	saved, a transaction id and an optional full text content string..਀ऀ吀栀攀 挀漀渀琀攀渀琀 栀愀猀栀 椀猀 猀琀漀爀攀搀 愀猀 愀 栀攀砀 猀琀爀椀渀最⸀   
	File size is determined and saved also.਀ऀ䄀 栀愀猀栀 漀昀 琀栀攀 昀椀氀攀 椀猀 猀琀漀爀攀搀 昀漀爀 搀甀瀀氀椀挀愀琀攀 洀愀渀愀最攀洀攀渀琀 瀀甀爀瀀漀猀攀猀⸀   
	The filename does not have to be the same as the original filename ਀ऀ漀昀 琀栀攀 爀攀挀漀爀搀 琀漀 戀攀 猀愀瘀攀搀⸀   
	The transaction id is retrieved by the application ਀ऀ昀爀漀洀 愀 搀椀昀昀攀爀攀渀琀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀 愀渀搀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀椀猀 漀渀攀⸀ 
	For example, a group of files being added at the same time਀ऀ挀愀渀 戀攀 最爀漀甀瀀攀搀 戀礀 琀栀攀 猀愀洀攀 琀爀愀渀猀愀挀琀椀漀渀 椀搀⸀  
	Output is a status message, a transaction status,਀ऀ琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀ 
	Data validation is carried out by the calling procedure.਀⨀⼀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀崀  
਀    䀀昀开椀渀猀开昀椀氀攀开挀漀渀琀攀渀琀 瘀愀爀戀椀渀愀爀礀⠀䴀䄀堀⤀Ⰰ 
	@f_ins_stored_filename nvarchar(255),਀ऀ䀀昀开椀渀猀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
	@f_ins_thumbnail varbinary(max),਀ऀ䀀昀开椀渀猀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀 戀椀最椀渀琀       㴀 一唀䰀䰀Ⰰ 
	@f_ins_created_by_id bigint           = NULL,਀ऀ䀀昀开椀渀猀开爀攀琀攀渀琀椀漀渀开搀愀琀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀    㴀 一唀䰀䰀Ⰰ 
	@f_ins_message nvarchar(1000)         = NULL OUTPUT,਀ऀ䀀昀开椀渀猀开琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀   㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀ 伀唀吀倀唀吀Ⰰ 
    @f_ins_file_id bigint                 = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀  匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE਀ऀ    䀀昀椀氀攀开栀愀猀栀 瘀愀爀戀椀渀愀爀礀⠀䴀䄀堀⤀Ⰰ 
		@file_size bigint,਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @temptransmessage nvarchar(300)    = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ 
	    @transactionmessage2 nvarchar(300) = '',਀ऀऀ䀀搀甀瀀氀椀挀愀琀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀甀瀀氀椀挀愀琀攀 昀椀氀攀 攀砀椀猀琀猀 
        @data_validation_status nchar(10)  = 'Pass';਀ 
਀  ⴀⴀ 䌀爀攀愀琀攀 愀 昀椀氀攀 栀愀猀栀 昀漀爀 搀甀瀀氀椀挀愀琀攀 洀愀渀愀最攀洀攀渀琀 瀀攀爀昀漀爀洀攀搀 攀氀猀攀眀栀攀爀攀⸀ 
  SET @file_hash = HASHBYTES('SHA2_256', @f_ins_file_content);਀ 
  -- Determine the size of the file.਀  匀䔀吀 䀀昀椀氀攀开猀椀稀攀 㴀 䰀䔀一⠀䀀昀开椀渀猀开昀椀氀攀开挀漀渀琀攀渀琀⤀㬀 
਀⼀⨀ 
 Using OPENROWSET(BULK... is an unsuitable approach in this context਀ 戀攀挀愀甀猀攀 椀琀 爀攀焀甀椀爀攀猀 䈀唀䰀䬀 䄀䐀䴀䤀一 瀀爀椀瘀椀氀攀最攀猀Ⰰ 眀栀椀挀栀 椀渀琀爀漀搀甀挀攀猀 
 security issues.  Hence the approach used is that the application਀ 洀甀猀琀 漀瀀攀渀 琀栀攀 昀椀氀攀 愀渀搀 瀀氀愀挀攀 椀琀 椀渀琀漀 愀渀 漀戀樀攀挀琀 眀栀椀挀栀 椀猀 瀀愀猀猀攀搀 
 to the stored procedure.਀⨀⼀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 昀椀氀攀 攀砀椀猀琀猀⸀ 
  IF EXISTS (SELECT content_hash਀               䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 
			  WHERE content_hash = @file_hash)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DuplicateFile', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀搀甀瀀氀椀挀愀琀攀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		 ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀甀瀀氀椀挀愀琀攀䘀椀氀攀⸀✀㬀 
਀ ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀         䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀昀椀氀攀开猀琀漀爀愀最攀 ⠀昀椀氀攀开最甀椀搀Ⰰ  昀椀氀攀开挀漀渀琀攀渀琀⤀ 
	     VALUES (NEWID(),  @f_ins_file_content)਀ 
		 -- Retrieve the new file id.਀ऀऀ 匀䔀吀 䀀昀开椀渀猀开昀椀氀攀开椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
਀         䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 ⠀昀椀氀攀开椀搀Ⰰ 昀椀氀攀渀愀洀攀Ⰰ 挀漀渀琀攀渀琀开栀愀猀栀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀Ⰰ  
		                                    file_size, created_by_sid_id, retention_date)਀ऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀开椀渀猀开昀椀氀攀开椀搀Ⰰ 䀀昀开椀渀猀开猀琀漀爀攀搀开昀椀氀攀渀愀洀攀Ⰰ 䀀昀椀氀攀开栀愀猀栀Ⰰ 䀀昀开椀渀猀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀Ⰰ  
		                                    @file_size, @f_ins_created_by_id,  @f_ins_retention_date)਀ 
		 INSERT INTO base.file_plain_text_content (file_id, plain_text_content)਀ऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀开椀渀猀开昀椀氀攀开椀搀Ⰰ 䀀昀开椀渀猀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀⤀ 
਀ऀऀ 䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀昀椀氀攀开琀栀甀洀戀渀愀椀氀猀 ⠀昀椀氀攀开椀搀Ⰰ 琀栀甀洀戀渀愀椀氀⤀ 
		 VALUES (@f_ins_file_id, @f_ins_thumbnail)਀         䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'FileInserted', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @f_ins_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 (@f_ins_message = '' OR @f_ins_message IS NULL) SET @f_ins_message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀昀开椀渀猀开洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')    SET @f_ins_message = @f_ins_message + ' | ' + @transactionmessage2;਀    䤀䘀 ⠀䀀搀甀瀀氀椀挀愀琀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀昀开椀渀猀开洀攀猀猀愀最攀 㴀 䀀昀开椀渀猀开洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀甀瀀氀椀挀愀琀攀洀攀猀猀愀最攀㬀 
਀ 
-- This procedure is internal and does not use the cursor to return data. ਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀琀漀爀攀猀 搀攀ⴀ渀漀爀洀愀氀椀猀攀搀 搀愀琀愀 昀漀爀 愀 最椀瘀攀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀渀琀漀 琀栀攀 眀漀爀欀昀氀漀眀 琀爀愀挀欀 氀漀最⸀  
-- Input is an instance step id. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最崀 
਀ऀ  䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	  @triggered_by nvarchar(50)       = NULL਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀ 
        @newrecordid bigint਀ 
਀  䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开椀渀搀攀砀 
              (doc_id, triggered_by, workflow_model_id, model_name, present_step_id)਀       匀䔀䰀䔀䌀吀  
			  wid.doc_id            AS doc_id,਀ऀऀऀ  䀀琀爀椀最最攀爀攀搀开戀礀         䄀匀 琀爀椀最最攀爀攀搀开戀礀Ⰰ 
			  wid.workflow_model_id AS workflow_model_id,਀ऀऀऀ  眀洀渀⸀愀琀琀爀开渀愀洀攀         䄀匀 洀漀搀攀氀开渀愀洀攀Ⰰ 
			  wid.present_step_id   AS present_step਀ऀ     䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
   INNER JOIN workflow_instances.workflow_instance_definitions AS wid਀           伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
		      = wid.workflow_instance_id਀    䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 䄀匀 眀洀渀 
	       ON   wid.workflow_model_id਀ऀऀ      㴀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
	    WHERE wis.workflow_instance_step_id਀ऀऀ      㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
਀    匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
਀ 
            INSERT INTO workflow_instances.workflow_track_log ਀ऀऀऀ            ⠀眀昀开氀漀最开椀渀搀攀砀开椀搀Ⰰ 爀攀挀漀爀搀开椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开椀搀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 
			               attr_mnemonic, attr_name, long_text_val, step_order, edge_id, to_node_id, ਀ऀऀऀऀऀऀ   爀甀氀攀开瘀愀氀Ⰰ 搀愀琀攀开瘀愀氀⤀ 
             SELECT਀ 
			     @newrecordid,                               ਀                 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 ⠀匀䔀䰀䔀䌀吀 一唀䰀䰀⤀⤀Ⰰ  
                 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](wis.workflow_instance_step_id) AS sd਀            圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_REVOKE_authoriser]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software ਀ⴀⴀ 䐀愀琀攀㨀        ㄀㄀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 刀攀瘀漀欀攀猀 愀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀猀 漀渀 爀攀焀甀攀猀琀 昀爀漀洀 愀渀 愀甀琀栀漀爀椀猀攀搀 瀀攀渀搀椀渀最 爀攀瘀漀欀攀 爀攀焀甀攀猀琀⸀    
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_REVOKE_authoriser] ਀ 
	 @revoke_request_id bigint           = NULL,਀ऀ 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
਀ 
 SET @request_result = 'Pass';਀ 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀焀甀攀猀琀开椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @revoke_request_id = 0਀ऀऀ    匀䔀吀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ 䤀䘀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀 䤀匀 一唀䰀䰀 
			 SET @request_result         = 'Fail1';਀ 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT request_id 	     -- Check if the request_id exists and is approved.਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀  
								 WHERE request_id = @revoke_request_id਀ऀऀऀऀऀऀऀऀ   䄀一䐀 琀礀瀀攀 㴀 ✀刀攀瘀漀欀攀✀ 
								   AND status = 'Approved') ਀ऀऀऀऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㈀✀㬀 
		   END਀ 
		   IF @request_result = 'Pass'਀ऀऀ      䈀䔀䜀䤀一 
਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀猀椀搀开椀搀 ऀ     ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 爀攀焀甀攀猀琀 椀猀 愀氀爀攀愀搀礀 椀渀 琀栀攀 氀椀猀琀 漀昀 愀甀琀栀漀爀椀猀攀爀猀⸀  
				   			      FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀ    䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀 
						            ON            apr.sid_id ਀ऀऀऀऀऀऀऀऀ       㴀 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
							     WHERE apr.request_id = @revoke_request_id) ਀ऀऀऀऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㌀✀㬀 
			  END਀ 
		   IF @request_result = 'Pass'਀ऀऀ     䈀䔀䜀䤀一 
				-- Authenticate both the authorisers against the list of authorisers and check that they are not the same.਀                  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀  
				                   FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀 
						             ON apr.approved_by_sid_id_1਀ऀऀऀऀऀऀऀऀ        㴀 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
                                  WHERE apr.request_id = @revoke_request_id)਀ऀऀऀऀऀ 伀刀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀  
				                      FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀ    䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀 
						                ON apr.approved_by_sid_id_2਀ऀऀऀऀऀऀऀऀ           㴀 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
                                     WHERE apr.request_id = @revoke_request_id)਀ऀऀऀऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀瀀瀀爀漀瘀攀爀猀 愀爀攀 渀漀琀 琀栀攀 猀愀洀攀 
				                 FROM user_restr.authoriser_privilege_requests AS apr਀                                圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀 
								  AND   apr.approved_by_sid_id_1਀ऀऀऀऀऀऀऀऀ      㴀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀⤀ऀऀऀऀऀऀऀऀ  
਀ऀऀऀऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㐀✀㬀 
               END਀ 
			   -- Prevent authorisers from inadvertently revoking their own privileges.  This prevents the situation where there are fewer than two਀ऀऀऀ   ⴀⴀ 愀甀琀栀漀爀椀猀攀爀猀 氀攀昀琀 愀渀搀 栀攀渀挀攀 搀戀愀 猀甀瀀瀀漀爀琀 椀猀 渀攀挀攀猀猀愀爀礀 琀漀 爀攀ⴀ戀漀漀琀猀琀爀愀瀀 琀栀攀 愀甀琀栀漀爀椀猀攀爀猀⸀ 
		   IF @request_result = 'Pass'਀ऀऀ     䈀䔀䜀䤀一 
			  IF EXISTS (SELECT sid_id਀ऀऀऀ               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
						  WHERE apr.approved_by_sid_id_1਀ऀऀऀऀऀऀ        㴀 愀瀀爀⸀猀椀搀开椀搀 
							 OR apr.approved_by_sid_id_2਀ऀऀऀऀऀऀऀ    㴀 愀瀀爀⸀猀椀搀开椀搀 
							AND apr.request_id = @revoke_request_id)਀ 
						 SET @request_result         = 'Fail5';਀ 
			 END਀ 
		   IF @request_result = 'Pass'਀ऀऀ     䈀䔀䜀䤀一  ⴀⴀ 刀攀ⴀ瘀愀氀椀搀愀琀攀 琀栀攀 匀䤀䐀开䤀䐀 
				IF NOT EXISTS (SELECT sid_id਀ऀऀऀऀऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
								WHERE sid_id = (SELECT apr.sid_id਀ऀऀऀऀऀऀऀऀ                  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
												 WHERE apr.request_id = @revoke_request_id))਀ऀऀऀऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㘀✀㬀ऀऀऀ    
		      END਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀  
               WHERE authoriser_sid_id = (SELECT sid_id ਀ऀऀऀ                                䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
										   WHERE apr.request_id = @revoke_request_id)਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     SET @request_result = 'Fail7';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀    䔀一䐀 
਀䔀一䐀 
਀ 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-06-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀⸀ 
-- Fetches error messages according to the selected language.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 洀攀猀猀愀最攀 椀搀⸀  伀甀琀瀀甀琀 椀猀 琀栀攀 洀攀猀猀愀最攀 琀攀砀琀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀崀  
਀ऀ䀀洀攀猀猀愀最攀开椀搀 渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 
	@message_text nvarchar(200) OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
	-- Note that the selected row from the global_setting_group table is hard coded here਀ऀ䈀䔀䜀䤀一 吀刀夀 
     SELECT @message_text = ਀ऀ        ⠀匀䔀䰀䔀䌀吀 洀攀猀猀愀最攀开琀攀砀琀  
	           FROM messaging.message_details ਀         䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀  
                 ON messaging.message_details.language_id ਀ऀऀ ऀ        㴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀氀愀渀最甀愀最攀开椀搀  
              WHERE message_id ਀ऀऀऀ        㴀 䀀洀攀猀猀愀最攀开椀搀  
				    AND base.global_settings_groups.setting_group_name = 'Master') ਀    䔀一䐀 吀刀夀 
	BEGIN CATCH਀ऀ   匀䔀吀 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀✀㬀 
	END CATCH਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开匀䔀䰀开爀愀渀搀漀洀开搀漀挀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 29-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䄀甀琀漀洀愀琀椀挀愀氀氀礀 最攀渀攀爀愀琀攀猀 愀 爀愀渀搀漀洀 搀漀挀 椀搀 
-- No input਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 搀漀挀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开匀䔀䰀开爀愀渀搀漀洀开搀漀挀开椀搀崀  
਀ऀऀ䀀爀愀渀搀漀洀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ऀ㴀 ✀✀ 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀऀ䀀氀攀琀琀攀爀 挀栀愀爀                㴀 一唀䰀䰀Ⰰ 
		@idlength int               = 4,਀ऀऀ䀀挀栀愀爀挀漀甀渀琀 椀渀琀ऀ            㴀 　Ⰰ 
		@docidexists nvarchar(10)	= 'Yes',਀ऀऀ䀀瀀爀攀昀椀砀 瘀愀爀挀栀愀爀⠀㌀⤀          㴀 ✀✀ 
਀  ⴀⴀ 匀攀氀攀挀琀 愀渀搀 瘀愀氀椀搀愀琀攀 琀栀攀 椀搀 氀攀渀最琀栀 
  /*਀  吀栀攀 爀甀氀攀猀 攀渀挀漀搀攀搀 栀攀爀攀 愀爀攀 戀愀猀攀搀 漀渀 琀栀攀 瀀爀攀洀椀猀攀 琀栀愀琀  
  document IDs must be ammenable to being ਀    攀愀猀椀氀礀 爀攀愀搀 
	easily verbally communicated and਀ऀ攀愀猀椀氀礀 洀攀洀漀爀椀猀攀搀⸀  
  Information about the document is contained਀  眀椀琀栀椀渀 洀攀搀愀琀愀搀愀琀愀 昀椀攀氀搀猀⸀ 
  */਀  匀䔀吀 䀀椀搀氀攀渀最琀栀 㴀 ⠀匀䔀䰀䔀䌀吀 愀甀琀漀开最攀渀开搀漀挀开椀搀开氀攀渀最琀栀 
                     FROM base.global_settings_groups਀ऀऀऀऀऀ圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
  IF @idlength IS NULL or @idlength = 0਀     匀䔀吀 䀀椀搀氀攀渀最琀栀 㴀 㐀㬀 
  IF @idlength > 8਀     匀䔀吀 䀀椀搀氀攀渀最琀栀 㴀 㠀㬀 
  IF @idlength = 7਀     匀䔀吀 䀀椀搀氀攀渀最琀栀 㴀 㘀㬀 
  IF @idlength = 5਀     匀䔀吀 䀀椀搀氀攀渀最琀栀 㴀 㐀㬀 
  IF @idlength < 4਀     匀䔀吀 䀀椀搀氀攀渀最琀栀 㴀 㐀㬀 
਀  ⴀⴀ 䄀搀搀 琀栀攀 爀攀最椀猀琀攀爀 挀漀搀攀 瀀爀攀昀椀砀 椀昀 愀瀀瀀氀椀挀愀戀氀攀⸀ 
  IF (SELECT is_register_code_applied ਀        䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⤀ 㴀 ✀夀攀猀✀ 
	BEGIN਀ऀऀ匀䔀吀 䀀瀀爀攀昀椀砀 㴀 ⠀匀䔀䰀䔀䌀吀 爀攀最椀猀琀攀爀开挀漀搀攀 
					     FROM base.global_settings_groups਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀ 
		IF @prefix IS NULL  ਀ऀऀ   匀䔀吀 䀀瀀爀攀昀椀砀 㴀 ✀✀ 
		ELSE਀ऀऀ   匀䔀吀 䀀瀀爀攀昀椀砀 㴀 䀀瀀爀攀昀椀砀 ⬀ ✀ⴀ✀㬀 
	END਀  匀䔀吀 䀀爀愀渀搀漀洀搀漀挀甀洀攀渀琀椀搀 㴀 䀀瀀爀攀昀椀砀㬀 
਀ 
  -- Generate a random document id਀  圀䠀䤀䰀䔀 䀀椀搀氀攀渀最琀栀 㸀 　  
    BEGIN਀ऀ  匀䔀吀 䀀氀攀琀琀攀爀 㴀 一唀䰀䰀㬀 
	  WHILE (@letter IS NULL)਀ऀऀ  䈀䔀䜀䤀一 
			SET @letter = CHAR(CEILING(RAND(CHECKSUM(NEWID()))*25+65));਀ऀऀऀ⼀⨀ 䔀砀挀氀甀搀攀 瘀漀眀攀氀猀 猀漀 琀栀愀琀 琀栀攀 猀琀爀椀渀最 挀愀渀渀漀琀 猀瀀攀氀氀 愀 眀漀爀搀⸀ 
			   Exclude L so that it cannot be misread as 1.਀ऀऀऀ   䔀砀挀甀搀攀 圀 戀攀挀愀甀猀攀 椀琀 栀愀猀 洀漀爀攀 琀栀愀渀 漀渀攀 猀礀氀氀愀戀氀攀⸀ 
			   Exclude V because two Vs looks like W.਀ऀऀऀ   䠀攀渀挀攀 琀栀攀 洀愀砀椀洀甀洀 瀀漀猀猀椀戀氀攀 渀甀洀戀攀爀 漀昀 挀漀洀戀椀渀愀琀椀漀渀猀 椀猀  
			   18 ^ @idlength.਀ऀऀऀ⨀⼀ 
			IF    @letter = 'A' ਀ऀऀऀ   伀刀 䀀氀攀琀琀攀爀 㴀 ✀䔀✀  
			   OR @letter = 'I'਀ऀऀऀ   伀刀 䀀氀攀琀琀攀爀 㴀 ✀伀✀ 
			   OR @letter = 'U'਀ऀऀऀ   伀刀 䀀氀攀琀琀攀爀 㴀 ✀䰀✀ 
			   OR @letter = 'W'਀ऀऀऀ   伀刀 䀀氀攀琀琀攀爀 㴀 ✀嘀✀ 
			  SET @letter = NULL;਀ऀऀ  䔀一䐀 
      SET @charcount = @charcount + 1;਀ऀ  匀䔀吀 䀀椀搀氀攀渀最琀栀 㴀 䀀椀搀氀攀渀最琀栀 ⴀ ㄀㬀 
਀ऀ  ⴀⴀ 䤀渀猀攀爀琀 愀 搀愀猀栀 椀渀 琀栀攀 洀椀搀搀氀攀⸀ 
	  IF @charcount = 4 and @idlength = 2 ਀ऀ     匀䔀吀 䀀爀愀渀搀漀洀搀漀挀甀洀攀渀琀椀搀 㴀 䀀爀愀渀搀漀洀搀漀挀甀洀攀渀琀椀搀 ⬀ ✀ⴀ✀㬀 
	  IF @charcount = 5 and @idlength = 3਀ऀ     匀䔀吀 䀀爀愀渀搀漀洀搀漀挀甀洀攀渀琀椀搀 㴀 䀀爀愀渀搀漀洀搀漀挀甀洀攀渀琀椀搀 ⬀ ✀ⴀ✀㬀 
਀ऀ  匀䔀吀 䀀爀愀渀搀漀洀搀漀挀甀洀攀渀琀椀搀 㴀 䀀爀愀渀搀漀洀搀漀挀甀洀攀渀琀椀搀 ⬀ 䀀氀攀琀琀攀爀㬀 
    END਀  ⴀⴀ 䔀渀搀 漀昀 最攀渀攀爀愀琀椀渀最 爀愀渀搀漀洀 搀漀挀甀洀攀渀琀 椀搀 
  ਀  ⴀⴀ 䌀栀攀挀欀椀渀最 漀昀 眀栀攀琀栀攀爀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 椀猀 甀渀椀焀甀攀 椀猀 搀漀渀攀 攀氀猀攀眀栀攀爀攀⸀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开昀椀氀攀渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 愀 昀椀氀攀渀愀洀攀 椀猀 愀 瘀愀氀椀搀 圀椀渀搀漀眀猀 昀椀氀攀渀愀洀攀 
-- Input is a string containing the filename to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀嘀愀氀椀搀✀ 漀爀 ✀䤀渀瘀愀氀椀搀✀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开昀椀氀攀渀愀洀攀崀  
	-- Add the parameters for the stored procedure here਀ऀ䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 渀瘀愀爀挀栀愀爀⠀㈀㔀㔀⤀Ⰰ 
	@filename_validation_result nchar(10) OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
 IF     @filename_to_validate LIKE '%[%]%'਀     伀刀 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀⼀崀─✀ 
	 OR @filename_to_validate LIKE '%[\]%'਀     伀刀 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀㨀崀─✀ 
     OR @filename_to_validate LIKE '%[*]%'਀     伀刀 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀㼀崀─✀ 
     OR @filename_to_validate LIKE '%[<]%'਀     伀刀 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀㸀崀─✀ 
     OR @filename_to_validate LIKE '%[|]%'਀     伀刀 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀∀崀─✀ 
਀     匀䔀吀 䀀昀椀氀攀渀愀洀攀开瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀䤀渀瘀愀氀椀搀✀㬀 
 ELSE SET @filename_validation_result = 'Valid';਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-06-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ倀攀爀昀漀爀洀猀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 漀渀 渀愀洀攀Ⰰ 愀琀琀爀椀戀甀琀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀 昀椀攀氀搀猀⸀ 
-- Output is a data validation status and a message.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_VALIDATE_mnem_name_descr] ਀ऀⴀⴀ 䄀搀搀 琀栀攀 瀀愀爀愀洀攀琀攀爀猀 昀漀爀 琀栀攀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀 栀攀爀攀 
     @mnem nvarchar(10)          = NULL,਀ऀ 䀀愀琀琀爀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @descr nvarchar(max)        = NULL,਀ऀ 䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀倀愀猀猀✀ 伀唀吀倀唀吀Ⰰ 
	 @messg nvarchar(1000)       = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀      㴀 ✀✀Ⰰ 
    @nodatamessage nvarchar(200)    = '',਀ऀ䀀琀漀漀氀漀渀最㄀　洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀Ⰰ 
	@toolong50message nvarchar(200) = '',਀    䀀渀愀洀攀攀洀瀀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
   -- NULL records not permitted਀   䤀䘀 ⠀⠀䀀洀渀攀洀 䤀匀 一唀䰀䰀 伀刀 䀀洀渀攀洀 㴀 ✀✀⤀ 䄀一䐀 ⠀䀀愀琀琀爀开渀愀洀攀 䤀匀 一唀䰀䰀 伀刀 䀀愀琀琀爀开渀愀洀攀 㴀 ✀✀⤀  
      AND (@descr IS NULL OR @descr = ''))਀ ऀ 䈀䔀䜀䤀一 
       EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀愀琀愀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	     SET @nodatamessage = @tempmessage;਀       䔀䰀匀䔀 
	      SET @nodatamessage = 'A database level message error occurred on NoData';਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	 END਀   䔀䰀匀䔀 ⴀⴀ 䐀漀 漀琀栀攀爀 挀栀攀挀欀椀渀最 漀渀氀礀 椀昀 搀愀琀愀 椀猀 猀甀瀀瀀氀椀攀搀⸀ 
     BEGIN ਀       ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 䴀渀攀洀漀渀椀挀 琀攀砀琀 洀愀礀 栀愀瘀攀 戀攀攀渀 愀甀琀漀洀愀琀椀挀愀氀氀礀 琀爀甀渀挀愀琀攀搀⸀ 
	   IF (LEN(@mnem) >= 10)਀   ऀ    䈀䔀䜀䤀一 
          EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀漀漀䰀漀渀最㄀　✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀ      䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		     SET @toolong10message = @mnem + ' | ' + @tempmessage;਀ऀ      䔀䰀匀䔀  
		     SET @toolong10message = 'A database level message error occurred on TooLong10';਀ऀ    䔀一䐀 
       -- Check if the Attribute text may have been automatically truncated.਀       䤀䘀 ⠀䰀䔀一⠀䀀愀琀琀爀开渀愀洀攀⤀ 㸀㴀 㔀　⤀ 
         BEGIN਀           䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'TooLong50', ਀ऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF (@tempmessage IS NOT NULL) ਀ऀ  ऀ     匀䔀吀 䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀开渀愀洀攀Ⰰ 㠀⤀ ⬀ ✀⸀⸀⸀✀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       IF (@tempmessage IS NULL) ਀ऀ         匀䔀吀 䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀漀漀䰀漀渀最㔀　✀㬀 
	     END਀       ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 渀愀洀攀 攀渀琀爀礀 椀猀 戀氀愀渀欀⸀    
	   -- (Note that in MSSQLS NULL=NULL and hence a unique constraint will fail if multiple records਀ऀ   ⴀⴀ 愀爀攀 一唀䰀䰀⸀⤀ 
       IF (@attr_name = '' OR @attr_name IS NULL)਀ऀ     䈀䔀䜀䤀一 
		   SET @data_valn_status = 'Fail';਀ऀ       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                @message_id   = 'NoAttrName', ਀ऀऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	       IF (@tempmessage IS NOT NULL) ਀  ऀ         匀䔀吀 䀀渀愀洀攀攀洀瀀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       IF (@tempmessage IS NULL) ਀ऀऀ      匀䔀吀 䀀渀愀洀攀攀洀瀀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀一愀洀攀✀㬀 
		 END਀ 
    END -- End of the ELSE for the no-data check਀ⴀⴀ 䔀渀搀 漀昀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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 (@nameemptymessage <> '') SET @messg = @messg + ' | ' + @nameemptymessage;਀  䤀䘀 ⠀䀀琀漀漀氀漀渀最㄀　洀攀猀猀愀最攀 㰀㸀 ✀✀⤀ 匀䔀吀 䀀洀攀猀猀最 㴀 䀀洀攀猀猀最 ⬀ ✀ 簀 ✀ ⬀ 䀀琀漀漀氀漀渀最㄀　洀攀猀猀愀最攀㬀 
  IF (@toolong50message <> '') SET @messg = @messg + ' | ' + @toolong50message;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䌀䠀䔀䌀䬀开搀漀挀开攀搀开瀀攀爀洀椀猀猀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 椀搀⸀ 
-- Input is a document 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 document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
BEGIN TRY਀  ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check that the doc id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @documentid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 SET @validation_result      = '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;਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀   㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀㬀 
		   IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀䄀挀挀攀猀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT(@message, ' | ' ,  LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocIDAccess.');਀ऀऀऀऀ 䔀一䐀ऀ 
			 ELSE਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䔀搀倀攀爀洀䌀栀攀挀欀倀愀猀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT(@message, ' | ' ,  LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on EdPermCheckPass.');਀ऀऀऀऀ 䔀一䐀 
਀ऀऀऀऀ ⴀⴀ䔀搀倀攀爀洀䌀栀攀挀欀刀攀猀甀氀琀 
		 END਀ऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
	  SET @validation_result  = 'Fail';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @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_CHECK_file_ed_permission]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㐀 
-- Description:	Checks whether the connected user has edit permission for the given file id.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀⸀  伀甀琀瀀甀琀 椀猀 愀 爀攀猀甀氀琀 愀渀搀 洀攀猀猀愀最攀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema, stored procedures and functions are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_CHECK_file_ed_permission] ਀ 
      @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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @fileauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the File਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 䘀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䈀䔀䜀䤀一 吀刀夀 
  -- File id validation਀ 
	   -- Check that the file id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @fileid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 SET @validation_result      = '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 was supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 䘀椀氀攀 搀愀琀愀 
		   EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀ            䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
	            @user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀   㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀㬀 
		   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.');਀ऀऀऀऀ 䔀一䐀ऀऀ 
			 ELSE਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 
				   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 EdPermCheckPass.');਀ऀऀऀऀ 䔀一䐀ऀऀऀऀ  
		 END਀ऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
	  SET @validation_result  = 'Fail';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @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_DEL_indiv_browsing_tree]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀Ⰰ 戀漀琀栀 琀栀攀 渀愀洀攀 搀攀琀愀椀氀猀 愀渀搀 琀栀攀 渀漀搀攀猀⸀ 
-- Only for trees which are owned by the connected user. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- 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਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ऀ  䤀䘀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 　  
			 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 AS tbtn਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
								       = @tag_br_treeid਀ऀऀऀऀऀऀऀऀ   䄀一䐀 琀戀琀渀⸀猀椀搀开椀搀 
								       = (SELECT sl.sid_id਀ऀऀऀऀऀऀऀऀऀ        䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
										   WHERE sl.sid਀ऀऀऀऀऀऀऀऀऀऀ         㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'BrTreeNotOwned', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   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 [reading].[usp_DEL_tag_br_tree_branch]    Script Date: Tue 12-05-2026 5:43:19 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)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@tag_browsing_tree_id 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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- 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';਀ 
  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 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਀ 
 -- Check if the node is root.  The root node cannot be deleted.਀   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
                FROM tagging.tag_browsing_tree_nodes਀               圀䠀䔀刀䔀    戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀  
			         = @tag_br_tree_node_id਀                 䄀一䐀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀ 
                 AND tag_browsing_tree_id = (SELECT tag_browsing_tree_id਀                                               䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
                                              WHERE  browsing_tree_node_id ਀ऀऀऀऀऀऀऀऀऀऀऀ        㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀⤀  
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'IsRootNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				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 @userauthentication_status = 'Pass'਀ 
  SET @tag_browsing_tree_id = (SELECT tag_browsing_tree_id਀                                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
					            WHERE  browsing_tree_node_id਀ऀऀऀऀऀ                  㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀㬀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	 ਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀     ⴀⴀ 䐀攀氀攀琀攀 愀氀氀 搀攀猀挀攀渀搀愀渀琀 渀漀搀攀猀 
     DELETE FROM tagging.tag_browsing_tree_nodes਀           圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
		         = @tag_browsing_tree_id਀             䄀一䐀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀ 
                 (SELECT browsing_tree_hierarchyid਀                    䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
                   WHERE browsing_tree_node_id = @tag_br_tree_node_id)) = 1;਀ 
		 --Delete the node ਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
		      WHERE browsing_tree_node_id ਀ऀऀ            㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀㬀ऀ 
਀ 
     COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
   ਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开戀爀开琀爀攀攀开渀漀搀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-10-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Delete a tag browsing tree node.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀Ⰰ 攀搀椀琀漀爀 愀渀搀 爀攀愀搀攀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_DEL_tag_br_tree_node] ਀  
     @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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀Ⰰ 
        @node_hid hierarchyid,਀        䀀瀀愀爀攀渀琀开栀椀搀 栀椀攀爀愀爀挀栀礀椀搀㬀ऀऀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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 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਀ 
 -- Check if the node is root.  The root node cannot be deleted.਀   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
                FROM tagging.tag_browsing_tree_nodes਀               圀䠀䔀刀䔀    戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀  
			         = @tag_br_tree_node_id਀                 䄀一䐀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀ 
                 AND tag_browsing_tree_id = (SELECT tag_browsing_tree_id਀                                               䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
                                              WHERE  browsing_tree_node_id ਀ऀऀऀऀऀऀऀऀऀऀऀ        㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀⤀  
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'IsRootNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				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 @userauthentication_status = 'Pass'਀ 
  SET @tag_browsing_tree_id = (SELECT tag_browsing_tree_id਀                                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
					            WHERE  browsing_tree_node_id਀ऀऀऀऀऀ                  㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀㬀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
        BEGIN TRANSACTION;਀ 
਀ऀऀ ⴀⴀ䐀攀氀攀琀攀 琀栀攀 渀漀搀攀  
		DELETE FROM tagging.tag_browsing_tree_nodes਀ऀऀ      圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀  
		            = @tag_br_tree_node_id;	਀ 
  -- #### RE-PARENT DESCENDANT NODES. ####਀ऀऀⴀⴀ 䜀攀琀 栀椀攀爀愀爀挀栀礀椀搀 漀昀 琀栀攀 渀漀搀攀 戀攀椀渀最 搀攀氀攀琀攀搀 
		  SELECT @node_hid = browsing_tree_hierarchyid਀ऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
		  WHERE browsing_tree_node_id = @tag_br_tree_node_id;਀ 
		  -- Get its parent hierarchyid਀ऀऀ  匀䔀吀 䀀瀀愀爀攀渀琀开栀椀搀 㴀 䀀渀漀搀攀开栀椀搀⸀䜀攀琀䄀渀挀攀猀琀漀爀⠀㄀⤀㬀 
਀ऀऀ  ⴀⴀ 䴀漀瘀攀 攀愀挀栀 搀椀爀攀挀琀 挀栀椀氀搀 漀昀 琀栀攀 搀攀氀攀琀攀搀 渀漀搀攀 琀漀 琀栀攀 瀀愀爀攀渀琀 
		  ;WITH DirectChildren AS (਀ऀऀऀ  匀䔀䰀䔀䌀吀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀Ⰰ 
					 browsing_tree_hierarchyid਀ऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
			  WHERE browsing_tree_hierarchyid.GetAncestor(1) = @node_hid਀ऀऀऀऀ䄀一䐀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
		  )਀ऀऀ  唀倀䐀䄀吀䔀 挀 
			SET browsing_tree_hierarchyid =਀ऀऀऀऀऀ䀀瀀愀爀攀渀琀开栀椀搀⸀䜀攀琀䐀攀猀挀攀渀搀愀渀琀⠀ 
						-- new sibling placement: max existing under parent਀ऀऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 
						   FROM tagging.tag_browsing_tree_nodes਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䄀渀挀攀猀琀漀爀⠀㄀⤀ 㴀 䀀瀀愀爀攀渀琀开栀椀搀 
							AND tag_browsing_tree_id = @tag_browsing_tree_id),਀ऀऀऀऀऀऀ一唀䰀䰀 
					)਀ऀऀ  䘀刀伀䴀 䐀椀爀攀挀琀䌀栀椀氀搀爀攀渀 挀㬀 
਀ 
     COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
   ਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䤀一匀开猀攀氀昀开漀渀戀漀愀爀搀开猀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-07-2025਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 搀椀爀攀挀琀氀礀 昀爀漀洀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀ 
-- Note that adding a user to the SID list does not grant any permissions.਀ⴀⴀ 吀栀攀 瀀攀爀洀椀猀猀椀漀渀猀 愀爀攀 洀愀瀀瀀攀搀 瘀椀愀 琀栀攀 䄀䌀䰀猀⸀  
-- Output is a status message and a transaction status and a sid_id. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_INS_self_onboard_sid] ਀ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀   
			   -- Check if a matching record already exists਀ऀऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀 
				   			FROM user_restr.sid_list ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 爀攀猀琀漀爀攀开猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'DuplSelfOnb', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀甀瀀氀匀攀氀昀伀渀戀⸀✀⤀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 匀䤀䐀 栀愀猀 爀攀猀漀氀瘀攀搀 
		  IF @connectedusersid IS NULL OR @connectedusersid = 0਀ऀऀऀ䈀䔀䜀䤀一 
					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 NoSID.');਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀  ऀ䈀䔀䜀䤀一 
	  BEGIN TRY ਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 ⠀猀椀搀Ⰰ               甀猀攀爀渀愀洀攀Ⰰ 爀攀猀琀漀爀攀开猀椀搀⤀ 
		      VALUES                     (@connectedusersid, @username, @connectedusersid);  ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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: 04-10-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new tag tree name which is linked to the connected user.਀ⴀⴀ 吀栀攀 甀猀攀爀 洀甀猀琀 戀攀 攀砀瀀氀椀挀椀琀氀礀 爀攀最椀猀琀攀爀攀搀 眀椀琀栀 ✀刀攀愀搀攀爀✀ 爀漀氀攀⸀  
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_INS_tag_br_tree_nm_indiv] ਀ 
	 @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)         = '',	਀ऀऀ䀀猀椀搀椀搀 戀椀最椀渀琀                           㴀 一唀䰀䰀Ⰰ 
		@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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- 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਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @browsing_tree_name = ''਀ऀऀ   匀䔀吀 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ 
  -- Check if the new name is unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 渀愀洀攀  
		 			 FROM tagging.tag_browsing_tree_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਀ 
	-- Retrieve the sid_id for the connected user. ਀ऀ匀䔀吀 䀀猀椀搀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
	                FROM user_restr.sid_list਀ऀऀऀऀ   圀䠀䔀刀䔀 猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
਀ 
    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, @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਀    䔀一䐀 
਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 攀渀琀爀礀 愀渀搀 爀攀琀爀椀攀瘀攀 琀栀攀 渀攀眀 爀漀眀 椀搀 
  IF (@transaction_status = 'Good')਀ऀ  匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a document tag into a tag browsing tree.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 挀漀渀琀爀漀氀氀攀爀Ⰰ 攀搀椀琀漀爀 愀渀搀 爀攀愀搀攀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_INS_tag_browsing_tree_node] ਀ 
     @tag_id bigint                   = NULL,਀ऀ 䀀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @parentid bigint                 = NULL,਀ऀ 䀀椀渀瘀攀爀琀开琀愀最 戀椀琀                  㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid 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 ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',	਀ऀऀ䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
		@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 = '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_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਀ऀऀऀऀ 䔀䰀匀䔀  ⴀⴀ  䄀 瘀愀氀椀搀 琀愀最 琀爀攀攀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 椀琀⸀  
				  BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开戀爀开琀爀攀攀崀 
					   @tag_brtreeid_ep = @tag_br_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਀ 
	  -- 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਀ 
਀  
਀  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 瀀愀爀攀渀琀 䤀䐀 
    IF @parentid = 0਀ऀ    匀䔀吀 䀀瀀愀爀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	IF @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਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @parentid਀ऀऀऀऀऀऀ  䄀一䐀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
						      = @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 ParentNotExist');		   ਀ऀऀऀऀऀ 䔀一䐀  
਀ऀ   䔀一䐀 
	   		 ਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_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_browsing_tree_nodes਀ऀऀऀ  圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
			        = @parentid਀ऀऀऀ ⴀⴀ 䜀攀渀攀爀愀琀攀 渀攀眀 栀椀攀爀愀爀挀栀礀 椀搀 愀猀 挀栀椀氀搀 漀昀 瀀愀爀攀渀琀 
			 SELECT @new_hierarchyid = @parent_hierarchyid.GetDescendant(਀ऀऀऀ    ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 
				   FROM tagging.tag_browsing_tree_nodes਀ऀऀऀऀ  圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀ 
				    AND browsing_tree_hierarchyid.GetLevel() = @parent_hierarchyid.GetLevel() + 1), NULL);਀           䔀一䐀 
		-- Insert the new node਀ऀऀ䤀一匀䔀刀吀 䤀一吀伀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
		            (tag_browsing_tree_id,  tag_id, browsing_tree_hierarchyid, invert_tag)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀琀愀最开戀爀开琀爀攀攀椀搀Ⰰ 䀀琀愀最开椀搀Ⰰ     䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀Ⰰ     䀀椀渀瘀攀爀琀开琀愀最⤀ 
	    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: 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਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀㬀 
਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀऀऀ 挀漀氀渀⸀氀椀猀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ 
	         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਀ऀऀऀ      㴀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		ORDER BY '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 @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_common_objects]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all common object records਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_common_objects]਀ 
      @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(co.mnem, '')            AS 'Mnemonic',਀             䤀匀一唀䰀䰀⠀挀漀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀     䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
             co.common_object_id            AS 'Common Object ID',਀ऀऀऀ 挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
			 ISNULL(coa.attr_name, '')      AS 'Common Object Attribute Name'਀ऀ    䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  䄀匀 挀漀 
		LEFT JOIN com_obj.common_object_attributes AS coa਀ऀऀ      伀一   挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
			      = co.common_object_attribute_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.';਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	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_dc_by_fnct_lst_nm]    Script Date: Tue 12-05-2026 5:43:19 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_list_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 duty functions 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_funct_fld_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_ppl_lst_nm]    Script Date: Tue 12-05-2026 5:43:19 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_people_list_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: 28-12-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs and metadata for documents linked to the given document text field 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_dcs_by_txt_fld_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 @doctextnameid IS NOT NULL਀ऀऀ     䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				 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 NotExist');਀ऀऀऀऀऀ䔀一䐀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 一漀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			BEGIN਀ऀऀऀ   匀䔀吀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
			            FROM base.global_settings_groups਀ऀऀऀ        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			    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 DefFrTextIdNotExist.');਀ऀऀऀऀऀ䔀一䐀 
		     END -- END checking the default doc text name field id਀ 
  ਀ 
    -- 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ 
		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  ਀ऀऀऀ  
       -- 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 ਀ऀऀऀऀऀ愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                -- 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_all_doc_com_obj_ms_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all document commonobject multi-select 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_ms_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 ਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  ਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
 		BEGIN TRY਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
		         comsll.doc_id                  AS 'Document 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.doc_to_com_obj_ms_list_links AS comsll਀ऀऀऀऀ  伀一       挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  = comsll.common_object_id਀ऀऀऀऀऀ  䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  = comsll.common_object_list_id਀ऀऀऀ䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
			       ON         comsll.doc_id਀ऀऀऀऀ      㴀  猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_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.';਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀऀ䔀一䐀 吀刀夀 
		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;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀㬀     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  ਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
 		BEGIN TRY਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
		         corbll.doc_id                  AS 'Document 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.doc_to_com_obj_radiob_links AS corbll਀ऀऀऀऀ  伀一       挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  = corbll.common_object_id਀ऀऀऀऀऀ  䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  = corbll.common_object_list_id਀ऀऀऀ䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
			       ON         corbll.doc_id਀ऀऀऀऀ      㴀  猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_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.';਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀऀ䔀一䐀 吀刀夀 
		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;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开搀愀琀攀开昀椀攀氀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all document date fields਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_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',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 doc_date_name_id  AS 'Document Date Field Name ID'਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀搀昀渀 
		ORDER BY '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;	਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_doc_id_contains]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ㄀㈀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀攀爀攀 琀栀攀 搀漀挀 椀搀 挀漀渀琀愀椀渀猀 愀 最椀瘀攀渀 猀琀爀椀渀最⸀ 
-- Includes the associated files.  Does not apply a filter group. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀䘀愀椀氀✀Ⰰ 
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @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;਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- 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. ');਀ऀ䔀一䐀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 SET @likestring = REPLACE(@likestring, '\', '\\');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀─✀Ⰰ ✀尀─✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '_', '\_');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀嬀✀Ⰰ ✀尀嬀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
਀ 
		 -- Add authentication.#######਀ 
   ਀ 
    -- 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 ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ  
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_files_by_doc_TVF(@documentid) 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਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_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_all_doc_int_fields]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Selects all document integer field names਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_int_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_int_name_id   AS 'Document Integer Field Name ID'਀ऀ    䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀椀昀渀 
    ORDER BY 'Document Integer 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_doc_ms_attributes]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Selects all data from the doc_multi_select_attributes table਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_ms_attributes] ਀ 
  @message nvarchar(1000)          = 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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀऀ      搀洀猀氀渀⸀搀漀挀开洀猀开氀椀猀琀开椀搀     䄀匀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
		      dmsln.attr_name          AS 'Doc Multi-Select List Name',਀ऀऀऀ  搀洀猀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀      䄀匀 ✀一愀洀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
	          dmsa.doc_ms_attr_id      AS 'Doc Multi-Select Attribute ID',਀ऀ          䤀匀一唀䰀䰀⠀搀洀猀愀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			  dmsa.attr_name           AS 'Doc Multi-Select Attribute Name', ਀ऀ          䤀匀一唀䰀䰀⠀搀洀猀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	          dmsa.list_position       AS 'List Position'਀ऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 搀洀猀愀 
    LEFT JOIN doc_attr.doc_multi_select_list_names AS dmsln਀           伀一 搀洀猀氀渀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 搀洀猀愀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
	 ORDER BY 'Name List Position', '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 Success.');਀  䔀一䐀 䌀䄀吀䌀䠀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_doc_ms_lists]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Selects all data from the doc_multi_select_list_names table਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_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 doc_attr.doc_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;	਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_doc_radiob_attr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation.਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀猀⸀ 
-- Output is the list of attributes, plus a message and transaction status. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_radiob_attr] ਀ 
  @message nvarchar(1000)          = 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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀ          昀爀戀氀渀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
		      frbln.attr_name          AS 'Doc Radio Button List Name',਀ऀऀऀ  昀爀戀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀      䄀匀 ✀一愀洀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
	          frba.doc_radiob_attr_id  AS 'Doc Radio Button Attribute ID',਀ऀ          䤀匀一唀䰀䰀⠀昀爀戀愀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			  frba.attr_name           AS 'Doc Radio Button Attribute Name', ਀ऀ          䤀匀一唀䰀䰀⠀昀爀戀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	          frba.list_position       AS 'Attribute List Position'਀ऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 昀爀戀愀 
    LEFT JOIN doc_attr.doc_radio_button_list_names AS frbln਀           伀一 昀爀戀氀渀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 昀爀戀愀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
	 ORDER BY 'Name List Position', 'Attribute 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.');਀ 
਀  䔀一䐀 䌀䄀吀䌀䠀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开爀愀搀椀漀戀开氀椀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 12-06-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_radiob_list_id          AS 'Doc Radio Button List ID', ਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀            䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			  attr_name                   AS 'Doc Radio Button List Name', ਀ऀ          䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀           䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	          ISNULL(list_position, 0)    AS 'List Position', ਀ऀऀऀ  䤀匀一唀䰀䰀⠀爀攀猀琀爀椀挀琀攀搀Ⰰ 　⤀       䄀匀 ✀刀攀猀琀爀椀挀琀攀搀✀ 
	     FROM doc_attr.doc_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 'Document Real Number Field Name',਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
              ISNULL(descr, '') AS 'Description',਀              搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  䄀匀 ✀䐀漀挀甀洀攀渀琀 刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
	     FROM doc_attr.doc_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_doc_text_fields]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Selects all document free text field names਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_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',਀              䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀     䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
              doc_free_text_name_id AS 'Document Free Text Field Name ID'਀ऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀昀琀昀渀 
     ORDER BY 'Document 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;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开砀爀攀昀猀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀猀 愀渀搀 愀氀猀漀 昀椀氀攀猀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀猀Ⰰ 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀Ⰰ 戀礀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀⸀ 
-- Input is a document id.  A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开砀爀攀昀猀开戀礀开搀漀挀崀  
      @documentid nvarchar(50)         = 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.਀ 
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                     = NULL,਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- 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 view 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.');਀ऀऀऀऀ 䔀一䐀   
਀ 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.xref_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;਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @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_br_tr_node]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 戀爀漀眀猀椀渀最 琀愀最⸀ 一漀 昀椀氀琀攀爀椀渀最 椀猀 愀瀀瀀氀椀攀搀 
-- and no file records are included. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 挀漀洀瀀爀椀猀攀猀 愀 氀漀最椀挀愀氀 䄀一䐀 漀昀 愀氀氀 漀昀 琀栀攀 愀渀挀攀猀琀漀爀猀 漀昀 琀栀攀 最椀瘀攀渀 琀愀最Ⰰ 椀渀挀氀甀搀椀渀最 琀栀攀 琀愀最⸀ 
-- 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_all_docs_by_br_tr_node] ਀ 
      @tag_br_tree_node_id bigint      = NULL,    ਀ऀ  䀀琀愀最开琀爀攀攀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ   ⴀⴀ 䄀渀 漀瀀琀椀漀渀愀氀 琀愀最 琀爀攀攀 琀漀 戀攀 愀瀀瀀氀椀攀搀 琀漀 琀栀攀 琀愀最 琀漀 爀攀琀爀椀攀瘀攀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 琀愀最⸀ 
	  @tag_descendants nvarchar(3)     = 'ON',   -- A switch which determines whether descendants of the given tag are included.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @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(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @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 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਀ऀऀऀ 䔀一䐀 
਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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 IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		-- Select the tag at the given browsing tree node, plus all its ancestors.਀ऀऀⴀⴀ 䘀漀爀 攀愀挀栀 漀昀 琀栀漀猀攀 琀愀最猀Ⰰ 椀昀 䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 㴀 ✀伀一✀ 琀栀攀渀 爀攀琀爀椀攀瘀攀 愀氀氀 漀昀 琀栀攀椀爀 
		-- descendants from the given tag tree.਀ऀऀⴀⴀ 䤀昀 琀栀攀 椀渀瘀攀爀琀开琀愀最 昀氀愀最 椀猀 琀爀甀攀Ⰰ 琀栀攀渀 攀砀挀氀甀搀攀 愀氀氀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 愀爀攀 氀椀渀欀攀 琀漀 琀栀攀  
		-- inverted tag, plus all its descendant tags. ਀ऀऀⴀⴀ 匀攀氀攀挀琀 愀氀氀 琀栀攀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 愀氀氀 漀昀 琀栀攀 琀愀最猀⸀  
਀            圀䤀吀䠀 䈀爀漀眀猀椀渀最吀爀攀攀䄀渀挀攀猀琀漀爀猀 䄀匀 ⠀ 
                 -- Get the specified node and all its ancestors, excluding the root node਀                 匀䔀䰀䔀䌀吀 琀戀琀渀愀⸀琀愀最开椀搀Ⰰ 琀戀琀渀愀⸀椀渀瘀攀爀琀开琀愀最 
                 FROM tagging.tag_browsing_tree_nodes tbtna਀                 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 琀戀琀渀 
                      ON tbtna.tag_browsing_tree_id = tbtn.tag_browsing_tree_id਀                     䄀一䐀 琀戀琀渀⸀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀琀戀琀渀愀⸀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀ 
                WHERE tbtn.browsing_tree_node_id = @tag_br_tree_node_id਀ऀऀऀऀ  䄀一䐀 琀戀琀渀愀⸀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㰀㸀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀ 
             ),਀             吀愀最吀爀攀攀䐀攀猀挀攀渀搀愀渀琀猀 䄀匀 ⠀ 
                 -- Get all descendants of the tags (including the tags themselves) if @tag_descendants is 'ON'਀                 ⴀⴀ 䤀䴀倀伀刀吀䄀一吀㨀 倀爀攀猀攀爀瘀攀 琀栀攀 漀爀椀最椀渀愀琀椀渀最 愀渀挀攀猀琀漀爀 琀愀最开椀搀 愀渀搀 椀渀瘀攀爀琀开琀愀最 昀氀愀最 
                 SELECT DISTINCT bta.tag_id AS ancestor_tag_id, ISNULL(bta.invert_tag, 0) AS invert_tag, ttd.tag_id਀                 䘀刀伀䴀 䈀爀漀眀猀椀渀最吀爀攀攀䄀渀挀攀猀琀漀爀猀 戀琀愀 
                 JOIN tagging.tag_tree_nodes ttn ON bta.tag_id = ttn.tag_id AND ttn.tag_tree_id = @tag_treeid਀                 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 琀琀搀 
                     ON ttd.tag_tree_id = ttn.tag_tree_id਀                    䄀一䐀 ⠀琀琀搀⸀琀愀最开椀搀 㴀 琀琀渀⸀琀愀最开椀搀 
                     OR (@tag_descendants = 'ON' AND ttd.tag_tree_hierarchyid.IsDescendantOf(ttn.tag_tree_hierarchyid) = 1))਀             ⤀Ⰰ 
	-- Count of distinct non-inverted ancestor tags (the number of AND conditions)਀             一漀渀䤀渀瘀攀爀琀攀搀䄀渀挀攀猀琀漀爀䌀漀甀渀琀 䄀匀 ⠀ 
                 SELECT COUNT(DISTINCT ancestor_tag_id) AS tag_count਀                 䘀刀伀䴀 吀愀最吀爀攀攀䐀攀猀挀攀渀搀愀渀琀猀 
                 WHERE invert_tag = 0਀             ⤀Ⰰ 
             IncludedDocs AS (਀                 ⴀⴀ 䜀攀琀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 䄀䰀䰀 渀漀渀ⴀ椀渀瘀攀爀琀攀搀 琀愀最 最爀漀甀瀀猀 ⠀氀漀最椀挀愀氀 䄀一䐀⤀ 
                 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)਀             ⤀Ⰰ 
 --==============================================਀ऀऀ搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 吀愀最最攀搀䐀漀挀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = 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 @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_docs_by_co_ms_attr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 洀攀琀愀搀愀琀愀 戀礀 搀漀挀甀洀攀渀琀 挀漀洀洀漀渀 漀戀樀攀挀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀渀欀⸀ 
-- Input is a common object list id and a common object id and an optional form id.਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开挀漀开洀猀开愀琀琀爀 椀渀 琀栀愀琀 椀琀 搀漀攀猀 渀漀琀 愀瀀瀀氀礀 愀 昀椀氀琀攀爀 最爀漀甀瀀 
-- and does not retrieve associated file metadata. ਀ 
-- 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_by_co_ms_attr] ਀ 
     @formid bigint                   = NULL,  ਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid 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 ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@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਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
	--  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਀ 
਀  ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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਀ 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀     猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.common_object_id      = @commonobjectid) 	਀ऀऀऀ  
       -- 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 ਀ऀऀऀऀऀ愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                -- 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_all_docs_by_co_rb_attr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 洀攀琀愀搀愀琀愀 戀礀 搀漀挀甀洀攀渀琀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀渀欀⸀ 
-- Input is a common object list id and a common object id and an optional form id.਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开挀漀开爀戀开愀琀琀爀 椀渀 琀栀愀琀 椀琀 搀漀攀猀 渀漀琀 愀瀀瀀氀礀 愀 昀椀氀琀攀爀 最爀漀甀瀀 
-- and does not retrieve associated file metadata. ਀ 
-- 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_by_co_rb_attr] ਀ 
     @formid bigint                   = NULL,  ਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid 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 ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@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਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
	--  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਀ 
਀  ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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਀ 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀     猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.common_object_id      = @commonobjectid) 	਀ऀऀऀ  
       -- 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 ਀ऀऀऀऀऀ愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                -- 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_all_docs_by_doc_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㈀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
-- Only applies to document groups for which the connected has has rights to਀ⴀⴀ 愀渀搀 漀渀氀礀 氀椀猀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
-- A filter group is not applied.  Metadata for related files is not included.   ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 搀漀挀甀洀攀渀琀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开搀漀挀开最爀漀甀瀀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  
	 @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 ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@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,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		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;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- 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਀ऀऀ  䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 
			 SET @docgroupid = NULL;਀ 
		  IF @docgroupid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_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.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ   䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  ⴀⴀ 搀漀挀 最爀漀甀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 -- Authenticate the user for the given document group਀ऀऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 渀攀最愀琀椀瘀攀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		  EXEC [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ऀऀऀऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 㴀 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 
				@user_authentication_result = @temp_userauth_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਀ 
   -- 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 -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
	     SELECT searchtable.doc_id       AS ID਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
                        )਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.ID            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.ID, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.ID਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    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਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ 
 -- 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 @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_docs_by_dty_funct]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开搀琀礀开昀甀渀挀琀崀  
      @functionid 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	਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
   -- 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 @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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀甀渀挀琀椀漀渀开椀搀 
		               = @functionid       --### 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_file]    Script Date: Tue 12-05-2026 5:43:19 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_all_docs_by_file] ਀      䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
	  @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,਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                          -- or alternatively if the file does not exist.  The result does not distinguish either. 	਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @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');਀ऀ䔀一䐀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
     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਀ऀ 䔀一䐀 
਀ 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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਀           ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      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)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_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_docs_by_funct_lst]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开昀甀渀挀琀开氀猀琀崀  
      @functionlistid 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	਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
  -- 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 @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_people_lst]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 瀀攀漀瀀氀攀 氀椀猀琀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开瀀攀漀瀀氀攀开氀猀琀崀  
      @peoplelistid 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਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
   -- 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਀ऀऀऀ䔀一䐀 
਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		               = @peoplelistid      --### 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_radio_btn]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开爀愀搀椀漀开戀琀渀崀  
      @docradiobattrid 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 @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.');਀ऀऀऀ䔀一䐀  
		ELSE -- @docradiobattrid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀   ⌀⌀⌀ 
					IF NOT EXISTS (SELECT doc_radiob_attr_id       ਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀   
			  	 					WHERE doc_radiob_attr_id = @docradiobattrid) -- Check if the the search criteria 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 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 doc_attr.doc_radio_button_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_radiob_attr_id = @docradiobattrid)     --### 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: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according linked to a given tag. No filtering is applied਀ⴀⴀ 愀渀搀 渀漀 昀椀氀攀 爀攀挀漀爀搀猀 愀爀攀 椀渀挀氀甀搀攀搀⸀  
-- 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. ਀ⴀⴀ 吀栀椀猀 匀倀 搀椀昀昀攀爀猀 昀爀漀洀 匀䔀䰀开搀漀挀猀开戀礀开琀愀最 椀渀 琀栀愀琀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀 愀渀搀 渀漀琀 昀椀氀攀猀 搀愀琀愀 椀猀 爀攀琀爀椀攀瘀攀搀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开琀愀最崀  
      @tag_id bigint                   = NULL,    ਀ऀ  䀀琀愀最开琀爀攀攀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ   ⴀⴀ 䄀渀 漀瀀琀椀漀渀愀氀 琀愀最 琀爀攀攀 琀漀 戀攀 愀瀀瀀氀椀攀搀 琀漀 琀栀攀 琀愀最 琀漀 爀攀琀爀椀攀瘀攀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 琀愀最⸀ 
	  @tag_descendants nvarchar(3)     = 'ON',   -- A switch which determines whether descendants of the given tag are included.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @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(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @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 @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਀ 
਀ 
		  --  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਀ 
਀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀⴀⴀ 匀攀氀攀挀琀 愀氀氀 琀栀攀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 琀栀攀 最椀瘀攀渀 琀愀最 
			WITH BaseTag AS (਀ऀऀऀऀ匀䔀䰀䔀䌀吀 琀愀最开椀搀Ⰰ 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
				FROM tagging.tag_tree_nodes਀ऀऀऀऀ圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀 
				AND tag_tree_id = @tag_treeid਀ऀऀऀ⤀Ⰰ 
			TaggedDocs AS (਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 琀搀氀⸀搀漀挀开椀搀 
				FROM tagging.tag_tree_nodes AS ttn਀ऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 䈀愀猀攀吀愀最 䄀匀 戀琀 
					ON (@tag_descendants = 'ON' ਀ऀऀऀऀ       䄀一䐀 琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀戀琀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀⤀ 
					   OR ttn.tag_tree_hierarchyid = 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)਀ऀऀ   
	਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (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 @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_docs_by_text_field]    Script Date: Tue 12-05-2026 5:43:19 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. ਀ऀ  䀀氀椀欀攀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰऀ   
	  @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਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 SET @likestring = REPLACE(@likestring, '\', '\\');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀─✀Ⰰ ✀尀─✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '_', '\_');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀嬀✀Ⰰ ✀尀嬀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @doctextnameid IS NOT NULL਀ऀऀ     䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				 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 NotExist');਀ऀऀऀऀऀ䔀一䐀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 一漀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			BEGIN਀ऀऀऀ   匀䔀吀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
			            FROM base.global_settings_groups਀ऀऀऀ        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			    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 DefFrTextIdNotExist.');਀ऀऀऀऀऀ䔀一䐀 
		     END -- END checking the default doc text name field id਀ 
  ਀ 
    -- 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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ 
		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    ਀ऀऀऀ  䄀一䐀 ⠀ 
		    (@likestring IS NULL AND searchtable.text_value IS NULL)  -- Caters for searching for records where the string is NULL਀ऀऀ    伀刀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀琀攀砀琀开瘀愀氀甀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀ 䔀匀䌀䄀倀䔀 ✀尀✀⤀ ⤀ 
		         )਀ऀऀऀ  
       -- 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 ਀ऀऀऀऀऀ愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                -- 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_all_docs_by_user]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 甀猀攀爀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开甀猀攀爀崀  
      @sidid 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 record 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.');਀ऀऀऀऀ 䔀一䐀 
਀ 
਀   
    -- 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.sid_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: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document data linked to a user 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. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_by_user_fgn] ਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ    
	  @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_docs_date_after]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 瘀愀氀甀攀 愀昀琀攀爀 愀 最椀瘀攀渀 搀愀琀攀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开愀昀琀攀爀崀  
      @docdatenameid bigint            = 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਀䄀匀 
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 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਀ऀऀऀ  䄀一䐀 ऀ猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㸀 䀀搀愀琀攀瘀愀氀甀攀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
		  ਀ऀऀ  ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (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_date_any]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ㄀㈀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀 搀愀琀愀 昀漀爀 愀渀礀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 琀栀攀 最椀瘀攀渀 搀愀琀攀 昀椀攀氀搀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开愀渀礀崀  
      @docdatenameid 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;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ 
-- 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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
		  ਀ऀऀ  ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (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_date_before]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 瘀愀氀甀攀 戀攀昀漀爀攀 愀 最椀瘀攀渀 搀愀琀攀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开戀攀昀漀爀攀崀  
      @docdatenameid bigint            = 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਀ऀऀऀ䔀一䐀 
਀   
    -- 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਀ऀऀऀ  䄀一䐀 ऀ猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㰀 䀀搀愀琀攀瘀愀氀甀攀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
		  ਀ऀऀ  ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (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_date_between]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 椀昀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 瘀愀氀甀攀 椀猀 戀攀琀眀攀攀渀 最椀瘀攀渀 搀愀琀攀猀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开戀攀琀眀攀攀渀崀  
      @docdatenameid 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',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@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਀ 
਀   
    -- 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਀ऀऀ  䄀一䐀  ⠀猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㰀 䀀氀愀琀攀爀开搀愀琀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㸀 䀀攀愀爀氀椀攀爀开搀愀琀攀⤀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀 
		  ਀ऀऀ  ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (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_date_equals]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 瘀愀氀甀攀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开攀焀甀愀氀猀崀  
      @docdatenameid bigint            = 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਀ऀऀऀ䔀一䐀 
਀   
    -- 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਀ऀऀऀ  䄀一䐀 ऀ猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㴀 䀀搀愀琀攀瘀愀氀甀攀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
		  ਀ऀऀ  ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (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_for_user]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开昀漀爀开甀猀攀爀崀  
	  @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 @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 user_restr.sid_list AS sl਀ऀ        伀一 猀攀愀爀挀栀琀愀戀氀攀⸀猀椀搀开椀搀 
			   =        sl.sid_id਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE sl.sid = @connectedusersid      --### 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_any]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 眀栀椀挀栀 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 昀椀攀氀搀 䤀䐀⸀ 
-- A filter group is not applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开椀渀琀开愀渀礀崀  
	  @docintnameid 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਀ऀऀऀ䔀一䐀 
਀ 
਀     ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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_between]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 昀椀攀氀搀 椀猀 戀攀琀眀攀攀渀 最椀瘀攀渀 瘀愀氀甀攀猀⸀ 
-- Differs from reading.usp_SEL_docs_int_between in that a filter group is not applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开椀渀琀开戀攀琀眀攀攀渀崀  
	  @docintnameid bigint             = NULL,   ਀ऀ  䀀氀漀眀攀爀开椀渀琀开瘀愀氀甀攀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @upper_int_value 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 > @lower_int_value AND searchtable.int_value < @upper_int_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: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files according to a given integer.਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开搀漀挀猀开椀渀琀开攀焀甀愀氀猀 椀渀 琀栀愀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 渀漀琀 愀瀀瀀氀椀攀搀⸀  
-- 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_equals] ਀ऀ  䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ    
	  @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਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀     ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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 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_int_grtr_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_int_less_than]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 昀椀攀氀搀 椀猀 氀攀猀猀 琀栀愀渀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- Differs from reading.usp_SEL_docs_int_less_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: 01-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document and associated file metadata by document multi-select attribute link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀Ⰰ 愀渀 漀瀀琀椀漀渀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀 
-- and an optional form 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_all_docs_multi_sel_atr] ਀ऀ  䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	  @docmsattrid bigint              = 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.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @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_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 @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਀ 
਀  ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ 
		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    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀 
			  ) 	਀ऀऀऀ  
       -- 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 ਀ऀऀऀऀऀ愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                -- 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_all_docs_real_any]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ㄀㈀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 眀栀椀挀栀 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 䤀䐀⸀ 
-- A filter group is not applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开爀攀愀氀开愀渀礀崀  
	  @docrealnameid 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 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਀ऀऀऀ䔀一䐀 
਀ 
  ਀ 
    -- 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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
  	  ਀ऀऀऀऀऀ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (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_between]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 椀猀 戀攀琀眀攀攀渀 最椀瘀攀渀 瘀愀氀甀攀猀⸀ 
-- Differs from reading.usp_SEL_docs_real_between in that a filter group is not applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开爀攀愀氀开戀攀琀眀攀攀渀崀  
	  @docrealnameid bigint            = NULL,   ਀ऀ  䀀氀漀眀攀爀开爀攀愀氀开瘀愀氀甀攀 爀攀愀氀           㴀 一唀䰀䰀Ⰰ 
	  @upper_real_value 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 > @lower_real_value AND searchtable.real_value < @upper_real_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: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files where the value for a given real number field is equal to 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_equals] ਀ऀ  䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ    
	  @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਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀   
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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_greater]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 椀猀 最爀攀愀琀攀爀 琀栀愀渀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- Differs from reading.usp_SEL_docs_real_greater_than 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. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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_less]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 椀猀 氀攀猀猀 琀栀愀渀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- Differs from reading.usp_SEL_docs_real_less_than 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. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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_with_ed_perm]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ　㠀ⴀ㈀　㈀㐀 
-- Description:	Returns the metadata for all the documents which the user has edit permission for. ਀ 
  -- To have edit permission for a document the user must first have view permission for that file.਀  ⴀⴀ 嘀椀攀眀椀渀最 爀攀猀琀爀椀挀琀椀漀渀猀 漀瘀攀爀爀椀搀攀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀⸀   
  -- Edit permissions work differently from view permissions.  With view permissions a document਀  ⴀⴀ 椀猀 瘀椀攀眀愀戀氀攀 戀礀 搀攀昀愀甀氀琀⸀  圀椀琀栀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 爀攀猀琀爀椀挀琀攀搀 戀礀 搀攀昀愀甀氀琀⸀  
  -- A user has edit permission for a document if there is a chain from the document ID through਀  ⴀⴀ 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 猀椀搀 椀渀 琀栀攀 猀椀搀 氀椀猀琀 眀栀椀挀栀 椀猀 琀栀攀 猀椀搀 昀漀爀 琀栀攀 甀猀攀爀 漀爀 愀 猀椀搀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀⸀ 
  -- If user is a controller then they have editing rights to any document they have viewing rights to਀  ⴀⴀ 攀砀挀攀瀀琀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 眀栀椀挀栀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
  -- If the document 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਀  ⴀⴀ 攀砀挀氀甀搀攀 愀渀搀 漀瘀攀爀爀椀搀攀 愀渀礀 攀搀椀琀漀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  䄀 挀漀渀琀爀漀氀氀攀爀 挀愀渀渀漀琀 搀攀氀攀最愀琀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  
਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开眀椀琀栀开攀搀开瀀攀爀洀崀  
-- DRAFT IN PROGRESS਀      䀀昀漀爀洀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ     
	  @message nvarchar(1000)           = ''   OUTPUT,਀ऀ  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                   = NULL OUTPUT,਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                   㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint              = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀            㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀Ⰰ 
  		@connectedusersid varbinary(100)   = NULL, -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ   
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@view_permission  nvarchar(10)     = NULL,਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀Ⰰ 
		@dociscontrollergroup nvarchar(5)  = NULL;਀ 
਀ऀ䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
	  (਀  ऀऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
			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;਀  匀䔀吀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- 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਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀  䈀䔀䜀䤀一 
    -- Check if the user is a controller਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀 
਀        䈀䔀䜀䤀一 吀刀夀 
            -- CTE to get all documents the user has edit permission for਀            圀䤀吀䠀 䔀搀椀琀愀戀氀攀䐀漀挀猀䌀吀䔀 䄀匀 ⠀ 
                SELECT DISTINCT dil.doc_id AS ID ਀                䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
                LEFT JOIN xref.doc_group_links AS dgl ਀ऀऀऀऀ       伀一   搀椀氀⸀搀漀挀开椀搀  
					      = dgl.doc_id਀                䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀  
				       ON   dgl.doc_group_id ਀ऀऀऀऀऀ      㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
                LEFT JOIN xref.controller_doc_group_links AS cdgl ਀ऀऀऀऀ       伀一    搀椀氀⸀搀漀挀开椀搀  
					      = cdgl.doc_id਀                䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 挀搀最渀  
				       ON   cdgl.controller_doc_group_name_id ਀ऀऀऀऀऀ      㴀 挀搀最渀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
                WHERE ਀                    ⴀⴀ 䌀漀渀琀爀漀氀氀攀爀 眀椀琀栀 瘀椀攀眀椀渀最 爀椀最栀琀猀Ⰰ 攀砀挀攀瀀琀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀猀 琀栀攀礀✀爀攀 渀漀琀 瀀愀爀琀 漀昀 
                    (@iscontroller = 'Pass' AND਀                    ⠀挀搀最氀⸀搀漀挀开椀搀 䤀匀 一唀䰀䰀 伀刀 
                    EXISTS (਀                        匀䔀䰀䔀䌀吀 ㄀ 
                        FROM user_restr.controller_doc_group_sid_links AS cdgsl਀                        䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀  
						  ON cdgsl.sid_id ਀ऀऀऀऀऀऀ     㴀  猀氀⸀猀椀搀开椀搀 
                       WHERE  cdgsl.controller_doc_group_name_id ਀ऀऀऀऀऀ         㴀 挀搀最渀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
                        AND sl.sid = @connectedusersid ਀                    ⤀⤀⤀ 
                    OR਀                    ⴀⴀ 一漀渀ⴀ挀漀渀琀爀漀氀氀攀爀 眀椀琀栀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 
                    (@iscontroller = 'Fail' AND਀                    ⠀ 
                        -- Through function list਀                        䔀堀䤀匀吀匀 ⠀ 
                            SELECT 1਀                            䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 搀最攀瀀昀氀 
                            JOIN people.function_list_names AS fln ਀ऀऀऀऀऀऀऀ  伀一 搀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
							     =  fln.function_list_id਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀  
							  ON  fln.function_list_id ਀ऀऀऀऀऀऀऀ     㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
                            JOIN people.duty_functions AS df ਀ऀऀऀऀऀऀऀ  伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀  
							     = df.function_id਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀  
							  ON     df.function_id ਀ऀऀऀऀऀऀऀ     㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
                            JOIN user_restr.sid_list AS sl ਀ऀऀऀऀऀऀऀ  伀一 搀昀猀氀⸀猀椀搀开椀搀  
							     = sl.sid_id਀                            圀䠀䔀刀䔀 搀最攀瀀昀氀⸀搀漀挀开最爀漀甀瀀开椀搀  
							      =  dgn.doc_group_id਀                            䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀  
                        )਀                        伀刀 
                        -- Through people list਀                        䔀堀䤀匀吀匀 ⠀ 
                            SELECT 1਀                            䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀 䄀匀 搀最攀瀀瀀氀 
                            JOIN people.people_list_names AS pln ਀ऀऀऀऀऀऀऀ  伀一 搀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
							     =  pln.people_list_id਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀  
							  ON  pln.people_list_id ਀ऀऀऀऀऀऀऀ     㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
                            JOIN user_restr.sid_list AS sl ਀ऀऀऀऀऀऀऀ  伀一   瀀氀⸀猀椀搀开椀搀  
							     = sl.sid_id਀                           圀䠀䔀刀䔀 搀最攀瀀瀀氀⸀搀漀挀开最爀漀甀瀀开椀搀  
							     =  dgn.doc_group_id਀                            䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀  
                        )਀                    ⤀⤀ 
            ),਀            搀漀挀䐀愀琀愀䌀吀䔀 䄀匀 ⠀ 
                SELECT ਀                    䔀搀椀琀愀戀氀攀䐀漀挀猀䌀吀䔀⸀䤀䐀 䄀匀 搀漀挀椀搀Ⰰ  
                    doc_data.field_type, ਀                    搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
                    doc_data.field_name, ਀                    搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
                    doc_data.attr_id, ਀                    搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ  
                    doc_data.units, ਀                    搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀 
                FROM EditableDocsCTE਀                䌀刀伀匀匀 䄀倀倀䰀夀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀崀⠀䔀搀椀琀愀戀氀攀䐀漀挀猀䌀吀䔀⸀䤀䐀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
            ),਀            䄀琀琀䐀愀琀愀䌀吀䔀 䄀匀 ⠀ 
                SELECT ਀                    䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀䐀愀琀愀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
                    docDataCTE.*਀                䘀刀伀䴀 搀漀挀䐀愀琀愀䌀吀䔀 
            )਀ 
            INSERT INTO @AttData (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀            匀䔀䰀䔀䌀吀  
                doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position਀            䘀刀伀䴀 䄀琀琀䐀愀琀愀䌀吀䔀㬀 
਀            匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀            匀䔀䰀䔀䌀吀  
                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਀            伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀            匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ 
 -- 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, 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);਀ 
਀䔀一䐀 
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.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀渀 漀瀀琀椀漀渀愀氀 昀漀爀洀 䤀䐀⸀   
-- Does not apply a filter group.  Does not retrieve associated files. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_documents] ਀ 
      @formid bigint                   = NULL,   -- Optional input parameter਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @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 ਀ऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	@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਀ 
  -- 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 -- End IF @userauthentication_status = 'Pass' ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
 ਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
         SELECT doc_id      AS ID ਀ऀ       䘀刀伀䴀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ ⤀Ⰰ  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最⸀ 
਀ऀऀ搀漀挀䐀愀琀愀䌀吀䔀 䄀匀 ⠀ 
			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_duty_fnct_sid_lnks]    Script Date: Tue 12-05-2026 5:43:19 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. 2025਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists all records from people.duty_function_sid_links.਀⨀  
* **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_fnct_sid_lnks] ਀ 
	 @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 ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@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 users 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;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Reviewer',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  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਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 
				 dfsl.function_id                AS 'Duty Function ID', ਀ऀऀऀऀ 搀昀⸀渀愀洀攀                         䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀Ⰰ 
				 dfsl.sid_id                     AS 'User ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀             䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
		         ISNULL(sl.username, '')         AS 'System Username',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀昀猀氀⸀渀漀琀攀猀Ⰰ ✀✀⤀          䄀匀 ✀一漀琀攀猀✀Ⰰ 
		         CONVERT(NVARCHAR(30), dfsl.created, 120) AS 'Created',਀ऀऀऀऀ 搀昀猀氀⸀最爀愀渀琀攀搀开戀礀                 䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ऀऀऀऀ  
		    FROM people.duty_function_sid_links AS dfsl਀ऀ   䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			  ON dfsl.sid_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: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all duty functions.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 搀甀琀礀 昀甀渀挀琀椀漀渀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 搀甀琀礀 昀甀渀挀琀椀漀渀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ一漀渀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of duty function 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(),     -- The username ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT਀ऀऀऀऀ 搀昀⸀昀甀渀挀琀椀漀渀开椀搀             䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ  
				 ISNULL(df.mnem, '')        AS 'Mnemonic',਀ऀऀऀऀ 搀昀⸀渀愀洀攀                    䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀Ⰰ 
				 ISNULL(df.description, '') AS 'Description',਀ऀऀऀऀ 搀昀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		    FROM people.duty_functions AS df  ਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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_all_file_date_fields]    Script Date: Tue 12-05-2026 5:43:19 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 'File Date Field Name',਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
              ISNULL(descr, '') AS 'Description',਀ऀ          昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 ✀䘀椀氀攀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
	     FROM file_attr.file_date_field_names AS fdfn਀     伀刀䐀䔀刀 䈀夀 ✀䘀椀氀攀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀✀㬀 
	  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_int_fields]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Selects all file integer field names਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_file_int_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_int_name_id  AS 'File Integer Field Name ID'਀ऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀椀昀渀 
     ORDER BY 'File Integer 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_file_ms_attributes]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation.਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀猀⸀ 
-- Output is the list of attributes, plus a message and transaction status. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_file_ms_attributes] ਀ 
  @message nvarchar(1000)          = 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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀऀ       昀洀猀氀渀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀    䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
		       fmsln.attr_name          AS 'File Multi-Select List Name',਀ऀऀऀ   昀洀猀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀      䄀匀 ✀一愀洀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
	           fmsa.file_ms_attr_id     AS 'File Multi-Select Attribute ID',਀ऀ           䤀匀一唀䰀䰀⠀昀洀猀愀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			   fmsa.attr_name           AS 'File Multi-Select Attribute Name', ਀ऀ           䤀匀一唀䰀䰀⠀昀洀猀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	           fmsa.list_position       AS 'List Position'਀ऀ      䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 昀洀猀愀 
     LEFT JOIN file_attr.file_multi_select_list_names AS fmsln਀ऀऀ    伀一 昀洀猀氀渀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 昀洀猀愀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
	  ORDER BY 'Name List Position', '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 @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਀ऀ   匀䔀䰀䔀䌀吀  
	          file_ms_list_id   AS 'File Multi-Select List ID', ਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			  attr_name         AS 'File 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;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_file_radiob_attr]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation.਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀猀⸀ 
-- Output is the list of attributes, plus a message and transaction status. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_file_radiob_attr] ਀ 
  @message nvarchar(1000)          = 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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀ          昀爀戀氀渀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
		      frbln.attr_name           AS 'File Radio Button List Name',਀ऀऀऀ  昀爀戀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀一愀洀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
	          frba.file_radiob_attr_id  AS 'File Radio Button Attribute ID',਀ऀ          䤀匀一唀䰀䰀⠀昀爀戀愀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			  frba.attr_name            AS 'File Radio Button Attribute Name', ਀ऀ          䤀匀一唀䰀䰀⠀昀爀戀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	          frba.list_position        AS 'Attribute List Position'਀ऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 昀爀戀愀 
    LEFT JOIN file_attr.file_radio_button_list_names AS frbln਀ऀऀ   伀一 昀爀戀氀渀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 昀爀戀愀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
	 ORDER BY 'Name List Position', 'Attribute 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਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_file_radiob_lists]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ　㜀ⴀⴀ㈀　㈀㌀ 
-- 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਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  䈀䔀䜀䤀一 吀刀夀 
	   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_file_real_fields]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Selects all file real number field names਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_file_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',਀              䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
              file_real_name_id AS 'File Real Number Field Name ID'਀ऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀爀渀昀渀 
     ORDER BY 'File 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: 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 Free Text Field Name',਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀       䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
              ISNULL(descr, '')      AS 'Description',਀              昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 ✀䘀椀氀攀 䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
	     FROM file_attr.file_free_text_field_names AS fftfn਀ऀ 伀刀䐀䔀刀 䈀夀 ✀䘀椀氀攀 䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀 一愀洀攀✀㬀 
	  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: 25-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀 最椀瘀攀渀 昀漀爀洀 昀漀爀 愀氀氀 昀椀氀攀猀 
-- but not the file content.  For file content extraction਀ⴀⴀ 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀崀  
਀      䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
      @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	਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
-- ====================================================਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
		BEGIN TRY਀ऀऀ      圀䤀吀䠀 昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
				SELECT file_id AS 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;਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				  ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ 
		  SET @outputformid = @formid;਀ऀऀ  匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀 
		                     FROM forms.form_identifier_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀㬀 
਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
 ਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_by_dty_funct]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given duty function਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- 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 @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 -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_function_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀甀渀挀琀椀漀渀开椀搀 
		               = @functionid    --### 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;਀ 
--============================================================਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ䔀一䐀 吀刀夀 
	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: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Reads file details from xref.file_group_links for a given file group id.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 最爀漀甀瀀 椀搀⸀   
-- Output is a list of file details, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Reads file details from xref.file_group_links for a given file group id.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 昀椀氀攀 搀攀琀愀椀氀猀⸀  伀渀氀礀 昀椀氀攀猀 昀漀爀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 眀椀氀氀 戀攀 氀椀猀琀攀搀⸀ 
* - @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_files_by_file_grp] ਀ 
     @filegroupid bigint              = NULL,਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ    
	 @message nvarchar(1000)          = ''   OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrows bigint                  = 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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @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;  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- 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 @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	਀ऀऀऀ䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 最爀漀甀瀀 椀搀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_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 DISTINCT fm.file_id AS ID਀ऀ                 䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
			INNER JOIN xref.file_group_links AS fgl਀ऀऀऀ        伀一  昀最氀⸀昀椀氀攀开椀搀  
					   = fm.file_id਀            䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
                    ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀऀ 圀䠀䔀刀䔀 昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀Ⰰ ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
਀ 
-- Extract the data according to the file id਀   ऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
		 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਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀      匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     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_all_files_by_filename]    Script Date: Tue 12-05-2026 5:43:19 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. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_by_filename] ਀ 
	  @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',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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';਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    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, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
 ਀  
    -- 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 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਀ऀऀऀऀऀ伀刀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀渀愀洀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀ 䔀匀䌀䄀倀䔀 ✀尀✀⤀ 
				  ਀ऀऀ ⤀Ⰰ 
਀ऀऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
				 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਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_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_by_funct_lst]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given function 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 @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 -- 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 people.file_to_function_list_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		               = @functionlistid    --### 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;਀ 
--============================================================਀ 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     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 @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_ms_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_ms_list] ਀ 
	  @filemslistid 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	਀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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 -- 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_multi_select_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀  
		  AND searchtable.file_ms_attr_id = @filemsattrid   --### 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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 瀀攀漀瀀氀攀 氀椀猀琀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- Differs from reading.usp_SEL_files_by_people_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_pple_list] ਀ 
	  @peoplelistid 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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
   -- 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਀ऀऀऀ䔀一䐀 
਀  
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  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_people_list_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		               = @peoplelistid    --### 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-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. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists file records for a given radio button attribute.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @file_radiobattrid bigint਀⨀ ⴀ 䀀昀漀爀洀椀搀 戀椀最椀渀琀⸀ 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of file records.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nvarchar(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_by_radio_btn] ਀ 
      @file_radiobattrid 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;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- 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 ਀ 
  -- File radio button attribute validation਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 　  
			 SET @file_radiobattrid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀  
			 BEGIN  -- File radio button attribute not supplied਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoAttrID', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀  
				BEGIN  -- Check if the radio button attribute is valid਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
									FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀⤀  
						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.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- 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_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.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਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 眀椀琀栀 愀 琀攀砀琀 昀椀攀氀搀 挀漀渀琀愀椀渀椀渀最 愀 最椀瘀攀渀 猀琀爀椀渀最⸀  
-- 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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开琀砀琀开昀椀攀氀搀崀  
਀ऀ  䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	  @likestring nvarchar(max)        = '', ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @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਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 SET @likestring = REPLACE(@likestring, '\', '\\');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀─✀Ⰰ ✀尀─✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '_', '\_');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀嬀✀Ⰰ ✀尀嬀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
 ਀  
    -- 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.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- 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_free_text_name_id = @filetextnameid  --### The search criteria    ਀ऀऀऀ  䄀一䐀  
			  (਀ऀऀऀऀ⠀䀀氀椀欀攀猀琀爀椀渀最 䤀匀 一唀䰀䰀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀琀攀砀琀开瘀愀氀甀攀 䤀匀 一唀䰀䰀⤀  ⴀⴀ 䌀愀琀攀爀猀 昀漀爀 猀攀愀爀挀栀椀渀最 昀漀爀 爀攀挀漀爀搀猀 眀栀攀爀攀 猀攀愀爀挀栀 猀琀爀椀渀最 椀猀 一唀䰀䰀 
				OR (searchtable.text_value LIKE '%' + @likestring + '%' ESCAPE '\')਀ऀऀऀ  ⤀ 
						)਀ 
	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਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @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: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 甀猀攀爀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- Differs from reading.usp_SEL_files_by_people_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_user] ਀ 
      @sidid 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)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @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 record 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.');਀ऀऀऀऀ 䔀一䐀 
਀  
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  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 fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀猀椀搀开椀搀 
		               = @sidid    --### 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 CONTAINS 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 ਀ऀऀऀऀ  ⠀ 
				  CONTAINS(searchtable.plain_text_content, @containsstring) -- ### 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 ਀ऀऀऀऀ        䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀⤀ 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
						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_containstabl]    Script Date: Tue 12-05-2026 5:43:19 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_containstabl] ਀ 
	  @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 CONTAINSTABLE(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਀ 
		 ),਀ 
				 distinctfileidsCTE AS(਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀Ⰰ 
								 fileidsCTE.rank_score,਀ऀऀऀऀ 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀氀攀椀搀猀䌀吀䔀⸀爀愀渀欀开猀挀漀爀攀 䐀䔀匀䌀Ⰰ 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 爀漀眀开渀甀洀戀攀爀 ⴀⴀ 䤀渀挀氀甀搀椀渀最 琀栀椀猀 椀渀 昀椀氀攀椀搀猀䌀吀䔀 挀愀甀猀攀猀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀猀 琀漀 戀攀 挀爀攀愀琀攀搀 
				 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: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where the date for a given date field is after 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_after] ਀ 
      @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਀ऀऀऀ䔀一䐀 
਀  
    -- 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਀ऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㸀 䀀搀愀琀攀瘀愀氀甀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_any]    Script Date: Tue 12-05-2026 5:43:19 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 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਀ऀऀऀ䔀一䐀 
਀  
    -- 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 --### 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 before 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_before] ਀ 
      @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਀ऀऀऀ䔀一䐀 
਀  
    -- 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਀ऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㰀 䀀搀愀琀攀瘀愀氀甀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_between]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 搀愀琀攀 昀漀爀 愀 最椀瘀攀渀 搀愀琀攀 昀椀攀氀搀 椀猀 戀攀琀眀攀攀渀 最椀瘀攀渀 搀愀琀攀猀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开搀愀琀攀开戀攀琀眀攀攀渀崀  
਀      䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @earlier_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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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 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 < @later_date AND searchtable.date_value > @earlier_date)   --### The search criteria value਀ऀऀ  ⤀ 
	                     )਀ 
	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_equals]    Script Date: Tue 12-05-2026 5:43:19 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਀ 
਀  
    -- 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਀ऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㴀 䀀搀愀琀攀瘀愀氀甀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_for_one_doc]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given document id਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. No filter group is applied. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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:਀  ⴀ 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀Ⰰ 
  - are linked to the document id via the table xref.file_to_document_links਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开昀漀爀开漀渀攀开搀漀挀崀  
਀ 
      @documentid nvarchar(50)         = 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    ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @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	਀ 
 -- 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਀  
    -- 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.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 爀攀琀甀爀渀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 椀搀⸀  
	WITH filelist AS (਀ऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀  
			fm.file_id AS ID,਀ऀऀऀ刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀洀⸀昀椀氀攀开椀搀⤀ 䄀匀 爀漀眀开渀甀洀戀攀爀 
		FROM ਀ऀऀऀ戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
		CROSS APPLY ਀ऀऀऀ椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开戀礀开搀漀挀开吀嘀䘀⠀䀀搀漀挀甀洀攀渀琀椀搀⤀ 䄀匀 琀瘀昀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
		WHERE ਀ऀऀऀ   昀洀⸀昀椀氀攀开椀搀  
			= tvf.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 filelist AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 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.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);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开昀漀爀开甀猀攀爀崀  
਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @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)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
਀ऀऀ  
	  -- 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 user_restr.sid_list AS sl਀ऀ        伀一 猀攀愀爀挀栀琀愀戀氀攀⸀猀椀搀开椀搀 
			   =        sl.sid_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_freetext]    Script Date: Tue 12-05-2026 5:43:19 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_freetext] ਀ 
	  @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਀ऀऀ   圀䠀䔀刀䔀  
				  FREETEXT(searchtable.plain_text_content, @containsstring) -- ### The search criteria਀ऀऀ ⤀Ⰰ 
਀ऀऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
				 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 @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: 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  ਀                伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
		 ),਀ 
				 distinctfileidsCTE AS(਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀Ⰰ 
								 fileidsCTE.rank_score,਀ऀऀऀऀ 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀氀攀椀搀猀䌀吀䔀⸀爀愀渀欀开猀挀漀爀攀 䐀䔀匀䌀Ⰰ 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 爀漀眀开渀甀洀戀攀爀 ⴀⴀ 䤀渀挀氀甀搀椀渀最 琀栀椀猀 椀渀 昀椀氀攀椀搀猀䌀吀䔀 挀愀甀猀攀猀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀猀 琀漀 戀攀 挀爀攀愀琀攀搀 
				 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 @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: 28-12-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata which are linked to the given integer 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_int_any] ਀ 
      @fileintnameid 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 @fileintnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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਀ 
	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_int_name_id = @fileintnameid  --### 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 integer field is between two given integer 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_all_files_int_between] ਀ 
      @fileintnameid bigint            = NULL,    ਀ऀ  䀀氀漀眀攀爀开椀渀琀开瘀愀氀甀攀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @upper_int_value 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 @fileintnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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਀ 
          -- 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਀ 
	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_int_name_id = @fileintnameid਀ऀऀ  䄀一䐀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㸀 䀀氀漀眀攀爀开椀渀琀开瘀愀氀甀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㰀 䀀甀瀀瀀攀爀开椀渀琀开瘀愀氀甀攀⤀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_equals]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 昀椀攀氀搀 攀焀甀愀氀猀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 瘀愀氀甀攀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开椀渀琀开攀焀甀愀氀猀崀  
਀      䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @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',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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 @fileintnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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਀ 
          -- 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਀ 
	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_int_name_id = @fileintnameid਀ऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㴀 䀀椀渀琀攀最攀爀瘀愀氀甀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_grtr_than]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 昀椀攀氀搀 椀猀 最爀攀愀琀攀爀 琀栀愀渀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 瘀愀氀甀攀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开椀渀琀开最爀琀爀开琀栀愀渀崀  
਀      䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @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',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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 @fileintnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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਀ 
          -- 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਀ 
	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_int_name_id = @fileintnameid਀ऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㸀 䀀椀渀琀攀最攀爀瘀愀氀甀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_less_than]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 昀椀攀氀搀 椀猀 氀攀猀猀 琀栀愀渀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 瘀愀氀甀攀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开椀渀琀开氀攀猀猀开琀栀愀渀崀  
਀      䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @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',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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 @fileintnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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਀ 
          -- 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਀ 
	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_int_name_id = @fileintnameid਀ऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㰀 䀀椀渀琀攀最攀爀瘀愀氀甀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_any]    Script Date: Tue 12-05-2026 5:43:19 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,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @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਀ऀऀऀ䔀一䐀 
਀  
    -- 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_real_name_id = @filerealnameid --### 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 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_all_files_real_between] ਀ 
      @filerealnameid bigint           = NULL,    ਀ऀ  䀀氀漀眀攀爀开爀攀愀氀开瘀愀氀甀攀 爀攀愀氀           㴀 一唀䰀䰀Ⰰ 
	  @upper_real_value 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',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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਀ 
          -- 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਀ 
	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_real_name_id = @filerealnameid਀ऀऀ  䄀一䐀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀  㸀 䀀氀漀眀攀爀开爀攀愀氀开瘀愀氀甀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀 㰀 䀀甀瀀瀀攀爀开爀攀愀氀开瘀愀氀甀攀⤀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_equals]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 攀焀甀愀氀猀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开爀攀愀氀开攀焀甀愀氀猀崀  
਀      䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @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',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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਀ 
          -- 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਀ 
	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_real_name_id = @filerealnameid਀ऀऀ  䄀一䐀 ऀ猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀  㴀 䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_greater]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 椀猀 最爀攀愀琀攀爀 琀栀愀渀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开爀攀愀氀开最爀攀愀琀攀爀崀  
਀      䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @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',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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਀ 
          -- 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਀ 
	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_real_name_id = @filerealnameid਀ऀऀ  䄀一䐀 ऀ猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀  㸀 䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_less]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 椀猀 氀攀猀猀 琀栀愀渀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开爀攀愀氀开氀攀猀猀崀  
਀      䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @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',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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਀ 
          -- 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਀ 
	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_real_name_id = @filerealnameid਀ऀऀ  䄀一䐀 ऀ猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀  㰀 䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	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_with_ed_perm]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ　㠀ⴀ㈀　㈀㐀 
-- Description:Returns the metadata for all the files which the user has edit permission for. ਀ 
  -- To have edit permission for a file the user must first have view permission for that file.਀  ⴀⴀ 嘀椀攀眀椀渀最 爀攀猀琀爀椀挀琀椀漀渀猀 漀瘀攀爀爀椀搀攀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀⸀   
  -- Edit permissions work differently from view permissions.  With view permissions a file਀  ⴀⴀ 椀猀 瘀椀攀眀愀戀氀攀 戀礀 搀攀昀愀甀氀琀⸀  圀椀琀栀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 琀栀攀 昀椀氀攀 椀猀 爀攀猀琀爀椀挀琀攀搀 戀礀 搀攀昀愀甀氀琀⸀  
  -- A user has edit permission for a file if there is a chain from the file ID through਀  ⴀⴀ 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 猀椀搀 椀渀 琀栀攀 猀椀搀 氀椀猀琀 眀栀椀挀栀 椀猀 琀栀攀 猀椀搀 昀漀爀 琀栀攀 甀猀攀爀 漀爀 愀 猀椀搀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀⸀ 
  -- If user is a controller then they have editing rights to any file they have viewing rights to਀  ⴀⴀ 攀砀挀攀瀀琀 椀昀 琀栀攀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 昀椀氀攀 最爀漀甀瀀 眀栀椀挀栀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
  -- 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. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_with_ed_perm] ਀ 
      @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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
        @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 ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
        @iscontroller nvarchar(5)          = NULL;਀ 
    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 ਀ 
    -- 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'਀    䈀䔀䜀䤀一 
        -- Check if the user is a controller਀        䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
            @role_to_check = 'Controller',਀            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀 
਀        䈀䔀䜀䤀一 吀刀夀 
            -- CTE to get all files the user has edit permission for਀            圀䤀吀䠀 䔀搀椀琀愀戀氀攀䘀椀氀攀猀䌀吀䔀 䄀匀 ⠀ 
                SELECT DISTINCT fm.file_id AS ID ਀                䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
                LEFT JOIN xref.file_group_links AS fgl ਀ऀऀऀऀ       伀一    昀洀⸀昀椀氀攀开椀搀  
					      = fgl.file_id਀                䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀  
				       ON   fgl.file_group_id ਀ऀऀऀऀऀ      㴀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
                LEFT JOIN xref.controller_file_group_links AS cfgl ਀ऀऀऀऀ       伀一     昀洀⸀昀椀氀攀开椀搀  
					      = cfgl.file_id਀                䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 挀昀最渀  
				       ON   cfgl.controller_file_group_name_id ਀ऀऀऀऀऀ      㴀 挀昀最渀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
                WHERE ਀                    ⴀⴀ 䌀漀渀琀爀漀氀氀攀爀 眀椀琀栀 瘀椀攀眀椀渀最 爀椀最栀琀猀Ⰰ 攀砀挀攀瀀琀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀猀 琀栀攀礀✀爀攀 渀漀琀 瀀愀爀琀 漀昀 
                    (@iscontroller = 'Pass' AND਀                    ⠀挀昀最氀⸀昀椀氀攀开椀搀 䤀匀 一唀䰀䰀 伀刀 
					 EXISTS (਀ऀऀऀऀऀऀ 匀䔀䰀䔀䌀吀 ㄀ 
						 FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀昀最猀氀  
						        ON sl.sid_id = 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 sl.sid = @connectedusersid ਀ऀऀऀऀऀ ⤀⤀⤀ 
                    OR਀                    ⴀⴀ 一漀渀ⴀ挀漀渀琀爀漀氀氀攀爀 眀椀琀栀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 
                    (@iscontroller = 'Fail' AND਀                    ⠀ 
                        -- Through function list਀                        䔀堀䤀匀吀匀 ⠀ 
                            SELECT 1਀                            䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 
                            JOIN people.function_list_names AS fln ਀ऀऀऀऀऀऀऀ  伀一 昀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
							     =  fln.function_list_id਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀  
							  ON  fln.function_list_id ਀ऀऀऀऀऀऀऀ     㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
                            JOIN people.duty_functions AS df ਀ऀऀऀऀऀऀऀ  伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀  
							     = df.function_id਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀  
							  ON     df.function_id  ਀ऀऀऀऀऀऀऀ     㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
                            JOIN user_restr.sid_list AS sl ਀ऀऀऀऀऀऀऀ  伀一 搀昀猀氀⸀猀椀搀开椀搀  
							     = sl.sid_id਀                           圀䠀䔀刀䔀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
							      = fgn.file_group_id਀                            䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀  
                        )਀                        伀刀 
                        -- Through people list਀                        䔀堀䤀匀吀匀 ⠀ 
                            SELECT 1਀                            䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀 
                            JOIN people.people_list_names AS pln ਀ऀऀऀऀऀऀऀ  伀一 昀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
							     =  pln.people_list_id਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀  
							  ON  pln.people_list_id ਀ऀऀऀऀऀऀऀ     㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
                            JOIN user_restr.sid_list AS sl ਀ऀऀऀऀऀऀऀ  伀一   瀀氀⸀猀椀搀开椀搀  
							     = sl.sid_id਀                           圀䠀䔀刀䔀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
							     =  fgn.file_group_id਀                            䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀  
                        )਀                    ⤀⤀ 
            ),਀            昀椀氀攀䐀愀琀愀䌀吀䔀 䄀匀 ⠀ 
                SELECT ਀                    䔀搀椀琀愀戀氀攀䘀椀氀攀猀䌀吀䔀⸀䤀䐀 䄀匀 昀椀氀攀椀搀Ⰰ  
                    file_data.field_type, ਀                    昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
                    file_data.field_name, ਀                    昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
                    file_data.attr_id, ਀                    昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ  
                    file_data.units, ਀                    昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀 
                FROM EditableFilesCTE਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON EditableFilesCTE.ID = perm.file_id  ਀                䌀刀伀匀匀 䄀倀倀䰀夀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀崀⠀䔀搀椀琀愀戀氀攀䘀椀氀攀猀䌀吀䔀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀 
            ),਀            䄀琀琀䐀愀琀愀䌀吀䔀 䄀匀 ⠀ 
                SELECT ਀                    䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀氀攀䐀愀琀愀䌀吀䔀⸀昀椀氀攀椀搀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ 
                    fileDataCTE.*਀                䘀刀伀䴀 昀椀氀攀䐀愀琀愀䌀吀䔀 
            )਀ 
            INSERT INTO @AttData (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀            匀䔀䰀䔀䌀吀  
                file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position਀            䘀刀伀䴀 䄀琀琀䐀愀琀愀䌀吀䔀㬀 
਀            匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀            匀䔀䰀䔀䌀吀  
                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਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀            䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                @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, CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀            䔀䰀匀䔀 
                SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀        䔀一䐀 䌀䄀吀䌀䠀 
    ਀    䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀    匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
    SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀     
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀琀攀爀开最爀漀甀瀀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 琀栀攀 氀椀猀琀 漀昀 愀琀琀爀椀戀甀琀攀猀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 昀椀氀琀攀爀 最爀漀甀瀀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
CREATE PROCEDURE [reading].[usp_SEL_all_filter_group_attr] ਀ 
	  @filtergroupid bigint            = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = 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 @AttrData TABLE਀   ⠀ 
     field_type nvarchar(50),਀ऀ 昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
	 field_name nvarchar(50),਀ऀ 愀琀琀爀开椀搀 戀椀最椀渀琀Ⰰ 
	 attr_value nvarchar(150)਀   ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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 @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'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ 
	INSERT INTO @AttrData (field_type, field_name_id, field_name, attr_id, attr_value)਀      匀䔀䰀䔀䌀吀 ऀऀ  
			'Document Radio Button'  AS field_type, ਀ऀऀऀ渀愀洀攀猀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			names.attr_name          AS field_name, ਀ऀऀऀ愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀  䄀匀 愀琀琀爀开椀搀Ⰰ  
			attr.attr_name           AS attr_value਀ऀऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
		LEFT JOIN doc_attr.doc_radio_button_attributes AS attr਀ऀऀ       伀一  氀椀渀欀猀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
			      = attr.doc_radiob_attr_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 渀愀洀攀猀 
		       ON    attr.doc_radiob_list_id਀ऀऀऀ      㴀 渀愀洀攀猀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		    WHERE links.filter_group_id਀ऀऀऀ      㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀爀䐀愀琀愀 ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀⤀ 
      SELECT 		 ਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀✀  䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			names.doc_ms_list_id     AS field_name_id, ਀ऀऀऀ渀愀洀攀猀⸀愀琀琀爀开渀愀洀攀          䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			attr.doc_ms_attr_id      AS attr_id, ਀ऀऀऀ愀琀琀爀⸀愀琀琀爀开渀愀洀攀           䄀匀 愀琀琀爀开瘀愀氀甀攀 
		     FROM doc_attr.doc_ms_attr_fgroup_links AS links਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀 
		       ON  links.doc_ms_attr_id਀ऀऀऀ      㴀 愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
		LEFT JOIN doc_attr.doc_multi_select_list_names AS names਀ऀऀ       伀一    愀琀琀爀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
			      = names.doc_ms_list_id਀ऀऀ    圀䠀䔀刀䔀 氀椀渀欀猀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
			      = @filtergroupid਀ 
	INSERT INTO @AttrData (field_type, field_name_id, field_name, attr_id, attr_value)਀      匀䔀䰀䔀䌀吀 ऀऀ  
			'File Radio Button'       AS field_type, ਀ऀऀऀ渀愀洀攀猀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			names.attr_name           AS field_name, ਀ऀऀऀ愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  䄀匀 愀琀琀爀开椀搀Ⰰ  
			attr.attr_name            AS attr_value਀ऀऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
		LEFT JOIN file_attr.file_radio_button_attributes AS attr਀ऀऀ       伀一  氀椀渀欀猀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
			      = attr.file_radiob_attr_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 渀愀洀攀猀 
		       ON    attr.file_radiob_list_id਀ऀऀऀ      㴀 渀愀洀攀猀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		    WHERE links.filter_group_id਀ऀऀऀ      㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
		਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀爀䐀愀琀愀 ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀⤀ 
      SELECT 		 ਀ऀऀऀ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀✀      䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			names.file_ms_list_id    AS field_name_id, ਀ऀऀऀ渀愀洀攀猀⸀愀琀琀爀开渀愀洀攀          䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			attr.file_ms_attr_id     AS attr_id, ਀ऀऀऀ愀琀琀爀⸀愀琀琀爀开渀愀洀攀           䄀匀 愀琀琀爀开瘀愀氀甀攀 
		     FROM file_attr.file_ms_attr_fgroup_links AS links਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀 
		       ON  links.file_ms_attr_id਀ऀऀऀ      㴀 愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
		LEFT JOIN file_attr.file_multi_select_list_names AS names਀ऀऀ       伀一    愀琀琀爀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
			      = names.file_ms_list_id਀ऀऀ    圀䠀䔀刀䔀 氀椀渀欀猀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
			      = @filtergroupid਀ऀऀ 
		਀     匀䔀䰀䔀䌀吀  
	        field_type     AS 'Field Type',਀ऀ        昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 ✀䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ  
			field_name     AS 'Field Name', ਀ऀऀऀ愀琀琀爀开椀搀        䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			attr_value     AS 'Attribute Value'਀       䘀刀伀䴀 䀀䄀琀琀爀䐀愀琀愀㬀 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_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: 22-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀椀氀琀攀爀 最爀漀甀瀀猀 
-- Output is a list of all filter groups,਀ⴀⴀ 瀀氀甀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀ   匀䔀䰀䔀䌀吀  
	           filter_group_id   AS 'Filter Group ID', ਀ऀ           䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			   attr_name         AS 'Filter Group 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: 26-05-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਀⨀⼀  
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀开戀礀开昀渀挀琀开氀猀琀开渀洀崀  
਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	  @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 @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'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_function_list_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid    --### 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;਀ 
--============================================================਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ䔀一䐀 吀刀夀 
	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-05-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਀⨀⼀  
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀开戀礀开昀甀渀挀琀开昀氀搀开渀洀崀  
਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	  @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 @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'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_function_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid    --### 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;਀ 
--============================================================਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ䔀一䐀 吀刀夀 
	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-05-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਀⨀⼀  
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀开戀礀开瀀瀀氀开氀猀琀开渀洀崀  
਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	  @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 @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'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_people_list_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid    --### 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;਀ 
--============================================================਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ䔀一䐀 吀刀夀 
	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: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 甀猀攀爀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- Differs from reading.usp_SEL_files_by_people_list in that no filter group is applied. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_fl_by_user_fgn] ਀ 
      @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)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @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਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_user_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid       --### 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: 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_all_fl_cm_obj_ms_lnk]਀ 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @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',਀ऀऀऀऀ 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 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਀ऀऀऀऀऀ  㴀 挀漀洀猀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			LEFT JOIN base.file_metadata AS fm਀ऀऀऀ      伀一  昀洀⸀昀椀氀攀开椀搀 
				      = comsll.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_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.';਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀऀ䔀一䐀 吀刀夀 
		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;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_fl_cm_obj_rb_lnk]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all file common objects from radio button list਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_fl_cm_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਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@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'਀ऀऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  䄀匀 挀漀 
			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਀ऀऀऀऀऀ  㴀 挀漀爀戀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			LEFT JOIN base.file_metadata AS fm਀ऀऀऀ      伀一  昀洀⸀昀椀氀攀开椀搀 
				      = corbll.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id ਀ 
			ORDER BY 'File ID', 'Common Object List Name';਀ 
  		  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;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀猀开戀礀开挀漀开洀猀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-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਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_fls_by_co_ms_attr] ਀ 
      @commonobjlistid bigint          = NULL,  ਀ऀ  䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀  戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL OUTPUT,  -- Both an optional input and an output. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @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 ਀ 
 		 -- 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.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 䤀䐀⸀ 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id ਀   䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
	    WHERE     searchtable.common_object_list_id = @commonobjlistid   --### 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)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 
-- 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਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_fls_by_co_rb_attr] ਀ 
      @commonobjlistid bigint          = NULL,  ਀ऀ  䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀  戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL OUTPUT,  -- Both an optional input and an output. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @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 ਀ 
 		 -- 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.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 䤀䐀⸀ 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id ਀   䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
	    WHERE     searchtable.common_object_list_id = @commonobjlistid   --### 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)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 眀栀椀挀栀 愀爀攀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 琀攀砀琀 昀椀攀氀搀⸀  
-- 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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀猀开戀礀开琀砀琀开昀氀搀开愀渀礀崀  
਀ऀ  䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	  @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	਀ 
਀  
    -- 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.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- 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_free_text_name_id = @filetextnameid  --### 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 @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: 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 defaults.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ ⴀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀 伀唀吀倀唀吀㨀 一甀洀戀攀爀 漀昀 爀漀眀猀 爀攀琀甀爀渀攀搀⸀ 
*਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀漀爀洀开搀攀昀愀甀氀琀猀崀  
਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
        @fileid bigint,਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䘀漀爀洀䐀攀昀愀甀氀琀䘀椀攀氀搀猀 吀䄀䈀䰀䔀  
		(਀ऀऀऀ 昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
			 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਀ 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ 
	 --forms.form_doc_radio_button_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䐀攀昀愀甀氀琀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开渀愀洀攀⤀ 
     SELECT 'Doc Radio Button Attributes' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name           AS field_name,਀ऀऀऀ愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀       䄀匀 愀琀琀爀开椀搀Ⰰ 
			attr.attr_name                AS attr_value਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN doc_attr.doc_radio_button_list_names AS fieldname਀         伀一        昀漀爀洀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		    = fieldname.doc_radiob_list_id਀  䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀 
         ON   form.default_doc_rb_attr_id਀ऀऀ    㴀 愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_doc_multi_sel_defaults਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䐀攀昀愀甀氀琀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开渀愀洀攀⤀ 
     SELECT 'Doc Multi-Select Attributes' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀搀漀挀开洀猀开氀椀猀琀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name       AS field_name,਀ऀऀऀ愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开椀搀       䄀匀 愀琀琀爀开椀搀Ⰰ 
			attr.attr_name            AS attr_value਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀 䄀匀 昀漀爀洀 
 INNER JOIN doc_attr.doc_multi_select_list_names AS fieldname਀         伀一        昀漀爀洀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
		    = fieldname.doc_ms_list_id਀  䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀 
         ON   form.doc_ms_attr_id਀ऀऀ    㴀 愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_doc_com_obj_ms_defaults਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䐀攀昀愀甀氀琀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开渀愀洀攀⤀ 
     SELECT 'Doc 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਀ऀ  
	 --forms.form_doc_com_obj_rb_lst_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䐀攀昀愀甀氀琀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开渀愀洀攀⤀ 
     SELECT 'Doc Common Objects Radio Button 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.default_common_object_id਀ऀऀ    㴀 愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
	  WHERE form.form_id = @formid਀ 
਀ⴀⴀ 㴀㴀㴀㴀 䘀椀氀攀猀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
  	 INSERT INTO @FormDefaultFields  (field_type, field_name_id, field_name, attr_id, attr_name)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.file_radiob_list_id  AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀            䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			attr.file_radiob_attr_id       AS attr_id,਀ऀऀऀ愀琀琀爀⸀愀琀琀爀开渀愀洀攀                 䄀匀 愀琀琀爀开瘀愀氀甀攀 
	   FROM forms.form_file_radio_button_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.file_radiob_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
 INNER JOIN file_attr.file_radio_button_attributes AS attr਀         伀一  昀漀爀洀⸀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀 
		    = attr.file_radiob_attr_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_file_multi_sel_list_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䐀攀昀愀甀氀琀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开渀愀洀攀⤀ 
     SELECT 'File Multi-Select Attributes' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name       AS field_name,਀ऀऀऀ愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀      䄀匀 愀琀琀爀开椀搀Ⰰ 
			attr.attr_name            AS attr_value਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀 䄀匀 昀漀爀洀 
 INNER JOIN file_attr.file_multi_select_list_names AS fieldname਀         伀一        昀漀爀洀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
		    = fieldname.file_ms_list_id਀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀 
         ON  form.file_ms_attr_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_ms_defaults AS form਀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.common_object_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
 INNER JOIN com_obj.common_objects AS attr਀         伀一   昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
		    = attr.common_object_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,਀ऀऀऀ愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀              䄀匀 愀琀琀爀开椀搀Ⰰ 
			attr.object_name                   AS attr_value਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN com_obj.common_object_list_names AS fieldname਀         伀一        昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		    = fieldname.common_object_list_id਀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 愀琀琀爀 
         ON   form.default_common_object_id਀ऀऀ    㴀 愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
	  WHERE form.form_id = @formid਀ 
 ਀ 
਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
        SELECT @formid       AS 'Form ID',਀ऀऀ       昀椀攀氀搀开琀礀瀀攀    䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ 
		       field_name_id AS 'Field Name ID',਀ऀऀऀ   昀椀攀氀搀开渀愀洀攀    䄀匀 ✀䘀椀攀氀搀 一愀洀攀✀Ⰰ 
			   attr_id       AS 'Attribute 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 CATCH਀䔀一䐀  ⴀⴀ 䔀渀搀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_form_fields]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Lists all of the elements of a 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.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀漀爀洀开昀椀攀氀搀猀崀  
਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = '' OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
        @fileid bigint,਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䘀漀爀洀䘀椀攀氀搀猀 吀䄀䈀䰀䔀  
		(਀ऀऀऀ 昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
			 field_name_id bigint,਀ऀऀऀ 昀椀攀氀搀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	         units nvarchar(50),਀ऀऀऀ 洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀Ⰰ 
			 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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
 -- 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 filter group ਀ 
਀ऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
਀   
਀ 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䈀䔀䜀䤀一 
	BEGIN TRY਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀 
	 INSERT INTO @FormFields (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀      匀䔀䰀䔀䌀吀  
			'Document Free Text'            AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name             AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                       AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  INNER JOIN doc_attr.doc_free_text_field_names AS fieldname਀         伀一         昀漀爀洀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
		    =  fieldname.doc_free_text_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 䐀愀琀攀✀                 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.doc_date_name_id      AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀             䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                       䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  INNER JOIN doc_attr.doc_date_field_names AS fieldname਀         伀一         昀漀爀洀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
		    =  fieldname.doc_date_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.doc_radiob_list_id  AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀           䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                          AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                     䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                        AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                      䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                    AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                    䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                    AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN doc_attr.doc_radio_button_list_names AS fieldname਀         伀一        昀漀爀洀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		    = fieldname.doc_radiob_list_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.doc_ms_list_id      AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀           䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                          AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                     䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                        AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                      䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                    AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                    䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                    AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN doc_attr.doc_multi_select_list_names AS fieldname਀         伀一        昀漀爀洀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
		    = fieldname.doc_ms_list_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀 
  	 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਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 
  	 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_doc_integer_field_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Integer'              AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀       䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name             AS field_name,਀ऀऀऀ✀唀渀椀琀猀✀                         䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                       AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_doc_integer_field_links AS form਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON         form.doc_int_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਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
  	 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਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	  --[forms].[form_doc_user_links]਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document User Link'      AS field_type,਀ऀऀऀ最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			gfn.name                  AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                 AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_user_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)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 刀攀愀氀 一甀洀戀攀爀✀      䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.doc_real_name_id  AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀         䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			'Units'                     AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                   䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                      AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                    䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                  AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                  䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                  AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  INNER JOIN doc_attr.doc_real_number_field_names AS fieldname਀         伀一         昀漀爀洀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
		    =  fieldname.doc_real_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_doc_transaction_grp_links ਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Transaction Group'    AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Transaction Group'    AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                       AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_transaction_grp_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_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Created Date'         AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Created Date'         AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_created_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_id_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Created By User ID'   AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Created By User ID'   AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_created_by_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 ਀ 
	 --[forms].[form_doc_booking_date_links]਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Booking Date'         AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Booking Date'         AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_booking_date_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_release_links]਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Booking Release Number'    AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Booking Release Number'    AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_booking_release_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀  
਀ 
	 --[forms].[form_doc_booking_status_links]਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Booking Status'       AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Booking Status'       AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_booking_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].[form_doc_booking_usernm_links]਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Booking Username'     AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Booking Username'     AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_booking_usernm_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀  
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 䘀椀氀攀猀 
	 --forms.form_file_free_text_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Free Text'            AS field_type,਀ऀऀऀ昀漀爀洀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name         AS field_name,਀ऀऀऀ一唀䰀䰀                        䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                   AS mandatory,਀ऀऀऀ氀攀渀最琀栀                      䄀匀 氀攀渀最琀栀Ⰰ 
			position                    AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                  䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                  AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                  䄀匀 愀琀琀爀椀戀甀琀攀㌀  
	   FROM forms.form_file_free_text_links AS form਀  䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON   form.file_free_text_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_date_name_id     AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀             䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                       䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  INNER JOIN file_attr.file_date_field_names AS fieldname਀         伀一         昀漀爀洀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
		    =  fieldname.file_date_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_file_radio_button_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Radio Button Attributes' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name            AS field_name,਀ऀऀऀ一唀䰀䰀                           䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                      AS mandatory,਀ऀऀऀ氀攀渀最琀栀                         䄀匀 氀攀渀最琀栀Ⰰ 
			position                       AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                     䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                     AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                     䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_radio_button_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.file_radiob_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_ms_list_id      AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀            䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                           AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                      䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                         AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                       䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                     AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                     䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                     AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN file_attr.file_multi_select_list_names AS fieldname਀         伀一        昀漀爀洀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
		    = fieldname.file_ms_list_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_file_com_obj_ms_lst_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File 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_file_com_obj_ms_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.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਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --form_file_integer_field_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Integer'                  AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name             AS field_name,਀ऀऀऀ✀唀渀椀琀猀✀                         䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                       AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_integer_field_links AS form਀  䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON         form.file_int_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_file_function_list_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Duty Function List'  AS field_type,਀ऀऀऀ最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			gfn.name                  AS field_name,਀ऀऀऀ一唀䰀䰀                       䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                 AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀  
	   FROM forms.form_file_function_list_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
         ON  form.general_field_name_id਀ऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
	  WHERE form_id = @formid ਀ 
	 --forms.form_file_people_list_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File People List'     AS field_type,਀ऀऀऀ最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			gfn.name                  AS field_name,਀ऀऀऀ一唀䰀䰀                   䄀匀 甀渀椀琀猀Ⰰ 
			mandatory              AS mandatory,਀ऀऀऀ氀攀渀最琀栀                 䄀匀 氀攀渀最琀栀Ⰰ 
			position               AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀             䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2             AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀             䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_people_list_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
         ON  form.general_field_name_id਀ऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
	  WHERE form_id = @formid਀ 
	  --[forms].[form_file_user_links]਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File User Link'          AS field_type,਀ऀऀऀ最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			gfn.name                  AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                 AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_file_user_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
         ON  form.general_field_name_id਀ऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_file_real_number_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Real Number'           AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name          AS field_name,਀ऀऀऀ✀唀渀椀琀猀✀                      䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                    AS mandatory,਀ऀऀऀ氀攀渀最琀栀                       䄀匀 氀攀渀最琀栀Ⰰ 
			position                     AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                   䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                   AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                   䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_real_number_links AS form਀  䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON         form.file_real_name_id਀ऀऀ    㴀  昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_file_name_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Filename'            AS field_type,਀ऀऀऀ一唀䰀䰀                  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Filename'            AS field_name,਀ऀऀऀ一唀䰀䰀                  䄀匀 甀渀椀琀猀Ⰰ 
			mandatory             AS mandatory,਀ऀऀऀ氀攀渀最琀栀                䄀匀 氀攀渀最琀栀Ⰰ 
			position              AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀            䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2            AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀            䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_name_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_file_content_hash_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Content Hash'   AS field_type,਀ऀऀऀ一唀䰀䰀                  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Content Hash'   AS field_name,਀ऀऀऀ一唀䰀䰀                  䄀匀 甀渀椀琀猀Ⰰ 
			NULL                  AS mandatory,਀ऀऀऀ氀攀渀最琀栀                䄀匀 氀攀渀最琀栀Ⰰ 
			position              AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀            䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2            AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀            䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_content_hash_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,਀ऀऀऀ✀䘀椀氀攀 匀椀稀攀✀               䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			'Bytes'                   AS units,਀ऀऀऀ一唀䰀䰀                      䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                    AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                  䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀 
	  WHERE form_id = @formid;਀  
 	 --forms.form_file_created_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Created Date'       AS field_type,਀ऀऀऀ一唀䰀䰀                      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Created Date'       AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			NULL                      AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_created_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_id_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Created By User ID'  AS field_type,਀ऀऀऀ一唀䰀䰀                      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Created By User ID'  AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			NULL                      AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_created_by_id_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
਀ 
     -- forms.form_file_retention_date_links਀ ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Retention Date'     AS field_type,਀ऀऀऀ一唀䰀䰀                      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Retention Date'     AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			NULL                      AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀       
	   FROM forms.form_file_retention_date_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀ऀ   
਀ 
-- ===================================================਀        匀䔀䰀䔀䌀吀 䀀昀漀爀洀椀搀       䄀匀 ✀䘀漀爀洀 䤀䐀✀Ⰰ 
		       field_type    AS 'Field Type',਀ऀऀ       昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 ✀䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ 
			   field_name    AS 'Field Name',਀ऀऀऀ   甀渀椀琀猀         䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			   mandatory     AS 'Mandatory',਀ऀऀऀ   氀攀渀最琀栀        䄀匀 ✀䰀攀渀最琀栀✀Ⰰ 
			   position      AS 'Position',਀ऀऀऀ   愀琀琀爀椀戀甀琀攀㄀    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 ㄀✀Ⰰ 
			   attribute2    AS 'Attribute 2',਀ऀऀऀ   愀琀琀爀椀戀甀琀攀㌀    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 ㌀✀ 
          FROM @FormFields਀ऀ  伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
		 SET @outputformid = @formid;਀ऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀  
				   fin.form_name     AS 'Form Name' ਀ऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
			  WHERE fin.form_id = @formid) ਀ 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
 END  -- End IF @transaction_ready = 'Ready'਀ 
 ਀  匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀漀爀洀开最爀漀甀瀀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀漀爀洀猀 最爀漀甀瀀猀 
-- Output is a list of all form gropus,਀ⴀⴀ 瀀氀甀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀ   匀䔀䰀䔀䌀吀  
	           form_group_id     AS 'Form Group ID', ਀ऀ           䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			   attr_name         AS 'Form Group 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;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_form_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Selects all forms identifiers਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 愀氀氀 昀漀爀洀 渀愀洀攀猀Ⰰ 
-- plus a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_form_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਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  BEGIN TRY਀ऀ   匀䔀䰀䔀䌀吀  
	           form_id           AS 'Form ID', ਀ऀऀऀ   昀漀爀洀开最爀漀甀瀀开椀搀     䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL((਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 昀最渀⸀愀琀琀爀开渀愀洀攀 
					FROM forms.form_group_names AS fgn਀ऀऀऀऀऀ圀䠀䔀刀䔀 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 㴀 昀椀渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
				), '')           AS 'Form Group Name',਀ऀऀऀ   昀漀爀洀开渀愀洀攀         䄀匀 ✀䘀漀爀洀 一愀洀攀✀Ⰰ  
	           ISNULL(mnem, '')  AS 'Mnemonic', ਀ऀ           䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ  
	           list_position     AS 'List Position' ਀ऀ      䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
	  ORDER BY 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.';਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  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_function_lists]    Script Date: Tue 12-05-2026 5:43:19 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 records from people.function_lists.਀⨀  
* **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_function_lists] ਀ 
	 @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਀ऀऀऀ      㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		ORDER BY 'Function List Name' ASC, 'Function 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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_function_lst_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀⸀ 
-- Output is a list of duty function lists, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists all duty function lists from people.function_list_names.਀⨀  
* **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_function_lst_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਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 
				 fln.function_list_id        AS 'Function List ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀昀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				 fln.name                    AS 'Function List Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀昀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 fln.list_position           AS 'List Position'਀ऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀   
			ORDER BY 'List Position', 'Function 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_all_recent_documents]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 瘀椀攀眀 愀渀搀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 挀爀攀愀琀攀搀 愀昀琀攀爀 愀 最椀瘀攀渀 琀椀洀攀 
-- relative to present.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀渀 漀瀀琀椀漀渀愀氀 昀漀爀洀 䤀䐀⸀   
-- Does not apply a filter group.  Does not retrieve associated files. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_recent_documents] ਀ 
      @formid bigint                   = NULL,   -- Optional input parameter਀ऀ  䀀洀椀渀甀琀攀猀 椀渀琀                     㴀 一唀䰀䰀Ⰰ   ⴀⴀ 伀瀀琀椀漀渀愀氀 椀渀瀀甀琀 瀀愀爀愀洀攀琀攀爀⸀  一甀洀戀攀爀 漀昀 洀椀渀甀琀攀猀 戀攀昀漀爀攀 瀀爀攀猀攀渀琀 
      @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਀ 
-- 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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀  
		 -- 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');਀ऀऀऀ䔀一䐀 
਀ 
		  -- 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 searchtable.doc_id     AS ID਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀挀爀攀愀琀攀搀 㸀 䐀䄀吀䔀䄀䐀䐀⠀䴀䤀一唀吀䔀Ⰰ ⴀ䀀洀椀渀甀琀攀猀Ⰰ 匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀⤀⤀⤀Ⰰ 
਀ 
		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: 07-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀 最椀瘀攀渀 昀漀爀洀 昀漀爀 愀氀氀 昀椀氀攀猀 挀爀攀愀琀攀搀 椀渀 琀栀攀 氀愀猀琀 䀀洀椀渀甀琀攀猀 洀椀渀甀琀攀猀 
-- but not the file content.  For file content extraction਀ⴀⴀ 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开爀攀挀攀渀琀开昀椀氀攀猀崀  
਀      䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ ⴀⴀ 伀瀀琀椀漀渀愀氀 椀渀瀀甀琀 瀀愀爀愀洀攀琀攀爀 
	  @minutes int                     = NULL, -- Optional input parameter਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @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਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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 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');਀ऀऀऀ䔀一䐀 
਀ 
		  -- 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 fileidsCTE AS(਀ऀऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
					 fm.file_id              AS ID਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  
        WHERE fm.created > DATEADD(MINUTE, -@minutes, SYSDATETIME())਀ऀऀऀ ⤀Ⰰ 
਀ऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
			 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਀ऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀  
		  SET @outputformid = @formid;਀ऀऀ  匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀 
		                     FROM forms.form_identifier_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀㬀 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @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਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
 ਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_tag_group_id_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀愀最 最爀漀甀瀀 渀愀洀攀 搀攀琀愀椀氀猀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_tag_group_id_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 tgn.tag_group_id       AS 'Tag Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀最渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䜀爀漀甀瀀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            tgn.tag_group_name     AS 'Tag Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀  䄀匀 ✀吀愀最 䜀爀漀甀瀀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				tgn.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: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects the data for all tag to tag group records਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 琀愀最猀 愀渀搀 氀椀渀欀攀搀 琀愀最 最爀漀甀瀀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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',਀ऀऀ        琀最渀⸀琀愀最开最爀漀甀瀀开椀搀       䄀匀 ✀吀愀最 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(tgn.mnem, '')   AS 'Tag Group Mnemonic',਀ऀ            琀最渀⸀琀愀最开最爀漀甀瀀开渀愀洀攀     䄀匀 ✀吀愀最 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(tgn.descr, '')  AS 'Tag Group Description'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
	 INNER JOIN tagging.tag_to_tag_group_links AS tttgl਀ऀ         伀一      搀琀⸀琀愀最开椀搀 
			    = tttgl.tag_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最渀 
             ON     tgn.tag_group_id਀ऀऀ        㴀 琀琀琀最氀⸀琀愀最开最爀漀甀瀀开椀搀 
	   ORDER BY 'Tag 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 all tag 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(ttn.mnem, '')     AS 'Tag Tree Mnemonic',਀ऀ            琀琀渀⸀渀愀洀攀                 䄀匀 ✀吀愀最 吀爀攀攀 一愀洀攀✀Ⰰ 
				ISNULL(ttn.descr, '')    AS 'Tag Tree Description',਀ऀऀऀऀ琀琀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		   FROM tagging.tag_tree_names AS ttn਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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_tags]    Script Date: Tue 12-05-2026 5:43:19 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_all_tags] ਀ 
	 @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',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM tagging.doc_tags AS dt਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 一愀洀攀✀ 䄀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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_transaction_groups]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Selects all transaction groups. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 䤀䐀猀 愀渀搀 渀漀琀攀猀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀ  匀䔀䰀䔀䌀吀  
	          transaction_group_id               AS 'Transaction Group ID',਀              䤀匀一唀䰀䰀⠀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀Ⰰ ✀✀⤀ 䄀匀 ✀吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀 一漀琀攀✀ 
	     FROM base.transaction_groups ਀ऀ 伀刀䐀䔀刀 䈀夀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 䐀䔀匀䌀㬀 
	  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_units_of_measure]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Selects all units of measure਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @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਀ऀ  匀䔀䰀䔀䌀吀  
	          unit_id                    AS 'Units ID',਀ऀ          甀渀椀琀                       䄀匀 ✀唀渀椀琀✀Ⰰ 
              ISNULL(descr, '')          AS 'Description',਀ऀ          䤀匀一唀䰀䰀⠀氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	     FROM base.units_of_measure AS uom਀     伀刀䐀䔀刀 䈀夀 ✀倀漀猀椀琀椀漀渀✀㬀 
	  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_browsing_tree_by_id]    Script Date: Tue 12-05-2026 5:43:19 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_browsing_tree_by_id] ਀ 
     @tag_br_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_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.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀         䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀Ⰰ 
		        dt.tag_id              AS 'Tag ID',਀ऀऀ        䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
				dt.tag_name            AS 'Tag Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ttn.browsing_tree_node_id   AS 'Tag Browsing Tree Node ID',਀ऀऀऀऀ琀琀渀⸀椀渀瘀攀爀琀开琀愀最         䄀匀 ✀吀愀最 䤀渀瘀攀爀琀✀Ⰰ 
				ttn.browsing_tree_hierarchyid.ToString() AS 'Tag Browsing Tree HierarchyId'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 䄀匀 琀琀渀 
	 INNER JOIN tagging.doc_tags AS dt਀ऀ         伀一  琀琀渀⸀琀愀最开椀搀 
			    = dt.tag_id		਀ऀऀ  圀䠀䔀刀䔀 琀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
		        =  @tag_br_treeid਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䠀椀攀爀愀爀挀栀礀䤀搀✀ 䄀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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_browsing_tree_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀愀洀攀 搀攀琀愀椀氀猀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_browsing_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 tbtn.tag_browsing_tree_id AS 'Tag Browsing Tree ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            tbtn.name                 AS 'Tag Browsing Tree Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				tbtn.list_position        AS 'List Position',਀ऀऀऀऀ琀戀琀渀⸀猀椀搀开椀搀               䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				ISNULL(SUSER_SNAME(਀ऀऀऀऀ         ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
						   FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀戀琀渀⸀猀椀搀开椀搀 
						        = sl.sid_id)), '') AS 'System Username'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀 
	   ORDER BY 'List Position' 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: 20-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects details of tag browsing 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_browsing_tree_id AS 'Tag Browsing Tree ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            ttn.name                 AS 'Tag Browsing Tree Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ttn.list_position        AS 'List Position',਀ऀऀऀऀ琀琀渀漀⸀戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 一漀搀攀 䤀䐀✀Ⰰ 
				ttno.browsing_tree_hierarchyid.ToString() AS 'Tag Browsing Tree HierarchyId'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
	 INNER JOIN tagging.tag_browsing_tree_nodes AS ttno਀ऀ         伀一     搀琀⸀琀愀最开椀搀 
			    = ttno.tag_id਀ऀ 䤀一一䔀刀 䨀伀䤀一ऀ琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀 
	         ON  ttno.tag_browsing_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: 26-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects tag browsing tree name details for browsing trees which the connected user has edit permission rights. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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';   ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;਀ 
	  BEGIN TRY਀ 
	  IF @iscontroller = 'Pass'  -- A controller has rights to all browsing trees਀ऀ    䈀䔀䜀䤀一 
			 SELECT tbtn.tag_browsing_tree_id AS 'Tag Browsing Tree ID',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					tbtn.name                 AS 'Tag Browsing Tree Name',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					tbtn.list_position        AS 'List Position',਀ऀऀऀऀ    琀戀琀渀⸀猀椀搀开椀搀               䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				ISNULL(SUSER_SNAME(਀ऀऀऀऀ         ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
						   FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀戀琀渀⸀猀椀搀开椀搀 
						        = sl.sid_id)), '') AS 'System Username'਀ऀऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀 
		   ORDER BY 'List Position';਀ऀ    䔀一䐀 
	  ELSE਀ऀ    䈀䔀䜀䤀一 
		  SELECT tbtn.tag_browsing_tree_id AS 'Tag Browsing Tree ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀琀戀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 tbtn.name                 AS 'Tag Browsing Tree Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀琀戀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 tbtn.list_position        AS 'List Position',਀ऀऀऀऀ 琀戀琀渀⸀猀椀搀开椀搀               䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				 ISNULL(SUSER_SNAME(਀ऀऀऀऀ         ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
						   FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀戀琀渀⸀猀椀搀开椀搀 
						        = sl.sid_id)), '') AS 'System Username'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀 
						 INNER JOIN user_restr.tag_br_tree_permissions_flist AS tbtpf਀ऀऀऀऀऀऀ         伀一    琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
								    = tbtpf.tag_browsing_tree_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
						            ON   tbtpf.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 tbtn2.tag_browsing_tree_id AS 'Tag Browsing Tree ID',਀ऀऀऀऀ                 䤀匀一唀䰀䰀⠀琀戀琀渀㈀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				                 tbtn2.name                 AS 'Tag Browsing Tree Name',਀ऀऀऀऀ                 䤀匀一唀䰀䰀⠀琀戀琀渀㈀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				                 tbtn2.list_position        AS 'List Position',਀ऀऀऀऀ                 琀戀琀渀㈀⸀猀椀搀开椀搀               䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
								 ISNULL(SUSER_SNAME(਀ऀऀऀऀऀऀऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
											FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 琀戀琀渀㈀⸀猀椀搀开椀搀 
												= sl.sid_id)), '') AS 'System Username'਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀㈀ 
						 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 sl.sid = @connectedusersid਀  ऀऀऀऀऀऀऀ         ⤀ 
                    UNION -- Inlude if there is a tree linked to the individual.਀ 
					    ( SELECT tbtn3.tag_browsing_tree_id AS 'Tag Browsing Tree ID',਀ऀऀऀऀ                 䤀匀一唀䰀䰀⠀琀戀琀渀㌀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				                 tbtn3.name                 AS 'Tag Browsing Tree Name',਀ऀऀऀऀ                 䤀匀一唀䰀䰀⠀琀戀琀渀㌀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				                 tbtn3.list_position        AS 'List Position',਀ऀऀऀऀ                 琀戀琀渀㌀⸀猀椀搀开椀搀               䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
								 ISNULL(SUSER_SNAME(਀ऀऀऀऀऀऀऀऀऀऀ ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
										   FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀戀琀渀㌀⸀猀椀搀开椀搀 
												= sl.sid_id)), '') AS 'System Username'਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀㌀ 
						 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.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  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: 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਀ऀ  匀䔀䰀䔀䌀吀  
	          coa.common_object_attribute_id     AS 'Common Object Attribute ID',਀ऀऀऀ  䤀匀一唀䰀䰀⠀挀漀愀⸀洀渀攀洀Ⰰ ✀✀⤀               䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			  coa.attr_name                      AS 'Common Object Attribute Name',਀ऀऀऀ  䤀匀一唀䰀䰀⠀挀漀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀              䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀ 
	     FROM com_obj.common_object_attributes   AS coa਀ऀ 伀刀䐀䔀刀 䈀夀 愀琀琀爀开渀愀洀攀㬀 
  	  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';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
-- 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_com_obj_by_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 挀漀洀洀漀渀 漀戀樀攀挀琀猀 昀漀爀 愀 最椀瘀攀渀 氀椀猀琀 䤀䐀⸀ 
-- Input is a common object list ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀猀Ⰰ 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀        䀀渀漀氀椀猀琀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@listidinvalidmessage nvarchar(200)     = '', -- Communicates that the common object list id was invalid਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@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 @commonobjlistid = 0਀ऀ     匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @commonobjlistid IS NULL਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @nolistidmessage =  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @nolistidmessage = 'A database level message error occurred on NoAttrListID';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
	  ELSE -- List ID has been supplied.  Check that it is valid. ਀ऀ      䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀऀ   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 挀漀氀渀 
							  WHERE coln.common_object_list_id ਀ऀऀऀऀऀऀऀऀऀ㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'AttrListIDNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 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 ਀ऀऀऀ     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀               䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 co.common_object_id            AS 'Common Object ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀洀渀攀洀Ⰰ ✀✀⤀            䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				 co.object_name                 AS 'Common Object Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀     䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 col.list_position              AS 'List Position',਀ऀऀऀऀ 挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
				 ISNULL(coa.attr_name, '')      AS 'Common Object Attribute Name'਀ऀऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  䄀匀 挀漀 
			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਀ऀऀऀ圀䠀䔀刀䔀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
				  = @commonobjlistid਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 一愀洀攀✀㬀 
  			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਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
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 (@listidinvalidmessage <> '')       SET @message = @message + ' | ' + @listidinvalidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_com_obj_list_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all common object list name records਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_com_obj_list_names]਀ 
      @message nvarchar(1000)          = '' 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(coln.mnem, '')          AS 'Mnemonic',਀             䤀匀一唀䰀䰀⠀挀漀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀   䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
             coln.common_object_list_id     AS 'Common Object List ID',਀ऀऀऀ 挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
			 ISNULL(coa.attr_name, '')      AS 'Common Object Attribute Name'਀ऀ    䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  䄀匀 挀漀氀渀 
		LEFT JOIN com_obj.common_object_attributes AS coa਀ऀऀ      伀一     挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
			      = coln.common_object_attribute_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.';਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	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_date_styles]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Selects all date styles਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 愀氀氀 搀愀琀攀 猀琀礀氀攀猀Ⰰ 
-- plus a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_date_styles] ਀ऀ 
  @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 ਀ऀ          搀愀琀攀琀椀洀攀开猀琀礀氀攀      䄀匀 ✀䐀愀琀攀 匀琀礀氀攀✀Ⰰ  
	          datetime_style_name AS 'Date Style Format', ਀ऀ          氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀  
	     FROM base.datetime_styles ਀ऀ 伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
  	    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: 26-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according to a duty function list general field name.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀挀开戀礀开昀渀挀琀开氀椀猀琀开渀愀洀攀崀  
      @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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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 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.');਀ऀऀऀऀ 䔀一䐀   
਀ 
਀ 
  -- 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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid      --### 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: 26-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according to a people list general field name.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀挀开戀礀开瀀瀀氀开氀椀猀琀开渀愀洀攀崀  
      @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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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 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.');਀ऀऀऀऀ 䔀一䐀   
਀ 
਀ 
  -- 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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid      --### 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: 16-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 挀漀洀洀漀渀漀戀樀攀挀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 戀礀 搀漀挀甀洀攀渀琀 
-- Input is a document id.  Output is a list of common objects linked to that document਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_dc_cm_obj_ms_lnk_by_dc]਀ 
      @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਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
	    @validationmessage nvarchar(200)   = '', -- Communicates that the transaction failed due to data validation਀        䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
-- 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਀ऀ 䔀一䐀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
		  SELECT @documentid                    AS 'Document 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.doc_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';਀  ऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			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 (@docinvalidmessage <> '')          SET @message = @message + ' | ' + @docinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀挀开挀洀开漀戀樀开爀戀开氀渀欀开戀礀开搀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 挀漀洀洀漀渀漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 戀礀 搀漀挀甀洀攀渀琀 
-- Input is a document id.  Output is a list of common objects linked to that document਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_dc_cm_obj_rb_lnk_by_dc]਀ 
      @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਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
	    @validationmessage nvarchar(200)   = '', -- Communicates that the transaction failed due to data validation਀        䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@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';  ਀ 
-- 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਀ऀ 䔀一䐀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
		  SELECT @documentid                    AS 'Document 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.doc_to_com_obj_radiob_links AS corbll਀ऀऀऀऀ  伀一       挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  = corbll.common_object_id਀ऀऀऀऀऀ  䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  = corbll.common_object_list_id਀ऀऀऀऀ圀䠀䔀刀䔀 挀漀爀戀氀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
			ORDER BY '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 (@docinvalidmessage <> '')          SET @message = @message + ' | ' + @docinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀攀昀愀甀氀琀开搀愀琀攀开昀漀爀洀愀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 22-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 琀栀攀 搀攀昀愀甀氀琀 搀愀琀攀 昀漀爀洀愀琀 搀攀琀愀椀氀猀 
-- Output is date style, name and format, e.g. 105 dd-mm-yyy, dmy,਀ⴀⴀ 瀀氀甀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀ          搀愀琀攀琀椀洀攀开猀琀礀氀攀      䄀匀 ✀䐀愀琀攀 匀琀礀氀攀✀Ⰰ  
	          datetime_style_name AS 'Date Style Name'਀ऀ     䘀刀伀䴀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀 䄀匀 搀猀 
		 JOIN base.global_settings_groups AS gsg਀ऀऀ   伀一 搀猀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀 
		      = gsg.date_style਀        圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
	 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 @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
  END CATCH਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开搀愀琀攀开瘀愀氀甀攀猀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-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਀ऀऀ                                         ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@dateformat nchar(3)               = 'dmy',਀ऀऀ䀀搀愀琀攀猀琀礀氀攀 椀渀琀                     㴀 ㄀　㔀Ⰰ 
		@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.';਀ऀ䔀一䐀 
਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  -- Set the date style਀ 
  SET @datestyle = (SELECT date_style AS 'Date Style'਀                      䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		             WHERE gsg.setting_group_name = 'Master');਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			 SELECT  @documentid                                   AS 'Document ID',਀ऀऀऀऀऀ 搀搀昀渀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀                         䄀匀 ✀䐀漀挀甀洀攀渀琀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ 
					 ddfn.mnem                                     AS 'Mnemonic',਀ऀऀऀऀऀ 搀搀昀渀⸀搀攀猀挀爀                                    䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			         ddfn.attr_name                                AS 'Document Date Field Name',਀                     䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㈀㔀⤀Ⰰ 搀搀瘀⸀搀愀琀攀开瘀愀氀甀攀Ⰰ 䀀搀愀琀攀猀琀礀氀攀⤀ 䄀匀 ✀䐀愀琀攀✀ 
			   FROM  doc_attr.doc_date_field_names AS ddfn਀         䤀一一䔀刀 䨀伀䤀一  搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 搀搀瘀 
			     ON     ddv.doc_date_name_id ਀ऀऀऀऀ     㴀 搀搀昀渀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
		 INNER JOIN  base.document_id_list AS dil਀ऀऀऀऀ 伀一    搀椀氀⸀搀漀挀开椀搀  
				     = ddv.doc_id਀ऀऀऀ  圀䠀䔀刀䔀  搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
	       ORDER BY 'Document Date 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;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_file_form_values]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㜀ⴀ㈀　㈀㐀 
-- Description:	Lists all form fields and values for a given document and file pair.਀ⴀⴀ 䔀椀琀栀攀爀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 漀爀 昀椀氀攀 椀搀 洀愀礀 戀攀 渀甀氀氀Ⰰ 戀甀琀 渀漀琀 戀漀琀栀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema, stored procedures and functions are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_file_form_values] ਀ 
	  @formid bigint                   = NULL,਀ऀ  䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	  @fileid 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. ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		record_field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	    mandatory nchar(3),਀ऀ    昀椀攀氀搀开氀攀渀最琀栀 猀洀愀氀氀椀渀琀Ⰰ 
        form_position nvarchar(50),਀ऀ    愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	    attribute2 nvarchar(50),਀ऀ    愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀  
 -- 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 filter group ਀ 
-- Document id and file ID validation਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀   
	  IF @documentid IS NULL AND @fileid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀䐀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀䐀猀⸀✀⤀㬀 
		 END਀ऀⴀⴀ 䔀椀琀栀攀爀 愀 搀漀挀甀洀攀渀琀 䤀䐀 漀爀 昀椀氀攀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	  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਀ 
   -- Check that the file id exists.  ਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		 SET @fileid = NULL;਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 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਀ 
    END -- End IF @data_validation = 'Pass'਀ 
	 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  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 @AttData  (field_type, field_name_id, record_field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, ਀ऀ             洀愀渀搀愀琀漀爀礀Ⰰ 昀椀攀氀搀开氀攀渀最琀栀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
		(SELECT DISTINCT਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀洀愀渀搀愀琀漀爀礀      䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			doc_data.length         AS field_length,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
			doc_data.attribute1     AS attribute1,਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀椀戀甀琀攀㈀     䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			doc_data.attribute3     AS attribute3਀ऀऀऀ 
		FROM internal.ufn_SEL_data_for_edit_form_ITVF(@documentid, @fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀昀漀爀洀椀搀                       䄀匀 ✀䘀漀爀洀 䤀䐀✀Ⰰ 
			        @documentid                   AS 'Document ID',਀ऀऀऀऀऀ䀀昀椀氀攀椀搀                       䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀䘀漀爀洀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ ⴀⴀ 吀栀攀 䤀䐀 漀昀 琀栀攀 昀漀爀洀 昀椀攀氀搀 渀愀洀攀⸀  圀椀氀氀 戀攀 一唀䰀䰀 椀昀 琀栀攀 䘀漀爀洀 䘀椀攀氀搀 一愀洀攀 愀 昀椀砀攀搀 瘀愀氀甀攀⸀  
					ad.record_field_name_id		  AS 'Record Name ID', -- The record from the links table linking to the doc or file. Will be NULL if no record for that doc or file. ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀䘀漀爀洀 䘀椀攀氀搀 一愀洀攀✀Ⰰ  ⴀⴀ 吀栀攀 渀愀洀攀 愀猀猀漀挀椀攀搀 眀椀琀栀 琀栀攀 昀椀攀氀搀开渀愀洀攀开椀搀 
					ISNULL(ad.field_mnemonic, '') AS 'Form Field Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀刀攀挀漀爀搀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  ⴀⴀ 吀栀攀 䤀䐀 漀昀 琀栀攀 愀琀琀爀椀戀甀琀攀Ⰰ 眀栀攀爀攀 愀瀀瀀氀椀挀愀戀氀攀Ⰰ 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀 漀爀 昀椀氀攀 
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
					ISNULL(ad.mandatory, '')      AS 'Mandatory',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀Ⰰ 
					ISNULL(ad.field_length, '')   AS 'Field Length',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀     䄀匀 ✀䄀琀琀爀椀戀甀琀攀 ㄀✀Ⰰ 
					ISNULL(ad.attribute2, '')     AS 'Attribute 2',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀     䄀匀 ✀䄀琀琀爀椀戀甀琀攀 ㌀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 ✀䘀椀攀氀搀 吀礀瀀攀✀㬀 
਀ 
-- ===================================================਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
	  -- Return the actual form ID used਀ऀऀ  匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
		  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');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
਀ऀ䔀一䐀 吀刀夀 
	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: 10-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all document groups which the connected user has rights to, including those that 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',਀ऀऀऀऀ䌀䄀匀䔀 
				   WHEN dgvp.sid_id IS NULL THEN CAST('Unrestricted' AS VARCHAR(20))਀ऀऀऀऀ   䔀䰀匀䔀 䌀䄀匀吀⠀✀刀攀猀琀爀椀挀琀攀搀✀ 䄀匀 嘀䄀刀䌀䠀䄀刀⠀㈀　⤀⤀ 
				END AS 'Restriction'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
	LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀ       伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		      = dgvp.doc_group_id਀    䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	       ON   dgvp.sid_id਀ऀऀ      㴀   猀氀⸀猀椀搀开椀搀 
	    WHERE (dgvp.sid_id IS NULL)਀ऀऀऀ  伀刀 
			  (dgvp.sid_id IS NOT NULL਀ऀऀऀ    䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
			         ) ਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀㬀 
         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: 12-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all document groups linked to a given document਀ⴀⴀ 伀渀氀礀 愀瀀瀀氀椀攀猀 琀漀 搀漀挀甀洀攀渀琀猀 昀漀爀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 栀愀猀 栀愀猀 爀椀最栀琀猀 琀漀 
-- and only lists document groups which the connected user has rights to.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开最爀漀甀瀀猀开戀礀开搀漀挀开爀猀琀爀崀  
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@tempmessage nvarchar(300)              = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@docidinvalidmessage nvarchar(200)      = '', -- Communicates that the document id was invalid਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- 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';  ਀ 
਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @nodocumentidmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
				   SET @nodocumentidmessage = 'A database level message error occurred on NoDocID.';਀ऀऀऀ 䔀一䐀 
਀ 
		   IF @data_validation_status = 'Pass'  -- 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.';਀ऀऀऀ䔀一䐀 
		  -- End data validation਀ 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀            䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
		        dgn.doc_group_id       AS 'Doc Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
	            dgn.attr_name          AS 'Doc Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀  䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM xref.doc_group_names AS dgn਀ऀ䰀䔀䘀吀 䨀伀䤀一  砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
	       ON     dgn.doc_group_id਀ऀऀ        㴀 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 
	LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀ       伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		      = dgvp.doc_group_id਀    䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	       ON   dgvp.sid_id਀ऀऀ      㴀   猀氀⸀猀椀搀开椀搀 
	    WHERE dgl.doc_id = @documentid਀ऀऀ      䄀一䐀 
		      ((dgvp.sid_id IS NULL)਀ऀऀऀ  伀刀 
			  (dgvp.sid_id IS NOT NULL਀ऀऀऀ    䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
			         )) ਀ऀऀऀऀऀ       ⴀⴀ 一漀琀攀 琀栀愀琀 琀栀椀猀 眀椀氀氀 渀漀琀 氀椀猀琀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 琀栀愀琀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 渀漀琀 愀 洀攀洀戀攀爀 漀昀⸀  
	   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 (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀㬀 
    IF (@docidinvalidmessage <> '')        SET @message = @message + ' | ' + @docidinvalidmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_id_contains]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ㄀㄀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀攀爀攀 琀栀攀 搀漀挀 椀搀 挀漀渀琀愀椀渀猀 愀 最椀瘀攀渀 猀琀爀椀渀最⸀ 
-- Includes the associated files.  Applies a filter group. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@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;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		-- 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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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 base.document_id_list AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE (searchtable.doc_id LIKE '%' + @likestring + '%') -- Filter by @likestring਀  
 -- 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: 12-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects a document ID with an exact match.਀ⴀⴀ 䤀渀挀氀甀搀攀猀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
-- 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_doc_id_equals] ਀     
      @documentid 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	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ    
		@docauthenticationstatus nchar(10)      = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@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 @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਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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 base.document_id_list AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE  (searchtable.doc_id = @documentid) -- Find exact match਀  
 -- 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: 05-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਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀          䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
			        difn.doc_int_name_id AS 'Document Integer Field Name ID',਀ऀऀऀऀऀ搀椀昀渀⸀洀渀攀洀            䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			        difn.attr_name       AS 'Document Integer Field Name',਀ऀऀऀऀऀ搀椀昀渀⸀搀攀猀挀爀           䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					int_value            AS 'Integer Value',਀ऀऀ            䤀匀一唀䰀䰀⠀甀漀洀⸀甀渀椀琀Ⰰ ✀✀⤀ 䄀匀 ✀唀渀椀琀猀✀ 
			   FROM doc_attr.doc_integer_field_names AS difn਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 搀椀瘀 
				 ON    div.doc_int_name_id ਀ऀऀऀऀ    㴀 搀椀昀渀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 
		 INNER JOIN base.document_id_list AS dil਀ऀऀऀऀ 伀一    搀椀氀⸀搀漀挀开椀搀  
				     = div.doc_id਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀 
		         ON   difn.unit_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_doc_ms_attr_by_doc]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Lists the multi-select attributes for a 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_attr_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਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀         䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
			        dmsl.doc_ms_list_id AS 'Attribute Name ID',਀                    搀洀猀氀渀⸀愀琀琀爀开渀愀洀攀     䄀匀 ✀䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
					dmsl.doc_ms_attr_id AS 'Attribute Value ID',਀ऀऀऀऀऀ搀洀猀愀⸀愀琀琀爀开渀愀洀攀      䄀匀 ✀䄀琀琀爀椀戀甀琀攀 嘀愀氀甀攀✀ 
			   FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 搀洀猀氀渀 
				 ON    dmsl.doc_ms_list_id ਀ऀऀऀऀ    㴀 搀洀猀氀渀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
		 INNER JOIN doc_attr.doc_multi_select_attributes AS dmsa਀ऀऀऀऀ 伀一   搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀  
				    = dmsa.doc_ms_attr_id਀ऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		   ORDER BY '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 (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开洀猀开愀琀琀爀开戀礀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 17-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)          = '',਀ऀऀ䀀搀漀挀开洀猀开氀椀猀琀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 吀栀攀 渀愀洀攀 瘀愀氀甀攀 昀爀漀洀 琀栀攀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀⸀  
		@transaction_ready nchar(10)        = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Check if a radio button list id has been supplied਀  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　  
     SET @docmslistid = NULL;਀  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀         匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	     SET @transaction_ready      = 'Fail';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id = 'NoAttrListID', ਀ऀऀ      䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
	  END਀ 
  -- Check that the radio button list name id exists ਀  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
     BEGIN  ਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
                          FROM doc_attr.doc_multi_select_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਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  ਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀     䈀䔀䜀䤀一 
       BEGIN TRY਀ऀ        匀䔀䰀䔀䌀吀  
 	               dmsa.doc_ms_attr_id      AS 'Doc Multi-Select Attribute ID', ਀ऀ               䤀匀一唀䰀䰀⠀搀洀猀愀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
		     	   dmsa.attr_name           AS 'Doc Multi-Select Attribute Name', ਀ऀ               䤀匀一唀䰀䰀⠀搀洀猀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	               dmsa.list_position       AS 'List Position'਀ऀ          䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 搀洀猀愀 
		     WHERE doc_ms_list_id = @docmslistid਀ऀऀ  伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀㬀 
਀  ऀ         䤀䘀 ⠀䀀䀀刀伀圀䌀伀唀一吀 㴀 　⤀ 
	           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_doc_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 dmsafl.doc_ms_attr_id  AS 'Doc Multi-Select Attribute ID',਀ऀऀ        搀洀猀愀⸀愀琀琀爀开渀愀洀攀         䄀匀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
		        dmsafl.filter_group_id AS 'Filter Group ID',਀                昀最⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 一愀洀攀✀ 
		   FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafl਀ऀऀ   䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 搀洀猀愀 
		     ON dmsafl.doc_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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_ms_list_not_linkd]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Lists the multi-select list names for a document਀ⴀⴀ 眀栀椀挀栀 愀爀攀 渀漀琀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 
-- 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 'Doc Multi-Select List Name'਀ऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 搀洀猀氀渀 
			  WHERE NOT EXISTS਀ऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 搀洀猀氀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
					   FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
							AND    dmsl.doc_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 (@docinvalidmessage <> '')          SET @message = @message + ' | ' + @docinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_radiob_attr_by_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Lists radio button attributes by list name਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_radiob_attr_by_list] ਀ 
  @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਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
		@doc_radiob_listname nvarchar(50)	= '', -- The name value from the doc radio button list name id. ਀ऀऀ䀀爀戀氀椀猀琀渀愀洀攀椀搀椀渀瘀愀氀椀搀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 渀愀洀攀 氀椀猀琀 椀搀 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)        = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Check if a radio button list id has been supplied਀  䤀䘀 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　  
     SET @doc_radioblistid = NULL;਀  䤀䘀 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀         匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	     SET @transaction_ready      = 'Fail';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id = 'NoAttrListID', ਀ऀऀ      䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
	  END਀ 
  -- Check that the radio button list name id exists ਀  䤀䘀 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
     BEGIN  ਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
                          FROM doc_attr.doc_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਀ऀ 䔀一䐀  
਀ 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
  IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
      EXEC internal.usp_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 @doc_radioblistid        AS 'Doc Radio Button List ID',਀ऀ               搀爀戀愀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀  䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
	               ISNULL(drba.mnem, '')    AS Mnemonic, ਀ऀऀ     ऀ   搀爀戀愀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ  
	               ISNULL(drba.descr, '')   AS Description, ਀ऀ               搀爀戀愀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
              FROM doc_attr.doc_radio_button_attributes AS drba਀  ऀऀ     圀䠀䔀刀䔀 搀爀戀愀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀 
          ORDER BY 'List Position', 'Doc Radio Button 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_rb_attr_by_doc]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㤀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Lists the radio button attributes for a 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_attr_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਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀             䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
			        drbl.doc_radiob_list_id AS 'Doc Radio Button List ID',਀                    搀爀戀氀渀⸀愀琀琀爀开渀愀洀攀         䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
					drbl.doc_radiob_attr_id AS 'Doc Radio Button Attribute ID',਀ऀऀऀऀऀ搀爀戀愀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀ 
			   FROM doc_attr.doc_radio_button_links AS drbl਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 搀爀戀氀渀 
				 ON    drbl.doc_radiob_list_id ਀ऀऀऀऀ    㴀 搀爀戀氀渀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		 INNER JOIN doc_attr.doc_radio_button_attributes AS drba਀ऀऀऀऀ 伀一   搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
				    = drba.doc_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 (@docinvalidmessage <> '')          SET @message = @message + ' | ' + @docinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀㬀 
    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_doc_rb_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 drbafl.doc_radiob_attr_id  AS 'Doc Radio Button Attribute ID',਀ऀऀ        搀爀戀愀⸀愀琀琀爀开渀愀洀攀             䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
		        drbafl.filter_group_id     AS 'Filter Group ID',਀                昀最⸀愀琀琀爀开渀愀洀攀               䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 一愀洀攀✀ 
		   FROM doc_attr.doc_radiob_attr_fgroup_links AS drbafl਀ऀऀ   䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 搀爀戀愀 
		     ON drbafl.doc_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਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_rb_list_not_linkd]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㤀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Lists the radio button list names for a document਀ⴀⴀ 眀栀椀挀栀 愀爀攀 渀漀琀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 
-- 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'਀ऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 搀爀戀氀渀 
			  WHERE NOT EXISTS਀ऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
					   FROM doc_attr.doc_radio_button_links AS drbl਀ऀऀऀऀऀ  圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
							AND    drbl.doc_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 (@docinvalidmessage <> '')          SET @message = @message + ' | ' + @docinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开爀攀愀氀开瘀愀氀甀攀猀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-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਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀            䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
				    drnfn.doc_real_name_id AS 'Document Real Number Field Name ID',਀ऀऀऀऀऀ搀爀渀昀渀⸀洀渀攀洀             䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			        drnfn.attr_name        AS 'Document Real Number Field Name',਀ऀऀऀऀऀ搀爀渀昀渀⸀搀攀猀挀爀            䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					real_value             AS 'Real Number Value',਀ऀऀ            䤀匀一唀䰀䰀⠀甀漀洀⸀甀渀椀琀Ⰰ ✀✀⤀   䄀匀 ✀唀渀椀琀猀✀ 
			   FROM doc_attr.doc_real_number_field_names AS drnfn਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 搀爀渀瘀 
				 ON    drnv.doc_real_name_id ਀ऀऀऀऀ    㴀 搀爀渀昀渀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
		 INNER JOIN base.document_id_list AS dil਀ऀऀऀऀ 伀一    搀椀氀⸀搀漀挀开椀搀  
				    = drnv.doc_id਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀 
		         ON  drnfn.unit_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_doc_text_values_by_doc]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Lists text values for a document਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
-- Output is the list of the free text value, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_text_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',਀ऀऀऀऀऀ搀昀琀昀渀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 ✀䐀漀挀甀洀攀渀琀 䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ 
					dftfn.mnem                  AS 'Mnemonic',਀ऀऀऀ        搀昀琀昀渀⸀愀琀琀爀开渀愀洀攀             䄀匀 ✀䐀漀挀甀洀攀渀琀 䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
					dftfn.descr                 AS 'Description',਀ऀऀ            䤀匀一唀䰀䰀⠀琀攀砀琀开瘀愀氀甀攀Ⰰ ✀✀⤀      䄀匀 ✀吀攀砀琀✀ 
			   FROM doc_attr.doc_free_text_field_names AS dftfn਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 搀昀琀瘀 
				 ON    dftv.doc_free_text_name_id ਀ऀऀऀऀ    㴀 搀昀琀昀渀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
		 INNER JOIN base.document_id_list AS dil਀ऀऀऀऀ 伀一    搀椀氀⸀搀漀挀开椀搀  
				    = dftv.doc_id਀ऀऀऀ  圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		   ORDER BY 'Document Free Text 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: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according linked to a given browsing tag.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 挀漀洀瀀爀椀猀攀猀 愀 氀漀最椀挀愀氀 䄀一䐀 漀昀 愀氀氀 漀昀 琀栀攀 愀渀挀攀猀琀漀爀猀 漀昀 琀栀攀 最椀瘀攀渀 琀愀最Ⰰ 椀渀挀氀甀搀椀渀最 琀栀攀 琀愀最⸀ 
-- 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_br_tree_node] ਀ 
      @tag_br_tree_node_id bigint      = NULL,    ਀ऀ  䀀琀愀最开琀爀攀攀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ   ⴀⴀ 䄀渀 漀瀀琀椀漀渀愀氀 琀愀最 琀爀攀攀 琀漀 戀攀 愀瀀瀀氀椀攀搀 琀漀 琀栀攀 琀愀最 琀漀 爀攀琀爀椀攀瘀攀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 琀愀最⸀ 
	  @tag_descendants nvarchar(3)     = 'ON',   -- A switch which determines whether descendants of the given tag are included.਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @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;  ਀ 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀漀搀攀 䤀䐀 
 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਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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 the tag at the given browsing tree node, plus all its ancestors.਀        ⴀⴀ 䘀漀爀 攀愀挀栀 漀昀 琀栀漀猀攀 琀愀最猀Ⰰ 椀昀 䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 㴀 ✀伀一✀ 琀栀攀渀 爀攀琀爀椀攀瘀攀 愀氀氀 漀昀 琀栀攀椀爀 
        -- descendants from the given tag tree.਀        ⴀⴀ 䤀昀 琀栀攀 椀渀瘀攀爀琀开琀愀最 昀氀愀最 椀猀 琀爀甀攀Ⰰ 琀栀攀渀 攀砀挀氀甀搀攀 愀氀氀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀  
        -- inverted tag, plus all its descendant tags. ਀        ⴀⴀ 匀攀氀攀挀琀 愀氀氀 琀栀攀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 䄀䰀䰀 漀昀 琀栀攀 琀愀最猀 ⠀氀漀最椀挀愀氀 䄀一䐀⤀⸀  
਀            圀䤀吀䠀 䈀爀漀眀猀椀渀最吀爀攀攀䄀渀挀攀猀琀漀爀猀 䄀匀 ⠀ 
                 -- Get the specified node and all its ancestors, excluding the root node਀                 匀䔀䰀䔀䌀吀 琀戀琀渀愀⸀琀愀最开椀搀Ⰰ 琀戀琀渀愀⸀椀渀瘀攀爀琀开琀愀最 
                 FROM tagging.tag_browsing_tree_nodes tbtna਀                 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 琀戀琀渀 
                      ON tbtna.tag_browsing_tree_id = tbtn.tag_browsing_tree_id਀                     䄀一䐀 琀戀琀渀⸀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀琀戀琀渀愀⸀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀ 
                WHERE tbtn.browsing_tree_node_id = @tag_br_tree_node_id਀ऀऀऀऀ  䄀一䐀 琀戀琀渀愀⸀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㰀㸀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀ 
             ),਀             吀愀最吀爀攀攀䐀攀猀挀攀渀搀愀渀琀猀 䄀匀 ⠀ 
                 -- Get all descendants of the tags (including the tags themselves) if @tag_descendants is 'ON'਀                 ⴀⴀ 䤀䴀倀伀刀吀䄀一吀㨀 倀爀攀猀攀爀瘀攀 琀栀攀 漀爀椀最椀渀愀琀椀渀最 愀渀挀攀猀琀漀爀 琀愀最开椀搀 愀渀搀 椀渀瘀攀爀琀开琀愀最 昀氀愀最 
                 SELECT DISTINCT bta.tag_id AS ancestor_tag_id, ISNULL(bta.invert_tag, 0) AS invert_tag, ttd.tag_id਀                 䘀刀伀䴀 䈀爀漀眀猀椀渀最吀爀攀攀䄀渀挀攀猀琀漀爀猀 戀琀愀 
                 JOIN tagging.tag_tree_nodes ttn ON bta.tag_id = ttn.tag_id AND ttn.tag_tree_id = @tag_treeid਀                 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 琀琀搀 
                     ON ttd.tag_tree_id = ttn.tag_tree_id਀                    䄀一䐀 ⠀琀琀搀⸀琀愀最开椀搀 㴀 琀琀渀⸀琀愀最开椀搀 
                     OR (@tag_descendants = 'ON' AND ttd.tag_tree_hierarchyid.IsDescendantOf(ttn.tag_tree_hierarchyid) = 1))਀             ⤀Ⰰ 
             -- Count of distinct non-inverted ancestor tags (the number of AND conditions)਀             一漀渀䤀渀瘀攀爀琀攀搀䄀渀挀攀猀琀漀爀䌀漀甀渀琀 䄀匀 ⠀ 
                 SELECT COUNT(DISTINCT ancestor_tag_id) AS tag_count਀                 䘀刀伀䴀 吀愀最吀爀攀攀䐀攀猀挀攀渀搀愀渀琀猀 
                 WHERE invert_tag = 0਀             ⤀Ⰰ 
             IncludedDocs AS (਀                 ⴀⴀ 䜀攀琀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 䄀䰀䰀 渀漀渀ⴀ椀渀瘀攀爀琀攀搀 琀愀最 最爀漀甀瀀猀 ⠀氀漀最椀挀愀氀 䄀一䐀⤀ 
                 -- A document must appear in every non-inverted ancestor's tag group਀                 匀䔀䰀䔀䌀吀 琀搀氀⸀搀漀挀开椀搀 
                 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਀                 圀䠀䔀刀䔀 搀漀挀开椀搀 一伀吀 䤀一 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 䘀刀伀䴀 䔀砀挀氀甀搀攀搀䐀漀挀猀⤀ 
             ),਀ 
਀ 
     --==============================================਀            搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
            SELECT searchtable.doc_id     AS docid਀              䘀刀伀䴀 吀愀最最攀搀䐀漀挀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
        INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm਀            伀一 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 㴀 瀀攀爀洀⸀搀漀挀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
               WHERE NOT EXISTS ( -- Apply filter group filtering਀            ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
            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਀            ⤀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- 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_co_ms_attr]    Script Date: Tue 12-05-2026 5:43:19 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_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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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 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਀ऀऀ  䔀一䐀 
਀ 
  --============================================਀ 
  -- 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 searchtable.common_object_id      = @commonobjectid਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     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_co_rb_attr]    Script Date: Tue 12-05-2026 5:43:19 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. 202਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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 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਀ऀऀ  䔀一䐀 
਀ 
  --============================================਀ 
  -- 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 searchtable.common_object_id      = @commonobjectid਀ 
 -- 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: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀猀 愀渀搀 愀氀猀漀 昀椀氀攀猀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀猀Ⰰ 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀Ⰰ 戀礀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀⸀ 
-- Input is a document id.  A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开搀漀挀开砀爀攀昀崀  
      @documentid nvarchar(50)         = 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(),     ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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  ਀ 
਀ 
  -- 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.xref_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.xref_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 according to a duty function.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开搀甀琀礀开昀甀渀挀琀椀漀渀崀  
      @functionid 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	਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
   -- 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਀ऀऀऀ䔀一䐀 
਀ 
  -- 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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀甀渀挀琀椀漀渀开椀搀 
		               = @functionid      --### 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-07-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document data according to a file ID.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开昀椀氀攀崀  
      @fileid bigint                   = NULL,  ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @filtergroupid 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,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @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,਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                          -- or alternatively if the file 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;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
     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਀ऀ 䔀一䐀 
਀ ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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਀ऀऀ   
 -- 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਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀऀ 
           	਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀       
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			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਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
     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 @numdocs    = ISNULL(@numdocs, 0);਀    
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开昀椀氀琀攀爀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-07-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according to a filter group.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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 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 base.document_id_list AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.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: 26-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according to a duty function general field name.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开昀甀渀挀琀开昀氀搀开渀愀洀攀崀  
      @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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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 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.');਀ऀऀऀऀ 䔀一䐀   
਀ 
਀ 
  -- 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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid      --### 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 duty function list.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开昀甀渀挀琀椀漀渀开氀椀猀琀崀  
      @functionlistid 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	਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
   -- 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਀ऀऀऀ䔀一䐀 
਀ 
  -- 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_people_list]    Script Date: Tue 12-05-2026 5:43:19 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_people_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 @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਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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.people_list_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_radio_button]    Script Date: Tue 12-05-2026 5:43:19 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_radio_button] ਀      䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ     
	  @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(),     ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@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 @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.');਀ऀऀऀ䔀一䐀  
		ELSE -- @docradiobattrid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀   ⌀⌀⌀ 
					IF NOT EXISTS (SELECT doc_radiob_attr_id       ਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀   
			  	 					WHERE doc_radiob_attr_id = @docradiobattrid) -- Check if the the search criteria 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 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 doc_attr.doc_radio_button_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_radiob_attr_id = @docradiobattrid     --### 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: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according linked to a given 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_id bigint                   = NULL,    ਀ऀ  䀀琀愀最开琀爀攀攀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ   ⴀⴀ 䄀渀 漀瀀琀椀漀渀愀氀 琀愀最 琀爀攀攀 琀漀 戀攀 愀瀀瀀氀椀攀搀 琀漀 琀栀攀 琀愀最 琀漀 爀攀琀爀椀攀瘀攀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 琀愀最⸀ 
	  @tag_descendants nvarchar(3)     = 'ON',   -- A switch which determines whether descendants of the given tag are included.਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @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;  ਀ 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 琀愀最 琀爀攀攀 
 	  	  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਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
 	  -- 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';਀ऀऀऀ 䔀一䐀 
਀ 
  -- 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਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀⴀⴀ 匀攀氀攀挀琀 愀氀氀 琀栀攀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 琀栀攀 最椀瘀攀渀 琀愀最 
			WITH BaseTag AS (਀ऀऀऀऀ匀䔀䰀䔀䌀吀 琀愀最开椀搀Ⰰ 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
				FROM tagging.tag_tree_nodes਀ऀऀऀऀ圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀 
				AND tag_tree_id = @tag_treeid਀ऀऀऀ⤀Ⰰ 
			TaggedDocs AS (਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 琀搀氀⸀搀漀挀开椀搀 
				           FROM tagging.tag_tree_nodes AS ttn਀ऀऀऀऀ     䤀一一䔀刀 䨀伀䤀一 䈀愀猀攀吀愀最 䄀匀 戀琀 
					         ON (@tag_descendants = 'ON' ਀ऀऀऀऀ            䄀一䐀 琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀戀琀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀⤀ 
					         OR  ttn.tag_tree_hierarchyid ਀ऀऀऀऀऀऀऀ    㴀 戀琀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
				     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਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀    ऀ 
	 -- 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_text_field]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 挀漀渀琀攀渀琀 漀昀 愀 琀攀砀琀 昀椀攀氀搀 甀猀椀渀最 琀栀攀 䰀䤀䬀䔀 漀瀀攀爀愀琀漀爀⸀ 
-- A 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. ਀ऀ  䀀氀椀欀攀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ 
	  @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;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 SET @likestring = REPLACE(@likestring, '\', '\\');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀─✀Ⰰ ✀尀─✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '_', '\_');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀嬀✀Ⰰ ✀尀嬀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @doctextnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @doctextnameid IS NOT NULL਀ऀऀ     䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				 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 NotExist');਀ऀऀऀऀऀ䔀一䐀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 一漀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			BEGIN਀ऀऀऀ   匀䔀吀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
			            FROM base.global_settings_groups਀ऀऀऀ        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			    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 DefFrTextIdNotExist.');਀ऀऀऀऀऀ䔀一䐀 
		     END -- END checking the default doc text name field id਀ 
  -- 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 ਀ऀऀ  ⠀ 
		    (@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 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_by_trans_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 椀搀 眀椀琀栀 愀 最椀瘀攀渀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 
-- No filter group is applied. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_trans_group] ਀ 
     @formid 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 ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @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;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 䈀甀琀 愀氀氀漀眀 一唀䰀䰀猀⸀ 
  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_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਀ 
    -- 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਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
--===========================================================================਀ 
  -- Select documents metadata for a given transaction group id.  ਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    IF @transactiongroup IS NULL਀ 
		   BEGIN਀ऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
	  			SELECT ਀ऀऀऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀           䄀匀 䤀䐀  
				 FROM base.document_id_list AS searchtable਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		 WHERE searchtable.transaction_group_id IS NULL਀ऀऀऀऀऀ ⤀ 
਀    ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
			  (SELECT ਀ऀऀऀऀऀ  䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ  
					  docidsCTE.ID            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.ID, NULL, @formid) AS doc_data਀ऀऀ   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
				   ON docidsCTE.ID਀ऀऀऀऀऀऀ  㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					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_name, '')     AS 'Name', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀           䔀一䐀 ⴀⴀ 䔀一䐀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一唀䰀䰀 
਀ऀऀ䔀䰀匀䔀 
	      BEGIN਀ऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
				SELECT ਀ऀऀऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀           䄀匀 䤀䐀  
				 FROM base.document_id_list AS searchtable਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
			WHERE transaction_group_id = @transactiongroup਀ऀऀऀऀऀ⤀ 
			 ਀       ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
			  (SELECT ਀ऀऀऀऀऀ  䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ  
					  docidsCTE.ID            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.ID, NULL, @formid) AS doc_data ਀ऀऀ   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
				   ON docidsCTE.ID਀ऀऀऀऀऀऀ  㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					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';਀ 
		  END -- END ELSE IF @transactiongroup IS NULL਀ 
-- ================================================================================਀        匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     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 document IDs linked to a given user.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开甀猀攀爀崀  
      @sidid 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 record 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.');਀ऀऀऀऀ 䔀一䐀 
਀ 
  -- 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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀猀椀搀开椀搀 
		               = @sidid      --### 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: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according to a general field name for a user.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开甀猀攀爀开昀最渀崀  
      @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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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 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.');਀ऀऀऀऀ 䔀一䐀   
਀ 
਀ 
  -- 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਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid      --### 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: 05-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document ID data according to if a document created 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. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_created_between] ਀   
	  @earlier_date datetime           = 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 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਀ऀऀ  䔀䰀匀䔀 匀䔀吀 䀀氀愀琀攀爀开搀愀琀攀 㴀 一唀䰀䰀㬀 
਀   
    -- 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 base.document_id_list AS searchtable਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
			WHERE searchtable.created <= @later_date AND searchtable.created >= @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 IDs and metadata according to a given date.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
CREATE PROCEDURE [reading].[usp_SEL_docs_date_after] ਀      䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @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_before]    Script Date: Tue 12-05-2026 5:43:19 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 between given dates.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
CREATE PROCEDURE [reading].[usp_SEL_docs_date_between] ਀      䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @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.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                               -- 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 <= @later_date AND searchtable.date_value >= @earlier_date)   --### 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 according to a given date.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开搀愀琀攀开攀焀甀愀氀猀崀  
      @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)਀ऀऀ  ⤀ 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     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: 05-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs and metadata where the default document date field has expired.  ਀ⴀⴀ 吀礀瀀椀挀愀氀氀礀 甀猀攀搀 昀漀爀 氀椀猀琀椀渀最 搀漀挀甀洀攀渀琀猀 昀漀爀 眀栀椀挀栀 琀栀攀 爀攀椀瘀攀眀 搀愀琀攀 栀愀猀 攀砀瀀椀爀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开搀愀琀攀开攀砀瀀椀爀攀搀崀  
਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @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	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ    
        @docdatenameid bigint              = NULL,  	਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@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;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀   ⴀⴀ 刀攀愀搀 琀栀攀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 䤀䐀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀⸀ 
         SELECT @docdatenameid = gsg.default_doc_date_name_id਀           䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		  WHERE gsg.setting_group_name = 'Master'਀ 
		  -- 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 = 'NoDefDocDate', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀攀昀䐀漀挀䐀愀琀攀⸀✀⤀㬀 
			 END  -- The field in global settings is reference constrained to the doc date field table and hence does not need to be verified if it exists.਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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_int_between]    Script Date: Tue 12-05-2026 5:43:19 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,   ਀ऀ  䀀氀漀眀攀爀开椀渀琀开瘀愀氀甀攀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @upper_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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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਀ऀऀ  䄀一䐀   ⠀猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㸀 䀀氀漀眀攀爀开椀渀琀开瘀愀氀甀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㰀 䀀甀瀀瀀攀爀开椀渀琀开瘀愀氀甀攀⤀ऀऀ   
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     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 integer.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- 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_equals] ਀ऀ  䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ    
	  @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_int_greater_than]    Script Date: Tue 12-05-2026 5:43:19 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,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
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_int_less_than]    Script Date: Tue 12-05-2026 5:43:19 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: 01-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document and associated file metadata by document multi-select attribute link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀Ⰰ 愀渀 漀瀀琀椀漀渀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀 
-- and an optional form id.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开洀甀氀琀椀开猀攀氀开愀琀琀爀崀  
	  @docmslistid 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 @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਀ऀऀऀ 䔀一䐀 
਀ 
  --============================================਀ 
  -- 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 searchtable.doc_ms_attr_id = @docmsattrid਀ 
 -- 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: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files according to a given real number field being between two 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_real_between] ਀ऀ  䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ    
	  @lower_real_value real           = 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 > @lower_real_value AND searchtable.real_value < @upper_real_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 according to a given real number.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- 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_equals] ਀ऀ  䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ    
	  @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਀ऀऀ  䄀一䐀   ⠀猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀 㴀 䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀⤀ 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     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 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_real_greater_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_docs_real_less_than]    Script Date: Tue 12-05-2026 5:43:19 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: 11-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all the data linked to a single document.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- plus the list of metadata.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_document_details] ਀ 
     @documentid nvarchar(50)         = 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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userid bigint                       = NULL, -- User ID for the connected user. ਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- 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';  ਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
 -- 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਀ऀऀऀ䔀一䐀 
਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY ਀ 
਀圀䤀吀䠀 䐀漀挀䐀愀琀愀 䄀匀 ⠀ 
਀      匀䔀䰀䔀䌀吀   ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            coln.list_name AS Name,਀ऀऀऀऀ挀漀⸀漀戀樀攀挀琀开渀愀洀攀 䄀匀 嘀愀氀甀攀Ⰰ 
				''             AS Units਀ऀऀ   䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 䄀匀 挀漀洀猀氀氀 
	 INNER JOIN com_obj.common_object_lists AS col਀ऀऀऀ 伀一      挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			    = comsll.common_object_list_id਀ऀऀऀ    䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
				= comsll.common_object_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 挀漀氀渀 
			 ON  coln.common_object_list_id ਀ऀऀऀ    㴀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
	 INNER JOIN com_obj.common_objects AS co਀ऀ ऀऀ 伀一    挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			    = col.common_object_id਀ऀऀ  圀䠀䔀刀䔀 挀漀洀猀氀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 刀愀搀椀漀 䈀甀琀琀漀渀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            coln.list_name AS Name,਀ऀऀऀऀ挀漀⸀漀戀樀攀挀琀开渀愀洀攀 䄀匀 嘀愀氀甀攀Ⰰ 
				''             AS Units਀ऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 挀漀洀爀戀氀 
  INNER JOIN com_obj.common_object_lists AS col ਀ऀ  ऀ  伀一      挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		     = comrbl.common_object_list_id਀ऀऀ     䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			 = comrbl.common_object_id਀  䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 挀漀氀渀 
	  	  ON  coln.common_object_list_id ਀ऀऀ     㴀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
  INNER JOIN com_obj.common_objects AS co਀ऀऀ  伀一    挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		     = col.common_object_id਀ऀ   圀䠀䔀刀䔀 挀漀洀爀戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䐀愀琀攀 䘀椀攀氀搀✀          䄀匀 吀礀瀀攀Ⰰ 
	           fieldname.attr_name   AS Name,਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瘀愀氀⸀搀愀琀攀开瘀愀氀甀攀Ⰰ  
                    (SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER'))   AS Value,਀ऀऀऀऀ✀✀             䄀匀 唀渀椀琀猀 
		FROM doc_attr.doc_date_values AS val਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.doc_date_name_id ਀ऀऀ     㴀     瘀愀氀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
	   WHERE val.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Free Text Field'   AS Type,਀ऀ           昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
               val.text_value      AS Value,਀ऀऀऀऀ✀✀                 䄀匀 唀渀椀琀猀 
		FROM doc_attr.doc_free_text_values AS val਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.doc_free_text_name_id ਀ऀऀ     㴀     瘀愀氀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
	   WHERE val.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Integer Field'     AS Type,਀ऀ           昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
			   CONVERT(NVARCHAR(10), val.int_value) AS Value,਀               甀漀洀⸀甀渀椀琀 䄀匀 唀渀椀琀猀 
		FROM doc_attr.doc_integer_values AS val਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.doc_int_name_id ਀ऀऀ     㴀     瘀愀氀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 
   LEFT JOIN base.units_of_measure AS uom ਀          伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀 㴀 甀漀洀⸀甀渀椀琀开椀搀 
	   WHERE val.doc_id = @documentid਀ 
	   UNION ALL਀ 
      SELECT   'Document Multi-Select' AS Type,਀ऀ            昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀    䄀匀 一愀洀攀Ⰰ 
				val.attr_name          AS Value,਀ऀऀऀऀ✀✀                     䄀匀 唀渀椀琀猀 
		   FROM doc_attr.doc_multi_select_links AS dmsl਀ऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 瘀愀氀 
			 ON    dmsl.doc_ms_list_id ਀ऀऀऀ    㴀 瘀愀氀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
			    AND dmsl.doc_ms_attr_id ਀ऀऀऀ    㴀    瘀愀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
	 INNER JOIN doc_attr.doc_multi_select_list_names AS fieldname਀ऀऀऀ 伀一  瘀愀氀⸀搀漀挀开洀猀开氀椀猀琀开椀搀  
			    = fieldname.doc_ms_list_id਀ऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀ऀ   唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䐀漀挀甀洀攀渀琀 刀愀搀椀漀 䈀甀琀琀漀渀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            fieldname.attr_name    AS Name,਀ऀऀऀऀ瘀愀氀⸀愀琀琀爀开渀愀洀攀          䄀匀 嘀愀氀甀攀Ⰰ 
				''                     AS Units਀ऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
	 INNER JOIN doc_attr.doc_radio_button_attributes AS val਀ऀऀऀ 伀一  搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
			    = val.doc_radiob_list_id਀ऀऀऀ    䄀一䐀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
			    =    val.doc_radiob_attr_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
			 ON         val.doc_radiob_list_id ਀ऀऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		  WHERE drbl.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Real Number Field' AS Type,਀ऀ           昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
			   CONVERT(NVARCHAR(10), val.real_value) AS Value,਀               甀漀洀⸀甀渀椀琀            䄀匀 唀渀椀琀猀 
		FROM doc_attr.doc_real_number_values AS val਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.doc_real_name_id ਀ऀऀ     㴀     瘀愀氀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
   LEFT JOIN base.units_of_measure AS uom ਀          伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀 㴀 甀漀洀⸀甀渀椀琀开椀搀 
	   WHERE val.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Duty Function' AS Type,਀ऀ            最昀渀⸀渀愀洀攀       䄀匀 一愀洀攀Ⰰ 
				val.name       AS Value,਀ऀऀऀऀ✀✀             䄀匀 唀渀椀琀猀 
		   FROM people.doc_to_function_links AS dtfl਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 瘀愀氀 
			 ON  dtfl.function_id ਀ऀऀऀ    㴀 瘀愀氀⸀昀甀渀挀琀椀漀渀开椀搀 
	 INNER JOIN people.general_field_names AS gfn਀ऀ         伀一  搀琀昀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			    = gfn.general_field_name_id਀ऀऀ  圀䠀䔀刀䔀 搀琀昀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䰀椀猀琀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            gfn.name       AS Name,਀ऀऀऀऀ瘀愀氀⸀渀愀洀攀       䄀匀 嘀愀氀甀攀Ⰰ 
				''                  AS Units਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 搀琀昀氀氀 
	 INNER JOIN people.function_list_names AS val਀ऀऀऀ 伀一  搀琀昀氀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
			    =  val.function_list_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
	         ON dtfll.general_field_name_id਀ऀऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		  WHERE dtfll.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'People List' AS Type,਀ऀ            最昀渀⸀渀愀洀攀       䄀匀 一愀洀攀Ⰰ 
				val.name       AS Value,਀ऀऀऀऀ✀✀           䄀匀 唀渀椀琀猀 
		   FROM people.doc_to_people_list_links AS dtpll਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瘀愀氀 
			 ON  dtpll.people_list_id ਀ऀऀऀ    㴀  瘀愀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
	 INNER JOIN people.general_field_names AS gfn਀ऀ         伀一 搀琀瀀氀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			    = gfn.general_field_name_id਀ऀऀ  圀䠀䔀刀䔀 搀琀瀀氀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀✀       䄀匀 吀礀瀀攀Ⰰ 
	            ''                       AS Name,਀ऀऀऀ   ⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀⤀ ⬀ ✀ ⴀ ✀ ⬀ 䰀䔀䘀吀⠀琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀Ⰰ ㈀㔀⤀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
				''                       AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
	 INNER JOIN base.transaction_groups AS tg਀ऀ         伀一  搀椀氀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
			    = tg.transaction_group_id਀ऀऀ  圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䤀䐀 䰀漀挀欀 匀琀愀琀甀猀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            ''              AS Name,਀ऀऀऀऀ瘀愀氀⸀氀漀挀欀开猀琀愀琀甀猀 䄀匀 嘀愀氀甀攀Ⰰ 
				''              AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 瘀愀氀 
		  WHERE val.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Created By'     AS Type,਀ऀ            ✀✀              䄀匀 一愀洀攀Ⰰ 
				ISNULL(val.created_by_username, '') AS Value,਀ऀऀऀऀ✀✀              䄀匀 唀渀椀琀猀 
		   FROM base.document_id_list AS val਀ऀऀ  圀䠀䔀刀䔀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀爀攀愀琀攀搀✀     䄀匀 吀礀瀀攀Ⰰ 
	            ''           AS Name,਀ऀऀऀऀ䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瘀愀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀Ⰰ ✀✀⤀  䄀匀 嘀愀氀甀攀Ⰰ 
				''           AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 瘀愀氀 
		  WHERE val.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Tag'         AS Type,਀ऀ            ✀✀           䄀匀 一愀洀攀Ⰰ 
				val.tag_name AS Value,਀ऀऀऀऀ✀✀           䄀匀 唀渀椀琀猀 
		   FROM tagging.tag_to_document_links AS ttdl਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 瘀愀氀 
	            ON  ttdl.tag_id਀ऀऀऀऀ   㴀 瘀愀氀⸀琀愀最开椀搀 
		  WHERE ttdl.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Cross Reference' AS Type,਀ऀ            挀爀琀⸀愀琀琀爀开渀愀洀攀    䄀匀 一愀洀攀Ⰰ 
				dcr.xref_doc_id  AS Value,਀ऀऀऀऀ✀✀               䄀匀 唀渀椀琀猀 
		   FROM xref.doc_cross_references AS dcr਀ऀ 䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀 䄀匀 挀爀琀 
	         ON   dcr.xref_type_id ਀ऀऀऀ    㴀 挀爀琀⸀砀爀攀昀开琀礀瀀攀开椀搀 
		  WHERE dcr.source_doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Cross Reference' AS Type,਀ऀ            挀爀琀⸀愀琀琀爀开渀愀洀攀    䄀匀 一愀洀攀Ⰰ 
				dcr.source_doc_id  AS Value,਀ऀऀऀऀ✀✀               䄀匀 唀渀椀琀猀 
		   FROM xref.doc_cross_references AS dcr਀ऀ 䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀 䄀匀 挀爀琀 
	         ON   dcr.xref_type_id ਀ऀऀऀ    㴀 挀爀琀⸀砀爀攀昀开琀礀瀀攀开椀搀 
		  WHERE dcr.xref_doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Document Group'    AS Type,਀ऀ           ✀✀                  䄀匀 一愀洀攀Ⰰ 
			   fieldname.attr_name AS Value,਀               ✀✀                  䄀匀 唀渀椀琀猀 
		FROM xref.doc_group_links AS val਀  䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.doc_group_id਀ऀऀ     㴀     瘀愀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
	   WHERE val.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Controller Document Group' AS Type,਀ऀ           ✀✀                  䄀匀 一愀洀攀Ⰰ 
			   fieldname.attr_name AS Value,਀               ✀✀                  䄀匀 唀渀椀琀猀 
		FROM xref.controller_doc_group_links AS val਀  䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.controller_doc_group_name_id਀ऀऀ     㴀     瘀愀氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
	   WHERE val.doc_id = @documentid਀ 
		)਀ 
    SELECT * FROM DocData਀ 
਀ऀऀऀ   
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all duty functions which the connected user is linked to.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 搀甀琀礀 昀甀渀挀琀椀漀渀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 搀甀琀礀 昀甀渀挀琀椀漀渀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ一漀渀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of duty function 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(df.mnem, '')        AS 'Mnemonic',਀ऀऀऀऀ 搀昀⸀渀愀洀攀                    䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀Ⰰ 
				 ISNULL(df.description, '') AS 'Description',਀ऀऀऀऀ 搀昀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		    FROM people.duty_functions AS df  ਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
	          ON      df.function_id਀ऀऀऀ      㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
	   LEFT JOIN user_restr.sid_list AS sl਀ऀ          伀一  搀昀猀氀⸀猀椀搀开椀搀 
			     =  sl.sid_id਀ऀ       圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀   ऀऀऀ       
			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: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists duty functions for a given sid record id 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:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀甀琀礀开昀甀渀挀琀椀漀渀猀开戀礀开猀椀搀崀  
਀     䀀猀椀搀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @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 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 @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 䀀猀椀搀爀攀挀漀爀搀椀搀                    䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				 dfsl.function_id                AS 'Duty Function ID', ਀ऀऀऀऀ 搀昀⸀洀渀攀洀                         䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				 df.name                         AS 'Duty Function Name',਀ऀऀऀऀ 搀昀⸀搀攀猀挀爀椀瀀琀椀漀渀                  䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 df.list_position                AS 'List Position',਀ऀऀ         䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀昀猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				 dfsl.granted_by                 AS 'Granted By'	਀ऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
	   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_eula]    Script Date: Tue 12-05-2026 5:43:19 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 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready'਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  SET @eula = ਀ऀ    ⠀匀䔀䰀䔀䌀吀 吀伀倀 ㄀ 
		       e.doc_content AS Value਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀攀甀氀愀 䄀匀 攀 
		 WHERE e.status = 'Current')਀ 
਀ऀ         
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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 ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- This procedure reads the contents of a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 䤀䐀⸀  伀甀琀瀀甀琀 椀猀 琀栀攀 戀椀渀愀爀礀 昀椀氀攀Ⰰ 
-- the filename, and a message. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file]਀ 
    @fileid bigint                   = NULL,਀ऀ䀀昀椀氀攀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㈀㔀㔀⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	@filesize bigint                 = NULL OUTPUT,਀    䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	@transaction_status nvarchar(50) = NULL OUTPUT	਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ ऀऀ 
	    @connectedusersid varbinary(100)         = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀猀椀搀椀搀 戀椀最椀渀琀                            㴀 一唀䰀䰀Ⰰ   
		@transaction_ready nchar(10)       = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  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਀ 
  IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
      EXEC internal.usp_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਀ 
-- Select the filename, file size and content.  Other metadata can be retrieved elsewhere.  ਀ⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀渀愀洀攀 愀渀搀 昀椀氀攀 猀椀稀攀 猀攀瀀愀爀愀琀攀 昀爀漀洀 琀栀攀 挀漀渀琀攀渀琀 猀漀 琀栀愀琀 琀栀攀礀 眀椀氀氀 戀攀 椀渀 愀 猀攀瀀愀爀愀琀攀 
-- cursor element.  This reduces the risk that an application programming error will਀ⴀⴀ 攀洀戀攀搀 琀栀攀 洀攀琀愀搀愀琀愀 椀渀琀漀 琀栀攀 昀椀氀攀 挀漀渀琀攀渀琀⸀  䤀琀 椀猀 攀砀瀀攀挀琀攀搀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 氀漀愀搀 漀渀 
-- this database will generally be low.਀ 
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
      BEGIN TRY਀ऀ   
  -- Select the SID ID for the connected user਀ऀ  匀䔀䰀䔀䌀吀 䀀猀椀搀椀搀 㴀 猀氀⸀猀椀搀开椀搀 
		FROM user_restr.sid_list AS sl਀ऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀㬀 
਀ऀऀ   匀䔀䰀䔀䌀吀 䀀昀椀氀攀渀愀洀攀 㴀 昀椀氀攀渀愀洀攀Ⰰ 
		          @filesize = file_size਀ऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 
			WHERE file_id = @fileid;਀ 
           IF @filename IS NULL OR @filename = '' -- If the file_name field was NULL or empty then substitute the file id.਀ऀऀऀ    匀䔀吀 䀀昀椀氀攀渀愀洀攀 㴀 䌀伀一䌀䄀吀⠀✀䘀椀氀攀䤀䐀✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀㔀㔀⤀Ⰰ䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀甀渀欀渀漀眀渀✀⤀㬀 
਀ऀ   ⴀⴀ   圀爀椀琀攀 愀渀 攀渀琀爀礀 椀渀 琀栀攀 昀椀氀攀 爀攀愀搀 氀漀最 椀昀 椀琀 椀猀 攀渀愀戀氀攀搀⸀ 
	  IF EXISTS (SELECT gsg.file_read_log ਀ऀ               䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		          WHERE gsg.setting_group_name = 'Master'਀ऀऀऀऀ    䄀一䐀 最猀最⸀昀椀氀攀开爀攀愀搀开氀漀最 㴀 ✀伀渀✀⤀ 
		   BEGIN਀ऀऀ     䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀昀椀氀攀开爀攀愀搀开氀漀最 
			             (file_id,  filename,  read_by_sid_id)਀ऀऀऀऀ  嘀䄀䰀唀䔀匀 ⠀䀀昀椀氀攀椀搀Ⰰ 䀀昀椀氀攀渀愀洀攀Ⰰ 䀀猀椀搀椀搀⤀  ⴀⴀ 爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀 椀猀 瀀漀瀀甀氀愀琀攀搀 戀礀 琀栀攀 琀愀戀氀攀 挀漀氀甀洀渀 戀椀渀搀椀渀最 琀漀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 
਀ऀऀ   䔀一䐀 
਀           匀䔀䰀䔀䌀吀 昀椀氀攀开挀漀渀琀攀渀琀 䄀匀 ✀䘀椀氀攀 䌀漀渀琀攀渀琀✀  
             FROM base.file_storage ਀ऀ        圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀㬀 
਀ऀ   䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㸀 　 ⴀⴀ 䤀昀 爀漀眀挀漀甀渀琀 㴀 　 琀栀攀 吀刀夀 眀椀氀氀 猀琀椀氀氀 渀漀琀 戀攀 昀愀椀氀攀搀 
	      BEGIN਀ऀ         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                  @message_id   = 'Success',਀                  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	         SET @transaction_status = 'Good';਀ 
	      END਀ऀ   䔀䰀匀䔀 
	      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 NotExist.');਀ऀऀ  䔀一䐀 
	  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: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 搀愀琀攀 瘀愀氀甀攀猀 昀漀爀 愀 昀椀氀攀 
-- Input is a file 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਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)      = '', -- Communicates that no file id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@fileauthenticationstatus nchar(10) = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@dateformat nchar(3)                = 'dmy',਀ऀऀ䀀搀愀琀攀猀琀礀氀攀 椀渀琀                      㴀 ㄀　㔀Ⰰ 
		@transaction_ready nchar(10)        = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- 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਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  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.';਀ऀ䔀一䐀 
਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  -- Set the date style਀ 
  SET @datestyle = (SELECT date_style AS 'Date Style'਀                      䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		             WHERE gsg.setting_group_name = 'Master');਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			 SELECT @fileid                                       AS 'File ID',      ਀ऀऀऀ        䤀匀一唀䰀䰀⠀昀搀昀渀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀                    䄀匀 ✀䘀椀氀攀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
					ISNULL(fdfn.mnem, '')                         AS 'Mnemonic',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀搀昀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀                        䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
                    CONVERT(NVARCHAR, fdv.date_value, @datestyle) AS 'Date',਀ऀऀऀ        昀搀昀渀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀                        䄀匀 ✀䘀椀氀攀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
	           FROM file_attr.file_date_field_names AS fdfn਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 昀搀瘀 
				 ON    fdv.file_date_name_id ਀ऀऀऀऀ    㴀 昀搀昀渀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
		 INNER JOIN base.file_metadata AS fm਀ऀऀऀऀ 伀一    昀洀⸀昀椀氀攀开椀搀  
				    = fdv.file_id਀ऀऀऀ  圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		   ORDER BY 'File Date 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;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开搀攀琀愀椀氀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 12-09-2025਀ⴀⴀ 吀栀椀猀 瀀爀漀挀攀搀甀爀攀 爀攀愀搀猀 琀栀攀 搀愀琀愀 愀渀搀 琀栀攀 琀栀甀洀戀渀愀椀氀 昀漀爀 愀 猀椀渀最氀攀 昀椀氀攀⸀ 
-- Input is the file ID and form ID.  Output is the data, thumbnail,਀ⴀⴀ 琀栀攀 昀椀氀攀渀愀洀攀Ⰰ 愀渀搀 愀 洀攀猀猀愀最攀⸀  䌀漀爀爀攀猀瀀漀渀搀猀 琀漀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开搀漀挀甀洀攀渀琀开搀攀琀愀椀氀猀⸀    
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_details]਀ 
	  @fileid bigint                   = NULL,਀ऀ  䀀琀栀甀洀戀渀愀椀氀 瘀愀爀戀椀渀愀爀礀⠀洀愀砀⤀        㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @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਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ ऀऀ 
਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	@data_validation_status nchar(10)  = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
਀ 
 -- 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.');਀ऀ 䔀一䐀 
  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਀ऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 昀椀氀攀 椀搀 攀砀椀猀琀猀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀  
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
-- ====================================================਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
		BEGIN TRY਀ 
WITH FileData AS (਀ 
      SELECT   'Filename'  AS Type,਀ऀ            ✀✀         䄀匀 一愀洀攀Ⰰ 
			   fm.filename AS Value,਀ऀऀऀऀ✀✀         䄀匀 唀渀椀琀猀 
		   FROM base.file_metadata AS fm਀ऀऀ  圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            coln.list_name AS Name,਀ऀऀऀऀ挀漀⸀漀戀樀攀挀琀开渀愀洀攀 䄀匀 嘀愀氀甀攀Ⰰ 
				''             AS Units਀ऀऀ   䘀刀伀䴀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 䄀匀 挀漀洀猀氀氀 
	 INNER JOIN com_obj.common_object_lists AS col਀ऀऀऀ 伀一      挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			    = comsll.common_object_list_id਀ऀऀऀ    䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
				= comsll.common_object_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 挀漀氀渀 
			 ON  coln.common_object_list_id ਀ऀऀऀ    㴀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
	 INNER JOIN com_obj.common_objects AS co਀ऀ ऀऀ 伀一    挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			    = col.common_object_id਀ऀऀ  圀䠀䔀刀䔀 挀漀洀猀氀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 刀愀搀椀漀 䈀甀琀琀漀渀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            coln.list_name AS Name,਀ऀऀऀऀ挀漀⸀漀戀樀攀挀琀开渀愀洀攀 䄀匀 嘀愀氀甀攀Ⰰ 
				''             AS Units਀ऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 挀漀洀爀戀氀 
  INNER JOIN com_obj.common_object_lists AS col ਀ऀ  ऀ  伀一      挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		     = comrbl.common_object_list_id਀ऀऀ     䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			 = comrbl.common_object_id਀  䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 挀漀氀渀 
	  	  ON  coln.common_object_list_id ਀ऀऀ     㴀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
  INNER JOIN com_obj.common_objects AS co਀ऀऀ  伀一    挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		     = col.common_object_id਀ऀ   圀䠀䔀刀䔀 挀漀洀爀戀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䐀愀琀攀 䘀椀攀氀搀✀          䄀匀 吀礀瀀攀Ⰰ 
	           fieldname.attr_name   AS Name,਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瘀愀氀⸀搀愀琀攀开瘀愀氀甀攀Ⰰ  
                    (SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER'))   AS Value,਀ऀऀऀऀ✀✀             䄀匀 唀渀椀琀猀 
		FROM file_attr.file_date_values AS val਀  䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.file_date_name_id ਀ऀऀ     㴀     瘀愀氀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
	   WHERE val.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Free Text Field'   AS Type,਀ऀ           昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
               val.text_value      AS Value,਀ऀऀऀऀ✀✀                 䄀匀 唀渀椀琀猀 
		FROM file_attr.file_free_text_values AS val਀  䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.file_free_text_name_id ਀ऀऀ     㴀     瘀愀氀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
	   WHERE val.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Integer Field'     AS Type,਀ऀ           昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
			   CONVERT(NVARCHAR(10), val.int_value) AS Value,਀               甀漀洀⸀甀渀椀琀 䄀匀 唀渀椀琀猀 
		FROM file_attr.file_integer_values AS val਀  䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.file_int_name_id ਀ऀऀ     㴀     瘀愀氀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
   LEFT JOIN base.units_of_measure AS uom ਀          伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀 㴀 甀漀洀⸀甀渀椀琀开椀搀 
	   WHERE val.file_id = @fileid਀ 
	   UNION ALL਀ 
      SELECT   'File Multi-Select' AS Type,਀ऀ            昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀    䄀匀 一愀洀攀Ⰰ 
				val.attr_name          AS Value,਀ऀऀऀऀ✀✀                     䄀匀 唀渀椀琀猀 
		   FROM file_attr.file_multi_select_links AS fmsl਀ऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 瘀愀氀 
			 ON    fmsl.file_ms_list_id ਀ऀऀऀ    㴀 瘀愀氀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
			    AND fmsl.file_ms_attr_id ਀ऀऀऀ    㴀    瘀愀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
	 INNER JOIN file_attr.file_multi_select_list_names AS fieldname਀ऀऀऀ 伀一  瘀愀氀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀  
			    = fieldname.file_ms_list_id਀ऀऀ  圀䠀䔀刀䔀 昀洀猀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀ऀ   唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            fieldname.attr_name    AS Name,਀ऀऀऀऀ瘀愀氀⸀愀琀琀爀开渀愀洀攀          䄀匀 嘀愀氀甀攀Ⰰ 
				''                     AS Units਀ऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀爀戀氀 
	 INNER JOIN file_attr.file_radio_button_attributes AS val਀ऀऀऀ 伀一  昀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
			    = val.file_radiob_list_id਀ऀऀऀ    䄀一䐀 昀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
			    =    val.file_radiob_attr_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
			 ON         val.file_radiob_list_id ਀ऀऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		  WHERE frbl.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Real Number Field' AS Type,਀ऀ           昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
			   CONVERT(NVARCHAR(10), val.real_value) AS Value,਀               甀漀洀⸀甀渀椀琀            䄀匀 唀渀椀琀猀 
		FROM file_attr.file_real_number_values AS val਀  䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
	  	  ON fieldname.file_real_name_id ਀ऀऀ     㴀     瘀愀氀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
   LEFT JOIN base.units_of_measure AS uom ਀          伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀 㴀 甀漀洀⸀甀渀椀琀开椀搀 
	   WHERE val.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Duty Function' AS Type,਀ऀ            最昀渀⸀渀愀洀攀       䄀匀 一愀洀攀Ⰰ 
				val.name       AS Value,਀ऀऀऀऀ✀✀             䄀匀 唀渀椀琀猀 
		   FROM people.file_to_function_links AS ftfl਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 瘀愀氀 
			 ON  ftfl.function_id ਀ऀऀऀ    㴀 瘀愀氀⸀昀甀渀挀琀椀漀渀开椀搀 
	 INNER JOIN people.general_field_names AS gfn਀ऀ         伀一  昀琀昀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			    = gfn.general_field_name_id਀ऀऀ  圀䠀䔀刀䔀 昀琀昀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䰀椀猀琀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            gfn.name            AS Name,਀ऀऀऀऀ瘀愀氀⸀渀愀洀攀            䄀匀 嘀愀氀甀攀Ⰰ 
				''                  AS Units਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀琀昀氀氀 
	 INNER JOIN people.function_list_names AS val਀ऀऀऀ 伀一  昀琀昀氀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
			    =  val.function_list_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
	         ON ftfll.general_field_name_id਀ऀऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		  WHERE ftfll.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'People List' AS Type,਀ऀ            最昀渀⸀渀愀洀攀     䄀匀 一愀洀攀Ⰰ 
				val.name     AS Value,਀ऀऀऀऀ✀✀           䄀匀 唀渀椀琀猀 
		   FROM people.file_to_people_list_links AS ftpll਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瘀愀氀 
			 ON  ftpll.people_list_id ਀ऀऀऀ    㴀  瘀愀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
	 INNER JOIN people.general_field_names AS gfn਀ऀ         伀一 昀琀瀀氀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			    = gfn.general_field_name_id਀ऀऀ  圀䠀䔀刀䔀 昀琀瀀氀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䘀椀氀攀 䜀爀漀甀瀀✀   䄀匀 吀礀瀀攀Ⰰ 
	            fgn.attr_name AS Name,਀ऀऀऀऀ✀✀            䄀匀 嘀愀氀甀攀Ⰰ 
				''            AS Units਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 愀猀 昀最氀 
	 INNER JOIN xref.file_group_names as fgn਀ऀऀऀ 伀一    昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
			    =  fgn.file_group_id਀ऀऀ  圀䠀䔀刀䔀 昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀✀       䄀匀 吀礀瀀攀Ⰰ 
	            ''                       AS Name,਀ऀऀऀ   ⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀⤀ ⬀ ✀ ⴀ ✀ ⬀ 䰀䔀䘀吀⠀琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀Ⰰ ㈀㔀⤀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
				''                       AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
	 INNER JOIN base.transaction_groups AS tg਀ऀ         伀一   昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
			    = tg.transaction_group_id਀ऀऀ  圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀爀攀愀琀攀搀 䈀礀✀     䄀匀 吀礀瀀攀Ⰰ 
	            ''              AS Name,਀ऀऀऀऀ䤀匀一唀䰀䰀⠀瘀愀氀⸀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
				''              AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 瘀愀氀 
		  WHERE val.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Created'     AS Type,਀ऀ            ✀✀           䄀匀 一愀洀攀Ⰰ 
				ISNULL(CONVERT(NVARCHAR(30), val.created, 120), '')  AS Value,਀ऀऀऀऀ✀✀           䄀匀 唀渀椀琀猀 
		   FROM base.file_metadata AS val਀ऀऀ  圀䠀䔀刀䔀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀刀攀琀攀渀琀椀漀渀 䐀愀琀攀✀       䄀匀 吀礀瀀攀Ⰰ 
	            ''                    AS Name,਀               䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀洀⸀爀攀琀攀渀琀椀漀渀开搀愀琀攀Ⰰ  
                    (SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER')), '')   AS Value,਀ऀऀऀऀ✀✀                       䄀匀 唀渀椀琀猀 
		   FROM base.file_metadata AS fm਀ऀऀ  圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䘀椀氀攀 匀椀稀攀✀   䄀匀 吀礀瀀攀Ⰰ 
	            ''           AS Name,਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㈀　⤀Ⰰ 昀洀⸀昀椀氀攀开猀椀稀攀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
				'Bytes'      AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
		  WHERE fm.file_id = @fileid਀ 
਀ऀऀ⤀ 
਀    匀䔀䰀䔀䌀吀 ⨀ 䘀刀伀䴀 䘀椀氀攀䐀愀琀愀 
਀ 
		  ਀ऀऀ  匀䔀䰀䔀䌀吀 䀀琀栀甀洀戀渀愀椀氀 㴀 昀琀⸀琀栀甀洀戀渀愀椀氀 
		    FROM base.file_thumbnails AS ft਀ऀऀ   圀䠀䔀刀䔀 昀琀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀㬀 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @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 [reading].[usp_SEL_file_group_names]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all file group 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 ਀ऀ         愀琀琀爀开渀愀洀攀               䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
	         ISNULL(mnem, '')        AS 'Mnemonic',਀             䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀       䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 file_group_id           AS 'File Group ID',਀ऀऀऀ 氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	    FROM xref.file_group_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: 26-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀猀 眀栀椀挀栀 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_group_names_rstr]਀ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀        䀀甀猀攀爀猀椀搀  瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀ 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  ਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT DISTINCT਀ऀ         愀琀琀爀开渀愀洀攀             䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
	         ISNULL(fgn.mnem, '')  AS 'Mnemonic',਀             䤀匀一唀䰀䰀⠀昀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 fgn.file_group_id     AS 'File Group ID',਀ऀऀऀ 昀最渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀     䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	    FROM xref.file_group_names AS fgn਀ 
         LEFT JOIN user_restr.file_group_edit_perm_funct_lst AS fgepfl -- Check through duty function lists਀ऀऀ        伀一      昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
				   = fgepfl.file_group_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
                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਀             圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀  
  			            ਀        唀一䤀伀一 
	  SELECT DISTINCT਀ऀ         愀琀琀爀开渀愀洀攀             䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
	         ISNULL(fgn.mnem, '')  AS 'Mnemonic',਀             䤀匀一唀䰀䰀⠀昀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 fgn.file_group_id     AS 'File Group ID',਀ऀऀऀ 昀最渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀     䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	    FROM xref.file_group_names AS fgn਀ 
         LEFT JOIN user_restr.file_group_edit_perm_ppl_lst AS fgeppl -- Check through people lists਀ऀऀ        伀一      昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
				   = fgeppl.file_group_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
                ON  fgeppl.people_list_id ਀ऀऀऀऀ   㴀    瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
        INNER JOIN user_restr.sid_list AS sl਀                伀一   瀀氀⸀猀椀搀开椀搀  
				   = sl.sid_id਀             圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  			        ਀ 
    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_groups_by_file]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 刀攀愀搀猀 昀椀氀攀 最爀漀甀瀀猀 昀爀漀洀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 椀搀⸀ 
-- Input is a file ID.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 昀椀氀攀 最爀漀甀瀀 搀攀琀愀椀氀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 刀攀愀搀猀 昀椀氀攀 最爀漀甀瀀猀 昀爀漀洀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 椀搀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of file group details਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @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:**਀⨀ 
* - @fileid must be provided and be valid਀⨀ ⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_groups_by_file] ਀ 
     @fileid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
	  -- 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਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 昀椀氀攀 椀搀 椀猀 瘀愀氀椀搀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
		 -- End checking the file id਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ     匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀                  䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
		        fgn.file_group_id        AS 'File Group ID',਀                䤀匀一唀䰀䰀⠀昀最渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				fgn.attr_name            AS 'File Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ISNULL(fgl.notes, '')    AS 'Record Notes',਀ऀऀऀऀ氀椀猀琀开瀀漀猀椀琀椀漀渀            䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		   FROM xref.file_group_names  AS fgn਀ऀ 䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
	         ON   fgn.file_group_id਀ऀऀऀ    㴀 昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
		  WHERE fgl.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(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开椀渀琀开瘀愀氀甀攀猀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 椀渀琀攀最攀爀 瘀愀氀甀攀猀 昀漀爀 愀 昀椀氀攀 
-- Input is a file 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਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)      = '', -- Communicates that no file id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@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';  ਀ 
-- 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਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  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਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀                䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			        fifn.file_int_name_id  AS 'File Integer Field Name ID',਀ऀऀऀ        昀椀昀渀⸀愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀椀氀攀 䤀渀琀攀最攀爀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
					ISNULL(fifn.mnem, '')  AS 'Mnemonic',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀椀昀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					fiv.int_value          AS 'Integer Value',਀ऀऀ            䤀匀一唀䰀䰀⠀甀漀洀⸀甀渀椀琀Ⰰ ✀✀⤀   䄀匀 ✀唀渀椀琀猀✀ 
			   FROM file_attr.file_integer_field_names AS fifn਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 昀椀瘀 
				 ON    fiv.file_int_name_id ਀ऀऀऀऀ    㴀 昀椀昀渀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
		 INNER JOIN base.file_metadata AS fm਀ऀऀऀऀ 伀一     昀洀⸀昀椀氀攀开椀搀  
				     = fiv.file_id਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀 
		         ON  fifn.unit_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;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开洀猀开愀琀琀爀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀猀 昀漀爀 愀 昀椀氀攀 
-- Input is a file 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਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)      = '', -- Communicates that no file id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@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';  ਀ 
-- 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਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  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 @fileid                 AS 'File ID', ਀ऀऀऀ        昀洀猀氀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀    䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
                    fmsln.attr_name         AS 'File Multi-Select List Name',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀洀猀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					ISNULL(fmsln.descr, '') AS 'Attribute Description',਀ऀऀऀऀऀ昀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀    䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
					fmsa.attr_name          AS 'File Multi-Select Attribute Name'਀ऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 昀洀猀氀 
		 INNER JOIN file_attr.file_multi_select_list_names AS fmsln਀ऀऀऀऀ 伀一    昀洀猀氀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀  
				    = fmsln.file_ms_list_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 昀洀猀愀 
				 ON   fmsl.file_ms_attr_id ਀ऀऀऀऀ    㴀 昀洀猀愀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
			  WHERE fmsl.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;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开洀猀开愀琀琀爀开戀礀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-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)          = '',਀ऀऀ䀀昀椀氀攀开洀猀开氀椀猀琀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 吀栀攀 渀愀洀攀 瘀愀氀甀攀 昀爀漀洀 琀栀攀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀⸀  
		@transaction_ready nchar(10)        = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Check if a radio button list id has been supplied਀  䤀䘀 䀀昀椀氀攀开洀猀氀椀猀琀椀搀 㴀 　  
     SET @file_mslistid = NULL;਀  䤀䘀 䀀昀椀氀攀开洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀         匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	     SET @transaction_ready      = 'Fail';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id = 'NoAttrListID', ਀ऀऀ      䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
	  END਀ 
  -- Check that the radio button list name id exists਀  䤀䘀 䀀昀椀氀攀开洀猀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
     BEGIN  ਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
                          FROM file_attr.file_multi_select_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਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  ਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀     䈀䔀䜀䤀一 
       BEGIN TRY਀ऀ        匀䔀䰀䔀䌀吀  
	               fmsa.file_ms_attr_id     AS 'File Multi-Select Attribute ID', ਀ऀ               䤀匀一唀䰀䰀⠀昀洀猀愀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
		     	   fmsa.attr_name           AS 'File Multi-Select Attribute Name', ਀ऀ               䤀匀一唀䰀䰀⠀昀洀猀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	               fmsa.list_position       AS 'List Position'਀ऀ          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 昀洀猀愀 
			 WHERE file_ms_list_id = @file_mslistid਀ऀऀ  伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀㬀 
  	         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_file_ms_attr_fg_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Lists file 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਀ऀ     匀䔀䰀䔀䌀吀 昀洀猀愀昀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
		        fmsa.attr_name         AS 'File Multi-Select Attribute Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀洀猀愀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				ISNULL(fmsa.descr, '') AS 'Attribute Description',਀ऀऀ        昀洀猀愀昀氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
                fg.attr_name           AS 'Filter Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				ISNULL(fg.descr, '')   AS 'Filter Group Description'਀ऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀洀猀愀昀氀 
		   JOIN file_attr.file_multi_select_attributes AS fmsa਀ऀऀ     伀一 昀洀猀愀昀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
			    = fmsa.file_ms_attr_id਀ऀऀ   䨀伀䤀一 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
		     ON fmsafl.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਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_ms_list_not_linkd]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Lists the multi-select list names for a file਀ⴀⴀ 眀栀椀挀栀 愀爀攀 渀漀琀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 琀漀 琀栀攀 昀椀氀攀 
-- Input is a file 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਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)     = '', -- Communicates that no file id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@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';  ਀ 
-- 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਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  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 @fileid                 AS 'File ID',਀ऀऀऀ        昀洀猀氀渀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀   䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
			        fmsln.attr_name         AS 'File Multi-Select List Name',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀洀猀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					ISNULL(fmsln.descr, '') AS 'Attribute Description',਀ऀऀऀऀऀ昀洀猀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀     䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
			   FROM file_attr.file_multi_select_list_names AS fmsln਀ऀऀऀ  圀䠀䔀刀䔀 一伀吀 䔀堀䤀匀吀匀 
					(SELECT fmsl.file_ms_list_id਀ऀऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 昀洀猀氀 
					  WHERE fmsl.file_id = @fileid਀ऀऀऀऀऀऀऀ䄀一䐀    昀洀猀氀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀  
							    = fmsln.file_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 (@nofileidmessage <> '')             SET @message = @message + ' | ' + @nofileidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_radiob_attr_by_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Lists radio button attributes by list name਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_radiob_attr_by_list] ਀ 
  @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਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@file_radiob_listname nvarchar(50)	= '', -- The name value from the file radio button list name id. ਀ऀऀ䀀爀戀氀椀猀琀渀愀洀攀椀搀椀渀瘀愀氀椀搀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 渀愀洀攀 氀椀猀琀 椀搀 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)        = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Check if a radio button list id has been supplied਀  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　  
     SET @file_radioblistid = NULL;਀  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀         匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	     SET @transaction_ready      = 'Fail';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id = 'NoAttrListID', ਀ऀऀ      䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀爀戀氀椀猀琀渀愀洀攀椀搀椀渀瘀愀氀椀搀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀爀戀氀椀猀琀渀愀洀攀椀搀椀渀瘀愀氀椀搀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀㬀 
	  END਀ 
  -- Check that the radio button list name id exists ਀  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
     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਀ऀ 䔀一䐀  
਀ 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
  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(frba.mnem, '')    AS Mnemonic, ਀ऀऀ     ऀ    昀爀戀愀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ  
	                ISNULL(frba.descr, '')   AS Description, ਀ऀ                昀爀戀愀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	           FROM file_attr.file_radio_button_attributes AS frba਀ ऀ          圀䠀䔀刀䔀 昀爀戀愀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 
		   ORDER BY 'List Position', 'File Radio Button 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 (@rblistnameidinvalid <> '')        SET @message = @message + ' | ' + @rblistnameidinvalid;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开爀戀开愀琀琀爀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀猀 昀漀爀 愀 昀椀氀攀 
-- Input is a file 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਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)      = '', -- Communicates that no file id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@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';  ਀ 
-- 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਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  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 @fileid                  AS 'File ID',਀ऀऀऀ        昀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
			        frbln.attr_name          AS 'File Radio Button List Name',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀爀戀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀一愀洀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					ISNULL(frbln.descr, '')  AS 'Name Description',਀ऀऀऀऀऀ昀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
					frba.attr_name           AS 'File Radio Button Attribute Name',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀爀戀愀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 嘀愀氀甀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					ISNULL(frba.descr, '')   AS 'Attribute Value Description'਀ऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀爀戀氀 
		 INNER JOIN file_attr.file_radio_button_list_names AS frbln਀ऀऀऀऀ 伀一 昀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 昀爀戀氀渀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		 INNER JOIN file_attr.file_radio_button_attributes AS frba਀ऀऀऀऀ 伀一 昀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀爀戀愀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
			  WHERE frbl.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';਀   ऀ  䔀一䐀 吀刀夀 
	  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_rb_attr_fg_links]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Lists file 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਀ऀ     匀䔀䰀䔀䌀吀 昀爀戀愀昀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
		        frba.attr_name             AS 'File Radio Button Attribute Name',਀ऀऀऀ    䤀匀一唀䰀䰀⠀昀爀戀愀⸀洀渀攀洀Ⰰ ✀✀⤀      䄀匀 ✀䄀琀琀爀椀戀甀琀攀 嘀愀氀甀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				ISNULL(frba.descr, '')     AS 'Attribute Value Description',਀ऀऀ        昀爀戀愀昀氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀     䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
                fg.attr_name               AS 'Filter Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				ISNULL(fg.descr, '')       AS 'Filter Group Description'਀ऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀爀戀愀昀氀 
		   JOIN file_attr.file_radio_button_attributes AS frba਀ऀऀ     伀一 昀爀戀愀昀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
			    = frba.file_radiob_attr_id਀ऀऀ   䨀伀䤀一 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
		     ON frbafl.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਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_rb_list_not_linkd]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Lists the radio button attributes for a file਀ⴀⴀ 眀栀椀挀栀 愀爀攀 渀漀琀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 琀漀 琀栀攀 昀椀氀攀⸀ 
-- Input is a file 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਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)     = '', -- Communicates that no file id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@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';  ਀ 
-- 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਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  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 @fileid                   AS 'File ID',਀ऀऀऀ        昀爀戀氀渀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
			        frbln.attr_name           AS 'File Radio Button List Name',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀爀戀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					ISNULL(frbln.descr, '')   AS 'Attribute Description',਀ऀऀऀऀऀ昀爀戀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
			   FROM file_attr.file_radio_button_list_names AS frbln਀ऀऀऀ  圀䠀䔀刀䔀 一伀吀 䔀堀䤀匀吀匀 
					(SELECT frbl.file_radiob_list_id਀ऀऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀爀戀氀 
					  WHERE frbl.file_id = @fileid਀ऀऀऀऀऀऀऀ䄀一䐀    昀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
							    = frbln.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 @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;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开爀攀愀氀开瘀愀氀甀攀猀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀猀 昀漀爀 愀 昀椀氀攀 
-- Input is a file 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਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)     = '', -- Communicates that no file id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@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';  ਀ 
-- 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਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  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਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀                 䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			        frnfn.attr_name         AS 'File Real Number Field Name',਀ऀऀऀ        䤀匀一唀䰀䰀⠀昀爀渀昀渀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ISNULL(frnfn.descr, '') AS 'Description',਀ऀऀऀऀऀ爀攀愀氀开瘀愀氀甀攀              䄀匀 ✀刀攀愀氀 一甀洀戀攀爀 嘀愀氀甀攀✀Ⰰ 
		            ISNULL(uom.unit, '')    AS 'Units',਀                    昀爀渀昀渀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 䄀匀 ✀䘀椀氀攀 刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
			   FROM file_attr.file_real_number_field_names AS frnfn਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 昀爀渀瘀 
				 ON    frnv.file_real_name_id ਀ऀऀऀऀ    㴀 昀爀渀昀渀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
		 INNER JOIN base.file_metadata AS fm਀ऀऀऀऀ 伀一     昀洀⸀昀椀氀攀开椀搀  
				    = frnv.file_id਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀 
		         ON  frnfn.unit_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;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开琀攀砀琀开瘀愀氀甀攀猀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀攀砀琀 瘀愀氀甀攀猀 昀漀爀 愀 昀椀氀攀 
-- Input is a file 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਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)      = '', -- Communicates that no file id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@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';  ਀ 
-- 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਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  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਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀                 䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			        fftfn.attr_name         AS 'Field Name',਀ऀऀऀ        䤀匀一唀䰀䰀⠀昀昀琀昀渀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䘀椀攀氀搀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					ISNULL(fftfn.descr, '') AS 'Field Description',਀ऀऀ            䤀匀一唀䰀䰀⠀琀攀砀琀开瘀愀氀甀攀Ⰰ ✀✀⤀  䄀匀 ✀吀攀砀琀✀ 
			   FROM file_attr.file_free_text_field_names AS fftfn਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 昀昀琀瘀 
				 ON    fftv.file_free_text_name_id ਀ऀऀऀऀ    㴀 昀昀琀昀渀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
		 INNER JOIN base.file_metadata AS fm਀ऀऀऀऀ 伀一     昀洀⸀昀椀氀攀开椀搀  
				    = fftv.file_id਀ऀऀऀ  圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		   ORDER BY '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;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开挀漀开洀猀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 28-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. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开挀漀开洀猀开愀琀琀爀崀  
਀ 
      @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,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		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 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.common_object_list_id = @commonobjlistid   --### 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: 02-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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开挀漀开爀戀开愀琀琀爀崀  
਀ 
      @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,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		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 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.common_object_list_id = @commonobjlistid   --### The search criteria    ਀ऀऀ      䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀       
			      =          @commonobjectid਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
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: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 椀搀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 
-- For example, select all the superseded files for a given document.  ਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 昀椀氀攀 爀攀挀漀爀搀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 椀搀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
* - @formid bigint਀⨀ ⴀ 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀⸀ 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of file records.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nvarchar(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,਀  ⴀ 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 瘀椀愀 琀栀攀 琀愀戀氀攀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
  - and which have the given radio button id਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开搀漀挀开戀礀开爀愀搀椀漀戀崀  
਀ 
      @documentid nvarchar(50)         = NULL,਀      䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ   
	  @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਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @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਀  
    -- 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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀  ⴀⴀ 䘀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 　  
			 SET @file_radiobattrid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀  
			 BEGIN  -- File radio button attribute not supplied਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoAttrID', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀  
			 BEGIN  -- Check if the radio button attribute is valid਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
								  FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀⤀  
					 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 document id. ਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
		SELECT DISTINCT ਀ऀऀऀ昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
		FROM ਀ऀऀऀ戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
		CROSS APPLY ਀ऀऀऀ椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开戀礀开搀漀挀开吀嘀䘀⠀䀀搀漀挀甀洀攀渀琀椀搀⤀ 䄀匀 琀瘀昀 
		WHERE ਀ऀऀऀ   昀洀⸀昀椀氀攀开椀搀  
			= tvf.file_id਀ऀऀऀ⤀Ⰰ 
਀    ⴀⴀ 匀攀氀攀挀琀 昀椀氀攀猀 眀椀琀栀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀Ⰰ 昀爀漀洀 琀栀攀 氀椀猀琀 漀昀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 椀搀 
	SecondFileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀氀⸀䤀䐀Ⰰ 
			ROW_NUMBER() OVER (ORDER BY fl.ID) AS row_number਀ऀ     䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀氀 
   INNER JOIN file_attr.file_radio_button_links AS frl਀           伀一    昀氀⸀䤀䐀 
		      = frl.file_id਀ऀ    圀䠀䔀刀䔀 昀爀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
		      = @file_radiobattrid਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(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 SecondFileListCTE 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);਀ 
਀䔀一䐀 
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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
   -- 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.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_function_links AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀甀渀挀琀椀漀渀开椀搀 
		               = @functionid  --### 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';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
		  -- 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_filename]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 昀椀氀攀渀愀洀攀 猀攀愀爀挀栀 甀猀椀渀最 琀栀攀 䰀䤀䬀䔀 漀瀀攀爀愀琀漀爀⸀ 
-- The search is restricted to files which the user has viewing rights to.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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.਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
      @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',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		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;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 ਀ 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 SET @likestring = REPLACE(@likestring, '\', '\\');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀─✀Ⰰ ✀尀─✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '_', '\_');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀嬀✀Ⰰ ✀尀嬀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
    	  -- String 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 ਀ 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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 '\')਀ 
-- 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਀      ⤀ 
)਀ऀ                     ⤀ 
		 ),਀ 
				 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)਀ 
	-- 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_files_by_filter_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㜀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for files by filter group.਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 昀椀氀攀 爀攀挀漀爀搀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ 䀀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 戀椀最椀渀琀Ⰰ 䀀昀漀爀洀椀搀 戀椀最椀渀琀 
* If @filter_group_id is not supplied then default_filter_group_id from base.global_settings_groups will be used਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 昀椀氀攀 爀攀挀漀爀搀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/*਀吀栀攀 氀漀最椀挀 眀漀爀欀猀 愀猀 昀漀氀氀漀眀猀⸀ 
Files are listed which:਀  ⴀ 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀Ⰰ 
  - are linked to all the attributes which have the given filter group assigned. ਀䘀漀爀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀猀Ⰰ 愀氀氀 琀栀攀 愀琀琀爀椀戀甀琀攀猀 眀椀琀栀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀攀搀 洀甀猀琀 戀攀  
linked to the file for the file to be included. ਀吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀 漀渀氀礀 愀瀀瀀氀椀攀猀 琀漀 琀栀攀 氀椀渀欀猀 琀漀 昀椀氀攀猀Ⰰ 渀漀琀 氀椀渀欀猀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀⸀  
਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开昀椀氀琀攀爀开最爀漀甀瀀崀  
਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ ⴀⴀ 伀瀀琀椀漀渀愀氀⸀  吀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀 眀椀氀氀 戀攀 甀猀攀搀 椀昀 渀漀渀攀 猀甀瀀瀀氀椀攀搀⸀ 
	  @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਀ 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
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.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_by_fnct_fld_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for according to a duty function general field name.਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_fnct_fld_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਀ 
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 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_function_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਀      ⤀ 
)਀ऀ                      
	                     )਀ 
	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: 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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
   -- 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 radio button attribute is valid਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									FROM people.function_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_function_list_links AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		               = @functionlistid  --### 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_ms_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given multi-select attribute਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_ms_list] ਀ 
	  @filemslistid 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਀  
  -- 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 @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.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_multi_select_links AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
		      AND searchtable.file_ms_attr_id = @filemsattrid਀ 
-- 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_people_list]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given people list਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_people_list] ਀ 
      @peoplelistid 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 @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 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.people_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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开爀愀搀椀漀开戀甀琀琀漀渀崀  
਀      䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	  @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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
   -- File radio button attribute validation਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 　  
			 SET @file_radiobattrid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀  
			 BEGIN  -- File radio button attribute not supplied਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoAttrID', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀  
				BEGIN  -- Check if the radio button attribute is valid਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
									FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀⤀  
						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 file_attr.file_radio_button_links AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
		               = @file_radiobattrid  --### 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_text_field]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files with a text field containing a given string. ਀ⴀⴀ 䄀瀀瀀氀椀攀猀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀  
-- 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਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开琀攀砀琀开昀椀攀氀搀崀  
਀ऀ  䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	  @likestring nvarchar(max)        = '', ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @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;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀ ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 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 ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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 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_free_text_name_id = @filetextnameid  --### 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.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: 11-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 搀愀琀愀 昀漀爀 愀 最椀瘀攀渀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 
-- Input is a transaction group id and form id.  Output is file metadata.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_trans_group] ਀ 
     @transactiongroup bigint         = NULL,਀ऀ 䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
  	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrows bigint                  = NULL OUTPUT,਀ऀ 䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @outputformid bigint             = NULL OUTPUT,਀ऀ 䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @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)਀  ⤀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0; ਀ 
਀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 䈀甀琀 愀氀氀漀眀 一唀䰀䰀猀⸀ 
  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_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਀ 
    -- 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.');਀ऀ䔀一䐀 
਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  -- Select files metadata for a given transaction group id.  ਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀  㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    IF @transactiongroup IS NULL਀ऀऀ   䈀䔀䜀䤀一 
਀ऀ  圀䤀吀䠀 昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
		  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';਀ 
਀          䔀一䐀 
਀ऀऀ    
		ELSE -- Transaction group supplied is not NULL਀ऀ      䈀䔀䜀䤀一 
	        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 = @transactiongroup਀ऀऀऀऀ  ⤀Ⰰ 
਀ऀऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
				 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਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ऀऀ  䔀一䐀 
      ਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
--=====================================================਀ 
		  -- 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 @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 record 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.');਀ऀऀऀऀ 䔀一䐀 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  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  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀猀椀搀开椀搀 
		               = @sidid  --### 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_user_fgn]    Script Date: Tue 12-05-2026 5:43:19 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_fgn] ਀ 
      @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਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @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 @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';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 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਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 眀栀椀挀栀 挀漀渀琀愀椀渀 琀栀攀 最椀瘀攀渀 琀攀砀琀 
-- using the CONTAINS function and 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_contains] ਀ 
	  @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. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @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਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀  
	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  CONTAINS(searchtable.plain_text_content, @containsstring)  --### 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_containstable]    Script Date: Tue 12-05-2026 5:43:19 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਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @maxrows INT                       = 10000, -- Limits the number of search results to avoid excessive metadata checks and protect performance਀ऀऀ                                           ⴀⴀ 甀昀渀开䌀䠀䬀开昀椀氀琀攀爀开昀椀氀攀开椀搀开匀嘀䘀⠀昀琀⸀嬀䬀䔀夀崀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 挀愀渀✀琀 戀攀 椀渀氀椀渀攀搀 眀椀琀栀 䌀伀一吀䄀䤀一匀吀䄀䈀䰀䔀 
	    @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 CONTAINSTABLE(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_created_between]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 挀爀攀愀琀攀 搀愀琀攀 椀猀 戀攀琀眀攀攀渀 最椀瘀攀渀 搀愀琀攀猀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid 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 ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@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 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਀ऀऀ  䔀䰀匀䔀 匀䔀吀 䀀氀愀琀攀爀开搀愀琀攀 㴀 一唀䰀䰀㬀 
਀  
    -- 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 = perm.file_id  ਀ऀ    圀䠀䔀刀䔀  
		    (fm.created < @later_date AND fm.created > @earlier_date)   --### The search criteria value਀ऀऀ   
	                     )਀ 
	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';਀ऀ䔀一䐀 吀刀夀 
	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: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where the date for a given date field is after 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_files_date_after] ਀ 
      @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਀ऀऀऀ䔀一䐀 
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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਀      ⤀ 
)਀ऀ                      
	                     )਀ 
	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 the date for a given date field is before 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_files_date_before] ਀ 
      @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: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where the date for a given date field is between two 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_date_between] ਀ 
      @filedatenameid 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,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @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਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	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 date.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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_for_one_document]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for files by document id and by filter group.਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 昀椀氀攀 爀攀挀漀爀搀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 䀀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 戀椀最椀渀琀Ⰰ 䀀昀漀爀洀椀搀 戀椀最椀渀琀 
* If @filter_group_id is not supplied then default_filter_group_id from base.global_settings_groups will be used਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 昀椀氀攀 爀攀挀漀爀搀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - 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,਀  ⴀ 愀爀攀 氀椀渀欀攀搀 琀漀 愀氀氀 琀栀攀 愀琀琀爀椀戀甀琀攀猀 眀栀椀挀栀 栀愀瘀攀 琀栀攀 最椀瘀攀渀 昀椀氀琀攀爀 最爀漀甀瀀 愀猀猀椀最渀攀搀⸀  
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_for_one_document] ਀ 
਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	  @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;   ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  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਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  -- 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  ਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀  
			internal.ufn_SEL_file_by_doc_fgroup_TVF(@documentid, @filtergroupid) AS tvf਀ऀऀ圀䠀䔀刀䔀  
			   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: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 眀栀椀挀栀 挀漀渀琀愀椀渀 琀栀攀 最椀瘀攀渀 琀攀砀琀 甀猀椀渀最 琀栀攀  
-- FREETEXT 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_freetext] ਀ 
	  @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. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @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਀ऀऀ ⴀⴀ匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀  
		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  FREETEXT(searchtable.plain_text_content, @containsstring)  --### 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_freetexttable]    Script Date: Tue 12-05-2026 5:43:19 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਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @maxrows INT                       = 10000, -- Limits the number of search results to avoid excessive metadata checks and protect performance਀ऀऀ                                           ⴀⴀ 甀昀渀开䌀䠀䬀开昀椀氀琀攀爀开昀椀氀攀开椀搀开匀嘀䘀⠀昀琀⸀嬀䬀䔀夀崀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 挀愀渀✀琀 戀攀 椀渀氀椀渀攀搀 眀椀琀栀 䘀刀䔀䔀吀䔀堀吀吀䄀䈀䰀䔀 
਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @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: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where an integer field is between given integer 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_int_between] ਀ 
      @fileintnameid bigint            = NULL,    ਀ऀ  䀀氀漀眀攀爀开椀渀琀开瘀愀氀甀攀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @upper_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,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @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 @fileintnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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਀ 
          -- 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'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_integer_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND (searchtable.int_value > @lower_int_value AND searchtable.int_value < @upper_int_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_int_equals]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 瘀愀氀甀攀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开椀渀琀开攀焀甀愀氀猀崀  
਀      䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @integervalue 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,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @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 @fileintnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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਀ 
          -- 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'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given attribute਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_integer_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.int_value  = @integervalue਀ 
-- 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_int_greater_than]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 愀渀 椀渀琀攀最攀爀 昀椀攀氀搀 椀猀 最爀攀愀琀攀爀 琀栀愀渀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 瘀愀氀甀攀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开椀渀琀开最爀攀愀琀攀爀开琀栀愀渀崀  
਀      䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @integervalue 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,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @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 @fileintnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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਀ 
          -- 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'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_integer_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.int_value  > @integervalue਀ 
-- 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_int_less_than]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 愀渀 椀渀琀攀最攀爀 昀椀攀氀搀 椀猀 氀攀猀猀 琀栀愀渀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 瘀愀氀甀攀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开椀渀琀开氀攀猀猀开琀栀愀渀崀  
਀      䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @integervalue 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,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @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 @fileintnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  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 integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file 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਀ 
          -- 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'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_integer_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.int_value  < @integervalue਀ 
-- 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_between]    Script Date: Tue 12-05-2026 5:43:19 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_real_value real           = 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 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. ਀ 
  -- 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_real_name_id = @filerealnameid   --### 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 real number 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_real_equals] ਀ 
      @filerealnameid 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 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. ਀ 
  -- 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_real_name_id = @filerealnameid   --### 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 of 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_files_real_greater] ਀ 
      @filerealnameid 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 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. ਀ 
  -- 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_real_name_id = @filerealnameid   --### 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 of 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_files_real_less_than] ਀ 
      @filerealnameid 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 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. ਀ 
  -- 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_real_name_id = @filerealnameid   --### 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: 22-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)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @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 @filtergroupid = 0਀     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
  IF @filtergroupid IS NULL਀     䈀䔀䜀䤀一  ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 
        SET @filtergroupid = NULL;਀ऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready      = 'Fail';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id = 'NoData', @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	       SET @nodatamessage = @tempmessage;਀        䔀䰀匀䔀  
	         SET @nodatamessage = 'A database level message error occurred on NoData.';਀ऀ 䔀一䐀   
  ELSE਀     䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
         IF NOT EXISTS (SELECT filter_group_id ਀                          䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
                         WHERE filter_group_id = @filtergroupid) ਀             䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
               EXEC internal.usp_SEL_message ਀                    䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
			        @message_text = @tempmessage OUTPUT;਀  ऀ           䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	              SET @fg_invalidmessage = @tempmessage;਀ऀ           䔀䰀匀䔀  
				    SET @fg_invalidmessage = 'A database level message error occurred on FGNotExist.';਀               匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀ         䔀一䐀  
	 END   -- End checking filter 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.filter_groups਀ऀ     圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	  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;਀ऀ䤀䘀 ⠀䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀              匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀䀀渀漀搀愀琀愀洀攀猀猀愀最攀㬀 
਀䔀一䐀 
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,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @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 ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @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;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- 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 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 general field name id਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_function_list_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;਀ 
--============================================================਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     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)਀ 
਀ऀ䔀一䐀 吀刀夀 
	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_fl_by_ppl_list_name]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for according to a people 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_ppl_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਀ 
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 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_people_list_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;਀ 
--============================================================਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @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_fl_cm_obj_ms_lnk_by_fl]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all file commonobject multi-select list by file਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀⸀  伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 挀漀洀洀漀渀 漀戀樀攀挀琀猀 氀椀渀欀攀搀 琀漀 琀栀愀琀 昀椀氀攀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)  = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@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';  ਀ 
 ਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  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: ' + LEFT(CONVERT(varchar(20), @fileid), 20) + '... ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 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.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;਀    䤀䘀 ⠀䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_fl_cm_obj_rb_lnk_by_fl]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all file commonobject radio button list by file਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀⸀  伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 挀漀洀洀漀渀 漀戀樀攀挀琀猀 氀椀渀欀攀搀 琀漀 琀栀愀琀 昀椀氀攀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)   = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@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';  ਀ 
 ਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  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: ' + LEFT(CONVERT(varchar(20), @fileid), 20) + '  ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 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',਀ऀऀऀऀ 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀ 
			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਀ऀऀऀऀ圀䠀䔀刀䔀 挀漀爀戀氀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
			ORDER BY 'Common Object List Name';਀ 
  		  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;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_fnct_lists_by_function]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 昀漀爀 愀 最椀瘀攀渀 昀甀渀挀琀椀漀渀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀⸀ 
-- Input is a function id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 昀甀渀挀琀椀漀渀 氀椀猀琀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 昀漀爀 愀 最椀瘀攀渀 昀甀渀挀琀椀漀渀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀㨀  䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 昀甀渀挀琀椀漀渀 椀搀 昀爀漀洀 琀栀攀 搀甀琀礀开昀甀渀挀琀椀漀渀猀 琀愀戀氀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of function 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:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀渀挀琀开氀椀猀琀猀开戀礀开昀甀渀挀琀椀漀渀崀  
਀     䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @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';  ਀ 
	 -- 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਀ऀ      匀䔀䰀䔀䌀吀 䀀昀甀渀挀琀椀漀渀椀搀                 䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ 
				 fl.function_list_id         AS 'Function List ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀昀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 fln.name                    AS 'Function List Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀昀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 ISNULL(fl.list_position, 0) AS 'Function List Position'਀            䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
	   LEFT JOIN people.function_list_names AS fln਀ऀ          伀一    昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀   
			     = fln.function_list_id਀ऀऀ   圀䠀䔀刀䔀 昀氀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
		ORDER BY 'Function 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 function lists which the connected user belongs to.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 爀攀挀漀爀搀 搀攀琀愀椀氀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
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਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
	          ON      df.function_id਀ऀऀऀ      㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
	   LEFT JOIN user_restr.sid_list AS SL਀ऀ          伀一  搀昀猀氀⸀猀椀搀开椀搀 
			     =  sl.sid_id਀ऀ       圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀   ऀऀऀ       
		ORDER BY 'Function List Name' ASC, 'Function 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਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_form_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Select one form group਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_form_group] ਀ऀ 
	 @formgroupid 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 form group id was invalid਀ऀऀ䀀渀漀搀愀琀愀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀愀琀愀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@transaction_ready nchar(10)       = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Check that the form group exists.  Fail if it doesn't.਀  䤀䘀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 　 
     SET @formgroupid = NULL;਀  䤀䘀 䀀昀漀爀洀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
     BEGIN  -- No form group supplied਀        匀䔀吀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		SET @data_validation_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䜀爀漀甀瀀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ऀ       匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
        ELSE ਀ऀ         匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䜀爀漀甀瀀䤀䐀⸀✀㬀 
	 END  ਀  䔀䰀匀䔀 
     BEGIN -- Check if the form group does not exist਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀  
                          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 ਀ऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 最爀漀甀瀀  
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
  	  BEGIN TRY਀ऀऀऀ匀䔀䰀䔀䌀吀  
				   form_group_id     AS 'Form Group ID',਀ऀऀऀऀ   䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				   attr_name         AS 'Form Group Name',਀ऀऀऀऀ   䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				   list_position     AS 'List Position'਀ऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 
			 WHERE form_group_id = @formgroupid਀ऀऀ  伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
			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: 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)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @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 @formnameid = 0਀     匀䔀吀 䀀昀漀爀洀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
  IF @formnameid IS NULL਀     䈀䔀䜀䤀一  ⴀⴀ 一漀 昀漀爀洀 椀搀 猀甀瀀瀀氀椀攀搀 
        SET @formnameid = NULL;਀ऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready      = 'Fail';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id = 'NoData', @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	       SET @nodatamessage = @tempmessage;਀        䔀䰀匀䔀  
	         SET @nodatamessage = 'A database level message error occurred on NoData.';਀ऀ 䔀一䐀   
  ELSE਀     䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
         IF NOT EXISTS (SELECT form_id ਀                          䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
                         WHERE form_id = @formnameid) ਀             䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
               EXEC internal.usp_SEL_message ਀                    䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
			        @message_text = @tempmessage OUTPUT;਀  ऀ           䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	              SET @form_invalidmessage = @tempmessage;਀ऀ           䔀䰀匀䔀  
				    SET @form_invalidmessage = 'A database level message error occurred on FormNotExist.';਀               匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   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 ਀ऀ           昀漀爀洀开椀搀       䄀匀 ✀䘀漀爀洀 䤀䐀✀Ⰰ 
			   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', ਀ऀ           洀渀攀洀          䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
	           descr         AS 'Description',਀ऀ           氀椀猀琀开瀀漀猀椀琀椀漀渀 䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	      FROM forms.form_identifier_names AS fin਀ऀ     圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀渀愀洀攀椀搀 
	  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 (@form_invalidmessage <> '')        SET @message = @message + ' | ' + @form_invalidmessage;਀ऀ䤀䘀 ⠀䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀              匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀䀀渀漀搀愀琀愀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_forms_by_form_group]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㄀ⴀ㈀　㈀㘀 
-- Description:	Selects all forms identifiers for a given form group਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 昀漀爀洀 渀愀洀攀猀Ⰰ 
-- plus a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_forms_by_form_group] ਀ऀ 
  @formgroupid bigint              = NULL,਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT,਀  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
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.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
    -- Check that the form group exists.  Fail if it doesn't.਀  䤀䘀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 　 
     SET @formgroupid = NULL;਀  䤀䘀 䀀昀漀爀洀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
     BEGIN  -- No form group supplied਀        匀䔀吀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		SET @data_validation_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䜀爀漀甀瀀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
        ELSE ਀ऀ         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䜀爀漀甀瀀䤀䐀⸀✀⤀㬀 
	 END  ਀  䔀䰀匀䔀 
     BEGIN -- Check if the form group does not exist਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀  
                          FROM forms.form_group_names ਀                         圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀昀漀爀洀最爀漀甀瀀椀搀⤀  
             BEGIN  -- The form group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FmGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀洀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			END਀ 
	 END   -- End checking form group ਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
		   SELECT ਀ऀऀऀऀ   昀漀爀洀开椀搀           䄀匀 ✀䘀漀爀洀 䤀䐀✀Ⰰ  
				   form_group_id     AS 'Form Group ID',਀ऀऀऀऀ   昀漀爀洀开渀愀洀攀         䄀匀 ✀䘀漀爀洀 一愀洀攀✀Ⰰ  
				   ISNULL(mnem, '')  AS 'Mnemonic', ਀ऀऀऀऀ   䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ  
				   list_position     AS 'List Position' ਀ऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
			 WHERE fin.form_group_id = @formgroupid਀ऀऀ  伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
		  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 @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀  䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀甀渀挀琀椀漀渀开氀椀猀琀猀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 吀甀攀 ㄀㈀ⴀ　㔀ⴀ㈀　㈀㘀 㔀㨀㐀㌀㨀㄀㤀 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀愀搀猀 愀氀氀 漀昀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀⸀  
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 椀搀    
-- Output is a message and status and the list of function lists.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_function_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',਀ऀऀऀ       昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
			       fln.mnem				AS 'Mnemonic',਀ऀऀऀऀ   昀氀渀⸀渀愀洀攀ऀऀऀऀ䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				   fln.description		AS 'Description',਀ऀऀऀऀ   昀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀ऀ䄀匀 ✀倀漀猀椀琀椀漀渀✀Ⰰ 
				   gfn.name             AS 'General Field Name',਀ऀऀऀऀ   最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
			  FROM people.doc_to_function_list_links AS ptfll਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
		        ON ptfll.function_list_id਀ऀऀऀऀ   㴀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		 LEFT JOIN people.general_field_names AS gfn਀ऀऀ        伀一     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
				   = ptfll.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 function lists.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_function_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਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀              䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			       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 ftfll.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_doc]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Reads all of the functions 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਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
			       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 dtfl.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_functions_by_file]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Reads all of the functions 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',਀ऀऀऀ       搀昀⸀昀甀渀挀琀椀漀渀开椀搀   䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ 
			       df.mnem			AS 'Mnemonic',਀ऀऀऀऀ   搀昀⸀渀愀洀攀ऀऀऀ䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀Ⰰ 
				   df.description	AS 'Description',਀ऀऀऀऀ   搀昀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀ऀ䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				   gfn.name                    AS 'General Field Name',਀ऀऀऀऀ   最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀   䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
			  FROM people.file_to_function_links AS ftfl਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
		        ON ftfl.function_id਀ऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		 LEFT JOIN people.general_field_names AS gfn਀ऀऀ        伀一    最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
				   = ftfl.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: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists functions for a given function list from people.function_lists.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀⸀ 
-- Output is a list of functions, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists functions for a given function list from people.function_lists.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @functionlistid bigint:  Must be a valid function list id from the functionlist_names 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_functions_by_fnct_list] ਀ 
     @functionlistid 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 @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 -- 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਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT @functionlistid             AS 'Function List ID',਀ऀऀऀऀ 搀昀⸀昀甀渀挀琀椀漀渀开椀搀              䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ  
				 ISNULL(df.mnem, '')         AS 'Function Mnemonic',਀ऀऀऀऀ 搀昀⸀渀愀洀攀                     䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀Ⰰ 
				 ISNULL(df.description, '')  AS 'Function Description',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀昀氀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ 　⤀ 䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
            FROM people.function_lists AS fl਀ऀ   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
	          ON    fl.function_id਀ऀऀऀ      㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		   WHERE fl.function_list_id = @functionlistid਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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: 25-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all general field names from people.general_field_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)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),  ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 -- No user authentication applicable.਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT਀ऀऀऀऀ 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀   䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ  
				 ISNULL(gfn.mnem, '')        AS 'Mnemonic',਀ऀऀऀऀ 最昀渀⸀渀愀洀攀                    䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
				 ISNULL(gfn.description, '') AS 'Description',਀ऀऀऀऀ 最昀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		    FROM people.general_field_names AS gfn  ਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀✀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @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: 13-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all global settings.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀ 
CREATE PROCEDURE [reading].[usp_SEL_global_settings] ਀ 
	 @message nvarchar(1000)          = '' 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 @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  WITH SettingsData AS (਀ 
	    SELECT 'Language ID'   AS Setting,਀ऀऀ       最猀最⸀氀愀渀最甀愀最攀开椀搀 䄀匀 嘀愀氀甀攀Ⰰ 
			   ''              AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ऀऀ  
	 UNION ALL ਀ 
	    SELECT 'Is Register Code Applied'   AS Setting,਀ऀऀ       最猀最⸀椀猀开爀攀最椀猀琀攀爀开挀漀搀攀开愀瀀瀀氀椀攀搀 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ 
	    SELECT 'Register Code'   AS Setting,਀ऀऀ       最猀最⸀爀攀最椀猀琀攀爀开挀漀搀攀 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ 
	    SELECT 'Auto-Gen Doc ID Length'   AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀愀甀琀漀开最攀渀开搀漀挀开椀搀开氀攀渀最琀栀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ 
	    SELECT 'Use Auto-Gen Doc ID On Null'   AS Setting,਀ऀऀ       最猀最⸀甀猀攀开愀甀琀漀开最攀渀开搀漀挀开椀搀开漀渀开渀甀氀氀 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ 
	    SELECT 'Doc ID Format'   AS Setting,਀ऀऀ       最猀最⸀搀漀挀开椀搀开昀漀爀洀愀琀 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ 
	    SELECT 'Doc ID Last Integer'   AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀搀漀挀开椀搀开氀愀猀琀开椀渀琀攀最攀爀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ 
਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀愀琀攀 匀琀礀氀攀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.date_style AS NVARCHAR) AS Value,਀ऀऀऀ   ⠀匀䔀䰀䔀䌀吀 搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀  
			      FROM base.datetime_styles਀ऀऀऀऀ 圀䠀䔀刀䔀 搀愀琀攀琀椀洀攀开猀琀礀氀攀 㴀 最猀最⸀搀愀琀攀开猀琀礀氀攀⤀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䌀甀氀琀甀爀攀 䌀漀搀攀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.culture_code AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀 
਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀漀挀 䤀䐀 䄀甀琀漀ⴀ䜀攀渀 䴀愀砀 吀爀椀攀猀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.doc_autogen_max_tries AS NVARCHAR) AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
	 ਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀攀昀愀甀氀琀 䘀椀氀琀攀爀 䜀爀漀甀瀀 䤀䐀✀ 䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.default_filter_group_id AS NVARCHAR) AS Value,਀ऀऀऀ   ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
			      FROM forms.filter_groups AS fg਀ऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
			        ON fg.filter_group_id ਀ऀऀऀऀऀ   㴀 最猀最⸀搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
				   WHERE gsg.setting_group_name = 'Master') AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ऀ  
	    SELECT 'Default Form ID' AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀搀攀昀愀甀氀琀开昀漀爀洀开椀搀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   (SELECT form_name ਀ऀऀऀ      䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
			 LEFT JOIN base.global_settings_groups AS gsg਀ऀऀऀ        伀一 昀椀渀⸀昀漀爀洀开椀搀  
					   = gsg.default_form_id਀ऀऀऀऀ   圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ऀ 
		 ਀  
਀ऀ 唀一䤀伀一 䄀䰀䰀  
	 ਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀攀昀愀甀氀琀 䐀漀挀 䘀爀攀攀 吀攀砀琀 一愀洀攀 䤀䐀✀ 䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.default_doc_free_text_name_id AS NVARCHAR) AS Value,਀ऀऀऀ   ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
			      FROM doc_attr.doc_free_text_field_names AS dftfn਀ऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
			        ON         dftfn.doc_free_text_name_id ਀ऀऀऀऀऀ   㴀 最猀最⸀搀攀昀愀甀氀琀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
				   WHERE gsg.setting_group_name = 'Master') AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ऀ  
	    SELECT 'Default Tag Relationship Tree ID' AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀搀攀昀愀甀氀琀开琀愀最开琀爀攀攀开椀搀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   (SELECT ttn.name ਀ऀऀऀ      䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀 
			 LEFT JOIN base.global_settings_groups AS gsg਀ऀऀऀ        伀一           琀琀渀⸀琀愀最开琀爀攀攀开椀搀  
					   = gsg.default_tag_tree_id਀ऀऀऀऀ   圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ऀऀ  
਀ 
	 UNION ALL ਀ऀ  
	    SELECT 'Default Tag Browsing Tree ID' AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀搀攀昀愀甀氀琀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   (SELECT tbtn.name ਀ऀऀऀ      䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀 
			 LEFT JOIN base.global_settings_groups AS gsg਀ऀऀऀ        伀一          琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
					   = gsg.default_tag_browsing_tree_id਀ऀऀऀऀ   圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ऀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀甀瀀氀椀挀愀琀攀 䴀愀渀愀最攀洀攀渀琀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.duplicate_management AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀刀攀挀攀渀琀氀礀 䌀爀攀愀琀攀搀 䐀甀爀愀琀椀漀渀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.created_last_minutes AS NVARCHAR) AS Value,਀ऀऀऀ   ✀䴀椀渀甀琀攀猀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
	 ਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䔀渀昀漀爀挀攀搀 刀攀琀攀渀琀椀漀渀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.enforced_retention AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
	 ਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 刀攀愀搀 䰀漀最✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.file_read_log AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
	 ਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䐀攀氀攀琀攀 䰀漀最✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.file_delete_log AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
	 ਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀匀琀漀爀攀 倀氀愀椀渀 吀攀砀琀 䌀漀渀琀攀渀琀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.store_plain_text_content AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
     ਀ऀ 唀一䤀伀一 䄀䰀䰀 
	 ਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀攀昀愀甀氀琀 䐀漀挀 䐀愀琀攀 䘀椀攀氀搀 䤀䐀✀ 䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.default_doc_date_name_id AS NVARCHAR) AS Value,਀ऀऀऀ   ⠀匀䔀䰀䔀䌀吀 搀搀昀渀⸀愀琀琀爀开渀愀洀攀  
			      FROM doc_attr.doc_date_field_names AS ddfn਀ऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
			        ON          ddfn.doc_date_name_id ਀ऀऀऀऀऀ   㴀 最猀最⸀搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
				   WHERE gsg.setting_group_name = 'Master') AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'	਀ऀ  
	 UNION ALL ਀ 
	    SELECT 'Booking In Time Box'   AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀戀漀漀欀椀渀最开椀渀开琀椀洀攀开戀漀砀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ  
			   'Minutes' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ 
	    SELECT 'File Deletion Disabled'    AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀渀攀瘀攀爀开搀攀氀攀琀攀开昀椀氀攀猀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ  
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
		 )਀ 
਀ 
਀ 
		 SELECT * FROM SettingsData਀ 
	        ਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_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_indiv_browsing_trees]    Script Date: Tue 12-05-2026 5:43:19 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀愀洀攀 搀攀琀愀椀氀猀 昀漀爀 瀀攀爀猀漀渀愀氀 戀爀漀眀猀椀渀最 琀爀攀攀猀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_indiv_browsing_trees] ਀ 
	 @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',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- 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';਀ 
  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 @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀Ⰰ 
					ISNULL(tbtn.mnem, '')     AS 'Tag Browsing Tree Mnemonic',਀ऀऀऀऀऀ琀戀琀渀⸀渀愀洀攀                 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 一愀洀攀✀Ⰰ 
					ISNULL(tbtn.descr, '')    AS 'Tag Browsing Tree Description',਀ऀऀऀऀऀ琀戀琀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
			   FROM tagging.tag_browsing_tree_names AS tbtn਀ऀऀऀ  圀䠀䔀刀䔀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
                       FROM user_restr.sid_list AS sl਀ऀऀऀऀऀ  圀䠀䔀刀䔀     猀氀⸀猀椀搀开椀搀 
					        = tbtn.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.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  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-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists the database nameplate details from extended properties.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀ 
CREATE PROCEDURE [reading].[usp_SEL_nameplate] ਀ 
	 @message nvarchar(1000)          = '' 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 @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  WITH NameplateData AS (਀ 
	    SELECT 'Product Name'   AS Name,਀ऀऀ       攀瀀⸀瘀愀氀甀攀 䄀匀 嘀愀氀甀攀 
		  FROM sys.extended_properties AS ep਀ऀऀ 圀䠀䔀刀䔀 攀瀀⸀渀愀洀攀 㴀 ✀倀爀漀搀甀挀琀 一愀洀攀✀ 
		 ਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀倀甀戀氀椀猀栀攀爀✀   䄀匀 一愀洀攀Ⰰ 
		       ep.value AS Value਀ऀऀ  䘀刀伀䴀 猀礀猀⸀攀砀琀攀渀搀攀搀开瀀爀漀瀀攀爀琀椀攀猀 䄀匀 攀瀀 
		 WHERE ep.name = 'Publisher'਀ 
	 UNION ALL ਀ 
	    SELECT 'Major Release #'   AS Name,਀ऀऀ       攀瀀⸀瘀愀氀甀攀 䄀匀 嘀愀氀甀攀 
		  FROM sys.extended_properties AS ep਀ऀऀ 圀䠀䔀刀䔀 攀瀀⸀渀愀洀攀 㴀 ✀䴀愀樀漀爀 刀攀氀攀愀猀攀 ⌀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䴀椀渀漀爀 刀攀氀攀愀猀攀 ⌀✀   䄀匀 一愀洀攀Ⰰ 
		       ep.value AS Value਀ऀऀ  䘀刀伀䴀 猀礀猀⸀攀砀琀攀渀搀攀搀开瀀爀漀瀀攀爀琀椀攀猀 䄀匀 攀瀀 
		 WHERE ep.name = 'Minor Release #'਀ 
	 UNION ALL ਀ 
	    SELECT 'Patch 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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: Tue 12-05-2026 5:43:19 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'9 May 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'Patch Release #', @value=N'1' ਀䜀伀 
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'This is a flag that is used by the file delete stored procedure to globally disable deletion of files.  Never deleting files helps maintain system performance as the number of files increases.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'never_delete_files'਀䜀伀 
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 ਀䜀伀 
