UFN_ADDRESSPROCESS_MAILPREFERENCES

Process mail preferences for business processes.

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@ADDRESSPROCESSINGOPTIONID uniqueidentifier IN
@MAILTYPE tinyint IN
@PARAMETERSETID uniqueidentifier IN
@DATE datetime IN

Definition

Copy


CREATE function dbo.[UFN_ADDRESSPROCESS_MAILPREFERENCES]
(
  @ADDRESSPROCESSINGOPTIONID uniqueidentifier,
  @MAILTYPE tinyint,
  @PARAMETERSETID uniqueidentifier,
  @DATE datetime
)
returns table
as
return
(
  select
    MP.CONSTITUENTID,
    isnull(SA.ADDRESSID, A.ID) as ADDRESSID,
    NULL AS CONTACTID,
    NULL as POSITION,
    NULL as GROUPCONTACTID
  from dbo.MAILPREFERENCE MP
  inner join dbo.CONSTITUENT C on MP.CONSTITUENTID = C.ID
  left join dbo.UFN_ADDRESSPROCESS_SEASONALADDRESSES(@DATE) SA on MP.CONSTITUENTID = SA.CONSTITUENTID and MP.USESEASONALADDRESS = 1
  inner join (select
                ADDRESS.ID,
                ADDRESS.DONOTMAIL,
                MAILPREFERENCE.ID as MAILPREFERENCEID
              from dbo.MAILPREFERENCE
              inner join dbo.ADDRESS on MAILPREFERENCE.ADDRESSID = ADDRESS.ID
              where MAILPREFERENCE.USEPRIMARYADDRESS = 0

              union all

              select
                ADDRESS.ID,
                ADDRESS.DONOTMAIL,
                MAILPREFERENCE.ID as MAILPREFERENCEID
              from dbo.MAILPREFERENCE
              inner join dbo.ADDRESS on MAILPREFERENCE.CONSTITUENTID = ADDRESS.CONSTITUENTID
              where MAILPREFERENCE.USEPRIMARYADDRESS = 1 and ADDRESS.ISPRIMARY = 1
             ) as A on MP.ID = A.MAILPREFERENCEID
  where MP.SENDMAIL = 1
  and
  (
    (C.ISORGANIZATION = 0 and C.ISGROUP = 0 and (select INDUSECONSTITUENTPREFS from dbo.ADDRESSPROCESSINGOPTION where ID = @ADDRESSPROCESSINGOPTIONID) = 1)
    or (C.ISORGANIZATION = 1 and (select ORGUSECONSTITUENTPREFS from dbo.ADDRESSPROCESSINGOPTION where ID = @ADDRESSPROCESSINGOPTIONID) = 1)
    or (C.ISGROUP = 1 and (select GROUPUSECONSTITUENTPREFS from dbo.ADDRESSPROCESSINGOPTION where ID = @ADDRESSPROCESSINGOPTIONID) = 1)
  )
  and MP.DELIVERYMETHODCODE = 0
  and A.DONOTMAIL = 0
  and MP.MAILTYPECODE = @MAILTYPE
  and
  (
    (case @MAILTYPE
      when 0 then ACKNOWLEDGEMENTID
      when 3 then CORRESPONDENCEID
      when 4 then PLEDGEREMINDERID
      when 8 then PURPOSEID
      else null
     end) = @PARAMETERSETID
    or 
    (
      (case @MAILTYPE
        when 0 then ACKNOWLEDGEMENTID
        when 3 then CORRESPONDENCEID
        when 4 then PLEDGEREMINDERID
        when 8 then PURPOSEID
        else null
       end is null)
      and not exists(select *
                     from dbo.MAILPREFERENCE 
                     where (case @MAILTYPE
                             when 0 then ACKNOWLEDGEMENTID
                             when 3 then CORRESPONDENCEID
                             when 4 then PLEDGEREMINDERID
                             when 8 then PURPOSEID
                             else null
                            end) = @PARAMETERSETID
                     and CONSTITUENTID = MP.CONSTITUENTID)
      -- only consider correspondence codes when there isn't a specific process preference

      and
      (@MAILTYPE <> 3 or
        (@MAILTYPE = 3 and
          (
            (MP.CORRESPONDENCECODEID is null and not exists(select ID from dbo.MAILPREFERENCE where CORRESPONDENCECODEID = (select CORRESPONDENCECODEID from dbo.CORRESPONDENCEPROCESS where ID = @PARAMETERSETID) and CONSTITUENTID = MP.CONSTITUENTID))
            or
            (MP.CORRESPONDENCECODEID = (select CORRESPONDENCECODEID from dbo.CORRESPONDENCEPROCESS where ID = @PARAMETERSETID) and not exists (select ID from dbo.MAILPREFERENCE where CORRESPONDENCEID = @PARAMETERSETID and CONSTITUENTID = MP.CONSTITUENTID))
          )
        )
      )
    )
  ) 
  and
  (@MAILTYPE <> 1 or
    (@MAILTYPE = 1 and
      (
        MP.BUSINESSUNITCODEID is null and
        MP.CATEGORYCODEID is null and
        MP.SITEID is null and
        not exists(select *
                   from dbo.MAILPREFERENCE sub, dbo.APPEAL
                   left join dbo.APPEALBUSINESSUNIT AB on AB.APPEALID = APPEAL.ID
                   where APPEAL.ID = @PARAMETERSETID and sub.ID <> MP.ID
                   and sub.CONSTITUENTID = MP.CONSTITUENTID
                   and ((sub.SITEID = APPEAL.SITEID and sub.CATEGORYCODEID = APPEAL.APPEALCATEGORYCODEID and sub.BUSINESSUNITCODEID = AB.BUSINESSUNITCODEID)
                     or (sub.SITEID is null and sub.CATEGORYCODEID = APPEAL.APPEALCATEGORYCODEID and sub.BUSINESSUNITCODEID = AB.BUSINESSUNITCODEID)
                     or (sub.SITEID = APPEAL.SITEID and sub.CATEGORYCODEID is null and sub.BUSINESSUNITCODEID = AB.BUSINESSUNITCODEID)
                     or (sub.SITEID = APPEAL.SITEID and sub.CATEGORYCODEID = APPEAL.APPEALCATEGORYCODEID and sub.BUSINESSUNITCODEID is null)
                     or (sub.SITEID is null and sub.CATEGORYCODEID is null and sub.BUSINESSUNITCODEID = AB.BUSINESSUNITCODEID)
                     or (sub.SITEID is null and sub.CATEGORYCODEID = APPEAL.APPEALCATEGORYCODEID and sub.BUSINESSUNITCODEID is null)
                     or (sub.SITEID = APPEAL.SITEID and sub.CATEGORYCODEID is null and sub.BUSINESSUNITCODEID is null)))
      )
      or
      (
        (MP.BUSINESSUNITCODEID in (select BUSINESSUNITCODEID from dbo.APPEALBUSINESSUNIT where APPEALID = @PARAMETERSETID) or MP.BUSINESSUNITCODEID is null) and
        (MP.CATEGORYCODEID = (select APPEALCATEGORYCODEID from dbo.APPEAL where ID = @PARAMETERSETID) or MP.CATEGORYCODEID is null) and
        (MP.SITEID = (select SITEID from dbo.APPEAL where ID = @PARAMETERSETID) or MP.SITEID is null) and
        not (MP.CATEGORYCODEID is null and MP.SITEID is null and MP.BUSINESSUNITCODEID is null)
      )
    )
  )
  and
  (@MAILTYPE <> 2 or
    (@MAILTYPE = 2 and
      (
        (MP.EVENTCATEGORYCODEID is null and MP.SITEID is null) and
        not exists(select *
                   from dbo.MAILPREFERENCE sub, dbo.INVITATION I 
                   inner join dbo.EVENT E on I.EVENTID = E.ID 
                   left join dbo.EVENTSITE on EVENTSITE.EVENTID = E.ID
                   where I.ID = @PARAMETERSETID and sub.ID <> MP.ID                                     
                   and sub.CONSTITUENTID = MP.CONSTITUENTID 
                   and ((sub.SITEID = EVENTSITE.SITEID and sub.EVENTCATEGORYCODEID = E.EVENTCATEGORYCODEID)
                     or (sub.SITEID is null and sub.EVENTCATEGORYCODEID = E.EVENTCATEGORYCODEID)
                     or (sub.EVENTCATEGORYCODEID is null and sub.SITEID = EVENTSITE.SITEID))
                  )
      )
      or
      (
        (MP.EVENTCATEGORYCODEID = (select EVENTCATEGORYCODEID from dbo.INVITATION I inner join dbo.EVENT E on I.EVENTID = E.ID where I.ID = @PARAMETERSETID) or MP.EVENTCATEGORYCODEID is null) and
        (MP.SITEID in (select SITEID from dbo.INVITATION I inner join dbo.EVENTSITE E on I.EVENTID = E.EVENTID where I.ID = @PARAMETERSETID) or MP.SITEID is null) and
        not (MP.EVENTCATEGORYCODEID is null and MP.SITEID is null)
      )
    )
  )
  and not exists(select ID from dbo.MAILPREFERENCEORGCONTACTTYPE where MAILPREFERENCEID = MP.ID)

  union all

  --grab contact addresses

  select
    MP.CONSTITUENTID,
    isnull(CA.ID,OA.ID) as ADDRESSID,
    R.RECIPROCALCONSTITUENTID as CONTACTID,
    isnull((select top 1 JOBTITLE from dbo.RELATIONSHIPJOBINFO where RELATIONSHIPSETID = R.RELATIONSHIPSETID order by STARTDATE desc), '') as POSITION,
    NULL as GROUPCONTACTID
  from dbo.MAILPREFERENCEORGCONTACTTYPE 
  inner join dbo.MAILPREFERENCE MP on MAILPREFERENCEORGCONTACTTYPE.MAILPREFERENCEID = MP.ID
  inner join dbo.CONSTITUENT ORG on MP.CONSTITUENTID = ORG.ID
  left join dbo.ADDRESS OA on ORG.ID = OA.CONSTITUENTID and OA.ISPRIMARY = 1 and OA.DONOTMAIL = 0
  left join dbo.RELATIONSHIP R on R.RELATIONSHIPCONSTITUENTID = ORG.ID
  left join dbo.ADDRESS CA on R.ID = CA.RELATIONSHIPID
  where MP.SENDMAIL = 1
  and MP.DELIVERYMETHODCODE = 0
  and MP.MAILTYPECODE = @MAILTYPE
  and @MAILTYPE <> 5
  --For receipts, only return the first contact

  and
  (
    (case @MAILTYPE
      when 0 then ACKNOWLEDGEMENTID
      when 3 then CORRESPONDENCEID
      when 4 then PLEDGEREMINDERID
      when 8 then PURPOSEID
      else null
     end) = @PARAMETERSETID
    or
    (
      (case @MAILTYPE
        when 0 then ACKNOWLEDGEMENTID
        when 3 then CORRESPONDENCEID
        when 4 then PLEDGEREMINDERID
        when 8 then PURPOSEID
        else null
       end) is null
      and not exists(select *
                     from dbo.MAILPREFERENCE 
                     where (case @MAILTYPE
                             when 0 then ACKNOWLEDGEMENTID
                             when 3 then CORRESPONDENCEID
                             when 4 then PLEDGEREMINDERID
                             when 8 then PURPOSEID
                             else null
                            end) = @PARAMETERSETID
      and CONSTITUENTID = MP.CONSTITUENTID)
      -- only consider correspondence codes when there isn't a specific process preference

      and 
      (@MAILTYPE <> 3 or
        (@MAILTYPE = 3 and
          (
            (MP.CORRESPONDENCECODEID is null and not exists(select ID from dbo.MAILPREFERENCE where CORRESPONDENCECODEID = (select CORRESPONDENCECODEID from dbo.CORRESPONDENCEPROCESS where ID = @PARAMETERSETID) and CONSTITUENTID = MP.CONSTITUENTID))
            or
            (MP.CORRESPONDENCECODEID = (select CORRESPONDENCECODEID from dbo.CORRESPONDENCEPROCESS where ID = @PARAMETERSETID) and not exists (select ID from dbo.MAILPREFERENCE where CORRESPONDENCEID = @PARAMETERSETID and CONSTITUENTID = MP.CONSTITUENTID))
          )
        )
      )
    )
  ) 
  and
  (@MAILTYPE <> 1 or
    (@MAILTYPE = 1 and
      (
        MP.BUSINESSUNITCODEID is null and
        MP.CATEGORYCODEID is null and
        MP.SITEID is null and
        not exists(select *
                   from dbo.MAILPREFERENCE sub, dbo.APPEAL
                   left join dbo.APPEALBUSINESSUNIT AB on AB.APPEALID = APPEAL.ID
                   where APPEAL.ID = @PARAMETERSETID and sub.ID <> MP.ID
                   and sub.CONSTITUENTID = MP.CONSTITUENTID
                   and ((sub.SITEID = APPEAL.SITEID and sub.CATEGORYCODEID = APPEAL.APPEALCATEGORYCODEID and sub.BUSINESSUNITCODEID = AB.BUSINESSUNITCODEID)
                     or (sub.SITEID is null and sub.CATEGORYCODEID = APPEAL.APPEALCATEGORYCODEID and sub.BUSINESSUNITCODEID = AB.BUSINESSUNITCODEID)
                     or (sub.SITEID = APPEAL.SITEID and sub.CATEGORYCODEID is null and sub.BUSINESSUNITCODEID = AB.BUSINESSUNITCODEID)
                     or (sub.SITEID = APPEAL.SITEID and sub.CATEGORYCODEID = APPEAL.APPEALCATEGORYCODEID and sub.BUSINESSUNITCODEID is null)
                     or (sub.SITEID is null and sub.CATEGORYCODEID is null and sub.BUSINESSUNITCODEID = AB.BUSINESSUNITCODEID)
                     or (sub.SITEID is null and sub.CATEGORYCODEID = APPEAL.APPEALCATEGORYCODEID and sub.BUSINESSUNITCODEID is null)
                     or (sub.SITEID = APPEAL.SITEID and sub.CATEGORYCODEID is null and sub.BUSINESSUNITCODEID is null)))
      )
      or
      (
        (MP.BUSINESSUNITCODEID in (select BUSINESSUNITCODEID from dbo.APPEALBUSINESSUNIT where APPEALID = @PARAMETERSETID) or MP.BUSINESSUNITCODEID is null) and
        (MP.CATEGORYCODEID = (select APPEALCATEGORYCODEID from dbo.APPEAL where ID = @PARAMETERSETID) or MP.CATEGORYCODEID is null) and
        (MP.SITEID = (select SITEID from dbo.APPEAL where ID = @PARAMETERSETID) or MP.SITEID is null) and
        not (MP.CATEGORYCODEID is null and MP.SITEID is null and MP.BUSINESSUNITCODEID is null)
      )
    )
  )
  and
  (@MAILTYPE <> 2 or
    (@MAILTYPE = 2 and
      (
        (MP.EVENTCATEGORYCODEID is null and MP.SITEID is null) and
        not exists(select *
                   from dbo.MAILPREFERENCE sub, dbo.INVITATION I 
                   inner join dbo.EVENT E on I.EVENTID = E.ID 
                   left join dbo.EVENTSITE on EVENTSITE.EVENTID = E.ID
              where I.ID = @PARAMETERSETID and sub.ID <> MP.ID                                     
                   and sub.CONSTITUENTID = MP.CONSTITUENTID 
                   and ((sub.SITEID = EVENTSITE.SITEID and sub.EVENTCATEGORYCODEID = E.EVENTCATEGORYCODEID)
                     or (sub.SITEID is null and sub.EVENTCATEGORYCODEID = E.EVENTCATEGORYCODEID)
                     or (sub.EVENTCATEGORYCODEID is null and sub.SITEID = EVENTSITE.SITEID)))
      )
      or
      (
        (MP.EVENTCATEGORYCODEID = (select EVENTCATEGORYCODEID from dbo.INVITATION I inner join dbo.EVENT E on I.EVENTID = E.ID where I.ID = @PARAMETERSETID) or MP.EVENTCATEGORYCODEID is null) and
        (MP.SITEID in (select SITEID from dbo.INVITATION I inner join dbo.EVENTSITE E on I.EVENTID = E.EVENTID where I.ID = @PARAMETERSETID) or MP.SITEID is null) and
        not (MP.EVENTCATEGORYCODEID is null and MP.SITEID is null)
      )
    )
  )                    
  and R.ISCONTACT = 1
  and 
  (
    (R.CONTACTTYPECODEID = MAILPREFERENCEORGCONTACTTYPE.CONTACTTYPECODEID) or
    (R.ISPRIMARYCONTACT = 1 and MAILPREFERENCEORGCONTACTTYPE.USEPRIMARYCONTACT = 1)
  )
  and CA.DONOTMAIL = 0
  and ((select ORGUSECONSTITUENTPREFS from dbo.ADDRESSPROCESSINGOPTION where ID = @ADDRESSPROCESSINGOPTIONID) = 1)

  union all

  --For receipts, only grab the first contact found

  select
    MP.CONSTITUENTID,
    isnull(MPO.ADDRESSID,OA.ID) as ADDRESSID,
    MPO.RECIPROCALCONSTITUENTID as CONTACTID,
    MPO.POSITION as POSITION,
    NULL as GROUPCONTACTID
  from dbo.CONSTITUENT ORG
  inner join dbo.MAILPREFERENCE MP on MP.CONSTITUENTID = ORG.ID
  left join dbo.ADDRESS OA on ORG.ID = OA.CONSTITUENTID and OA.ISPRIMARY = 1 and OA.DONOTMAIL = 0
  left join dbo.STATE OS on OA.STATEID = OS.ID
  left join dbo.COUNTRY OC on OA.COUNTRYID = OC.ID
  cross apply (
    select TOP 1
      RELATIONSHIP.ID, 
      RELATIONSHIP.RECIPROCALCONSTITUENTID,
      isnull((select top 1 JOBTITLE from dbo.RELATIONSHIPJOBINFO where RELATIONSHIPSETID = RELATIONSHIP.RELATIONSHIPSETID order by STARTDATE desc), '') as POSITION,
      A.ID as ADDRESSID
    from dbo.MAILPREFERENCEORGCONTACTTYPE APO
    inner join dbo.CONTACTTYPECODE CTC on APO.CONTACTTYPECODEID = CTC.ID or APO.USEPRIMARYCONTACT = 1
    left join dbo.RELATIONSHIP on APO.CONTACTTYPECODEID = RELATIONSHIP.CONTACTTYPECODEID or (APO.USEPRIMARYCONTACT = 1 and RELATIONSHIP.ISPRIMARYCONTACT = 1)
    left join dbo.ADDRESS A on RELATIONSHIP.ID = A.RELATIONSHIPID 
    where APO.MAILPREFERENCEID = MP.ID 
    and RELATIONSHIP.RELATIONSHIPCONSTITUENTID = ORG.ID 
    and RELATIONSHIP.ISCONTACT = 1
    and A.DONOTMAIL = 0
    order by APO.USEPRIMARYCONTACT desc, CTC.DESCRIPTION asc
  ) MPO
  where MP.SENDMAIL = 1
  and MP.DELIVERYMETHODCODE = 0
  and MP.MAILTYPECODE = @MAILTYPE
  and @MAILTYPE = 5
  --For receipts, only return the first contact

  and ((select ORGUSECONSTITUENTPREFS from dbo.ADDRESSPROCESSINGOPTION where ID = @ADDRESSPROCESSINGOPTIONID) = 1)

  union all

  -- grab group member addresses

  select
    MP.CONSTITUENTID,
    isnull(SA.ADDRESSID,A.ID) as ADDRESSID,
    NULL AS CONTACTID,
    NULL as POSITION,
    GM.MEMBERID as GROUPCONTACTID
  from dbo.MAILPREFERENCEGROUPCONTACT GC 
  inner join dbo.MAILPREFERENCE MP on GC.MAILPREFERENCEID = MP.ID
  inner join dbo.CONSTITUENT C on MP.CONSTITUENTID = C.ID
  inner join dbo.GROUPMEMBER GM on (GM.GROUPID=C.ID and (GC.CONSTITUENTID=GM.MEMBERID or (GC.USEPRIMARYCONTACT=1 and GM.ISPRIMARY=1)))
  left join dbo.UFN_ADDRESSPROCESS_SEASONALADDRESSES(@DATE) SA on GM.MEMBERID = SA.CONSTITUENTID and MP.USESEASONALADDRESS = 1
  inner join dbo.ADDRESS A on (GM.MEMBERID = A.CONSTITUENTID and (A.ID = GC.ADDRESSID or (GC.USEPRIMARYADDRESS = 1 and A.ISPRIMARY = 1)))
  where MP.SENDMAIL = 1
  and (C.ISGROUP = 1 and (select GROUPUSECONSTITUENTPREFS from dbo.ADDRESSPROCESSINGOPTION where ID = @ADDRESSPROCESSINGOPTIONID) = 1)
  and MP.DELIVERYMETHODCODE = 0
  and A.DONOTMAIL = 0
  and MP.MAILTYPECODE = @MAILTYPE
  and
  (
    (case @MAILTYPE
      when 0 then ACKNOWLEDGEMENTID
      when 3 then CORRESPONDENCEID
      when 4 then PLEDGEREMINDERID
      when 8 then PURPOSEID
      else null
     end) = @PARAMETERSETID
    or 
    (case @MAILTYPE
      when 0 then ACKNOWLEDGEMENTID
      when 3 then CORRESPONDENCEID
      when 4 then PLEDGEREMINDERID
      when 8 then PURPOSEID
      else null
     end) is null
   )
   and
   (@MAILTYPE <> 3 or
    (@MAILTYPE = 3 and
      (
        (MP.CORRESPONDENCECODEID is null and not exists(select ID from dbo.MAILPREFERENCE where CORRESPONDENCECODEID = (select CORRESPONDENCECODEID from dbo.CORRESPONDENCEPROCESS where ID = @PARAMETERSETID) and CONSTITUENTID = MP.CONSTITUENTID))
        or
        (MP.CORRESPONDENCECODEID = (select CORRESPONDENCECODEID from dbo.CORRESPONDENCEPROCESS where ID = @PARAMETERSETID) and not exists (select ID from dbo.MAILPREFERENCE where CORRESPONDENCEID = @PARAMETERSETID and CONSTITUENTID = MP.CONSTITUENTID))
      )
    )
  )
);