USP_BULKUPDATEEXISTINGEMAILRECIPIENTS

Bulk update existing recipients and failed acknowledgement jobs.

Parameters

Parameter Parameter Type Mode Description
@EMAILJOBDATAID uniqueidentifier INOUT
@EmailID int IN
@EmailJobID int IN
@DATA xml IN

Definition

Copy


CREATE   PROCEDURE [dbo].[USP_BULKUPDATEEXISTINGEMAILRECIPIENTS]
            (
        @EMAILJOBDATAID uniqueidentifier = null output,
                @EmailID as int,
                @EmailJobID as int,
                @DATA as xml
            )

            AS

    begin try
        set nocount on

        if @EMAILJOBDATAID is null
        begin
          set @EMAILJOBDATAID = newid()
            -- handle inserting the data

            insert into dbo.EMAILJOBDATA
                    (ID, EMAILJOBID, DATA, SENT)
                values
                    (@EMAILJOBDATAID, @EMAILJOBID, @DATA, 0)
        end
        else
        begin
           update dbo.EMAILJOBDATA 
           set EMAILJOBID = @EMAILJOBID,
               DATA = @DATA
           where ID = @EMAILJOBDATAID
        end

        DECLARE @EmailJob_RecipientCount int
        DECLARE @Email_JobCount int
        DECLARE @idoc int
        DECLARE @XMLData table(id uniqueidentifier default(newid()) primary key, USERID int, ABID int, MailDisplay nvarchar(512) COLLATE database_default, MailAddress nvarchar(512) COLLATE database_default, OptOut bit, InvalidAddress bit, PEOPLEID int, BORECID int, BOSYSID int, MERGEID uniqueidentifier, 
            unique(BOSYSID, BORECID, maildisplay, mailaddress, USERID, ABID, OptOut, InvalidAddress, id), unique(UserID, maildisplay, mailaddress, id), unique(ABID, maildisplay, mailaddress, id))


        --Load Up the XML into a temporary table

        EXEC sp_xml_preparedocument @idoc OUTPUT, @DATA
        INSERT INTO @XMLData(USERID, ABID, MailDisplay, MailAddress, OptOut, InvalidAddress, PEOPLEID, BORECID, BOSYSID, MERGEID)
        SELECT 
            U, 
            AB, 
            N, 
            E, 
            O, 
            X,
            BP,
            BR,
            BS,
      M
        FROM OPENXML (@idoc, '/Recipients/R', 2
        WITH (
            U int,
            AB int
            N nvarchar(512), 
            E nvarchar(512),
            O bit,
            X bit,
            BP int,
            BR int,
            BS int,
      M uniqueidentifier
        )
        EXEC sp_xml_removedocument @idoc

        SELECT @Email_JobCount = COUNT(*)
        FROM EmailJob
        WHERE [EmailID] = @EmailID
        AND [ID] <> @EmailJobID

        SELECT @EmailJob_RecipientCount = COUNT(*)
        FROM EmailJob_Recipient
        WHERE [EmailJobID] = @EmailJobID AND EMAILJOBDATAID = @EMAILJOBDATAID

    if exists(select NULL from EMAIL where ID = @EMAILID and TYPE in (12,14))
      begin
        -- 12 & 14 are ECard and PageSharing emails

        -- we have a recipients list saved already

        -- we need to add mergeid and emailjobdataid 

        -- these recipients have nothing but an email address to track them by

        -- so we'll find them via address and update accordingly

            UPDATE Email_Recipient
            SET 
                MERGEID = x1.MERGEID,
                EMAILJOBDATAID = @EMAILJOBDATAID
            FROM @XMLData x1 
            inner join Email_Recipient er on 
        er.EMAILADDRESS = x1.MAILADDRESS and er.EMAILID = @EmailID 

      end
    else
      begin
        INSERT INTO dbo.BackOfficeSystemPeople 
                (BackOfficeSystemID, BackofficeRecordID)
            SELECT BOSYSID, BORECID 
            FROM @XMLData x1 
            WHERE NOT EXISTS (
                SELECT *
                FROM dbo.BackOfficeSystemPeople p
                WHERE x1.bosysid = p.BackOfficeSystemID
                AND x1.borecid = p.BackofficeRecordID
            )
            AND BORECID > 0

            -- we have a recipients list saved already

            --We are going to make sure the Email Address/DisplayName are current...

            -- find those needing update via BOID

            UPDATE Email_Recipient
            SET 
                DisplayName = x1.MailDisplay,
                EmailAddress = x1.MailAddress,
                  MERGEID = x1.MERGEID,
                  EMAILJOBDATAID = @EMAILJOBDATAID
            FROM @XMLData x1 
            INNER JOIN BackOfficeSystemPeople p
            ON p.BackOfficeSystemID = x1.BOSYSID
            AND p.BackOfficeRecordID = x1.BORECID
            INNER JOIN Email_Recipient er on er.emailid = @EmailID
            AND er.BackOfficeSystemPeopleID = p.[id] 

            -- find those needing update via UserID

            UPDATE Email_Recipient
                SET 
                DisplayName = x1.MailDisplay,
                EmailAddress = x1.MailAddress,
                BackOfficeSystemPeopleID = p.[ID],
          MERGEID = x1.MERGEID,
          EMAILJOBDATAID = @EMAILJOBDATAID
            FROM @XMLData x1                
            INNER JOIN BackOfficeSystemPeople p
            ON p.BackOfficeSystemID = x1.BOSYSID
            AND p.BackOfficeRecordID = x1.BORECID
            INNER JOIN Email_Recipient er on er.emailid = @EmailID 
            AND er.userid = x1.userid
            AND x1.userid > 0 

            -- find those needing update via AddressBookID

            -- Address book contacts never get a backofficesystempeople record so no need to join to that table.

            UPDATE Email_Recipient
                SET 
                DisplayName = x1.MailDisplay,
                EmailAddress = x1.MailAddress,
                MERGEID = x1.MERGEID,
                EMAILJOBDATAID = @EMAILJOBDATAID
            FROM @XMLData x1
            INNER JOIN Email_Recipient er on er.emailid = @EmailID 
            AND er.AddressBookID = x1.ABID
            AND x1.ABID > 0 
      end

        --Mark all records that have Invalid Accounts so we do not send to them...

        UPDATE Email_Recipient
        SET InvalidAccount = 1
        FROM Email_Recipient er
        INNER JOIN EmailInvalidAccount eia on eia.emailaddress = er.emailaddress and eia.active = 1
        AND er.EmailID = @EmailID AND er.EMAILJOBDATAID = @EMAILJOBDATAID

        --We will only populate the EmailJob_Recipient table if it doesn't have any rows

        --Otherwise, the job inadvertently failed and we are trying to resend

        if @EmailJob_RecipientCount = 0
        BEGIN
            if @Email_JobCount = 0
            begin
                --This is a first time send


                INSERT INTO EmailJob_Recipient(
                    EmailID, 
                    EmailJobID, 
                    UserID, 
                    EmailAddress, 
                    MessageDate, 
                    UpdateDate, 
                    AddressBookID, 
                    EmailRecipientID,
                    BackOfficeSystemPeopleID,
          MERGEID,
          EMAILJOBDATAID)
                SELECT 
                    @EmailID
                    @EmailJobID,
                    UserID, 
                    EmailAddress, 
                    getutcdate(), 
                    getutcdate(),
                    AddressBookID, 
                    [ID],
                    BackOfficeSystemPeopleID,
          MERGEID,
          @EMAILJOBDATAID
                FROM Email_Recipient
                WHERE EmailID = @EmailID
                AND OptOut = 0
                AND InvalidAddress = 0
                AND InvalidAccount = 0
                AND Email_Recipient.EMAILJOBDATAID = @EMAILJOBDATAID
            end
            else
            begin
                --This is a resend of previously failed message

                INSERT INTO EmailJob_Recipient(
                    EmailID, 
                    EmailJobID, 
                    UserID, 
                    EmailAddress, 
                    MessageDate, 
                    UpdateDate, 
                    AddressBookID, 
                    EmailRecipientID,
                    BackOfficeSystemPeopleID,
          MERGEID,
          EMAILJOBDATAID)
                SELECT 
                    @EmailID
                    @EmailJobID,
                    r.UserID, 
                    r.EmailAddress, 
                    getutcdate(), 
                    getutcdate(),
                    r.AddressBookID, 
                    r.[ID],
                    r.BackOfficeSystemPeopleID,
          r.MERGEID,
          @EMAILJOBDATAID
                FROM Email_Recipient r
                INNER JOIN EmailJob_Recipient ejr on ejr.emailrecipientid = r.id and ejr.dsned = 1
                WHERE r.EmailID = @EmailID
                AND ejr.[Current] = 1
                AND OptOut = 0
                AND InvalidAddress = 0
                AND InvalidAccount = 0
                AND r.EMAILJOBDATAID = @EMAILJOBDATAID

                UPDATE EmailJob_Recipient
                SET [Current] = 0
                FROM EmailJob_Recipient ejr
                INNER JOIN Email_Recipient r on r.id = ejr.emailrecipientid and ejr.dsned = 1
                WHERE r.EmailID = @EmailID
                AND ejr.[Current] = 1
    end
   END

      select ID, MERGEID
        from dbo.EMAILJOB_RECIPIENT 
      where EMAILJOBDATAID = @EMAILJOBDATAID

    end try


    begin catch
        exec dbo.USP_RAISE_ERROR
        return 1
    end catch

    return 0