USP_REVENUE_UPDATEREVENUESTREAMS

Stored proc to update the revenue streams on a payment.

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@CONSTITUENTID uniqueidentifier IN
@DATE datetime IN
@REVENUESTREAMS xml IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN
@SPLITSDECLININGGIFTAID xml INOUT
@ORIGINALGIVENANONYMOUSLY bit IN
@GIFTAIDSPONSORSHIPSPLITS xml INOUT
@PREVIOUSDATE datetime IN
@PREVIOUSDONOTRECEIPT bit IN
@PREVIOUSRECEIPTAMOUNT money IN

Definition

Copy


CREATE procedure dbo.USP_REVENUE_UPDATEREVENUESTREAMS 
(
    @REVENUEID uniqueidentifier,
    @CONSTITUENTID uniqueidentifier,
    @DATE datetime,
    @REVENUESTREAMS xml,
    @CHANGEAGENTID uniqueidentifier,
    @CHANGEDATE datetime,
    @SPLITSDECLININGGIFTAID xml = null output,
    @ORIGINALGIVENANONYMOUSLY bit = null,
    @GIFTAIDSPONSORSHIPSPLITS xml = null output,
    @PREVIOUSDATE datetime = null,
    @PREVIOUSDONOTRECEIPT bit = null,
    @PREVIOUSRECEIPTAMOUNT money = null
)

as 
    set NOCOUNT on;

    declare @ID uniqueidentifier;
    declare @APPLICATIONID uniqueidentifier;
    declare @APPLICATIONTYPE tinyint;
    declare @APPLIEDAMOUNT money;
    declare @APPLICATIONCODE tinyint;
    declare @GIFTFIELDS xml;
    declare @OTHERFIELDS xml;
    declare @DECLINESGIFTAID bit;
    declare @ISGIFTAIDSPONSORSHIP bit;
    declare @ORIGINALSPLITAMOUNT money;
    declare @BASEAPPLIEDAMOUNT money;
    declare @ORGANIZATIONAPPLIEDAMOUNT money;
    declare @REVENUETYPECODE tinyint;

    declare @DESIGNATIONID uniqueidentifier;
    declare @OPPORTUNITYID uniqueidentifier;
    declare @OTHERTYPECODEID uniqueidentifier;
    declare @CATEGORYCODEID uniqueidentifier;
    declare @CAMPAIGNS xml;
    declare @SOLICITORS xml;
    declare @RECOGNITIONCREDITS xml;
    declare @UPDATERECOGNITIONOPTION tinyint;
    declare @UPDATESOLICITORSOPTION tinyint;

    declare @CONTEXTCACHE varbinary(128);

    declare @PAYMENTBASECURRENCYID uniqueidentifier;
    declare @PAYMENTTRANSACTIONCURRENCYID uniqueidentifier;
    declare @PAYMENTBASEEXCHANGERATEID uniqueidentifier;
    declare @PAYMENTORGANIZATIONEXCHANGERATEID uniqueidentifier;
    declare @PAYMENTRANSACTIONCURRENCYDECIMALDIGITS tinyint;
    declare @APPLICATIONCURRENCYID uniqueidentifier;
    declare @CROSSCURRENCYAPPLICATIONEXCHANGERATECANCHANGE bit;
    declare @APPLIEDAMOUNTCONVERTED money;
    declare @CURRENTDATE datetime = getdate();

    declare @PLANNEDGIFTUPDATES table
    (
        PLANNEDGIFTID uniqueidentifier,
        PLANNEDGIFTADDITIONID uniqueidentifier,
        OLDAMOUNT money,
        NEWAMOUNT money,
        OLDDATE datetime,
        NEWDATE datetime,
        OLDTRANSACTIONAMOUNT money,
        NEWTRANSACTIONAMOUNT money,
        BASECURRENCYID uniqueidentifier,
        TRANSACTIONCURRENCYID uniqueidentifier
    )

    declare @REGISTRANTIDS table
    (
        ID uniqueidentifier
    );

    declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

    if @PREVIOUSDATE is null
        set @PREVIOUSDATE = @DATE;

    if @PREVIOUSDATE = @DATE
        set @CROSSCURRENCYAPPLICATIONEXCHANGERATECANCHANGE = 0;
    else
        set @CROSSCURRENCYAPPLICATIONEXCHANGERATECANCHANGE = 1;

    select
        @PAYMENTBASECURRENCYID = CS.BASECURRENCYID,
        @PAYMENTTRANSACTIONCURRENCYID = FT.TRANSACTIONCURRENCYID,
        @PAYMENTBASEEXCHANGERATEID = FT.BASEEXCHANGERATEID,
        @PAYMENTORGANIZATIONEXCHANGERATEID = FT.ORGEXCHANGERATEID,
        @PAYMENTRANSACTIONCURRENCYDECIMALDIGITS = CURRENCY.DECIMALDIGITS
    from dbo.FINANCIALTRANSACTION FT
        inner join dbo.PDACCOUNTSYSTEM PD on PD.ID = FT.PDACCOUNTSYSTEMID
        inner join dbo.CURRENCYSET CS on CS.ID = PD.CURRENCYSETID
        inner join dbo.CURRENCY on FT.TRANSACTIONCURRENCYID = CURRENCY.ID
    where
        FT.ID = @REVENUEID;

    --We must swap out auction packages for all of the auction items within the package

    --auction packages have no revenue records (just an empty shell), but their items are splits

    exec dbo.USP_REVENUE_UPDATEAPPLICATIONS_AUCTIONPACKAGES @REVENUEID, @REVENUESTREAMS output

    set @REVENUESTREAMS = dbo.UFN_REVENUE_REVENUESTREAMS_CONVERTAMOUNTSINXML(@REVENUESTREAMS, @PAYMENTBASECURRENCYID, @PAYMENTORGANIZATIONEXCHANGERATEID, @PAYMENTTRANSACTIONCURRENCYID, @PAYMENTBASEEXCHANGERATEID);

    declare UPDATECURSOR cursor local fast_forward for 
        select
            [NEW].ID,
            [NEW].APPLICATIONID,
            [NEW].APPLIED,
            [NEW].APPLICATIONCODE,
            [NEW].GIFTFIELDS,
            [NEW].OTHERFIELDS,
            [NEW].DECLINESGIFTAID,
            [NEW].ISSPONSORSHIP,
            [OLD].TRANSACTIONAMOUNT,
            [NEW].UPDATERECOGNITIONOPTION,
            [NEW].APPLIEDBASEAMOUNT,
            [NEW].APPLIEDORGANIZATIONAMOUNT,
            [NEW].UPDATESOLICITORSOPTION,
            [NEW].CATEGORYCODEID
        from dbo.UFN_REVENUE_GETAPPLICATIONS_FROMXML(@REVENUESTREAMS) as [NEW]
        inner join dbo.FINANCIALTRANSACTIONLINEITEM as [OLD] on [NEW].ID = [OLD].ID
        inner join dbo.REVENUESPLIT_EXT on [OLD].ID = REVENUESPLIT_EXT.ID
        where [OLD].DELETEDON is null and [OLD].TYPECODE != 1;

    /* cache current context information */
    set @CONTEXTCACHE = CONTEXT_INFO();

    /* set CONTEXT_INFO to @CHANGEAGENTID */
    set CONTEXT_INFO @CHANGEAGENTID;

        declare @DELETEDIDS table
    (
        ID uniqueidentifier
    );

    --Delete revenue

    declare @NEWREVENUESTREAM table
    (
        ID uniqueidentifier
    );

    insert into @NEWREVENUESTREAM (ID)
    select ID from dbo.UFN_REVENUE_GETAPPLICATIONS_FROMXML(@REVENUESTREAMS)

    insert into @DELETEDIDS 
    select LI.ID
    from dbo.FINANCIALTRANSACTION FT
    inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on FT.ID = LI.FINANCIALTRANSACTIONID
    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = LI.ID
    where FT.ID = @REVENUEID and LI.DELETEDON is null and LI.TYPECODE != 1
    --Using table variable since a poor plan is chosen when using the XML function UFN_REVENUE_GETAPPLICATIONS_FROMXML

    EXCEPT select ID from @NEWREVENUESTREAM;

