USP_SEARCHLIST_PATRON_SEARCH

Provides a quick ability to search constituents by name, address, phone, or membership.

Parameters

Parameter Parameter Type Mode Description
@MAGIC nvarchar(100) IN Quick search
@LASTNAME nvarchar(100) IN Last name
@FIRSTNAME nvarchar(100) IN First name
@MEMBERSHIPLOOKUPID nvarchar(50) IN Membership ID
@PHONENUMBER nvarchar(50) IN Phone number
@COUNTRYID uniqueidentifier IN Country
@ADDRESSBLOCK nvarchar(100) IN Address
@CITY nvarchar(100) IN City
@STATEID uniqueidentifier IN State
@POSTCODE nvarchar(20) IN ZIP/Postal code
@INCLUDEINDIVIDUALS bit IN Individuals
@INCLUDEORGANIZATIONS bit IN Organizations
@INCLUDEGROUPS bit IN Groups/Households
@INCLUDEINACTIVE bit IN Include inactive
@INCLUDEDECEASED bit IN Include Deceased
@MAXROWS smallint IN Input parameter indicating the maximum number of rows to return.

Definition

Copy


CREATE procedure dbo.USP_SEARCHLIST_PATRON_SEARCH
(
    @MAGIC nvarchar(100) = null,
    @LASTNAME nvarchar(100) = null,
    @FIRSTNAME nvarchar(100) = null,
    @MEMBERSHIPLOOKUPID nvarchar(50) = null,
    @PHONENUMBER nvarchar(50) = null,
    @COUNTRYID uniqueidentifier = null,
    @ADDRESSBLOCK nvarchar(100) = null,
    @CITY nvarchar(100) = null,
    @STATEID uniqueidentifier = null,
    @POSTCODE nvarchar(20) = null,
    @INCLUDEINDIVIDUALS bit = 1,
    @INCLUDEORGANIZATIONS bit = 1,
    @INCLUDEGROUPS bit = 0,
    @INCLUDEINACTIVE bit = 0,
    @INCLUDEDECEASED bit = 0,
    @MAXROWS smallint = 100
)

as

set nocount on;

declare @MAGICLASTNAME nvarchar(100),
        @MAGICFIRSTNAME nvarchar(100),
        @CURRENTDATEEARLIESTTIME datetime;

--Work some MAGIC!


if not (@MAGIC is null)
begin
    set @MAGIC = ltrim(rtrim(@MAGIC))

    if charindex(',',@MAGIC) > 0
    begin
        set @MAGICLASTNAME = rtrim(left(@MAGIC,charindex(',',@MAGIC) - 1))
        set @MAGICFIRSTNAME = ltrim(right(@MAGIC,len(@MAGIC) - charindex(',',@MAGIC)))
        if charindex(' ',@MAGICFIRSTNAME) > 0
        begin
            set @MAGICFIRSTNAME = rtrim(left(@MAGICFIRSTNAME,charindex(' ',@MAGICFIRSTNAME)))
        end
    end
    else
    begin
        if charindex(' ',@MAGIC) > 0
        begin
            set @MAGICFIRSTNAME = rtrim(left(@MAGIC,charindex(' ',@MAGIC)))
            set @MAGICLASTNAME = ltrim(right(@MAGIC,len(@MAGIC) - charindex(' ',@MAGIC)))
        end
        else
        begin
            set @MAGICFIRSTNAME = @MAGIC
            set @MAGICLASTNAME = null
        end
        while charindex(' ',@MAGICLASTNAME) > 0
        begin
            set @MAGICLASTNAME = ltrim(right(@MAGICLASTNAME,len(@MAGICLASTNAME) - charindex(' ',@MAGICLASTNAME)))
        end
    end
end

--enough magic


-- remove formatting (dashes, parens, etc...) from phone number input

declare @UNFORMATTEDPHONENUMBER nvarchar(100) = dbo.UFN_PHONE_REMOVEFORMATTING(@PHONENUMBER)
-- in case the quick search was a phone number

