USP_MERGETASK_CONSTITUENTEVENTS

Parameters

Parameter Parameter Type Mode Description
@SOURCEID uniqueidentifier IN
@TARGETID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_MERGETASK_CONSTITUENTEVENTS
(
    @SOURCEID uniqueidentifier,
    @TARGETID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier
)
as
    set nocount on;

    declare @DATECHANGED datetime = getdate();
    declare @TABLENAME nvarchar(50);
    declare @ONEPERECORD bit;
    declare @VALUEFIELD nvarchar(50);
    declare @SQL nvarchar(max);

    declare @SOURCEIDSTRING nvarchar(36);
    declare @TARGETIDSTRING nvarchar(36);
    declare @SOURCECONSTITIDSTRING nvarchar(36);
    declare @TARGETCONSTITIDSTRING nvarchar(36);
    declare @CHANGEAGENTIDSTRING nvarchar(36);

    --WI 229133    

    update 
        dbo.EVENTATTACHMENT
    set
        AUTHORID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where 
        AUTHORID = @SOURCEID;    

    -- Determine whether or not there are any redundant

    -- Registrant records between the Target and the source

    -- (i.e. cases where both the Target and the Source are registered

    -- for the same event)

    if exists
    (
        select top(1)
            SOURCE.ID
        from
            dbo.REGISTRANT SOURCE
        inner join
            dbo.REGISTRANT TARGET on SOURCE.EVENTID = TARGET.EVENTID
        where
            SOURCE.CONSTITUENTID = @SOURCEID
            and TARGET.CONSTITUENTID = @TARGETID
    )
    begin
        -- Create a temporary table that holds all

        -- of the redundant source-target registrant

        -- pairs

        create table #REDUNDANTREGISTRANTS
        (
            SRCREGID uniqueidentifier,
            TRGTREGID uniqueidentifier,
            SRCWILLNOTATTEND bit,
            TRGTWILLNOTATTEND bit,
            SRCATTENDED bit,
            TRGTATTENDED bit,
            SRCGUESTOFREGISTRANTID uniqueidentifier,
            TRGTGUESTOFREGISTRANTID uniqueidentifier,
            EVENTID uniqueidentifier
        );

        begin try
            insert into #REDUNDANTREGISTRANTS
            select 
                SOURCE.ID,
                TARGET.ID,
                SOURCE.WILLNOTATTEND,
                TARGET.WILLNOTATTEND,
                SOURCE.ATTENDED,
                TARGET.ATTENDED,
                SOURCE.GUESTOFREGISTRANTID,
                TARGET.GUESTOFREGISTRANTID,
                SOURCE.EVENTID
            from
                dbo.REGISTRANT SOURCE
            inner join
                dbo.REGISTRANT TARGET on SOURCE.EVENTID = TARGET.EVENTID
            where
                SOURCE.CONSTITUENTID = @SOURCEID
                and TARGET.CONSTITUENTID = @TARGETID;

                --Bug 373031 - If any payment exists towards a redundant event registration then throw an error and force manual intervention.

            if exists (select 1 from (
                                        select
                                        (coalesce(count(EVENTREGISTRANTPAYMENTSOURCE.ID),0) + coalesce(count(BATCHREVENUEAPPLICATIONSOURCE.ID),0)) +  
                                        (coalesce(count(EVENTREGISTRANTPAYMENTTARGET.ID),0) + coalesce(count(BATCHREVENUEAPPLICATIONTARGET.ID),0)) as TOTALPAYMENTCOUNT
                                        from #REDUNDANTREGISTRANTS REDUNDANTREGISTRANTS
                                        left join dbo.EVENTREGISTRANTPAYMENT as EVENTREGISTRANTPAYMENTSOURCE on EVENTREGISTRANTPAYMENTSOURCE.REGISTRANTID = REDUNDANTREGISTRANTS.SRCREGID
                                        left join dbo.BATCHREVENUEAPPLICATION as BATCHREVENUEAPPLICATIONSOURCE on BATCHREVENUEAPPLICATIONSOURCE.REGISTRANTID = REDUNDANTREGISTRANTS.SRCREGID
                                        left join dbo.EVENTREGISTRANTPAYMENT as EVENTREGISTRANTPAYMENTTARGET on EVENTREGISTRANTPAYMENTTARGET.REGISTRANTID = REDUNDANTREGISTRANTS.TRGTREGID
                                        left join dbo.BATCHREVENUEAPPLICATION as BATCHREVENUEAPPLICATIONTARGET on BATCHREVENUEAPPLICATIONTARGET.REGISTRANTID = REDUNDANTREGISTRANTS.TRGTREGID
                                        group by REDUNDANTREGISTRANTS.EVENTID
                                    ) as TOTALPAYMENTBYEVENT
                        where TOTALPAYMENTCOUNT >= 1
                        )
            begin
                raiserror('BBERR_EVENTREGISTRANTMERGE_PAYMENTEXISTS',13,1);
            end

            -- Transfer non-conflicting source's registrant records to target

            update dbo.REGISTRANT set
                CONSTITUENTID = @TARGETID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            where
                CONSTITUENTID = @SOURCEID
                and ID not in (select SRCREGID from #REDUNDANTREGISTRANTS);

            -- Mark redundant target registrant as will not attend if the source is marked as will not attend

            update dbo.REGISTRANT set
                WILLNOTATTEND = 1,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            where
                ID in (select TRGTREGID from #REDUNDANTREGISTRANTS where SRCWILLNOTATTEND = 1 and TRGTWILLNOTATTEND = 0);

            -- Mark redundant target registrants as attended if the source is marked as attended

            update dbo.REGISTRANT set
                ATTENDED = 1,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            where
                ID in (select TRGTREGID from #REDUNDANTREGISTRANTS where SRCATTENDED = 1 and TRGTATTENDED = 0);

            -- Bug 240705

            -- If the target record is a guest of someone other than the source record, update RegistrantRegistrationMap

            -- to reference a new unnamed guest as the target will become the host and should no longer be referenced

            -- as a guest in the mapping table

            create table #NEWREGISTRANTS (
                NEWREGISTRANTID uniqueidentifier,
                TARGETREGISTRANTID uniqueidentifier,
                REGISTRANTREGISTRATIONMAPID uniqueidentifier
            )

            insert into #NEWREGISTRANTS
            select
                newID(),
                REDUNDANTREGISTRANTS.TRGTREGID,
                REGISTRANTREGISTRATIONMAP.ID
            from
                #REDUNDANTREGISTRANTS REDUNDANTREGISTRANTS
                inner join dbo.REGISTRANTREGISTRATIONMAP on REDUNDANTREGISTRANTS.TRGTREGID = REGISTRANTREGISTRATIONMAP.REGISTRANTID
                inner join dbo.REGISTRANTREGISTRATION on REGISTRANTREGISTRATIONMAP.REGISTRANTREGISTRATIONID = REGISTRANTREGISTRATION.ID
            where
                REGISTRANTREGISTRATION.REGISTRANTID <> REDUNDANTREGISTRANTS.SRCREGID
                and REGISTRANTREGISTRATION.REGISTRANTID <> REDUNDANTREGISTRANTS.TRGTREGID;

            insert into dbo.REGISTRANT
                (ID, EVENTID, CONSTITUENTID, ATTENDED, WILLNOTATTEND, GUESTOFREGISTRANTID, EVENTSEATINGNOTE, BENEFITSWAIVED, ONLINEREGISTRANT, ISCANCELLED, CUSTOMIDENTIFIER, NOTES, ISWALKIN, USERMARKEDATTENDANCE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED) 
                select
                    NEWREGISTRANTS.NEWREGISTRANTID,
                    REGISTRANT.EVENTID,
                    null,                    -- unnamed guest

                    REGISTRANT.ATTENDED,
                    REGISTRANT.WILLNOTATTEND, 
                    REGISTRANT.GUESTOFREGISTRANTID,
                    REGISTRANT.EVENTSEATINGNOTE,
                    REGISTRANT.BENEFITSWAIVED,
                    REGISTRANT.ONLINEREGISTRANT,
                    REGISTRANT.ISCANCELLED,
                    REGISTRANT.CUSTOMIDENTIFIER,
                    REGISTRANT.NOTES,
                    REGISTRANT.ISWALKIN,
                    REGISTRANT.USERMARKEDATTENDANCE,
                    @CHANGEAGENTID,
                    @CHANGEAGENTID,
                    @DATECHANGED,
                    @DATECHANGED
                from #NEWREGISTRANTS NEWREGISTRANTS
                inner join dbo.REGISTRANT
                    on NEWREGISTRANTS.TARGETREGISTRANTID = REGISTRANT.ID;

            update dbo.REGISTRANTREGISTRATIONMAP set
                REGISTRANTREGISTRATIONMAP.REGISTRANTID = NEWREGISTRANTS.NEWREGISTRANTID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from #NEWREGISTRANTS NEWREGISTRANTS
            where REGISTRANTREGISTRATIONMAP.ID = NEWREGISTRANTS.REGISTRANTREGISTRATIONMAPID;

            -- If the target record is a guest, the target should become the host.

            -- Setting the guestofregistrantid to null will enable future steps, such as guest migration

            -- and registrant registration reassignment. WI 179172

            update dbo.REGISTRANT set
                GUESTOFREGISTRANTID = null,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from
                #REDUNDANTREGISTRANTS
            where
                REGISTRANT.ID = TRGTREGID
                and GUESTOFREGISTRANTID is not null
                and REGISTRANT.CONSTITUENTID is not null;

            -- Constraints on the REGISTRANT table prevent a registrant from being a guest and a host.

            -- Migrate host assignments from the source to the target only if the target is not a guest.

            with GUESTREGISTRANTS as
            (
                select
                    TRGTREG.EVENTID,
                    REDUNDANT.SRCREGID,
                    TRGTREG.ID TRGTREGID
                from 
                    #REDUNDANTREGISTRANTS REDUNDANT
                inner join
                    dbo.REGISTRANT TRGTREG on REDUNDANT.TRGTREGID = TRGTREG.ID
                where 
                    TRGTREG.GUESTOFREGISTRANTID is null
            )
                update dbo.REGISTRANT set 
                    GUESTOFREGISTRANTID = GUESTREGISTRANTS.TRGTREGID,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @DATECHANGED
                from
                    dbo.REGISTRANT
                inner join
                    GUESTREGISTRANTS on REGISTRANT.EVENTID = GUESTREGISTRANTS.EVENTID
                where
                    GUESTOFREGISTRANTID = GUESTREGISTRANTS.SRCREGID

            -- Migrate the registration map for a redundant source registrant to the target registrant if the corresponding

            -- registration is going to be migrated to the target registrant.

            update dbo.REGISTRANTREGISTRATIONMAP set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from
                #REDUNDANTREGISTRANTS
            where
                REGISTRANTID = SRCREGID
                and not exists
                (
                    select top(1) REGISTRANT.ID
                    from dbo.REGISTRANT
                    left outer join dbo.REGISTRANTREGISTRATION
                    on REGISTRANT.ID = REGISTRANTREGISTRATION.REGISTRANTID
                    where REGISTRANT.ID = #REDUNDANTREGISTRANTS.TRGTREGID
                    and
                    (
                        -- if the target is a guest, don't migrate

                        REGISTRANT.GUESTOFREGISTRANTID is not null  
                        -- if the target is the registration, only migrate if the source is a guest in that registration (and the target is not mapped)

                        or (REGISTRANTREGISTRATION.REGISTRANTID is not null and not SRCGUESTOFREGISTRANTID = TRGTREGID) 
                    )
                )
                and not exists
                (
                    select 1 from dbo.REGISTRANTREGISTRATIONMAP
                    where REGISTRANTID = TRGTREGID
                )




            -- Migrate the registration for a redundant source registrant to the target registrant if the target

            -- registrant does not have a registration record and the target record is not a guest 

            -- (guests cannot have registration records) or the source registrant has other registrants using the record.

            update dbo.REGISTRANTREGISTRATION set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from
                #REDUNDANTREGISTRANTS
            where
                REGISTRANTID = SRCREGID
                and 
                (
                    not exists
                    (
                        select top(1) REGISTRANT.ID
                        from dbo.REGISTRANT
                        left outer join dbo.REGISTRANTREGISTRATION
                        on REGISTRANT.ID = REGISTRANTREGISTRATION.REGISTRANTID
                        where REGISTRANT.ID = #REDUNDANTREGISTRANTS.TRGTREGID
                        and
                        (
                            REGISTRANT.GUESTOFREGISTRANTID is not null 
                            or REGISTRANTREGISTRATION.REGISTRANTID is not null
                        )
                    )
                    or
                    exists
                    (
                        select 1 from dbo.REGISTRANTREGISTRATIONMAP
                        where REGISTRANTREGISTRATIONMAP.REGISTRANTREGISTRATIONID = REGISTRANTREGISTRATION.ID
                        and REGISTRANTREGISTRATIONMAP.REGISTRANTID <> #REDUNDANTREGISTRANTS.SRCREGID
                    )
                )

            -- Migrate redundant source registrant benefits if the target registrant does not have a benefit.

            update dbo.REGISTRANTBENEFIT set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from
                #REDUNDANTREGISTRANTS
            where
                REGISTRANTID = SRCREGID
                and not exists (select top(1) ID from dbo.REGISTRANTBENEFIT where REGISTRANTID = TRGTREGID)

            -- Migrate redundant source registrant preferences if the target registrant does not have a preference.

            update dbo.REGISTRANTPREFERENCE set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from
                #REDUNDANTREGISTRANTS
            where
                REGISTRANTID = SRCREGID
                and not exists (select top(1) ID from dbo.REGISTRANTPREFERENCE where REGISTRANTID = TRGTREGID)

            update dbo.REGISTRANTPACKAGE set
                CONSTITUENTID = @TARGETID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            where
                CONSTITUENTID = @SOURCEID

            update dbo.REGISTRANTPACKAGE set
                GUESTOFCONSTITUENTID = @TARGETID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            where
                GUESTOFCONSTITUENTID = @SOURCEID

            -- Migrate redundant source seating if the target registrant does not have a seat record.

            update dbo.EVENTSEATINGSEAT set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from
                #REDUNDANTREGISTRANTS
            where
                REGISTRANTID = SRCREGID
                and not exists (select top(1) ID from dbo.EVENTSEATINGSEAT where REGISTRANTID = TRGTREGID)

            -- Migrate redundant source group membership if the target registrant is not in a group.

            update dbo.EVENTGROUPMEMBER set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from
                #REDUNDANTREGISTRANTS
            where
                REGISTRANTID = SRCREGID
                and not exists (select top(1) ID from dbo.EVENTGROUPMEMBER where REGISTRANTID = TRGTREGID)

            -- Migrate redundant source sales order registrants to the target registrants

            update dbo.SALESORDERITEMEVENTREGISTRATION set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from
                #REDUNDANTREGISTRANTS
            where
                REGISTRANTID = SRCREGID;

            /*
              WI 166678, If the source and the target are both registered for the same pre-registered program
              set the source registrant row constituentid to null and set the guestofregistrantid = target registrant id
              then before the cleanup cursor delete these specific rows from the #REDUNDANTREGISTRATIONS table
              because these registrations are now valid as guest registrations of the target constituent.
              this work is necessary due to the one to one constraint for the REGISTRANTID FK column on the
              SALESORDERITEMTICKETREGISTRANT table.
            */

            declare @REDUNDANTPREREGISTEREDREGISTRANTS table (SRCID uniqueidentifier, TGTID uniqueidentifier);

            insert into @REDUNDANTPREREGISTEREDREGISTRANTS (SRCID, TGTID)
                select
                    SRCREGID,
                    TRGTREGID
                from dbo.REGISTRANT REG
                inner join dbo.SALESORDERITEMTICKETREGISTRANT
                    on REG.ID = SALESORDERITEMTICKETREGISTRANT.REGISTRANTID
                inner join #REDUNDANTREGISTRANTS 
                    on SALESORDERITEMTICKETREGISTRANT.REGISTRANTID = #REDUNDANTREGISTRANTS.SRCREGID;


            /*
                Update guests of the source registrant to avoid CK_REGISTRANT_VALIDGUESTCOUNT 
                error when updating the source record in the next update statement. This will
                update both named and unnamed registrants.
            */

            update REG set
                GUESTOFREGISTRANTID = RPR.TGTID
            from dbo.REGISTRANT REG
            inner join @REDUNDANTPREREGISTEREDREGISTRANTS RPR
                on RPR.SRCID = REG.GUESTOFREGISTRANTID;

            update REG set 
                CONSTITUENTID = null,
                GUESTOFREGISTRANTID = RPR.TGTID
            from dbo.REGISTRANT REG
            inner join @REDUNDANTPREREGISTEREDREGISTRANTS RPR
                on RPR.SRCID = REG.ID;

            /*
                WI 168312, If the target is a guest of the source and the source is not attending
                set GUESTOFREGISTRANT = null for the target registrant record and delete the source 
                registrant record
            */

            declare @TARGETGUESTOFSOURCE table (TGTID uniqueidentifier);

            insert into @TARGETGUESTOFSOURCE (TGTID)
                select
                    TRGTREGID
                from 
                    #REDUNDANTREGISTRANTS
                where
                    SRCREGID not in (select REGISTRANTID from SALESORDERITEMTICKETREGISTRANT)
                    and TRGTGUESTOFREGISTRANTID = SRCREGID;

            update REG set
                GUESTOFREGISTRANTID = null
            from dbo.REGISTRANT REG
            inner join @TARGETGUESTOFSOURCE TGS
                on REG.ID = TGS.TGTID;

            --WI 166654

            update dbo.CREDITITEMEVENTREGISTRATION set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from
                #REDUNDANTREGISTRANTS
            where
                REGISTRANTID = SRCREGID;

            -- Check comment block above regarding WI 166678 for explanation of this delete        

            delete from #REDUNDANTREGISTRANTS
            where exists(
                select 
                    1
                from 
                    @REDUNDANTPREREGISTEREDREGISTRANTS
                where 
                    SRCID = SRCREGID
                    and TGTID = TRGTREGID
             );


            -- This cursor is used several times to migrate redundant source registrant data to the target registrant

            declare @SRCREGID uniqueidentifier;
            declare @TRGTREGID uniqueidentifier;
            declare REDUNDANTREGISTRANTCURSOR cursor local fast_forward for    select SRCREGID, TRGTREGID from #REDUNDANTREGISTRANTS;

            -- Migrate any Registrant attributes from the source registrant records to the target registrant records

            if dbo.UFN_ATTRIBUTECATEGORY_DEFINEDFORRECORDTYPE('Registrant') = 1
            begin        
                set @CHANGEAGENTIDSTRING = convert(nvarchar(36), @CHANGEAGENTID);
                set @SOURCECONSTITIDSTRING = convert(nvarchar(36), @SOURCEID);
                set @TARGETCONSTITIDSTRING = convert(nvarchar(36), @TARGETID);

                declare ATTRTABLECURSOR cursor local fast_forward for
                    select 
                        TABLECATALOG.TABLENAME, 
                        ATTRIBUTECATEGORY.ONLYALLOWONEPERRECORD,
                        VALUECOLUMNNAME
                    from
                        dbo.ATTRIBUTECATEGORY
                    inner join
                        dbo.TABLECATALOG on TABLECATALOG.ID = TABLECATALOGID
                    inner join
                        dbo.ATTRIBUTERECORDTYPE on ATTRIBUTERECORDTYPE.ID = ATTRIBUTERECORDTYPEID
                    inner join
                        dbo.RECORDTYPE on RECORDTYPE.ID = RECORDTYPEID
                    where
                        RECORDTYPE.NAME = 'Registrant';

                open REDUNDANTREGISTRANTCURSOR;
                fetch next from REDUNDANTREGISTRANTCURSOR into @SRCREGID, @TRGTREGID;

                while @@fetch_status = 0
                begin
                    set @SOURCEIDSTRING = convert(nvarchar(36), @SRCREGID);
                    set @TARGETIDSTRING = convert(nvarchar(36), @TRGTREGID);

                    open ATTRTABLECURSOR;
                    fetch next from ATTRTABLECURSOR into @TABLENAME, @ONEPERECORD, @VALUEFIELD;

                    while @@fetch_status = 0
                    begin
                        if @ONEPERECORD = 1
                        begin
                            set @SQL = '
                            if not exists 
                            (
                                select top(1) ID 
                                from dbo.' + @TABLENAME + '
                                where ID = ''' + @TARGETIDSTRING + '''
                            )
                                insert into dbo.' + @TABLENAME + '
                                    (ID, ' + @VALUEFIELD + ', COMMENT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                                select
                                    ''' + @TARGETIDSTRING + ''',
                                    ' + @VALUEFIELD +',
                                    COMMENT,
                                    ADDEDBYID,
                                    ''' + @CHANGEAGENTIDSTRING + ''',
                                    DATEADDED,
                                    ''' + convert(nvarchar,getdate()) + '''
                                from
                                    dbo.' + @TABLENAME + '
                                where
                                    ID = ''' + @SOURCEIDSTRING + ''';'
                        end
                        else
                        begin
                            set @SQL = '                                
                            update dbo.' + @TABLENAME + '
                            set REGISTRANTID = ''' + @TARGETIDSTRING + ''', CHANGEDBYID = ''' + @CHANGEAGENTIDSTRING + ''', DATECHANGED = ''' + convert(nvarchar,getdate()) + '''
                            where REGISTRANTID = ''' + @SOURCEIDSTRING + ''';'
                        end

                        -- Update any registrant constituent-type attributes to point from the source to the target

                        if @VALUEFIELD = 'CONSTITUENTVALUEID'
                        begin
                            set @SQL = @SQL + ' 
                            update dbo.' + @TABLENAME +'
                            set CONSTITUENTVALUEID = ''' + @TARGETCONSTITIDSTRING + ''', CHANGEDBYID = ''' + @CHANGEAGENTIDSTRING + ''', DATECHANGED = ''' + convert(nvarchar,getdate()) + '''
                            where CONSTITUENTVALUEID = ''' + @SOURCECONSTITIDSTRING + ''';'
                        end

                        exec(@SQL);

                        fetch next from ATTRTABLECURSOR into @TABLENAME, @ONEPERECORD, @VALUEFIELD;
                    end

                    close ATTRTABLECURSOR;
                    fetch next from REDUNDANTREGISTRANTCURSOR into @SRCREGID, @TRGTREGID;
                end

                close REDUNDANTREGISTRANTCURSOR;
                deallocate ATTRTABLECURSOR;
            end

/* Friends Asking Friends data */

            -- combine comments that made to 2 different registrants

            update dbo.FAFCOMMENTS set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from #REDUNDANTREGISTRANTS
            where REGISTRANTID = SRCREGID

            -- combine rss feeds that added to 2 different registrants

            update dbo.FAFRSSFEED set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from #REDUNDANTREGISTRANTS
            where REGISTRANTID = SRCREGID

            -- combine offline gift link entered by registrant

            update dbo.REVENUEOFFLINEDONATION set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from #REDUNDANTREGISTRANTS
            where REGISTRANTID = SRCREGID

            -- combine network post

            update dbo.FAFEVENTSOCIALNETWORKPOST set
                REGISTRANTID = TRGTREGID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from #REDUNDANTREGISTRANTS
            where REGISTRANTID = SRCREGID        

            --registrant donation 

            create table #REDUNDANTREGISTRANTDONATION
            (
                SRCREGID uniqueidentifier,
                TRTREGID uniqueidentifier,
                SRCVOLDONATION money,
                TRTVOLDONATION money
            );

            insert into #REDUNDANTREGISTRANTDONATION
            select 
                RR.SRCREGID,
                RR.TRGTREGID,
                isnull(RDS.VOLUNTARYDONATION, 0),
                isnull(RDT.VOLUNTARYDONATION, 0)
            from #REDUNDANTREGISTRANTS RR
            left join dbo.REGISTRANTDONATION RDS on RDS.REGISTRANTID = RR.SRCREGID
            left join dbo.REGISTRANTDONATION RDT on RDT.REGISTRANTID = RR.TRGTREGID

            update dbo.REGISTRANTDONATION set
                VOLUNTARYDONATION = SRCVOLDONATION + TRTVOLDONATION,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from #REDUNDANTREGISTRANTDONATION 
            where REGISTRANTID = TRTREGID

            drop table #REDUNDANTREGISTRANTDONATION

            update RET set
                ISPRIVATE = case when RE.ISPRIVATE = 1 then RE.ISPRIVATE else RET.ISPRIVATE end,
                ALLOWADMINACCESSHQ = case when RE.ALLOWADMINACCESSHQ = 0 then RE.ALLOWADMINACCESSHQ else RET.ALLOWADMINACCESSHQ end,
                CREDITCARDID = coalesce(RET.CREDITCARDID, RE.CREDITCARDID, null),
                ORGANIZATIONCONSTITUENTID = coalesce(RET.ORGANIZATIONCONSTITUENTID, RE.ORGANIZATIONCONSTITUENTID, null),
                ISDASHBOARDHELPERVISIBLE = case when RE.ISDASHBOARDHELPERVISIBLE = 1 then RE.ISDASHBOARDHELPERVISIBLE else RET.ISDASHBOARDHELPERVISIBLE end,
                LOCALCORPPOSTCODE = case when RET.LOCALCORPPOSTCODE = '' then RE.LOCALCORPPOSTCODE else RET.LOCALCORPPOSTCODE end,
                LOCALCORPID = coalesce(RET.LOCALCORPID, RE.LOCALCORPID, null),
                ALLOWOTHERPARTICIPANTSCONTACTME = case when RE.ALLOWOTHERPARTICIPANTSCONTACTME = 0 then RE.ALLOWOTHERPARTICIPANTSCONTACTME else RET.ALLOWOTHERPARTICIPANTSCONTACTME end ,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @DATECHANGED
            from REGISTRANTEXTENSION RET
            join #REDUNDANTREGISTRANTS RR on RET.REGISTRANTID = RR.TRGTREGID
            left join REGISTRANTEXTENSION RE on RR.SRCREGID = RE.REGISTRANTID
            where RET.REGISTRANTID = RR.TRGTREGID

      if exists(select ID from dbo.STORY S join #REDUNDANTREGISTRANTS RR on S.REGISTRANTID = RR.TRGTREGID)
      begin
        update dbo.STORY set
              STORYTEXT =  case when isnull(STORYTEXT, '') = '' then isnull((select STORYTEXT from dbo.STORY where REGISTRANTID = SRCREGID), '') else STORYTEXT end,
              FAFIMAGESID = case when FAFIMAGESID is null then (select FAFIMAGESID from dbo.STORY where REGISTRANTID = SRCREGID) else FAFIMAGESID end,
              IMAGECODE = case when IMAGECODE is null then (select IMAGECODE from dbo.STORY where REGISTRANTID = SRCREGID) else IMAGECODE end,
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @DATECHANGED
        from #REDUNDANTREGISTRANTS 
        where REGISTRANTID = SRCREGID
      end
      else
        update dbo.STORY set
          REGISTRANTID = TRGTREGID,
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @DATECHANGED
        from #REDUNDANTREGISTRANTS 
        where REGISTRANTID = SRCREGID

     ;merge into dbo.FAFEVENTCOMMUNICATIONCHANNEL as Target
     using 
     (
        select FCS.TYPEGUID as SRCGID, R.SRCREGID, FC.TYPEGUID as TRGID, R.TRGTREGID from #REDUNDANTREGISTRANTS R
        left join dbo.FAFEVENTCOMMUNICATIONCHANNEL FCS on R.SRCREGID = FCS.TYPEGUID and FCS.TYPECODE = 0
        left join dbo.FAFEVENTCOMMUNICATIONCHANNEL FC on R.TRGTREGID = FC.TYPEGUID and FC.TYPECODE = 0

     ) as source on source.SRCREGID = Target.TYPEGUID
     when matched and source.TRGID is null then
              update set 
                  TYPEGUID = source.TRGTREGID,
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @DATECHANGED
          when matched then
              delete;

     -- friendly URL move or delete

     ;merge into dbo.VanityURL as Target
      using 
      (
              select R.SRCREGID, R.TRGTREGID, V1.ID SRCPID, V2.ID TRGTPID
              from #REDUNDANTREGISTRANTS R
              left join dbo.FAFFRIENDLYURLPARAMS FAF ON FAF.PARTICIPANTID = R.SRCREGID AND FAF.PAGETYPE = 0
              left join dbo.VanityURL V1 on V1.RealmID = FAF.SEQUENCEID and V1.RealmTypeID = 7
              left join dbo.FAFFRIENDLYURLPARAMS FAF2 ON FAF2.PARTICIPANTID = R.TRGTREGID AND FAF.PAGETYPE = 0
              left join dbo.VanityURL V2 on V2.RealmID = FAF2.SEQUENCEID and V2.RealmTypeID = 7

      ) as source on source.SRCPID = Target.ID and source.TRGTPID is not null
      when matched then
              delete;

      ;merge into dbo.FAFFRIENDLYURLPARAMS as target
      using 
      (
              select R.SRCREGID, R.TRGTREGID, FAF.ID SRCPID, FAF2.ID TRGTPID
              from #REDUNDANTREGISTRANTS R
              left join dbo.FAFFRIENDLYURLPARAMS FAF ON FAF.PARTICIPANTID = R.SRCREGID AND FAF.PAGETYPE = 0
              left join dbo.FAFFRIENDLYURLPARAMS FAF2 ON FAF2.PARTICIPANTID = R.TRGTREGID AND FAF.PAGETYPE = 0

      ) as source on source.SRCPID = target.ID 
      when matched and source.TRGTPID is null then
              update set 
                  PARTICIPANTID = source.TRGTREGID,
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @DATECHANGED
          when matched then
              delete;


/* end Friends Asking Friends data */

            -- Now that the child records for the redundant registrant records have been migrated,

            -- delete the redundant source registrants.

            open REDUNDANTREGISTRANTCURSOR;
            fetch next from REDUNDANTREGISTRANTCURSOR into @SRCREGID, @TRGTREGID;

            while @@fetch_status = 0
            begin
                exec dbo.USP_REGISTRANT_DELETE @SRCREGID, @CHANGEAGENTID;
                fetch next from REDUNDANTREGISTRANTCURSOR into @SRCREGID, @TRGTREGID;
            end

            close REDUNDANTREGISTRANTCURSOR;
            deallocate REDUNDANTREGISTRANTCURSOR;        


            -- Finally, drop the redundant registrant table

            drop table #REDUNDANTREGISTRANTS;
        end try
        begin catch
            drop table #REDUNDANTREGISTRANTS;

            declare @ERRORMESSAGE nvarchar(4000);
            declare @ERRORSEVERITY int;
            declare @ERRORSTATE int;

            select
                @ERRORMESSAGE = error_message(),
                @ERRORSEVERITY = error_severity(),
                @ERRORSTATE = error_state();

            -- Use RAISERROR inside the CATCH block to return error information about the original error that caused

            -- execution to jump to the CATCH block.

            raiserror(@ERRORMESSAGE, @ERRORSEVERITY, @ERRORSTATE);
        end catch
    end
    else
    begin
        -- There were no redundant registrants so the operation is much simpler

        update dbo.REGISTRANT set
            CONSTITUENTID = @TARGETID,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @DATECHANGED
        where
            CONSTITUENTID = @SOURCEID;

        update dbo.REGISTRANT set
            GUESTOFREGISTRANTID = @TARGETID,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @DATECHANGED
        where
            GUESTOFREGISTRANTID = @SOURCEID;

        update dbo.REGISTRANTPACKAGE set
            CONSTITUENTID = @TARGETID,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @DATECHANGED
        where
            CONSTITUENTID = @SOURCEID

        update dbo.REGISTRANTPACKAGE set
            GUESTOFCONSTITUENTID = @TARGETID,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @DATECHANGED
        where
            GUESTOFCONSTITUENTID = @SOURCEID

        -- Migrate any Registrant attributes from the source registrant records to the target registrant records

        set @CHANGEAGENTIDSTRING = convert(nvarchar(36), @CHANGEAGENTID);
        set @SOURCECONSTITIDSTRING = convert(nvarchar(36), @SOURCEID);
        set @TARGETCONSTITIDSTRING = convert(nvarchar(36), @TARGETID);

        declare ATTRTABLECURSOR cursor local fast_forward for
            select 
                TABLECATALOG.TABLENAME, 
                VALUECOLUMNNAME
            from
                dbo.ATTRIBUTECATEGORY
            inner join
                dbo.TABLECATALOG on TABLECATALOG.ID = TABLECATALOGID
            inner join
                dbo.ATTRIBUTERECORDTYPE on ATTRIBUTERECORDTYPE.ID = ATTRIBUTERECORDTYPEID
            inner join
                dbo.RECORDTYPE on RECORDTYPE.ID = RECORDTYPEID
            where
                RECORDTYPE.NAME = 'Registrant';

        open ATTRTABLECURSOR;
        fetch next from ATTRTABLECURSOR into @TABLENAME, @VALUEFIELD;

        while @@fetch_status = 0
        begin
            if @VALUEFIELD = 'CONSTITUENTVALUEID'
            begin
                set @SQL = ' 
                update dbo.' + @TABLENAME +'
                set CONSTITUENTVALUEID = ''' + @TARGETCONSTITIDSTRING + ''', CHANGEDBYID = ''' + @CHANGEAGENTIDSTRING + ''', DATECHANGED = ''' + convert(nvarchar,getdate()) + '''
                where CONSTITUENTVALUEID = ''' + @SOURCECONSTITIDSTRING + ''';'

                exec(@SQL);
            end        

            fetch next from ATTRTABLECURSOR into @TABLENAME, @VALUEFIELD;
        end    

        close ATTRTABLECURSOR;
        deallocate ATTRTABLECURSOR;
    end;

    -- Event Coordinator

    declare @EVENTSWITHREDUNDANTCOORDINATORS table
    (
        EVENTID uniqueidentifier,
        ISPRIMARY bit
    )

    insert into @EVENTSWITHREDUNDANTCOORDINATORS
    select 
        a.EVENTID,
        a.ISPRIMARY
    from 
        dbo.EVENTCOORDINATOR a
        inner join dbo.EVENTCOORDINATOR b on a.EVENTID = b.EVENTID
    where 
        a.CONSTITUENTID = @SOURCEID
        and b.CONSTITUENTID = @TARGETID

    update dbo.EVENTCOORDINATOR set
        CONSTITUENTID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        CONSTITUENTID = @SOURCEID
        and EVENTID not in (select EVENTID from @EVENTSWITHREDUNDANTCOORDINATORS)

    delete from 
        dbo.EVENTCOORDINATOR
    where
        CONSTITUENTID = @SOURCEID    

    update dbo.EVENTCOORDINATOR set
        ISPRIMARY = 1,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        CONSTITUENTID = @TARGETID
        and EVENTID in (select EVENTID from @EVENTSWITHREDUNDANTCOORDINATORS where ISPRIMARY = 1)

    update dbo.EVENTINSTRUCTOR set
        CONSTITUENTID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        CONSTITUENTID = @SOURCEID
        and ID not in
        (
            select a.ID
            from dbo.EVENTINSTRUCTOR a
            inner join dbo.EVENTINSTRUCTOR b
            on a.EVENTID = b.EVENTID
            where a.CONSTITUENTID = @SOURCEID
            and b.CONSTITUENTID = @TARGETID
        )

    update dbo.EVENTNOTE set
        AUTHORID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        AUTHORID = @SOURCEID

    update dbo.EVENTTASK set
        OWNERID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        OWNERID = @SOURCEID

    -- Move invitee records only if the target does not already have an invitee record for the same event

    update dbo.INVITEE set
        CONSTITUENTID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        CONSTITUENTID = @SOURCEID
        and ID not in
        (
            select a.ID
            from dbo.INVITEE a
            inner join dbo.INVITEE b
            on a.EVENTID = b.EVENTID
            where a.CONSTITUENTID = @SOURCEID
            and b.CONSTITUENTID = @TARGETID
        );

    -- Migrate travel and lodging preferences if they don't already exist for the target

    update dbo.REGISTRANTLODGING set
        REGISTRANTCONSTITUENTID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        REGISTRANTCONSTITUENTID = @SOURCEID 
        and ID not in
        (
            select a.ID
            from dbo.REGISTRANTLODGING a
            inner join dbo.REGISTRANTLODGING b
            on a.EVENTID = b.EVENTID
            where a.REGISTRANTCONSTITUENTID = @SOURCEID
            and b.REGISTRANTCONSTITUENTID = @TARGETID
        );

    update dbo.REGISTRANTTRAVEL set
        REGISTRANTCONSTITUENTID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        REGISTRANTCONSTITUENTID = @SOURCEID
        and ID not in
        (
            select a.ID
            from dbo.REGISTRANTTRAVEL a
            inner join dbo.REGISTRANTTRAVEL b
            on a.MAINEVENTID = b.MAINEVENTID
            where a.REGISTRANTCONSTITUENTID = @SOURCEID
            and b.REGISTRANTCONSTITUENTID = @TARGETID
        );

    -- In the case that both the target and the source had invitee records for the same event,

    -- make sure the target's invitee record is marked as declined if either the target

    -- record or the source record is marked as declined

    with DECLINEINVITES as
    (
        select
            b.ID
        from
            dbo.INVITEE a
        inner join
            dbo.INVITEE b on a.EVENTID = b.EVENTID
        where
            a.CONSTITUENTID = @SOURCEID
            and b.CONSTITUENTID = @TARGETID
            and a.DECLINED = 1
            and b.DECLINED = 0
    )
    update dbo.INVITEE set
        DECLINED = 1,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        ID in (select ID from DECLINEINVITES);

    -- In the case that both the target and the source had invitee records for the same event,

    -- make sure that the target record has the most-recent invitation-sent-on-date

    with UPDATEINVITES as
    (
        select
            b.ID,
            a.INVITATIONSENTON
        from
            dbo.INVITEE a
        inner join
            dbo.INVITEE b on a.EVENTID = b.EVENTID
        where
            a.CONSTITUENTID = @SOURCEID
            and b.CONSTITUENTID = @TARGETID
            and a.INVITATIONSENTON > b.INVITATIONSENTON
    )
    update dbo.INVITEE set 
        INVITEE.INVITATIONSENTON = UPDATEINVITES.INVITATIONSENTON, 
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    from 
        dbo.INVITEE
    inner join UPDATEINVITES on INVITEE.ID = UPDATEINVITES.ID;

    --Invitees can be invited to an event via a single household invite (Send one invite per household)

    --We store the CONSTITUENTID of the household member that did receive the invite for the household

    --on each other household member in the same invitee list.  

    --We need to update this CONSTITUENTID from source to target.

    update dbo.INVITEE
    set
        INVITEE.INVITATIONRECIPIENTCONSTITUENTID = @TARGETID
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        INVITEE.INVITATIONRECIPIENTCONSTITUENTID = @SOURCEID;

    -- In the case that both the target and the source had invitee records for the same event,

    -- if the source invitee was flagged for resend and the target invitee was not, 

    -- make sure the source invitee's resend record is moved to the target invitee

    with UPDATERESEND as
    (
        select a.ID SINVID, b.ID as TINVID, INVITEERESEND.INVITATIONID
        from dbo.INVITEE a
        inner join dbo.INVITEE b    
        on a.EVENTID = b.EVENTID
        inner join INVITEERESEND
        on a.ID = INVITEERESEND.INVITEEID
        where a.CONSTITUENTID = @SOURCEID
        and b.CONSTITUENTID = @TARGETID
    )
    update dbo.INVITEERESEND set 
        INVITEEID = UPDATERESEND.TINVID, 
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    from
        dbo.INVITEERESEND
    inner join
        UPDATERESEND on INVITEERESEND.INVITEEID = UPDATERESEND.SINVID
    where
        not exists (select ID from dbo.INVITEERESEND where INVITEEID = UPDATERESEND.TINVID and INVITATIONID = UPDATERESEND.INVITATIONID)

    update dbo.INVITEEHISTORY set
        CONSTITUENTID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        CONSTITUENTID = @SOURCEID

    -- Delete the redundant source invitee records

    declare @CONTEXTCACHE varbinary(128);
    set @CONTEXTCACHE = CONTEXT_INFO();

    if not @CHANGEAGENTID is null
        set CONTEXT_INFO @CHANGEAGENTID;

    delete from
        dbo.INVITEE
    where
        CONSTITUENTID = @SOURCEID
        and ID in
        (
            select a.ID
            from dbo.INVITEE a
            inner join dbo.INVITEE b
            on a.EVENTID = b.EVENTID
            where a.CONSTITUENTID = @SOURCEID
            and b.CONSTITUENTID = @TARGETID
        )

    if not @CONTEXTCACHE is null
        set CONTEXT_INFO @CONTEXTCACHE;

    update dbo.EVENT set
        EVENTLOCATIONCONTACTID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        EVENTLOCATIONCONTACTID = @SOURCEID

  update dbo.EVENTSPEAKER set
    CONSTITUENTID = @TARGETID,
    CHANGEDBYID = @CHANGEAGENTID,
    DATECHANGED = @DATECHANGED
  where
    CONSTITUENTID = @SOURCEID

    update dbo.EVENTEXPENSE set
        VENDORID = @TARGETID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @DATECHANGED
    where
        VENDORID = @SOURCEID

    -- Update event attribute records that have a "Constituent" data type that reference the source so that they reference the target

    declare @ATTRTABLENAME nvarchar(50);
    declare @ATTRVALUEFIELD nvarchar(50);

    declare ATTRTABLECURSOR cursor local fast_forward for
        select 
            TABLECATALOG.TABLENAME, 
            VALUECOLUMNNAME
        from
            dbo.ATTRIBUTECATEGORY
        inner join
            dbo.TABLECATALOG on TABLECATALOG.ID = TABLECATALOGID
        inner join
            dbo.ATTRIBUTERECORDTYPE on ATTRIBUTERECORDTYPE.ID = ATTRIBUTERECORDTYPEID
        inner join
            dbo.RECORDTYPE on RECORDTYPE.ID = RECORDTYPEID
        where
            RECORDTYPE.NAME = 'Event';

    open ATTRTABLECURSOR;
    fetch next from ATTRTABLECURSOR into @ATTRTABLENAME, @ATTRVALUEFIELD;

    while @@fetch_status = 0
    begin
        if @ATTRVALUEFIELD = 'CONSTITUENTVALUEID'
        begin
            set @SQL = ' 
            update dbo.' + @ATTRTABLENAME +'
            set CONSTITUENTVALUEID = ''' + @TARGETCONSTITIDSTRING + ''', CHANGEDBYID = ''' + @CHANGEAGENTIDSTRING + ''', DATECHANGED = ''' + convert(nvarchar,getdate()) + '''
            where CONSTITUENTVALUEID = ''' + @SOURCECONSTITIDSTRING + ''';'

            exec(@SQL);
        end        

        fetch next from ATTRTABLECURSOR into @TABLENAME, @VALUEFIELD;
    end

    close ATTRTABLECURSOR;
    deallocate ATTRTABLECURSOR;

    --update FAF data 

    -- event sponsorship

    if exists (select top(1) SOURCE.ID from dbo.EVENTSPONSOR SOURCE inner join dbo.EVENTSPONSOR TARGET on SOURCE.EVENTID = TARGET.EVENTID
            where SOURCE.CONSTITUENTID = @SOURCEID and TARGET.CONSTITUENTID = @TARGETID )
    begin
        create table #REDUNDANTSPONSOR
        (
            SRCSPONSORID uniqueidentifier,
            TRGTSPONSORID uniqueidentifier,
            SRCVOLUNTARYDONATION money,
            TRGTVOLUNTARYDONATION money
        );

        insert into #REDUNDANTSPONSOR
            select 
                SOURCE.ID,
                TARGET.ID,
                isnull(SOURCEDON.VOLUNTARYDONATION, 0),
                isnull(TARGETDON.VOLUNTARYDONATION, 0)
            from
                dbo.EVENTSPONSOR SOURCE
            left join dbo.SPONSORDONATION SOURCEDON on SOURCEDON.SPONSORID = SOURCE.ID
            inner join dbo.EVENTSPONSOR TARGET on SOURCE.EVENTID = TARGET.EVENTID
            left join dbo.SPONSORDONATION TARGETDON on TARGETDON.SPONSORID = TARGET.ID
            where
                SOURCE.CONSTITUENTID = @SOURCEID
                and TARGET.CONSTITUENTID = @TARGETID;

        -- update all records from this source id to target id that are not in the redundant record (could be from other events)

        update dbo.EVENTSPONSOR set
            CONSTITUENTID = @TARGETID,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @DATECHANGED
        where
            CONSTITUENTID = @SOURCEID 
            and ID not in (select SRCSPONSORID from #REDUNDANTSPONSOR);

        update dbo.SPONSORDONATION set
            VOLUNTARYDONATION = VOLUNTARYDONATION + RSP.SRCVOLUNTARYDONATION,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @DATECHANGED
        from #REDUNDANTSPONSOR RSP 
        where ID = RSP.TRGTSPONSORID;

        delete EV
        from dbo.EVENTSPONSOR EV
        join #REDUNDANTSPONSOR T ON EV.ID = T.SRCSPONSORID

        drop table #REDUNDANTSPONSOR;

    end
    else
        update dbo.EVENTSPONSOR set
            CONSTITUENTID = @TARGETID,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @DATECHANGED
        where CONSTITUENTID = @SOURCEID;


    --- FAF participant address book

    exec dbo.USP_MERGE_CONSTITUENT_WITHFAFDATA @SOURCEID=@SOURCEID, @TARGETID=@TARGETID, @CHANGEAGENTID=@CHANGEAGENTID, @DATECHANGED=@DATECHANGED


    return 0;