USP_DATAFORMTEMPLATE_EDIT_PLEDGEADJUST_11

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@DATE datetime IN
@AMOUNT money IN
@POSTSTATUSCODE tinyint IN
@POSTDATE datetime IN
@SENDPLEDGEREMINDER bit IN
@SPLITS xml IN
@FREQUENCYCODE tinyint IN
@NUMBEROFINSTALLMENTS int IN
@NEXTTRANSACTIONDATE datetime IN
@INSTALLMENTS xml IN
@SOURCECODE nvarchar(50) IN
@APPEALID uniqueidentifier IN
@BENEFITS xml IN
@BENEFITSWAIVED bit IN
@GIVENANONYMOUSLY bit IN
@MAILINGID uniqueidentifier IN
@CHANNELCODEID uniqueidentifier IN
@DONOTACKNOWLEDGE bit IN
@PLEDGESUBTYPEID uniqueidentifier IN
@OPPORTUNITYID uniqueidentifier IN
@REFERENCE nvarchar(255) IN
@CATEGORYCODEID uniqueidentifier IN
@ADJUSTMENTDATE datetime IN
@ADJUSTMENTPOSTDATE datetime IN
@ADJUSTMENTREASON nvarchar(300) IN
@ADJUSTMENTREASONCODEID uniqueidentifier IN
@ADJPAYMENT_DATE datetime IN
@ADJPAYMENT_POSTDATE datetime IN
@ADJPAYMENT_REASONCODEID uniqueidentifier IN
@ADJPAYMENT_DETAILS nvarchar(255) IN
@PERCENTAGEBENEFITS xml IN
@BASECURRENCYID uniqueidentifier IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@BASEEXCHANGERATEID uniqueidentifier IN
@EXCHANGERATE decimal(20, 8) IN
@HADSPOTRATE bit IN
@RATECHANGED bit IN
@UPDATERECOGNITIONOPTION tinyint IN
@CURRENTAPPUSERID uniqueidentifier IN
@UPDATETRIBUTEOPTION tinyint IN
@VALIDATETRIBUTES bit IN
@ISMEMBERSHIPPLEDGE bit IN
@INSTALLMENTAMOUNT money IN

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_PLEDGEADJUST_11 (
  @ID uniqueidentifier
  ,@CHANGEAGENTID uniqueidentifier = null
  ,@DATE datetime
  ,@AMOUNT money
  ,@POSTSTATUSCODE tinyint
  ,@POSTDATE datetime
  ,@SENDPLEDGEREMINDER bit
  ,@SPLITS xml
  ,@FREQUENCYCODE tinyint
  ,@NUMBEROFINSTALLMENTS int
  ,@NEXTTRANSACTIONDATE datetime
  ,@INSTALLMENTS xml
  ,@SOURCECODE nvarchar(50)
  ,@APPEALID uniqueidentifier
  ,@BENEFITS xml
  ,@BENEFITSWAIVED bit
  ,@GIVENANONYMOUSLY bit
  ,@MAILINGID uniqueidentifier
  ,@CHANNELCODEID uniqueidentifier
  ,@DONOTACKNOWLEDGE bit
  ,@PLEDGESUBTYPEID uniqueidentifier
  ,@OPPORTUNITYID uniqueidentifier
  ,@REFERENCE nvarchar(255)
  ,@CATEGORYCODEID uniqueidentifier
  ,@ADJUSTMENTDATE datetime
  ,@ADJUSTMENTPOSTDATE datetime
  ,@ADJUSTMENTREASON nvarchar(300)
  ,@ADJUSTMENTREASONCODEID uniqueidentifier
  ,@ADJPAYMENT_DATE datetime
  ,@ADJPAYMENT_POSTDATE datetime
  ,@ADJPAYMENT_REASONCODEID uniqueidentifier
  ,@ADJPAYMENT_DETAILS nvarchar(255)
  ,@PERCENTAGEBENEFITS xml
  ,@BASECURRENCYID uniqueidentifier
  ,@TRANSACTIONCURRENCYID uniqueidentifier
  ,@BASEEXCHANGERATEID uniqueidentifier
  ,@EXCHANGERATE decimal(20, 8)
  ,@HADSPOTRATE bit
  ,@RATECHANGED bit
  ,@UPDATERECOGNITIONOPTION tinyint
  ,@CURRENTAPPUSERID uniqueidentifier = null
  ,@UPDATETRIBUTEOPTION tinyint
  ,@VALIDATETRIBUTES bit
  ,@ISMEMBERSHIPPLEDGE bit
  ,@INSTALLMENTAMOUNT money

  )
