USP_MKTACKNOWLEDGEMENTMAILINGPROCESS_ROLLBACK

Rolls back the changes made while processing acknowledgements, if the process fails.

Parameters

Parameter Parameter Type Mode Description
@MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.[USP_MKTACKNOWLEDGEMENTMAILINGPROCESS_ROLLBACK]
(
  @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier = null
)
as
  set nocount on;

  declare @RECORDSOURCEID uniqueidentifier;
  declare @REVENUELETTERTABLENAME nvarchar(128);
  declare @REVENUERECEIPTTABLENAME nvarchar(128);
  declare @SQL as nvarchar(max);
  declare @CONTEXTCACHE varbinary(128);
  declare @MKTACKNOWLEDGEMENTMAILINGPROCESSSEGMENTATIONID uniqueidentifier;
  declare @SEGMENTATIONID uniqueidentifier;

  begin try
    if @CHANGEAGENTID is null  
      exec dbo.[USP_CHANGEAGENT_GETORCREATECHANGEAGENT] @CHANGEAGENTID output;


    /*******************************************************************/
    /* Remove records from the REVENUELETTER and REVENUERECEIPT tables */
    /*******************************************************************/
    --Cache current context information and set CONTEXT_INFO to @CHANGEAGENTID

    set @CONTEXTCACHE = CONTEXT_INFO();
    set CONTEXT_INFO @CHANGEAGENTID;

    --Loop through every record source and remove the records.  We have to check every record source because the

    --user could change the segments in the acknowledgement template and then the segments may no longer match

    --the records that are stored in the REVENUELETTER and REVENUERECEIPT tables.  Since we set the CONTEXT_INFO

    --above, we can bulk delete from each REVENUELETTER and REVENUERECEIPT tables.

    declare RECORDSOURCECURSOR cursor local fast_forward for
      select
        [ID],
        dbo.[UFN_MKTREVENUELETTER_MAKETABLENAME]([ID]),
        dbo.[UFN_MKTREVENUERECEIPT_MAKETABLENAME]([ID])
      from dbo.[MKTGIFTRECORDSOURCE]
      where dbo.[UFN_MKTRECORDSOURCE_VALIDFORPRODUCT]([ID]) = 1;

    open RECORDSOURCECURSOR;
    fetch next from RECORDSOURCECURSOR into @RECORDSOURCEID, @REVENUELETTERTABLENAME, @REVENUERECEIPTTABLENAME;

    while (@@FETCH_STATUS = 0)
    begin
      if dbo.[UFN_MKTRECORDSOURCE_VALIDFORBBEC](@RECORDSOURCEID) = 1
        begin
          --For BBEC, delete records from the REVENUELETTER table...

          --Since BBEC users can manually add revenue letter records, we don't want to be deleting those records, so delete everything

          --except those records and just reset the process dates and remove the matching records in the REVENUELETTERMARKETING table.

          delete from dbo.[REVENUELETTER]
          from dbo.[REVENUELETTER] as [RL]
          inner join dbo.[REVENUELETTERMARKETING] as [RLM] on [RLM].[ID] = [RL].[ID]
          where [RLM].[MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID] = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID
          and [RLM].[EXISTINGREVENUELETTER] = 0;

          update dbo.[REVENUELETTER] set
            [PROCESSDATE] = null,
            [ACKNOWLEDGEDATE] = null,
            [CHANGEDBYID] = @CHANGEAGENTID,
            [DATECHANGED] = getdate()
          from dbo.[REVENUELETTER] as [RL]
          inner join dbo.[REVENUELETTERMARKETING] as [RLM] on [RLM].[ID] = [RL].[ID]
          where [RLM].[MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID] = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID
          and [RLM].[EXISTINGREVENUELETTER] = 1;

          delete from dbo.[REVENUELETTERMARKETING]
          where [MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID] = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID
          and [EXISTINGREVENUELETTER] = 1;

              --Get the next available receipt number as it was before the process ran based on the receipt stack used in it

          declare @NEXTNUMBER int;
          declare @RECEIPTSTACKID uniqueidentifier;
          declare @RECEIPTPROCESSDATE datetime;
          select @NEXTNUMBER = MIN(RECEIPTNUMBER), @RECEIPTSTACKID = RR.RECEIPTSTACKINFOID, @RECEIPTPROCESSDATE = RR.RECEIPTPROCESSDATE
          from dbo.REVENUERECEIPT as RR
          inner join dbo.REVENUERECEIPTMARKETING as RRM on RRM.ID = RR.ID
          where RRM.MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID
          group by RR.RECEIPTSTACKINFOID,RR.RECEIPTPROCESSDATE;    

          --Delete records from the REVENUERECEIPT table...

          delete from dbo.[REVENUERECEIPT]
          from dbo.[REVENUERECEIPT] as [RR]
          inner join dbo.[REVENUERECEIPTMARKETING] as [RRM] on [RRM].[ID] = [RR].[ID]
          where [RRM].[MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID] = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID;

          -- Update the next available receipt number to what it was prior to this run

          if not exists (select ID from dbo.REVENUERECEIPT where @RECEIPTSTACKID = RECEIPTSTACKINFOID and RECEIPTPROCESSDATE > @RECEIPTPROCESSDATE)
            exec dbo.USP_REVENUE_SETNEXTRECEIPTNUMBER @RECEIPTSTACKID,@NEXTNUMBER

        end
      else
        begin
          --Delete records from the "MKTREVENUELETTER_<guid>" table...

          set @SQL = 'delete from dbo.[' + @REVENUELETTERTABLENAME + ']' + char(13) +
                     'where [MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID] = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID';
          exec sp_executesql @SQL, N'@MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID uniqueidentifier', @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID;

          --Delete records from the "MKTREVENUERECEIPT_<guid>" table...

          set @SQL = 'delete from dbo.[' + @REVENUERECEIPTTABLENAME + ']' + char(13) +
                     'where [MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID] = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID';
          exec sp_executesql @SQL, N'@MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID uniqueidentifier', @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID;
        end

      fetch next from RECORDSOURCECURSOR into @RECORDSOURCEID, @REVENUELETTERTABLENAME, @REVENUERECEIPTTABLENAME;
    end

    close RECORDSOURCECURSOR;
    deallocate RECORDSOURCECURSOR;

    --Reset CONTEXT_INFO to previous value

    if @CONTEXTCACHE is not null
      set CONTEXT_INFO @CONTEXTCACHE;


    /******************************************/
    /* Remove the mailing, if one was created */
    /******************************************/
    select
      @MKTACKNOWLEDGEMENTMAILINGPROCESSSEGMENTATIONID = [ID],
      @SEGMENTATIONID = [SEGMENTATIONID]
    from dbo.[MKTACKNOWLEDGEMENTMAILINGPROCESSSEGMENTATION]
    where [ACKNOWLEDGEMENTMAILINGPROCESSSTATUSID] = @MKTACKNOWLEDGEMENTMAILINGPROCESSSTATUSID;

    if @MKTACKNOWLEDGEMENTMAILINGPROCESSSEGMENTATIONID is not null
      begin
        exec dbo.[USP_MKTACKNOWLEDGEMENTMAILINGPROCESSSEGMENTATION_DELETEBYID_WITHCHANGEAGENTID] @MKTACKNOWLEDGEMENTMAILINGPROCESSSEGMENTATIONID, @CHANGEAGENTID;

        if @SEGMENTATIONID is not null
          exec dbo.[USP_MKTSEGMENTATION_DELETE] @SEGMENTATIONID, @CHANGEAGENTID;
      end
  end try

  begin catch
    exec dbo.[USP_RAISE_ERROR];
    return 1;
  end catch

  return 0;