USP_MERGETASK_CONSTITUENTRELATIONSHIPS
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SOURCEID | uniqueidentifier | IN | |
@TARGETID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@PRIMARYBUSINESSCRITERIA | int | IN | |
@SPOUSECRITERIA | int | IN | |
@INCLUDEPREFS | bit | IN | |
@PREFCRITERIA | int | IN | |
@PARENTORGANIZATIONRELATIONSHIPCRITERIA | int | IN | |
@MERGEEMPLOYMENTINFORMATION | bit | IN |
Definition
Copy
CREATE procedure dbo.USP_MERGETASK_CONSTITUENTRELATIONSHIPS
(
@SOURCEID uniqueidentifier,
@TARGETID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier,
@PRIMARYBUSINESSCRITERIA int = 0,
@SPOUSECRITERIA int = 0,
@INCLUDEPREFS bit = 1,
@PREFCRITERIA int = 0,
@PARENTORGANIZATIONRELATIONSHIPCRITERIA int = 0,
@MERGEEMPLOYMENTINFORMATION bit = 1
)
as
set nocount on;
begin try
declare @DATECHANGED datetime = getdate();
--Store the indicators for later access
declare @SOURCEPRIMARYBUSINESSID as uniqueidentifier;
select @SOURCEPRIMARYBUSINESSID = ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @SOURCEID and ISPRIMARYBUSINESS = 1;
declare @TARGETPRIMARYBUSINESSID as uniqueidentifier;
select @TARGETPRIMARYBUSINESSID = ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @TARGETID and ISPRIMARYBUSINESS = 1;
declare @SOURCESPOUSEID as uniqueidentifier;
select @SOURCESPOUSEID = ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @SOURCEID and ISSPOUSE = 1;
declare @TARGETSPOUSEID as uniqueidentifier;
select @TARGETSPOUSEID = ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @TARGETID and ISSPOUSE = 1;
declare @SOURCEPRIMARYCONTACTID as uniqueidentifier;
select @SOURCEPRIMARYCONTACTID = ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @SOURCEID and ISPRIMARYCONTACT = 1;
declare @TARGETPRIMARYCONTACTID as uniqueidentifier;
select @TARGETPRIMARYCONTACTID = ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @TARGETID and ISPRIMARYCONTACT = 1;
--Wipe the indicators before the merge
--to keep from violating any constraints
if (select ISORGANIZATION from dbo.CONSTITUENT where CONSTITUENT.ID = @TARGETID) = 0
begin
update dbo.RELATIONSHIP
set ISPRIMARYBUSINESS = 0,
ISSPOUSE = 0,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where (RELATIONSHIPCONSTITUENTID = @SOURCEID or RELATIONSHIPCONSTITUENTID = @TARGETID) and
(ISPRIMARYBUSINESS <> 0 or ISSPOUSE <> 0);
end
-- Matching relationships that exist on both the source and target will not be moved over
-- so they will require special handling
declare @MATCHINGRELATIONSHIPS table (SOURCERELATIONSHIPID uniqueidentifier, TARGETRELATIONSHIPID uniqueidentifier);
insert into @MATCHINGRELATIONSHIPS
select
SOURCERELATIONSHIP.ID, TARGETRELATIONSHIP.ID
from
dbo.RELATIONSHIP as SOURCERELATIONSHIP
inner join
dbo.RELATIONSHIP as TARGETRELATIONSHIP
on TARGETRELATIONSHIP.RECIPROCALCONSTITUENTID = SOURCERELATIONSHIP.RECIPROCALCONSTITUENTID
and TARGETRELATIONSHIP.RELATIONSHIPTYPECODEID = SOURCERELATIONSHIP.RELATIONSHIPTYPECODEID
and TARGETRELATIONSHIP.RECIPROCALTYPECODEID = SOURCERELATIONSHIP.RECIPROCALTYPECODEID
where
SOURCERELATIONSHIP.RELATIONSHIPCONSTITUENTID = @SOURCEID
and TARGETRELATIONSHIP.RELATIONSHIPCONSTITUENTID = @TARGETID
union all
select
SOURCERELATIONSHIP.ID, TARGETRELATIONSHIP.ID
from
dbo.RELATIONSHIP as SOURCERELATIONSHIP
inner join
dbo.RELATIONSHIP as TARGETRELATIONSHIP
on TARGETRELATIONSHIP.RELATIONSHIPCONSTITUENTID = SOURCERELATIONSHIP.RELATIONSHIPCONSTITUENTID
and TARGETRELATIONSHIP.RELATIONSHIPTYPECODEID = SOURCERELATIONSHIP.RELATIONSHIPTYPECODEID
and TARGETRELATIONSHIP.RECIPROCALTYPECODEID = SOURCERELATIONSHIP.RECIPROCALTYPECODEID
where
SOURCERELATIONSHIP.RECIPROCALCONSTITUENTID = @SOURCEID
and TARGETRELATIONSHIP.RECIPROCALCONSTITUENTID = @TARGETID;
--Build table of relationships to change
declare @CHANGEDRELATIONSHIPS table (RELATIONSHIPID uniqueidentifier);
insert into @CHANGEDRELATIONSHIPS
select ID
from dbo.RELATIONSHIP
where @SOURCEID in (RELATIONSHIPCONSTITUENTID, RECIPROCALCONSTITUENTID)
and ID not in (select SOURCERELATIONSHIPID from @MATCHINGRELATIONSHIPS);
-- Store the relationship IDs of those SOURCE relationship records in which the matching gift flag will be cleared.
declare @CONFLICTINGMATCHINGGIFTRELATIONSHIPS as table (
ID uniqueidentifier not null
);
-- @CHANGEDRELATIONSHIPS contains SOURCE relationships to be converted into TARGET relationships.
-- Use it to select those relationships with the matching gift flag enabled.
with SOURCEMATCHINGGIFTRELATIONSHIPS_CTE as (
select
ID,
RELATIONSHIPCONSTITUENTID,
RECIPROCALCONSTITUENTID
from dbo.RELATIONSHIP
inner join @CHANGEDRELATIONSHIPS CR on CR.RELATIONSHIPID = RELATIONSHIP.ID
and ISMATCHINGGIFTRELATIONSHIP = 1
),
-- Select all the TARGET relationships with matching gift flag enabled.
TARGETMATCHINGGIFTRELATIONSHIPS_CTE as (
select
ID,
RELATIONSHIPCONSTITUENTID,
RECIPROCALCONSTITUENTID
from dbo.RELATIONSHIP
where @TARGETID in (RELATIONSHIPCONSTITUENTID, RECIPROCALCONSTITUENTID)
and ISMATCHINGGIFTRELATIONSHIP = 1
)
insert into @CONFLICTINGMATCHINGGIFTRELATIONSHIPS
select
-- Only one of the matched relationships should have the matching flag set (source or target relationship)
-- to avoid the conflict and it would be the target relationship, that is already having the flag enabled.
-- So just store the SOURCE relationship IDs and remove the flag from them before their conversion.
SOURCEMATCHINGGIFTRELATIONSHIPS_CTE.ID
from SOURCEMATCHINGGIFTRELATIONSHIPS_CTE
inner join TARGETMATCHINGGIFTRELATIONSHIPS_CTE
on (TARGETMATCHINGGIFTRELATIONSHIPS_CTE.RECIPROCALCONSTITUENTID = SOURCEMATCHINGGIFTRELATIONSHIPS_CTE.RECIPROCALCONSTITUENTID)
or (TARGETMATCHINGGIFTRELATIONSHIPS_CTE.RELATIONSHIPCONSTITUENTID = SOURCEMATCHINGGIFTRELATIONSHIPS_CTE.RELATIONSHIPCONSTITUENTID);
--wipe this(ISMATCHINGGIFTRELATIONSHIP) indicator before the merge to avoid violating constraint(CK_RELATIONSHIP_MATCHINGGIFTRELATIONSHIPCOUNT)
update RELATIONSHIP
set
ISMATCHINGGIFTRELATIONSHIP = 0,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
from dbo.RELATIONSHIP
inner join @CONFLICTINGMATCHINGGIFTRELATIONSHIPS CMR on CMR.ID = RELATIONSHIP.ID;
--Remove emergency contact flag from relationship if target is the reciprocal constituent but is not a student
--Or if the target is the relationship constituent but is a student to avoid violating constraint
update dbo.RELATIONSHIP
set ISEMERGENCYCONTACT = 0, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ISEMERGENCYCONTACT = 1 and
ID in (select RELATIONSHIPID from @CHANGEDRELATIONSHIPS) and
((dbo.UFN_CONSTITUENT_ISSTUDENT(@TARGETID) = 1 and RELATIONSHIPCONSTITUENTID = @SOURCEID) or
(dbo.UFN_CONSTITUENT_ISSTUDENT(@TARGETID) = 0 and RECIPROCALCONSTITUENTID = @SOURCEID))
update dbo.RELATIONSHIP
set RELATIONSHIPCONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where (RELATIONSHIPCONSTITUENTID = @SOURCEID
and ID in (select RELATIONSHIPID from @CHANGEDRELATIONSHIPS))
update dbo.RELATIONSHIP
set RECIPROCALCONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where (RECIPROCALCONSTITUENTID = @SOURCEID
and ID in (select RELATIONSHIPID from @CHANGEDRELATIONSHIPS))
-- Update contact relationship links to sales orders for relationships where the
-- constituent IDs are not being swapped because they are duplicate on the source and target
update dbo.SALESORDER set
CONTACTRELATIONSHIPID = MATCHINGRELATIONSHIPS.TARGETRELATIONSHIPID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
from
@MATCHINGRELATIONSHIPS as MATCHINGRELATIONSHIPS
where
MATCHINGRELATIONSHIPS.SOURCERELATIONSHIPID = SALESORDER.CONTACTRELATIONSHIPID;
-- Copy contact fields for duplicate relationships if the source is a contact and the primary isn't
declare @CONTACTCHANGEDRELATIONSHIPS table (SOURCERELATIONSHIPID uniqueidentifier, TARGETRELATIONSHIPID uniqueidentifier);
insert into @CONTACTCHANGEDRELATIONSHIPS (SOURCERELATIONSHIPID, TARGETRELATIONSHIPID)
select
SOURCERELATIONSHIP.ID,
TARGETRELATIONSHIP.ID
from dbo.RELATIONSHIP SOURCERELATIONSHIP
inner join dbo.RELATIONSHIP TARGETRELATIONSHIP on
SOURCERELATIONSHIP.RELATIONSHIPTYPECODEID = TARGETRELATIONSHIP.RELATIONSHIPTYPECODEID and
SOURCERELATIONSHIP.RECIPROCALTYPECODEID = TARGETRELATIONSHIP.RECIPROCALTYPECODEID
where
(
(
SOURCERELATIONSHIP.RELATIONSHIPCONSTITUENTID = @SOURCEID and
TARGETRELATIONSHIP.RELATIONSHIPCONSTITUENTID = @TARGETID and
SOURCERELATIONSHIP.RECIPROCALCONSTITUENTID = TARGETRELATIONSHIP.RECIPROCALCONSTITUENTID
) or
(
SOURCERELATIONSHIP.RECIPROCALCONSTITUENTID = @SOURCEID and
TARGETRELATIONSHIP.RECIPROCALCONSTITUENTID = @TARGETID and
SOURCERELATIONSHIP.RELATIONSHIPCONSTITUENTID = TARGETRELATIONSHIP.RELATIONSHIPCONSTITUENTID
)
) and
SOURCERELATIONSHIP.ISCONTACT = 1 and
TARGETRELATIONSHIP.ISCONTACT = 0;
update dbo.RELATIONSHIP set
ISCONTACT = 1,
CONTACTTYPECODEID = SOURCERELATIONSHIP.CONTACTTYPECODEID,
ISPRIMARYCONTACT = SOURCERELATIONSHIP.ISPRIMARYCONTACT,
DATECHANGED = @DATECHANGED,
CHANGEDBYID = @CHANGEAGENTID
from dbo.RELATIONSHIP
inner join @CONTACTCHANGEDRELATIONSHIPS CONTACTCHANGEDRELATIONSHIPS on RELATIONSHIP.ID = CONTACTCHANGEDRELATIONSHIPS.TARGETRELATIONSHIPID
inner join dbo.RELATIONSHIP SOURCERELATIONSHIP on CONTACTCHANGEDRELATIONSHIPS.SOURCERELATIONSHIPID = SOURCERELATIONSHIP.ID
declare @ADDRESSESCHANGED int;
--Move contact addresses to the target if we moved the relationship
update dbo.ADDRESS
set CONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED,
--clear the primary flag if the target has a primary address
ISPRIMARY = case when exists(select ID from dbo.ADDRESS where CONSTITUENTID = @TARGETID and ISPRIMARY = 1) then 0
else ISPRIMARY end,
RELATIONSHIPID = case when RELATIONSHIPID in (select SOURCERELATIONSHIPID from @CONTACTCHANGEDRELATIONSHIPS) then (select TARGETRELATIONSHIPID from @CONTACTCHANGEDRELATIONSHIPS where SOURCERELATIONSHIPID = ADDRESS.RELATIONSHIPID)
else RELATIONSHIPID end
where CONSTITUENTID = @SOURCEID
and
(
RELATIONSHIPID in (select RELATIONSHIPID from @CHANGEDRELATIONSHIPS) or
RELATIONSHIPID in (select SOURCERELATIONSHIPID from @CONTACTCHANGEDRELATIONSHIPS)
)
set @ADDRESSESCHANGED = @@rowcount;
declare @EMAILADDRESSESCHANGED int;
--Move contact email addresses to the target if we moved the relationship
update dbo.EMAILADDRESS
set CONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED,
--clear the primary flag if the target has a primary address
ISPRIMARY = case when exists(select ID from dbo.EMAILADDRESS where CONSTITUENTID = @TARGETID and ISPRIMARY = 1) then 0
else ISPRIMARY end,
RELATIONSHIPID = case when RELATIONSHIPID in (select SOURCERELATIONSHIPID from @CONTACTCHANGEDRELATIONSHIPS) then (select TARGETRELATIONSHIPID from @CONTACTCHANGEDRELATIONSHIPS where SOURCERELATIONSHIPID = EMAILADDRESS.RELATIONSHIPID)
else RELATIONSHIPID end
where CONSTITUENTID = @SOURCEID
and
(
RELATIONSHIPID in (select RELATIONSHIPID from @CHANGEDRELATIONSHIPS) or
RELATIONSHIPID in (select SOURCERELATIONSHIPID from @CONTACTCHANGEDRELATIONSHIPS)
)
and not exists
(
select ESUB.ID
from dbo.EMAILADDRESS ESUB
where ESUB.CONSTITUENTID = @TARGETID
and ESUB.EMAILADDRESS = EMAILADDRESS.EMAILADDRESS
and (ESUB.EMAILADDRESSTYPECODEID = EMAILADDRESS.EMAILADDRESSTYPECODEID or (ESUB.EMAILADDRESSTYPECODEID is null and EMAILADDRESS.EMAILADDRESSTYPECODEID is null))
);
set @EMAILADDRESSESCHANGED = @@rowcount;
--Remove the relationship ID for remaining relationship email addresses
update dbo.EMAILADDRESS
set RELATIONSHIPID = null, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where CONSTITUENTID = @SOURCEID
and RELATIONSHIPID in (select RELATIONSHIPID from @CHANGEDRELATIONSHIPS);
--Move contact phones to the target if we moved the relationship
update dbo.PHONE
set CONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED,
--clear the primary flag if the target has a primary address
ISPRIMARY = case when exists(select ID from dbo.PHONE where CONSTITUENTID = @TARGETID and ISPRIMARY = 1) then 0
else ISPRIMARY end,
RELATIONSHIPID = case when RELATIONSHIPID in (select SOURCERELATIONSHIPID from @CONTACTCHANGEDRELATIONSHIPS) then (select TARGETRELATIONSHIPID from @CONTACTCHANGEDRELATIONSHIPS where SOURCERELATIONSHIPID = PHONE.RELATIONSHIPID)
else RELATIONSHIPID end
where CONSTITUENTID = @SOURCEID
and
(
RELATIONSHIPID in (select RELATIONSHIPID from @CHANGEDRELATIONSHIPS) or
RELATIONSHIPID in (select SOURCERELATIONSHIPID from @CONTACTCHANGEDRELATIONSHIPS)
)
and not exists
(
select PSUB.ID
from dbo.PHONE PSUB
where PSUB.CONSTITUENTID = @TARGETID
and PSUB.NUMBER = PHONE.NUMBER
and (PSUB.PHONETYPECODEID = PHONE.PHONETYPECODEID or (PSUB.PHONETYPECODEID is null and PHONE.PHONETYPECODEID is null))
);
--Remove the relationship ID for remaining relationship phone numbers
update dbo.PHONE
set RELATIONSHIPID = null, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where CONSTITUENTID = @SOURCEID
and RELATIONSHIPID in (select RELATIONSHIPID from @CHANGEDRELATIONSHIPS);
--Set the primary business indicator
if @PRIMARYBUSINESSCRITERIA = 0
begin
if @TARGETPRIMARYBUSINESSID is not null
begin
update dbo.RELATIONSHIP
set ISPRIMARYBUSINESS = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @TARGETPRIMARYBUSINESSID
end
else
begin
if @SOURCEPRIMARYBUSINESSID is not null
begin
update dbo.RELATIONSHIP
set ISPRIMARYBUSINESS = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @SOURCEPRIMARYBUSINESSID
end
-- Account for the scenario where the source's
-- primary business relationship was not merged
-- b/c it is a duplicate of one of the target's
-- existing relationships. In this scenario, reset
-- the target's original primary business indicator.
if not exists
(
select top(1) ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @TARGETID
and ISPRIMARYBUSINESS = 1
)
begin
update dbo.RELATIONSHIP
set ISPRIMARYBUSINESS = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @TARGETPRIMARYBUSINESSID;
end
end
end
else
begin
if @SOURCEPRIMARYBUSINESSID is not null
begin
update dbo.RELATIONSHIP
set ISPRIMARYBUSINESS = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @SOURCEPRIMARYBUSINESSID
-- Account for the scenario where the source's
-- primary business relationship was not merged
-- b/c it is a duplicate of one of the target's
-- existing relationships. In this scenario, reset
-- the target's original primary business indicator.
if not exists
(
select top(1) ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @TARGETID
and ISPRIMARYBUSINESS = 1
)
begin
update dbo.RELATIONSHIP
set ISPRIMARYBUSINESS = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @TARGETPRIMARYBUSINESSID;
end
end
else
begin
if @TARGETPRIMARYBUSINESSID is not null
begin
update dbo.RELATIONSHIP
set ISPRIMARYBUSINESS = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @TARGETPRIMARYBUSINESSID
end
end
end
--Set the spouse indicator
if @SPOUSECRITERIA = 0
begin
if @TARGETSPOUSEID is not null
begin
update dbo.RELATIONSHIP
set ISSPOUSE = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @TARGETSPOUSEID
end
else
begin
if @SOURCESPOUSEID is not null
begin
update dbo.RELATIONSHIP
set ISSPOUSE = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @SOURCESPOUSEID
end
-- Account for the scenario where the source's
-- spouse relationship was not merged
-- b/c it is a duplicate of one of the target's
-- existing relationships. In this scenario, reset
-- the target's original spouse indicator.
if not exists
(
select top(1) ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @TARGETID
and ISSPOUSE = 1
)
begin
update dbo.RELATIONSHIP
set ISSPOUSE = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @TARGETSPOUSEID;
end
end
end
else
begin
if @SOURCESPOUSEID is not null
begin
update dbo.RELATIONSHIP
set ISSPOUSE = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @SOURCESPOUSEID
-- Account for the scenario where the source's
-- spouse relationship was not merged
-- b/c it is a duplicate of one of the target's
-- existing relationships. In this scenario, reset
-- the target's original spouse indicator.
if not exists
(
select top(1) ID
from dbo.RELATIONSHIP
where RELATIONSHIPCONSTITUENTID = @TARGETID
and ISSPOUSE = 1
)
begin
update dbo.RELATIONSHIP
set ISSPOUSE = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @TARGETSPOUSEID;
end
end
else
begin
if @TARGETSPOUSEID is not null
begin
update dbo.RELATIONSHIP
set ISSPOUSE = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @TARGETSPOUSEID
end
end
end
-- If the target constituent is in a household, the household name
-- will need to be updated to reflect the new spouse.
exec dbo.USP_HOUSEHOLD_REFRESHNAME @TARGETID, @CHANGEAGENTID
if @INCLUDEPREFS=1
begin
--Make sure the constituents involved are organizations.
--If not, they have no contacts and there is no need to merge mail preferences.
declare @TARGETISORG bit
select @TARGETISORG=ISORGANIZATION
from CONSTITUENT
where id=@TARGETID
if @TARGETISORG=1
begin
declare @SOURCEISORG bit
select @SOURCEISORG=ISORGANIZATION
from CONSTITUENT
where id=@SOURCEID
if @SOURCEISORG=1
begin
--Merge mail preferences
--Due to table constraints, we have to remove
--potential dupes before merging the preferences.
--If the target's preferences supersede,
--delete those the source has that would
--come over, but have a dupe on the target.
if @PREFCRITERIA=0
begin
delete from MAILPREFERENCE
where
ID in (
select mp.ID
from MAILPREFERENCE mp
join MAILPREFERENCEORGCONTACTTYPE mpct on mp.ID=mpct.MAILPREFERENCEID
join RELATIONSHIP r on mpct.CONTACTTYPECODEID=r.CONTACTTYPECODEID or (mpct.USEPRIMARYCONTACT=1 and r.ISPRIMARYCONTACT=1)
where
mp.CONSTITUENTID=@SOURCEID and
r.RELATIONSHIPCONSTITUENTID=@TARGETID
) and
dbo.UFN_MAILPREFERENCE_VALIDATEUNIQUE(ID,@TARGETID,MAILTYPECODE,BUSINESSUNITCODEID,CATEGORYCODEID,
EVENTCATEGORYCODEID,SITEID,ACKNOWLEDGEMENTID,CORRESPONDENCEID,PLEDGEREMINDERID,CORRESPONDENCECODEID,PURPOSEID)=0
end
--If the source's preferences supersede,
--delete those the target has that dupe
--a preference that is going to come over
if @PREFCRITERIA=1
begin
delete targetmp
from MAILPREFERENCE targetmp, MAILPREFERENCE sourcemp
where
targetmp.CONSTITUENTID=@TARGETID and
sourcemp.ID in (
select mp.ID
from MAILPREFERENCE mp
join MAILPREFERENCEORGCONTACTTYPE mpct on mp.ID=mpct.MAILPREFERENCEID
join RELATIONSHIP r on mpct.CONTACTTYPECODEID=r.CONTACTTYPECODEID or (mpct.USEPRIMARYCONTACT=1 and r.ISPRIMARYCONTACT=1)
where
mp.CONSTITUENTID=@SOURCEID and
r.RELATIONSHIPCONSTITUENTID=@TARGETID
) and
((targetmp.MAILTYPECODE = sourcemp.MAILTYPECODE) or (targetmp.MAILTYPECODE is null and sourcemp.MAILTYPECODE is null)) and
((targetmp.BUSINESSUNITCODEID = sourcemp.BUSINESSUNITCODEID) or (targetmp.BUSINESSUNITCODEID is null and sourcemp.BUSINESSUNITCODEID is null)) and
((targetmp.CATEGORYCODEID = sourcemp.CATEGORYCODEID) or (targetmp.CATEGORYCODEID is null and sourcemp.CATEGORYCODEID is null)) and
((targetmp.EVENTCATEGORYCODEID = sourcemp.EVENTCATEGORYCODEID) or (targetmp.EVENTCATEGORYCODEID is null and sourcemp.EVENTCATEGORYCODEID is null)) and
((targetmp.SITEID = sourcemp.SITEID) or (targetmp.SITEID is null and sourcemp.SITEID is null)) and
((targetmp.ACKNOWLEDGEMENTID = sourcemp.ACKNOWLEDGEMENTID) or (targetmp.ACKNOWLEDGEMENTID is null and sourcemp.ACKNOWLEDGEMENTID is null)) and
((targetmp.CORRESPONDENCEID = sourcemp.CORRESPONDENCEID) or (targetmp.CORRESPONDENCEID is null and sourcemp.CORRESPONDENCEID is null)) and
((targetmp.PLEDGEREMINDERID = sourcemp.PLEDGEREMINDERID) or (targetmp.PLEDGEREMINDERID is null and sourcemp.PLEDGEREMINDERID is null)) and
((targetmp.CORRESPONDENCECODEID = sourcemp.CORRESPONDENCECODEID) or (targetmp.CORRESPONDENCECODEID is null and sourcemp.CORRESPONDENCECODEID is null)) and
((targetmp.PURPOSEID = sourcemp.PURPOSEID) or (targetmp.PURPOSEID is null and sourcemp.PURPOSEID is null))
end
--Merge mail preferences that match a contact type on the target organization
update MAILPREFERENCE
set
CONSTITUENTID=@TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where
ID in (
select mp.ID
from MAILPREFERENCE mp
join MAILPREFERENCEORGCONTACTTYPE mpct on mp.ID=mpct.MAILPREFERENCEID
join RELATIONSHIP r on mpct.CONTACTTYPECODEID=r.CONTACTTYPECODEID or (mpct.USEPRIMARYCONTACT=1 and r.ISPRIMARYCONTACT=1)
where
mp.CONSTITUENTID=@SOURCEID and
r.RELATIONSHIPCONSTITUENTID=@TARGETID
) and
dbo.UFN_MAILPREFERENCE_VALIDATEUNIQUE(ID,@TARGETID,MAILTYPECODE,BUSINESSUNITCODEID,CATEGORYCODEID,
EVENTCATEGORYCODEID,SITEID,ACKNOWLEDGEMENTID,CORRESPONDENCEID,PLEDGEREMINDERID,CORRESPONDENCECODEID,PURPOSEID)=1
end
end
else
begin
if @ADDRESSESCHANGED > 0 or @EMAILADDRESSESCHANGED > 0
begin
--Due to table constraints, we have to remove
--potential dupes before merging the preferences.
--If the target's preferences supersede,
--delete those the source has that would
--come over, but have a dupe on the target.
if @PREFCRITERIA = 0
begin
delete from MAILPREFERENCE
where
CONSTITUENTID=@SOURCEID and
(
(
ADDRESSID is not null and
ADDRESSID in (
select ID
from ADDRESS
where CONSTITUENTID=@TARGETID
)
)
or (
EMAILADDRESSID is not null and
EMAILADDRESSID in (
select ID
from dbo.EMAILADDRESS
where CONSTITUENTID=@TARGETID
)
)
)
and dbo.UFN_MAILPREFERENCE_VALIDATEUNIQUE(ID,@TARGETID,MAILTYPECODE,BUSINESSUNITCODEID,CATEGORYCODEID,
EVENTCATEGORYCODEID,SITEID,ACKNOWLEDGEMENTID,CORRESPONDENCEID,PLEDGEREMINDERID,CORRESPONDENCECODEID,PURPOSEID)=0
end
--If the source's preferences supersede,
--delete those the target has that dupe
--a preference that is going to come over
--from the source.
if @PREFCRITERIA = 1
begin
delete targetmp
from MAILPREFERENCE targetmp, MAILPREFERENCE sourcemp
where
targetmp.CONSTITUENTID=@TARGETID and
sourcemp.CONSTITUENTID=@SOURCEID and
(
(
sourcemp.ADDRESSID is not null and
sourcemp.ADDRESSID in (
select ID
from ADDRESS
where CONSTITUENTID=@TARGETID
)
)
or (
sourcemp.EMAILADDRESSID is not null and
sourcemp.EMAILADDRESSID in (
select ID
from dbo.EMAILADDRESS
where CONSTITUENTID=@TARGETID
)
)
) and
((targetmp.MAILTYPECODE = sourcemp.MAILTYPECODE) or (targetmp.MAILTYPECODE is null and sourcemp.MAILTYPECODE is null)) and
((targetmp.BUSINESSUNITCODEID = sourcemp.BUSINESSUNITCODEID) or (targetmp.BUSINESSUNITCODEID is null and sourcemp.BUSINESSUNITCODEID is null)) and
((targetmp.CATEGORYCODEID = sourcemp.CATEGORYCODEID) or (targetmp.CATEGORYCODEID is null and sourcemp.CATEGORYCODEID is null)) and
((targetmp.EVENTCATEGORYCODEID = sourcemp.EVENTCATEGORYCODEID) or (targetmp.EVENTCATEGORYCODEID is null and sourcemp.EVENTCATEGORYCODEID is null)) and
((targetmp.SITEID = sourcemp.SITEID) or (targetmp.SITEID is null and sourcemp.SITEID is null)) and
((targetmp.ACKNOWLEDGEMENTID = sourcemp.ACKNOWLEDGEMENTID) or (targetmp.ACKNOWLEDGEMENTID is null and sourcemp.ACKNOWLEDGEMENTID is null)) and
((targetmp.CORRESPONDENCEID = sourcemp.CORRESPONDENCEID) or (targetmp.CORRESPONDENCEID is null and sourcemp.CORRESPONDENCEID is null)) and
((targetmp.PLEDGEREMINDERID = sourcemp.PLEDGEREMINDERID) or (targetmp.PLEDGEREMINDERID is null and sourcemp.PLEDGEREMINDERID is null)) and
((targetmp.CORRESPONDENCECODEID = sourcemp.CORRESPONDENCECODEID) or (targetmp.CORRESPONDENCECODEID is null and sourcemp.CORRESPONDENCECODEID is null)) and
((targetmp.PURPOSEID = sourcemp.PURPOSEID) or (targetmp.PURPOSEID is null and sourcemp.PURPOSEID is null))
end
--Move preferences whose contact address moved
update MAILPREFERENCE
set
CONSTITUENTID=@TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where
CONSTITUENTID=@SOURCEID and
(
(
ADDRESSID is not null and
ADDRESSID in (
select ID
from ADDRESS
where CONSTITUENTID=@TARGETID
)
)
or (
EMAILADDRESSID is not null and
EMAILADDRESSID in (
select ID
from dbo.EMAILADDRESS
where CONSTITUENTID=@TARGETID
)
)
)
end
end
end
-------------------------
-- Parent Organization --
-------------------------
declare @CONTEXTCACHE varbinary(128);
set @CONTEXTCACHE = CONTEXT_INFO();
declare @MERGEWELLKNOWNGUID uniqueidentifier = '3DB5F72B-2BA0-45A0-890F-24359E3F42A8';
set CONTEXT_INFO @MERGEWELLKNOWNGUID;
declare @SOURCEPARENTCORPID uniqueidentifier;
select @SOURCEPARENTCORPID = PARENTCORPID
from dbo.ORGANIZATIONDATA
where ID = @SOURCEID;
declare @TARGETPARENTCORPID uniqueidentifier;
select @TARGETPARENTCORPID = PARENTCORPID
from dbo.ORGANIZATIONDATA
where ID = @TARGETID;
-- if the source's parent is a child of the target, get rid of the source's parent
if @PARENTORGANIZATIONRELATIONSHIPCRITERIA = 0 and
exists (select 1
from
dbo.ORGANIZATIONDATA
inner join dbo.ORGANIZATIONDATA as PARENTORGANIZATIONDATA on PARENTORGANIZATIONDATA.ID = ORGANIZATIONDATA.PARENTCORPID
where
ORGANIZATIONDATA.ID = @SOURCEID
and PARENTORGANIZATIONDATA.PARENTCORPID = @TARGETID)
begin
update dbo.ORGANIZATIONDATA
set PARENTCORPID = null,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where ID = @SOURCEID;
set @SOURCEPARENTCORPID = null;
end
if (@PARENTORGANIZATIONRELATIONSHIPCRITERIA = 1 and @SOURCEPARENTCORPID is not null) or @TARGETPARENTCORPID is null
begin
-- if the source's parent has the target as its parent
-- get rid of that organization's parent to avoid a circular reference
update dbo.ORGANIZATIONDATA
set PARENTCORPID = null,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where PARENTCORPID = @TARGETID and ID = @SOURCEPARENTCORPID;
-- put the source's parent on the target
update dbo.ORGANIZATIONDATA
set PARENTCORPID = @SOURCEPARENTCORPID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where ID = @TARGETID;
set @TARGETPARENTCORPID = @SOURCEPARENTCORPID;
end
-- if one of the source's children is the parent of the target, avoid a circular reference
if exists (select 1 from dbo.ORGANIZATIONDATA where PARENTCORPID = @SOURCEID and ID = @TARGETPARENTCORPID)
begin
if @PARENTORGANIZATIONRELATIONSHIPCRITERIA = 1
begin
-- keep source selected, keep source's child relation and get rid of target's parent
update dbo.ORGANIZATIONDATA
set PARENTCORPID = null,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where
ID = @TARGETID;
set @TARGETPARENTCORPID = null;
end
else
-- keep target selected, get rid of source's child relation
update dbo.ORGANIZATIONDATA
set PARENTCORPID = null,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where
PARENTCORPID = @SOURCEID and ID = @TARGETPARENTCORPID;
end
-- anything with the source as a parent should now have target as a parent
update dbo.ORGANIZATIONDATA
set PARENTCORPID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where PARENTCORPID = @SOURCEID and ID <> @TARGETID and (@TARGETPARENTCORPID is null or ID <> @TARGETPARENTCORPID);
---------------------------------
-- Organization Parent History --
---------------------------------
update dbo.ORGANIZATIONPARENTHISTORY
set CHILDCORPID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where CHILDCORPID = @SOURCEID;
update dbo.ORGANIZATIONPARENTHISTORY
set PARENTCORPID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where PARENTCORPID = @SOURCEID;
if not @CONTEXTCACHE is null
set CONTEXT_INFO @CONTEXTCACHE;
------------------------
-- Employment History --
------------------------
if coalesce(@MERGEEMPLOYMENTINFORMATION, 1) = 1
begin
declare @EMPTYGUID uniqueidentifier = '00000000-0000-0000-0000-000000000000';
if exists(
select
1
from
@MATCHINGRELATIONSHIPS MATCHINGRELATIONSHIPS
inner join dbo.RELATIONSHIP SOURCERELATIONSHIP
on SOURCERELATIONSHIP.ID = MATCHINGRELATIONSHIPS.SOURCERELATIONSHIPID
inner join dbo.RELATIONSHIPJOBINFO SOURCERELATIONSHIPJOBINFO
on SOURCERELATIONSHIPJOBINFO.RELATIONSHIPSETID = SOURCERELATIONSHIP.RELATIONSHIPSETID
inner join dbo.RELATIONSHIP TARGETRELATIONSHIP
on TARGETRELATIONSHIP.ID = MATCHINGRELATIONSHIPS.TARGETRELATIONSHIPID
inner join dbo.RELATIONSHIPJOBINFO TARGETRELATIONSHIPJOBINFO
on TARGETRELATIONSHIPJOBINFO.RELATIONSHIPSETID = TARGETRELATIONSHIP.RELATIONSHIPSETID
where
(SOURCERELATIONSHIPJOBINFO.ENDDATE between TARGETRELATIONSHIPJOBINFO.STARTDATE and TARGETRELATIONSHIPJOBINFO.ENDDATE)
or (TARGETRELATIONSHIPJOBINFO.ENDDATE between SOURCERELATIONSHIPJOBINFO.STARTDATE and SOURCERELATIONSHIPJOBINFO.ENDDATE)
or (SOURCERELATIONSHIPJOBINFO.STARTDATE between TARGETRELATIONSHIPJOBINFO.STARTDATE and TARGETRELATIONSHIPJOBINFO.ENDDATE)
or (TARGETRELATIONSHIPJOBINFO.STARTDATE between SOURCERELATIONSHIPJOBINFO.STARTDATE and SOURCERELATIONSHIPJOBINFO.ENDDATE)
or (SOURCERELATIONSHIPJOBINFO.STARTDATE is null and TARGETRELATIONSHIPJOBINFO.STARTDATE <= SOURCERELATIONSHIPJOBINFO.ENDDATE)
or (TARGETRELATIONSHIPJOBINFO.STARTDATE is null and SOURCERELATIONSHIPJOBINFO.STARTDATE <= TARGETRELATIONSHIPJOBINFO.ENDDATE)
or (SOURCERELATIONSHIPJOBINFO.ENDDATE is null and TARGETRELATIONSHIPJOBINFO.ENDDATE >= SOURCERELATIONSHIPJOBINFO.STARTDATE)
or (TARGETRELATIONSHIPJOBINFO.ENDDATE is null and SOURCERELATIONSHIPJOBINFO.ENDDATE >= TARGETRELATIONSHIPJOBINFO.STARTDATE)
or (TARGETRELATIONSHIPJOBINFO.STARTDATE is null and SOURCERELATIONSHIPJOBINFO.STARTDATE is null)
or (TARGETRELATIONSHIPJOBINFO.ENDDATE is null and SOURCERELATIONSHIPJOBINFO.ENDDATE is null)
or (TARGETRELATIONSHIPJOBINFO.STARTDATE is null and TARGETRELATIONSHIPJOBINFO.ENDDATE is null)
or (SOURCERELATIONSHIPJOBINFO.STARTDATE is null and SOURCERELATIONSHIPJOBINFO.ENDDATE is null)
)
begin
raiserror('BBERR_JOBINFO_OVERLAPPINGDATERANGE', 16, 1);
end
-- the relationships on TARGET may not have a relationship set
declare NULLRELATIONSHIPSETIDCURSOR cursor for
select distinct
TARGETRELATIONSHIP.ID
from
@MATCHINGRELATIONSHIPS MATCHINGRELATIONSHIPS
inner join dbo.RELATIONSHIP TARGETRELATIONSHIP
on TARGETRELATIONSHIP.ID = MATCHINGRELATIONSHIPS.TARGETRELATIONSHIPID
-- only update target relationships if their matching source relationship has any relationship job info records
inner join dbo.RELATIONSHIP SOURCERELATIONSHIP
on SOURCERELATIONSHIP.ID = MATCHINGRELATIONSHIPS.SOURCERELATIONSHIPID
left join dbo.RELATIONSHIPJOBINFO SOURCERELATIONSHIPJOBINFO
on SOURCERELATIONSHIPJOBINFO.RELATIONSHIPSETID = SOURCERELATIONSHIP.RELATIONSHIPSETID
where
TARGETRELATIONSHIP.RELATIONSHIPSETID is null
and SOURCERELATIONSHIPJOBINFO.ID is not null;
declare @RELATIONSHIPID uniqueidentifier = null;
open NULLRELATIONSHIPSETIDCURSOR;
fetch next from NULLRELATIONSHIPSETIDCURSOR into @RELATIONSHIPID;
while @@FETCH_STATUS = 0
begin
exec dbo.USP_RELATIONSHIPSET_RETROCREATE
@RELATIONSHIPID = @RELATIONSHIPID,
@CHANGEAGENTID = @CHANGEAGENTID;
fetch next from NULLRELATIONSHIPSETIDCURSOR into @RELATIONSHIPID;
end
close NULLRELATIONSHIPSETIDCURSOR;
deallocate NULLRELATIONSHIPSETIDCURSOR;
-- move the job info from the source relationship set to the target relationship set
update dbo.RELATIONSHIPJOBINFO
set
RELATIONSHIPSETID = CHANGINGJOBINFO.TARGETRELATIONSHIPSETID,
DATECHANGED = @DATECHANGED,
CHANGEDBYID = @CHANGEAGENTID
from
dbo.RELATIONSHIPJOBINFO
inner join (
select distinct
SOURCERELATIONSHIPJOBINFO.ID SOURCERELATIONSHIPJOBINFOID,
TARGETRELATIONSHIP.RELATIONSHIPSETID TARGETRELATIONSHIPSETID
from
@MATCHINGRELATIONSHIPS MATCHINGRELATIONSHIPS
inner join dbo.RELATIONSHIP SOURCERELATIONSHIP
on SOURCERELATIONSHIP.ID = MATCHINGRELATIONSHIPS.SOURCERELATIONSHIPID
inner join dbo.RELATIONSHIPJOBINFO SOURCERELATIONSHIPJOBINFO
on SOURCERELATIONSHIPJOBINFO.RELATIONSHIPSETID = SOURCERELATIONSHIP.RELATIONSHIPSETID
inner join dbo.RELATIONSHIP TARGETRELATIONSHIP
on TARGETRELATIONSHIP.ID = MATCHINGRELATIONSHIPS.TARGETRELATIONSHIPID
group by
SOURCERELATIONSHIPJOBINFO.ID,
TARGETRELATIONSHIP.RELATIONSHIPSETID
) CHANGINGJOBINFO
on RELATIONSHIPJOBINFO.ID = CHANGINGJOBINFO.SOURCERELATIONSHIPJOBINFOID;
end
-----------------
-- Final check --
-----------------
--make sure there is only one primary contact after merge.
if @SOURCEPRIMARYCONTACTID is not null and @TARGETPRIMARYCONTACTID is not null
begin
update dbo.RELATIONSHIP
set ISPRIMARYCONTACT = 0, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @DATECHANGED
where ID = @SOURCEPRIMARYCONTACTID
and RELATIONSHIPCONSTITUENTID = @TARGETID;
end
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;