declare @UNFORMATTEDQUICKSEARCHPHONENUMBER nvarchar(100) = dbo.UFN_PHONE_REMOVEFORMATTING(@MAGIC);

-- Get basic results

declare @BASICRESULTS as table
(
    ID uniqueidentifier,
    DISPLAYNAME nvarchar(154),
    SORTNAME nvarchar(155)
);
insert into @BASICRESULTS
select distinct top(@MAXROWS)
    CONSTITUENT.ID,
    CONSTITUENT.NAME as DISPLAYNAME,
    case
        when CONSTITUENT.FIRSTNAME is null then CONSTITUENT.KEYNAME
        when CONSTITUENT.FIRSTNAME = '' then CONSTITUENT.KEYNAME
        else CONSTITUENT.KEYNAME + ', ' + CONSTITUENT.FIRSTNAME + case CONSTITUENT.MIDDLENAME when '' then '' else ' ' + left(CONSTITUENT.MIDDLENAME,1) + '.' end
    end as SORTNAME
from dbo.CONSTITUENT
    left join dbo.MEMBER on MEMBER.CONSTITUENTID = CONSTITUENT.ID
    left join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBER.MEMBERSHIPID
    left join dbo.MEMBERSHIPCARD on MEMBERSHIPCARD.MEMBERID = MEMBER.ID
    left join dbo.PHONE on PHONE.CONSTITUENTID = CONSTITUENT.ID
    left join dbo.[ADDRESS] on [ADDRESS].CONSTITUENTID = CONSTITUENT.ID
where
    (
        @MAGIC is null or
        CONSTITUENT.KEYNAME like @MAGIC + '%' or
        MEMBERSHIPCARD.CARDNUMBER = @MAGIC or
        MEMBERSHIP.LOOKUPID = @MAGIC or
        PHONE.NUMBERNOFORMAT like @UNFORMATTEDQUICKSEARCHPHONENUMBER + '%' or
        (
            CONSTITUENT.FIRSTNAME like @MAGICFIRSTNAME + '%' and
            (@MAGICLASTNAME is null or CONSTITUENT.KEYNAME like @MAGICLASTNAME + '%')
        )
    ) and
    (@FIRSTNAME is null or CONSTITUENT.FIRSTNAME like @FIRSTNAME + '%') and
    (@LASTNAME is null or CONSTITUENT.KEYNAME like @LASTNAME + '%') and
    (@MEMBERSHIPLOOKUPID is null or MEMBERSHIP.LOOKUPID like @MEMBERSHIPLOOKUPID + '%') and
    (@PHONENUMBER is null or PHONE.NUMBERNOFORMAT like @UNFORMATTEDPHONENUMBER + '%') and
    (@COUNTRYID is null or [ADDRESS].COUNTRYID = @COUNTRYID) and
    (@ADDRESSBLOCK is null or [ADDRESS].ADDRESSBLOCK like @ADDRESSBLOCK + '%') and
    (@CITY is null or [ADDRESS].CITY like @CITY + '%') and
    (@STATEID is null or [ADDRESS].STATEID = @STATEID) and
    (@POSTCODE is null or [ADDRESS].POSTCODE like @POSTCODE + '%') and
    (@INCLUDEINDIVIDUALS = 1 or CONSTITUENT.ISORGANIZATION = 1 or CONSTITUENT.ISGROUP = 1) and
    (@INCLUDEORGANIZATIONS = 1 or CONSTITUENT.ISORGANIZATION = 0) and
    (@INCLUDEGROUPS = 1 or CONSTITUENT.ISGROUP = 0) and
    (@INCLUDEINACTIVE = 1 or CONSTITUENT.ISINACTIVE = 0) and
    (
        @INCLUDEDECEASED = 1 or 
        not exists (
            select 1
            from dbo.[DECEASEDCONSTITUENT]
            where [DECEASEDCONSTITUENT].[ID] = [CONSTITUENT].[ID]
        )
    ) and
    CONSTITUENT.ISCONSTITUENT = 1
