USP_DATAFORMTEMPLATE_EDIT_MOVEDESIGNATION

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@PARENTDESIGNATIONID uniqueidentifier IN
@PURPOSELOCATION tinyint IN

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_MOVEDESIGNATION (
  @ID uniqueidentifier
  ,@CHANGEAGENTID uniqueidentifier = null
  ,@PARENTDESIGNATIONID uniqueidentifier
  ,@PURPOSELOCATION tinyint
  )
as
set nocount on;

declare @CURRENTDATE datetime;

set @CURRENTDATE = getdate();

begin try
  if @CHANGEAGENTID is null
    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

  declare @EMPTY uniqueidentifier = '00000000-0000-0000-0000-000000000000';
  declare @ORIGPARENTDESIGNATIONID uniqueidentifier;
  declare @ORIGDESIGNATIONLEVELID uniqueidentifier;
  declare @CHILDLEVELS int;
  declare @OLDLEVEL int;
  declare @NEWLEVEL int;
  declare @OLDPATH nvarchar(200);
  declare @NEWPATH nvarchar(200);
  declare @OLDLEVEL1ID uniqueidentifier;
  declare @OLDLEVEL2ID uniqueidentifier;
  declare @OLDLEVEL3ID uniqueidentifier;
  declare @OLDLEVEL4ID uniqueidentifier;
  declare @OLDLEVEL5ID uniqueidentifier;
  declare @OLDSITEID uniqueidentifier;
  declare @NEWSITEID uniqueidentifier;

  select @ORIGPARENTDESIGNATIONID = P.ID
    ,@ORIGDESIGNATIONLEVELID = C.DESIGNATIONLEVELID
    ,@OLDLEVEL = C.[LEVEL]
    ,@OLDPATH = C.PATHID
    ,@OLDLEVEL1ID = C.DESIGNATIONLEVEL1ID
    ,@OLDLEVEL2ID = C.DESIGNATIONLEVEL2ID
    ,@OLDLEVEL3ID = C.DESIGNATIONLEVEL3ID
    ,@OLDLEVEL4ID = C.DESIGNATIONLEVEL4ID
    ,@OLDLEVEL5ID = C.DESIGNATIONLEVEL5ID
    ,@OLDSITEID = C.DESIGNATIONLEVELSITEID
  from dbo.UFN_DESIGNATION_BUILDNAME_BULK() C
  left join dbo.UFN_DESIGNATION_BUILDNAME_BULK() P on C.PARENTPATHID = P.PATHID
  where C.ID = @ID

  if COALESCE(@ORIGPARENTDESIGNATIONID, @EMPTY) = COALESCE(@PARENTDESIGNATIONID, @EMPTY)
    return 0;

  select @CHILDLEVELS = COALESCE(MAX([LEVEL]), @OLDLEVEL) - @OLDLEVEL
  from dbo.UFN_DESIGNATION_BUILDNAME_BULK()
  where PATHID like @OLDPATH + '%'

  select @NEWLEVEL = COALESCE(level, 0) + 1
    ,@NEWPATH = PATHID
  from dbo.UFN_DESIGNATION_BUILDNAME_BULK()
  where ID = @PARENTDESIGNATIONID

  set @NEWLEVEL = COALESCE(@NEWLEVEL, 1);

  if CHARINDEX(@OLDPATH, @NEWPATH) = 1
    raiserror (
        'ERR_CANNOTMAKECHILDOFITSELF'
        ,13
        ,1
        );

  if (@NEWLEVEL + @CHILDLEVELS) > 5
    raiserror (
        'ERR_MAXIMUMNUMLEVELSEXCEDED'
        ,13
        ,1
        );

  if (COALESCE(@ORIGPARENTDESIGNATIONID, @EMPTY) <> COALESCE(@PARENTDESIGNATIONID, @EMPTY))
  begin
    declare @NEWLEVEL1ID uniqueidentifier;
    declare @NEWLEVEL2ID uniqueidentifier;
    declare @NEWLEVEL3ID uniqueidentifier;
    declare @NEWLEVEL4ID uniqueidentifier;
    declare @NEWLEVEL5ID uniqueidentifier;

    if @NEWLEVEL = 1
    begin
      set @NEWLEVEL1ID = @ORIGDESIGNATIONLEVELID

      select @NEWSITEID = SITEID
      from dbo.DESIGNATIONLEVEL
      where ID = @ORIGDESIGNATIONLEVELID
    end
    else
      select @NEWLEVEL1ID = D.DESIGNATIONLEVEL1ID
        ,@NEWLEVEL2ID = D.DESIGNATIONLEVEL2ID
        ,@NEWLEVEL3ID = D.DESIGNATIONLEVEL3ID
        ,@NEWLEVEL4ID = D.DESIGNATIONLEVEL4ID
        ,@NEWLEVEL5ID = D.DESIGNATIONLEVEL5ID
        ,@NEWSITEID = coalesce(DL5.SITEID, DL4.SITEID, DL3.SITEID, DL2.SITEID, DL1.SITEID)
      from dbo.DESIGNATION D
      left join dbo.DESIGNATIONLEVEL DL1 on D.DESIGNATIONLEVEL1ID = DL1.ID
      left join dbo.DESIGNATIONLEVEL DL2 on D.DESIGNATIONLEVEL2ID = DL2.ID
      left join dbo.DESIGNATIONLEVEL DL3 on D.DESIGNATIONLEVEL3ID = DL3.ID
      left join dbo.DESIGNATIONLEVEL DL4 on D.DESIGNATIONLEVEL4ID = DL4.ID
      left join dbo.DESIGNATIONLEVEL DL5 on D.DESIGNATIONLEVEL5ID = DL5.ID
      where D.ID = @PARENTDESIGNATIONID

    if (
        @NEWSITEID is null
        and @OLDSITEID is not null
        )
      or (
        @NEWSITEID is not null
        and @OLDSITEID is null
        )
      or (
        @NEWSITEID is not null
        and @NEWSITEID <> @OLDSITEID
        )
      raiserror (
          'ERR_CANNOTCHANGESITE'
          ,13
          ,1
          );

    declare @SQLCRITERIA nvarchar(1000) = ' where ';
    declare @SQL nvarchar(1000) = 'update dbo.DESIGNATION set ';
    declare @i int = 1;
    declare @LEVELFIELD nvarchar(50);
    declare @LEVELFIELDVALUE nvarchar(50);
    declare @ii int = @OLDLEVEL;

    while @i <= @OLDLEVEL
    begin
      if @i > 1
        set @SQLCRITERIA = @SQLCRITERIA + ' and ';
      set @LEVELFIELD = 'DESIGNATIONLEVEL' + cast(@i as nvarchar(1)) + 'ID';
      set @LEVELFIELDVALUE = '@OLDLEVEL' + cast(@i as nvarchar(1)) + 'ID';
      set @SQLCRITERIA = @SQLCRITERIA + @LEVELFIELD + '=' + @LEVELFIELDVALUE;
      set @i = @i + 1;
    end

    set @i = 1;

    if @OLDLEVEL < @NEWLEVEL
    begin
      --now move the old level values into their new position
      set @i = @NEWLEVEL;

      while @i <= 5
      begin
        if @i > @NEWLEVEL
          set @SQL = @SQL + ',';
        set @LEVELFIELD = 'DESIGNATIONLEVEL' + cast(@i as nvarchar(1)) + 'ID';

        if @ii > 5
          set @LEVELFIELDVALUE = 'null'
        else
          set @LEVELFIELDVALUE = 'DESIGNATIONLEVEL' + cast(@ii as nvarchar(1)) + 'ID';

        set @SQL = @SQL + @LEVELFIELD + '=' + @LEVELFIELDVALUE;
        set @i = @i + 1;
        set @ii = @ii + 1;
      end

      set @i = 1;

      --set the new parent level fields
      while @i < @NEWLEVEL
      begin
        set @SQL = @SQL + ',';
        set @LEVELFIELD = 'DESIGNATIONLEVEL' + cast(@i as nvarchar(1)) + 'ID';
        set @LEVELFIELDVALUE = '@NEWLEVEL' + cast(@i as nvarchar(1)) + 'ID';
        set @SQL = @SQL + @LEVELFIELD + '=' + @LEVELFIELDVALUE;
        set @i = @i + 1;
      end
    end
    else
    begin
      --set the new parent level fields
      while @i < @NEWLEVEL
      begin
        if @i > 1
          set @SQL = @SQL + ',';
        set @LEVELFIELD = 'DESIGNATIONLEVEL' + cast(@i as nvarchar(1)) + 'ID';
        set @LEVELFIELDVALUE = '@NEWLEVEL' + cast(@i as nvarchar(1)) + 'ID';
        set @SQL = @SQL + @LEVELFIELD + '=' + @LEVELFIELDVALUE;
        set @i = @i + 1;
      end

      --now move the old level values into their new position
      while @i <= 5
      begin
        if @i > 1
          set @SQL = @SQL + ',';
        set @LEVELFIELD = 'DESIGNATIONLEVEL' + cast(@i as nvarchar(1)) + 'ID';

        if @ii > 5
          set @LEVELFIELDVALUE = 'null'
        else
          set @LEVELFIELDVALUE = 'DESIGNATIONLEVEL' + cast(@ii as nvarchar(1)) + 'ID';

        set @SQL = @SQL + @LEVELFIELD + '=' + @LEVELFIELDVALUE;
        set @i = @i + 1;
        set @ii = @ii + 1;
      end
    end

    set @SQL = @SQL + @SQLCRITERIA;

    exec sp_executesql @SQL
      ,N'@NEWLEVEL1ID uniqueidentifier, @NEWLEVEL2ID uniqueidentifier, @NEWLEVEL3ID uniqueidentifier, @NEWLEVEL4ID uniqueidentifier, @NEWLEVEL5ID uniqueidentifier, @OLDLEVEL1ID uniqueidentifier, @OLDLEVEL2ID uniqueidentifier, @OLDLEVEL3ID uniqueidentifier, @OLDLEVEL4ID uniqueidentifier, @OLDLEVEL5ID uniqueidentifier'
      ,@NEWLEVEL1ID
      ,@NEWLEVEL2ID
      ,@NEWLEVEL3ID
      ,@NEWLEVEL4ID
      ,@NEWLEVEL5ID
      ,@OLDLEVEL1ID
      ,@OLDLEVEL2ID
      ,@OLDLEVEL3ID
      ,@OLDLEVEL4ID
      ,@OLDLEVEL5ID;
  end
end try

begin catch
  exec dbo.USP_RAISE_ERROR;

  return 1;
end catch

return 0;