UFN_WEBFORMS_CONSTITUENT_EXACTAUTOMATCH
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@MAXROWS | int | IN | |
@KEYNAME | nvarchar(100) | IN | |
@FIRSTNAME | nvarchar(50) | IN | |
@TITLECODEID | uniqueidentifier | IN | |
@ADDRESSBLOCK | nvarchar(150) | IN | |
@CITY | nvarchar(100) | IN | |
@COUNTRYID | uniqueidentifier | IN | |
@STATEID | uniqueidentifier | IN | |
@POSTCODE | nvarchar(12) | IN | |
@PHONENUMBER | nvarchar(100) | IN | |
@EMAILADDRESS | UDT_EMAILADDRESS | IN | |
@ADDRESSSUBSTITUTIONS | UDT_STRINGPAIR_100 | IN |
Definition
Copy
CREATE function dbo.UFN_WEBFORMS_CONSTITUENT_EXACTAUTOMATCH(
@MAXROWS integer = 2,
@KEYNAME nvarchar(100) = '',
@FIRSTNAME nvarchar(50) = '',
@TITLECODEID uniqueidentifier = null,
@ADDRESSBLOCK nvarchar(150) = '',
@CITY nvarchar(100) = '',
@COUNTRYID uniqueidentifier= null,
@STATEID uniqueidentifier= null,
@POSTCODE nvarchar(12) = '',
@PHONENUMBER nvarchar(100) = '',
@EMAILADDRESS dbo.UDT_EMAILADDRESS = '',
@ADDRESSSUBSTITUTIONS dbo.UDT_STRINGPAIR_100 readonly
)
-- Only returns a list of individuals (not groups or organizations)
-- Including these types will probably mean some consideration for how to handle first name (since these constituent types don't have theses)
returns @CONSTITUENTS table (
[ID] uniqueidentifier,
[KEYNAME] nvarchar(100),
[FIRSTNAME] nvarchar(50)
)
as
begin
--Known Web Forms Auto match Parameters
if len(@POSTCODE) > 0
select @POSTCODE = left(@POSTCODE, 5)+'%';
select @PHONENUMBER = dbo.UFN_PHONE_REMOVEFORMATTING(@PHONENUMBER)
--If the user provided this data, we should check the constituent record's
declare
@OPTIONALLYCHECKEMAIL bit = 0,
@OPTIONALLYCHECKPHONE bit = 0,
@OPTIONALLYCHECKTITLE bit = 0,
@OPTIONALLYCHECKFIRSTNAME bit = 0;
select
@OPTIONALLYCHECKEMAIL = case when len(@EMAILADDRESS) > 0 then 1 else 0 end,
@OPTIONALLYCHECKPHONE = case when len(@PHONENUMBER) > 0 then 1 else 0 end,
@OPTIONALLYCHECKTITLE = case when @TITLECODEID is not null then 1 else 0 end,
@OPTIONALLYCHECKFIRSTNAME = case when len(@FIRSTNAME) > 0 then 1 else 0 end;
--Scrub for case sensitivity ("Robert" and "robert" should be an exact match)
select
@EMAILADDRESS = lower(@EMAILADDRESS),
@KEYNAME = lower(isnull(@KEYNAME,'')),
@FIRSTNAME = lower(@FIRSTNAME),
@ADDRESSBLOCK = dbo.UFN_ADDRESS_ADDRESSBLOCK_NORMALIZE_LOWERCASE(@ADDRESSBLOCK, @ADDRESSSUBSTITUTIONS),
@CITY = lower(isnull(@CITY,''));
--Leave work early if required fields aren't provided
if len(@KEYNAME) = 0 or
len(@ADDRESSBLOCK) = 0 or
len(@CITY) = 0 or
@COUNTRYID = null
return;
with [CTE_ALIAS] as (
select [ALIAS].[CONSTITUENTID]
from dbo.[ALIAS]
where
lower([KEYNAME]) = @KEYNAME and
(
@OPTIONALLYCHECKFIRSTNAME = 0 or
lower(FIRSTNAME) = @FIRSTNAME or
FIRSTNAME = ''
) and
(
@OPTIONALLYCHECKTITLE = 0 or
([ALIAS].[TITLECODEID] = @TITLECODEID or [ALIAS].[TITLE2CODEID] = @TITLECODEID) or
([ALIAS].[TITLECODEID] is null and [ALIAS].[TITLE2CODEID] is null)
)
),
[CTE_CONSTITUENT] as (
select
[CONSTITUENT].[ID],
[CONSTITUENT].[KEYNAME],
[CONSTITUENT].[FIRSTNAME],
[CONSTITUENT].[TITLECODEID],
[CONSTITUENT].[TITLE2CODEID],
[CONSTITUENT].[NICKNAME]
from dbo.[CONSTITUENT] with (nolock)
left join [CTE_ALIAS] as [ALIAS]
on [CONSTITUENT].[ID] = [ALIAS].[CONSTITUENTID]
left join [dbo].[DECEASEDCONSTITUENT] with (nolock)
on CONSTITUENT.ID = DECEASEDCONSTITUENT.ID
where
(
[ALIAS].[CONSTITUENTID] is not null or
(
lower([CONSTITUENT].[KEYNAME]) = @KEYNAME and
(
@OPTIONALLYCHECKFIRSTNAME = 0 or
lower([CONSTITUENT].[FIRSTNAME]) = @FIRSTNAME or
[CONSTITUENT].[FIRSTNAME] = '' or
lower([CONSTITUENT].[NICKNAME]) = @FIRSTNAME
) and
(
@OPTIONALLYCHECKTITLE = 0 or
([CONSTITUENT].[TITLECODEID] = @TITLECODEID or [CONSTITUENT].[TITLE2CODEID] = @TITLECODEID) or
([CONSTITUENT].[TITLECODEID] is null and [CONSTITUENT].[TITLE2CODEID] is null)
)
)
) and
[CONSTITUENT].[ISINACTIVE] = 0 and
[DECEASEDCONSTITUENT].[ID] is null and
([CONSTITUENT].[ISGROUP] = 0 and [CONSTITUENT].[ISORGANIZATION] = 0)
),
[CTE_CONSTITUENT_FILTERED] as (
select
[CONSTITUENT].[ID],
[CONSTITUENT].[KEYNAME],
[CONSTITUENT].[FIRSTNAME],
dbo.UFN_ADDRESS_ADDRESSBLOCK_NORMALIZE_LOWERCASE([ADDRESS].[ADDRESSBLOCK], @ADDRESSSUBSTITUTIONS) as [ADDRESSBLOCK]
from [CTE_CONSTITUENT] as [CONSTITUENT]
inner join dbo.[ADDRESS] with (nolock)
on [CONSTITUENT].[ID] = [ADDRESS].[CONSTITUENTID]
left join dbo.[PHONE] with (nolock)
on [CONSTITUENT].[ID] = [PHONE].[CONSTITUENTID]
left join dbo.[EMAILADDRESS] with (nolock)
on [CONSTITUENT].[ID] = [EMAILADDRESS].[CONSTITUENTID]
where
@COUNTRYID = [ADDRESS].[COUNTRYID] and
[ADDRESS].[POSTCODE] like @POSTCODE and
@CITY = lower([ADDRESS].[CITY]) and
(
(@STATEID is null and [ADDRESS].[STATEID] is null) or
@STATEID = [ADDRESS].[STATEID]
) and
(
@OPTIONALLYCHECKEMAIL = 0 or
[EMAILADDRESS].[ID] is null or
[EMAILADDRESS].[EMAILADDRESS] = '' or
@EMAILADDRESS = lower([EMAILADDRESS].[EMAILADDRESS])
) and
(
@OPTIONALLYCHECKPHONE = 0 or
[PHONE].[ID] is null or
@PHONENUMBER = [PHONE].[NUMBERNOFORMAT]
)
)
insert into @CONSTITUENTS
select distinct top(@MAXROWS)
[CONSTITUENT].[ID],
[CONSTITUENT].[KEYNAME],
[CONSTITUENT].[FIRSTNAME]
from [CTE_CONSTITUENT_FILTERED] as [CONSTITUENT]
where @ADDRESSBLOCK = [CONSTITUENT].[ADDRESSBLOCK]
return
end