UFN_SMARTQUERY_MEMBERSHIPMAILINGPREFERENCE_2

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@MEMBERSHIPPROGRAMID uniqueidentifier IN
@MAILINGPREFERENCE int IN
@INCLUDENOPREFERENCE bit IN
@EXCLUDEPREFERENCE int IN
@CURRENTAPPUSERID uniqueidentifier IN
@MAXROWS int IN

Definition

Copy


create function dbo.[UFN_SMARTQUERY_MEMBERSHIPMAILINGPREFERENCE_2]
(
  @MEMBERSHIPPROGRAMID uniqueidentifier,
  @MAILINGPREFERENCE int,
  @INCLUDENOPREFERENCE bit,
  @EXCLUDEPREFERENCE int = null,
  @CURRENTAPPUSERID uniqueidentifier = null,
  @MAXROWS int
)
returns @MEMBERSHIPS table
(
  ID uniqueidentifier,
  CONSTITUENTID uniqueidentifier,
  MEMBERNAME nvarchar(154),
  MEMBERSHIPPROGRAMNAME nvarchar(100),
  MEMBERSHIPLEVELNAME nvarchar(100),
  EXPIRATIONDATE datetime,
  STATUS nvarchar(9),
  TYPE nvarchar(100),
  TIER nvarchar(100),
  TERM nvarchar(8)
)
as
begin

  declare @ISADMIN bit;
  declare @APPUSER_IN_NONRACROLE bit;
  declare @APPUSER_IN_NOSECGROUPROLE bit;
  declare @APPUSER_IN_NONSITEROLE bit;
  declare @APPUSER_IN_NO_SITE_ROLE bit;
  declare @TODAY datetime;
  declare @MEMBERSHIPAPPEALCATEGORYID uniqueidentifier;

  set @ISADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
  set @APPUSER_IN_NONRACROLE = dbo.UFN_SECURITY_APPUSER_IN_NONRACROLE(@CURRENTAPPUSERID);
  set @APPUSER_IN_NOSECGROUPROLE = dbo.UFN_SECURITY_APPUSER_IN_NO_SECURITY_GROUP_ROLE(@CURRENTAPPUSERID);
  set @APPUSER_IN_NONSITEROLE = dbo.UFN_SECURITY_APPUSER_IN_NONSITEROLE(@CURRENTAPPUSERID);
  set @APPUSER_IN_NO_SITE_ROLE = dbo.UFN_SECURITY_APPUSER_IN_NO_SITE_ROLE(@CURRENTAPPUSERID);
  set @TODAY = getdate();
  set @MEMBERSHIPAPPEALCATEGORYID = dbo.UFN_APPEALCATEGORYCODE_GETID('Membership');

  insert into @MEMBERSHIPS
    --Repeating the subquery name to emphasize that the "outer apply"s only provide filter criteria (not data to output).

    select top (@MAXROWS)
      MEMBERSHIPSUBQUERY.[ID],
      MEMBERSHIPSUBQUERY.[MEMBERCONSTITUENTID],
      MEMBERSHIPSUBQUERY.[MEMBERNAME],
      MEMBERSHIPSUBQUERY.[MEMBERSHIPPROGRAMNAME],
      MEMBERSHIPSUBQUERY.[MEMBERSHIPLEVELNAME],
      MEMBERSHIPSUBQUERY.EXPIRATIONDATE,
      MEMBERSHIPSUBQUERY.[STATUS],
      MEMBERSHIPSUBQUERY.[TYPE],
      MEMBERSHIPSUBQUERY.[TIER],
      MEMBERSHIPSUBQUERY.[TERM]
    from
    (
      select
        [MEMBERSHIP].[ID],
        [MEMBER].[CONSTITUENTID] [MEMBERCONSTITUENTID],
        [CONSTITUENT].[ID] [RECIPIENTCONSTITUENTID],  -- Same as [MEMBERCONSTITUENTID] in this select clause

        [CONSTITUENT].[NAME] [MEMBERNAME],
        [MEMBERSHIPPROGRAM].[NAME] [MEMBERSHIPPROGRAMNAME],
        [MEMBERSHIPLEVEL].[NAME] [MEMBERSHIPLEVELNAME],
        --The "GETEARLIESTTIME" date function has been inlined here for performance (the part with "cast(@DATE as date)")...

        cast([MEMBERSHIP].[EXPIRATIONDATE] as date) as EXPIRATIONDATE,
        MEMBERSHIP.STATUS as [STATUS],
        [MEMBERSHIPLEVELTYPECODE].[DESCRIPTION] [TYPE],
        [TIERCODE].[DESCRIPTION] [TIER],
        [MEMBERSHIPLEVELTERM].[TERM],
        [MEMBERSHIPPROGRAM].[ID] [MEMBERSHIPPROGRAMID],
        [MEMBERSHIPPROGRAM].[SITEID] [SITEID],
        [MEMBERSHIP].STATUSCODE
      from
        dbo.[MEMBERSHIP]
        inner join dbo.[MEMBER] on 
          [MEMBER].[MEMBERSHIPID] = [MEMBERSHIP].[ID] and 
          [MEMBER].[ISPRIMARY] = 1 and
          [MEMBER].[ISDROPPED] = 0
        inner join dbo.[CONSTITUENT] on [MEMBER].[CONSTITUENTID] = [CONSTITUENT].[ID] -- Membership recipient's constituentID

        inner join dbo.[MEMBERSHIPPROGRAM] on [MEMBERSHIPPROGRAM].[ID] = [MEMBERSHIP].[MEMBERSHIPPROGRAMID]
        inner join dbo.[MEMBERSHIPLEVEL] on [MEMBERSHIPLEVEL].[ID] = [MEMBERSHIP].[MEMBERSHIPLEVELID]
        left join dbo.[MEMBERSHIPLEVELTYPECODE] on [MEMBERSHIPLEVELTYPECODE].[ID] = [MEMBERSHIP].[MEMBERSHIPLEVELTYPECODEID]
        left join dbo.[TIERCODE] on [TIERCODE].[ID] = [MEMBERSHIPLEVEL].[TIERCODEID]
        left join dbo.[MEMBERSHIPLEVELTERM] on [MEMBERSHIPLEVELTERM].[ID] = [MEMBERSHIP].[MEMBERSHIPLEVELTERMID]
      where
        [MEMBERSHIP].[SENDRENEWALCODE] in (1,2)

      union    -- Changed to a union to remove a conditional inner join to CONSTITUENT.ID and prevent query timeout.


      select
       [MEMBERSHIP].[ID],
        [MEMBER].[CONSTITUENTID] [MEMBERCONSTITUENTID],
        [CONSTITUENT].[ID] [RECIPIENTCONSTITUENTID],  -- Constituent who gave the membership

        [CONSTITUENT].[NAME] [MEMBERNAME],
        [MEMBERSHIPPROGRAM].[NAME] [MEMBERSHIPPROGRAMNAME],
        [MEMBERSHIPLEVEL].[NAME] [MEMBERSHIPLEVELNAME],
        --The "GETEARLIESTTIME" date function has been inlined here for performance (the part with "cast(@DATE as date)")...

        cast([MEMBERSHIP].[EXPIRATIONDATE] as date) as EXPIRATIONDATE,
        MEMBERSHIP.STATUS as [STATUS],
        [MEMBERSHIPLEVELTYPECODE].[DESCRIPTION] [TYPE],
        [TIERCODE].[DESCRIPTION] [TIER],
        [MEMBERSHIPLEVELTERM].[TERM],
        [MEMBERSHIPPROGRAM].[ID] [MEMBERSHIPPROGRAMID],
        [MEMBERSHIPPROGRAM].[SITEID] [SITEID],
        [MEMBERSHIP].[STATUSCODE]
      from
        dbo.[MEMBERSHIP]
        inner join dbo.[MEMBER] on 
          [MEMBER].[MEMBERSHIPID] = [MEMBERSHIP].[ID] and 
          [MEMBER].[ISPRIMARY] = 1 and
          [MEMBER].[ISDROPPED] = 0
        inner join dbo.[CONSTITUENT] on [MEMBERSHIP].[GIVENBYID] = [CONSTITUENT].[ID] -- Membership giver's constituentID

        inner join dbo.[MEMBERSHIPPROGRAM] on [MEMBERSHIPPROGRAM].[ID] = [MEMBERSHIP].[MEMBERSHIPPROGRAMID]
        inner join dbo.[MEMBERSHIPLEVEL] on [MEMBERSHIPLEVEL].[ID] = [MEMBERSHIP].[MEMBERSHIPLEVELID]
        left join dbo.[MEMBERSHIPLEVELTYPECODE] on [MEMBERSHIPLEVELTYPECODE].[ID] = [MEMBERSHIP].[MEMBERSHIPLEVELTYPECODEID]
        left join dbo.[TIERCODE] on [TIERCODE].[ID] = [MEMBERSHIPLEVEL].[TIERCODEID]
        left join dbo.[MEMBERSHIPLEVELTERM] on [MEMBERSHIPLEVELTERM].[ID] = [MEMBERSHIP].[MEMBERSHIPLEVELTERMID]
      where
        [MEMBERSHIP].[SENDRENEWALCODE] in (0,2)
    ) as MEMBERSHIPSUBQUERY
    outer apply (
      select top 1
        MP.ID,
        MP.SENDMAIL,
        MP.DELIVERYMETHODCODE,
        MP.DONOTSENDOTHERCHANNEL
      from dbo.MAILPREFERENCE MP
      where 
        MP.MAILTYPECODE = 1 and -- appeal

        (
          MP.CATEGORYCODEID = @MEMBERSHIPAPPEALCATEGORYID or
          MP.CATEGORYCODEID is null
        ) and
        MP.CONSTITUENTID = [RECIPIENTCONSTITUENTID]
      order by MP.CATEGORYCODEID desc --Rule with Membership category rules beats rule without

    ) as [PREFERENCE]
    outer apply (
      select
        case 
          when
            [PREFERENCE].DELIVERYMETHODCODE = 0 and 
            exists (
              select [ADDRESS].ID 
              from dbo.[ADDRESS] 
              where 
                [ADDRESS].CONSTITUENTID = [RECIPIENTCONSTITUENTID] and 
                [ADDRESS].DONOTMAIL = 0 
            )
              then 1
          when 
            [PREFERENCE].DELIVERYMETHODCODE = 1 and 
            exists (
              select EMAILADDRESS.ID 
              from dbo.EMAILADDRESS 
              where 
                EMAILADDRESS.CONSTITUENTID = [RECIPIENTCONSTITUENTID] and 
                EMAILADDRESS.DONOTEMAIL = 0
            )
              then 1
          else 0
        end [HAS]
    ) as [PREFERENCECONTACTINFORMATION]
    where
      (@MEMBERSHIPPROGRAMID is null or [MEMBERSHIPPROGRAMID] = @MEMBERSHIPPROGRAMID) and
      (
        @ISADMIN = 1 or 
        @APPUSER_IN_NONSITEROLE = 1 or 
        (
          (SITEID is null and @APPUSER_IN_NO_SITE_ROLE = 1) or
          SITEID in (select SITEID from dbo.UFN_SITESFORUSER(@CURRENTAPPUSERID))
        )
      ) and
      (STATUSCODE not in (1, 2) ) and
      (
        @ISADMIN = 1 or 
        @APPUSER_IN_NONRACROLE = 1 or 
        dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, [RECIPIENTCONSTITUENTID], @APPUSER_IN_NOSECGROUPROLE) = 1
      ) and
      --Make sure they aren't refusing communication

      (
        [PREFERENCE].[ID] is null or
        [PREFERENCE].[SENDMAIL] = 1
      ) and
      (
        -- Check "Do not mail" or "Do not email" of constituent's maining address or email address

        (
          @MAILINGPREFERENCE is null or
          (
            (
              [PREFERENCE].[DELIVERYMETHODCODE] <> @MAILINGPREFERENCE or
              [PREFERENCE].[ID] is null
            ) and
            (
              exists (
                select [ADDRESS].ID 
                from dbo.[ADDRESS] 
                where 
                  [ADDRESS].CONSTITUENTID = [RECIPIENTCONSTITUENTID] and 
                  [ADDRESS].DONOTMAIL = 0 and 
                  @MAILINGPREFERENCE = 0
              ) or
              exists (
                select EMAILADDRESS.ID 
                from dbo.EMAILADDRESS 
                where 
                  EMAILADDRESS.CONSTITUENTID = [RECIPIENTCONSTITUENTID] and 
                  EMAILADDRESS.DONOTEMAIL = 0 and 
                  @MAILINGPREFERENCE = 1
              )
            )
          ) or
          (--Already did this check 

            [PREFERENCE].[DELIVERYMETHODCODE] = @MAILINGPREFERENCE and 
            [PREFERENCECONTACTINFORMATION].[HAS] = 1
          )
        ) and
        --Check exclude preference

        (
          @EXCLUDEPREFERENCE is null or
          [PREFERENCE].ID is null or
          not (
            [PREFERENCE].DELIVERYMETHODCODE <> @EXCLUDEPREFERENCE and --If the constituent hasn't chosen this mailing preference

            [PREFERENCE].DONOTSENDOTHERCHANNEL = 1 --they have denied it here

          )
        ) and
        -- Check communication preference

        (
          @MAILINGPREFERENCE is null or
          (
            [PREFERENCE].DELIVERYMETHODCODE = @MAILINGPREFERENCE and
            [PREFERENCE].SENDMAIL = 1
          ) or
          -- No preference

          (
            @INCLUDENOPREFERENCE = 1 and
            --Doesn't have a "Don't send preference"

            [PREFERENCE].ID is null
          ) or
          --Constituent has the opposite mailing preference, but doesn't have contact information for their preference

          --Treating them here as if they don't have a preference

          --There is a check above to see that the constituent has contact information for the selected mailing preference

          (
            @INCLUDENOPREFERENCE = 1 and
            [PREFERENCE].DELIVERYMETHODCODE <> @MAILINGPREFERENCE and
            [PREFERENCECONTACTINFORMATION].[HAS] = 0 and
            [PREFERENCE].DONOTSENDOTHERCHANNEL = 0 and
            [PREFERENCE].SENDMAIL = 1
          )
        )
      )
    order by MEMBERNAME, MEMBERSHIPPROGRAMNAME;

  return;
end;