USP_SEARCHLIST_REVENUEBATCHDUPLICATECONSTITUENT

Search for Duplicate Constituents in Revenue Batch.

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID uniqueidentifier IN Constituent ID
@CONSTITUENTLOOKUPID uniqueidentifier IN Lookup ID
@NEWCONSTITUENT xml IN New constituent
@MAXROWS smallint IN Input parameter indicating the maximum number of rows to return.
@OVERALLMATCHTHRESHOLD decimal(20, 4) IN
@AUTOMATCHTHRESHOLD decimal(20, 4) IN
@EDITCONSTITUENTCONTEXT nvarchar(110) IN
@CURRENTAPPUSERID uniqueidentifier IN
@BATCHID uniqueidentifier IN
@CONSTITUENTDUPLICATEMATCHINGENABLED bit IN

Definition

Copy


CREATE procedure dbo.USP_SEARCHLIST_REVENUEBATCHDUPLICATECONSTITUENT
(
        @CONSTITUENTID uniqueidentifier = null,
        @CONSTITUENTLOOKUPID uniqueidentifier = null,
        @NEWCONSTITUENT xml = null,
        @MAXROWS smallint = 500,
        @OVERALLMATCHTHRESHOLD decimal(20, 4) = null,
        @AUTOMATCHTHRESHOLD decimal(20, 4) = null,
        @EDITCONSTITUENTCONTEXT nvarchar(110) = null,
        @CURRENTAPPUSERID uniqueidentifier = null,
        @BATCHID uniqueidentifier = null,
        @CONSTITUENTDUPLICATEMATCHINGENABLED bit = null
)
as
set nocount on

declare @NAME nvarchar(100),
    @KEYNAME nvarchar(100),
    @FIRSTNAME nvarchar(50),
    @POSTCODE nvarchar(12),
    @ADDRESSBLOCK nvarchar(150),
    @ISORGANIZATION bit,
    @ISGROUP bit,
    @TITLECODEID uniqueidentifier,
    @MIDDLENAME nvarchar(50),
    @SUFFIXCODEID uniqueidentifier,
    @COUNTRYID uniqueidentifier,
    @EMAILADDRESS nvarchar(100),
    @PHONENUMBER nvarchar(100),
    @ADDRESSTYPECODEID uniqueidentifier,
    @PHONETYPECODEID uniqueidentifier,
    @EMAILTYPECODEID uniqueidentifier

if (@CONSTITUENTID is null and @CONSTITUENTLOOKUPID is null)
begin
        select
                @NAME = LASTNAME,
                @KEYNAME = LASTNAME,
                @FIRSTNAME = FIRSTNAME,
                @POSTCODE = ADDRESS_POSTCODE,
                @ADDRESSBLOCK = ADDRESS_ADDRESSBLOCK,
                @ISORGANIZATION = ISORGANIZATION,
                @ISGROUP = ISGROUP,
                @TITLECODEID = TITLECODEID,
                @MIDDLENAME = MIDDLENAME,
                @SUFFIXCODEID = SUFFIXCODEID,
                @COUNTRYID = ADDRESS_COUNTRYID,
                @EMAILADDRESS = EMAILADDRESS_EMAILADDRESS,
                @PHONENUMBER = PHONE_NUMBER,
                @ADDRESSTYPECODEID = ADDRESS_ADDRESSTYPECODEID,
                @PHONETYPECODEID = PHONE_PHONETYPECODEID,
                @EMAILTYPECODEID = EMAILADDRESS_EMAILADDRESSTYPECODEID
        from dbo.UFN_REVENUEBATCH_GETNEWCONSTITUENT_FROMITEMLISTXML(@NEWCONSTITUENT)
end

if @KEYNAME is null
begin                                   
    if exists (select ID from dbo.BATCHREVENUECONSTITUENT where ID = @CONSTITUENTID)
    begin
            select
                @KEYNAME = KEYNAME,
                @NAME = NAME,
                @FIRSTNAME = FIRSTNAME,
                @POSTCODE = POSTCODE,
                @ADDRESSBLOCK = ADDRESSBLOCK,
                @ISORGANIZATION = ISORGANIZATION,
                @ISGROUP = ISGROUP,
                @TITLECODEID = TITLECODEID,
                @MIDDLENAME = MIDDLENAME,
                @SUFFIXCODEID = SUFFIXCODEID,
                @COUNTRYID = COUNTRYID,
                @EMAILADDRESS = EMAILADDRESS,
                @PHONENUMBER = NUMBER,
                @ADDRESSTYPECODEID = ADDRESSTYPECODEID,
                @PHONETYPECODEID = PHONETYPECODEID,
                @EMAILTYPECODEID = EMAILADDRESSTYPECODEID
            from dbo.BATCHREVENUECONSTITUENT
            where ID = @CONSTITUENTID
    end
