--3.5.32 Power
--Добавляем процедуры, которые есть в Procedures, но нет в Patches.

-- получаем ближайшего предка вверх по дереву (начиная с себя), у которого списко владельцев не пуст
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetOwnersSource]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[GetOwnersSource]
GO
create function GetOwnersSource(@ObjectID integer)
returns integer
as
begin
  declare @res integer
  while (@ObjectID is not NULL)
  begin
    set @res = @ObjectID
    set @ObjectID = NULL    
    if not exists(select 1 from PowerObjectOwners where PowerObjectID = @res)
      select @ObjectID = Код_объекта_владельца from Объект where Код_объекта = @res   
  end
  return @res
end
GO
-- получаем ближайшего предка вверх по дереву (начиная с себя), у которого списко осуществляющих деятельность не пуст
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetUsersSource]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[GetUsersSource]
GO
create function GetUsersSource(@ObjectID integer)
returns integer
as
begin
  declare @res integer
  while (@ObjectID is not NULL)
  begin
    set @res = @ObjectID
    set @ObjectID = NULL    
    if not exists(select 1 from PowerObjectUsers where PowerObjectID = @res)
      select @ObjectID = Код_объекта_владельца from Объект where Код_объекта = @res   
  end
  return @res
end
GO
---- GetObjectParentObjectID ----
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetObjectParentObjectID]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[GetObjectParentObjectID]
GO
create function GetObjectParentObjectID(@ObjectID int, @ParentObjectTypeID int)
returns int as
begin
	declare @CurParentID int
	declare @CurTypeID int
	declare @CurObjectID int
	declare @Flag int
	select  @CurTypeID = IsNull(Код_типа_объекта,0) from Объект where Код_объекта = @ObjectID
	if (@CurTypeID = 0) return NULL
	select @CurParentID = IsNull(Код_объекта_владельца,0) from Объект where Код_объекта = @ObjectID
	set @CurObjectID = @CurParentID
	select @CurTypeID = IsNull(Код_типа_объекта,0) from Объект where Код_объекта = @CurParentID
	while (@CurParentID <> 0) AND (@CurTypeID <> @ParentObjectTypeID) -- Ячейка
	begin
		set @CurObjectID = @CurParentID
		select @CurParentID = Код_объекта_владельца from Объект where Код_объекта = @CurObjectID
		select  @CurTypeID = IsNull(Код_типа_объекта,0) from Объект where Код_объекта = @CurObjectID
	end
	if (@CurTypeID = @ParentObjectTypeID) return @CurObjectID
	return NULL
end
GO
-- получаем список наименований владельцев
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetOwnersList]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[GetOwnersList]
GO
create function GetOwnersList(@ObjectID integer)
returns nvarchar(4000)
as
begin
  declare @res nvarchar(4000)
  declare @sourceid integer
  select @sourceid = dbo.GetOwnersSource(@ObjectID)
  set @res = ''
  select @res = @res +   
    case IsIndividual
      when 1 then Individuals.Name
      else Организация.Наименование
    end + ';'
  from  PowerObjectOwners
  inner join LegalEntities on LegalEntities.LegalEntityID = PowerObjectOwners.LegalEntityID
  left join Организация on Код_организации = LegalEntities.LegalEntityID
  left join Individuals on IndividualID = LegalEntities.LegalEntityID
  where PowerObjectID = @sourceid
  return @res
end
GO
-- получаем список наименований пользователей
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetUsersList]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[GetUsersList]
GO
create function GetUsersList(@ObjectID integer)
returns nvarchar(4000)
as
begin
  declare @res nvarchar(4000)
  declare @sourceid integer
  select @sourceid = dbo.GetUsersSource(@ObjectID)
  set @res = ''
  select @res = @res +   
    case IsIndividual
      when 1 then Individuals.Name
      else Организация.Наименование
    end + ';'
  from  PowerObjectUsers
  inner join LegalEntities on LegalEntities.LegalEntityID = PowerObjectUsers.LegalEntityID
  left join Организация on Код_организации = LegalEntities.LegalEntityID
  left join Individuals on IndividualID = LegalEntities.LegalEntityID
  where PowerObjectID = @sourceid
  return @res
end
GO
-- Возвращает единицу если в списке владельцев объекта есть хотя бы одно юр. или физлицо из переданного строкового списка айдишников
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[HasInOwners]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].HasInOwners
go
create function HasInOwners(@ObjectID integer, @OwnersList nvarchar(1024))
returns bit
as
begin
  declare @res bit  
  set @res = 0    
  declare @sourceid integer
  select @sourceid = dbo.GetOwnersSource(@ObjectID)
  select distinct @res = 1 from PowerObjectOwners where PowerObjectID = @sourceid and LegalEntityID in 
    (SELECT * FROM dbo.StringToIntList(@OwnersList, ','))
  return @res
end                                                			
GO
-- Возвращает единицу если в списке осуществляющих деятельность на объекте есть хотя бы одно юр. или физлицо из переданного строкового списка айдишников
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[HasInUsers]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].HasInUsers
go
create function HasInUsers(@ObjectID integer, @UsersList nvarchar(1024))
returns bit
as
begin
  declare @res bit  
  set @res = 0    
  declare @sourceid integer
  select @sourceid = dbo.GetUsersSource(@ObjectID)
  select distinct @res = 1 from PowerObjectUsers where PowerObjectID = @sourceid and LegalEntityID in 
    (SELECT * FROM dbo.StringToIntList(@UsersList, ','))
  return @res
end                                                			                                                			
