USP_DONOR_INFO_HELPER_GETCONSTITS

Parameters

Parameter Parameter Type Mode Description
@DONORSEARCHTEXT nvarchar(500) INOUT
@ABORT bit INOUT

Definition

Copy


CREATE procedure [dbo].[USP_DONOR_INFO_HELPER_GETCONSTITS] (
  @DONORSEARCHTEXT nvarchar(500) output
  ,@ABORT bit output
  )
  with execute as owner
as
declare @ABORT2 bit = @ABORT
  ,@DONORSEARCHTEXT2 nvarchar(500) = @DONORSEARCHTEXT

if len(@DONORSEARCHTEXT2) > 0
begin
  declare @FULLNAME nvarchar(500) = replace(LTRIM(RTRIM(isnull(@DONORSEARCHTEXT2, ''))), '.', ' ')
    ,@KEYNAME nvarchar(100)
    ,@WORD1 nvarchar(500)
    ,@WORD2 nvarchar(500)
    ,@WORD3 nvarchar(500)
    ,@LOOKUPID nvarchar(50)
    ,@ONLYONESPECIFIED bit = 0
    ,@CNT int = 0
    ,@IDX int = 0;

  set @FULLNAME = RTRIM(LTRIM(REPLACE(REPLACE(@FULLNAME, '.', ' '), ',', ', ')))
  set @IDX = charindex(',', @FULLNAME);

  if @IDX > 0
  begin
    --a comma exists, assume everything up to it is the KEYNAME

    set @KEYNAME = RTRIM(SUBSTRING(@FULLNAME, 1, @IDX - 1))
    --remove KEYNAME from FULLNAME

    set @FULLNAME = LTRIM(SUBSTRING(@FULLNAME, @IDX + 1, len(@FULLNAME)))
  end

  --we have already processed any commas we care about, so remove all commas from the FULLNAME

  while CHARINDEX(',', @FULLNAME) > 0
    set @FULLNAME = RTRIM(LTRIM(REPLACE(@FULLNAME, ',', ' ')))

  --remove extra spaces

  while CHARINDEX('  ', @FULLNAME) > 0
    set @FULLNAME = REPLACE(@FULLNAME, '  ', ' ')
  set @IDX = charindex(' ', @FULLNAME);

  if @IDX > 0
  begin
    --a space exists, assume everything up to it is a word

    set @WORD1 = RTRIM(SUBSTRING(@FULLNAME, 1, @IDX - 1))
    --remove KEYNAME from FULLNAME

    set @FULLNAME = LTRIM(SUBSTRING(@FULLNAME, @IDX + 1, len(@FULLNAME)))
  end
  else
  begin
    set @WORD1 = @FULLNAME;
    set @FULLNAME = null;
  end

  set @IDX = charindex(' ', @FULLNAME);

  if @IDX > 0
  begin
    --a space exists, assume everything up to it is a word

    set @WORD2 = RTRIM(SUBSTRING(@FULLNAME, 1, @IDX - 1))
    --remove KEYNAME from FULLNAME

    set @FULLNAME = LTRIM(SUBSTRING(@FULLNAME, @IDX + 1, len(@FULLNAME)))
  end
  else
  begin
    set @WORD2 = @FULLNAME;
    set @FULLNAME = null;
  end

  --at this point, all that is left is the last word (there could be additional spaces, but we can't process any more words)

  set @WORD3 = @FULLNAME
  set @FULLNAME = null

  if len(@WORD1) = 0
    set @WORD1 = null

  if len(@WORD2) = 0
    set @WORD2 = null

  if len(@WORD3) = 0
    set @WORD3 = null

  if @KEYNAME is null
    if @WORD3 is not null
    begin
      set @KEYNAME = @WORD3;
      set @WORD3 = null;
    end
    else
      if @WORD2 is not null
      begin
        set @KEYNAME = @WORD2;
        set @WORD2 = null;
      end
      else
        if @WORD1 is not null
        begin
          set @KEYNAME = @WORD1;
          set @WORD1 = null;
        end

  if LEN(@KEYNAME) > 0
    set @KEYNAME = dbo.UFN_TEXTSEARCH_SANITIZE(@KEYNAME + '%', '/', 1, 0, default);

  if LEN(@WORD1) > 0
    set @WORD1 = dbo.UFN_TEXTSEARCH_SANITIZE(@WORD1 + '%', '/', 1, 0, default);

  if LEN(@WORD2) > 0
    set @WORD2 = dbo.UFN_TEXTSEARCH_SANITIZE(@WORD2 + '%', '/', 1, 0, default);
  set @DONORSEARCHTEXT2 = dbo.UFN_TEXTSEARCH_SANITIZE(@DONORSEARCHTEXT2, '/', 1, default, default);

  merge #TMP_DONOR_INFO_FILTEREDIDS as target
  using (
    --first add all constituents whose LOOKUPID or KEYNAME matches the original search text

    select [ID] = ID, [RECORDTYPE]=2, [SPID]=@@SPID
    from dbo.CONSTITUENT C with (NOLOCK)
    where (KEYNAME like @DONORSEARCHTEXT2)
      or (LOOKUPID like @DONORSEARCHTEXT2)
    ) as source
    on target.ID = source.ID
      and target.RECORDTYPE = source.RECORDTYPE
      and target.SPID = source.SPID
  when not matched
    then
      insert (
        [SPID]
        ,[ID]
        ,[RECORDTYPE]
        )
      values (
        source.SPID
        ,source.ID
        ,source.RECORDTYPE
        );

  set @CNT += @@ROWCOUNT;

  merge #TMP_DONOR_INFO_FILTEREDIDS as target
  using (
    --then add any INDIVIDUALS whose first, middle or last names match (organizations are handle by the first insert above)

    select [ID] = ID, [RECORDTYPE]=2, [SPID]=@@SPID
    from dbo.CONSTITUENT C with (NOLOCK)
    where ISORGANIZATION = 0
      and (
        (
          @WORD1 is null
          and (
            (KEYNAME like @KEYNAME)
            or (FIRSTNAME like @KEYNAME)
            or (MIDDLENAME like @KEYNAME)
            )
          )
        or (
          (KEYNAME like @KEYNAME)
          and (
            @WORD1 is null
            or FIRSTNAME like @WORD1
            )
          and (
            @WORD2 is null
            or MIDDLENAME like @WORD2
            )
          )
        )
    ) as source
    on target.ID = source.ID
      and target.RECORDTYPE = source.RECORDTYPE
      and target.SPID = source.SPID
  when not matched
    then
      insert (
        [SPID]
        ,[ID]
        ,[RECORDTYPE]
        )
      values (
        source.SPID
        ,source.ID
        ,source.RECORDTYPE
        );

  set @CNT += @@ROWCOUNT;

  if @CNT < 1
    set @ABORT2 = 1
end
else
begin
  set @DONORSEARCHTEXT2 = null;
end

set @ABORT = @ABORT2;
set @DONORSEARCHTEXT = @DONORSEARCHTEXT2;