USP_DATAFORMTEMPLATE_ADD_ORGANIZATIONMERGER

The save procedure used by the add dataform template "Organization Merger Add Data Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@PRIMARYORGID uniqueidentifier IN Input parameter indicating the context ID for the record being added.
@SECONDARYORGID uniqueidentifier IN Secondary organization
@CREATENEWORG bit IN Merge both into new primary organization
@NEWORGNAME nvarchar(100) IN Organization name
@MOVECHILDREN bit IN Move all child organizations
@MERGERDATE datetime IN Merger date
@INACTIVEREASON uniqueidentifier IN Inactive reason
@INACTIVEDETAIL nvarchar(300) IN Inactive detail

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_ORGANIZATIONMERGER
(
    @ID uniqueidentifier = null output,
    @CURRENTAPPUSERID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @PRIMARYORGID uniqueidentifier,
    @SECONDARYORGID uniqueidentifier,
    @CREATENEWORG bit,
    @NEWORGNAME nvarchar(100) = '',
    @MOVECHILDREN bit = 0,
    @MERGERDATE datetime,
    @INACTIVEREASON uniqueidentifier,
    @INACTIVEDETAIL nvarchar(300) = null
)
as

set nocount on;

declare @CONTEXTCACHE varbinary(128)

if @CHANGEAGENTID is null  
    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()

