USP_DATAFORMTEMPLATE_ADD_GLOBALOPTOUTMAILPREFERENCEADD

The save procedure used by the add dataform template "Global Opt Out Mail Preference Update Data Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@EMAILADDRESS UDT_EMAILADDRESS IN Email Address
@SENDMAIL bit IN
@STARTDATE datetime 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_DATAFORMTEMPLATE_ADD_GLOBALOPTOUTMAILPREFERENCEADD
(
    @ID uniqueidentifier = null output,
    @CHANGEAGENTID uniqueidentifier = null,
    @EMAILADDRESS UDT_EMAILADDRESS,
    @SENDMAIL bit,
    @STARTDATE datetime = 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 * 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, @ISNETCOMMUNITYEMAILOPTOUTMAPPEDWITHSOLICITCODE=case when SC.CONSENTCODE = 0 then 1 else 0 end
            from NETCOMMUNITYDEFAULTCODEMAP NCDCM inner join SOLICITCODE SC on SC.ID=NCDCM.DONOTEMAILSOLICITCODEID


     --update all constituent records with this email address

        if @ISNETCOMMUNITYEMAILOPTOUTMAPPEDWITHSOLICITCODE=1         -- If Net Community Email Opt-out is mapped with Standard Solicit Code

        begin
                merge dbo.CONSTITUENTSOLICITCODE as target
                using
                (
                    select distinct CONSTITUENT.ID CONSTITUENTID,EMAILADDRESS.EMAILADDRESS EMAILADDRESS 
                    from CONSTITUENT 
                    join EMAILADDRESS on EMAILADDRESS.CONSTITUENTID=CONSTITUENT.ID
                ) as source
                on (target.CONSTITUENTID=source.CONSTITUENTID and @EMAILADDRESS=source.EMAILADDRESS and target.SOLICITCODEID = @DONOTEMAILSOLICITCODEID)

                when matched and @SENDMAIL=1 then
                    delete when not matched and @SENDMAIL=0 and source.EMAILADDRESS=@EMAILADDRESS then

                    insert (CONSTITUENTID, SOLICITCODEID, SEQUENCE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, STARTDATE, ENDDATE)
                    values (source.CONSTITUENTID, @DONOTEMAILSOLICITCODEID, 1, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @STARTDATE, @ENDDATE);
        end
        else   -- If Net Community Email Opt-out is mapped with Consent Solicit Code or Advanced consent solicit code

        begin
                if  OBJECT_ID('tempdb..#CONSTITUENTLIST') is not null    
                drop table #CONSTITUENTLIST  

                create table #CONSTITUENTLIST (constituentId uniqueidentifier,isSolicitCodeExist bit, isEnddateUpdateRequired bit,consentSolicitCodeId uniqueidentifier)

                insert into #CONSTITUENTLIST (constituentId ,isSolicitCodeExist , isEnddateUpdateRequired)
                select distinct C.ID , case when CSC.SOLICITCODEID is null then 0 else 1 end,0
                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 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,1,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE,@STARTDATE,'',
                case when @SENDMAIL=1 then 2 else 1 end as CONSENTPREFERENCECODE,@SOURCEEVIDENCECODEID,@SOURCEFILEPATH,@SUPPORTINGINFORMATION,@CONSENTSTATEMENT 
                from #CONSTITUENTLIST 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
    exec dbo.USP_RAISE_ERROR
    return 1
end catch

return 0