end

declare @CANDIDATE table
(
        CONSTITUENTID uniqueidentifier,
        ADDRESSID uniqueidentifier,
        EMAILADDRESSID uniqueidentifier,
        PHONEID uniqueidentifier,
        MATCHPERCENTAGE numeric(5, 2),
        STREETNUMBERRESULT tinyint,
        STREETNAMERESULT tinyint,
        POSTCODERESULT tinyint        
)

if @OVERALLMATCHTHRESHOLD is null and @BATCHID is not null
begin
    select @OVERALLMATCHTHRESHOLD = OVERALLMATCHTHRESHOLD, @AUTOMATCHTHRESHOLD = AUTOMATCHTHRESHOLD from dbo.BATCH where ID = @BATCHID
end

if @KEYNAME is not null
    insert into @CANDIDATE (CONSTITUENTID, ADDRESSID, EMAILADDRESSID, PHONEID, MATCHPERCENTAGE, STREETNUMBERRESULT, STREETNAMERESULT, POSTCODERESULT)
    select CONSTITUENTID, ADDRESSID, EMAILADDRESSID, PHONEID, MATCHPERCENTAGE, STREETNUMBERRESULT, STREETNAMERESULT, POSTCODERESULT
    from dbo.UFN_FINDCONSTITUENTMATCHES_COMPOSITETHRESHOLD_3 (
                @TITLECODEID,
                @FIRSTNAME,
                @MIDDLENAME,
                @KEYNAME,
                @SUFFIXCODEID,
                @ADDRESSBLOCK,
                @POSTCODE,
                @COUNTRYID,
                @ISORGANIZATION,
                @ISGROUP,
                null,
                null,
                @EMAILADDRESS,
                @PHONENUMBER,
                @OVERALLMATCHTHRESHOLD,
                @AUTOMATCHTHRESHOLD,
                @CURRENTAPPUSERID,
                @CONSTITUENTDUPLICATEMATCHINGENABLED
                            ) DUPLICATES
else if @EDITCONSTITUENTCONTEXT is not null
begin
    declare @BATCHCONSTITUENTUPDATEID uniqueidentifier = convert(uniqueidentifier, substring(@EDITCONSTITUENTCONTEXT,75,36))
    declare @PRIMARYRECORDID uniqueidentifier = convert(uniqueidentifier, substring(@EDITCONSTITUENTCONTEXT,1,36))

    if exists(select DOMANUALREVIEWFORAUTOMATCH from dbo.BATCHCONSTITUENTUPDATE where ID = @BATCHCONSTITUENTUPDATEID  and DOMANUALREVIEWFORAUTOMATCH = 1)
    begin
        -- if none of the addresses generated an exception we need to find a possible match for it

        if not exists (select 'x' from dbo.BATCHCONSTITUENTUPDATEADDRESSES where BATCHCONSTITUENTUPDATEID = @BATCHCONSTITUENTUPDATEID and ISMANUALEXCEPTION = 1)
        begin 
                    select top 1
                            @POSTCODE = POSTCODE,
                            @ADDRESSBLOCK = ADDRESSBLOCK,
                            @COUNTRYID = COUNTRYID
                    from dbo.BATCHCONSTITUENTUPDATEADDRESSES where BATCHCONSTITUENTUPDATEID = @BATCHCONSTITUENTUPDATEID
                    order by case when ISPRIMARY = 1 then 1 else 2 end, SEQUENCE   

                    declare @ADDRESSMATCHTHRESHOLD decimal(20,4);

                    select top 1
                        @ADDRESSMATCHTHRESHOLD = ADDRESSMATCHTHRESHOLD
                    from dbo.CONSTITUENTDUPLICATESEARCHSETTINGS;

                    insert into @CANDIDATE (CONSTITUENTID, ADDRESSID, STREETNUMBERRESULT, STREETNAMERESULT, POSTCODERESULT)
                    select
                        @PRIMARYRECORDID,
                        DUPLICATES.ADDRESSID,                      
                        STREETNUMBERRESULT, 
                        STREETNAMERESULT, 
                        POSTCODERESULT
                    from dbo.UFN_FINDADDRESSMATCH_CONSTITUENTUPDATEBATCH(@PRIMARYRECORDID, @ADDRESSBLOCK, @POSTCODE, @COUNTRYID, '', null, null, @ADDRESSMATCHTHRESHOLD, null) DUPLICATES                        
            end
            else -- if there where addresses that generate an exception select the one that was similar, otherwise do nothing.

            begin
                insert into @CANDIDATE(CONSTITUENTID, ADDRESSID) 
                select top 1 @PRIMARYRECORDID, MANUALEXCEPTIONSIMILARADDRESSID
                from dbo.BATCHCONSTITUENTUPDATEADDRESSES where BATCHCONSTITUENTUPDATEID = @BATCHCONSTITUENTUPDATEID and ISMANUALEXCEPTION = 1
                order by case when ISPRIMARY = 1 then 1 else 2 end, SEQUENCE
            end

        --make sure we always return the auto-matched constituent id

        if not exists(select CONSTITUENTID from @CANDIDATE)
                insert into @CANDIDATE(CONSTITUENTID) values(@PRIMARYRECORDID);                  
    end                              