begin try

    --ensure we aren't trying to merge an org with itself
    if @PRIMARYORGID = @SECONDARYORGID
        raiserror('BBERR_ORGMERGER_PRIMARYSAMEASSECONDARY', 13,1);

    --ensure that neither source org is inactive
    if exists(select ID from dbo.CONSTITUENT where ID in (@PRIMARYORGID, @SECONDARYORGID) and ISINACTIVE = 1)
        raiserror('BBERR_ORGMERGER_INACTIVEORG', 13,1);

    --ensure that the source orgs are not related with a start date after the merger date
    if exists(select ID from dbo.RELATIONSHIP where RELATIONSHIPCONSTITUENTID = @PRIMARYORGID and RECIPROCALCONSTITUENTID = @SECONDARYORGID and STARTDATE > @MERGERDATE)
        raiserror('BBERR_ORGMERGER_FUTURERELATEDORGS', 13,1);

    --disable trigger so that incorrect parent history records are not created
    alter table dbo.ORGANIZATIONDATA disable trigger TR_ORGANIZATIONDATA_INSERTUPDATE

    declare @TEMPRELATIONSHIPSETS table
    (
        NEWRELATIONSHIPSETID uniqueidentifier not null,
        OLDRELATIONSHIPSETID uniqueidentifier not null,
        OLDRELATIONSHIPSETEXISTED bit not null,
        OLDRELATIONSHIPID uniqueidentifier not null
    )

    declare @NEWPARENTORGID uniqueidentifier

    if @CREATENEWORG = 1
        begin
            --create target org
            if len(@NEWORGNAME) = 0
                raiserror('BBERR_ORGMERGER_NEWORGNAMEREQUIRED', 13,1);

            exec dbo.USP_ORGANIZATION_ADD @ID output, @CURRENTAPPUSERID, @CHANGEAGENTID, @NEWORGNAME

            --copy addresses from primary to target
            insert into dbo.ADDRESS
            (
                ID, 
                CONSTITUENTID, 
                ADDRESSTYPECODEID, 
                ISPRIMARY, 
                DONOTMAIL, 
                STARTDATE, 
                ENDDATE, 
                COUNTRYID, 
                STATEID, 
                ADDRESSBLOCK, 
                CITY, 
                POSTCODE, 
                CART, 
                DPC, 
                LOT, 
                SEQUENCE
                ADDEDBYID, 
                CHANGEDBYID, 
                DATEADDED, 
                DATECHANGED, 
                DONOTMAILREASONCODEID, 
                HISTORICALSTARTDATE, 
                HISTORICALENDDATE, 
                ISCONFIDENTIAL
            )
            select 
                NEWID(), 
                @ID
                ADDRESSTYPECODEID, 
                ISPRIMARY, 
                DONOTMAIL, 
                STARTDATE, 
                ENDDATE, 
                COUNTRYID, 
                STATEID, 
                ADDRESSBLOCK, 
                CITY, 
                POSTCODE, 
                CART, 
                DPC, 
                LOT, 
                SEQUENCE
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
                DONOTMAILREASONCODEID, 
                HISTORICALSTARTDATE, 
                HISTORICALENDDATE, 
                ISCONFIDENTIAL
            from 
                dbo.ADDRESS
            where 
                CONSTITUENTID = @PRIMARYORGID

            --copy phones from primary to target
            insert into dbo.PHONE
            (
                ID, 
                CONSTITUENTID, 
                PHONETYPECODEID, 
                NUMBER
                ISPRIMARY, 
                SEQUENCE
                ADDEDBYID, 
                CHANGEDBYID, 
                DATEADDED, 
                DATECHANGED, 
                DONOTCALL, 
                STARTTIME, 
                ENDTIME, 
                INFOSOURCECODEID, 
                INFOSOURCECOMMENTS, 
                COUNTRYID, 
                STARTDATE, 
                ENDDATE, 
                DONOTCALLREASONCODEID, 
                ISCONFIDENTIAL, 
                ORIGINCODE, 
                SEASONALSTARTDATE, 
                SEASONALENDDATE
            )
            select 
                NEWID(), 
                @ID
                PHONETYPECODEID, 
                NUMBER
                ISPRIMARY, 
                SEQUENCE
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
                DONOTCALL, 
                STARTTIME, 
                ENDTIME, 
                INFOSOURCECODEID, 
                INFOSOURCECOMMENTS, 
                COUNTRYID, 
                STARTDATE, 
                ENDDATE, 
                DONOTCALLREASONCODEID, 
                ISCONFIDENTIAL, 
                ORIGINCODE, 
                SEASONALSTARTDATE, 
                SEASONALENDDATE
            from 
                dbo.PHONE
            where 
                CONSTITUENTID = @PRIMARYORGID

            --copy email addresses from primary to target
            insert into dbo.EMAILADDRESS
            (
                ID, 
                CONSTITUENTID, 
                EMAILADDRESSTYPECODEID, 
                EMAILADDRESS, 
                ISPRIMARY, 
                SEQUENCE
                ADDEDBYID, 
                CHANGEDBYID, 
                DATEADDED, 
                DATECHANGED, 
                DONOTEMAIL, 
                INFOSOURCECODEID, 
                INFOSOURCECOMMENTS, 
                ORIGINCODE
            )
            select 
                NEWID(), 
                @ID
                EMAILADDRESSTYPECODEID, 
                EMAILADDRESS, 
                ISPRIMARY, 
                SEQUENCE
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
                DONOTEMAIL, 
                INFOSOURCECODEID, 
                INFOSOURCECOMMENTS, 
                ORIGINCODE
            from 
                dbo.EMAILADDRESS
            where 
                CONSTITUENTID = @PRIMARYORGID

            --copy the primary's parent org id to the target
            declare @PRIMARYORGPARENTCORPID uniqueidentifier
            select @PRIMARYORGPARENTCORPID = PARENTCORPID
            from dbo.ORGANIZATIONDATA
            where ID = @PRIMARYORGID

            if @PRIMARYORGPARENTCORPID is not null
            begin
                update dbo.ORGANIZATIONDATA set
                    PARENTCORPID = @PRIMARYORGPARENTCORPID,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE
                where ID = @ID;

                if @@ROWCOUNT = 0
                  insert into dbo.ORGANIZATIONDATA
                  (
                    ID,
                    PARENTCORPID,
                    ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                  )
                  values
                  (
                    @ID,
                    @PRIMARYORGPARENTCORPID,
                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                  );

                --manually create the org parent history record
                --since the trigger on ORGANIZATIONDATA that typically
                --creates it is disabled
                insert into dbo.ORGANIZATIONPARENTHISTORY
                (
                    ID, 
                    CHILDCORPID, 
                    PARENTCORPID, 
                    STARTDATE, 
                    DATEADDED, 
                    DATECHANGED, 
                    ADDEDBYID, 
                    CHANGEDBYID
                )
                values
                (
                    newid(),
                    @ID,
                    @PRIMARYORGPARENTCORPID,
                    @MERGERDATE,
                    @CURRENTDATE,
                    @CURRENTDATE,
                    @CHANGEAGENTID,
                    @CHANGEAGENTID
                )
            end

            --copy relationships from primary to target
            insert into @TEMPRELATIONSHIPSETS
            (
                NEWRELATIONSHIPSETID,
                OLDRELATIONSHIPSETID,
                OLDRELATIONSHIPID,
                OLDRELATIONSHIPSETEXISTED
            )
            select
                newid(),
                case when RELATIONSHIPSETID is null then newid() else RELATIONSHIPSETID end,
                ID,
                case when RELATIONSHIPSETID is null then 0 else 1 end
            from
                dbo.RELATIONSHIP
            where
                RELATIONSHIPCONSTITUENTID = @PRIMARYORGID
                    and RECIPROCALCONSTITUENTID <> @SECONDARYORGID

            -- Set RELATIONSHIPSETID for records that are being copied and don't have it set since the below
            -- code requires it be set.
            insert into dbo.RELATIONSHIPSET
            (
                ID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                OLDRELATIONSHIPSETID,
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from @TEMPRELATIONSHIPSETS
            where OLDRELATIONSHIPSETEXISTED = 0

            ; with TEMPRELATIONSHIPSETSDIDNTEXIST_CTE as
            (
                select
                    OLDRELATIONSHIPID,
                    OLDRELATIONSHIPSETID
                from @TEMPRELATIONSHIPSETS
                where OLDRELATIONSHIPSETEXISTED = 0        
            )
            update 
                dbo.RELATIONSHIP
            set
                RELATIONSHIPSETID = OLDRELATIONSHIP.OLDRELATIONSHIPSETID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from
                dbo.RELATIONSHIP
                inner join
                (
                    -- Original relationship
                    select
                        OLDRELATIONSHIPID as ID,
                        OLDRELATIONSHIPSETID
                    from TEMPRELATIONSHIPSETSDIDNTEXIST_CTE

                    union all

                    -- Reciprocal of original relationship
                    select
                        RECIPROCALRELATIONSHIP.ID,
                        OLDRELATIONSHIPSETID
                    from TEMPRELATIONSHIPSETSDIDNTEXIST_CTE as TEMPRELATIONSHIPSETS
                    inner join dbo.RELATIONSHIP ORIGINALRELATIONSHIP on TEMPRELATIONSHIPSETS.OLDRELATIONSHIPID = ORIGINALRELATIONSHIP.ID
                    inner join dbo.RELATIONSHIP RECIPROCALRELATIONSHIP on
                        ORIGINALRELATIONSHIP.RELATIONSHIPCONSTITUENTID = RECIPROCALRELATIONSHIP.RECIPROCALCONSTITUENTID and
                        ORIGINALRELATIONSHIP.RECIPROCALCONSTITUENTID = RECIPROCALRELATIONSHIP.RELATIONSHIPCONSTITUENTID and
                        ORIGINALRELATIONSHIP.RELATIONSHIPTYPECODEID = RECIPROCALRELATIONSHIP.RECIPROCALTYPECODEID and
                        ORIGINALRELATIONSHIP.RECIPROCALTYPECODEID = RECIPROCALRELATIONSHIP.RELATIONSHIPTYPECODEID
                ) OLDRELATIONSHIP on RELATIONSHIP.ID = OLDRELATIONSHIP.ID


            -- Create copied relationships
            insert into dbo.RELATIONSHIPSET
            (
                ID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                NEWRELATIONSHIPSETID,
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from
                @TEMPRELATIONSHIPSETS

            insert into dbo.RELATIONSHIP
            (
                ID,
                RELATIONSHIPCONSTITUENTID,
                RECIPROCALCONSTITUENTID,
                RELATIONSHIPTYPECODEID,
                RECIPROCALTYPECODEID,
                STARTDATE,
                ENDDATE,
                ISSPOUSE,
                ISPRIMARYBUSINESS,
                ISCONTACT,
                CONTACTTYPECODEID,
                POSITION,
                ISMATCHINGGIFTRELATIONSHIP,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED,
                ISPRIMARYCONTACT,
                RELATIONSHIPSETID,
                COMMENTS,
                ISEMERGENCYCONTACT,
        RECEIVESREPORTCARD
            )
            select
                newid(),
                @ID,
                RECIPROCALCONSTITUENTID,
                RELATIONSHIPTYPECODEID,
                RECIPROCALTYPECODEID,
                STARTDATE,
                ENDDATE,
                ISSPOUSE,
                ISPRIMARYBUSINESS,
                ISCONTACT,
                CONTACTTYPECODEID,
                POSITION,
                ISMATCHINGGIFTRELATIONSHIP,
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
                ISPRIMARYCONTACT,
                TRS.NEWRELATIONSHIPSETID,
                COMMENTS,
                ISEMERGENCYCONTACT,
                RECEIVESREPORTCARD
            from
                dbo.RELATIONSHIP
                inner join @TEMPRELATIONSHIPSETS TRS on RELATIONSHIP.RELATIONSHIPSETID = TRS.OLDRELATIONSHIPSETID
            where
                RELATIONSHIPCONSTITUENTID = @PRIMARYORGID

            --copy job info from primary to target
            insert into dbo.RELATIONSHIPJOBINFO
            (
                ID,
                RELATIONSHIPSETID,
                JOBTITLE,
                JOBCATEGORYCODEID,
                CAREERLEVELCODEID,
                STARTDATE,
                ENDDATE,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED,
                JOBSCHEDULECODEID,
                JOBDIVISION,
                JOBDEPARTMENT
            )
            select
                newid(),
                TRS.NEWRELATIONSHIPSETID,
                JOBTITLE,
                JOBCATEGORYCODEID,
                CAREERLEVELCODEID,
                STARTDATE,
                ENDDATE,
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
                JOBSCHEDULECODEID,
                JOBDIVISION,
                JOBDEPARTMENT
            from
                dbo.RELATIONSHIPJOBINFO
                inner join @TEMPRELATIONSHIPSETS TRS on RELATIONSHIPJOBINFO.RELATIONSHIPSETID = TRS.OLDRELATIONSHIPSETID

            --update relationship addresses to point at target
            update 
                ADDRESS
            set
                RELATIONSHIPID = RELATIONSHIP.ID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from
                dbo.ADDRESS
                inner join dbo.RELATIONSHIP OLDREL on ADDRESS.RELATIONSHIPID = OLDREL.ID
                inner join @TEMPRELATIONSHIPSETS TRS on OLDREL.RELATIONSHIPSETID = TRS.OLDRELATIONSHIPSETID
                inner join dbo.RELATIONSHIP on TRS.NEWRELATIONSHIPSETID = RELATIONSHIP.RELATIONSHIPSETID
            where
                RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID

            --update relationship phones to point at target
            update 
                PHONE
            set
                RELATIONSHIPID = RELATIONSHIP.ID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from
                dbo.PHONE
                inner join dbo.RELATIONSHIP OLDREL on PHONE.RELATIONSHIPID = OLDREL.ID
                inner join @TEMPRELATIONSHIPSETS TRS on OLDREL.RELATIONSHIPSETID = TRS.OLDRELATIONSHIPSETID
                inner join dbo.RELATIONSHIP on TRS.NEWRELATIONSHIPSETID = RELATIONSHIP.RELATIONSHIPSETID
            where
                RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID      

            --update relationship email addresses to point at target
            update 
                EMAILADDRESS
            set
                RELATIONSHIPID = RELATIONSHIP.ID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from
                dbo.EMAILADDRESS
                inner join dbo.RELATIONSHIP OLDREL on EMAILADDRESS.RELATIONSHIPID = OLDREL.ID
                inner join @TEMPRELATIONSHIPSETS TRS on OLDREL.RELATIONSHIPSETID = TRS.OLDRELATIONSHIPSETID
                inner join dbo.RELATIONSHIP on TRS.NEWRELATIONSHIPSETID = RELATIONSHIP.RELATIONSHIPSETID
            where
                RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID                  

            --terminate primary relationships
            set @CONTEXTCACHE = CONTEXT_INFO()

            if @CHANGEAGENTID is not null 
                set CONTEXT_INFO @CHANGEAGENTID

            delete
                RELATIONSHIP
            from
                dbo.RELATIONSHIP
            where
                RELATIONSHIPCONSTITUENTID = @PRIMARYORGID
                    and STARTDATE > @MERGERDATE

            if not @CONTEXTCACHE is null 
                set CONTEXT_INFO @CONTEXTCACHE

            update
                RELATIONSHIP
            set
                ENDDATE = @MERGERDATE,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from
                dbo.RELATIONSHIP
            where
                RELATIONSHIPCONSTITUENTID = @PRIMARYORGID
                    and (ENDDATE IS NULL or ENDDATE > @MERGERDATE)

            --terminate primary job info
            set @CONTEXTCACHE = CONTEXT_INFO()

            if @CHANGEAGENTID is not null 
                set CONTEXT_INFO @CHANGEAGENTID

            delete
                RELATIONSHIPJOBINFO
            from
                dbo.RELATIONSHIPJOBINFO
                inner join RELATIONSHIP on RELATIONSHIPJOBINFO.RELATIONSHIPSETID = RELATIONSHIP.RELATIONSHIPSETID
            where
                RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @PRIMARYORGID
                    and RELATIONSHIPJOBINFO.STARTDATE > @MERGERDATE

            if not @CONTEXTCACHE is null 
                set CONTEXT_INFO @CONTEXTCACHE

            update
                RELATIONSHIPJOBINFO
            set
                ENDDATE = @MERGERDATE,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from
                dbo.RELATIONSHIPJOBINFO
                inner join RELATIONSHIP on RELATIONSHIPJOBINFO.RELATIONSHIPSETID = RELATIONSHIP.RELATIONSHIPSETID
            where
                RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @PRIMARYORGID
                    and (RELATIONSHIPJOBINFO.ENDDATE IS NULL or RELATIONSHIPJOBINFO.ENDDATE > @MERGERDATE)

            select
                @NEWPARENTORGID = PARENTCORPID
            from
                dbo.ORGANIZATIONDATA
            where
                ID = @PRIMARYORGID
                    and @MOVECHILDREN = 0

            if @NEWPARENTORGID is null
                set @NEWPARENTORGID = @ID

            -- end primary children's previous parent history records
            update
                ORGANIZATIONPARENTHISTORY
            set
                ENDDATE = DateAdd("d", -1, @MERGERDATE),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from
                dbo.ORGANIZATIONPARENTHISTORY
                inner join dbo.ORGANIZATIONDATA on ORGANIZATIONPARENTHISTORY.CHILDCORPID = ORGANIZATIONDATA.ID
                    and ORGANIZATIONPARENTHISTORY.PARENTCORPID = ORGANIZATIONDATA.PARENTCORPID
            where
                ORGANIZATIONDATA.PARENTCORPID = @PRIMARYORGID
                    and (ORGANIZATIONPARENTHISTORY.ENDDATE >= @MERGERDATE or ORGANIZATIONPARENTHISTORY.ENDDATE IS NULL)

            -- create new parent history records for primary children
            insert into dbo.ORGANIZATIONPARENTHISTORY
            (
                ID, 
                CHILDCORPID, 
                PARENTCORPID, 
                STARTDATE, 
                DATEADDED, 
                DATECHANGED, 
                ADDEDBYID, 
                CHANGEDBYID
    )
            select
                newid(),
                ORGANIZATIONDATA.ID,
                @NEWPARENTORGID,
                @MERGERDATE,
                @CURRENTDATE,
                @CURRENTDATE,
                @CHANGEAGENTID,
                @CHANGEAGENTID
            from
                dbo.ORGANIZATIONDATA
            where
                PARENTCORPID = @PRIMARYORGID

            --move primary child orgs
            update
                ORGANIZATIONDATA
            set
                PARENTCORPID = @NEWPARENTORGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from
                dbo.ORGANIZATIONDATA
            where
                PARENTCORPID = @PRIMARYORGID

            exec dbo.USP_ORGANIZATIONMERGER_MAKEORGCHILD
                @CHILDORGANIZATIONID = @PRIMARYORGID,
                @PARENTORGANIZATIONID = @ID,
                @MERGERDATE = @MERGERDATE,
                @CURRENTDATE = @CURRENTDATE,
                @CHANGEAGENTID = @CHANGEAGENTID

            --mark primary as inactive
            exec dbo.USP_DATAFORMTEMPLATE_EDIT_CONSTITUENTINACTIVEDETAIL @PRIMARYORGID, @CHANGEAGENTID, @INACTIVEREASON, @INACTIVEDETAIL
        end
    else
        set @ID = @PRIMARYORGID

    --cache primary contact ID
    declare @PRIMARYCONTACTRELATIONSHIPID uniqueidentifier = (select ID from dbo.RELATIONSHIP where RELATIONSHIPCONSTITUENTID = @ID and ISPRIMARYCONTACT = 1)

    --update dates on target relationships matched by secondary
    update
        RELATIONSHIP
    set
        STARTDATE = case when SECONDARYRELS.STARTDATE < RELATIONSHIP.STARTDATE then SECONDARYRELS.STARTDATE else RELATIONSHIP.STARTDATE end,
        ENDDATE = case when SECONDARYRELS.ENDDATE > RELATIONSHIP.ENDDATE then SECONDARYRELS.ENDDATE else RELATIONSHIP.ENDDATE end,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.RELATIONSHIP
        inner join dbo.RELATIONSHIP SECONDARYRELS on RELATIONSHIP.RECIPROCALCONSTITUENTID = SECONDARYRELS.RECIPROCALCONSTITUENTID
            and RELATIONSHIP.RELATIONSHIPTYPECODEID = SECONDARYRELS.RELATIONSHIPTYPECODEID
            and RELATIONSHIP.RECIPROCALTYPECODEID = SECONDARYRELS.RECIPROCALTYPECODEID
            and SECONDARYRELS.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID
            and (SECONDARYRELS.STARTDATE < RELATIONSHIP.STARTDATE or SECONDARYRELS.ENDDATE > RELATIONSHIP.ENDDATE)

    --copy unmatched relationships from secondary to target
    delete from @TEMPRELATIONSHIPSETS

    insert into @TEMPRELATIONSHIPSETS
    (
        NEWRELATIONSHIPSETID,
        OLDRELATIONSHIPSETID,
        OLDRELATIONSHIPID,
        OLDRELATIONSHIPSETEXISTED
    )
    select
        newid(),
        case when RELATIONSHIP.RELATIONSHIPSETID is null then newid() else RELATIONSHIP.RELATIONSHIPSETID end,
        RELATIONSHIP.ID,
        case when RELATIONSHIP.RELATIONSHIPSETID is null then 0 else 1 end
    from
        dbo.RELATIONSHIP
        left outer join dbo.RELATIONSHIP TARGETRELS on RELATIONSHIP.RECIPROCALCONSTITUENTID = TARGETRELS.RECIPROCALCONSTITUENTID
            and RELATIONSHIP.RELATIONSHIPTYPECODEID = TARGETRELS.RELATIONSHIPTYPECODEID
            and RELATIONSHIP.RECIPROCALTYPECODEID = TARGETRELS.RECIPROCALTYPECODEID
            and TARGETRELS.RELATIONSHIPCONSTITUENTID = @ID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
            and RELATIONSHIP.RECIPROCALCONSTITUENTID <> @PRIMARYORGID
            and TARGETRELS.ID is null


    -- Set RELATIONSHIPSETID for records that are being copied and don't have it set since the below
    -- code requires it be set.
    insert into dbo.RELATIONSHIPSET
    (
        ID,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
    )
    select
        OLDRELATIONSHIPSETID,
        @CHANGEAGENTID
        @CHANGEAGENTID
        @CURRENTDATE
        @CURRENTDATE
    from @TEMPRELATIONSHIPSETS
    where OLDRELATIONSHIPSETEXISTED = 0

    ; with TEMPRELATIONSHIPSETSDIDNTEXIST_CTE as
    (
        select
            OLDRELATIONSHIPID,
            OLDRELATIONSHIPSETID
        from @TEMPRELATIONSHIPSETS
        where 
            OLDRELATIONSHIPSETEXISTED = 0        
    )
    update 
        dbo.RELATIONSHIP
    set
        RELATIONSHIPSETID = OLDRELATIONSHIP.OLDRELATIONSHIPSETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.RELATIONSHIP
        inner join
        (
            -- Original relationship
            select
                OLDRELATIONSHIPID as ID,
                OLDRELATIONSHIPSETID
            from TEMPRELATIONSHIPSETSDIDNTEXIST_CTE

            union all

            -- Reciprocal of original relationship
            select
                RECIPROCALRELATIONSHIP.ID,
                OLDRELATIONSHIPSETID
            from TEMPRELATIONSHIPSETSDIDNTEXIST_CTE as TEMPRELATIONSHIPSETS
            inner join dbo.RELATIONSHIP ORIGINALRELATIONSHIP on TEMPRELATIONSHIPSETS.OLDRELATIONSHIPID = ORIGINALRELATIONSHIP.ID
            inner join dbo.RELATIONSHIP RECIPROCALRELATIONSHIP on
                ORIGINALRELATIONSHIP.RELATIONSHIPCONSTITUENTID = RECIPROCALRELATIONSHIP.RECIPROCALCONSTITUENTID and
                ORIGINALRELATIONSHIP.RECIPROCALCONSTITUENTID = RECIPROCALRELATIONSHIP.RELATIONSHIPCONSTITUENTID and
                ORIGINALRELATIONSHIP.RELATIONSHIPTYPECODEID = RECIPROCALRELATIONSHIP.RECIPROCALTYPECODEID and
                ORIGINALRELATIONSHIP.RECIPROCALTYPECODEID = RECIPROCALRELATIONSHIP.RELATIONSHIPTYPECODEID
        ) OLDRELATIONSHIP on RELATIONSHIP.ID = OLDRELATIONSHIP.ID


    -- Create copied relationships
    insert into dbo.RELATIONSHIPSET
    (
        ID,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
    )
    select
        NEWRELATIONSHIPSETID,
        @CHANGEAGENTID
        @CHANGEAGENTID
        @CURRENTDATE
        @CURRENTDATE
    from
        @TEMPRELATIONSHIPSETS

    insert into dbo.RELATIONSHIP
    (
        ID,
        RELATIONSHIPCONSTITUENTID,
        RECIPROCALCONSTITUENTID,
        RELATIONSHIPTYPECODEID,
        RECIPROCALTYPECODEID,
        STARTDATE,
        ENDDATE,
        ISSPOUSE,
        ISPRIMARYBUSINESS,
        ISCONTACT,
        CONTACTTYPECODEID,
        POSITION,
        ISMATCHINGGIFTRELATIONSHIP,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED,
        ISPRIMARYCONTACT,
        RELATIONSHIPSETID,
        COMMENTS,
        ISEMERGENCYCONTACT,
        RECEIVESREPORTCARD
    )
    select
        newid(),
        @ID,
        RECIPROCALCONSTITUENTID,
        RELATIONSHIPTYPECODEID,
        RECIPROCALTYPECODEID,
        STARTDATE,
        ENDDATE,
        ISSPOUSE,
        ISPRIMARYBUSINESS,
        ISCONTACT,
        CONTACTTYPECODEID,
        POSITION,
        ISMATCHINGGIFTRELATIONSHIP,
        @CHANGEAGENTID
        @CHANGEAGENTID
        @CURRENTDATE
        @CURRENTDATE
        ISPRIMARYCONTACT,
        TRS.NEWRELATIONSHIPSETID,
        COMMENTS,
        ISEMERGENCYCONTACT,
        RECEIVESREPORTCARD
    from
        dbo.RELATIONSHIP
        inner join @TEMPRELATIONSHIPSETS TRS on RELATIONSHIP.RELATIONSHIPSETID = TRS.OLDRELATIONSHIPSETID
    where
        RELATIONSHIPCONSTITUENTID = @SECONDARYORGID

    --restore primary contact relationship
    if @PRIMARYCONTACTRELATIONSHIPID is null
        select 
            @PRIMARYCONTACTRELATIONSHIPID = RELATIONSHIP.ID
        from
            dbo.RELATIONSHIP
            inner join dbo.RELATIONSHIP SECONDARYRELS on RELATIONSHIP.RECIPROCALCONSTITUENTID = SECONDARYRELS.RECIPROCALCONSTITUENTID
                and RELATIONSHIP.RELATIONSHIPTYPECODEID = SECONDARYRELS.RELATIONSHIPTYPECODEID
                and RELATIONSHIP.RECIPROCALTYPECODEID = SECONDARYRELS.RECIPROCALTYPECODEID
                and SECONDARYRELS.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
        where
            RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID
            and SECONDARYRELS.ISPRIMARYCONTACT = 1

    update 
        dbo.RELATIONSHIP 
    set 
        ISPRIMARYCONTACT = 1,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE        
    where
        ID = @PRIMARYCONTACTRELATIONSHIPID

    --copy job info from secondary to target for unmatched relationships
    insert into dbo.RELATIONSHIPJOBINFO
    (
        ID,
        RELATIONSHIPSETID,
        JOBTITLE,
        JOBCATEGORYCODEID,
        CAREERLEVELCODEID,
        STARTDATE,
        ENDDATE,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED,
        JOBSCHEDULECODEID,
        JOBDIVISION,
        JOBDEPARTMENT
    )
    select
        newid(),
        TRS.NEWRELATIONSHIPSETID,
        JOBTITLE,
        JOBCATEGORYCODEID,
        CAREERLEVELCODEID,
        STARTDATE,
        ENDDATE,
        @CHANGEAGENTID
        @CHANGEAGENTID
        @CURRENTDATE
        @CURRENTDATE
        JOBSCHEDULECODEID,
        JOBDIVISION,
        JOBDEPARTMENT
    from
        dbo.RELATIONSHIPJOBINFO
        inner join @TEMPRELATIONSHIPSETS TRS on RELATIONSHIPJOBINFO.RELATIONSHIPSETID = TRS.OLDRELATIONSHIPSETID

    --copy job info from secondary to target for matched relationships without job info
    insert into dbo.RELATIONSHIPJOBINFO
    (
        ID,
        RELATIONSHIPSETID,
        JOBTITLE,
        JOBCATEGORYCODEID,
        CAREERLEVELCODEID,
        STARTDATE,
        ENDDATE,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED,
        JOBSCHEDULECODEID,
        JOBDIVISION,
        JOBDEPARTMENT
    )
    select
        newid(),
        RELATIONSHIP.RELATIONSHIPSETID,
        SECONDARYJOBINFO.JOBTITLE,
        SECONDARYJOBINFO.JOBCATEGORYCODEID,
        SECONDARYJOBINFO.CAREERLEVELCODEID,
        SECONDARYJOBINFO.STARTDATE,
        SECONDARYJOBINFO.ENDDATE,
        @CHANGEAGENTID
        @CHANGEAGENTID
        @CURRENTDATE
        @CURRENTDATE
        SECONDARYJOBINFO.JOBSCHEDULECODEID,
        SECONDARYJOBINFO.JOBDIVISION,
        SECONDARYJOBINFO.JOBDEPARTMENT
    from
        dbo.RELATIONSHIPJOBINFO SECONDARYJOBINFO
        inner join dbo.RELATIONSHIP SECONDARYRELS on SECONDARYJOBINFO.RELATIONSHIPSETID = SECONDARYRELS.RELATIONSHIPSETID
        inner join dbo.RELATIONSHIP on SECONDARYRELS.RECIPROCALCONSTITUENTID = RELATIONSHIP.RECIPROCALCONSTITUENTID
            and SECONDARYRELS.RELATIONSHIPTYPECODEID = RELATIONSHIP.RELATIONSHIPTYPECODEID
            and SECONDARYRELS.RECIPROCALTYPECODEID = RELATIONSHIP.RECIPROCALTYPECODEID
            and RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID
        left outer join dbo.RELATIONSHIPJOBINFO on RELATIONSHIP.RELATIONSHIPSETID = RELATIONSHIPJOBINFO.RELATIONSHIPSETID
    where
        SECONDARYRELS.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
            and RELATIONSHIPJOBINFO.ID is null

    --copy relationship addresses to contacts
    insert into dbo.ADDRESS
    (
        ID, 
        CONSTITUENTID, 
        ADDRESSTYPECODEID, 
        ISPRIMARY, 
        DONOTMAIL, 
        STARTDATE, 
        ENDDATE, 
        COUNTRYID, 
        STATEID, 
        ADDRESSBLOCK, 
        CITY, 
        POSTCODE, 
        CART, 
        DPC, 
        LOT, 
        SEQUENCE
        ADDEDBYID, 
        CHANGEDBYID, 
        DATEADDED, 
        DATECHANGED, 
        DONOTMAILREASONCODEID, 
        HISTORICALSTARTDATE, 
        HISTORICALENDDATE, 
        ISCONFIDENTIAL,
        RELATIONSHIPID
    )
    select 
        NEWID(), 
        RECIPROCALCONSTITUENTID, 
        ADDRESSTYPECODEID, 
        0,
        DONOTMAIL, 
        ADDRESS.STARTDATE, 
        ADDRESS.ENDDATE, 
        COUNTRYID, 
        STATEID, 
        ADDRESSBLOCK, 
        CITY, 
        POSTCODE, 
        CART, 
        DPC, 
        LOT, 
        SEQUENCE
        @CHANGEAGENTID
        @CHANGEAGENTID
        @CURRENTDATE
        @CURRENTDATE
        DONOTMAILREASONCODEID, 
        RELATIONSHIP.STARTDATE, 
        RELATIONSHIP.ENDDATE, 
        ISCONFIDENTIAL,
        RELATIONSHIP.ID
    from 
        dbo.ADDRESS
        inner join dbo.RELATIONSHIP on ADDRESS.CONSTITUENTID = RELATIONSHIP.RELATIONSHIPCONSTITUENTID
        inner join @TEMPRELATIONSHIPSETS TRS on RELATIONSHIP.RELATIONSHIPSETID = TRS.NEWRELATIONSHIPSETID
    where 
        ADDRESS.CONSTITUENTID = @ID
            and ADDRESS.ISPRIMARY = 1
            and RELATIONSHIP.ISCONTACT = 1

    --terminate secondary relationship addresses if they aren't primary or if we've added a new relationship address
    update
        ADDRESS
    set
        HISTORICALSTARTDATE = case when ADDRESS.HISTORICALSTARTDATE > @MERGERDATE then NULL else ADDRESS.HISTORICALSTARTDATE end,
        HISTORICALENDDATE = @MERGERDATE,
        DONOTMAIL = 1,
        ISPRIMARY = 0,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.ADDRESS
        inner join dbo.RELATIONSHIP on ADDRESS.RELATIONSHIPID = RELATIONSHIP.ID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
            and (ADDRESS.ISPRIMARY = 0 or exists (select A.ID 
                                                    from dbo.ADDRESS A inner join dbo.RELATIONSHIP R on A.RELATIONSHIPID = R.ID
                                                    where R.RELATIONSHIPCONSTITUENTID = @ID and A.CONSTITUENTID = ADDRESS.CONSTITUENTID))

    --set new addresses to primary if there isn't already a primary.  this should only be the case if the address we terminated was previously primary.
    update
        ADDRESS
    set
        ISPRIMARY = 1,
        HISTORICALENDDATE = NULL,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.ADDRESS
        inner join dbo.RELATIONSHIP on ADDRESS.RELATIONSHIPID = RELATIONSHIP.ID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID
            and not exists (select A.ID
                            from dbo.ADDRESS A
                            where A.CONSTITUENTID = ADDRESS.CONSTITUENTID and A.ISPRIMARY = 1)

    --copy relationship phones to contacts if number/type combo does not exist
    insert into dbo.PHONE
    (
        ID, 
        CONSTITUENTID, 
        PHONETYPECODEID, 
        NUMBER
        ISPRIMARY, 
        SEQUENCE
        ADDEDBYID, 
        CHANGEDBYID, 
        DATEADDED, 
        DATECHANGED, 
        DONOTCALL, 
        INFOSOURCECODEID, 
        INFOSOURCECOMMENTS, 
        COUNTRYID, 
        STARTDATE, 
        ENDDATE, 
        DONOTCALLREASONCODEID, 
        ISCONFIDENTIAL, 
        ORIGINCODE, 
        SEASONALSTARTDATE, 
        SEASONALENDDATE,
        RELATIONSHIPID
    )
    select 
        NEWID(), 
        RECIPROCALCONSTITUENTID, 
        PHONE.PHONETYPECODEID, 
        PHONE.NUMBER
        0
        PHONE.SEQUENCE
        @CHANGEAGENTID
        @CHANGEAGENTID
        @CURRENTDATE
        @CURRENTDATE
        PHONE.DONOTCALL, 
        PHONE.INFOSOURCECODEID, 
        PHONE.INFOSOURCECOMMENTS, 
        PHONE.COUNTRYID, 
        RELATIONSHIP.STARTDATE, 
        RELATIONSHIP.ENDDATE, 
        PHONE.DONOTCALLREASONCODEID, 
        PHONE.ISCONFIDENTIAL, 
        PHONE.ORIGINCODE, 
        PHONE.SEASONALSTARTDATE, 
        PHONE.SEASONALENDDATE,
        RELATIONSHIP.ID
    from 
        dbo.PHONE
        inner join dbo.RELATIONSHIP on PHONE.CONSTITUENTID = RELATIONSHIP.RELATIONSHIPCONSTITUENTID
        inner join @TEMPRELATIONSHIPSETS TRS on RELATIONSHIP.RELATIONSHIPSETID = TRS.NEWRELATIONSHIPSETID
        left outer join dbo.PHONE RELPHONES on RELATIONSHIP.RECIPROCALCONSTITUENTID = RELPHONES.CONSTITUENTID
            and PHONE.PHONETYPECODEID = RELPHONES.PHONETYPECODEID
            and PHONE.NUMBER = RELPHONES.NUMBER
    where 
        PHONE.CONSTITUENTID = @ID
            and PHONE.ISPRIMARY = 1
            and RELATIONSHIP.ISCONTACT = 1
            and RELPHONES.ID IS NULL

    --update secondary relationship phones to point at target relationship if the number and type matches
    update
        PHONE
    set
        RELATIONSHIPID = TARGETRELS.ID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE        
    from
        dbo.PHONE
        inner join dbo.RELATIONSHIP on PHONE.RELATIONSHIPID = RELATIONSHIP.ID
        inner join dbo.PHONE TARGETPHONES on PHONE.NUMBER = TARGETPHONES.NUMBER
            and PHONE.PHONETYPECODEID = TARGETPHONES.PHONETYPECODEID
            and PHONE.CONSTITUENTID = @ID
        inner join dbo.RELATIONSHIP TARGETRELS on RELATIONSHIP.RECIPROCALCONSTITUENTID = TARGETRELS.RECIPROCALCONSTITUENTID
            and RELATIONSHIP.RELATIONSHIPTYPECODEID = TARGETRELS.RELATIONSHIPTYPECODEID
            and RELATIONSHIP.RECIPROCALTYPECODEID = TARGETRELS.RECIPROCALTYPECODEID
            and TARGETRELS.RELATIONSHIPCONSTITUENTID = TARGETPHONES.CONSTITUENTID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID

    --terminate secondary relationship phones if they aren't primary or if we've added a new relationship phone
    update
        PHONE
    set
        STARTDATE = case when PHONE.STARTDATE > @MERGERDATE then NULL else PHONE.STARTDATE end,
        ENDDATE = @MERGERDATE,
        DONOTCALL = 1,
        ISPRIMARY = 0,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.PHONE
        inner join dbo.RELATIONSHIP on PHONE.RELATIONSHIPID = RELATIONSHIP.ID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
            and (PHONE.ISPRIMARY = 0 or exists (select P.ID
                                                from dbo.PHONE P inner join dbo.RELATIONSHIP R on P.RELATIONSHIPID = R.ID
                                                where R.RELATIONSHIPCONSTITUENTID = @ID and P.CONSTITUENTID = PHONE.CONSTITUENTID))

    --set new phones to primary if there isn't already a primary.  this should only be the case if the phone we terminated was previously primary.
    update
        PHONE
    set
        ISPRIMARY = 1,
        ENDDATE = NULL,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.PHONE
        inner join dbo.RELATIONSHIP on PHONE.RELATIONSHIPID = RELATIONSHIP.ID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID
            and not exists (select P.ID
                            from dbo.PHONE P
                            where P.CONSTITUENTID = PHONE.CONSTITUENTID and P.ISPRIMARY = 1)

    --copy relationship emails to contacts
    insert into dbo.EMAILADDRESS
    (
        ID, 
        CONSTITUENTID, 
        EMAILADDRESSTYPECODEID, 
        EMAILADDRESS, 
        ISPRIMARY, 
        SEQUENCE
        ADDEDBYID, 
        CHANGEDBYID, 
        DATEADDED, 
        DATECHANGED, 
        DONOTEMAIL, 
        INFOSOURCECODEID, 
        INFOSOURCECOMMENTS, 
        ORIGINCODE,
        RELATIONSHIPID
    )
    select 
        NEWID(), 
        RECIPROCALCONSTITUENTID, 
        EMAILADDRESSTYPECODEID, 
        EMAILADDRESS, 
        0
        SEQUENCE
        @CHANGEAGENTID
        @CHANGEAGENTID
        @CURRENTDATE
        @CURRENTDATE
        DONOTEMAIL, 
        INFOSOURCECODEID, 
        INFOSOURCECOMMENTS, 
        ORIGINCODE,
        RELATIONSHIP.ID
    from 
        dbo.EMAILADDRESS
        inner join dbo.RELATIONSHIP on EMAILADDRESS.CONSTITUENTID = RELATIONSHIP.RELATIONSHIPCONSTITUENTID
        inner join @TEMPRELATIONSHIPSETS TRS on RELATIONSHIP.RELATIONSHIPSETID = TRS.NEWRELATIONSHIPSETID
    where 
        EMAILADDRESS.CONSTITUENTID = @ID
            and EMAILADDRESS.ISPRIMARY = 1
            and RELATIONSHIP.ISCONTACT = 1

    --terminate secondary relationship emails if they aren't primary or if we've added a new relationship email
    update
        EMAILADDRESS
    set
        DONOTEMAIL = 1,
        ISPRIMARY = 0,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.EMAILADDRESS
        inner join dbo.RELATIONSHIP on EMAILADDRESS.RELATIONSHIPID = RELATIONSHIP.ID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
            and (EMAILADDRESS.ISPRIMARY = 0 or exists (select E.ID
                                                        from dbo.EMAILADDRESS E inner join dbo.RELATIONSHIP R on E.RELATIONSHIPID = R.ID
                                                        where R.RELATIONSHIPCONSTITUENTID = @ID and E.CONSTITUENTID = EMAILADDRESS.CONSTITUENTID))

    --set new emails to primary if there isn't already a primary.  this should only be the case if the email we terminated was previously primary.
    update
        EMAILADDRESS
    set
        ISPRIMARY = 1,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.EMAILADDRESS
        inner join dbo.RELATIONSHIP on EMAILADDRESS.RELATIONSHIPID = RELATIONSHIP.ID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID
            and not exists (select E.ID
                            from dbo.EMAILADDRESS E
                            where E.CONSTITUENTID = EMAILADDRESS.CONSTITUENTID and E.ISPRIMARY = 1)

    --terminate secondary relationships
    set @CONTEXTCACHE = CONTEXT_INFO()

    if @CHANGEAGENTID is not null 
        set CONTEXT_INFO @CHANGEAGENTID

    delete
        RELATIONSHIP
    from
        dbo.RELATIONSHIP
    where
        RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
            and STARTDATE > @MERGERDATE

    if not @CONTEXTCACHE is null 
        set CONTEXT_INFO @CONTEXTCACHE    

    update
        RELATIONSHIP
    set
        ENDDATE = @MERGERDATE,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.RELATIONSHIP
    where
        RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
            and (ENDDATE IS NULL or ENDDATE > @MERGERDATE)

    --terminate secondary job info
    set @CONTEXTCACHE = CONTEXT_INFO()

    if @CHANGEAGENTID is not null 
        set CONTEXT_INFO @CHANGEAGENTID

    delete
        RELATIONSHIPJOBINFO
    from
        dbo.RELATIONSHIPJOBINFO
        inner join RELATIONSHIP on RELATIONSHIPJOBINFO.RELATIONSHIPSETID = RELATIONSHIP.RELATIONSHIPSETID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
            and RELATIONSHIPJOBINFO.STARTDATE > @MERGERDATE

    if not @CONTEXTCACHE is null 
        set CONTEXT_INFO @CONTEXTCACHE

    update
        RELATIONSHIPJOBINFO
    set
        ENDDATE = @MERGERDATE,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.RELATIONSHIPJOBINFO
        inner join RELATIONSHIP on RELATIONSHIPJOBINFO.RELATIONSHIPSETID = RELATIONSHIP.RELATIONSHIPSETID
    where
        RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @SECONDARYORGID
            and (RELATIONSHIPJOBINFO.ENDDATE IS NULL or RELATIONSHIPJOBINFO.ENDDATE > @MERGERDATE)

    set @NEWPARENTORGID = null

    select
        @NEWPARENTORGID = PARENTCORPID
    from
        dbo.ORGANIZATIONDATA
    where
        ID = @SECONDARYORGID
            and @MOVECHILDREN = 0

    if @NEWPARENTORGID is null
        set @NEWPARENTORGID = @ID

    -- end secondary children's previous parent history records
    update
        ORGANIZATIONPARENTHISTORY
    set
        ENDDATE = DateAdd("d", -1, @MERGERDATE),
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.ORGANIZATIONPARENTHISTORY
        inner join dbo.ORGANIZATIONDATA on ORGANIZATIONPARENTHISTORY.CHILDCORPID = ORGANIZATIONDATA.ID
            and ORGANIZATIONPARENTHISTORY.PARENTCORPID = ORGANIZATIONDATA.PARENTCORPID
    where
        ORGANIZATIONDATA.PARENTCORPID = @SECONDARYORGID
            and (ORGANIZATIONPARENTHISTORY.ENDDATE >= @MERGERDATE or ORGANIZATIONPARENTHISTORY.ENDDATE IS NULL)

    -- create new parent history records for secondary children
    insert into dbo.ORGANIZATIONPARENTHISTORY
    (
        ID, 
        CHILDCORPID, 
        PARENTCORPID, 
        STARTDATE, 
        DATEADDED, 
        DATECHANGED, 
        ADDEDBYID, 
        CHANGEDBYID
    )
    select
        newid(),
        ORGANIZATIONDATA.ID,
        @NEWPARENTORGID,
        @MERGERDATE,
        @CURRENTDATE,
        @CURRENTDATE,
        @CHANGEAGENTID,
        @CHANGEAGENTID
    from
        dbo.ORGANIZATIONDATA
    where
        PARENTCORPID = @SECONDARYORGID

    --move secondary child orgs
    update
        ORGANIZATIONDATA
    set
        PARENTCORPID = @NEWPARENTORGID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.ORGANIZATIONDATA
    where
        PARENTCORPID = @SECONDARYORGID

    --make the secondary org a child of the merged org
    exec dbo.USP_ORGANIZATIONMERGER_MAKEORGCHILD
        @CHILDORGANIZATIONID = @SECONDARYORGID,
        @PARENTORGANIZATIONID = @ID,
        @MERGERDATE = @MERGERDATE,
        @CURRENTDATE = @CURRENTDATE,
        @CHANGEAGENTID = @CHANGEAGENTID

    --mark secondary as inactive
    exec dbo.USP_DATAFORMTEMPLATE_EDIT_CONSTITUENTINACTIVEDETAIL @SECONDARYORGID, @CHANGEAGENTID, @INACTIVEREASON, @INACTIVEDETAIL

    --insert record into merger history
    insert into dbo.ORGANIZATIONMERGERHISTORY
    (
        ID,
        SOURCEORG1ID,
        SOURCEORG2ID,
        NEWORGID,
        MERGERDATE,
        DATEADDED,
        DATECHANGED,
        ADDEDBYID,
        CHANGEDBYID
    )
    values
    (
        newid(),
        @PRIMARYORGID,
        @SECONDARYORGID,
        @ID,
        @MERGERDATE,
        @CURRENTDATE,
        @CURRENTDATE,
        @CHANGEAGENTID,
        @CHANGEAGENTID
    )
end try

begin catch
    exec dbo.USP_RAISE_ERROR
    --reenable trigger
    alter table dbo.ORGANIZATIONDATA enable trigger TR_ORGANIZATIONDATA_INSERTUPDATE
    return 1
end catch

alter table dbo.ORGANIZATIONDATA enable trigger TR_ORGANIZATIONDATA_INSERTUPDATE

return 0