USP_DATALIST_INFORMATIONLIBRARY_KPIHIERARCHY

Parameters

Parameter Parameter Type Mode Description
@GROUPBY tinyint IN
@CURRENTAPPUSERID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_DATALIST_INFORMATIONLIBRARY_KPIHIERARCHY
(
    @GROUPBY tinyint = 0,
    @CURRENTAPPUSERID uniqueidentifier 
)
as
    set nocount on;


  declare @ISSYSADMIN bit;
  select @ISSYSADMIN = [ISSYSADMIN] from dbo.[APPUSER] where [ID] = @CURRENTAPPUSERID;

    declare @SITEPRODUCTINSTALLED bit;
  set @SITEPRODUCTINSTALLED = dbo.[UFN_INSTALLEDPRODUCTS_PRODUCTIS]('133f9bca-00f1-4007-9792-586b931340c6');

  --------


  /* folders user has permission to see */
    declare @PERMISSIONEDFOLDERS table
    (
        [FOLDERID] uniqueidentifier,
        [PARENTFOLDERID] uniqueidentifier,
        [FOLDERNAME] nvarchar(max),
        [DISPLAYORDER] int
    );

    insert into @PERMISSIONEDFOLDERS ([FOLDERID], [PARENTFOLDERID], [FOLDERNAME], [DISPLAYORDER])
        select 
          [ID],
          isnull([PARENTFOLDERID], '00000000-0000-0000-0000-000000000000'),
          [NAME],
          [DISPLAYORDER]
        from dbo.[KPIINSTANCEFOLDER]
        union all
        select '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000003', 'root', 1
        union all
        select '00000000-0000-0000-0000-000000000001', '00000000-0000-0000-0000-000000000000', '<none>', 0;

  --------


    /* KPIs user has permission to see */
  declare @KPISTOINCLUDE table
  (
      [KPIINSTANCEID] uniqueidentifier,
      [FOLDERID] uniqueidentifier,
      [KPICATALOGID] uniqueidentifier,
      [RECORDTYPEID] uniqueidentifier,
      [ISFAVORITE] bit
  );    

  with 
  [USERKPIS] as 
  (
    select distinct [KPIINSTANCEID]
    from
  (select 
    distinct [SYSTEMROLEKPIINSTANCE].[KPIINSTANCEID]
  from dbo.[SYSTEMROLEKPIINSTANCE]
  inner join dbo.[SYSTEMROLEAPPUSER] on [SYSTEMROLEKPIINSTANCE].[SYSTEMROLEID] = [SYSTEMROLEAPPUSER].[SYSTEMROLEID]
  where [SYSTEMROLEAPPUSER].[APPUSERID] = @CURRENTAPPUSERID

  union all

  select
    [KPIINSTANCE].[ID]
  from dbo.[V_SECURITY_SYSTEMROLEASSIGNMENT_USER_KPI] [SECURITYVIEW]
  inner join dbo.[KPIINSTANCE] on [SECURITYVIEW].[KPICATALOGID] = [KPIINSTANCE].[KPICATALOGID]
  where [SECURITYVIEW].[APPUSERID] = @CURRENTAPPUSERID
  group by [KPIINSTANCE].[ID]
  having  min(cast([SECURITYVIEW].[GRANTORDENY] as tinyint)) = 1) as [KPI]
  )

  insert into @KPISTOINCLUDE
  (
      [KPIINSTANCEID],
      [FOLDERID],
      [KPICATALOGID],
      [RECORDTYPEID],
      [ISFAVORITE]     
  )  
    select 
        [KPIINSTANCE].[ID] [KPIINSTANCEID],
        isnull([KPIINSTANCE].[FOLDERID], '00000000-0000-0000-0000-000000000001') [FOLDERID],
        [KPICATALOG].[ID] [KPICATALOGID],
        isnull([RECORDTYPE].[ID], '00000000-0000-0000-0000-000000000001') [RECORDTYPEID],
    case 
        when [FAVORITE].[ID] is not null then convert(bit, 1
        else convert(bit, 0)
        end as [ISFAVORITE]
    from dbo.[KPIINSTANCE]
    inner join dbo.[KPICATALOG] on [KPIINSTANCE].[KPICATALOGID] = [KPICATALOG].[ID]
    inner join @PERMISSIONEDFOLDERS [FOLDER] on isnull([KPIINSTANCE].[FOLDERID], '00000000-0000-0000-0000-000000000000') = [FOLDER].[FOLDERID]
    left join dbo.[RECORDTYPE] on [KPICATALOG].[CONTEXTRECORDTYPEID] = [RECORDTYPE].[ID]    
    left join dbo.[APPUSERKPIINSTANCEFAVORITE] [FAVORITE] on [FAVORITE].[KPIINSTANCEID] = [KPIINSTANCE].[ID] and [FAVORITE].[APPUSERID] = @CURRENTAPPUSERID
    where 
    (@ISSYSADMIN = 1
     or exists
     (select [KPIINSTANCEID]
     from [USERKPIS]
     where [USERKPIS].[KPIINSTANCEID] = [KPIINSTANCE].[ID])
     )  --Security check

        and 
        (
            [KPICATALOG].[HASSITEFILTER] = 0
            or [KPIINSTANCE].[SITEFILTERENABLEDFORINSTANCE] = 0
            or @SITEPRODUCTINSTALLED = 0
            or @ISSYSADMIN = 1
            or exists
            (
                select top 1 1
                from dbo.[SYSTEMROLEAPPUSER]
                where [SYSTEMROLEAPPUSER].[APPUSERID] = @CURRENTAPPUSERID
                -- make sure the kpi instance is permissioned for this role 

                and exists 
                (
                    select top 1 1 
                    from dbo.[SYSTEMROLEKPIINSTANCE]
                    where [SYSTEMROLEKPIINSTANCE].[SYSTEMROLEID] = [SYSTEMROLEAPPUSER].[SYSTEMROLEID]
                    and [SYSTEMROLEKPIINSTANCE].[KPIINSTANCEID] = [KPIINSTANCE].[ID]
                )
                and
                (
                    [SYSTEMROLEAPPUSER].[SECURITYMODECODE] = 0 -- all sites

                    or
                    (
                        [SYSTEMROLEAPPUSER].[SECURITYMODECODE] = 1 -- no site

                        and not exists (select top 1 1 from dbo.[KPIINSTANCESITE] where [KPIINSTANCEID] = [KPIINSTANCE].[ID])
                    ) 
                    or
                    (
                        [SYSTEMROLEAPPUSER].[SECURITYMODECODE] in (2, 3) -- records with one of these sites assigned or within a branch

                        and exists
                        (
                            select top 1 1
                            from dbo.[SITEPERMISSION]
                            inner join dbo.[KPIINSTANCESITE] on [SITEPERMISSION].[SITEID] = [KPIINSTANCESITE].[SITEID]
                            where [SITEPERMISSION].[SYSTEMROLEID] = [SYSTEMROLEAPPUSER].[SYSTEMROLEID]
                            and [SITEPERMISSION].[APPUSERID] = [SYSTEMROLEAPPUSER].[APPUSERID]
                            and [KPIINSTANCESITE].[KPIINSTANCEID] = [KPIINSTANCE].[ID]
                        )
                    )
                )       
            )
        )    

    ---------


  /* nodes to show the user */    
  declare @NODES table
  (
      [NODEID] nvarchar(255),
      [PARENTNODEID] nvarchar(255),
      [NODENAME] nvarchar(max),
      [DISPLAYORDER] int,
      [COUNT] int default 0
  );     

  --Rollup by folders

  if @GROUPBY = 0
  begin   
      insert into @NODES([NODEID], [PARENTNODEID], [NODENAME], [DISPLAYORDER], [COUNT])
        select  
          f.[FOLDERID],
          f.[PARENTFOLDERID],
          f.[FOLDERNAME],
          f.[DISPLAYORDER],
          count(distinct k.[KPIINSTANCEID])
        from @PERMISSIONEDFOLDERS f
        left join @KPISTOINCLUDE k on k.[FOLDERID] = f.[FOLDERID]
        group by 
          f.[FOLDERID],
          f.[PARENTFOLDERID],
          f.[FOLDERNAME],
          f.[DISPLAYORDER];
  end
  --Rollup by type

  else if @GROUPBY = 1
  begin    
    declare @TYPES table
    (
      [PATH] nvarchar(255),
      [FOLDERNAME] nvarchar(255),
      [PARENTPATH] nvarchar(255),
      [DISPLAYORDER] [int]
    );

    --Parse out UI folders into a folder hierarchy

    with [UIFOLDERS] as
    (
      select distinct
        case [UIFOLDER]
          when '' then 'Other\' + kc.[NAME]
          else [UIFOLDER] + '\' + kc.[NAME]
        end [UIFOLDER],
        case [UIFOLDER]
          when '' then len('Other\' + kc.[NAME]) + 1
          else len([UIFOLDER] + '\' + kc.[NAME]) + 1
        end [LEN]
      from dbo.[KPICATALOG] kc
      inner join @KPISTOINCLUDE ki on kc.[ID] = ki.[KPICATALOGID]
    ), [HIERARCHY] as
    (
      select
                f.[UIFOLDER],
        cast(substring(f.[UIFOLDER], 1, coalesce(nullif(charindex('\', f.[UIFOLDER], 1), 0), f.[LEN]) - 1) as nvarchar(255)) [PATH],
        f.[LEN],
        cast(1 as int) [START],    
        coalesce(nullif(charindex('\', f.[UIFOLDER], 1),0), f.[LEN]) [END],
        cast('00000000-0000-0000-0000-000000000000' as nvarchar(255)) [PARENT],
        substring(f.[UIFOLDER], 1, coalesce(nullif(charindex('\', f.[UIFOLDER], 1), 0), f.[LEN]) - 1) [FOLDER]    
      from [UIFOLDERS] f
      union all
      select
                h.[UIFOLDER],
        cast(h.[PATH] + '\' + substring(h.[UIFOLDER], h.[END] + 1, coalesce(nullif(charindex('\', h.[UIFOLDER], h.[END] + 1), 0), h.[LEN]) - h.[END] - 1) as nvarchar(255)) [PATH],
        h.[LEN],
        h.[END] + 1 [START],
        coalesce(nullif(charindex('\', h.[UIFOLDER], h.[END] + 1), 0), h.[LEN]) [END],
        h.[PATH] [PARENT],
        substring(h.[UIFOLDER], h.[END] + 1, coalesce(nullif(charindex('\', h.[UIFOLDER], h.[END] + 1), 0), h.[LEN]) - h.[END] - 1) [FOLDER]  
      from [HIERARCHY] h
      where h.[END] < h.[LEN]
    ), [DISTINCT] as
    (
      select distinct
        [PATH], 
        [FOLDER], 
        [PARENT]
      from [HIERARCHY]
    )
    insert into @TYPES ([PATH], [FOLDERNAME], [PARENTPATH], [DISPLAYORDER])        
            select
                [PATH], 
                [FOLDER], 
                [PARENT],
                row_number() over(order by [PATH])
            from [DISTINCT]
            union all
            select '00000000-0000-0000-0000-000000000000', 'root', '00000000-0000-0000-0000-000000000003', 1;            

      insert into @NODES([NODEID], [PARENTNODEID], [NODENAME], [DISPLAYORDER], [COUNT])
          select  
            t.[PATH],
            t.[PARENTPATH],
            t.[FOLDERNAME],
            t.[DISPLAYORDER],
            count(distinct k.[KPIINSTANCEID])
          from @TYPES t
          left join dbo.[KPICATALOG] c on coalesce(nullif(c.[UIFOLDER], ''), 'Other') + '\' + c.[NAME] = t.[PATH]
          left join @KPISTOINCLUDE k on k.[KPICATALOGID] = c.[ID]
          group by  
            t.[PATH],
            t.[PARENTPATH],
            t.[FOLDERNAME],
            t.[DISPLAYORDER]; 
  end
  --Rollup by categories

  else if @GROUPBY = 2
  begin
      declare @CATEGORIES table
      (
          [ID] uniqueidentifier,
          [PARENTID] uniqueidentifier,
          [DESCRIPTION] nvarchar(max),
          [DISPLAYORDER] int
      );

        insert into @CATEGORIES ([ID], [PARENTID], [DESCRIPTION], [DISPLAYORDER])
            select 
                r.[ID],
                '00000000-0000-0000-0000-000000000000' [PARENTID],
                r.[NAME],
                row_number() over(order by r.[NAME])
            from dbo.[RECORDTYPE] r
          inner join (
            select distinct [RECORDTYPEID]
            from @KPISTOINCLUDE
          ) k on r.[ID] = k.[RECORDTYPEID]
            union all
            select '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000003', 'root', 1
            union all
            select '00000000-0000-0000-0000-000000000001', '00000000-0000-0000-0000-000000000000', '<none>', 0;

      insert into @NODES([NODEID], [PARENTNODEID], [NODENAME], [DISPLAYORDER], [COUNT])
          select  
            c.[ID],
            c.[PARENTID],
            c.[DESCRIPTION],
            c.[DISPLAYORDER],
            count(distinct k.[KPIINSTANCEID])
          from @CATEGORIES c
          left join @KPISTOINCLUDE k on k.[RECORDTYPEID] = c.[ID]
          group by  
            c.[ID],
            c.[PARENTID],
            c.[DESCRIPTION],
            c.[DISPLAYORDER]; 
  end

    /* Favorites */
    insert into @NODES([NODEID], [PARENTNODEID], [NODENAME], [DISPLAYORDER], [COUNT])
    select
      '00000000-0000-0000-0000-000000000002',
      '00000000-0000-0000-0000-000000000003',
      'Favorite',
      0,
      count(distinct k.[KPIINSTANCEID])
    from @KPISTOINCLUDE k
    where k.[ISFAVORITE] = 1;

    ---------

    /* rollup node counts */
    with [ROLLUP] as
    (  
      select 
        f.[NODEID] [PARENTNODEID],
        f.[NODEID],
        f.[COUNT]
      from @NODES f

      union all 

      select 
        r.[PARENTNODEID],
        f.[NODEID],
        f.[COUNT]
      from @NODES f
      inner join [ROLLUP] r on f.[PARENTNODEID] = r.[NODEID]
    )  
    select
      f.[NODEID],
      f.[PARENTNODEID],
      f.[NODENAME],
      f.[DISPLAYORDER],
      sum(r.[COUNT]) [COUNT]
    from [ROLLUP] r
    inner join @NODES f on r.[PARENTNODEID] = f.[NODEID]
    group by 
      f.[NODEID],
      f.[PARENTNODEID],
      f.[NODENAME],
      f.[DISPLAYORDER];