USP_ADD_GLOBALOPTOUTPREFERENCEADD_LISTUNSUBSCRIBE
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | INOUT | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@EMAILADDRESS | nvarchar(255) | IN | |
@SENDMAIL | bit | IN | |
@STARTDATE | date | IN | |
@ENDDATE | datetime | IN | |
@CONSENTSTATEMENT | nvarchar(max) | IN | |
@SOURCEEVIDENCECODEID | uniqueidentifier | IN | |
@SOURCEFILEPATH | nvarchar(260) | IN | |
@SUPPORTINGINFORMATION | nvarchar(max) | IN |
Definition
Copy
create procedure dbo.USP_ADD_GLOBALOPTOUTPREFERENCEADD_LISTUNSUBSCRIBE
(
@ID uniqueidentifier = null output,
@CHANGEAGENTID uniqueidentifier = null,
@EMAILADDRESS nvarchar(255),
@SENDMAIL bit,
@STARTDATE date = null,
@ENDDATE datetime = null,
@CONSENTSTATEMENT nvarchar(max)='',
@SOURCEEVIDENCECODEID uniqueidentifier=null,
@SOURCEFILEPATH nvarchar(260)='',
@SUPPORTINGINFORMATION nvarchar(max)=''
)
as
set nocount on;
if @ID is null
set @ID = newid()
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()
begin try
--check if there are constituents with this email address
if (exists
(select 1 from CONSTITUENT
join EMAILADDRESS on Constituent.ID = EMAILADDRESS.CONSTITUENTID
where EMAILADDRESS.EMAILADDRESS = @EMAILADDRESS)
)
begin
declare @DONOTEMAILSOLICITCODEID uniqueidentifier,@ISNETCOMMUNITYEMAILOPTOUTMAPPEDWITHSOLICITCODE as bit
select top 1 @DONOTEMAILSOLICITCODEID = NCDCM.DONOTEMAILSOLICITCODEID,
@SOURCEEVIDENCECODEID=NCDCM.DATAPROTECTIONEVIDENCESOURCECODEID,
@ISNETCOMMUNITYEMAILOPTOUTMAPPEDWITHSOLICITCODE=case when SC.CONSENTCODE = 0 then 1 else 0 end
from NETCOMMUNITYDEFAULTCODEMAP NCDCM
inner join SOLICITCODE SC on SC.ID=NCDCM.DONOTEMAILSOLICITCODEID
if OBJECT_ID('tempdb..#CONSTITUENTLIST') is not null
drop table #CONSTITUENTLIST
create table #CONSTITUENTLIST (constituentId uniqueidentifier,isSolicitCodeExist bit, isEnddateUpdateRequired bit,consentSolicitCodeId uniqueidentifier,sequence int)
insert into #CONSTITUENTLIST (constituentId ,isSolicitCodeExist , isEnddateUpdateRequired,sequence)
select distinct C.ID , case when CSC.SOLICITCODEID is null then 0 else 1 end,0,1
from CONSTITUENT C
inner join EMAILADDRESS EA on EA.CONSTITUENTID=C.ID
left join CONSTITUENTSOLICITCODE CSC on CSC.CONSTITUENTID=EA.CONSTITUENTID and CSC.SOLICITCODEID=@DONOTEMAILSOLICITCODEID
where EA.EMAILADDRESS=@EMAILADDRESS
update #CONSTITUENTLIST set sequence= source.sequence
from(
select csc.constituentId, coalesce(max(CSC.SEQUENCE),0) + 1 as sequence from dbo.CONSTITUENTSOLICITCODE CSC
inner join #CONSTITUENTLIST CL on CSC.CONSTITUENTID=CL.constituentId
group by csc.constituentId
)source
where #CONSTITUENTLIST.CONSTITUENTID = source.CONSTITUENTID;
if @ISNETCOMMUNITYEMAILOPTOUTMAPPEDWITHSOLICITCODE=1 -- If Net Community Email Opt-out is mapped with Standard Solicit Code
begin
merge dbo.CONSTITUENTSOLICITCODE as target
using #CONSTITUENTLIST source
on (target.CONSTITUENTID=source.CONSTITUENTID and target.SOLICITCODEID = @DONOTEMAILSOLICITCODEID and (target.ENDDATE is null or target.ENDDATE=@STARTDATE))
when matched then
update set target.EndDate=Null
when not matched then
insert (CONSTITUENTID, SOLICITCODEID, SEQUENCE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, STARTDATE, ENDDATE)
values (source.CONSTITUENTID, @DONOTEMAILSOLICITCODEID, source.sequence, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @STARTDATE, @ENDDATE);
end
else
begin
-- If Net Community Email Opt-out is mapped with Consent Solicit Code or Advanced consent solicit code
update #CONSTITUENTLIST set isEnddateUpdateRequired= result,consentSolicitCodeId=id
from(
select csc.CONSTITUENTID,case when dbo.[UFN_DATE_GETEARLIESTTIME](CSC.STARTDATE) < dbo.[UFN_DATE_GETEARLIESTTIME](@STARTDATE) then 1 else 0 end as result,csc.id
from CONSTITUENTSOLICITCODE CSC
inner join #CONSTITUENTLIST CL on CSC.CONSTITUENTID=CL.constituentId and CL.isSolicitCodeExist=1 and SOLICITCODEID=@DONOTEMAILSOLICITCODEID
and CSC.ENDDATE is null
)CNL where CNL.CONSTITUENTID=#CONSTITUENTLIST.constituentId
--Update only CONSENTPREFERENCECODE if user changes preference on same day.
update CSC Set CONSENTPREFERENCECODE= case when @SENDMAIL=1 then 2 else 1 end
from CONSTITUENTSOLICITCODE CSC
inner join #CONSTITUENTLIST C on C.constituentId=CSC.CONSTITUENTID and isSolicitCodeExist=1 and isEnddateUpdateRequired=0
where csc.ID=c.consentSolicitCodeId
--Update only ENDDATE (current date - 1),if user changes preference on later days.
update CSC Set ENDDATE= dateadd(day, -1, dbo.[UFN_DATE_GETEARLIESTTIME](@STARTDATE))
from CONSTITUENTSOLICITCODE CSC
inner join #CONSTITUENTLIST C on C.constituentId=CSC.CONSTITUENTID and isSolicitCodeExist=1 and isEnddateUpdateRequired=1
where csc.ID=c.consentSolicitCodeId
--Insert user consent preferences, if it is first time or after date adjustments have been made.
insert into CONSTITUENTSOLICITCODE (
ID,
CONSTITUENTID,
SOLICITCODEID,
SEQUENCE,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED,
STARTDATE,
COMMENTS,
CONSENTPREFERENCECODE,
SOURCECODEID,
SOURCEFILEPATH,
SUPPORTINGINFORMATION,
CONSENTSTATEMENT
)
select newid(),constituentId,@DONOTEMAILSOLICITCODEID,CL.sequence,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE,@STARTDATE,'',
case when @SENDMAIL=1 then 2 else 1 end as CONSENTPREFERENCECODE,@SOURCEEVIDENCECODEID,@SOURCEFILEPATH,@SUPPORTINGINFORMATION,@CONSENTSTATEMENT
from #CONSTITUENTLIST CL where (isSolicitCodeExist =0 or isEnddateUpdateRequired=1)
end
end
--update non-constituents
--also do this to keep track of constituents because multiple constits can have the same email
merge dbo.EmailList_GlobalSubscription as target
using
(
select @EMAILADDRESS EMAILADDRESS, @SENDMAIL HASOPTED
) as source
on (target.EmailAddress = source.EMAILADDRESS)
when matched then
update set HasOpted=source.HASOPTED
when NOT matched by target then
insert (EmailAddress, HasOpted) values (source.EMAILADDRESS, source.HASOPTED);
end try
begin catch
if OBJECT_ID('tempdb..#CONSTITUENTLIST') is not null
drop table #CONSTITUENTLIST
exec dbo.USP_RAISE_ERROR
return 1
end catch
if OBJECT_ID('tempdb..#CONSTITUENTLIST') is not null
drop table #CONSTITUENTLIST
return 0