end

declare @ISADMIN bit = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
declare @APPUSER_IN_NONRACROLE bit = dbo.UFN_SECURITY_APPUSER_IN_NONRACROLE(@CURRENTAPPUSERID);
declare @APPUSER_IN_NOSECGROUPROLE bit = dbo.UFN_SECURITY_APPUSER_IN_NO_SECURITY_GROUP_ROLE(@CURRENTAPPUSERID);
declare @NULLVALUE uniqueidentifier = (select cast(cast(0 as binary) as uniqueidentifier))

select top(@MAXROWS)
        C.ID,
        D.MATCHPERCENTAGE,
        C.NAME,
        A.ADDRESSBLOCK,
        A.CITY,
        S.ABBREVIATION,
        A.POSTCODE,
        C.LOOKUPID,
        C.DATECHANGED,
        A.ID ADDRESSID,
        D.EMAILADDRESSID,
        D.PHONEID,
        D.STREETNUMBERRESULT,
        D.STREETNAMERESULT,
        D.POSTCODERESULT,
        case when ADDRESSID is not null then dbo.UFN_BUILDFULLADDRESS(ADDRESSID,a.ADDRESSBLOCK,a.CITY,a.STATEID,a.POSTCODE,a.COUNTRYID) else dbo.UFN_CONSTITUENTDUPLICATESEARCH_DEFAULTADDRESS(C.ID,@ADDRESSTYPECODEID) end as FULLADDRESS     
from @CANDIDATE D
inner join dbo.CONSTITUENT C on D.CONSTITUENTID = C.ID
left join dbo.ADDRESS A on D.ADDRESSID = A.ID
left join dbo.STATE S on A.STATEID = S.ID
left join dbo.PHONE P on D.PHONEID = P.ID
left join dbo.EMAILADDRESS E on D.EMAILADDRESSID = E.ID
where (@ISADMIN = 1 or @CURRENTAPPUSERID is null or @APPUSER_IN_NONRACROLE = 1 or
                dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, D.CONSTITUENTID, @APPUSER_IN_NOSECGROUPROLE) = 1)                           
order by    
        D.MATCHPERCENTAGE desc
        C.KEYNAME, 
        C.FIRSTNAME,
        case when isnull(A.ADDRESSTYPECODEID,@NULLVALUE) = isnull(@ADDRESSTYPECODEID,@NULLVALUE) then 1 else 2 end,
        case when isnull(P.PHONETYPECODEID,@NULLVALUE) = isnull(@PHONETYPECODEID,@NULLVALUE) then 1 else 2 end
        case when isnull(E.EMAILADDRESSTYPECODEID,@NULLVALUE) = isnull(@EMAILTYPECODEID,@NULLVALUE) then 1 else 2 end,
        case when isnull(A.ADDRESSBLOCK,'') = isnull(@ADDRESSBLOCK,'') then 1 else 2 end,
        A.ISPRIMARY desc,
        P.ISPRIMARY desc,
        E.ISPRIMARY desc