as
begin
  set nocount on;

  declare @CURRENTDATE datetime;
  declare @SUM money;
  declare @COUNT int;
  declare @ADJUST bit = 0;
  declare @ADJUSTMENTID uniqueidentifier;
  declare @CLEARGLDISTRIBUTION bit = 0;
  declare @CLEARWRITEOFFGLDISTRIBUTION bit = 0;
  declare @WRITEOFFADJUSTMENTID uniqueidentifier;
  declare @REACKNOWLEDGEFIELDCHANGED bit = 0;
  declare @ADJUSTBENEFITS bit = 0;
  declare @EMPTYGUID uniqueidentifier = '00000000-0000-0000-0000-000000000000';
  declare @CLEARBENEFITSGLDISTRIBUTION bit = 0;
  declare @BENEFITSADJUSTMENTID uniqueidentifier;

  declare @contextCache varbinary(128);

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

  --cache current context information
  set @contextCache = CONTEXT_INFO();
  --set CONTEXT_INFO to @CHANGEAGENTID
  set CONTEXT_INFO @CHANGEAGENTID;

  begin try
    -- Check GL business rule for this account system and set to 'Do not post' if needed.
    declare @PDACCOUNTSYSTEMID uniqueidentifier;

    select @PDACCOUNTSYSTEMID = PDACCOUNTSYSTEMID
    from dbo.PDACCOUNTSYSTEMFORREVENUE
    where ID = @ID;

    if dbo.UFN_PDACCOUNTSYSTEM_ALLOWGLDISTRIBUTIONS(@PDACCOUNTSYSTEMID) = 0
    begin
      set @POSTSTATUSCODE = 3 -- Do not post
      set @POSTDATE = null
    end
    else
    begin
      set @POSTSTATUSCODE = 2

      if @POSTDATE is null
        set @POSTDATE = @ADJUSTMENTPOSTDATE;-- bug 143015
    end;

    --POSTSTATUSCODE passed to this procedure is assumed to be the FINANCIALTRANSACTION poststatus code (1-not posted, 2-posted, 3-do not post)
    declare @ALTERNATEPOSTSTATUS tinyint = case 
        when @POSTSTATUSCODE = 3
          then 2
        else 1
        end;

    set @CURRENTDATE = GetDate();

    --Multicurrency - AdamBu 4/8/10 - If the revenue previously used a spot rate, but
    -- its rate has changed, store the old rate's ID, so we can remove it later.
    declare @OLDSPOTRATE uniqueidentifier

    --Transaction currency cannot be changed, make sure it is the same as the revenue
    select @TRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID
      ,@OLDSPOTRATE = BASEEXCHANGERATEID
    from dbo.FINANCIALTRANSACTION
    where ID = @ID;

    if @HADSPOTRATE = 0
      or @RATECHANGED = 0
      set @OLDSPOTRATE = null

    --If the record uses a new spot rate, create it and set the rate ID.
    if @BASEEXCHANGERATEID = '00000000-0000-0000-0000-000000000001'
    begin
      set @BASEEXCHANGERATEID = newid();

      --Replace with call to USP_CURRENCYEXCHANGERATE_ENSURESPOTRATEEXISTS for PBI 102747 in the future
      /*if not dbo.UFN_SECURITY_APPUSER_GRANTED_SYSTEMPRIVILEGE_IN_SYSTEMROLE(@CURRENTAPPUSERID,'911f104d-ba5f-4469-b0ae-184c879aea99') = 1
        and not dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1
      begin
        raiserror('User does not have the right to add a new spot rate.', 13, 1);
        return 1;
      end*/
      insert into dbo.CURRENCYEXCHANGERATE (
        ID
        ,FROMCURRENCYID
        ,TOCURRENCYID
        ,RATE
        ,ASOFDATE
        ,TYPECODE
        ,SOURCECODEID
        ,ADDEDBYID
        ,CHANGEDBYID
        ,DATEADDED
        ,DATECHANGED
        )
      values (
        @BASEEXCHANGERATEID
        ,@TRANSACTIONCURRENCYID
        ,@BASECURRENCYID
        ,@EXCHANGERATE
        ,@DATE
        ,2
        ,null
        ,@CHANGEAGENTID
        ,@CHANGEAGENTID
        ,@CURRENTDATE
        ,@CURRENTDATE
        );
    end

    --Multicurrency - Retrieve and calculate the necessary multicurrency values.                
    declare @BASEAMOUNT money;
    declare @ORGANIZATIONCURRENCYID uniqueidentifier;
    declare @ORGANIZATIONAMOUNT money;
    declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;

    exec dbo.USP_CURRENCY_GETCURRENCYVALUES @AMOUNT
      ,@DATE
      ,@BASECURRENCYID
      ,@BASEEXCHANGERATEID
      ,@TRANSACTIONCURRENCYID output
      ,@BASEAMOUNT output
      ,@ORGANIZATIONCURRENCYID output
      ,@ORGANIZATIONAMOUNT output
      ,@ORGANIZATIONEXCHANGERATEID output
      ,1;

    set @ADJUST = 0;
    set @ADJUSTMENTID = null;

    declare @TOTALBENEFITS xml;

    set @TOTALBENEFITS = dbo.UFN_REVENUEDETAIL_JOINBENEFITS(@BENEFITS, @PERCENTAGEBENEFITS);

    if @BENEFITSWAIVED = 1
      set @TOTALBENEFITS = null

    /* Check if currency values changed */
    if not exists (
        select 1
        from dbo.FINANCIALTRANSACTION
        where FINANCIALTRANSACTION.ID = @ID
          and (
            (BASEEXCHANGERATEID = @BASEEXCHANGERATEID)
            or (
              BASEEXCHANGERATEID is null
              and @BASEEXCHANGERATEID is null
              )
            )
          and (
            (ORGEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID)
            or (
              ORGEXCHANGERATEID is null
              and @ORGANIZATIONEXCHANGERATEID is null
              )
            )
          and DELETEDON is null
        )
    begin
      set @ADJUST = 1;
      set @CLEARGLDISTRIBUTION = 1;
      set @CLEARWRITEOFFGLDISTRIBUTION = 1;
    end
    else
      if not exists (
          select 1
          from dbo.FINANCIALTRANSACTION
          inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
          where FINANCIALTRANSACTION.ID = @ID
            and TRANSACTIONAMOUNT = @AMOUNT
            and ORGAMOUNT = @ORGANIZATIONAMOUNT
            and isnull(REVENUE_EXT.APPEALID, @EMPTYGUID) = isnull(@APPEALID, @EMPTYGUID)
            and isnull(REVENUE_EXT.CHANNELCODEID, @EMPTYGUID) = isnull(@CHANNELCODEID, @EMPTYGUID)
            and TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID
            and (
              BASEEXCHANGERATEID = @BASEEXCHANGERATEID
              or (
                BASEEXCHANGERATEID is null
                and @BASEEXCHANGERATEID is null
                )
              )
            and DELETEDON is null
          )
      begin
        set @ADJUST = 1;
        set @CLEARGLDISTRIBUTION = 1;
      end

    declare @SPLITSCHANGED bit = dbo.UFN_CHECKDETAIL_SPLITSCHANGED(@ID, @SPLITS);
    declare @DESIGNATIONCHANGED bit = dbo.UFN_CHECKDETAIL_DESIGNATIONSCHANGED(@ID, @SPLITS);

    /* Check if designations changed */
    if @SPLITSCHANGED = 1
    begin
      set @ADJUST = 1;
      set @CLEARGLDISTRIBUTION = 1;
      set @REACKNOWLEDGEFIELDCHANGED = 1;
    end

    -- check to see if installments have changed
    if @CLEARGLDISTRIBUTION = 0
    begin
      if dbo.UFN_CHECKDETAIL_INSTALLMENTSCHANGED(@ID, @INSTALLMENTS) = 1
      begin
        set @ADJUST = 1;
        set @CLEARGLDISTRIBUTION = 1;
        set @CLEARWRITEOFFGLDISTRIBUTION = 1;
      end
    end

    --Update the organization total value, transaction total value, and exchange rates in the @TOTALBENEFITS XML.
    set @TOTALBENEFITS = dbo.UFN_REVENUEBENEFIT_CONVERTAMOUNTSINXML_2(@TOTALBENEFITS, @TRANSACTIONCURRENCYID, @BASECURRENCYID);

    declare @BENEFITSCHANGED bit = 0;
    set @BENEFITSCHANGED = dbo.UFN_CHECKDETAIL_BENEFITSCHANGEDFORGL(@ID, @TOTALBENEFITS)

    if @BENEFITSCHANGED = 1
    begin
      set @CLEARBENEFITSGLDISTRIBUTION = 1;

      --Only create adjustment if posted benefits exist
      if exists(select top 1 1 from dbo.FINANCIALTRANSACTIONLINEITEM LI inner join dbo.REVENUEBENEFIT_EXT RB on LI.ID = RB.ID where LI.FINANCIALTRANSACTIONID = @ID and LI.POSTSTATUSCODE = 2)
      begin
        set @ADJUSTBENEFITS = 1;
      end
    end

    if @ADJUSTBENEFITS = 0
      if exists (
          select 1
          from dbo.BENEFITADJUSTMENT
          where REVENUEID = @ID
            and POSTSTATUSCODE = 1
          )
      begin
        set @ADJUSTBENEFITS = 1;
      end

    --we need to save the adjustment before we save the benefits so that the previous value will be correct
    --in the adjustment
    if @ADJUSTBENEFITS = 1
    begin
      if @ADJUSTMENTREASONCODEID is null
      begin
        if @ISMEMBERSHIPPLEDGE = 0
          raiserror ('BBERR_ADJUSTMENTREASONCODEIDREQUIRED',13,1);
        else
          raiserror ('BBERR_MEMBERSHIPPLEDGE_ADJUSTMENTREASONCODEIDREQUIRED',13,1);
      end

      if @ISMEMBERSHIPPLEDGE = 0
      begin
        set @BENEFITSADJUSTMENTID = null;
        exec dbo.USP_SAVE_BENEFITADJUSTMENT_2 @ID
          ,@BENEFITSADJUSTMENTID output
          ,@CHANGEAGENTID
          ,@CURRENTDATE
          ,@ADJUSTMENTDATE
          ,@ADJUSTMENTPOSTDATE
          ,@ADJUSTMENTREASON
          ,default
          ,@ADJUSTMENTREASONCODEID
          ,@ALTERNATEPOSTSTATUS
          ,@TOTALBENEFITS;--expects the 'other' post status code (0,1,2) not the one passed to this procedure (1,2,3) - because that would make too much sense
      end
      else --MEMBERSHIPPLEDGE: Not posting benefits right now
      begin
          exec dbo.USP_REVENUE_GETBENEFITS_5_UPDATEFROMXML @ID, @TOTALBENEFITS, @CHANGEAGENTID, @CURRENTDATE, default, default;
      end
    end
    else if @BENEFITSCHANGED = 1
    begin
      -- create benefits
      exec dbo.USP_REVENUE_GETBENEFITS_5_UPDATEFROMXML @ID, @TOTALBENEFITS, @CHANGEAGENTID, @CURRENTDATE, null, @ADJUSTMENTPOSTDATE;
    end

    declare @CATEGORYCHANGED bit = 0;

    if (@SPLITS.exist('(/SPLITS/ITEM/CATEGORYCODEID)') = 1)
    begin
      if (
          exists (
            select 1
            from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS) as SPLITS
            left join dbo.REVENUECATEGORY on REVENUECATEGORY.ID = SPLITS.ID
            where (
                (REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID <> SPLITS.CATEGORYCODEID)
                or (
                  (REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID is null)
                  and (SPLITS.CATEGORYCODEID is not null)
                  )
                or (
                  (REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID is not null)
                  and (SPLITS.CATEGORYCODEID is null)
                  )
                )
            )
          )
      begin
        set @CATEGORYCHANGED = 1;
      end
    end
    else
      if exists (
          select 1
          from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
          inner join dbo.FINANCIALTRANSACTION on REVENUESPLIT.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
          left join dbo.REVENUECATEGORY on REVENUECATEGORY.ID = REVENUESPLIT.ID
          where FINANCIALTRANSACTION.TYPECODE in (
              0
              ,1
              ,2
              ,3
              ,4
              ,5
              ,6
              ,7
              ,8
              ,9
              ,15
              )
            and (REVENUESPLIT.DELETEDON is null)
            and (REVENUESPLIT.TYPECODE <> 1)
            and (REVENUESPLIT.FINANCIALTRANSACTIONID = @ID)
            and (
              (REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID <> @CATEGORYCODEID)
              or (
                (REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID is null)
                and (@CATEGORYCODEID is not null)
                )
              or (
                (REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID is not null)
                and (@CATEGORYCODEID is null)
                )
              )
          )
      begin
        set @CATEGORYCHANGED = 1;
      end

    declare @OLDPLEDGESUBTYPEID uniqueidentifier

    select @OLDPLEDGESUBTYPEID = PLEDGESUBTYPEID
    from dbo.REVENUESCHEDULE
    where ID = @ID

    /* Check if revenue category changed */
    if (@CATEGORYCHANGED = 1)
      or (
        @PLEDGESUBTYPEID is null
        and @OLDPLEDGESUBTYPEID is not null
        )
      or (
        @PLEDGESUBTYPEID is not null
        and @OLDPLEDGESUBTYPEID is null
        )
      or (@PLEDGESUBTYPEID <> @OLDPLEDGESUBTYPEID)
    begin
      set @ADJUST = 1;
      set @CLEARGLDISTRIBUTION = 1;
      set @CLEARWRITEOFFGLDISTRIBUTION = 1;
    end

    /* Already adjusted */
    if @ADJUST = 0
      if exists (
          select 1
          from dbo.ADJUSTMENT
          where REVENUEID = @ID
            and POSTSTATUSCODE = 1
          )
        set @ADJUST = 1

    declare @TRIBUTEAMOUNT money;

    select @TRIBUTEAMOUNT = sum(AMOUNT)
    from dbo.REVENUETRIBUTE
    where REVENUEID = @ID;

    -- do not allow the gift amount to be adjusted less than the applied tribute amount
    if (@TRIBUTEAMOUNT is not null)
      and (@AMOUNT < @TRIBUTEAMOUNT)
      and (@UPDATETRIBUTEOPTION = 0)
    begin
      raiserror (
          'The pledge amount cannot be less than the sum of the tribute amounts applied to this pledge.'
          ,13
          ,1
          )
    end

    if @ISMEMBERSHIPPLEDGE = 1
    begin
      exec dbo.USP_MEMBERSHIPPLEDGE_VALIDATESPLITS @SPLITS = @SPLITS
        ,@REVENUEAMOUNT = @AMOUNT
        ,@REVENUEID = @ID
        ,@TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID;
    end
    else
    begin
    exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS = @SPLITS
      ,@REVENUEAMOUNT = @AMOUNT
        ,@REVENUEID = @ID
      ,@TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID;
    end

    select @SUM = sum(AMOUNT)
      ,@COUNT = count(AMOUNT)
    from dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2_FROMITEMLISTXML(@INSTALLMENTS);

    if @COUNT = 0
      raiserror (
          'INSTALLMENTCOUNT'
          ,13
          ,1
          );

    if @SUM <> @AMOUNT
    begin
      if @ISMEMBERSHIPPLEDGE = 0
        raiserror('INSTALLMENTSUM',13,1);
      else
        raiserror('BBERR_MEMBERSHIPPLEDGE_INSTALLMENT_SUM',13,1);
    end

    if @NUMBEROFINSTALLMENTS > 150
      raiserror (
          'BBERR_NUMINSTALLMENTS'
          ,13
          ,1
          );

    /* You can only edit unposted pledges here */
    if not exists (
        select 1
        from dbo.REVENUEPOSTED
        where REVENUEPOSTED.ID = @ID
        )
    begin
      if @ISMEMBERSHIPPLEDGE = 0
        raiserror('You cannot edit an unposted pledge.',13,1);
      else
        raiserror('You cannot edit an unposted membership installment plan.',13,1);
    end

    if dbo.UFN_INSTALLMENT_DATESOVERLAP(@INSTALLMENTS) = 1
      raiserror (
          'Installment dates are out of sequence.'
          ,13
          ,1
          );

    if exists (
        select 1
        from dbo.INSTALLMENT
        inner join dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2_FROMITEMLISTXML(@INSTALLMENTS) XMLINST on INSTALLMENT.ID = XMLINST.ID
        where XMLINST.AMOUNT < XMLINST.APPLIED
        )
      raiserror (
          'PLEDGEPAYMENT_INSTALLMENTAPPLIED'
          ,13
          ,1
          );

    if exists (
        select 1
        from dbo.INSTALLMENT
        inner join dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2_FROMITEMLISTXML(@INSTALLMENTS) XMLINST on INSTALLMENT.ID = XMLINST.ID
        where XMLINST.Date < @DATE
        )
    begin
      if @ISMEMBERSHIPPLEDGE = 0
        raiserror('CK_INSTALLMENT_STARTDATEVALID',13,1);
      else
        raiserror('BBERR_INSTALLMENT_MEMBERSHIPPLEDGE_STARTDATEVALID',13,1);
    end

    -- check to see if the revenue record needs to be re-acknowledged                            
    if exists (
        select 1
        from dbo.ACKNOWLEDGEMENTPREFERENCE
        where REACKNOWLEDGEREVENUE = 1
        )
    begin
      -- check to see if amount have changed
      if @REACKNOWLEDGEFIELDCHANGED = 0
        if not exists (
            select 1
            from dbo.FINANCIALTRANSACTION
            where ID = @ID
              and TRANSACTIONAMOUNT = @AMOUNT
            )
          set @REACKNOWLEDGEFIELDCHANGED = 1;

      -- if a field has changed, mark the revenue letters for this record out of date, if necessary
      if @REACKNOWLEDGEFIELDCHANGED = 1
        exec dbo.USP_REVENUELETTER_SETREACKNOWLEDGEMENTS @ID
          ,@CHANGEAGENTID;
    end

    declare @ORIGINALOPPORTUNITYID uniqueidentifier = null;
    declare @ORIGINALDATE date;

    select top 1 @ORIGINALOPPORTUNITYID = RO.OPPORTUNITYID
    from dbo.FINANCIALTRANSACTIONLINEITEM
    left join dbo.REVENUEOPPORTUNITY RO on RO.ID = FINANCIALTRANSACTIONLINEITEM.ID
    where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
    and RO.OPPORTUNITYID is not null;

    --get initial value of given anonymously to determine how to handle recognitions
    declare @INITIALGIVENANONYMOUSLY bit;

    select @INITIALGIVENANONYMOUSLY = REVENUE_EXT.GIVENANONYMOUSLY, @ORIGINALDATE = DATE
    from dbo.FINANCIALTRANSACTION
    inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
    where FINANCIALTRANSACTION.ID = @ID;

    if @UPDATETRIBUTEOPTION = 1
    begin
      declare @TRIBUTES table (
        TRIBUTEID uniqueidentifier
        ,AMOUNT money
        ,DESIGNATIONID uniqueidentifier
        ,SEQUENCE int
        ,REVENUETRIBUTEID uniqueidentifier
        ,BASECURRENCYID uniqueidentifier
        ,ORGANIZATIONAMOUNT money
        ,ORGANIZATIONEXCHANGERATEID uniqueidentifier
        );

      insert into @TRIBUTES
      select TRIBUTEID
        ,AMOUNT
        ,DESIGNATIONID
        ,SEQUENCE
        ,REVENUETRIBUTEID
        ,BASECURRENCYID
        ,ORGANIZATIONAMOUNT
        ,ORGANIZATIONEXCHANGERATEID
      from dbo.UFN_REVENUE_GETTRIBUTESFORAMOUNT(@ID, @BASEAMOUNT, @BASEEXCHANGERATEID, @EXCHANGERATE);

      update dbo.REVENUETRIBUTE
      set REVENUETRIBUTE.AMOUNT = TRIBUTES.AMOUNT
        ,REVENUETRIBUTE.ORGANIZATIONAMOUNT = TRIBUTES.ORGANIZATIONAMOUNT
        ,REVENUETRIBUTE.ORGANIZATIONEXCHANGERATEID = TRIBUTES.ORGANIZATIONEXCHANGERATEID
        ,REVENUETRIBUTE.CHANGEDBYID = @CHANGEAGENTID
        ,REVENUETRIBUTE.DATECHANGED = @CURRENTDATE
      from dbo.REVENUETRIBUTE
      inner join @TRIBUTES TRIBUTES on TRIBUTES.REVENUETRIBUTEID = REVENUETRIBUTE.ID
    end

    if (
        (@POSTDATE is null)
        and (@POSTSTATUSCODE <> 3)
        )
      raiserror (
          'CK_REVENUE_POSTDATE_REQUIRED'
          ,16
          ,1
          );

    -- Cache the old split and recognition values for recognition updates
    declare @OLDSPLITS xml = dbo.UFN_REVENUE_GETSPLITS_2_TOITEMLISTXML(@ID);
    declare @OLDRECOGNITIONS xml = dbo.UFN_REVENUE_GETRECOGNITIONS_FORREVENUE_TOITEMLISTXML(@ID);

    /* If there was a change to GL related data log an adjustment */
    if @ADJUST = 1
    begin
      if @ADJUSTMENTREASONCODEID is null
        raiserror (
            'BBERR_ADJUSTMENTREASONCODEIDREQUIRED'
            ,13
            ,1
            )

      --JD NOTE: this will reverse posted writeoffs, resulting in no link to revenue splits, but still a link from installmentsplitwriteoff - no link prevents cleanup and delete constraint violation when trying to remove revenue split
      exec dbo.USP_SAVE_ADJUSTMENT @ID
        ,@ADJUSTMENTID output
        ,@CHANGEAGENTID
        ,@CURRENTDATE
        ,@ADJUSTMENTDATE
        ,@ADJUSTMENTPOSTDATE
        ,@ADJUSTMENTREASON
        ,default
       ,@ADJUSTMENTREASONCODEID
        ,@ALTERNATEPOSTSTATUS;--expects the 'other' post status code (0,1,2) not the one passed to this procedure (1,2,3) - because that would make too much sense
    end

    update dbo.FINANCIALTRANSACTION
    set TRANSACTIONAMOUNT = case 
        when @ORGANIZATIONEXCHANGERATEID is null
          and (
            @BASECURRENCYID is null
            or @BASECURRENCYID = @ORGANIZATIONCURRENCYID
            )
          and @BASEEXCHANGERATEID is null
          and (
            @TRANSACTIONCURRENCYID is null
            or @TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID
            )
          and (
            isnull(@ORGANIZATIONAMOUNT, 0) <> isnull(@BASEAMOUNT, 0)
            or isnull(@AMOUNT, 0) <> isnull(@BASEAMOUNT, 0)
            or isnull(@BASEAMOUNT, 0) = 0
            )
          then @BASEAMOUNT
        else isnull(@AMOUNT, 0)
        end
      ,BASEAMOUNT = @BASEAMOUNT
      ,ORGAMOUNT = case 
        when @ORGANIZATIONEXCHANGERATEID is null
          and (
            @BASECURRENCYID is null
            or @BASECURRENCYID = @ORGANIZATIONCURRENCYID
            )
          and @BASEEXCHANGERATEID is null
          and (
            @TRANSACTIONCURRENCYID is null
            or @TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID
            )
          and (
            isnull(@ORGANIZATIONAMOUNT, 0) <> isnull(@BASEAMOUNT, 0)
            or isnull(@AMOUNT, 0) <> isnull(@BASEAMOUNT, 0)
            or isnull(@BASEAMOUNT, 0) = 0
            )
          then @BASEAMOUNT
        else isnull(@ORGANIZATIONAMOUNT, 0)
        end
      ,[DATE] = @DATE
      ,CHANGEDBYID = @CHANGEAGENTID
      ,DATECHANGED = @CURRENTDATE
      ,TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID
      ,BASEEXCHANGERATEID = @BASEEXCHANGERATEID
      ,ORGEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID
      ,POSTDATE = @POSTDATE
      ,POSTSTATUSCODE = @POSTSTATUSCODE
    where ID = @ID

    update dbo.REVENUE_EXT
    -- Pledges should always have their receipt amount 0 but it's possible it could get set to a higher value.  
    -- It needs to be set back to 0 in case the transaction amount is lowered to avoid 
    -- causing a CK_REVENUE_RECEIPTAMOUNTLESSTHANGIFTAMOUNT violation
    set RECEIPTAMOUNT = 0
      ,SOURCECODE = @SOURCECODE
      ,APPEALID = @APPEALID
      ,MAILINGID = @MAILINGID
      ,CHANNELCODEID = @CHANNELCODEID
      ,GIVENANONYMOUSLY = @GIVENANONYMOUSLY
      ,DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE
      ,BENEFITSWAIVED = @BENEFITSWAIVED
      ,CHANGEDBYID = @CHANGEAGENTID
      ,DATECHANGED = @CURRENTDATE
    where ID = @ID

    exec dbo.USP_REVENUEREFERENCE_EDIT @ID
      ,@REFERENCE
      ,@CHANGEAGENTID;

    update dbo.REVENUESCHEDULE
    set FREQUENCYCODE = @FREQUENCYCODE
      ,NUMBEROFINSTALLMENTS = @COUNT
      --,NEXTTRANSACTIONDATE = @NEXTTRANSACTIONDATE --Pledges do not use NEXTTRANSACTIONDATE, STARTDATE surfaces in the UI as next transaction date
      ,PLEDGESUBTYPEID = @PLEDGESUBTYPEID
      ,SENDPLEDGEREMINDER = @SENDPLEDGEREMINDER
      ,CHANGEDBYID = @CHANGEAGENTID
      ,DATECHANGED = @CURRENTDATE
    from dbo.REVENUESCHEDULE
    where REVENUESCHEDULE.ID = @ID;

    -- Set the IDs for any blank entries in the splits XML so that it can associate the declines with gift aid
    -- flag with the generated splits.  Also, pull in the existing value for declines gift aid if it wasn't passed
    -- in the xml.
    --First put the designation splits into a table so I don't repeatedly call UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML
    declare @SplitsTable table (
      ID uniqueidentifier
      ,Amount money
      ,ApplicationCode tinyint
      ,DesignationID uniqueidentifier
      ,TypeCode tinyint
      ,CategoryCodeID uniqueidentifier
      ,DeclinesGiftAid smallint
      )

    insert into @SplitsTable (
      ID
      ,Amount
      ,ApplicationCode
      ,DesignationID
      ,TypeCode
      ,CategoryCodeID
      ,DeclinesGiftAid
      )
    select case 
        when SPLITS.[ID] is null
     or SPLITS.[ID] = '00000000-0000-0000-0000-000000000000'
          then newid()
        else SPLITS.[ID]
        end [ID]
      ,SPLITS.[AMOUNT]
      ,SPLITS.[APPLICATIONCODE]
      ,SPLITS.[DESIGNATIONID]
      ,SPLITS.[TYPECODE]
      ,case 
        when (@SPLITS.exist('(/SPLITS/ITEM/CATEGORYCODEID)') = 0)
          then @CATEGORYCODEID
        else SPLITS.[CATEGORYCODEID]
        end as [CATEGORYCODEID]
      ,case 
        when SPLITS.[DECLINESGIFTAID] is null
          then REVENUESPLITGIFTAID.DECLINESGIFTAID
        else SPLITS.DECLINESGIFTAID
        end DECLINESGIFTAID
    from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS) SPLITS
    left join dbo.REVENUESPLITGIFTAID on SPLITS.ID = REVENUESPLITGIFTAID.ID

    --kwb UI doesn't enforce the designation splits being consistent with the installment splits.  This section makes the designation
    -- splits match what has been specified in the installment splits.
    --crr This behavior is inconsistent with unposted edit (Pledge.Edit.#), so opting membership installments out of this. Other revenue types (e.g. pledge) have had this behavior for a while, so keeping it.
    if @ISMEMBERSHIPPLEDGE = 0
    begin
    --Get some values for installment splits that we're going to create that aren't included in the designation splits.  So it's not totally random,
    --use values from the record with the highest amount
    declare @AppCode tinyint
    declare @TypeCode tinyint
    declare @DeclinesGiftAid smallint

    select top 1 @AppCode = ApplicationCode
      ,@TypeCode = TypeCode
      ,@DeclinesGiftAid = DeclinesGiftAid
    from @SplitsTable
    order by Amount desc

    --Now create splits that agree with the designation splits
    set @SPLITS = (
        select isnull(t1.ID, newid()) as ID
          ,v2.AMOUNT
          ,case 
            when t1.DesignationID is null
              then @AppCode
            else t1.ApplicationCode
            end as APPLICATIONCODE
          ,v2.SPLITDESIGNATIONID as DESIGNATIONID
          ,case 
            when t1.DesignationID is null
              then @TypeCode
            else t1.TypeCode
            end as TYPECODE
          ,case 
            when t1.DesignationID is null
              then @CategoryCodeID
            else t1.CategoryCodeID
            end as CATEGORYCODEID
          ,case 
            when t1.DesignationID is null
              then @DeclinesGiftAid
            else t1.DeclinesGiftAid
            end as DECLINESGIFTAID
        from (
          select sum(splitamount) as AMOUNT
            ,SPLITDESIGNATIONID
          from (
            select T2.split.value('(DESIGNATIONID)[1]', 'uniqueidentifier') as 'SPLITDESIGNATIONID'
              ,T2.split.value('(AMOUNT)[1]', 'money') as 'SPLITAMOUNT'
            from @INSTALLMENTS.nodes('/INSTALLMENTS/ITEM') T1(c)
            cross apply T1.c.nodes('./INSTALLMENTSPLITS/ITEM') as T2(split)
            ) v1
          group by SPLITDESIGNATIONID
          ) as v2
        left join @SplitsTable t1 on v2.SPLITDESIGNATIONID = t1.DesignationID
        for xml raw('ITEM')
          ,type
          ,elements
          ,root('SPLITS')
          ,binary BASE64
        );
    end
    else --@ISMEMBERSHIPPLEDGE = 1
    begin
        set @SPLITS = (
            select 
                ID,
                Amount as [AMOUNT],
                ApplicationCode as [APPLICATIONCODE],
                DesignationID as [DESIGNATIONID],
                TypeCode as [TYPECODE],
                CategoryCodeID as [CATEGORYCODEID],
                DeclinesGiftAid as DECLINESGIFTAID
            from @SplitsTable as [SPLITS]
            for xml raw('ITEM'),type,elements,root('SPLITS'),binary BASE64
        );
    end

    --Multicurrency - AdamBu 4/8/10 - Process the splits xml to calculate the base and organization amounts and place them in proper nodes.
    set @SPLITS = dbo.UFN_REVENUESPLIT_CONVERTAMOUNTSINXML(@SPLITS, @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID)


    --kwb Bug 216882
    --exec dbo.USP_REVENUE_GETSPLITS_2_CUSTOMUPDATEFROMXML @ID, @SPLITS, @CHANGEAGENTID, @CURRENTDATE;        
    exec dbo.USP_REVENUE_GETSPLITS_3_CUSTOMUPDATEFROMXML @ID
      ,@SPLITS
      ,@CHANGEAGENTID
      ,@CURRENTDATE
      ,@ADJUSTMENTPOSTDATE;

    -- Update recognition based on user selected option
    exec dbo.USP_REVENUE_UPDATERECOGNITION @ID
      ,@OLDSPLITS
      ,@UPDATERECOGNITIONOPTION
      ,@CHANGEAGENTID
      ,@CURRENTDATE
      ,@OLDRECOGNITIONS;

    -- update campaigns before updating installments so installments will pull the proper campaigns
    -- bug 676001: only update campaigns if designation or opportunity are changed. This conflicts with change made in bug 224396
    if @DESIGNATIONCHANGED = 1 or isnull(@ORIGINALOPPORTUNITYID,@EMPTYGUID) <> isnull(@OPPORTUNITYID,@EMPTYGUID)
    begin
      exec dbo.USP_PLEDGE_CLEARANDADDCAMPAIGNS @REVENUEID = @ID
        ,@OPPORTUNITYID = @OPPORTUNITYID
        ,@CHANGEAGENTID = @CHANGEAGENTID
        ,@CHANGEDATE = @CURRENTDATE
    end

   exec dbo.USP_REVENUE_UPDATESOLICITORS @ID
      ,@CHANGEAGENTID
      ,@CURRENTDATE;

    -- writeoffs without a payment will use pledge reason codes so that reversals fire correctly
    declare @ADJ_DATE datetime = ISNULL(@ADJPAYMENT_DATE,@ADJUSTMENTDATE);
    declare @ADJ_POSTDATE datetime = ISNULL(@ADJPAYMENT_POSTDATE,@ADJUSTMENTPOSTDATE);
    declare @ADJ_REASONCODEID uniqueidentifier = ISNULL(NULLIF(@ADJPAYMENT_REASONCODEID,@EMPTYGUID),@ADJUSTMENTREASONCODEID); 
    declare @ADJ_REASON nvarchar(300) = ISNULL(@ADJPAYMENT_DETAILS,@ADJUSTMENTREASON);

    exec dbo.USP_PLEDGE_UPDATEINSTALLMENT3 @ID
      ,@INSTALLMENTS
      ,@CHANGEAGENTID
      ,@CURRENTDATE
      ,@ADJ_DATE
      ,@ADJ_POSTDATE
      ,@ADJ_REASONCODEID
      ,@ADJ_REASON
      ,@BASECURRENCYID
      ,@ORGANIZATIONEXCHANGERATEID
      ,@TRANSACTIONCURRENCYID
      ,@BASEEXCHANGERATEID;

  --kwb Remove any payments where the adjustment postdate != deposit postdate from their deposit(s)
  update BANKACCOUNTDEPOSITPAYMENT
  set DEPOSITID = null,
  CHANGEDBYID = @CHANGEAGENTID,
  DATECHANGED = @CURRENTDATE
  from dbo.BANKACCOUNTDEPOSITPAYMENT inner join dbo.FINANCIALTRANSACTIONLINEITEM as Payment on BANKACCOUNTDEPOSITPAYMENT.ID = Payment.FINANCIALTRANSACTIONID
  inner join dbo.FINANCIALTRANSACTION as Deposit on BANKACCOUNTDEPOSITPAYMENT.DEPOSITID = Deposit.ID
  inner join dbo.FINANCIALTRANSACTIONLINEITEM as Pledge on Payment.SourceLineItemID = Pledge.ID
  where Pledge.FINANCIALTRANSACTIONID = @ID
  and Payment.POSTDATE != Deposit.POSTDATE
  and Payment.TYPECODE = 0
  and Payment.DELETEDON is null

    if (@ISMEMBERSHIPPLEDGE = 1)
    begin
      if (dbo.UFN_MEMBERSHIPRG_INSTALLMENTSPLITSBALANCE(@ID) = 0)
        raiserror (
            'BBERR_INSTALLMENTSPLITS_MEMBERSHIPPLEDGEBALANCE'
            ,13
            ,10
            );
    end
    else
    begin
      if (dbo.UFN_PLEDGE_INSTALLMENTSPLITSBALANCE(@ID) = 0)
        raiserror (
            'INSTALLMENTSPLITSBALANCE'
            ,13
            ,10
            );
    end

    /* USP_PLEDGE_UPDATEINSTALLMENT3 has to update the writeoffs, so USP_REVENUE_UPDATEWRITEOFFS should not be called
    exec dbo.USP_REVENUE_UPDATEWRITEOFFS @ID
      ,@CHANGEAGENTID
      ,@CURRENTDATE
      ,@ADJPAYMENT_DATE
      ,@ADJPAYMENT_POSTDATE
      ,@ADJPAYMENT_REASONCODEID
      ,@ADJPAYMENT_DETAILS
      ,@CLEARWRITEOFFGLDISTRIBUTION
    */
    -- clear the user-defined gl distributions
    if @CLEARGLDISTRIBUTION = 1
    begin
      -- Clear GL
      delete
      from dbo.REVENUEGLDISTRIBUTION
      where REVENUEID = @ID
        and OUTDATED = 0;

      -- Add new GL distributions
      if @POSTSTATUSCODE <> 3
        exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @ID
          ,@CHANGEAGENTID
          ,@CURRENTDATE;
    end

    --update benefit gl distributions
    if @CLEARBENEFITSGLDISTRIBUTION = 1 and @ISMEMBERSHIPPLEDGE = 0
    begin

      delete 
      from dbo.BENEFITGLDISTRIBUTION 
      where REVENUEID = @ID 
        and OUTDATED = 0;

      if @POSTSTATUSCODE <> 3
      begin
        exec dbo.USP_SAVE_BENEFITGLDISTRIBUTION_FINANCIALTRANSACTION @ID
          ,@CHANGEAGENTID
          ,@CURRENTDATE;
      end
    end

    exec dbo.USP_PLEDGE_VALIDATE_2 @ID, @ISMEMBERSHIPPLEDGE;

    merge into dbo.PLEDGEINSTALLMENTOPTION as Target
    using (select ID  from dbo.PLEDGEINSTALLMENTOPTION where ID  = @ID)  as Source
    on (Target.ID = Source.ID)
    when matched then
      update set Target.INSTALLMENTAMOUNT = @INSTALLMENTAMOUNT,
      CHANGEDBYID = @CHANGEAGENTID,
      DATECHANGED = @CURRENTDATE
    when not matched by Target then
      insert 
        (ID
        ,INSTALLMENTAMOUNT
        ,SPLITSCHEDULEOPTIONCODE
        ,ADDEDBYID
        ,CHANGEDBYID
        ,DATEADDED
        ,DATECHANGED)
      values (@ID
        ,case @FREQUENCYCODE when 4 then null else @INSTALLMENTAMOUNT end
        ,0 --@INSTALLMENTSPLITSCHEDULEOPTIONCODE
        ,@CHANGEAGENTID
        ,@CHANGEAGENTID
        ,@CURRENTDATE
        ,@CURRENTDATE);      



    --Remove all existing links to the opportunity, including payments.
    if @OPPORTUNITYID is null
    begin
      exec USP_RECORDOPERATION_REVENUEOPPORTUNITYUNLINK @ID, @CHANGEAGENTID;
    end
    else
    begin
      exec dbo.USP_REVENUE_PULLSOLICITORSFROMOPPORTUNITY @ID
        ,@OPPORTUNITYID
        ,@CHANGEAGENTID
        ,@CURRENTDATE

      --No existing opportunity, Add links to opportunity for pledge and all payments.
      if @ORIGINALOPPORTUNITYID is null
      begin
        declare @REVENUEID uniqueidentifier;
        declare ADDSOLICITORS cursor local fast_forward for
        select
         FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
        from dbo.FINANCIALTRANSACTIONLINEITEM
          left join dbo.FINANCIALTRANSACTIONLINEITEM SOURCE on SOURCE.ID = FINANCIALTRANSACTIONLINEITEM.SOURCELINEITEMID
        where FINANCIALTRANSACTIONLINEITEM.SOURCELINEITEMID = SOURCE.ID
         and SOURCE.FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null;

        open ADDSOLICITORS;
        begin try
         fetch next from ADDSOLICITORS into @REVENUEID;
         while (@@FETCH_STATUS = 0)
         begin
          exec dbo.USP_REVENUE_PULLSOLICITORSFROMOPPORTUNITY @REVENUEID, @OPPORTUNITYID, @CHANGEAGENTID, @CURRENTDATE

         fetch next from ADDSOLICITORS into @REVENUEID;
         end
         close ADDSOLICITORS;
         deallocate ADDSOLICITORS;
        end try

        begin catch
         close ADDSOLICITORS;

         deallocate ADDSOLICITORS;

         exec dbo.USP_RAISE_ERROR;

         return 1;
        end catch
        exec dbo.USP_DATAFORMTEMPLATE_ADD_REVENUEOPPORTUNITYLINK @REVENUEID = @ID, @OPPORTUNITYID = @OPPORTUNITYID;
      end
      else
      --Opportunity is swapping, update all splits link to new opportunity ID
      begin
       exec USP_REVENUEOPPORTUNITY_UPDATEOPPORTUNITY @ID,@OPPORTUNITYID,@CHANGEAGENTID;
      end

      exec dbo.USP_OPPORTUNITY_UPDATEACCEPTEDSTATUS @OPPORTUNITYID
        ,@DATE
        ,@CHANGEAGENTID
        ,@CURRENTDATE
    end

    --Default Recognition credits based on Given Anonymous flag
    exec USP_PLEDGE_RECOGNITIONCREDIT_DEFAULT @ID, @GIVENANONYMOUSLY, @INITIALGIVENANONYMOUSLY, @CHANGEAGENTID, @CURRENTDATE 

    --Gift Aid is for UK only
    if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
    begin
      declare @PAYMENTMETHODCODE tinyint;
      declare @CREDITTYPECODEID uniqueidentifier;

      select @PAYMENTMETHODCODE = PAYMENTMETHODCODE
      from dbo.REVENUEPAYMENTMETHOD
      where REVENUEID = @ID;

      if @PAYMENTMETHODCODE = 2
      begin
        select @CREDITTYPECODEID = CREDITCARD.CREDITTYPECODEID
        from dbo.FINANCIALTRANSACTION REVENUE
        inner join dbo.REVENUEPAYMENTMETHOD on REVENUE.ID = REVENUEPAYMENTMETHOD.REVENUEID
        left join dbo.REVENUESCHEDULE on REVENUE.ID = REVENUESCHEDULE.ID
        left join dbo.CREDITCARD on CREDITCARD.ID = REVENUESCHEDULE.CREDITCARDID
        where REVENUE.ID = @ID
          and REVENUE.TYPECODE in (
            0
            ,1
            ,2
            ,3
            ,4
            ,5
            ,6
            ,7
            ,8
            ,9
            )
          and (REVENUE.DELETEDON is null);
      end
      else
        if @PAYMENTMETHODCODE = 3
          and dbo.UFN_PAPERLESSMANDATES_DAYSADVANCEDNOTICE_FORREVENUE(@ID) = - 1
        begin
          --Bug 138736 - AdamBu 2/2/11 - Error on invalid paperless mandate setup.
          raiserror (
              'BBERR_MULTIPLE_PAPERLESSMANDATECONFIGS'
              ,13
              ,1
              );

          return 1;
        end

      declare @SPLITSDECLININGGIFTAID xml

      set @SPLITSDECLININGGIFTAID = (
          select ID as REVENUESPLITID
          from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS)
          where DECLINESGIFTAID = 1
          for xml raw('ITEM')
            ,type
            ,elements
            ,root('SPLITSDECLININGGIFTAID')
            ,binary BASE64
          );

      exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID
        ,@APPEALID
        ,@PAYMENTMETHODCODE
        ,@CREDITTYPECODEID
        ,@CHANGEAGENTID
        ,@DATE
        ,1
        ,@SPLITSDECLININGGIFTAID;--revenue transaction type code of pledge is 1
    end

    if @ADJUST = 1 /*call USP_ADJUSTMENTHISTORY_REVENUE_SAVEHISTORY after the revenue tables are updated */
      exec dbo.USP_ADJUSTMENTHISTORY_REVENUE_SAVEHISTORY @ID
        ,@CHANGEAGENTID
        ,null
        ,@ADJUSTMENTID;

    --Multicurrency - AdamBu 4/12/10 - If we stored an old spot rate earlier, now is the time to
    --    remove it.
    if @OLDSPOTRATE is not null
    begin
      --ThomasGr 10/08/2010 - The currency exchange rate may be used elsewhere and be not able to delete
      begin try
        delete CURRENCYEXCHANGERATE
        where ID = @OLDSPOTRATE
      end try

      begin catch
      end catch
    end
  end try

  begin catch
    --reset CONTEXT_INFO to previous value
    if not @contextCache is null
      set CONTEXT_INFO @contextCache;

    exec dbo.USP_RAISE_ERROR;

    return 1;
  end catch

  --reset CONTEXT_INFO to previous value
  if not @contextCache is null
    set CONTEXT_INFO @contextCache;

  return 0;
end