USP_MERGE_GROUPMEMBERS
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SOURCEID | uniqueidentifier | IN | |
@TARGETID | uniqueidentifier | IN | |
@CONTACTCRITERIA | bit | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@DATECHANGED | datetime | IN |
Definition
Copy
CREATE procedure dbo.USP_MERGE_GROUPMEMBERS
(
@SOURCEID uniqueidentifier,
@TARGETID uniqueidentifier,
@CONTACTCRITERIA bit,
@CHANGEAGENTID uniqueidentifier,
@DATECHANGED datetime
)
as
begin
set nocount on;
/* BEGIN ERROR HANDLING */
declare @SOURCEGROUPTYPE uniqueidentifier;
declare @TARGETGROUPTYPE uniqueidentifier;
select @SOURCEGROUPTYPE = GROUPTYPEID from dbo.GROUPDATA where ID = @SOURCEID;
select @TARGETGROUPTYPE = GROUPTYPEID from dbo.GROUPDATA where ID = @TARGETID;
-- GROUPTYPEID is null when the group is a household
if (@SOURCEGROUPTYPE is null and @TARGETGROUPTYPE is not null)
or (@SOURCEGROUPTYPE is not null and @TARGETGROUPTYPE is null)
begin
raiserror('These constituent groups were not merged because one is a household and the other is not a household.', 16, 1);
end
if (@SOURCEGROUPTYPE <> @TARGETGROUPTYPE)
begin
raiserror('These constituent groups were not merged because they have different group types.', 16, 1);
end
/* END ERROR HANDLING */
--Retrieve and save the primary contacts for both the source and target groups before merging
declare @TARGETPRIMARYCONTACTID uniqueidentifier;
declare @SOURCEPRIMARYCONTACTID uniqueidentifier;
select
@TARGETPRIMARYCONTACTID = MEMBERID
from
dbo.GROUPMEMBER
where
GROUPID = @TARGETID
and ISPRIMARY = 1
and dbo.UFN_GROUPMEMBER_ISCURRENTMEMBER(ID) = 1;
select
@SOURCEPRIMARYCONTACTID = MEMBERID
from
dbo.GROUPMEMBER
where
GROUPID = @SOURCEID
and ISPRIMARY = 1
and dbo.UFN_GROUPMEMBER_ISCURRENTMEMBER(ID) = 1;
--Determine who will be the primary contact after the merge, 0=target, 1=source
declare @PRIMARYMEMBER uniqueidentifier;
if @CONTACTCRITERIA = 0
begin
set @PRIMARYMEMBER = coalesce(@TARGETPRIMARYCONTACTID, @SOURCEPRIMARYCONTACTID);
end
else if @CONTACTCRITERIA = 1
begin
set @PRIMARYMEMBER = coalesce(@SOURCEPRIMARYCONTACTID, @TARGETPRIMARYCONTACTID);
end
declare @STARTDATE datetime = dbo.UFN_DATE_GETEARLIESTTIME(getdate());
--Add all members of the source group to the target group, unless the already exist in the target group
update
SOURCEGROUPMEMBER
set
SOURCEGROUPMEMBER.ISPRIMARY = 0, -- Set primary to false to avoid primary count check constraint. ISPRIMARY will be updated later.
SOURCEGROUPMEMBER.GROUPID = @TARGETID,
SOURCEGROUPMEMBER.CHANGEDBYID = @CHANGEAGENTID,
SOURCEGROUPMEMBER.DATECHANGED = @DATECHANGED
from
dbo.GROUPMEMBER as SOURCEGROUPMEMBER
left outer join dbo.GROUPMEMBER as TARGETGROUPMEMBER on (TARGETGROUPMEMBER.GROUPID = @TARGETID and SOURCEGROUPMEMBER.MEMBERID = TARGETGROUPMEMBER.MEMBERID)
where
SOURCEGROUPMEMBER.GROUPID = @SOURCEID
and TARGETGROUPMEMBER.ID is null
and SOURCEGROUPMEMBER.MEMBERID <> @TARGETID;
--Update the DATEFROM and DATETO fields for any members that were merged into the target
declare @GROUPSTART datetime;
select @GROUPSTART = STARTDATE from dbo.GROUPDATA where GROUPDATA.ID = @TARGETID;
update
TARGETGROUPMEMBERDATERANGE
set
-- Do not keep a start date if one does not have a start date, otherwise keep oldest start date. This date will be fixed in the next update statement if it precedes the group's inception date.
TARGETGROUPMEMBERDATERANGE.DATEFROM = case when (TARGETGROUPMEMBERDATERANGE.DATEFROM is null or SOURCEGROUPMEMBERDATERANGE.DATEFROM is null) then null
when (TARGETGROUPMEMBERDATERANGE.DATEFROM < SOURCEGROUPMEMBERDATERANGE.DATEFROM) then TARGETGROUPMEMBERDATERANGE.DATEFROM
else SOURCEGROUPMEMBERDATERANGE.DATEFROM
end,
-- Do not keep an end date if one does not have an end date, otherwise most recent end date.
TARGETGROUPMEMBERDATERANGE.DATETO = case when (TARGETGROUPMEMBERDATERANGE.DATETO is null or SOURCEGROUPMEMBERDATERANGE.DATETO is null) then null
when (TARGETGROUPMEMBERDATERANGE.DATETO < SOURCEGROUPMEMBERDATERANGE.DATETO) then SOURCEGROUPMEMBERDATERANGE.DATETO
else TARGETGROUPMEMBERDATERANGE.DATETO
end,
TARGETGROUPMEMBERDATERANGE.COMMENTS = case when (nullif(TARGETGROUPMEMBERDATERANGE.COMMENTS, '') is null) then SOURCEGROUPMEMBERDATERANGE.COMMENTS
else TARGETGROUPMEMBERDATERANGE.COMMENTS
end,
TARGETGROUPMEMBERDATERANGE.CHANGEDBYID = @CHANGEAGENTID,
TARGETGROUPMEMBERDATERANGE.DATECHANGED = @DATECHANGED
from
dbo.GROUPMEMBERDATERANGE as TARGETGROUPMEMBERDATERANGE
inner join dbo.GROUPMEMBER as TARGETGROUPMEMBER on TARGETGROUPMEMBERDATERANGE.GROUPMEMBERID = TARGETGROUPMEMBER.ID
inner join dbo.GROUPMEMBER as SOURCEGROUPMEMBER on SOURCEGROUPMEMBER.MEMBERID = TARGETGROUPMEMBER.MEMBERID
inner join dbo.GROUPMEMBERDATERANGE as SOURCEGROUPMEMBERDATERANGE on SOURCEGROUPMEMBERDATERANGE.GROUPMEMBERID = SOURCEGROUPMEMBER.ID
where
TARGETGROUPMEMBER.GROUPID = @TARGETID
and SOURCEGROUPMEMBER.GROUPID = @SOURCEID;
update
dbo.GROUPMEMBERDATERANGE
set
-- Set start date to group's start date if it was before group was formed
GROUPMEMBERDATERANGE.DATEFROM = case when DATEFROM < @GROUPSTART then @GROUPSTART else DATEFROM end,
-- Set end date to group's start date if it was before group was formed
GROUPMEMBERDATERANGE.DATETO = case when DATETO < @GROUPSTART then @GROUPSTART else DATETO end,
GROUPMEMBERDATERANGE.CHANGEDBYID = @CHANGEAGENTID,
GROUPMEMBERDATERANGE.DATECHANGED = @DATECHANGED
from
dbo.GROUPMEMBER
where
GROUPMEMBER.ID = GROUPMEMBERDATERANGE.GROUPMEMBERID
and GROUPMEMBER.GROUPID = @TARGETID;
--Update any group member role dates that may have conflicting dates with the group.
--Households have no roles but this shouldn't matter since there will be no entries in the table.
exec dbo.USP_GROUPMEMBERROLE_UPDATEDATESFORGROUP @TARGETID, @CHANGEAGENTID;
update
dbo.GROUPMEMBER
set
ISPRIMARY = 0,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where
GROUPID = @TARGETID
and ISPRIMARY = 1;
--Set primary contact
update
dbo.GROUPMEMBER
set
ISPRIMARY = 1,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where
GROUPID = @TARGETID
and MEMBERID = @PRIMARYMEMBER;
--Get rid of any members of the source group that could not be merged into the target group
declare @GROUPGROUPMEMBERIDS table (ID uniqueidentifier);
insert into
@GROUPGROUPMEMBERIDS (ID)
select
ID
from
dbo.GROUPMEMBER
where
GROUPID = @SOURCEID;
delete
dbo.GROUPMEMBERROLE
where
GROUPMEMBERID in (select ID from @GROUPGROUPMEMBERIDS);
delete
dbo.GROUPMEMBERDATERANGE
where
GROUPMEMBERID in (select ID from @GROUPGROUPMEMBERIDS);
delete
dbo.GROUPMEMBER
where
GROUPID = @SOURCEID;
end