order by SORTNAME

--If Groups/Households is not an option, return the basic results as-is

if @INCLUDEGROUPS = 0
begin
    select
        RESULTS.ID,
        RESULTS.DISPLAYNAME,
        RESULTS.SORTNAME as NAME,
        dbo.UFN_BUILDFULLADDRESS(ADDRESS.ID, ADDRESSBLOCK, CITY, STATEID, POSTCODE, ADDRESS.COUNTRYID) as [ADDRESSBLOCK],
        NUMBER as [PHONENUMBER]
    from @BASICRESULTS as RESULTS
        left join dbo.ADDRESS on RESULTS.ID = ADDRESS.CONSTITUENTID
        left join dbo.PHONE on RESULTS.ID = PHONE.CONSTITUENTID
    where
        (ADDRESS.ISPRIMARY is null or ADDRESS.ISPRIMARY = 1) and
        (PHONE.ISPRIMARY is null or PHONE.ISPRIMARY = 1)
    order by
        NAME,
        ADDRESSBLOCK,
        PHONENUMBER
end
else --Union in the groups/households!

begin

    set @CURRENTDATEEARLIESTTIME = dbo.UFN_DATE_GETEARLIESTTIME(getdate());

    select top(@MAXROWS) * from (

    select
        RESULTS.ID,
        RESULTS.DISPLAYNAME,
        RESULTS.SORTNAME as NAME,
        dbo.UFN_BUILDFULLADDRESS(ADDRESS.ID, ADDRESSBLOCK, CITY, STATEID, POSTCODE, ADDRESS.COUNTRYID) as [ADDRESSBLOCK],
        NUMBER as [PHONENUMBER]
    from @BASICRESULTS as RESULTS
        left join dbo.ADDRESS on RESULTS.ID = ADDRESS.CONSTITUENTID
        left join dbo.PHONE on RESULTS.ID = PHONE.CONSTITUENTID
    where
        (ADDRESS.ID is null or ADDRESS.ISPRIMARY = 1) and
        (PHONE.ID is null or PHONE.ISPRIMARY = 1)

    union all

    select distinct
        [GROUP].ID,
        [GROUP].NAME as DISPLAYNAME,
        [GROUP].NAME,
        dbo.UFN_BUILDFULLADDRESS(ADDRESS.ID, ADDRESSBLOCK, CITY, STATEID, POSTCODE, ADDRESS.COUNTRYID) as [ADDRESSBLOCK],
        NUMBER as [PHONENUMBER]
    from dbo.GROUPMEMBER GM with (nolock)
        inner join @BASICRESULTS as RESULTS on RESULTS.ID = GM.MEMBERID
        inner join dbo.CONSTITUENT [GROUP] with (nolock) on GM.GROUPID = [GROUP].ID
        left outer join dbo.GROUPMEMBERDATERANGE GMDR with (nolock) on GM.ID = GMDR.GROUPMEMBERID
        left join dbo.ADDRESS on [GROUP].ID = ADDRESS.CONSTITUENTID
        left join dbo.PHONE on [GROUP].ID = PHONE.CONSTITUENTID
    where
    not ([GROUP].ID in (select ID from @BASICRESULTS)) and
    (
        (GMDR.DATEFROM is null and (GMDR.DATETO is null or GMDR.DATETO > @CURRENTDATEEARLIESTTIME)) or
        (GMDR.DATETO is null and (GMDR.DATEFROM is null or GMDR.DATEFROM <= @CURRENTDATEEARLIESTTIME)) or 
        (GMDR.DATEFROM <= @CURRENTDATEEARLIESTTIME and GMDR.DATETO > @CURRENTDATEEARLIESTTIME)
    ) and 
    (ADDRESS.ID is null or ADDRESS.ISPRIMARY = 1) and
    (PHONE.ID is null or PHONE.ISPRIMARY = 1)

    ) as RESULTSET

    order by
        NAME,
        ADDRESSBLOCK,
        PHONENUMBER

end