USP_CMSINACTIVERECIPIENT_DATA_SYNC

Parameters

Parameter Parameter Type Mode Description
@RECORDPROCESS int INOUT
@NOOFERRORS int INOUT

Definition

Copy


CREATE procedure dbo.USP_CMSINACTIVERECIPIENT_DATA_SYNC
(
 @RECORDPROCESS int = 0 output,
 @NOOFERRORS int = 0 output
)
as
begin
     declare @CHANGEAGENTID as uniqueidentifier,
           @CURRENTDATETIME as datetime,
           @CURRENTDATE as datetime,
           @InactiveRecipientFromMonths as tinyint=12,
           @ERRORMESSAGE as nvarchar(1024) = '';

   if @CHANGEAGENTID is null  
   exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

   set @CURRENTDATETIME = getutcdate();
   set @CURRENTDATE=getutcdate();

   if exists (select 1 from setting where id=148)
   begin
    set @InactiveRecipientFromMonths = (select value from setting where id=148)
   end

   begin try

     if OBJECT_ID('tempdb..#INACTIVERECIPIENT') IS NOT NULL
     begin
        drop table #INACTIVERECIPIENT
     end

      if OBJECT_ID('tempdb..#INACTIVERECIPIENTDTLS') IS NOT NULL
    begin
        drop table #INACTIVERECIPIENTDTLS
    end

    create table #INACTIVERECIPIENTDTLS
      (
      INACTIVERECIPIENTID bigint,
      LASTOPENEDDATE datetime,
      LASTUPDATEDDATE datetime
      ) 
    create table #INACTIVERECIPIENT
    (
    ID bigint identity(1,1),
    EMAILADDRESS nvarchar(510),
    CONSTITUENTID uniqueidentifier,
    LASTOPENEDDATE datetime,
    LASTCLICKEDDATE datetime,
    INACTIVEFROMMONTHS int
    )

    insert into #INACTIVERECIPIENT (EMAILADDRESS, CONSTITUENTID, INACTIVEFROMMONTHS)
    select EmailAddress,
           ConstituentID,
           (DATEDIFF(MONTH,sentdate,@CURRENTDATE)-(case when DATEPART(dd,@CURRENTDATE) < DATEPART(dd,sentdate) then 1 else 0 end)) as inactiveFromMonths
         from(
                        select 
                         EJR.EmailAddress
                        ,ConstituentID
                        ,Row_Number() over(partition by EJR.emailAddress order by sentdate desc) as row_num
                        ,sentdate
                        ,Opened
                        from EmailJob_Recipient EJR With (Nolock)
                        inner join dbo.Email E with (Nolock) on E.ID = EJR.EmailID
                        left join EMAILADDRESS EMA With (Nolock) on EJR.EmailAddress=EMA.EMAILADDRESS 
                        where E.type <> 16 and EJR.sent=1 and EJR.Dsned=0 -- Added an additional check to exclude BBDM emails while calculating the unengage emailaddress.Email type 16 denotes BBDM emails. 

                 )Result where Result.row_num=1 and Opened=0 and datediff(DAY,sentdate,@CURRENTDATE)>datediff(DAY,sentdate,DATEADD(MONTH,@InactiveRecipientFromMonths,sentdate))


    update EIR
    set LASTCLICKEDDATE=LCD.lastClickedDate
    from #INACTIVERECIPIENT EIR 
    join (
          select ID as RID
                ,requestDate as lastClickedDate
                   from (
                      select 
                      EIR.ID
                     ,ROW_NUMBER() over (partition by EJR.EmailAddress order by requestDate desc) row_num
                     ,requestDate
                                        from
                                        [EmailLink] EL with (nolock) 
                                        left join Stats ST with (nolock) on (ST.pageid = EL.pid and ST.sourceid = EL.emailid and ST.sourcetypeid = 1 and EL.PID is NOT NULL)
                                        or (ST.URL = EL.URL and ST.sourceid = EL.emailid  and ST.sourcetypeid = 1 and EL.[URL] is not null)
                                        or (ST.DocumentId = EL.DocumentID and ST.sourceid = EL.emailid  and ST.sourcetypeid = 0 and EL.[DocumentID] is not null)
                                        join EmailJob_Recipient EJR with (nolock) on EJR.id = ST.EmailJobRecipientID
                                        join #INACTIVERECIPIENT EIR on EIR.EMAILADDRESS COLLATE DATABASE_DEFAULT=EJR.EmailAddress 
                                     )Result where row_num=1
         ) LCD on LCD.RID = EIR.ID 

        --Fetching latest opened date and updated date for inactive recipients

         insert into #INACTIVERECIPIENTDTLS
        select max(EIR.ID) INACTIVERECIPIENTID , max(OpenedDate) LASTOPENEDDATE, max(UpdateDate) LASTUPDATEDDATE
        from dbo.EMAILJOB_RECIPIENT EJR with (nolock)
        inner join #INACTIVERECIPIENT EIR on EIR.EMAILADDRESS COLLATE DATABASE_DEFAULT=EJR.EMAILADDRESS
        where EJR.SENT=1 and EJR.DSNED=0 and EJR.OPENEDDATE is not null and EJR.OPENED = 1
        group by EJR.EMAILADDRESS


      update EIR
      set LASTOPENEDDATE=EIRD.LASTOPENEDDATE,
          INACTIVEFROMMONTHS = (DATEDIFF(MONTH,LASTUPDATEDDATE,@CURRENTDATE)-(case when DATEPART(dd,@CURRENTDATE) < DATEPART(dd,LASTUPDATEDDATE) then 1 else 0 end))
      from #INACTIVERECIPIENT EIR 
      join #INACTIVERECIPIENTDTLS EIRD on EIRD.INACTIVERECIPIENTID = EIR.ID

     --Delete active records from #INACTIVERECIPIENT table

     delete EIR 
       from #INACTIVERECIPIENT EIR 
       join (
          select Max(EIR.ID) as EID
          from dbo.EmailJob_Recipient EJR with (nolock)
          join #INACTIVERECIPIENT EIR on EIR.EMAILADDRESS COLLATE DATABASE_DEFAULT=EJR.EMAILADDRESS
          where EJR.Sent=1 and Opened=1
          group by EJR.EmailAddress having datediff(DAY,max(UpdateDate),@CURRENTDATE)<= datediff(DAY,max(SentDate),DATEADD(MONTH,@InactiveRecipientFromMonths,max(sentDate)))
       )source on source.EID=EIR.ID;


    merge dbo.EMAIL_INACTIVERECIPIENT as target
    using #INACTIVERECIPIENT as source on (target.EMAILADDRESS=source.EMAILADDRESS COLLATE DATABASE_DEFAULT)

       when matched then
    update
    set CHANGEDBYID = @CHANGEAGENTID
        DATECHANGED = @CURRENTDATETIME,
        DATEOFLASTOPENED = source.LASTOPENEDDATE,
        DATEOFLASTCLICKED = source.LASTCLICKEDDATE,
        INACTIVEFROMMONTHS = source.INACTIVEFROMMONTHS

    when not matched then
    insert (EMAILADDRESS, ISINACTIVE, CONSTITUENTID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, DATEOFLASTOPENED, DATEOFLASTCLICKED, INACTIVEFROMMONTHS)
    values (source.EmailAddress, 1 ,source.constituentId, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME, source.LASTOPENEDDATE,source.LASTCLICKEDDATE, source.INACTIVEFROMMONTHS);

    --delete active records from EMAIL_INACTIVERECIPIENT table.



     delete EJR 
     from dbo.EMAIL_INACTIVERECIPIENT EJR with (nolock)
     left join #INACTIVERECIPIENT EIR on EIR.EMAILADDRESS=EJR.EMAILADDRESS COLLATE DATABASE_DEFAULT
     where EIR.EMAILADDRESS is null;


     set @RECORDPROCESS = @RECORDPROCESS + 1

     end try
     begin catch
      set @NOOFERRORS = @NOOFERRORS + 1
      set @ERRORMESSAGE = ERROR_MESSAGE();
      exec dbo.spAddUpdate_Error 0, 'CMS Inactive Recipient Sync Business Process', @ERRORMESSAGE, null
     end catch

     if OBJECT_ID('tempdb..#INACTIVERECIPIENT') IS NOT NULL
     begin
        drop table #INACTIVERECIPIENT
     end

      if OBJECT_ID('tempdb..#INACTIVERECIPIENTDTLS') IS NOT NULL
     begin
        drop table #INACTIVERECIPIENTDTLS
     end
end