USP_SEARCHLIST_CONSTITUENTBATCHDUPLICATELOOKUPID
Search for Duplicate Constituents in Constituent Batch by Lookup ID.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@PRIMARYRECORDID | uniqueidentifier | IN | Constituent |
@LOOKUP_ID | nvarchar(100) | IN | Lookup ID |
@KEYNAME | nvarchar(100) | IN | Last name |
@FIRSTNAME | nvarchar(50) | IN | First name |
@ADDRESSES | xml | IN | Addresses |
@CONSTITUENTTYPECODE | tinyint | IN | Is organization |
@MAXROWS | smallint | IN | Input parameter indicating the maximum number of rows to return. |
@OVERALLMATCHTHRESHOLD | decimal(20, 4) | IN | |
@DUPLICATERECORDID | uniqueidentifier | IN | |
@TITLECODEID | uniqueidentifier | IN | |
@MIDDLENAME | nvarchar(50) | IN | |
@SUFFIXCODEID | uniqueidentifier | IN | |
@ALTERNATELOOKUPIDS | xml | IN | |
@PHONES | xml | IN | |
@EMAILADDRESSES | xml | IN | |
@AUTOMATCHTHRESHOLD | decimal(20, 4) | IN | |
@DOMANUALREVIEWFORAUTOMATCH | bit | IN | |
@BATCHID | uniqueidentifier | IN | |
@CURRENTAPPUSERID | uniqueidentifier | IN | |
@CONSTITUENTDUPLICATEMATCHINGENABLED | bit | IN |
Definition
Copy
CREATE procedure dbo.USP_SEARCHLIST_CONSTITUENTBATCHDUPLICATELOOKUPID
(
@PRIMARYRECORDID uniqueidentifier = null,
@LOOKUP_ID nvarchar(100) = null,
@KEYNAME nvarchar(100) = null,
@FIRSTNAME nvarchar(50) = null,
@ADDRESSES xml = null,
@CONSTITUENTTYPECODE tinyint = null,
@MAXROWS smallint = 500,
@OVERALLMATCHTHRESHOLD decimal(20, 4) = null,
@DUPLICATERECORDID uniqueidentifier = null,
@TITLECODEID uniqueidentifier = null,
@MIDDLENAME nvarchar(50) = '',
@SUFFIXCODEID uniqueidentifier = null,
@ALTERNATELOOKUPIDS xml = null,
@PHONES xml = null,
@EMAILADDRESSES xml = null,
@AUTOMATCHTHRESHOLD decimal(20, 4) = null,
@DOMANUALREVIEWFORAUTOMATCH bit = 0,
@BATCHID uniqueidentifier = null,
@CURRENTAPPUSERID uniqueidentifier = null,
@CONSTITUENTDUPLICATEMATCHINGENABLED bit = null
)
as
set nocount on;
declare @CANDIDATE table
(
CONSTITUENTID uniqueidentifier,
ADDRESSID uniqueidentifier,
EMAILADDRESSID uniqueidentifier,
PHONEID uniqueidentifier,
MATCHPERCENTAGE numeric(5, 2),
LOOKUPIDTYPE nvarchar(100),
LOOKUPID nvarchar(100),
STREETNUMBERRESULT tinyint,
STREETNAMERESULT tinyint,
POSTCODERESULT tinyint
)
declare @POSTCODE nvarchar(12), @ADDRESSBLOCK nvarchar(150), @COUNTRYID uniqueidentifier,
@PHONENUMBER nvarchar(100), @EMAILADDRESS nvarchar(100), @KEYNAMEBODY nvarchar(100), @ADDRESSTYPECODEID uniqueidentifier,
@PHONETYPECODEID uniqueidentifier, @EMAILTYPECODEID uniqueidentifier;
if @PRIMARYRECORDID is null
begin
select top 1
@POSTCODE = POSTCODE,
@ADDRESSBLOCK = ADDRESSBLOCK,
@COUNTRYID = COUNTRYID,
@ADDRESSTYPECODEID = ADDRESSTYPECODEID
from dbo.UFN_BATCHCONSTITUENTUPDATE_GETADDRESSES_FROMITEMLISTXML(@ADDRESSES)
order by case when ISPRIMARY = 1 then 1 else 2 end, SEQUENCE
select top 1 @PHONENUMBER = NUMBER, @PHONETYPECODEID = PHONETYPECODEID
from dbo.UFN_CONSTITUENT_GETPHONES_FORUPDATEBATCH_FROMITEMLISTXML(@PHONES)
order by case when ISPRIMARY = 1 then 1 else 2 end, SEQUENCE
select top 1 @EMAILADDRESS = EMAILADDRESS, @EMAILTYPECODEID = EMAILADDRESSTYPECODEID
from dbo.UFN_CONSTITUENT_GETEMAILADDRESSES_WITHDATES_FORUPDATEBATCH_FROMITEMLISTXML(@EMAILADDRESSES)
order by case when ISPRIMARY = 1 then 1 else 2 end, SEQUENCE
if @CONSTITUENTTYPECODE = 1 -- orgs
begin
declare @KEYNAMEPREFIX nvarchar(50);
begin try
exec dbo.USP_PARSE_ORGANIZATION_NAME @KEYNAME, @KEYNAMEBODY output, @KEYNAMEPREFIX output;
end try
begin catch
set @KEYNAMEBODY = @KEYNAME;
end catch
end
else
set @KEYNAMEBODY = @KEYNAME;
if @OVERALLMATCHTHRESHOLD is null and @BATCHID is not null
begin
select @OVERALLMATCHTHRESHOLD = OVERALLMATCHTHRESHOLD, @AUTOMATCHTHRESHOLD = AUTOMATCHTHRESHOLD from dbo.BATCH where ID = @BATCHID
end
insert into @CANDIDATE (CONSTITUENTID, ADDRESSID, EMAILADDRESSID, PHONEID, MATCHPERCENTAGE, LOOKUPIDTYPE, LOOKUPID, STREETNUMBERRESULT, STREETNAMERESULT, POSTCODERESULT)
select
DUPLICATES.CONSTITUENTID,
DUPLICATES.ADDRESSID,
DUPLICATES.EMAILADDRESSID,
DUPLICATES.PHONEID,
DUPLICATES.MATCHPERCENTAGE,
'Lookup ID' LOOKUPIDTYPE,
null,
STREETNUMBERRESULT,
STREETNAMERESULT,
POSTCODERESULT
from
dbo.UFN_FINDCONSTITUENTMATCHES_COMPOSITETHRESHOLD_3 (
@TITLECODEID,
@FIRSTNAME,
@MIDDLENAME,
@KEYNAMEBODY,
@SUFFIXCODEID,
@ADDRESSBLOCK,
@POSTCODE,
@COUNTRYID,
case @CONSTITUENTTYPECODE when 1 then 1 else 0 end,
case when @CONSTITUENTTYPECODE in(2,3) then 1 else 0 end,
@LOOKUP_ID,
@ALTERNATELOOKUPIDS,
@EMAILADDRESS,
@PHONENUMBER,
@OVERALLMATCHTHRESHOLD,
@AUTOMATCHTHRESHOLD,
@CURRENTAPPUSERID,
@CONSTITUENTDUPLICATEMATCHINGENABLED
) DUPLICATES
end
else if @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 = @DUPLICATERECORDID and ISMANUALEXCEPTION = 1)
begin
select top 1
@POSTCODE = POSTCODE,
@ADDRESSBLOCK = ADDRESSBLOCK,
@COUNTRYID = COUNTRYID
from dbo.UFN_BATCHCONSTITUENTUPDATE_GETADDRESSES_FROMITEMLISTXML(@ADDRESSES)
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 = @DUPLICATERECORDID 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;
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)
ID,
MATCHPERCENTAGE,
NAME,
ADDRESSBLOCK,
CITY,
ABBREVIATION,
POSTCODE,
LOOKUPIDTYPE,
LOOKUPID,
DATECHANGED,
ADDRESSID,
EMAILADDRESSID,
PHONEID,
STREETNUMBERRESULT,
STREETNAMERESULT,
POSTCODERESULT ,
case when ADDRESSID is not null then dbo.UFN_BUILDFULLADDRESS(ADDRESSID,ADDRESSBLOCK,CITY,STATEID,POSTCODE,COUNTRYID) else dbo.UFN_CONSTITUENTDUPLICATESEARCH_DEFAULTADDRESS(ID,@ADDRESSTYPECODEID) end as FULLADDRESS
from
(select
C.ID,
D.MATCHPERCENTAGE,
C.NAME,
A.ADDRESSBLOCK,
A.CITY,
S.ABBREVIATION,
A.POSTCODE,
D.LOOKUPIDTYPE,
coalesce(D.LOOKUPID, C.LOOKUPID) as LOOKUPID,
C.DATECHANGED,
A.ID ADDRESSID,
D.EMAILADDRESSID,
D.PHONEID,
ROW_NUMBER() over(partition by D.CONSTITUENTID order by MATCHPERCENTAGE desc,
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,
case when A.ISPRIMARY = 1 then 1 else 2 end,
case when P.ISPRIMARY = 1 then 1 else 2 end,
case when E.ISPRIMARY = 1 then 1 else 2 end) ROWNO,
C.KEYNAME,
C.FIRSTNAME,
D.STREETNUMBERRESULT,
D.STREETNAMERESULT,
D.POSTCODERESULT,A.STATEID,A.COUNTRYID,
A.ADDRESSTYPECODEID,
P.PHONETYPECODEID,
E.EMAILADDRESSTYPECODEID,
A.ISPRIMARY ADDRESSISPRIMARY,
P.ISPRIMARY PHONEISPRIMARY,
E.ISPRIMARY EMAILISPRIMARY
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
) Q
where ROWNO = 1
and (@ISADMIN = 1 or @CURRENTAPPUSERID is null or @APPUSER_IN_NONRACROLE = 1 or
dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, ID, @APPUSER_IN_NOSECGROUPROLE) = 1)
order by MATCHPERCENTAGE desc ,
case when KEYNAME = @KEYNAME then 1 else 2 end,
case when isnull(FIRSTNAME,'') = isnull(@FIRSTNAME,'') then 1 else 2 end,
case when isnull(ADDRESSTYPECODEID,@NULLVALUE) = isnull(@ADDRESSTYPECODEID,@NULLVALUE) then 1 else 2 end,
case when isnull(PHONETYPECODEID,@NULLVALUE) = isnull(@PHONETYPECODEID,@NULLVALUE) then 1 else 2 end,
case when isnull(EMAILADDRESSTYPECODEID,@NULLVALUE) = isnull(@EMAILTYPECODEID,@NULLVALUE) then 1 else 2 end,
case when isnull(ADDRESSBLOCK,'') = isnull(@ADDRESSBLOCK,'') then 1 else 2 end,
ADDRESSISPRIMARY desc,
PHONEISPRIMARY desc,
EMAILISPRIMARY desc