USP_DATALIST_CONSTITUENTGROUPCORRESPONDENCE

This datalist returns all correspondence for a constituent group and its members.

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID uniqueidentifier IN Input parameter indicating the context ID for the data list.
@DATEFILTER tinyint IN Date range
@CORRESPONDENCETYPECODE smallint IN Communication
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@SITEFILTERMODE tinyint IN Sites
@SITESSELECTED xml IN
@SECURITYFEATUREID uniqueidentifier IN Input parameter indicating the ID of the feature to use for site security checking.
@SECURITYFEATURETYPE tinyint IN Input parameter indicating the type of the feature to use for site security checking.
@CHANNEL smallint IN Channel

Definition

Copy


            CREATE procedure dbo.USP_DATALIST_CONSTITUENTGROUPCORRESPONDENCE
            (    
                @CONSTITUENTID uniqueidentifier,
                @DATEFILTER tinyint = null,
                @CORRESPONDENCETYPECODE smallint = null,
                @CURRENTAPPUSERID uniqueidentifier,
                @SITEFILTERMODE tinyint = 0,
                @SITESSELECTED xml = null,
                @SECURITYFEATUREID uniqueidentifier = null,
                @SECURITYFEATURETYPE tinyint = null,
                @CHANNEL smallint = 99
            ) as
            set nocount on;

            declare @DATALISTID uniqueidentifier;
            set @DATALISTID = 'b3c90e29-5619-4909-9d1b-516d2623d10a';

            declare @ENTERPRISEINSTALLED bit = dbo.[UFN_INSTALLEDPRODUCTS_PRODUCTIS]('3117D2C8-7F46-42F2-ABEB-B654F2F63046');

            if @DATEFILTER is null begin
                  set @DATEFILTER = 9;  -- last 12 months;

              end

              if @CORRESPONDENCETYPECODE is null begin
                  set @CORRESPONDENCETYPECODE = 99; -- all;

              end

              declare @STARTDATE datetime;
              declare @ENDDATE datetime;

              exec dbo.USP_RESOLVEDATEFILTER @DATEFILTER=@DATEFILTER, @STARTDATE=@STARTDATE output, @ENDDATE=@ENDDATE output;

              with CORRESPONDENCE_CTE as
              (
              -- group member general correspondence

                  select
                      convert(nchar(36),C.[ID]) ID,
                      C.CONSTITUENTID CONSTITUENTID,
                      C.[DATESENT] DATESENT,
                      0 CORRESPONDENCETYPECODE,
                      'General Correspondence' CORRESPONDENCETYPE,
                      CC.NAME DETAILS,
                      CA.[USERNAME] PROCESSOR,
                      C.[COMMENTS] COMMENTS,
                      convert(nchar(36), CORRESPONDENCEPROCESSSTATUS.PARAMETERSETID) RECORDID,
                      0 FINDERNUMBER,
                        case 
                            when exists(
                                    select 1 
                                    from dbo.CONSTITUENTCORRESPONDENCERESPONSE 
                                    where CONSTITUENTCORRESPONDENCERESPONSE.CONSTITUENTCORRESPONDENCEID=C.ID
                                )
                                then convert(bit,1
                            else convert(bit,0
                        end HASRESPONSES,
                    'E91F460E-43C0-40DF-BDA9-1D5346E6B535' as PREVIEWDATAFORM,
                    convert(nchar(36),C.[ID]) as PREVIEWDATAFORMRECORDID,
                    CC.[SITEID] as SITEID,
                    case  --If correspondence doesn't have a code, the record is unsecured

                        when CC.ID is null 
                            then 0
                        else 1 
                    end as SITEENFORCEMENT,
                    99 as CHANNEL
                  from
                      dbo.[CONSTITUENTCORRESPONDENCE] C
                      left join dbo.[CORRESPONDENCECODE] CC on CC.[ID] = C.[CORRESPONDENCECODEID]
                      left join dbo.[CORRESPONDENCEPROCESSRUNHISTORY] on C.CORRESPONDENCEPROCESSRUNHISTORYID = CORRESPONDENCEPROCESSRUNHISTORY.ID
                        left join dbo.[CORRESPONDENCEPROCESSSTATUS] on CORRESPONDENCEPROCESSSTATUS.ID = CORRESPONDENCEPROCESSRUNHISTORY.CORRESPONDENCEPROCESSSTATUSID
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = C.[ADDEDBYID]
                      inner join dbo.GROUPMEMBER GM on C.CONSTITUENTID = GM.MEMBERID
                  where
                      GM.GROUPID = @CONSTITUENTID
                      and (@CORRESPONDENCETYPECODE = 0 or @CORRESPONDENCETYPECODE = 99)
                      and (C.[DATESENT] >= @STARTDATE and C.[DATESENT] <= @ENDDATE)
                      and @ENTERPRISEINSTALLED = 1 
                      and @CHANNEL = 99

                  union all

              -- group general correspondence

                  select
                      convert(nchar(36),C.[ID]) ID,
                      C.CONSTITUENTID CONSTITUENTID,
                      C.[DATESENT] DATESENT,
                      0 CORRESPONDENCETYPECODE,
                      'General Correspondence' CORRESPONDENCETYPE,
                      CC.NAME DETAILS,
                      CA.[USERNAME] PROCESSOR,
                      C.[COMMENTS] COMMENTS,
                      convert(nchar(36), CORRESPONDENCEPROCESSSTATUS.PARAMETERSETID) RECORDID,
                      0 FINDERNUMBER,
                        case 
                            when exists(
                                    select 1 
                                    from dbo.CONSTITUENTCORRESPONDENCERESPONSE 
                                    where CONSTITUENTCORRESPONDENCERESPONSE.CONSTITUENTCORRESPONDENCEID=C.ID
                                )
                                then convert(bit,1
                            else convert(bit,0
                        end HASRESPONSES,
                    'E91F460E-43C0-40DF-BDA9-1D5346E6B535' as PREVIEWDATAFORM,
                    convert(nchar(36),C.[ID]) as PREVIEWDATAFORMRECORDID,
                    CC.[SITEID] as SITEID,
                    case  --If correspondence doesn't have a code, the record is unsecured

                        when CC.ID is null 
                            then 0
                        else 1 
                    end as SITEENFORCEMENT,
                    99 as CHANNEL
                  from
                      dbo.[CONSTITUENTCORRESPONDENCE] C
                      left join dbo.[CORRESPONDENCECODE] CC on CC.[ID] = C.[CORRESPONDENCECODEID]
                      left join dbo.[CORRESPONDENCEPROCESSRUNHISTORY] on C.CORRESPONDENCEPROCESSRUNHISTORYID = CORRESPONDENCEPROCESSRUNHISTORY.ID
                      left join dbo.[CORRESPONDENCEPROCESSSTATUS] on CORRESPONDENCEPROCESSSTATUS.ID = CORRESPONDENCEPROCESSRUNHISTORY.CORRESPONDENCEPROCESSSTATUSID
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = C.[ADDEDBYID]
                  where
                      C.CONSTITUENTID = @CONSTITUENTID
                      and (@CORRESPONDENCETYPECODE = 0 or @CORRESPONDENCETYPECODE = 99)
                      and (C.[DATESENT] >= @STARTDATE and C.[DATESENT] <= @ENDDATE)
                      and @ENTERPRISEINSTALLED = 1
                      and @CHANNEL = 99

                  union all

              -- group member acknowledgements

                  select
                      convert(nchar(36),R.[ID]),
                      R.CONSTITUENTID,
                      RL.[ACKNOWLEDGEDATE],
                      1,
                      'Acknowledgement',
                case when RL.MKTPACKAGEID is not null then
                  (select COMMUNICATIONLETTER.NAME from dbo.COMMUNICATIONLETTER where COMMUNICATIONLETTER.EMAILPACKAGEID = RL.MKTPACKAGEID or COMMUNICATIONLETTER.MAILPACKAGEID = RL.MKTPACKAGEID) 
                else
                        AP.[NAME] + case when AP.[NAME] is not null and AP.[NAME] <> '' and LC.[NAME] is not null and LC.[NAME] <> '' then ' - ' else '' end + LC.[NAME]
                end,                        
                      case when AU.USERNAME is not null then AU.USERNAME else CA.[USERNAME] end,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        '7C0968B7-61C7-44EA-8F8D-96C139A42AD0',
                        convert(nchar(36),R.[ID]) as PREVIEWDATAFORMRECORDID,
                        BPI.[SITEID] as SITEID,
                        2 as SITEENFORCEMENT,
                        coalesce(MKTPACKAGE.CHANNELCODE, 0) as CHANNEL
                  from
                      dbo.[REVENUELETTER] RL
                      left join dbo.[LETTERCODE] LC on LC.[ID] = RL.[LETTERCODEID]
                      left join dbo.[ACKNOWLEDGEMENTPROCESSSTATUS] APS on APS.[ID] = RL.[ACKNOWLEDGEMENTPROCESSSTATUSID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = RL.[ACKNOWLEDGEMENTPROCESSSTATUSID]
                      left join dbo.[ACKNOWLEDGEMENTPROCESS] AP on AP.[ID] = APS.[PARAMETERSETID]
                      left join dbo.[REVENUE] R on R.[ID] = RL.[REVENUEID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = RL.[ADDEDBYID]
                      inner join dbo.GROUPMEMBER GM on R.CONSTITUENTID = GM.MEMBERID
                      left join dbo.BUSINESSPROCESSINSTANCE BPI on AP.ID = BPI.BUSINESSPROCESSPARAMETERSETID
                      left join dbo.MKTPACKAGE on RL.MKTPACKAGEID = MKTPACKAGE.ID
                  where
                      GM.GROUPID = @CONSTITUENTID and
                      RL.[ACKNOWLEDGEDATE] is not null and
                      (@CORRESPONDENCETYPECODE = 1 or @CORRESPONDENCETYPECODE = 99) and
                      (RL.[ACKNOWLEDGEDATE] >= @STARTDATE and RL.[ACKNOWLEDGEDATE] <= @ENDDATE) and 
                      (@CHANNEL = 99 or MKTPACKAGE.ID is null or MKTPACKAGE.CHANNELCODE = @CHANNEL)

                  union all

              -- group acknowledgements

                  select
                      convert(nchar(36),R.[ID]),
                      R.CONSTITUENTID,
                      RL.[ACKNOWLEDGEDATE],
                      1,
                      'Acknowledgement',
                case when RL.MKTPACKAGEID is not null then
                  (select COMMUNICATIONLETTER.NAME from dbo.COMMUNICATIONLETTER where COMMUNICATIONLETTER.EMAILPACKAGEID = RL.MKTPACKAGEID or COMMUNICATIONLETTER.MAILPACKAGEID = RL.MKTPACKAGEID) 
                else
                        AP.[NAME] + case when AP.[NAME] is not null and AP.[NAME] <> '' and LC.[NAME] is not null and LC.[NAME] <> '' then ' - ' else '' end + LC.[NAME]
                end,                  
                      case when AU.USERNAME is not null then AU.USERNAME else CA.[USERNAME] end,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        '7C0968B7-61C7-44EA-8F8D-96C139A42AD0',
                        convert(nchar(36),R.[ID]) as PREVIEWDATAFORMRECORDID,
                        BPI.[SITEID] as SITEID,
                        2 as SITEENFORCEMENT,
                        coalesce(MKTPACKAGE.CHANNELCODE, 0) as CHANNEL
                  from
                      dbo.[REVENUELETTER] RL
                      left join dbo.[LETTERCODE] LC on LC.[ID] = RL.[LETTERCODEID]
                      left join dbo.[ACKNOWLEDGEMENTPROCESSSTATUS] APS on APS.[ID] = RL.[ACKNOWLEDGEMENTPROCESSSTATUSID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = RL.[ACKNOWLEDGEMENTPROCESSSTATUSID]
                      left join dbo.[ACKNOWLEDGEMENTPROCESS] AP on AP.[ID] = APS.[PARAMETERSETID]
                      left join dbo.[REVENUE] R on R.[ID] = RL.[REVENUEID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = RL.[ADDEDBYID]                
                      left join dbo.BUSINESSPROCESSINSTANCE BPI on AP.ID = BPI.BUSINESSPROCESSPARAMETERSETID 
                      left join dbo.MKTPACKAGE on RL.MKTPACKAGEID = MKTPACKAGE.ID
                  where
                      R.CONSTITUENTID = @CONSTITUENTID and
                      RL.[ACKNOWLEDGEDATE] is not null and
                      (@CORRESPONDENCETYPECODE = 1 or @CORRESPONDENCETYPECODE = 99) and
                      (RL.[ACKNOWLEDGEDATE] >= @STARTDATE and RL.[ACKNOWLEDGEDATE] <= @ENDDATE) and 
                      (@CHANNEL = 99 or MKTPACKAGE.ID is null or MKTPACKAGE.CHANNELCODE = @CHANNEL)

                  union all

              -- group member receipts

                  select
                      convert(nchar(36),R.[ID]),
                      R.CONSTITUENTID,
                      RECEIPT.[RECEIPTDATE],
                      2,
                      'Receipt',
                      RP.[NAME],
                      AU.USERNAME,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        '44E05002-D3C8-491F-AE69-C71594AE8C4C',
                        convert(nchar(36),R.[ID]) as PREVIEWDATAFORMRECORDID,
                        BPI.[SITEID] as SITEID,
                        2 as SITEENFORCEMENT,
                        99 as CHANNEL
                  from
                      dbo.[REVENUE] R
                      inner join dbo.[REVENUERECEIPT] RECEIPT on R.ID = RECEIPT.REVENUEID 
                      left join dbo.[RECEIPTINGPROCESSSTATUS] RPS on RPS.[ID] = RECEIPT.[RECEIPTINGPROCESSSTATUSID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = RECEIPT.[RECEIPTINGPROCESSSTATUSID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[RECEIPTINGPROCESS] RP on RP.[ID] = RPS.[PARAMETERSETID]
                      inner join dbo.GROUPMEMBER GM on R.CONSTITUENTID = GM.MEMBERID
                        left join dbo.BUSINESSPROCESSINSTANCE BPI on RP.ID = BPI.BUSINESSPROCESSPARAMETERSETID
                  where
                      GM.GROUPID = @CONSTITUENTID
                      and RECEIPT.[RECEIPTDATE] is not null
                      and (@CORRESPONDENCETYPECODE = 2 or @CORRESPONDENCETYPECODE = 99)
                      and (RECEIPT.[RECEIPTDATE] >= @STARTDATE and RECEIPT.[RECEIPTDATE] <= @ENDDATE)
                      and @CHANNEL = 99

                  union all

              -- group receipts

                  select
                      convert(nchar(36),R.[ID]),
                      R.CONSTITUENTID,
                      RECEIPT.[RECEIPTDATE],
                      2,
                      'Receipt',
                    RP.[NAME],
                      AU.USERNAME,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        '44E05002-D3C8-491F-AE69-C71594AE8C4C',
                        convert(nchar(36),R.[ID]) as PREVIEWDATAFORMRECORDID,
                        BPI.[SITEID] as SITEID,
                        2 as SITEENFORCEMENT,
                        99 as CHANNEL
                  from
                      dbo.[REVENUE] R
                      inner join dbo.[REVENUERECEIPT] RECEIPT on R.ID = RECEIPT.REVENUEID
                      left join dbo.[RECEIPTINGPROCESSSTATUS] RPS on RPS.[ID] = RECEIPT.[RECEIPTINGPROCESSSTATUSID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = RECEIPT.[RECEIPTINGPROCESSSTATUSID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[RECEIPTINGPROCESS] RP on RP.[ID] = RPS.[PARAMETERSETID]
                        left join dbo.BUSINESSPROCESSINSTANCE BPI on RP.ID = BPI.BUSINESSPROCESSPARAMETERSETID
                  where
                      R.CONSTITUENTID = @CONSTITUENTID
                      and RECEIPT.[RECEIPTDATE] is not null
                      and (@CORRESPONDENCETYPECODE = 2 or @CORRESPONDENCETYPECODE = 99)
                      and (RECEIPT.[RECEIPTDATE] >= @STARTDATE and RECEIPT.[RECEIPTDATE] <= @ENDDATE)
                      and @CHANNEL = 99

                  union all

              -- group member reminders

                  select
                      convert(nchar(36),R.[ID]),
                      R.CONSTITUENTID,
                      PRS.[SENTDATE],
                      3,
                      'Reminder',
                      PRP.[NAME],
                      case when AU.USERNAME is not null then AU.USERNAME else CA.[USERNAME] end,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        'A5F58EB7-5775-4B6F-9C69-CD91CD5A0103',
                        convert(nchar(36),R.[ID]) as PREVIEWDATAFORMRECORDID,
                        BPI.[SITEID] as SITEID,
                        2 as SITEENFORCEMENT,
                        coalesce(MKTPACKAGE.CHANNELCODE, 0) as CHANNEL
                  from
                      dbo.[PLEDGEREMINDERSENT] PRS
                      left join dbo.[PLEDGEREMINDERPROCESSSTATUS] PRPS on PRPS.[ID] = PRS.[PLEDGEREMINDERPROCESSSTATUSID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = PRS.[PLEDGEREMINDERPROCESSSTATUSID]
                      left join dbo.[PLEDGEREMINDERPROCESS] PRP on PRP.[ID] = PRPS.[PARAMETERSETID]
                      left join dbo.[REVENUE] R on R.[ID] = PRS.[REVENUEID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = PRS.[ADDEDBYID]
                      inner join dbo.GROUPMEMBER GM on R.CONSTITUENTID = GM.MEMBERID
                      left join dbo.BUSINESSPROCESSINSTANCE BPI on PRP.ID = BPI.BUSINESSPROCESSPARAMETERSETID
                      left join dbo.MKTPACKAGE on PRS.PACKAGEID = MKTPACKAGE.ID
                  where
                      GM.GROUPID = @CONSTITUENTID and
                      PRS.[SENTDATE] is not null and
                      (@CORRESPONDENCETYPECODE = 3 or @CORRESPONDENCETYPECODE = 99) and
                      (PRS.[SENTDATE] >= @STARTDATE and PRS.[SENTDATE] <= @ENDDATE) and 
                      (@CHANNEL = 99 or MKTPACKAGE.ID is null or MKTPACKAGE.CHANNELCODE = @CHANNEL)

                  union all

              -- group reminders

                  select
                      convert(nchar(36),R.[ID]),
                      R.CONSTITUENTID,
                      PRS.[SENTDATE],
                      3,
                      'Reminder',
                      PRP.[NAME],
                      case when AU.USERNAME is not null then AU.USERNAME else CA.[USERNAME] end,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        'A5F58EB7-5775-4B6F-9C69-CD91CD5A0103',
                        convert(nchar(36),R.[ID]) as PREVIEWDATAFORMRECORDID,
                        BPI.[SITEID] as SITEID,
                        2 as SITEENFORCEMENT,
                        coalesce(MKTPACKAGE.CHANNELCODE, 0) as CHANNEL
                  from
                      dbo.[PLEDGEREMINDERSENT] PRS
                      left join dbo.[PLEDGEREMINDERPROCESSSTATUS] PRPS on PRPS.[ID] = PRS.[PLEDGEREMINDERPROCESSSTATUSID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = PRS.[PLEDGEREMINDERPROCESSSTATUSID]
                      left join dbo.[PLEDGEREMINDERPROCESS] PRP on PRP.[ID] = PRPS.[PARAMETERSETID]
                      left join dbo.[REVENUE] R on R.[ID] = PRS.[REVENUEID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = PRS.[ADDEDBYID]
                      left join dbo.BUSINESSPROCESSINSTANCE BPI on PRP.ID = BPI.BUSINESSPROCESSPARAMETERSETID
                      left join dbo.MKTPACKAGE on PRS.PACKAGEID = MKTPACKAGE.ID
                  where
                      R.CONSTITUENTID = @CONSTITUENTID and
                      PRS.[SENTDATE] is not null and
                      (@CORRESPONDENCETYPECODE = 3 or @CORRESPONDENCETYPECODE = 99) and
                      (PRS.[SENTDATE] >= @STARTDATE and PRS.[SENTDATE] <= @ENDDATE) and 
                      (@CHANNEL = 99 or MKTPACKAGE.ID is null or MKTPACKAGE.CHANNELCODE = @CHANNEL)

                  union all

              -- group member planned gift acknowledgements

                  select
                      convert(nchar(36),PG.[ID]),
                      PG.CONSTITUENTID,
                      PGL.[ACKNOWLEDGEDATE],
                      4,
                      'Planned Gift Acknowledgement',
                      PGAP.[NAME] + case when PGAP.[NAME] is not null and PGAP.[NAME] <> '' and PGLC.[NAME] is not null and PGLC.[NAME] <> '' then ' - ' else '' end + PGLC.[NAME],
                      case when AU.USERNAME is not null then AU.USERNAME else CA.[USERNAME] end,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        'F0E64049-598A-4900-8404-343C63DE7405',
                        convert(nchar(36),PG.[ID]) as PREVIEWDATAFORMRECORDID,
                        BPI.[SITEID] as SITEID,
                        2 as SITEENFORCEMENT,
                        99 as CHANNEL
                  from
                      dbo.[PLANNEDGIFTLETTER] PGL
                      left join dbo.[PLANNEDGIFTLETTERCODE] PGLC on PGLC.[ID] = PGL.[PLANNEDGIFTLETTERCODEID]
                      left join dbo.[PLANNEDGIFTACKNOWLEDGEMENTPROCESSSTATUS] PGAPS on PGAPS.[ID] = PGL.[PLANNEDGIFTACKNOWLEDGEMENTPROCESSSTATUSID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = PGL.[PLANNEDGIFTACKNOWLEDGEMENTPROCESSSTATUSID]
                      left join dbo.[PLANNEDGIFTACKNOWLEDGEMENTPROCESS] PGAP on PGAP.[ID] = PGAPS.[PARAMETERSETID]
                      left join dbo.[PLANNEDGIFT] PG on PG.[ID] = PGL.[PLANNEDGIFTID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = PGL.[ADDEDBYID]
                      inner join dbo.GROUPMEMBER GM on PG.CONSTITUENTID = GM.MEMBERID
                        left join dbo.BUSINESSPROCESSINSTANCE BPI on PGAP.ID = BPI.BUSINESSPROCESSPARAMETERSETID
                  where
                      GM.GROUPID = @CONSTITUENTID
                      and PGL.[ACKNOWLEDGEDATE] is not null
                      and (@CORRESPONDENCETYPECODE = 4 or @CORRESPONDENCETYPECODE = 99)
                      and (PGL.[ACKNOWLEDGEDATE] >= @STARTDATE and PGL.[ACKNOWLEDGEDATE] <= @ENDDATE)
                      and @CHANNEL = 99

                  union all

              -- group planned gift acknowledgements

                  select
                      convert(nchar(36),PG.[ID]),
                      PG.CONSTITUENTID,
                      PGL.[ACKNOWLEDGEDATE],
                      4,
                      'Planned Gift Acknowledgement',
                      PGAP.[NAME] + case when PGAP.[NAME] is not null and PGAP.[NAME] <> '' and PGLC.[NAME] is not null and PGLC.[NAME] <> '' then ' - ' else '' end + PGLC.[NAME],
                      case when AU.USERNAME is not null then AU.USERNAME else CA.[USERNAME] end,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        'F0E64049-598A-4900-8404-343C63DE7405',
                        convert(nchar(36),PG.[ID]) as PREVIEWDATAFORMRECORDID,
                        BPI.[SITEID] as SITEID,
                        2 as SITEENFORCEMENT,
                        99 as CHANNEL
                  from
                      dbo.[PLANNEDGIFTLETTER] PGL
                      left join dbo.[PLANNEDGIFTLETTERCODE] PGLC on PGLC.[ID] = PGL.[PLANNEDGIFTLETTERCODEID]
                      left join dbo.[PLANNEDGIFTACKNOWLEDGEMENTPROCESSSTATUS] PGAPS on PGAPS.[ID] = PGL.[PLANNEDGIFTACKNOWLEDGEMENTPROCESSSTATUSID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = PGL.[PLANNEDGIFTACKNOWLEDGEMENTPROCESSSTATUSID]
                      left join dbo.[PLANNEDGIFTACKNOWLEDGEMENTPROCESS] PGAP on PGAP.[ID] = PGAPS.[PARAMETERSETID]
                      left join dbo.[PLANNEDGIFT] PG on PG.[ID] = PGL.[PLANNEDGIFTID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = PGL.[ADDEDBYID]
                        left join dbo.BUSINESSPROCESSINSTANCE BPI on PGAP.ID = BPI.BUSINESSPROCESSPARAMETERSETID
                  where
                      PG.CONSTITUENTID = @CONSTITUENTID
                      and PGL.[ACKNOWLEDGEDATE] is not null
                      and (@CORRESPONDENCETYPECODE = 4 or @CORRESPONDENCETYPECODE = 99)
                      and (PGL.[ACKNOWLEDGEDATE] >= @STARTDATE and PGL.[ACKNOWLEDGEDATE] <= @ENDDATE)
                      and @CHANNEL = 99

                  union all

              -- group member event invitations

                  select
                      upper(IVH.[PARAMETERSETID]) + convert(nchar(36),IVH.[EVENTID]),
                      IH.CONSTITUENTID,
                      isnull(IVH.MAILDATE, IVH.[DATECHANGED]),
                      5,
                      'Event Invitation',
                      IVH.[NAME] + case when IVH.[NAME] is not null and IVH.[NAME] <> '' and E.[NAME] is not null and E.[NAME] <> '' then ' - ' else '' end + E.[NAME],
                      case when AU.USERNAME is not null then AU.USERNAME else CA.[USERNAME] end,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        'D11CEB65-90F4-4152-9066-F9631835FD8D',
                        upper(IVH.[PARAMETERSETID]) + convert(nchar(36),IVH.[EVENTID]) as PREVIEWDATAFORMRECORDID,
                        null as SITEID,
                        0 as SITEENFORCEMENT,
                        coalesce(MKTPACKAGE.CHANNELCODE, -1) as CHANNEL
                  from
                      dbo.[INVITEEHISTORY] IH
                      left join dbo.[INVITATIONHISTORY] IVH on IVH.[ID] = IH.[INVITATIONHISTORYID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = IVH.[BUSINESSPROCESSSTATUSID]
                      left join dbo.[EVENT] E on E.[ID] = IH.[EVENTID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = IH.[ADDEDBYID]
                      inner join dbo.GROUPMEMBER GM on IH.CONSTITUENTID = GM.MEMBERID
                      left join dbo.MKTPACKAGE on IH.MKTPACKAGEID = MKTPACKAGE.ID
                  where
                      GM.GROUPID = @CONSTITUENTID and
                      (@CORRESPONDENCETYPECODE = 5 or @CORRESPONDENCETYPECODE = 99) and
                      (IVH.[DATECHANGED] >= @STARTDATE and IVH.[DATECHANGED] <= @ENDDATE) and 
                      (@CHANNEL = 99 or MKTPACKAGE.CHANNELCODE = @CHANNEL)

                  union all

              -- group event invitations

                  select
                      upper(IVH.[PARAMETERSETID]) + convert(nchar(36),IVH.[EVENTID]),
                      IH.CONSTITUENTID,
                      isnull(IVH.MAILDATE, IVH.[DATECHANGED]),
                      5,
                      'Event Invitation',
                      IVH.[NAME] + case when IVH.[NAME] is not null and IVH.[NAME] <> '' and E.[NAME] is not null and E.[NAME] <> '' then ' - ' else '' end + E.[NAME],
                      case when AU.USERNAME is not null then AU.USERNAME else CA.[USERNAME] end,
                      '',
                      '',
                      0,
                        convert(bit,0),
                        'D11CEB65-90F4-4152-9066-F9631835FD8D',
                        upper(IVH.[PARAMETERSETID]) + convert(nchar(36),IVH.[EVENTID]) as PREVIEWDATAFORMRECORDID,
                        null as SITEID,
                        0 as SITEENFORCEMENT,
                        coalesce(MKTPACKAGE.CHANNELCODE, -1) as CHANNEL
                  from
                      dbo.[INVITEEHISTORY] IH
                      left join dbo.[INVITATIONHISTORY] IVH on IVH.[ID] = IH.[INVITATIONHISTORYID]
                      left join dbo.[BUSINESSPROCESSSTATUS] BPS on BPS.[ID] = IVH.[BUSINESSPROCESSSTATUSID]
                      left join dbo.[EVENT] E on E.[ID] = IH.[EVENTID]
                      left join dbo.[APPUSER] AU on AU.[ID] = BPS.[STARTEDBYUSERID]
                      left join dbo.[CHANGEAGENT] CA on CA.[ID] = IH.[ADDEDBYID]
                      left join dbo.MKTPACKAGE on IH.MKTPACKAGEID = MKTPACKAGE.ID
                  where
                      IH.CONSTITUENTID = @CONSTITUENTID and
                      (@CORRESPONDENCETYPECODE = 5 or @CORRESPONDENCETYPECODE = 99) and
                      (IVH.[DATECHANGED] >= @STARTDATE and IVH.[DATECHANGED] <= @ENDDATE) and 
                      (@CHANNEL = 99 or MKTPACKAGE.CHANNELCODE = @CHANNEL)

                  union all

              -- group member appeal mailings

                  select
                      convert(nchar(36),MS.[ID]),
                      CA.CONSTITUENTID,
                      CA.[DATESENT],
                      case
                          when MS.MAILINGTYPECODE = 2 then 8
                          when MS.MAILINGTYPECODE = 0 and APPEALMAILING.ID is not null then 9
                          else 6
                      end as [CORRESPONDANCETYPECODE],
                      case
                          when MS.MAILINGTYPECODE = 2 then 'Membership Renewal'
                          else 'Appeal Mailing'
                      end as [CORRESPONDANCETYPE],
                      A.[NAME] + case when A.[NAME] is not null and A.[NAME] <> '' and MS.[NAME] is not null and MS.[NAME] <> '' then ' - ' else '' end + coalesce(MS.[NAME], ''),
                      CHA.[USERNAME],
                      CA.[COMMENTS],
                      convert(nchar(36),CA.[ID]),
                      CA.[FINDERNUMBER],
                        case 
                            when exists(
                                    select 1 
                                    from dbo.CONSTITUENTAPPEALRESPONSE 
                                    where CONSTITUENTAPPEALRESPONSE.CONSTITUENTAPPEALID=CA.ID
                                )
                                then convert(bit,1
                            else convert(bit,0
                        end HASRESPONSES,
                        'F37F65F4-B9BC-4F70-9FF9-F40493EBAE6C',
                        convert(nchar(36),CA.[ID]) as PREVIEWDATAFORMRECORDID,
                        null as SITEID,
                        0 as SITEENFORCEMENT,
                        coalesce(PAC.CHANNELCODE, 0) as CHANNEL
                  from 
                      dbo.[CONSTITUENTAPPEAL] CA
                      left join dbo.[APPEAL] A on A.[ID] = CA.[APPEALID]
                      left join dbo.[MKTSEGMENTATION] MS on MS.[ID] = CA.[MKTSEGMENTATIONID]
                      left join dbo.[CHANGEAGENT] CHA on CHA.[ID] = CA.[ADDEDBYID]
                      inner join dbo.GROUPMEMBER GM on CA.CONSTITUENTID = GM.MEMBERID
                      left join dbo.APPEALMAILING on APPEALMAILING.ID = MS.ID
                      left join dbo.MKTPACKAGE PAC on PAC.ID = CA.MKTPACKAGEID
                  where
                      GM.GROUPID = @CONSTITUENTID and
                      ((@CORRESPONDENCETYPECODE = 6 and isnull(MS.MAILINGTYPECODE,0) = 0) or (@CORRESPONDENCETYPECODE = 8 and MS.MAILINGTYPECODE = 2) or @CORRESPONDENCETYPECODE = 99) and
                      ((CA.[DATESENT] >= @STARTDATE and CA.[DATESENT] <= @ENDDATE) or CA.[DATESENT] is null) and 
                      (@CHANNEL = 99 or PAC.ID is null or PAC.CHANNELCODE = @CHANNEL)

              union all

              -- group appeal mailings

                  select
                      convert(nchar(36),MS.[ID]),
                      CA.CONSTITUENTID,
                      CA.[DATESENT],
                      case
                          when MS.MAILINGTYPECODE = 2 then 8
                          when MS.MAILINGTYPECODE = 0 and APPEALMAILING.ID is not null then 9
                          else 6
                      end as [CORRESPONDANCETYPECODE],
                      case
                          when MS.MAILINGTYPECODE = 2 then 'Membership Renewal'
                          else 'Appeal Mailing'
                      end as [CORRESPONDANCETYPE],
                      A.[NAME] + case when A.[NAME] is not null and A.[NAME] <> '' and MS.[NAME] is not null and MS.[NAME] <> '' then ' - ' else '' end + coalesce(MS.[NAME], ''),
                      CHA.[USERNAME],
                      CA.[COMMENTS],
                      convert(nchar(36),CA.[ID]),
                      CA.[FINDERNUMBER],
                        case 
                            when exists(
                                    select 1 
                                    from dbo.CONSTITUENTAPPEALRESPONSE 
                                    where CONSTITUENTAPPEALRESPONSE.CONSTITUENTAPPEALID=CA.ID
                                )
                                then convert(bit,1
                            else convert(bit,0
                        end HASRESPONSES,
                        'F37F65F4-B9BC-4F70-9FF9-F40493EBAE6C',
                        convert(nchar(36),CA.[ID]) as PREVIEWDATAFORMRECORDID,
                        null as SITEID,
                        0 as SITEENFORCEMENT,
                        coalesce(PAC.CHANNELCODE, 0) as CHANNEL
                  from 
                      dbo.[CONSTITUENTAPPEAL] CA
                      left join dbo.[APPEAL] A on A.[ID] = CA.[APPEALID]
                      left join dbo.[MKTSEGMENTATION] MS on MS.[ID] = CA.[MKTSEGMENTATIONID]
                      left join dbo.[CHANGEAGENT] CHA on CHA.[ID] = CA.[ADDEDBYID]
                      left join dbo.APPEALMAILING on APPEALMAILING.ID = MS.ID
                      left join dbo.MKTPACKAGE PAC on PAC.ID = CA.MKTPACKAGEID
                  where
                      CA.CONSTITUENTID = @CONSTITUENTID and
                      ((@CORRESPONDENCETYPECODE = 6 and isnull(MS.MAILINGTYPECODE,0) = 0) or (@CORRESPONDENCETYPECODE = 8 and MS.MAILINGTYPECODE = 2) or @CORRESPONDENCETYPECODE = 99) and
                      ((CA.[DATESENT] >= @STARTDATE and CA.[DATESENT] <= @ENDDATE) or CA.[DATESENT] is null) and 
                      (@CHANNEL = 99 or PAC.ID is null or PAC.CHANNELCODE = @CHANNEL)

              union all
              --Group member tribute acknowledgement


              select
                convert(nchar(36), [REVENUETRIBUTELETTER].[ID]) as ID,
                [REVENUETRIBUTELETTER].[CONSTITUENTID] as CONSTITUENTID,
                [REVENUETRIBUTELETTER].[ACKNOWLEDGEDATE] as DATESENT,
                7 as CORRESPONDENCETYPECODE,
                'Tribute Acknowledgement' as CORRESPONDENCETYPE,
                [TRIBUTEACKNOWLEDGEMENTPROCESS].[NAME] + 
                case 
                  when [TRIBUTEACKNOWLEDGEMENTPROCESS].[NAME] is not null 
                    and [TRIBUTEACKNOWLEDGEMENTPROCESS].[NAME] <> '' 
                    and [TRIBUTELETTERCODE].[NAME] is not null 
                    and [TRIBUTELETTERCODE].[NAME] <> '' 
                  then ' - ' 
                  else '' 
                end 
                + [TRIBUTELETTERCODE].[NAME] as DETAILS,
                case 
                  when [APPUSER].[USERNAME] is not null 
                  then [APPUSER].[USERNAME] 
                  else [CHANGEAGENT].[USERNAME] 
                end as PROCESSOR,
                '' as COMMENTS,
                '' as RECORDID,
                0 as FINDERNUMBER,
                convert(bit, 0) as HASRESPONSES,
                '22A891A1-BF2D-4AA8-9580-BCFA066D4546' as PREVIEWDATAFORM,
                CONVERT(nchar(36), [REVENUE].[ID]) as PREVIEWDATAFORMRECORDID,
                [BUSINESSPROCESSINSTANCE].[SITEID] as SITEID,
                2 as SITEENFORCEMENT,
                99 as CHANNEL
              from dbo.[REVENUETRIBUTELETTER]
                left join dbo.[REVENUETRIBUTE] on [REVENUETRIBUTELETTER].[REVENUETRIBUTEID] = [REVENUETRIBUTE].[ID]
                left join dbo.[TRIBUTELETTERCODE] on [TRIBUTELETTERCODE].[ID] = [REVENUETRIBUTELETTER].[TRIBUTELETTERCODEID]
                left join dbo.[TRIBUTEACKNOWLEDGEMENTPROCESSSTATUS] on [TRIBUTEACKNOWLEDGEMENTPROCESSSTATUS].[ID] = [REVENUETRIBUTELETTER].[TRIBUTEACKNOWLEDGEMENTPROCESSSTATUSID]
                left join dbo.[BUSINESSPROCESSSTATUS] on [BUSINESSPROCESSSTATUS].[ID] = [REVENUETRIBUTELETTER].[TRIBUTEACKNOWLEDGEMENTPROCESSSTATUSID]
                left join dbo.[TRIBUTEACKNOWLEDGEMENTPROCESS] on [TRIBUTEACKNOWLEDGEMENTPROCESS].[ID] = [TRIBUTEACKNOWLEDGEMENTPROCESSSTATUS].[PARAMETERSETID]
                left join dbo.[REVENUE] on [REVENUE].[ID] = [REVENUETRIBUTE].[REVENUEID]
                left join dbo.[APPUSER] on [APPUSER].[ID] = [BUSINESSPROCESSSTATUS].[STARTEDBYUSERID]
                left join dbo.[CHANGEAGENT] on [CHANGEAGENT].[ID] = [REVENUETRIBUTELETTER].[ADDEDBYID]
                left join dbo.[BUSINESSPROCESSINSTANCE] on [TRIBUTEACKNOWLEDGEMENTPROCESS].[ID] = [BUSINESSPROCESSINSTANCE].[BUSINESSPROCESSPARAMETERSETID]
                inner join dbo.[GROUPMEMBER] on [REVENUETRIBUTELETTER].[CONSTITUENTID] = [GROUPMEMBER].[MEMBERID]
              where
                [GROUPMEMBER].[GROUPID] = @CONSTITUENTID
                and [REVENUETRIBUTELETTER].[ACKNOWLEDGEDATE] is not null
                and (@CORRESPONDENCETYPECODE = 7 or @CORRESPONDENCETYPECODE = 99)
                and ([REVENUETRIBUTELETTER].[ACKNOWLEDGEDATE] >= @STARTDATE and [REVENUETRIBUTELETTER].[ACKNOWLEDGEDATE] <= @ENDDATE)
                and @CHANNEL = 99

              union all
              --group tribute acknowledgement


              select
                convert(nchar(36), [REVENUETRIBUTELETTER].[ID]) as ID,
                [REVENUETRIBUTELETTER].[CONSTITUENTID] as CONSTITUENTID,
                [REVENUETRIBUTELETTER].[ACKNOWLEDGEDATE] as DATESENT,
                7 as CORRESPONDENCETYPECODE,
                'Tribute Acknowledgement' as CORRESPONDENCETYPE,
                [TRIBUTEACKNOWLEDGEMENTPROCESS].[NAME] + 
                case 
                  when [TRIBUTEACKNOWLEDGEMENTPROCESS].[NAME] is not null 
                    and [TRIBUTEACKNOWLEDGEMENTPROCESS].[NAME] <> '' 
                    and [TRIBUTELETTERCODE].[NAME] is not null 
                    and [TRIBUTELETTERCODE].[NAME] <> '' 
                  then ' - ' 
                  else '' 
                end + [TRIBUTELETTERCODE].[NAME] as DETAILS,
                case 
                  when [APPUSER].USERNAME is not null 
                  then [APPUSER].USERNAME 
                  else [CHANGEAGENT].[USERNAME] 
                end as PROCESSOR,
                '' as COMMENTS,
                '' as RECORDID,
                0 as FINDERNUMBER,
                convert(bit, 0) as HASRESPONSES,
                '22A891A1-BF2D-4AA8-9580-BCFA066D4546' as PREVIEWDATAFORM,
                CONVERT(nchar(36), [REVENUE].[ID]) as PREVIEWDATAFORMRECORDID,
                [BUSINESSPROCESSINSTANCE].SITEID as [SITEID],
                2 as SITEENFORCEMENT,
                99 as CHANNEL
              from dbo.[REVENUETRIBUTELETTER]
                left join dbo.[REVENUETRIBUTE] on [REVENUETRIBUTELETTER].[REVENUETRIBUTEID] = [REVENUETRIBUTE].[ID]
                left join dbo.[TRIBUTELETTERCODE] on [TRIBUTELETTERCODE].[ID] = [REVENUETRIBUTELETTER].[TRIBUTELETTERCODEID]
                left join dbo.[TRIBUTEACKNOWLEDGEMENTPROCESSSTATUS] TAPS on TAPS.[ID] = [REVENUETRIBUTELETTER].[TRIBUTEACKNOWLEDGEMENTPROCESSSTATUSID]
                left join dbo.[BUSINESSPROCESSSTATUS] on [BUSINESSPROCESSSTATUS].[ID] = [REVENUETRIBUTELETTER].[TRIBUTEACKNOWLEDGEMENTPROCESSSTATUSID]
                left join dbo.[TRIBUTEACKNOWLEDGEMENTPROCESS] on [TRIBUTEACKNOWLEDGEMENTPROCESS].[ID] = TAPS.[PARAMETERSETID]
                left join dbo.[REVENUE] on [REVENUE].[ID] = [REVENUETRIBUTE].[REVENUEID]
                left join dbo.[APPUSER] on [APPUSER].[ID] = [BUSINESSPROCESSSTATUS].[STARTEDBYUSERID]
                left join dbo.[CHANGEAGENT] on [CHANGEAGENT].[ID] = [REVENUETRIBUTELETTER].[ADDEDBYID]
                left join dbo.[BUSINESSPROCESSINSTANCE] on [TRIBUTEACKNOWLEDGEMENTPROCESS].[ID] = [BUSINESSPROCESSINSTANCE].[BUSINESSPROCESSPARAMETERSETID]
              where
                [REVENUETRIBUTELETTER].[CONSTITUENTID] = @CONSTITUENTID
                and [REVENUETRIBUTELETTER].[ACKNOWLEDGEDATE] is not null
                and (@CORRESPONDENCETYPECODE = 7 or @CORRESPONDENCETYPECODE = 99)
                and ([REVENUETRIBUTELETTER].[ACKNOWLEDGEDATE] >= @STARTDATE and [REVENUETRIBUTELETTER].[ACKNOWLEDGEDATE] <= @ENDDATE)
                and @CHANNEL = 99
              )
              select
                C.ID,
                C.CONSTITUENTID,
                C.DATESENT,
                NF.NAME CONSTITUENTNAME,
                C.CORRESPONDENCETYPECODE,
                C.CORRESPONDENCETYPE,
                C.DETAILS,
                C.PROCESSOR,
                C.COMMENTS,
                C.RECORDID,
                C.FINDERNUMBER,
                case
                    when C.DATESENT >= dbo.UFN_DATE_THISMONTH_FIRSTDAY(getdate(), 0) then 'This month'
                    when C.DATESENT >= dateadd(month, -1, dbo.UFN_DATE_THISMONTH_FIRSTDAY(getdate(), 0)) then 'Last month'
                    when C.DATESENT >= dateadd(month, -2, dbo.UFN_DATE_THISMONTH_FIRSTDAY(getdate(), 0)) then 'Two months ago'
                    else 'Older'
                end TIMEFRAMETEXT,
                case
                    when C.DATESENT >= dbo.UFN_DATE_THISMONTH_FIRSTDAY(getdate(), 0) then '0'
                    when C.DATESENT >= dateadd(month, -1, dbo.UFN_DATE_THISMONTH_FIRSTDAY(getdate(), 0)) then '2'
                    when C.DATESENT >= dateadd(month, -2, dbo.UFN_DATE_THISMONTH_FIRSTDAY(getdate(), 0)) then '4'
                    else '6'
                end TIMEFRAMEGROUPSORT,
                case 
                    when dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1 then 1 
                    else dbo.UFN_SECURITY_APPUSER_GRANTED_DATALIST_FORCONSTIT(@CURRENTAPPUSERID, @DATALISTID, C.CONSTITUENTID)
                end as 'HASPERMISSIONS',
                HASRESPONSES,
                PREVIEWDATAFORM,
                PREVIEWDATAFORMRECORDID,
                case C.SITEENFORCEMENT
                    when 0 then 'N/A'  --Type not secured

                    when 2 then coalesce(SITE.NAME, 'All sites')  --Type is site secured, but null site means record is unsecured

                    else coalesce(SITE.NAME, '')  --Normal site security

                end SITE,
                case C.CHANNEL
                    when 0 then 'Mail'
                    when 1 then 'Email'
                    when 2 then 'Phone'
                    when -1 then 'Unknown'
                end as CHANNEL
              from CORRESPONDENCE_CTE C
                -- Need to include the filter on GROUPID in the join predicate; otherwise, if we are viewing the correspondence of a household that is a member of multiple groups,

                -- this would include the household's GROUPMEMBER records in the join, leading to multiple rows for each of the household's correspondence.

                  left join dbo.GROUPMEMBER GM on C.CONSTITUENTID = GM.MEMBERID and GM.GROUPID = @CONSTITUENTID 
                  left join dbo.GROUPMEMBERDATERANGE GMDR on GM.ID = GMDR.GROUPMEMBERID
                  left join dbo.SITE on SITE.ID = C.SITEID
                  outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(C.CONSTITUENTID) NF
              where(
                        (GM.GROUPID = @CONSTITUENTID
                            and ((GMDR.DATEFROM is null and (GMDR.DATETO is null or GMDR.DATETO >= C.DATESENT))
                                or (GMDR.DATETO is null and (GMDR.DATEFROM is null or GMDR.DATEFROM <= C.DATESENT)) 
                                or (GMDR.DATEFROM <= C.DATESENT and GMDR.DATETO >= C.DATESENT)
                            )
                        ) 
                        or (C.CONSTITUENTID = @CONSTITUENTID)
                    )
                    and ( C.SITEENFORCEMENT = 0  --Type not site secured

                        or( C.SITEENFORCEMENT = 2 and C.SITEID is null )  --Type is site secured, but null site means record is unsecured

                        or( (dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1 or exists (select 1 from dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,@SECURITYFEATUREID,@SECURITYFEATURETYPE) where SITEID=[C].[SITEID] or (SITEID is null and [C].[SITEID] is null))) )  --Normal site security

                    )
                    and (  --Apply site filter

                        @SITEFILTERMODE = 0
                            or C.SITEID in (
                                select SITEID
                                from dbo.UFN_SITE_BUILDDATALISTSITEFILTER (@CURRENTAPPUSERID, @SITEFILTERMODE, @SITESSELECTED
                            )
                    )
              order by
                TIMEFRAMEGROUPSORT asc, DATESENT desc, CORRESPONDENCETYPECODE;