USP_MERGETASK_STEWARDSHIPPLANS
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SOURCEID | uniqueidentifier | IN | |
@TARGETID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@DUPLICATESTEWARDSHIPPLANRESOLUTION | tinyint | IN |
Definition
Copy
CREATE procedure dbo.USP_MERGETASK_STEWARDSHIPPLANS
(
@SOURCEID uniqueidentifier,
@TARGETID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier,
@DUPLICATESTEWARDSHIPPLANRESOLUTION tinyint = 0
)
as
set nocount on;
declare @CURRENTDATE datetime = getdate();
--Transfer all plans from the source to the target that do not already exist on the target
if @DUPLICATESTEWARDSHIPPLANRESOLUTION = 0 -- Merge identical plans
begin
-- If the source and target each have plans with both the same name and type,
-- then a suffix will be added to the name to prevent the unique constraint
-- violation.
declare @NEWPLANNAME table
(
ID uniqueidentifier,
NEWNAME nvarchar(100)
);
if exists
(
select SOURCESSTEWARDSHIPPLAN.ID
from dbo.STEWARDSHIPPLAN SOURCESSTEWARDSHIPPLAN
cross apply dbo.STEWARDSHIPPLAN TARGETSSTEWARDSHIPPLAN
where
SOURCESSTEWARDSHIPPLAN.CONSTITUENTID = @SOURCEID
and TARGETSSTEWARDSHIPPLAN.CONSTITUENTID = @TARGETID
and SOURCESSTEWARDSHIPPLAN.NAME = TARGETSSTEWARDSHIPPLAN.NAME
)
begin
-- Pull back duplicate plans
declare DUPLICATEPLANCURSOR cursor local fast_forward for
select
SOURCESSTEWARDSHIPPLAN.ID,
SOURCESSTEWARDSHIPPLAN.NAME
from dbo.STEWARDSHIPPLAN SOURCESSTEWARDSHIPPLAN
cross apply dbo.STEWARDSHIPPLAN TARGETSSTEWARDSHIPPLAN
where
SOURCESSTEWARDSHIPPLAN.CONSTITUENTID = @SOURCEID
and TARGETSSTEWARDSHIPPLAN.CONSTITUENTID = @TARGETID
and SOURCESSTEWARDSHIPPLAN.NAME = TARGETSSTEWARDSHIPPLAN.NAME
declare
@DUPLICATEPLANID uniqueidentifier,
@DUPLICATEPLANNAME nvarchar(100);
open DUPLICATEPLANCURSOR;
fetch next from DUPLICATEPLANCURSOR into @DUPLICATEPLANID, @DUPLICATEPLANNAME;
while @@FETCH_STATUS = 0
begin
declare @SUFFIXCOUNTER int = 0, @PLANNAMEVALID bit = 0;
-- Build a name unique to the constituent/plan. Using a do-while loop to avoid duplicating the name building code.
while 1 = 1
begin
set @SUFFIXCOUNTER = @SUFFIXCOUNTER + 1;
declare @SUFFIX nvarchar(15), @NEWNAME nvarchar(100);
set @SUFFIX = ' (' + cast(@SUFFIXCOUNTER as nvarchar(10)) + ')';
set @NEWNAME = substring(@DUPLICATEPLANNAME, 1, 100 - len(@SUFFIX)) + @SUFFIX;
if not exists ( select 1
from dbo.STEWARDSHIPPLAN
where
CONSTITUENTID = @TARGETID and
NAME = @NEWNAME
union all
-- Check source plans to make sure we don't choose a new name that is already in use on the source
select 1
from dbo.STEWARDSHIPPLAN
where
CONSTITUENTID = @SOURCEID and
NAME = @NEWNAME)
begin
set @PLANNAMEVALID = 1;
break;
end
end
insert into @NEWPLANNAME (ID, NEWNAME)
values (@DUPLICATEPLANID, @NEWNAME);
fetch next from DUPLICATEPLANCURSOR into @DUPLICATEPLANID, @DUPLICATEPLANNAME;
end
close DUPLICATEPLANCURSOR
deallocate DUPLICATEPLANCURSOR
end
update dbo.STEWARDSHIPPLAN
set
NAME = case
when NEWPLANNAME.ID is null then STEWARDSHIPPLAN.NAME
else NEWPLANNAME.NEWNAME
end,
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from dbo.STEWARDSHIPPLAN
left join @NEWPLANNAME NEWPLANNAME on STEWARDSHIPPLAN.ID = NEWPLANNAME.ID
where CONSTITUENTID = @SOURCEID;
end
else if @DUPLICATESTEWARDSHIPPLANRESOLUTION = 1 -- Do not merge identical stewardship plans
begin
update dbo.STEWARDSHIPPLAN
set CONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATE
where
CONSTITUENTID = @SOURCEID and
not exists
(
select 1
from dbo.STEWARDSHIPPLAN SUBSTEWARDSHIPPLAN
where
SUBSTEWARDSHIPPLAN.CONSTITUENTID = @TARGETID and
SUBSTEWARDSHIPPLAN.NAME = STEWARDSHIPPLAN.NAME
);
end
else -- Do not merge constituents
begin
if exists
(
select top(1) a.ID
from dbo.STEWARDSHIPPLAN a
cross apply dbo.STEWARDSHIPPLAN b
where a.CONSTITUENTID = @SOURCEID
and b.CONSTITUENTID = @TARGETID
and a.NAME = b.NAME
)
RAISERROR('These constituents were not merged because they both have stewardship plans with the same name. Please resolve this conflict and then run the merge again.', 16, 1);
else
update dbo.STEWARDSHIPPLAN
set CONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATE
where
CONSTITUENTID = @SOURCEID
end
--Transfer plan manager to target
update
dbo.STEWARDSHIPPLAN
set
MANAGERID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
MANAGERID = @SOURCEID;
--Transfer plan stewards to target
update
SOURCESTEWARD
set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from
dbo.STEWARDSHIPPLANSTEWARD SOURCESTEWARD
where
CONSTITUENTID = @SOURCEID and
not exists (select TARGETSTEWARD.ID from dbo.STEWARDSHIPPLANSTEWARD TARGETSTEWARD where TARGETSTEWARD.CONSTITUENTID = @TARGETID and TARGETSTEWARD.PLANID = SOURCESTEWARD.PLANID);
--Transfer documentation authors to target
update
dbo.STEWARDSHIPATTACHMENT
set
AUTHORID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
AUTHORID = @SOURCEID;
update
dbo.STEWARDSHIPMEDIALINK
set
AUTHORID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
AUTHORID = @SOURCEID;
update
dbo.STEWARDSHIPNOTE
set
AUTHORID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
AUTHORID = @SOURCEID;
--Transfer step assigned constituent and contact person
update
dbo.STEWARDSHIPPLANSTEP
set
CONTACTPERSONID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
CONTACTPERSONID = @SOURCEID;
update
dbo.STEWARDSHIPPLANSTEP
set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
CONSTITUENTID = @SOURCEID;
return 0;