USP_MERGETASK_CONSTITUENTPHONE

Parameters

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

Definition

Copy


                CREATE procedure dbo.USP_MERGETASK_CONSTITUENTPHONE
                (
                    @SOURCEID uniqueidentifier,
                    @TARGETID uniqueidentifier,
                    @CHANGEAGENTID uniqueidentifier,
                    @PRIMARYCRITERIA int = 0
                )
                as
                    set nocount on;

                    declare @CHANGEDATE datetime = getdate();

                    if exists(
                        select ID
                        from dbo.PHONE
                        where CONSTITUENTID = @SOURCEID
                    )
                    begin

                        --Store the primary phone indicators for later access
                        declare @SOURCEPRIMARYID as uniqueidentifier;
                        select @SOURCEPRIMARYID = ID
                        from dbo.PHONE
                        where CONSTITUENTID = @SOURCEID and ISPRIMARY = 1;

                        declare @TARGETPRIMARYID as uniqueidentifier;
                        select @TARGETPRIMARYID = ID
                        from dbo.PHONE
                        where CONSTITUENTID = @TARGETID and ISPRIMARY = 1;

                        --Wipe the source primary phone indicators before the merge
                        --to keep from violating any constraints
                        update dbo.PHONE
                        set ISPRIMARY = 0, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
                        where ID in (@SOURCEPRIMARYID, @TARGETPRIMARYID)
                        and RELATIONSHIPID is null;

                        declare @DUPLICATEPHONES table (SOURCE_PHONEID uniqueidentifier, TARGET_PHONEID uniqueidentifier,
                            SOURCE_DONOTCALL bit, SOURCE_DONOTCALLREASONCODEID uniqueidentifier, SOURCE_ISCONFIDENTIAL bit, SOURCE_DONOTTEXT bit);

                        insert into @DUPLICATEPHONES
                        select
                            SOURCE_PHONE.ID,
                            TARGET_PHONE.ID,
                            SOURCE_PHONE.DONOTCALL,
                            SOURCE_PHONE.DONOTCALLREASONCODEID,
                            SOURCE_PHONE.ISCONFIDENTIAL,
                            SOURCE_PHONE.DONOTTEXT
                        from
                            dbo.PHONE SOURCE_PHONE
                        inner join
                            dbo.PHONE TARGET_PHONE on TARGET_PHONE.CONSTITUENTID = @TARGETID
                        where
                            SOURCE_PHONE.CONSTITUENTID = @SOURCEID and
                            SOURCE_PHONE.RELATIONSHIPID is null and
                            SOURCE_PHONE.NUMBER = TARGET_PHONE.NUMBER and
                            ((SOURCE_PHONE.PHONETYPECODEID = TARGET_PHONE.PHONETYPECODEID) or (SOURCE_PHONE.PHONETYPECODEID is null and TARGET_PHONE.PHONETYPECODEID is null));

                        --move all of the source constit's phones over to
                        --the target constit
                        update dbo.PHONE
                        set CONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
                        where CONSTITUENTID = @SOURCEID
                            and RELATIONSHIPID is null
                            and ID not in (select SOURCE_PHONEID from @DUPLICATEPHONES);

                        --Update some specific items that wouldn't otherwise be carried over on duplicate phones
                        update TARGET set
                            DONOTCALL =
                                case
                                    when TARGET.DONOTCALL = 1
                                        then 1
                                    when exists(select 1 from @DUPLICATEPHONES DUPE where DUPE.TARGET_PHONEID = TARGET.ID and DUPE.SOURCE_DONOTCALL = 1)
                                        then 1
                                    else
                                        0
                                end,
                            DONOTCALLREASONCODEID =
                                case
                                    when TARGET.DONOTCALLREASONCODEID is not null
                                        then TARGET.DONOTCALLREASONCODEID
                                    else
                                        (select top 1 DUPE.SOURCE_DONOTCALLREASONCODEID from @DUPLICATEPHONES DUPE where TARGET_PHONEID = TARGET.ID order by DUPE.SOURCE_DONOTCALLREASONCODEID desc)
                                end,
                            ISCONFIDENTIAL = 
                                case
                                    when TARGET.ISCONFIDENTIAL = 1
                                        then 1
                                    when exists(select 1 from @DUPLICATEPHONES DUPE where TARGET_PHONEID = TARGET.ID and DUPE.SOURCE_ISCONFIDENTIAL = 1)
                                        then 1
                                    else
                                        0
                                end,
                            DONOTTEXT =
                                case
                                    when TARGET.DONOTTEXT = 1
                                        then 1
                                    when exists(select 1 from @DUPLICATEPHONES DUPE where DUPE.TARGET_PHONEID = TARGET.ID and DUPE.SOURCE_DONOTTEXT = 1)
                                        then 1
                                    else
                                        0
                                end,
                            CHANGEDBYID = @CHANGEAGENTID,
                            DATECHANGED = @CHANGEDATE
                        from
                            dbo.PHONE TARGET
                        where
                            TARGET.CONSTITUENTID = @TARGETID;

                        --Select the primary phone
                        if @PRIMARYCRITERIA = 0 and @TARGETPRIMARYID is not null
                        begin
                            -- The target's original primary phone record
                            -- is assured of being associated with the target
                            -- so simply reset it's primary indicator.
                            update dbo.PHONE
                            set ISPRIMARY = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
                            where ID = @TARGETPRIMARYID    
                            and RELATIONSHIPID is null;


                            declare @TEMPUID uniqueidentifier;
                                select @TEMPUID = CONSTITUENTID
                                from dbo.PHONE
                                where ID = @SOURCEPRIMARYID;

                            if @TEMPUID = @SOURCEID
                            begin
                                -- If the source's primary address is still associated to
                                -- the source, then reset the primary indicator
                                update dbo.PHONE
                                set ISPRIMARY = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
                                where ID = @SOURCEPRIMARYID
                                and RELATIONSHIPID is null;
                            end
                        end
                        else
                        begin
                            -- The target had no primary phone record,
                            -- or we are preserving the source's primary
                            -- phone record
                            if @SOURCEPRIMARYID is null
                            begin
                                -- If the source had no primary phone record then
                                -- attempt to reset the target's primary record indicator
                                update dbo.PHONE
                                set ISPRIMARY = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
                                where ID = @TARGETPRIMARYID
                                and RELATIONSHIPID is null
                            end
                            else
                            begin
                                -- Otherwise, the source had a primary educational record
                                declare @TEMPID uniqueidentifier;
                                select @TEMPID = CONSTITUENTID
                                from dbo.PHONE
                                where ID = @SOURCEPRIMARYID;

                                if @TEMPID = @TARGETID
                                begin
                                    -- If the source primary phone is now associated
                                    -- with the target, then reset its primary indicator
                                    update dbo.PHONE
                                    set ISPRIMARY = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
                                    where ID = @SOURCEPRIMARYID
                                    and RELATIONSHIPID is null;
                                end
                                else
                                begin
                                    -- Otherwise, the source's primary phone was
                                    -- not associated with the target b/c it is a
                                    -- duplicate of one of the target's phone records.
                                    -- In this scenario, the target's phone record that
                                    -- is a duplicate of the source's primary phone
                                    -- should be set as the target's primary phone.
                                    set @TEMPID = null;

                                    select @TEMPID = TARGET_PHONEID
                                    from @DUPLICATEPHONES DP
                                    where DP.SOURCE_PHONEID = @SOURCEPRIMARYID;

                                    if @TEMPID is not null
                                    begin
                                        update dbo.PHONE
                                        set ISPRIMARY = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
                                        where ID = @TEMPID
                                        and RELATIONSHIPID is null;
                                    end
                                    else
                                    begin
                                        -- If no match was found then reset the primary
                                        -- indicator on the target's original primary
                                        -- record
                                        update dbo.PHONE
                                        set ISPRIMARY = 1, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
                                        where ID = @TARGETPRIMARYID
                                        and RELATIONSHIPID is null;
                                    end    
                                end
                            end    
                        end

                        --update sales order if deleting duplicates
                        update dbo.SALESORDER
                        set
                            PHONEID = coalesce((
                                select top 1 target.ID 
                                from dbo.PHONE target
                                inner join dbo.PHONE source
                                on target.NUMBER = source.NUMBER
                                and (target.PHONETYPECODEID = source.PHONETYPECODEID or (target.PHONETYPECODEID is null and source.PHONETYPECODEID is null))
                                where target.CONSTITUENTID = @TARGETID
                                and source.ID = SALESORDER.PHONEID                                
                            ), SALESORDER.PHONEID),
                            CHANGEDBYID = @CHANGEAGENTID,
                            DATECHANGED = @CHANGEDATE
                        where                            
                            SALESORDER.RECIPIENTID = @SOURCEID                                                            
                    end

                    update dbo.BATCHPHONEFINDER
                    set
                        CONSTITUENTID = @TARGETID
                    where
                        CONSTITUENTID = @SOURCEID

                    return 0;