spBulkUpdate_Email_Recipient

Parameters

Parameter Parameter Type Mode Description
@EmailID int IN
@EmailJobID int IN
@XML ntext IN

Definition

Copy


CREATE     PROCEDURE [dbo].[spBulkUpdate_Email_Recipient]
            (
                @EmailID as int,
                @EmailJobID as int,
                @XML as ntext
            )

            AS
            BEGIN
                set nocount on
                DECLARE @Email_RecipientCount int
                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), MailAddress nvarchar(512), OptOut bit, InvalidAddress bit, PEOPLEID int, BORECID int, BOSYSID int
                    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, @XML
                INSERT INTO @XMLData(USERID, ABID, MailDisplay, MailAddress, OptOut, InvalidAddress, PEOPLEID, BORECID, BOSYSID)
                SELECT 
                    U, 
                    AB, 
                    N, 
                    E, 
                    O, 
                    X,
                    BP,
                    BR,
                    BS
                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

                )
                EXEC sp_xml_removedocument @idoc

                SELECT @Email_RecipientCount = COUNT(*)
                FROM Email_Recipient
                WHERE [EmailID] = @EmailID

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

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

                -- First Make sure that all of our recipients exist in the 
                -- Backoffice people table - w/out dupes

                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

                -- If the recipient count > 0 then we have already populated the recipient table
                -- This happens for Fundraiser Emails 
                -- Or if we are attempting to resend a job
                if @Email_RecipientCount = 0
                BEGIN

                    -- No recipients yet - add them all

                    INSERT INTO Email_Recipient(
                        EmailID, 
                        UserID, 
                        AddressBookID, 
                        DisplayName, 
                        EmailAddress, 
                        OptOut, 
                        InvalidAddress, 
                        BackOfficeSystemPeopleID)
                    SELECT 
                        @EmailID
                        USERID, 
                        ABID, 
                        MailDisplay, 
                        MailAddress, 
                        OptOut, 
                        InvalidAddress, 
                        p.[id]
                    FROM @XMLData x1 
                    left outer join dbo.BackOfficeSystemPeople p
                    on x1.bosysid = p.BackOfficeSystemID and
                    x1.borecid = p.BackofficeRecordID
                END
                else
                BEGIN
                    -- 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
                    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]
                    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
                    UPDATE Email_Recipient
                        SET 
                        DisplayName = x1.MailDisplay,
                        EmailAddress = x1.MailAddress,
                        BackOfficeSystemPeopleID = p.[ID]
                    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.AddressBookID = x1.ABID
                    AND x1.ABID > 0

                    --if @Email_JobCount = 0
                    --BEGIN
                    --    --Email send has never been attempted 
                    --    --This is an emailjob where the Email_Recipient was populated directly...
                    --END
                    --ELSE
                    --BEGIN
                    --    --We have existing recips and a resend job
                    --END
                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


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

                        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 
                    r.[id], 
                    UserID, 
                    AddressbookID, 
                    EmailAddress, 
                    BackOfficeSystemPeopleID,
                    p.BackOfficeRecordID BORECID,
                    p.BackOfficeSystemID BOSYSID
                FROM EmailJob_Recipient r
                LEFT OUTER JOIN BackOfficeSystemPeople p
                ON p.[id] = BackOfficeSystemPeopleID
                WHERE EmailJobID = @EmailJobID
            END