--Gift Aid is for UK only

    declare @PRODUCTISUK bit = dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D');
    declare @GBPCURRENCYID uniqueidentifier = (select CURRENCY.ID from dbo.CURRENCY where CURRENCY.ISO4217 = 'GBP');

    if @PRODUCTISUK = 1
    begin

     declare @DELETEDIDSXML xml = (
         select ID
         from @DELETEDIDS
         for xml raw('ITEM')
             ,type
             ,elements
             ,root('DELETEDIDS')
             ,binary BASE64
         );

        --We need to cache the deleted/changed split information in order potentially refund it later in this SP after the splits have been

        --actually deleted or updated. We have to wait until after the new splits are created (to calculate CCRN) in order determine if the deleted/changed splits should be refunded.

        declare @DELETEDANDCHANGEDSPLITSINFO xml ;

        exec USP_GETGIFTAIDSPLITSTOCACHE @REVENUEID, @ORGANIZATIONCURRENCYID, @DELETEDIDSXML, @DELETEDANDCHANGEDSPLITSINFO output

    end

    --JamesWill 03/23/2006 CR237947-031406PROD

    --Ensure that no DELETEDIDS have MG Pledges linked to it 

    if (select count([DEL].ID)  
        from @DELETEDIDS as [DEL]
        inner join dbo.REVENUEMATCHINGGIFT as [RMG] on [RMG].MGSOURCEREVENUEID = [DEL].ID ) > 0
    begin
        raiserror('All applications with matching gift claims must have the matching gift claim removed before deleting the gift.', 13, 1);
        return 0;
    end

    -- update RG installments

    declare @RGAPPLICATIONS table (APPLICATIONID uniqueidentifier,
                                                                 APPLIED money,
                                                                 PREVIOUSAPPLIED money,
                                                                 ISDELETED bit,
                                                                 APPLICATIONEXCHANGERATEID uniqueidentifier,
                                                                 PREVIOUSAPPLIEDCONVERTED money,
                                                                 EFFECTIVEDATE datetime,
                                                                 TRANSACTIONCURRENCYID uniqueidentifier,
                                                                 BASECURRENCYID uniqueidentifier,
                                                                 BASEEXCHANGERATEID uniqueidentifier,
                                                                 ORGANIZATIONEXCHANGERATEID uniqueidentifier);
    with APPS
    as
    (
        select
            NEW.APPLICATIONID,
            NEW.APPLIED,
            OLD.TRANSACTIONAMOUNT PREVIOUSAPPLIED,
            0 ISDELETED,
            (
                select
                    RECURRINGGIFTACTIVITY.AMOUNT
                from
                    dbo.RECURRINGGIFTACTIVITY
                where
                    RECURRINGGIFTACTIVITY.SOURCEREVENUEID = NEW.APPLICATIONID
                    and RECURRINGGIFTACTIVITY.PAYMENTREVENUEID = NEW.ID
            ) PREVIOUSAPPLIEDCONVERTED,
            OLD.DATEADDED EFFECTIVEDATE
        from
            dbo.UFN_REVENUE_GETAPPLICATIONS_FROMXML(@REVENUESTREAMS) NEW
            inner join dbo.FINANCIALTRANSACTIONLINEITEM OLD on OLD.ID = NEW.ID
            inner join dbo.REVENUESPLIT_EXT on [OLD].ID = REVENUESPLIT_EXT.ID
        where NEW.APPLICATIONCODE = 3 and [OLD].DELETEDON is null and [OLD].TYPECODE != 1

        union all

        select
            RECURRINGGIFTACTIVITY.SOURCEREVENUEID,
            0,
            RECURRINGGIFTACTIVITY.AMOUNT,
            1,
            RECURRINGGIFTACTIVITY.AMOUNT,
            null  -- effectivedate not needed for deleted splits

        from
            dbo.RECURRINGGIFTACTIVITY
        where
            PAYMENTREVENUEID in (select ID from @DELETEDIDS)
    ),
    APPLICATIONEXCHANGERATE
    as
    (
        select
            REVENUE.ID [REVENUEID],
            case
                when (REVENUE.TRANSACTIONCURRENCYID = @PAYMENTTRANSACTIONCURRENCYID)
                    then 0
                else
                    1
            end [APPLICATIONEXCHANGERATENEEDED],
            --Same logic as USP_REVENUE_GETUPDATEDAPPLICATIONEXCHANGERATE

            case
                when (REVENUE.TRANSACTIONCURRENCYID = @PAYMENTTRANSACTIONCURRENCYID)
                    then null

                when (REVENUE.TRANSACTIONCURRENCYID = @PAYMENTBASECURRENCYID)
                    then @PAYMENTBASEEXCHANGERATEID

                when (@CROSSCURRENCYAPPLICATIONEXCHANGERATECANCHANGE = 0)
                    --Don't allow a change in cross currency application exchange rates (because the revenue date didn't change

                    -- and it's a system-selected rate). All application exchange rates on installment payments made by this

                    -- payment against this recurring gift should already have the same rate, so just select the top 1.

                    then
                    (
                        select top (1)
                            RECURRINGGIFTINSTALLMENTPAYMENT.APPLICATIONEXCHANGERATEID
                        from
                            dbo.RECURRINGGIFTINSTALLMENT
                            inner join dbo.RECURRINGGIFTINSTALLMENTPAYMENT on RECURRINGGIFTINSTALLMENT.ID = RECURRINGGIFTINSTALLMENTPAYMENT.RECURRINGGIFTINSTALLMENTID
                        where
                            RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID = @REVENUEID
                            and RECURRINGGIFTINSTALLMENT.REVENUEID = REVENUE.ID
                    )

                else
                    dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(@PAYMENTTRANSACTIONCURRENCYID,REVENUE.TRANSACTIONCURRENCYID,@DATE,0,null)
            end [APPLICATIONEXCHANGERATEID],
            REVENUE.TRANSACTIONCURRENCYID,
            REVENUE_EXT.NONPOSTABLEBASECURRENCYID BASECURRENCYID,
            REVENUE.BASEEXCHANGERATEID,
            REVENUE.ORGEXCHANGERATEID ORGANIZATIONEXCHANGERATEID
        from dbo.FINANCIALTRANSACTION REVENUE
        inner join dbo.REVENUE_EXT on REVENUE_EXT.ID = REVENUE.ID
        where REVENUE.ID in (select APPS.APPLICATIONID from APPS)
            and REVENUE.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15) and REVENUE.DELETEDON is null
    )
    insert into @RGAPPLICATIONS
    select
        APPS.APPLICATIONID,
        sum(APPS.APPLIED),
        sum(APPS.PREVIOUSAPPLIED),
        min(APPS.ISDELETED),
        APPLICATIONEXCHANGERATE.APPLICATIONEXCHANGERATEID,
        sum(APPS.PREVIOUSAPPLIEDCONVERTED),
        min(APPS.EFFECTIVEDATE),
        APPLICATIONEXCHANGERATE.TRANSACTIONCURRENCYID,
        APPLICATIONEXCHANGERATE.BASECURRENCYID,
        APPLICATIONEXCHANGERATE.BASEEXCHANGERATEID,
        APPLICATIONEXCHANGERATE.ORGANIZATIONEXCHANGERATEID
    from
        APPS
        inner join APPLICATIONEXCHANGERATE on APPS.APPLICATIONID = APPLICATIONEXCHANGERATE.REVENUEID
    group by
        APPS.APPLICATIONID,
        APPLICATIONEXCHANGERATE.APPLICATIONEXCHANGERATEID,
        APPLICATIONEXCHANGERATE.TRANSACTIONCURRENCYID,
        APPLICATIONEXCHANGERATE.BASECURRENCYID,
        APPLICATIONEXCHANGERATE.BASEEXCHANGERATEID,
        APPLICATIONEXCHANGERATE.ORGANIZATIONEXCHANGERATEID
    having
        sum(APPLIED) <> sum(PREVIOUSAPPLIED)
        or min(ISDELETED) = 1
        or
        (
            max(APPLICATIONEXCHANGERATE.APPLICATIONEXCHANGERATENEEDED) = 1
            and
            (
                APPLICATIONEXCHANGERATE.APPLICATIONEXCHANGERATEID is null
                or exists
                (
                    select
                        1
                    from
                        dbo.RECURRINGGIFTINSTALLMENT
                        inner join dbo.RECURRINGGIFTINSTALLMENTPAYMENT on RECURRINGGIFTINSTALLMENT.ID = RECURRINGGIFTINSTALLMENTPAYMENT.RECURRINGGIFTINSTALLMENTID
                    where
                        RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID = @REVENUEID
                        and RECURRINGGIFTINSTALLMENT.REVENUEID = APPS.APPLICATIONID
                        and RECURRINGGIFTINSTALLMENTPAYMENT.APPLICATIONEXCHANGERATEID <> APPLICATIONEXCHANGERATE.APPLICATIONEXCHANGERATEID
                )
            )
        );

    if @@ROWCOUNT > 0
    begin
        declare @RGID uniqueidentifier,
                        @APPLIED money,
                        @PREVIOUSAPPLIED money,
                        @ISDELETED bit,
                        @APPLICATIONEXCHANGERATEID uniqueidentifier,
                        @PREVIOUSAPPLIEDCONVERTED money,
                        @APPLICATIONEFFECTIVEDATETIME datetime,
                        @APPLICATIONEFFECTIVEDATE date,
                        @RGTRANSACTIONCURRENCYID uniqueidentifier,
                        @RGBASECURRENCYID uniqueidentifier,
                        @RGBASEEXCHANGERATEID uniqueidentifier,
                        @RGORGANIZATIONEXCHANGERATEID uniqueidentifier;

        declare RGCURSOR cursor local fast_forward for
        select *
        from @RGAPPLICATIONS;

        open RGCURSOR;
        fetch next from RGCURSOR into @RGID, @APPLIED, @PREVIOUSAPPLIED, @ISDELETED, @APPLICATIONEXCHANGERATEID, @PREVIOUSAPPLIEDCONVERTED, @APPLICATIONEFFECTIVEDATETIME, @RGTRANSACTIONCURRENCYID, @RGBASECURRENCYID, @RGBASEEXCHANGERATEID, @RGORGANIZATIONEXCHANGERATEID;
        while @@FETCH_STATUS = 0
        begin
            set @APPLICATIONEFFECTIVEDATE = @APPLICATIONEFFECTIVEDATETIME;

            select
                @APPLICATIONCURRENCYID = REVENUE.TRANSACTIONCURRENCYID
            from dbo.FINANCIALTRANSACTION REVENUE
            inner join dbo.REVENUE_EXT on REVENUE_EXT.ID = REVENUE.ID
            where REVENUE.ID = @RGID
                and REVENUE.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15) and REVENUE.DELETEDON is null;

            if @APPLICATIONCURRENCYID <> @PAYMENTTRANSACTIONCURRENCYID
            begin
                if @APPLICATIONEXCHANGERATEID is null
                begin
                    raiserror('BBERR_APPLICATIONEXCHANGERATEDOESNOTEXIST : A payment can only be applied to an application if the payment and application have the same transaction currency or if there is an exchange rate from the payment transaction currency to the application transaction currency.', 13, 1);
                    return 1;
                end
            end

            if @APPLICATIONEXCHANGERATEID is null
                set @APPLIEDAMOUNTCONVERTED = @APPLIED;
            else
                set @APPLIEDAMOUNTCONVERTED = dbo.UFN_CURRENCY_CONVERT(@APPLIED, @APPLICATIONEXCHANGERATEID);

            if @ISDELETED = 1
            begin
                exec dbo.USP_RECURRINGGIFT_UNDOINSTALLMENTCHANGESONDELETEPAYMENT
                    @PAYMENTID = @REVENUEID,
                    @RECURRINGGIFTID = @RGID,
                    @CHANGEAGENTID = @CHANGEAGENTID,
                    @CURRENTDATE = @CURRENTDATE

                -- remove all money applied to the RG

                delete from dbo.RECURRINGGIFTINSTALLMENTPAYMENT
                where RECURRINGGIFTINSTALLMENTID in(select ID from dbo.RECURRINGGIFTINSTALLMENT where REVENUEID = @RGID)
                and PAYMENTID = @REVENUEID;

                exec dbo.USP_RECURRINGGIFT_DELETEFUTUREINSTALLMENTS @RGID, @CHANGEAGENTID;

                exec dbo.USP_RECURRINGGIFT_UPDATEREVENUESCHEDULE
                    @REVENUEID = @RGID,
                    @STATUSCHANGETYPECODE = 2,
                    @CHANGEAGENTID = @CHANGEAGENTID,
                    @CURRENTDATETIME = @CURRENTDATE;
            end

            else if @APPLIEDAMOUNTCONVERTED > @PREVIOUSAPPLIEDCONVERTED
            begin
                declare @ADDAMOUNT money;
                set @ADDAMOUNT = @APPLIED - @PREVIOUSAPPLIED;

                declare @NEXTTRANSACTIONDATE date;

                -- apply additional amount

                exec dbo.USP_RECURRINGGIFT_APPLYPAYMENTTOINSTALLMENTS
                    @RGID,
                    @CHANGEAGENTID,
                    @CHANGEDATE,
                    @REVENUEID,
                    @ADDAMOUNT,
                    @NEXTTRANSACTIONDATE output,
                    @APPLICATIONCURRENCYID,
                    @APPLICATIONEXCHANGERATEID,
                    @PREVIOUSAPPLIED,
                    @PREVIOUSAPPLIEDCONVERTED,
                    @DATE,
                    @APPLICATIONEFFECTIVEDATETIME
            end
            else
            begin
                -- remove subtracted amount


                -- payment handling rules

                declare @FIRSTINSTALLMENTCODE tinyint,
                                @INSTALLMENTUNDERPAYMENTCODE tinyint,
                                @APPLYTOPASTINSTALLMENTS bit,
                                @PASTBALANCEUNDERPAYMENTCODE tinyint,
                                @OVERPAYMENTCODE tinyint;

                if dbo.UFN_RECURRINGGIFT_ISMEMBERSHIP(@RGID) = 1
                    select @FIRSTINSTALLMENTCODE = 0,                --oldest first

                                 @INSTALLMENTUNDERPAYMENTCODE = 0,         --leave balance

                                 @APPLYTOPASTINSTALLMENTS = 1,          
                                 @PASTBALANCEUNDERPAYMENTCODE = 0,         --leave balance

                                 @OVERPAYMENTCODE = 0                      --apply to future

                else
                    select @FIRSTINSTALLMENTCODE = FIRSTINSTALLMENTCODE,                --0=oldest first, 1=most recent first

                                 @INSTALLMENTUNDERPAYMENTCODE = INSTALLMENTUNDERPAYMENTCODE,  --0=leave balance, 1=write-off, 2=adjust

                                 @APPLYTOPASTINSTALLMENTS = APPLYTOPASTINSTALLMENTS,          
                                 @PASTBALANCEUNDERPAYMENTCODE = PASTBALANCEUNDERPAYMENTCODE,  --0=leave balance, 1=write-off, 2=adjust

                                 @OVERPAYMENTCODE = OVERPAYMENTCODE                           --0=apply to future, 1=adjust, 2=donation(handled at a higher level)

                    from dbo.UFN_RECURRINGGIFTSETTING_GETFOREFFECTIVEDATE(@APPLICATIONEFFECTIVEDATETIME);

                declare @REMOVEAMOUNTCONVERTED money;
                set @REMOVEAMOUNTCONVERTED = @PREVIOUSAPPLIEDCONVERTED - @APPLIEDAMOUNTCONVERTED;

                declare @RGIPID uniqueidentifier,
                                @RGIID uniqueidentifier,
                                @INSTALLMENTAPPLIEDAMOUNT money,
                                @INSTALLMENTDATE date,
                                @INSTALLMENTAMOUNT money,
                                @INSTALLMENTBALANCE money,
                                @PASTBALANCEINSTALLMENT bit,
                                @MOSTRECENTINSTALLMENTREPEATED bit,
                                @ORIGINALWRITEOFFAMOUNT money,
                                @WRITEOFFAMOUNT money,
                                @ORIGINALADJUSTMENTAMOUNT money,
                                @ADJUSTINSTALLMENTSTATUSCODE tinyint = 99,
                                @ADJUSTMENTAMOUNT money;

                declare INSTALLMENTCURSOR cursor local fast_forward for
                    with INSTALLMENTS as (
                        select RGIP.ID RGIPID,
                                     RGIP.AMOUNT ORIGINALPAYMENTAMOUNT,
                                     RGI.ID RGIID,
                                     RGI.DATE,
                                     RGI.TRANSACTIONAMOUNT INSTALLMENTAMOUNT,
                                     dbo.UFN_RECURRINGGIFTINSTALLMENT_GETINSTALLMENTBALANCE(RGI.ID) BALANCE,
                                     E.OLDAMOUNT ORIGINALINSTALLMENTAMOUNT,
                                     isnull(W.TRANSACTIONAMOUNT,0) ORIGINALWRITEOFFAMOUNT,
                                     isnull(RGI.TRANSACTIONAMOUNT - E.OLDAMOUNT,0) ORIGINALADJUSTMENTAMOUNT
                        from dbo.RECURRINGGIFTINSTALLMENTPAYMENT RGIP
                        inner join dbo.RECURRINGGIFTINSTALLMENT RGI on RGI.ID = RGIP.RECURRINGGIFTINSTALLMENTID
                        left join dbo.RECURRINGGIFTINSTALLMENTEVENT E on E.RECURRINGGIFTINSTALLMENTID = RGI.ID and E.PAYMENTID = @REVENUEID
                        outer apply (select IW.TRANSACTIONAMOUNT
                                                 from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF IW 
                                                 inner join dbo.RECURRINGGIFTWRITEOFF W on W.ID = IW.WRITEOFFID
                                                 where IW.RECURRINGGIFTINSTALLMENTID = RGI.ID
                                                 and W.PAYMENTID = @REVENUEID) W
                        where RGI.REVENUEID = @RGID
                        and RGIP.PAYMENTID = @REVENUEID
                    ),
                    MOSTRECENTINSTALLMENTAPPLIEDTWICE as (
                        select top 1 RGIID ID
                        from INSTALLMENTS
                        where ORIGINALPAYMENTAMOUNT > ORIGINALINSTALLMENTAMOUNT
                        and DATE <= @APPLICATIONEFFECTIVEDATE
                        and @APPLYTOPASTINSTALLMENTS = 1
                        and @OVERPAYMENTCODE = 1
                        order by DATE desc
                    )
                    select RGIPID, ORIGINALPAYMENTAMOUNT, RGIID, DATE, INSTALLMENTAMOUNT, BALANCE, ORIGINALWRITEOFFAMOUNT, ORIGINALADJUSTMENTAMOUNT, MOSTRECENTINSTALLMENTREPEATED, PASTBALANCEINSTALLMENT
                    from (select RGIPID,
                                             case when m.ID is null then ORIGINALPAYMENTAMOUNT
                                                        else ORIGINALINSTALLMENTAMOUNT end ORIGINALPAYMENTAMOUNT,
                                             RGIID,
                                             DATE,
                                             case when m.ID is null then INSTALLMENTAMOUNT
                                                        else ORIGINALINSTALLMENTAMOUNT end INSTALLMENTAMOUNT,
                                             BALANCE,
                                             ORIGINALWRITEOFFAMOUNT,
                                             case when m.ID is null then ORIGINALADJUSTMENTAMOUNT else 0 end ORIGINALADJUSTMENTAMOUNT,
                                             0 MOSTRECENTINSTALLMENTREPEATED,
                                             0 PASTBALANCEINSTALLMENT
                                from INSTALLMENTS i
                                left join MOSTRECENTINSTALLMENTAPPLIEDTWICE m on m.ID = i.RGIID
                                union all
                                select RGIPID,
                                             ORIGINALPAYMENTAMOUNT-ORIGINALINSTALLMENTAMOUNT,
                                             RGIID,
                                             DATE,
                                             INSTALLMENTAMOUNT,
                                             BALANCE,
                                             ORIGINALWRITEOFFAMOUNT,
                                             ORIGINALADJUSTMENTAMOUNT,
                                             1,
                                             0
                                from INSTALLMENTS i
                                inner join MOSTRECENTINSTALLMENTAPPLIEDTWICE m on m.ID = i.RGIID
                                union all
                                -- past balances to write-off/adjust

                                select null,
                                             null,
                                             I.ID,
                                             I.DATE,
                                             I.TRANSACTIONAMOUNT,
                                             dbo.UFN_RECURRINGGIFTINSTALLMENT_GETINSTALLMENTBALANCE(I.ID),
                                             W.TRANSACTIONAMOUNT,
                                             0,
                                             null,
                                             1
                                from dbo.RECURRINGGIFTINSTALLMENT I
                                outer apply (select IW.TRANSACTIONAMOUNT
                                                         from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF IW 
                                                         inner join dbo.RECURRINGGIFTWRITEOFF W on W.ID = IW.WRITEOFFID
                                                         where IW.RECURRINGGIFTINSTALLMENTID = I.ID
                                                         and W.PAYMENTID = @REVENUEID) W
                                where I.REVENUEID = @RGID
                                and I.DATE <= @APPLICATIONEFFECTIVEDATE
                                and I.STATUSCODE in(0,1)
                                and @PASTBALANCEUNDERPAYMENTCODE in(1,2)
                             ) i
                    -- reverse order of that from USP_RECURRINGGIFT_APPLYPAYMENTTOINSTALLMENTS

                    order by PASTBALANCEINSTALLMENT,                                                                       -- paid installments first, then past installments with a balance if needed

                                     case when DATE <= @APPLICATIONEFFECTIVEDATE then 1 else 2 end desc,                           -- today/past, then future

                                     MOSTRECENTINSTALLMENTREPEATED desc,                                                           -- repeated most recent installment after other today/past installments

                                     case when DATE > @APPLICATIONEFFECTIVEDATE or @FIRSTINSTALLMENTCODE = 0 then DATE end desc,   -- date asc if appropriate (past installments by rule, future installments always)

                                     case when DATE <= @APPLICATIONEFFECTIVEDATE and @FIRSTINSTALLMENTCODE = 1 then DATE end;      -- date desc if appropriate


                open INSTALLMENTCURSOR;
                fetch next from INSTALLMENTCURSOR into @RGIPID, @INSTALLMENTAPPLIEDAMOUNT, @RGIID, @INSTALLMENTDATE, @INSTALLMENTAMOUNT, @INSTALLMENTBALANCE, @ORIGINALWRITEOFFAMOUNT, @ORIGINALADJUSTMENTAMOUNT, @MOSTRECENTINSTALLMENTREPEATED, @PASTBALANCEINSTALLMENT;

                while @@FETCH_STATUS = 0
                begin
                    set @WRITEOFFAMOUNT = 0;
                    set @ADJUSTINSTALLMENTSTATUSCODE = 99;
                    set @ADJUSTMENTAMOUNT = 0;

                    -- exit the loop if we've removed all the money and we don't need to handle write-offs/adjustments of past balances

                    if @REMOVEAMOUNTCONVERTED <= 0 and @PASTBALANCEUNDERPAYMENTCODE = 0
                        break;

                    if @REMOVEAMOUNTCONVERTED > 0
                    begin
                        if @REMOVEAMOUNTCONVERTED >= @INSTALLMENTAPPLIEDAMOUNT and @MOSTRECENTINSTALLMENTREPEATED = 0 and @APPLIEDAMOUNTCONVERTED > 0
                        begin
                            -- removing more than what was applied to this installment alone

                            -- remove everything related to this payment from this installment

                            exec dbo.USP_RECURRINGGIFT_UNDOINSTALLMENTCHANGESONDELETEPAYMENT
                                @PAYMENTID = @REVENUEID,
                                @RECURRINGGIFTID = @RGID,
                                @RECURRINGGIFTINSTALLMENTID = @RGIID,
                                @CHANGEAGENTID = @CHANGEAGENTID,
                                @CURRENTDATE = @CURRENTDATE

                            exec dbo.USP_RECURRINGGIFTINSTALLMENTPAYMENT_DELETEBYID_WITHCHANGEAGENTID @RGIPID, @CHANGEAGENTID;

                            if @INSTALLMENTDATE <= @APPLICATIONEFFECTIVEDATE
                            begin
                                if @PASTBALANCEUNDERPAYMENTCODE = 1  -- write-off

                                    set @WRITEOFFAMOUNT = @ORIGINALWRITEOFFAMOUNT + @INSTALLMENTAPPLIEDAMOUNT + @INSTALLMENTBALANCE;
                                else if @PASTBALANCEUNDERPAYMENTCODE = 2  -- adjust amount

                                begin
                                    set @ADJUSTINSTALLMENTSTATUSCODE = 2;
                                    set @ADJUSTMENTAMOUNT = @INSTALLMENTBALANCE;
                                end
                            end
                        end

                        else 
                        begin
                            -- not removing all money applied to this installment (or $0 applied to RG)


                            -- underpayment rule only applies to past/today installments

                            -- this is intentionally @CURRENTDATE, not @APPLICATIONEFFECTIVEDATE - we still want to apply the installment underpayment rule for

                            -- any past installment, even if it's after the application effective date

                            if @INSTALLMENTDATE <= @CURRENTDATE and @INSTALLMENTUNDERPAYMENTCODE = 1  -- write-off

                                set @WRITEOFFAMOUNT = @ORIGINALWRITEOFFAMOUNT + 
                                                                            case when @REMOVEAMOUNTCONVERTED > @INSTALLMENTAPPLIEDAMOUNT then @INSTALLMENTAPPLIEDAMOUNT  --mostrecentinstallmentrepeated=1

                                                                                            else @REMOVEAMOUNTCONVERTED end +
                                                                            @INSTALLMENTBALANCE -
                                                                            @ORIGINALADJUSTMENTAMOUNT;  -- decrease by any adjusted amount - we would only write-off after removing any adjustments


                            if @INSTALLMENTUNDERPAYMENTCODE = 2   -- adjust amount

                            begin
                                set @ADJUSTINSTALLMENTSTATUSCODE = 2;
                                set @ADJUSTMENTAMOUNT = @INSTALLMENTAMOUNT -
                                                                                case when @REMOVEAMOUNTCONVERTED > @INSTALLMENTAPPLIEDAMOUNT then @INSTALLMENTAPPLIEDAMOUNT  --mostrecentinstallmentrepeated=1

                                                                                            else @REMOVEAMOUNTCONVERTED end -
                                                                                @INSTALLMENTBALANCE;
                            end
                            else if @ORIGINALADJUSTMENTAMOUNT > 0
                            begin
                                -- decrease/remove the overpayment adjustment amount but do not create an underpayment adjustment

                                set @ADJUSTINSTALLMENTSTATUSCODE = case when @REMOVEAMOUNTCONVERTED > @INSTALLMENTAPPLIEDAMOUNT then 2
                                                                                            when @REMOVEAMOUNTCONVERTED > @ORIGINALADJUSTMENTAMOUNT then 0
                                                                                            else 2 end;
                                set @ADJUSTMENTAMOUNT = @INSTALLMENTAMOUNT -
                                                                                case when @REMOVEAMOUNTCONVERTED > @INSTALLMENTAPPLIEDAMOUNT then @INSTALLMENTAPPLIEDAMOUNT  --mostrecentinstallmentrepeated=1

                                                                                         when @REMOVEAMOUNTCONVERTED > @ORIGINALADJUSTMENTAMOUNT then @ORIGINALADJUSTMENTAMOUNT
                                                                                         else @REMOVEAMOUNTCONVERTED end;
                            end

                            update dbo.RECURRINGGIFTINSTALLMENTPAYMENT
                            set AMOUNT = AMOUNT - case when @REMOVEAMOUNTCONVERTED > @INSTALLMENTAPPLIEDAMOUNT then @INSTALLMENTAPPLIEDAMOUNT else @REMOVEAMOUNTCONVERTED end,
                                    APPLICATIONEXCHANGERATEID = @APPLICATIONEXCHANGERATEID,
                                    CHANGEDBYID = @CHANGEAGENTID,
                                    DATECHANGED = @CHANGEDATE
                            where ID = @RGIPID;
                        end

                        set @REMOVEAMOUNTCONVERTED = @REMOVEAMOUNTCONVERTED - @INSTALLMENTAPPLIEDAMOUNT;
                    end

                    else if @PASTBALANCEINSTALLMENT = 1
                    begin
                        if @PASTBALANCEUNDERPAYMENTCODE = 1  -- write-off

                            set @WRITEOFFAMOUNT = @INSTALLMENTBALANCE;
                        else if @PASTBALANCEUNDERPAYMENTCODE = 2  -- adjust amount

                        begin
                            set @ADJUSTINSTALLMENTSTATUSCODE = 2;
                            set @ADJUSTMENTAMOUNT = @INSTALLMENTAMOUNT - @INSTALLMENTBALANCE;
                        end
                    end

                    if @ADJUSTINSTALLMENTSTATUSCODE < 99
                    begin
                        declare @ORIGINALINSTALLMENTAMOUNT money = @INSTALLMENTAMOUNT - @ORIGINALADJUSTMENTAMOUNT;

                        exec dbo.USP_RECURRINGGIFT_ADJUSTINSTALLMENTAMOUNT
                            @RGIID,
                            @ORIGINALINSTALLMENTAMOUNT,
                            @ADJUSTMENTAMOUNT,
                            @RGTRANSACTIONCURRENCYID,
                            @RGBASECURRENCYID,
                            @RGBASEEXCHANGERATEID,
                            @RGORGANIZATIONEXCHANGERATEID,
                            @ADJUSTINSTALLMENTSTATUSCODE,
                            @REVENUEID,
                            @APPLICATIONEFFECTIVEDATETIME,
                            @CHANGEAGENTID,
                            @CURRENTDATE
                    end

                    if @WRITEOFFAMOUNT > 0
                    begin
                        declare @WRITEOFFBASEAMOUNT money,
                                        @WRITEOFFORGANIZATIONAMOUNT money,
                                        @WRITEOFFID uniqueidentifier;

                        exec dbo.USP_CURRENCY_GETCURRENCYVALUES
                            @WRITEOFFAMOUNT,
                            null,
                            @RGBASECURRENCYID,
                            @RGBASEEXCHANGERATEID,
                            @RGTRANSACTIONCURRENCYID,
                            @WRITEOFFBASEAMOUNT output,
                            null,
                            @WRITEOFFORGANIZATIONAMOUNT output,
                            @RGORGANIZATIONEXCHANGERATEID,
                            0;

                        select @WRITEOFFID = w.ID
                        from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF iw
                        inner join dbo.RECURRINGGIFTWRITEOFF w on w.ID = iw.WRITEOFFID
                        where iw.RECURRINGGIFTINSTALLMENTID = @RGIID
                        and w.REASONTYPECODE = 1;

                        if @WRITEOFFID is not null
                            update dbo.RECURRINGGIFTINSTALLMENTWRITEOFF
                            set TRANSACTIONAMOUNT = @WRITEOFFAMOUNT,
                                    AMOUNT = @WRITEOFFBASEAMOUNT,
                                    ORGANIZATIONAMOUNT = @WRITEOFFORGANIZATIONAMOUNT,
                                    CHANGEDBYID = @CHANGEAGENTID,
                                    DATECHANGED = @CHANGEDATE
                            where WRITEOFFID = @WRITEOFFID;

                        else
                            exec dbo.USP_RECURRINGGIFT_ADDPAYMENTHANDLINGWRITEOFF
                                @RGID,
                                @RGIID,
                                @REVENUEID,
                                @DATE,
                                @WRITEOFFAMOUNT,
                                @RGBASECURRENCYID,
                                @RGBASEEXCHANGERATEID,
                                @RGTRANSACTIONCURRENCYID,
                                @RGORGANIZATIONEXCHANGERATEID,
                                @CHANGEAGENTID,
                                @CHANGEDATE
                    end

                    fetch next from INSTALLMENTCURSOR into @RGIPID, @INSTALLMENTAPPLIEDAMOUNT, @RGIID, @INSTALLMENTDATE, @INSTALLMENTAMOUNT, @INSTALLMENTBALANCE, @ORIGINALWRITEOFFAMOUNT, @ORIGINALADJUSTMENTAMOUNT, @MOSTRECENTINSTALLMENTREPEATED, @PASTBALANCEINSTALLMENT;
                end
                deallocate INSTALLMENTCURSOR;

                exec dbo.USP_RECURRINGGIFT_DELETEFUTUREINSTALLMENTS @RGID, @CHANGEAGENTID;

                if @APPLICATIONEXCHANGERATEID is not null
                    update dbo.RECURRINGGIFTINSTALLMENTPAYMENT
                    set
                        APPLICATIONEXCHANGERATEID = @APPLICATIONEXCHANGERATEID,
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CHANGEDATE
                    from
                        dbo.RECURRINGGIFTINSTALLMENTPAYMENT
                        inner join dbo.RECURRINGGIFTINSTALLMENT on RECURRINGGIFTINSTALLMENT.ID = RECURRINGGIFTINSTALLMENTPAYMENT.RECURRINGGIFTINSTALLMENTID
                        inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = @RGID
                        inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
                    where
                        RECURRINGGIFTINSTALLMENT.REVENUEID = @RGID
                        and FINANCIALTRANSACTION.DELETEDON is null
                        and RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID = @REVENUEID
                        and RECURRINGGIFTINSTALLMENTPAYMENT.APPLICATIONEXCHANGERATEID <> @APPLICATIONEXCHANGERATEID;

                exec dbo.USP_RECURRINGGIFT_UPDATEREVENUESCHEDULE
                    @REVENUEID = @RGID,
                    @STATUSCHANGETYPECODE = 2,
                    @CHANGEAGENTID = @CHANGEAGENTID,
                    @CURRENTDATETIME = @CURRENTDATE;
            end

            fetch next from RGCURSOR into @RGID, @APPLIED, @PREVIOUSAPPLIED, @ISDELETED, @APPLICATIONEXCHANGERATEID, @PREVIOUSAPPLIEDCONVERTED, @APPLICATIONEFFECTIVEDATETIME, @RGTRANSACTIONCURRENCYID, @RGBASECURRENCYID, @RGBASEEXCHANGERATEID, @RGORGANIZATIONEXCHANGERATEID;
        end
        deallocate RGCURSOR;
    end   -- update RG installments


    delete dbo.RECURRINGGIFTACTIVITY
        from dbo.RECURRINGGIFTACTIVITY
        where PAYMENTREVENUEID in (select ID from @DELETEDIDS);

    -- update RG write-offs associated with this payment to the new payment date

    update dbo.RECURRINGGIFTWRITEOFF
    set DATE = @DATE,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CHANGEDATE
    where PAYMENTID = @REVENUEID
    and DATE <> @DATE;

    -- update RG installment adjustments associated with this payment to the new payment date

    update dbo.RECURRINGGIFTINSTALLMENTEVENT
    set DATE = @DATE,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CHANGEDATE
    where PAYMENTID = @REVENUEID
    and DATE <> @DATE;

    delete dbo.AUCTIONITEMREVENUEPURCHASE
    from
        dbo.AUCTIONITEM
        inner join dbo.AUCTIONITEMREVENUEPURCHASE on AUCTIONITEM.ID = AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID
        inner join dbo.AUCTIONITEMPURCHASE on AUCTIONITEM.ID = AUCTIONITEMPURCHASE.AUCTIONITEMID
    where
        AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID = @REVENUEID
        and
        AUCTIONITEMPURCHASE.PURCHASEID in (select ID from @DELETEDIDS);

    delete dbo.AUCTIONITEMPURCHASE
    where 
        AUCTIONITEMPURCHASE.PURCHASEID in (select ID from @DELETEDIDS);

    declare @SPLITSTODELETE xml;
    set @SPLITSTODELETE = (select SPLITS.ID from (select ID 
                        from dbo.UFN_REVENUE_GETSPLITS_2(@REVENUEID)) SPLITS
                        where SPLITS.ID in (select ID from @DELETEDIDS)
                        for xml raw('ITEM'),type,elements,root('SPLITSTODELETE'),BINARY BASE64);
    --exec dbo.USP_REVENUESPLIT_DELETESPLITS @SPLITSTODELETE, @CHANGEAGENTID, @CHANGEDATE;

 if @SPLITSTODELETE is not null   
    exec dbo.USP_REVENUESPLIT_DELETESPLITS @SPLITSTODELETE, @CHANGEAGENTID, @CHANGEDATE;

    declare @SPLITSDECLININGGIFTAIDTBL table
    (
        REVENUESPLITID uniqueidentifier
    )

    declare @GIFTAIDSPONSORSHIPSPLITSTBL table
    (
        REVENUESPLITID uniqueidentifier
    )

    --Update Changed Revenue Items

    open UPDATECURSOR;
    fetch next from UPDATECURSOR into @ID, @APPLICATIONID, @APPLIEDAMOUNT, @APPLICATIONTYPE, @GIFTFIELDS, @OTHERFIELDS, @DECLINESGIFTAID, @ISGIFTAIDSPONSORSHIP, @ORIGINALSPLITAMOUNT, @UPDATERECOGNITIONOPTION, @BASEAPPLIEDAMOUNT, @ORGANIZATIONAPPLIEDAMOUNT, @UPDATESOLICITORSOPTION, @CATEGORYCODEID;

    while @@FETCH_STATUS = 0
    begin

        if @APPLICATIONTYPE = 0 --Gift

            begin
                SELECT top 1
                    @DESIGNATIONID = T.c.value('(DESIGNATIONID)[1]','uniqueidentifier'),
                    @OPPORTUNITYID = T.c.value('(OPPORTUNITYID)[1]','uniqueidentifier'),
                    @CATEGORYCODEID = T.c.value('(CATEGORYCODEID)[1]','uniqueidentifier'),
                    @CAMPAIGNS = c.query('./CAMPAIGNS'),
                    @SOLICITORS = c.query('./SOLICITORS'),
                    @RECOGNITIONCREDITS = c.query('./RECOGNITIONS'),
                    @REVENUETYPECODE = case when T.c.exist('REVENUETYPECODE/text()') = 1 then T.c.value('(REVENUETYPECODE)[1]','tinyint') else null end
                FROM @GIFTFIELDS.nodes('/GIFTFIELDS/ITEM') T(c);
            end

        if @APPLICATIONTYPE = 100 -- unnappliedmatching gift claim

            begin
                SELECT top 1
                    @DESIGNATIONID = T.c.value('(DESIGNATIONID)[1]','uniqueidentifier'),
                    @CATEGORYCODEID = T.c.value('(CATEGORYCODEID)[1]','uniqueidentifier'),
                    @CAMPAIGNS = c.query('./CAMPAIGNS'),
                    @SOLICITORS = c.query('./SOLICITORS'),
                    @RECOGNITIONCREDITS = c.query('./RECOGNITIONS')
                FROM @GIFTFIELDS.nodes('/GIFTFIELDS/ITEM') T(c);
            end

        if @APPLICATIONTYPE = 4 --Other

            begin
                SELECT top 1
                    @DESIGNATIONID = T.c.value('(DESIGNATIONID)[1]','uniqueidentifier'),
                    @OTHERTYPECODEID = T.c.value('(OTHERTYPECODEID)[1]','uniqueidentifier'),
                    @CATEGORYCODEID = T.c.value('(CATEGORYCODEID)[1]','uniqueidentifier'),
                    @CAMPAIGNS = c.query('./CAMPAIGNS'),
                    @SOLICITORS = c.query('./SOLICITORS'),
                    @RECOGNITIONCREDITS = c.query('./RECOGNITIONS')
            FROM @OTHERFIELDS.nodes('/OTHERFIELDS/ITEM') T(c);
            end

            declare @REC table
                (
                    ID uniqueidentifier,
                    CONSTITUENTID uniqueidentifier,
                    AMOUNT money,
                    EFFECTIVEDATE datetime,
                    REVENUERECOGNITIONTYPECODEID uniqueidentifier,
                    BASECURRENCYID uniqueidentifier,
                    DESIGNATIONID uniqueidentifier, --field for donor challenge internal sponsor credit

                    DESIGNATION nvarchar(512), --field for donor challenge internal sponsor credit

                    DONOR nvarchar(293), --field for donor challenge internal sponsor credit

                    DONORCHALLENGERECOGNITIONTYPECODE tinyint, --field for donor challenge internal sponsor credit

                    RECOGNITIONCREDITFKID uniqueidentifier --field for donor challenge internal sponsor credit

                );

        -- Clearing @REC since table variables are initialized once per batch and aren't scoped to the loop.

        -- As a result, the table will still hold results from the previous loop run.

        delete from @REC;

        declare @MATCHEDBYDONORCHALLENGE bit = 0;
                if dbo.UFN_REVENUESPLIT_MATCHEDBYDONORCHALLENGE(@ID) = 1
                begin
                    set @MATCHEDBYDONORCHALLENGE = 1;

                    -- If the amount on the split has been changed and its matched by a donor challenge. Throw an error preventing the form from saving.

                    -- This change is occurring because of Bug 487336. I don't think this a good idea.

                    if @APPLIEDAMOUNT <> @ORIGINALSPLITAMOUNT
                    begin
                        raiserror('BBERR_DONORCHALLENGEMATCHEDSPLITCHANGED', 13, 1);
                    end
                end

                if @MATCHEDBYDONORCHALLENGE = 1
                begin
                    insert into @REC(ID, CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID, BASECURRENCYID, DESIGNATIONID, DESIGNATION, DONOR, DONORCHALLENGERECOGNITIONTYPECODE, RECOGNITIONCREDITFKID)
                        select
                            T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
                            T.c.value('(CONSTITUENTID)[1]','uniqueidentifier') AS 'CONSTITUENTID',
                            T.c.value('(AMOUNT)[1]','money') AS 'AMOUNT',
                            T.c.value('(EFFECTIVEDATE)[1]','datetime') AS 'EFFECTIVEDATE',
                            T.c.value('(REVENUERECOGNITIONTYPECODEID)[1]','uniqueidentifier') AS 'REVENUERECOGNITIONTYPECODEID',
                            T.c.value('(BASECURRENCYID)[1]','uniqueidentifier') AS 'BASECURRENCYID',
                            T.c.value('(DESIGNATIONID)[1]','uniqueidentifier') AS 'DESIGNATIONID',
                            T.c.value('(DESIGNATION)[1]','nvarchar(512)') AS 'DESIGNATION',
                            T.c.value('(DONOR)[1]','nvarchar(293)') AS 'DONOR',
                            T.c.value('(DONORCHALLENGERECOGNITIONTYPECODE)[1]','tinyint') AS 'DONORCHALLENGERECOGNITIONTYPECODE',
                            T.c.value('(RECOGNITIONCREDITFKID)[1]','uniqueidentifier') AS 'RECOGNITIONCREDITFKID'
                        from @RECOGNITIONCREDITS.nodes('/RECOGNITIONS/ITEM') T(c);

                end
                else
                begin
                    insert into @REC(ID, CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID)
                        select
                            T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
                            T.c.value('(CONSTITUENTID)[1]','uniqueidentifier') AS 'CONSTITUENTID',
                            T.c.value('(AMOUNT)[1]','money') AS 'AMOUNT',
                            T.c.value('(EFFECTIVEDATE)[1]','datetime') AS 'EFFECTIVEDATE',
                            T.c.value('(REVENUERECOGNITIONTYPECODEID)[1]','uniqueidentifier') AS 'REVENUERECOGNITIONTYPECODEID'
                        from @RECOGNITIONCREDITS.nodes('/RECOGNITIONS/ITEM') T(c);
                end

                declare REC_CURSOR cursor local dynamic for --The cursor must be dynamic because the data in @REC will be updated as constituents are created

                    select CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID from @REC;

                open REC_CURSOR;

                declare @RECOGNITION_CONSTITUENTID uniqueidentifier;
                declare @AMOUNT money;
                declare @EFFECTIVEDATE datetime;
                declare @REVENUERECOGNITIONTYPECODEID uniqueidentifier;

                declare @BATCHCONSTITUENTID uniqueidentifier;

                fetch next from REC_CURSOR into @RECOGNITION_CONSTITUENTID, @AMOUNT, @EFFECTIVEDATE, @REVENUERECOGNITIONTYPECODEID;
                while @@FETCH_STATUS = 0
                begin
                    --Create the constituent if necessary

                    if not exists(select ID from dbo.CONSTITUENT where ID = @RECOGNITION_CONSTITUENTID)
                    begin
                        set @BATCHCONSTITUENTID = @RECOGNITION_CONSTITUENTID;
                        set @RECOGNITION_CONSTITUENTID = newid();
                        exec USP_REVENUEBATCH_CONSTITUENT_ADD @RECOGNITION_CONSTITUENTID OUTPUT, @CHANGEAGENTID, @BATCHCONSTITUENTID;    

                        update @REC 
                            set CONSTITUENTID = @RECOGNITION_CONSTITUENTID
                        where CONSTITUENTID = @BATCHCONSTITUENTID;

                        exec dbo.USP_REVENUEBATCH_CONSTITUENT_DELETE @BATCHREVENUECONSTITUENTID = @BATCHCONSTITUENTID, @CHANGEAGENTID = @CHANGEAGENTID
                    end

                    fetch next from REC_CURSOR into @RECOGNITION_CONSTITUENTID, @AMOUNT, @EFFECTIVEDATE, @REVENUERECOGNITIONTYPECODEID;    
                end

                close REC_CURSOR;
                deallocate REC_CURSOR;

                if @MATCHEDBYDONORCHALLENGE = 1
                begin
                    set @RECOGNITIONCREDITS = 
                    (
                        select
                            ID, CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID, BASECURRENCYID, DESIGNATIONID, DESIGNATION, DONOR, DONORCHALLENGERECOGNITIONTYPECODE, RECOGNITIONCREDITFKID
                        from @REC 
                        order by EFFECTIVEDATE desc
                        for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64
                    );
                end
                else
                begin                
                    set @RECOGNITIONCREDITS = 
                    (
                        select
                            ID, CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID
                        from @REC 
                        order by EFFECTIVEDATE desc
                        for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64
                    );
                end

        if @APPLICATIONTYPE = 0 --Gift

        begin      
            exec dbo.USP_GIFT_UPDATEPAYMENT
                @ID = @ID,
                @REVENUEID = @REVENUEID,
                @AMOUNT = @APPLIEDAMOUNT,
                @DESIGNATIONID = @DESIGNATIONID,
                @OPPORTUNITYID = @OPPORTUNITYID,
                @CAMPAIGNS = @CAMPAIGNS,
                @SOLICITORS = @SOLICITORS,
                @CATEGORYCODEID = @CATEGORYCODEID,
                @RECOGNITIONCREDITS = @RECOGNITIONCREDITS,
                @CHANGEDATE = @CHANGEDATE,
                @CHANGEAGENTID = @CHANGEAGENTID,
                @BASEAMOUNT = @BASEAPPLIEDAMOUNT,
                @ORGANIZATIONAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT,
            @REVENUETYPECODE = @REVENUETYPECODE;

            if @DECLINESGIFTAID = 1
                insert into @SPLITSDECLININGGIFTAIDTBL (REVENUESPLITID) values (@ID)

            if @ISGIFTAIDSPONSORSHIP = 1
                insert into @GIFTAIDSPONSORSHIPSPLITSTBL (REVENUESPLITID) values (@ID)
        end 

        if @APPLICATIONTYPE = 1 --Event Registration

        begin
            exec dbo.USP_EVENT_UPDATEPAYMENT 
                @ID = @ID,
                @AMOUNT = @APPLIEDAMOUNT,
                @CHANGEDATE = @CHANGEDATE,
                @CHANGEAGENTID = @CHANGEAGENTID,
                @PREVIOUSDATE = @PREVIOUSDATE,
                @UPDATERECOGNITIONOPTION = @UPDATERECOGNITIONOPTION,
                @BASEAPPLIEDAMOUNT = @BASEAPPLIEDAMOUNT,
                @ORGANIZATIONAPPLIEDAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT,
                @UPDATESOLICITORSOPTION = @UPDATESOLICITORSOPTION,
                @CATEGORYCODEID = @CATEGORYCODEID;

                --Store registrant ID's for later balance check

                insert into @REGISTRANTIDS (ID) values (@APPLICATIONID)
        end

        if @APPLICATIONTYPE in(
            2, -- Pledge

            7, -- MG Pledge

            6, -- Planned Gift

            8, -- Grant award

            13, -- Donor challenge 

            17, -- Pending gift

            19  -- Membership installment plan

        )
        begin
            declare @PLANNEDGIFTID uniqueidentifier;
            declare @PLANNEDGIFTADDITIONID uniqueidentifier;
            declare @OLDAMOUNT money;
            declare @OLDTRANSACTIONAMOUNT money;
            declare @BASECURRENCYID uniqueidentifier;
            declare @TRANSACTIONCURRENCYID uniqueidentifier;

            if @APPLICATIONTYPE = 6
            begin
                select @PLANNEDGIFTID = PLANNEDGIFTID, @PLANNEDGIFTADDITIONID = PLANNEDGIFTADDITIONID
                from dbo.V_PLANNEDGIFTREVENUE_WITHADDITIONS
                where REVENUEID = @APPLICATIONID

                select
                    @OLDAMOUNT = LI.BASEAMOUNT,
                    @OLDTRANSACTIONAMOUNT = LI.TRANSACTIONAMOUNT,
                    @BASECURRENCYID = CS.BASECURRENCYID,
                    @TRANSACTIONCURRENCYID = FT.TRANSACTIONCURRENCYID
                from dbo.FINANCIALTRANSACTIONLINEITEM LI
                inner join dbo.FINANCIALTRANSACTION FT on FT.ID = LI.FINANCIALTRANSACTIONID
                inner join dbo.PDACCOUNTSYSTEM PD on PD.ID = FT.PDACCOUNTSYSTEMID
                inner join dbo.CURRENCYSET CS on CS.ID = PD.CURRENCYSETID
                where LI.ID = @ID
            end

            exec dbo.USP_PLEDGE_UPDATEPAYMENT
                @ID = @ID,
                @APPLIEDAMOUNT = @APPLIEDAMOUNT,
                @CHANGEDATE = @CHANGEDATE,
                @CHANGEAGENTID = @CHANGEAGENTID,
                @UPDATERECOGNITIONOPTION = @UPDATERECOGNITIONOPTION,
                @BASEAPPLIEDAMOUNT = @BASEAPPLIEDAMOUNT,
                @ORGANIZATIONAPPLIEDAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT,
                @APPLICATIONTYPE = @APPLICATIONTYPE,
                @APPLICATIONID = @APPLICATIONID,
                @UPDATESOLICITORSOPTION = @UPDATESOLICITORSOPTION;

            if @DECLINESGIFTAID = 1
                insert into @SPLITSDECLININGGIFTAIDTBL (REVENUESPLITID) values (@ID)

            if @APPLICATIONTYPE = 6
            begin
                if exists (select 1 from @PLANNEDGIFTUPDATES where PLANNEDGIFTID = @PLANNEDGIFTID and ((@PLANNEDGIFTADDITIONID is null and PLANNEDGIFTADDITIONID is null) or PLANNEDGIFTADDITIONID = @PLANNEDGIFTADDITIONID))
                    update @PLANNEDGIFTUPDATES 
                    set OLDAMOUNT = OLDAMOUNT + @OLDAMOUNT,
                    NEWAMOUNT = NEWAMOUNT + @BASEAPPLIEDAMOUNT,
                    OLDTRANSACTIONAMOUNT = OLDTRANSACTIONAMOUNT + @OLDTRANSACTIONAMOUNT,
                    NEWTRANSACTIONAMOUNT = NEWTRANSACTIONAMOUNT + @APPLIEDAMOUNT
                    where PLANNEDGIFTID = @PLANNEDGIFTID and ((@PLANNEDGIFTADDITIONID is null and PLANNEDGIFTADDITIONID is null) or PLANNEDGIFTADDITIONID = @PLANNEDGIFTADDITIONID)
                else
                    insert into @PLANNEDGIFTUPDATES(PLANNEDGIFTID, PLANNEDGIFTADDITIONID, OLDAMOUNT, NEWAMOUNT, OLDDATE, NEWDATE, OLDTRANSACTIONAMOUNT, NEWTRANSACTIONAMOUNT, BASECURRENCYID, TRANSACTIONCURRENCYID)
                    values(@PLANNEDGIFTID, @PLANNEDGIFTADDITIONID, @OLDAMOUNT, @BASEAPPLIEDAMOUNT, @PREVIOUSDATE, @DATE, @OLDTRANSACTIONAMOUNT, @APPLIEDAMOUNT, @BASECURRENCYID, @TRANSACTIONCURRENCYID)
            end
        end 

        if @APPLICATIONTYPE = 3 --Recurring Gift

        begin
            exec dbo.USP_RECURRINGGIFT_UPDATEPAYMENT 
                @ID = @ID,
                @APPLIEDAMOUNT = @APPLIEDAMOUNT,
                @CHANGEDATE = @CHANGEDATE,
                @CHANGEAGENTID = @CHANGEAGENTID,
                @UPDATERECOGNITIONOPTION = @UPDATERECOGNITIONOPTION,
                @BASEAPPLIEDAMOUNT = @BASEAPPLIEDAMOUNT,
                @ORGANIZATIONAPPLIEDAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT,
                @UPDATESOLICITORSOPTION = @UPDATESOLICITORSOPTION;

            if @DECLINESGIFTAID = 1
                insert into @SPLITSDECLININGGIFTAIDTBL (REVENUESPLITID) values (@ID)
        end 

        if @APPLICATIONTYPE = 4 --Other

        begin
            exec dbo.USP_OTHER_UPDATEPAYMENT
                @ID = @ID,
                @REVENUEID = @REVENUEID,
                @AMOUNT = @APPLIEDAMOUNT,
                @DESIGNATIONID = @DESIGNATIONID,
                @OTHERTYPECODEID = @OTHERTYPECODEID,
                @CAMPAIGNS = @CAMPAIGNS,
                @SOLICITORS = @SOLICITORS,
                @CATEGORYCODEID = @CATEGORYCODEID,
                @RECOGNITIONCREDITS = @RECOGNITIONCREDITS,
                @CHANGEDATE = @CHANGEDATE,
                @CHANGEAGENTID = @CHANGEAGENTID,
                @BASEAPPLIEDAMOUNT = @BASEAPPLIEDAMOUNT,
                @ORGANIZATIONAPPLIEDAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT;
        end 

        if @APPLICATIONTYPE = 100 -- unnappliedmatching gift claim

        begin      
            exec dbo.USP_UNAPPLIEDMG_UPDATEPAYMENT
                @ID = @ID,
                @REVENUEID = @REVENUEID,
                @AMOUNT = @APPLIEDAMOUNT,
                @DESIGNATIONID = @DESIGNATIONID,
                @CAMPAIGNS = @CAMPAIGNS,
                @SOLICITORS = @SOLICITORS,
                @CATEGORYCODEID = @CATEGORYCODEID,
                @RECOGNITIONCREDITS = @RECOGNITIONCREDITS,
                @CHANGEDATE = @CHANGEDATE,
                @CHANGEAGENTID = @CHANGEAGENTID,
                @BASEAMOUNT = @BASEAPPLIEDAMOUNT,
                @ORGANIZATIONAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT;
        end 

        if @APPLICATIONTYPE = 11 -- miscellaneous payments

        begin
            update dbo.FINANCIALTRANSACTIONLINEITEM set
                TRANSACTIONAMOUNT = @APPLIEDAMOUNT
                ,BASEAMOUNT = @BASEAPPLIEDAMOUNT
                ,ORGAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT
                ,CHANGEDBYID = @CHANGEAGENTID
                ,DATECHANGED = @CHANGEDATE
            where ID = @ID
                and (
                    TRANSACTIONAMOUNT != @APPLIEDAMOUNT or
                    BASEAMOUNT != @BASEAPPLIEDAMOUNT or
                    ORGAMOUNT != @ORGANIZATIONAPPLIEDAMOUNT);
        end

        if @APPLICATIONTYPE = 5 -- Membership

        begin
            exec dbo.USP_MEMBERSHIP_UPDATEPAYMENT
                @ID = @ID,
                @AMOUNT = @APPLIEDAMOUNT,
                @CHANGEDATE = @CHANGEDATE,
                @CHANGEAGENTID = @CHANGEAGENTID,
                @UPDATERECOGNITIONOPTION = @UPDATERECOGNITIONOPTION,
                @BASEAPPLIEDAMOUNT = @BASEAPPLIEDAMOUNT,
                @ORGANIZATIONAPPLIEDAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT,
                @UPDATESOLICITORSOPTION = @UPDATESOLICITORSOPTION;
        end

        if @APPLICATIONTYPE = 18 -- Membership add-on

        begin
                exec dbo.USP_MEMBERSHIPADDON_UPDATEPAYMENT
                        @ID = @ID,
                        @AMOUNT = @APPLIEDAMOUNT,
                        @CHANGEDATE = @CHANGEDATE,
                        @CHANGEAGENTID = @CHANGEAGENTID,
                        @UPDATERECOGNITIONOPTION = @UPDATERECOGNITIONOPTION,
                        @BASEAPPLIEDAMOUNT = @BASEAPPLIEDAMOUNT,
                        @ORGANIZATIONAPPLIEDAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT,
                        @UPDATESOLICITORSOPTION = @UPDATESOLICITORSOPTION;
        end

        if @APPLICATIONTYPE = 12 -- Auction Purchase

        begin
            declare @SPLITREVENUEID uniqueidentifier
            select @SPLITREVENUEID = FINANCIALTRANSACTIONID from dbo.FINANCIALTRANSACTIONLINEITEM where ID = @ID
            declare @OLDSPLITS xml = dbo.UFN_REVENUE_GETSPLITS_2_TOITEMLISTXML(@SPLITREVENUEID)
            declare @OLDRECOGNITIONS xml = dbo.UFN_REVENUE_GETRECOGNITIONS_FORREVENUE_TOITEMLISTXML(@SPLITREVENUEID)

            update dbo.FINANCIALTRANSACTIONLINEITEM set
                TRANSACTIONAMOUNT = @APPLIEDAMOUNT
                ,BASEAMOUNT = @BASEAPPLIEDAMOUNT
                ,ORGAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT
                ,CHANGEDBYID = @CHANGEAGENTID
                ,DATECHANGED = @CHANGEDATE
            where ID = @ID
                and (
                    TRANSACTIONAMOUNT != @APPLIEDAMOUNT or
                    BASEAMOUNT != @BASEAPPLIEDAMOUNT or
                    ORGAMOUNT != @ORGANIZATIONAPPLIEDAMOUNT);

            exec dbo.USP_REVENUE_UPDATERECOGNITION @SPLITREVENUEID, @OLDSPLITS, @UPDATERECOGNITIONOPTION, @CHANGEAGENTID, @CHANGEDATE, @OLDRECOGNITIONS;

            exec dbo.USP_REVENUESPLIT_UPDATESOLICITORS @REVENUESPLITID = @ID, @CHANGEAGENTID = @CHANGEAGENTID, @CHANGEDATE = @CHANGEDATE, @UPDATEOPTION = @UPDATESOLICITORSOPTION
        end

        if @APPLICATIONTYPE = 15
        begin
            exec dbo.USP_SPONSOR_UPDATEPAYMENT
                @ID = @ID,
                @AMOUNT = @APPLIEDAMOUNT,
                @CHANGEDATE = @CHANGEDATE,
                @CHANGEAGENTID = @CHANGEAGENTID,
                @UPDATERECOGNITIONOPTION = @UPDATERECOGNITIONOPTION,
                @BASEAPPLIEDAMOUNT = @BASEAPPLIEDAMOUNT,
                @ORGANIZATIONAPPLIEDAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT,
                @UPDATESOLICITORSOPTION = @UPDATESOLICITORSOPTION;
        end

        --Check if given anonymously has changed.

        declare @GIVENANONYMOUSLY bit;
        select @GIVENANONYMOUSLY = GIVENANONYMOUSLY
        from dbo.REVENUE_EXT
        where ID = @REVENUEID;

        --Select the value for default anonymous recognition setting

        declare @DEFAULTANONYMOUSRECOGNITION bit = 0;
        select @DEFAULTANONYMOUSRECOGNITION = DEFAULTANONYMOUSRECOGNITION
        from dbo.RECOGNITIONDEFAULT

        --Added APPLICATIONTYPE 8   - planned gift.

        --                      13  - Donor challenge claim.

        if @APPLICATIONTYPE in (1,2,3,6,8,13,19
        begin
            if @GIVENANONYMOUSLY = 1 and @ORIGINALGIVENANONYMOUSLY = 0 and @DEFAULTANONYMOUSRECOGNITION = 0
            begin
                --gone from named to anonymous, so delete recognition

                delete dbo.REVENUERECOGNITION where REVENUESPLITID = @ID;
            end
            else if (@GIVENANONYMOUSLY = 0 and @ORIGINALGIVENANONYMOUSLY = 1) or (@GIVENANONYMOUSLY = 1 and @ORIGINALGIVENANONYMOUSLY = 0 and @DEFAULTANONYMOUSRECOGNITION = 1)
            begin
                --Do not add any recognition credits if user added/deleted/modified when the transaction was anonymous

                if not exists (select 1 from dbo.REVENUERECOGNITION where REVENUESPLITID = @ID)
                begin
                    --gone from anonymous to named, so create default recognition if user agrees

                    declare @SOURCERECURRINGGIFTID uniqueidentifier = null;
                    select @SOURCERECURRINGGIFTID = SOURCEREVENUEID
                    from dbo.RECURRINGGIFTACTIVITY
                    where PAYMENTREVENUEID = @ID and @APPLICATIONCODE = 3;

                    exec dbo.USP_REVENUEDETAIL_CREATERECOGNITIONS @ID, @CHANGEAGENTID, @CHANGEDATE, @SOURCERECURRINGGIFTID;
                end
            end
        end


        declare @VID char(36);
        set @VID = lower(cast(@ID as char(36)));

        --TommyVe 2009-11-19 Lower-case the value from @REVENUESTREAMS too, it doesn't always come in as lower case.

        /* remove updated from XML so only new IDs are left */
        set @REVENUESTREAMS.modify('
            delete /REVENUESTREAMS/ITEM[lower-case(ID[1]) = sql:variable("@VID")]
        ')

        fetch next from UPDATECURSOR into @ID, @APPLICATIONID, @APPLIEDAMOUNT, @APPLICATIONTYPE, @GIFTFIELDS, @OTHERFIELDS, @DECLINESGIFTAID, @ISGIFTAIDSPONSORSHIP, @ORIGINALSPLITAMOUNT, @UPDATERECOGNITIONOPTION, @BASEAPPLIEDAMOUNT, @ORGANIZATIONAPPLIEDAMOUNT, @UPDATESOLICITORSOPTION, @CATEGORYCODEID;
    end

--Get PDACCOUNTSYSTEMID from parent revenue. This is needed for auction splits because they have a restriction of which account systems

    --they can be applied to.

    declare @PDACCOUNTSYSTEMID uniqueidentifier;
    select  @PDACCOUNTSYSTEMID = PDACCOUNTSYSTEMID from dbo.FINANCIALTRANSACTION where ID = @REVENUEID;

    --If event registrations exist, check that they don't go over the total balance of the event registration.

    --We see a performance increase if we only do this operation once per unique application and after all the potential currency conversions have already occurred.

    if exists (select 1 from @REGISTRANTIDS)
    begin
        declare EVENTREGISTRANT cursor local fast_forward for select distinct ID from @REGISTRANTIDS
        declare @CURRENTREGISTRANTID uniqueidentifier;
    --Balance check event registrations

        open EVENTREGISTRANT;
        fetch next from EVENTREGISTRANT into @CURRENTREGISTRANTID;

        while @@FETCH_STATUS = 0
        begin
            if dbo.UFN_EVENTREGISTRANT_GETBALANCE(@CURRENTREGISTRANTID) < 0
            begin
                raiserror('BBERR_OVERPAIDCOMMITMENT', 13, 1);
            end
        fetch next from EVENTREGISTRANT into @CURRENTREGISTRANTID;
        end
    end

    -- apply newly added streams

    declare @NEWSPLITSDECLININGGIFTAID xml;
    declare @NEWGIFTAIDSPONSORSHIPSPLITS xml;
    exec dbo.USP_REVENUE_APPLYTOREVENUESTREAMS @REVENUEID, @CONSTITUENTID, @DATE, @REVENUESTREAMS, @CHANGEAGENTID, @CHANGEDATE, @NEWSPLITSDECLININGGIFTAID output, null, @NEWGIFTAIDSPONSORSHIPSPLITS output,@PDACCOUNTSYSTEMID;

    if @NEWSPLITSDECLININGGIFTAID is not null
        insert into @SPLITSDECLININGGIFTAIDTBL (REVENUESPLITID)
        select T.c.value('(REVENUESPLITID)[1]','uniqueidentifier')
        from @NEWSPLITSDECLININGGIFTAID.nodes('/SPLITSDECLININGGIFTAID/ITEM') T(c);

    if @NEWGIFTAIDSPONSORSHIPSPLITS is not null
        insert into @GIFTAIDSPONSORSHIPSPLITSTBL (REVENUESPLITID)
        select T.c.value('(REVENUESPLITID)[1]','uniqueidentifier')
        from @NEWGIFTAIDSPONSORSHIPSPLITS.nodes('/GIFTAIDSPONSORSHIPSPLITS/ITEM') T(c); 

    update dbo.FINANCIALTRANSACTIONLINEITEM
    set TYPECODE = 99,        --orphaned

    CHANGEDBYID = @CHANGEAGENTID,
    DATECHANGED = @CHANGEDATE
    where FINANCIALTRANSACTIONID = @REVENUEID
    and TYPECODE = 0
    and DELETEDON is not null
    and POSTSTATUSCODE = 1
    and REVERSEDLINEITEMID is null
    and SOURCELINEITEMID is null

    /* reset CONTEXT_INFO to previous value */
    if not @CONTEXTCACHE is null
        set CONTEXT_INFO @CONTEXTCACHE;

    set @SPLITSDECLININGGIFTAID = (    select
                                        REVENUESPLITID
                                    from @SPLITSDECLININGGIFTAIDTBL 
                                    for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64);

    set @GIFTAIDSPONSORSHIPSPLITS = (    select
                                        REVENUESPLITID
                                    from @GIFTAIDSPONSORSHIPSPLITSTBL 
                                    for xml raw('ITEM'),type,elements,root('GIFTAIDSPONSORSHIPSPLITS'),BINARY BASE64);

    begin try
        --cache current context information

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

    set CONTEXT_INFO @CHANGEAGENTID;

    delete REVENUESPLITBUSINESSUNIT 
    from dbo.REVENUESPLITBUSINESSUNIT
    inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLITBUSINESSUNIT.REVENUESPLITID
    inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
    where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @REVENUEID and REVENUESPLIT_EXT.OVERRIDEBUSINESSUNITS=0;

    --reset CONTEXT_INFO to previous value

    if not @CONTEXTCACHE is null
        set CONTEXT_INFO @CONTEXTCACHE;
    end try
    begin catch
        if not @CONTEXTCACHE is null
        set CONTEXT_INFO @CONTEXTCACHE;

        exec dbo.USP_RAISE_ERROR;
        return 1;
    end catch

    exec dbo.USP_REVENUESPLIT_APPLYBUSINESSUNITS @REVENUEID, @CHANGEAGENTID, @CHANGEDATE;

    if @PRODUCTISUK = 1
    begin

    set @SPLITSDECLININGGIFTAID = (    select
            REVENUESPLITID
        from @SPLITSDECLININGGIFTAIDTBL 
            for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64);

    set @GIFTAIDSPONSORSHIPSPLITS = (    select
            REVENUESPLITID
        from @GIFTAIDSPONSORSHIPSPLITSTBL 
            for xml raw('ITEM'),type,elements,root('GIFTAIDSPONSORSHIPSPLITS'),BINARY BASE64);

    exec  USP_MANAGEGIFTAIDFORSPLITS @REVENUEID=@REVENUEID, @ORGANIZATIONCURRENCYID=@ORGANIZATIONCURRENCYID, @CHANGEAGENTID=@CHANGEAGENTID, @CURRENTDATE=@CURRENTDATE, @DATE=@DATE, @SPLITSDECLININGGIFTAIDTBLXML=@SPLITSDECLININGGIFTAID, @GIFTAIDSPONSORSHIPSPLITSTBLXML=@GIFTAIDSPONSORSHIPSPLITS, @DELETEDANDCHANGEDSPLITSINFOXML=@DELETEDANDCHANGEDSPLITSINFO

    end

    while exists (select 1 from @PLANNEDGIFTUPDATES)
    begin
        declare @PGID uniqueidentifier;
        declare @PGAID uniqueidentifier;
        declare @ORIGINALAMOUNT money;
        declare @NEWAMOUNT money;
        declare @OLDDATE datetime;
        declare @NEWDATE datetime;
        declare @OLDTRANAMOUNT money;
        declare @NEWTRANAMOUNT money;
        declare @DONOTRECEIPT bit;
        declare @RECEIPTAMOUNT money;
        declare @PGBASECURRENCYID uniqueidentifier;
        declare @PGTRANSACTIONCURRENCYID uniqueidentifier;

        select top 1 @PGID = PLANNEDGIFTID,
            @PGAID = PLANNEDGIFTADDITIONID,
            @ORIGINALAMOUNT = OLDAMOUNT,
            @NEWAMOUNT = NEWAMOUNT,
            @OLDDATE = OLDDATE,
            @NEWDATE = NEWDATE,
            @OLDTRANAMOUNT = OLDTRANSACTIONAMOUNT,
            @NEWTRANAMOUNT = NEWTRANSACTIONAMOUNT,
            @PGBASECURRENCYID = BASECURRENCYID,
            @PGTRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID
        from @PLANNEDGIFTUPDATES;

        select
            @DONOTRECEIPT = REVENUE_EXT.DONOTRECEIPT,
            @RECEIPTAMOUNT = REVENUE_EXT.RECEIPTAMOUNT
        from
            dbo.FINANCIALTRANSACTION
        inner join
            dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
        where
            FINANCIALTRANSACTION.ID = @REVENUEID;

        exec dbo.USP_PLANNEDGIFTRECONCILE_SAVE @PGID, @REVENUEID, @PGAID, @ORIGINALAMOUNT, @NEWAMOUNT
                                                                                     @OLDDATE, @NEWDATE, 0, @CHANGEAGENTID, @CHANGEDATE
                                                                                     @OLDTRANAMOUNT, @NEWTRANAMOUNT,
                                                                                     @PREVIOUSDONOTRECEIPT, @DONOTRECEIPT,
                                                                                     @PREVIOUSRECEIPTAMOUNT, @RECEIPTAMOUNT,
                                                                                     @PGBASECURRENCYID, @PGTRANSACTIONCURRENCYID;

        delete top (1) from @PLANNEDGIFTUPDATES;
    end