USP_DONORCHALLENGE_ENCUMBERPROCESS

This stored procedure is used by the donor challenge encumber process to encumber funds

Parameters

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

Definition

Copy


CREATE procedure dbo.USP_DONORCHALLENGE_ENCUMBERPROCESS(@DCID uniqueidentifier, @CHANGEAGENTID uniqueidentifier)
as
begin
    declare @MINGIFTAMOUNT money;
    declare @MATCHINGFACTOR money;
    declare @STARTDATE datetime;
    declare @ENDDATE datetime;
    declare @PLEDGEEND datetime;
    declare @MATCHTYPECODE tinyint;
    declare @MAXMATCHPERGIFT money;
    declare @LASTRUN datetime;
    declare @REVENUERECOGNITIONTYPECODEID uniqueidentifier;
    declare @TOTALFUNDS money;
    declare @HANDLEPLEDGES bit = 1;
  declare @BASECURRENCYID uniqueidentifier;
  declare @BASECURRENCYDECIMALDIGITS tinyint;
  declare @BASECURRENCYROUNDINGTYPECODE tinyint;

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

    select  @MINGIFTAMOUNT = DONORCHALLENGE.MINGIFTAMOUNT,
            @MATCHINGFACTOR = case when DONORCHALLENGE.TYPECODE = 1 then 1 else DONORCHALLENGE.MATCHINGFACTOR end,
            @STARTDATE = DONORCHALLENGE.STARTDATE,
            @ENDDATE = DONORCHALLENGE.ENDDATE,
            @PLEDGEEND = DATEADD(month, DONORCHALLENGE.PAYPLEDGESWITHIN * 
                                            case when DONORCHALLENGE.PAYPLEDGESWITHINUNITCODE = 0 then 12 else 1 end
                                            DONORCHALLENGE.ENDDATE),
            @MATCHTYPECODE = DONORCHALLENGE.MATCHTYPECODE,
            @MAXMATCHPERGIFT = DONORCHALLENGE.MAXMATCHPERGIFT,
            @REVENUERECOGNITIONTYPECODEID = DONORCHALLENGE.REVENUERECOGNITIONTYPECODEID,
            @TOTALFUNDS = case when DONORCHALLENGE.TYPECODE = 1 then DONORCHALLENGE.MATCHTHRESHOLD else DONORCHALLENGE.TOTALFUNDS end,
            @LASTRUN = DONORCHALLENGE.PROCESSLASTRUN,
      @BASECURRENCYID = DONORCHALLENGE.BASECURRENCYID
    from DONORCHALLENGE
    where ID = @DCID;

  select
    @BASECURRENCYDECIMALDIGITS = DECIMALDIGITS,
    @BASECURRENCYROUNDINGTYPECODE = ROUNDINGTYPECODE
  from
    dbo.CURRENCY
  where
    ID = @BASECURRENCYID;

    if exists(select top 1 ID from dbo.DONORCHALLENGEEXCLUDEDAPPLICATIONTYPE where DONORCHALLENGEID = @DCID and APPLICATIONCODE = 2)
      set @HANDLEPLEDGES = 0

  declare @DATEADDED datetime;
    declare @REVENUESPLITID uniqueidentifier;
    declare @DESIGNATIONID uniqueidentifier;
    declare @ENCUMBERED money;
    declare @AMOUNT money;
    declare @NOW datetime = getdate();

    if @LASTRUN is not null 
    begin

            --Delete revenue that no longer qualifies

            delete DONORCHALLENGEENCUMBERED
            from dbo.DONORCHALLENGEENCUMBERED 
            inner join dbo.REVENUESPLIT    on REVENUESPLIT.ID = DONORCHALLENGEENCUMBERED.REVENUESPLITID and DONORCHALLENGEENCUMBERED.DONORCHALLENGEID = @DCID
            inner join dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
            left join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = REVENUESPLIT.ID
            left join dbo.DONORCHALLENGEDESIGNATIONMAP on DONORCHALLENGEDESIGNATIONMAP.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID and DONORCHALLENGEDESIGNATIONMAP.DONORCHALLENGEID=@DCID
            left join dbo.DONORCHALLENGEMEMBERSHIPLEVELMAP on DONORCHALLENGEMEMBERSHIPLEVELMAP.MEMBERSHIPLEVELID = MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID and DONORCHALLENGEMEMBERSHIPLEVELMAP.DONORCHALLENGEID=@DCID
            where DONORCHALLENGEENCUMBERED.METHODTYPECODE = 0 and DONORCHALLENGEENCUMBERED.STATUSTYPECODE = 0 
                and 
                (
                    (DONORCHALLENGEDESIGNATIONMAP.ID is null and DONORCHALLENGEMEMBERSHIPLEVELMAP.ID is null)
                    or
                    not (
                        REVENUE.DATE between @STARTDATE and @ENDDATE
                        and dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(REVENUE.ID, @BASECURRENCYID) >= @MINGIFTAMOUNT
                        and not exists(select top 1 APPTYPESUB.ID from dbo.DONORCHALLENGEEXCLUDEDAPPLICATIONTYPE APPTYPESUB
                                            where APPTYPESUB.DONORCHALLENGEID = @DCID and REVENUESPLIT.APPLICATIONCODE = APPTYPESUB.APPLICATIONCODE)
                    )
                    or (@HANDLEPLEDGES = 0 and REVENUE.TRANSACTIONTYPECODE = 1)
                )

            --Update DESIGNATION revenue that has been changed

            --Payments

            update DONORCHALLENGEENCUMBERED
            set AMOUNT = case when @MAXMATCHPERGIFT > 0 and SUB.AMOUNT > @MAXMATCHPERGIFT then @MAXMATCHPERGIFT else SUB.AMOUNT end,
                ORGANIZATIONAMOUNT = dbo.UFN_CURRENCY_CONVERT((case when @MAXMATCHPERGIFT > 0 and SUB.AMOUNT > @MAXMATCHPERGIFT then @MAXMATCHPERGIFT else SUB.AMOUNT end), DONORCHALLENGEENCUMBERED.ORGANIZATIONEXCHANGERATEID),
                DESIGNATIONID = SUB.MATCHINGDESIGNATIONID
            from dbo.DONORCHALLENGEENCUMBERED
            inner join (select DONORCHALLENGEENCUMBERED.ID,
                            dbo.UFN_CURRENCY_ROUND(
                                case when @MATCHTYPECODE = 1 then 
                                    case when REVENUE.TRANSACTIONAMOUNT = 0 then 0 
                                        else dbo.UFN_CURRENCY_ROUND(REVENUE.RECEIPTAMOUNT/cast(REVENUE.TRANSACTIONAMOUNT As decimal(20,10))
                                            * case
                                                when @BASECURRENCYID = REVENUESPLIT.TRANSACTIONCURRENCYID
                                                    then REVENUESPLIT.TRANSACTIONAMOUNT
                                                else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID, @BASECURRENCYID)
                                        end, @BASECURRENCYDECIMALDIGITS, @BASECURRENCYROUNDINGTYPECODE)
                                    end
                                else 
                                    case
                                        when @BASECURRENCYID = REVENUESPLIT.TRANSACTIONCURRENCYID
                                            then REVENUESPLIT.TRANSACTIONAMOUNT
                                        else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID, @BASECURRENCYID)
                                    end
                                end 
                            * @MATCHINGFACTOR, @BASECURRENCYDECIMALDIGITS, @BASECURRENCYROUNDINGTYPECODE) AMOUNT,
                            DONORCHALLENGEDESIGNATIONMAP.MATCHINGDESIGNATIONID
                        from dbo.DONORCHALLENGEENCUMBERED 
                        inner join dbo.REVENUESPLIT    on REVENUESPLIT.ID = DONORCHALLENGEENCUMBERED.REVENUESPLITID and DONORCHALLENGEENCUMBERED.DONORCHALLENGEID = @DCID
                        inner join dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
                        inner join dbo.DONORCHALLENGEDESIGNATIONMAP on DONORCHALLENGEDESIGNATIONMAP.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
                        where REVENUE.TRANSACTIONTYPECODE = 0
                            and DONORCHALLENGEDESIGNATIONMAP.DONORCHALLENGEID=@DCID
                            and DONORCHALLENGEENCUMBERED.METHODTYPECODE = 0 and DONORCHALLENGEENCUMBERED.STATUSTYPECODE = 0 
                            and REVENUESPLIT.DATECHANGED > @LASTRUN) SUB on DONORCHALLENGEENCUMBERED.ID = SUB.ID;

            --Pledges

            update DONORCHALLENGEENCUMBERED
            set AMOUNT = case when @MAXMATCHPERGIFT > 0 and SUB.AMOUNT > @MAXMATCHPERGIFT then @MAXMATCHPERGIFT else SUB.AMOUNT end,
              ORGANIZATIONAMOUNT = dbo.UFN_CURRENCY_CONVERT((case when @MAXMATCHPERGIFT > 0 and SUB.AMOUNT > @MAXMATCHPERGIFT then @MAXMATCHPERGIFT else SUB.AMOUNT end), DONORCHALLENGEENCUMBERED.ORGANIZATIONEXCHANGERATEID),
              DESIGNATIONID = SUB.MATCHINGDESIGNATIONID
            from dbo.DONORCHALLENGEENCUMBERED
            inner join (select DONORCHALLENGEENCUMBERED.ID,
                              round((select sum(dbo.UFN_INSTALLMENTSPLIT_GETAMOUNTINCURRENCY(ISP.ID, @BASECURRENCYID)) 
                                        from dbo.INSTALLMENTSPLIT ISP
                                        inner join dbo.INSTALLMENT I on ISP.INSTALLMENTID = I.ID
                                        where ISP.PLEDGEID = REVENUE.ID and ISP.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
                                        and I.DATE <= @PLEDGEEND)
                                , 2) AMOUNT,
                            DONORCHALLENGEDESIGNATIONMAP.MATCHINGDESIGNATIONID
                        from dbo.DONORCHALLENGEENCUMBERED 
                        inner join dbo.REVENUESPLIT    on REVENUESPLIT.ID = DONORCHALLENGEENCUMBERED.REVENUESPLITID and DONORCHALLENGEENCUMBERED.DONORCHALLENGEID = @DCID
                        inner join dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
                        inner join dbo.DONORCHALLENGEDESIGNATIONMAP on DONORCHALLENGEDESIGNATIONMAP.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
                        where REVENUE.TRANSACTIONTYPECODE = 1
                              and DONORCHALLENGEDESIGNATIONMAP.DONORCHALLENGEID=@DCID
                            and DONORCHALLENGEENCUMBERED.METHODTYPECODE = 0 and DONORCHALLENGEENCUMBERED.STATUSTYPECODE = 0 
                            and REVENUESPLIT.DATECHANGED > @LASTRUN) SUB on DONORCHALLENGEENCUMBERED.ID = SUB.ID;

            --Update MEMBERSHIP revenue that has been changed

            update DONORCHALLENGEENCUMBERED
            set AMOUNT = case when @MAXMATCHPERGIFT > 0 and SUB.AMOUNT > @MAXMATCHPERGIFT then @MAXMATCHPERGIFT else SUB.AMOUNT end,
              ORGANIZATIONAMOUNT = dbo.UFN_CURRENCY_CONVERT((case when @MAXMATCHPERGIFT > 0 and SUB.AMOUNT > @MAXMATCHPERGIFT then @MAXMATCHPERGIFT else SUB.AMOUNT end), DONORCHALLENGEENCUMBERED.ORGANIZATIONEXCHANGERATEID),
              DESIGNATIONID = SUB.MATCHINGDESIGNATIONID
            from dbo.DONORCHALLENGEENCUMBERED
            inner join (select DONORCHALLENGEENCUMBERED.ID,
                              dbo.UFN_CURRENCY_ROUND(case when @MATCHTYPECODE = 1 then 
                                    case when REVENUE.TRANSACTIONAMOUNT = 0 then 0 
                                        else dbo.UFN_CURRENCY_ROUND(REVENUE.RECEIPTAMOUNT/cast(REVENUE.TRANSACTIONAMOUNT As decimal(20,10))
                                            * case
                                                when @BASECURRENCYID = REVENUESPLIT.TRANSACTIONCURRENCYID
                                                    then REVENUESPLIT.TRANSACTIONAMOUNT
                                                else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID, @BASECURRENCYID)
                                        end, @BASECURRENCYDECIMALDIGITS, @BASECURRENCYROUNDINGTYPECODE)
                                    end
                                else 
                                    case
                                        when @BASECURRENCYID = REVENUESPLIT.TRANSACTIONCURRENCYID
                                            then REVENUESPLIT.TRANSACTIONAMOUNT
                                        else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID, @BASECURRENCYID)
                                    end
                                end 
                            * @MATCHINGFACTOR, @BASECURRENCYDECIMALDIGITS, @BASECURRENCYROUNDINGTYPECODE) AMOUNT,
                            DONORCHALLENGEMEMBERSHIPLEVELMAP.MATCHINGDESIGNATIONID
                        from dbo.DONORCHALLENGEENCUMBERED 
                        inner join dbo.REVENUESPLIT    on REVENUESPLIT.ID = DONORCHALLENGEENCUMBERED.REVENUESPLITID and DONORCHALLENGEENCUMBERED.DONORCHALLENGEID = @DCID
                        inner join dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
                        inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = REVENUESPLIT.ID
                        inner join dbo.DONORCHALLENGEMEMBERSHIPLEVELMAP on DONORCHALLENGEMEMBERSHIPLEVELMAP.MEMBERSHIPLEVELID = MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID
                        where DONORCHALLENGEMEMBERSHIPLEVELMAP.DONORCHALLENGEID=@DCID and
                            DONORCHALLENGEENCUMBERED.METHODTYPECODE = 0 and DONORCHALLENGEENCUMBERED.STATUSTYPECODE = 0 
                            and REVENUESPLIT.DATECHANGED > @LASTRUN) SUB on DONORCHALLENGEENCUMBERED.ID = SUB.ID;


        /* todo fix any overruns */
    end

    select @ENCUMBERED = coalesce(dbo.UFN_DONORCHALLENGE_ENCUMBEREDAMOUNT(@DCID), 0) + coalesce(dbo.UFN_DONORCHALLENGE_MATCHEDAMOUNT(@DCID), 0);

    if object_id('tempdb..#PROSPECTIVEREVENUE') is not null
              drop table #PROSPECTIVEREVENUE

    create table #PROSPECTIVEREVENUE
    (REVENUESPLITID uniqueidentifier,
     AMOUNT money,
     DESIGNATIONID uniqueidentifier,
     DATE datetime,
     DATEADDED datetime
    )

    --Add regular payments

    insert into #PROSPECTIVEREVENUE
        (REVENUESPLITID, AMOUNT, DESIGNATIONID, DATE, DATEADDED)
    select REVENUESPLIT.ID, 
                case when @MATCHTYPECODE = 1 then 
                        case when REVENUE.AMOUNT = 0 then 0 
                            else dbo.UFN_CURRENCY_ROUND(REVENUE.RECEIPTAMOUNT/cast(REVENUE.TRANSACTIONAMOUNT As decimal(20,10))
                                * case
                                    when @BASECURRENCYID = REVENUESPLIT.TRANSACTIONCURRENCYID
                                        then REVENUESPLIT.TRANSACTIONAMOUNT
                                    else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID, @BASECURRENCYID)
                                end, @BASECURRENCYDECIMALDIGITS, @BASECURRENCYROUNDINGTYPECODE)
                        end
                    else 
                        case
                            when @BASECURRENCYID = REVENUESPLIT.TRANSACTIONCURRENCYID
                                then REVENUESPLIT.TRANSACTIONAMOUNT
                            else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID, @BASECURRENCYID)
                        end 
                end
                DONORCHALLENGEDESIGNATIONMAP.MATCHINGDESIGNATIONID,
                REVENUE.DATE,
                REVENUE.DATEADDED
        from dbo.REVENUESPLIT
        inner join dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
        inner join dbo.DONORCHALLENGEDESIGNATIONMAP on DONORCHALLENGEDESIGNATIONMAP.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
        left join dbo.DONORCHALLENGEENCUMBERED on REVENUESPLIT.ID = DONORCHALLENGEENCUMBERED.REVENUESPLITID and DONORCHALLENGEENCUMBERED.DONORCHALLENGEID = @DCID
        where REVENUE.TRANSACTIONTYPECODE = 0
            and DONORCHALLENGEDESIGNATIONMAP.DONORCHALLENGEID=@DCID
            and DONORCHALLENGEENCUMBERED.ID is null
            and REVENUESPLIT.APPLICATIONCODE in (0, 3, 4, 6, 7, 8, 10)
            and REVENUE.DATE between @STARTDATE and @ENDDATE
            and REVENUE.AMOUNT >= @MINGIFTAMOUNT
            and not exists(select top 1 APPTYPESUB.ID from dbo.DONORCHALLENGEEXCLUDEDAPPLICATIONTYPE APPTYPESUB
                                where APPTYPESUB.DONORCHALLENGEID = @DCID and REVENUESPLIT.APPLICATIONCODE = APPTYPESUB.APPLICATIONCODE)

    --Add pledges

    if @HANDLEPLEDGES = 1
      insert into #PROSPECTIVEREVENUE
          (REVENUESPLITID, AMOUNT, DESIGNATIONID, DATE, DATEADDED)
      select
            REVENUESPLIT.ID,
            (
                coalesce((select sum(
                    case
                        when @BASECURRENCYID = ISP.TRANSACTIONCURRENCYID
                            then ISP.TRANSACTIONAMOUNT
                        else dbo.UFN_INSTALLMENTSPLIT_GETAMOUNTINCURRENCY(ISP.ID, @BASECURRENCYID)
                    end 
                ) 
                from dbo.INSTALLMENTSPLIT ISP
                inner join dbo.INSTALLMENT I on ISP.INSTALLMENTID = I.ID
                    where ISP.PLEDGEID = REVENUE.ID and ISP.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
                    and I.DATE <= @PLEDGEEND), 0
                -
                coalesce((select sum(
                    case
                        when @BASECURRENCYID = ISW.TRANSACTIONCURRENCYID
                            then ISW.TRANSACTIONAMOUNT
                        else dbo.UFN_INSTALLMENTSPLITWRITEOFF_GETAMOUNTINCURRENCY(ISW.ID, @BASECURRENCYID)
                    end 
                ) 
                from INSTALLMENTSPLITWRITEOFF ISW
                inner join dbo.INSTALLMENTSPLIT ISP on ISW.INSTALLMENTSPLITID = ISP.ID
                inner join dbo.INSTALLMENT I on ISP.INSTALLMENTID = I.ID
                    where ISP.PLEDGEID = REVENUE.ID and ISP.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
                    and I.DATE <= @PLEDGEEND), 0
            ),
            DONORCHALLENGEDESIGNATIONMAP.MATCHINGDESIGNATIONID,
            REVENUE.DATE,
            REVENUE.DATEADDED
          from dbo.REVENUESPLIT
          inner join dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
          inner join dbo.DONORCHALLENGEDESIGNATIONMAP on DONORCHALLENGEDESIGNATIONMAP.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
          left join dbo.DONORCHALLENGEENCUMBERED on REVENUESPLIT.ID = DONORCHALLENGEENCUMBERED.REVENUESPLITID and DONORCHALLENGEENCUMBERED.DONORCHALLENGEID = @DCID
          where REVENUE.TRANSACTIONTYPECODE = 1
              and DONORCHALLENGEDESIGNATIONMAP.DONORCHALLENGEID=@DCID
              and DONORCHALLENGEENCUMBERED.ID is null
              and REVENUE.DATE between @STARTDATE and @ENDDATE
              and REVENUE.AMOUNT >= @MINGIFTAMOUNT



    --Add Membership payments

    insert into #PROSPECTIVEREVENUE
        (REVENUESPLITID, AMOUNT, DESIGNATIONID, DATE, DATEADDED)
    select REVENUESPLIT.ID, 
                case when @MATCHTYPECODE = 1 then 
                        case when REVENUE.TRANSACTIONAMOUNT = 0 then 0 
                            else dbo.UFN_CURRENCY_ROUND(REVENUE.RECEIPTAMOUNT/cast(REVENUE.TRANSACTIONAMOUNT As decimal(20,10))
                                * case
                                    when @BASECURRENCYID = REVENUESPLIT.TRANSACTIONCURRENCYID
                                        then REVENUESPLIT.TRANSACTIONAMOUNT
                                    else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID, @BASECURRENCYID)
                                end, @BASECURRENCYDECIMALDIGITS, @BASECURRENCYROUNDINGTYPECODE)
                        end
                    else 
                        case
                            when @BASECURRENCYID = REVENUESPLIT.TRANSACTIONCURRENCYID
                                then REVENUESPLIT.TRANSACTIONAMOUNT
                            else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID, @BASECURRENCYID)
                        end 
                    end
                DONORCHALLENGEMEMBERSHIPLEVELMAP.MATCHINGDESIGNATIONID,
                REVENUE.DATE,
                REVENUE.DATEADDED
        from dbo.REVENUESPLIT
        inner join dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
        inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = REVENUESPLIT.ID
        inner join dbo.DONORCHALLENGEMEMBERSHIPLEVELMAP on DONORCHALLENGEMEMBERSHIPLEVELMAP.MEMBERSHIPLEVELID = MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID
        left join dbo.DONORCHALLENGEENCUMBERED on REVENUESPLIT.ID = DONORCHALLENGEENCUMBERED.REVENUESPLITID and DONORCHALLENGEENCUMBERED.DONORCHALLENGEID = @DCID
        where REVENUE.TRANSACTIONTYPECODE = 0
            and DONORCHALLENGEMEMBERSHIPLEVELMAP.DONORCHALLENGEID=@DCID
            and DONORCHALLENGEENCUMBERED.ID is null
            and REVENUESPLIT.APPLICATIONCODE = 5
            and REVENUE.DATE between @STARTDATE and @ENDDATE
            and REVENUE.AMOUNT >= @MINGIFTAMOUNT
            and not exists(select top 1 APPTYPESUB.ID from dbo.DONORCHALLENGEEXCLUDEDAPPLICATIONTYPE APPTYPESUB
                                where APPTYPESUB.DONORCHALLENGEID = @DCID and REVENUESPLIT.APPLICATIONCODE = APPTYPESUB.APPLICATIONCODE)


    --Loop through new revenue.

    --Add one at a time to make sure we don't go over our limit.


  declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
  declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
  declare @ORGANIZATIONAMOUNT money;

  declare AVAILABLEREVENUE cursor local fast_forward for  
    select REVENUESPLITID, AMOUNT, DESIGNATIONID, DATEADDED
    from #PROSPECTIVEREVENUE 
    order by DATE, DATEADDED

    open AVAILABLEREVENUE

    fetch next from AVAILABLEREVENUE into @REVENUESPLITID, @AMOUNT, @DESIGNATIONID, @DATEADDED;

    while (@@FETCH_STATUS = 0 and @ENCUMBERED < @TOTALFUNDS)
    begin
        set @AMOUNT = round(@AMOUNT * @MATCHINGFACTOR, 2)

        if @MAXMATCHPERGIFT > 0 and @AMOUNT > @MAXMATCHPERGIFT
          set @AMOUNT = @MAXMATCHPERGIFT;

        if @AMOUNT > (@TOTALFUNDS - @ENCUMBERED)
            set @AMOUNT = (@TOTALFUNDS - @ENCUMBERED);

    set @ORGANIZATIONEXCHANGERATEID = null;
    set @ORGANIZATIONEXCHANGERATEID = dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATEADDED, 0, null);

    set @ORGANIZATIONAMOUNT = 0;
    set @ORGANIZATIONAMOUNT = dbo.UFN_CURRENCY_CONVERT(@AMOUNT, @ORGANIZATIONEXCHANGERATEID);

        insert into DONORCHALLENGEENCUMBERED(
      DONORCHALLENGEID,
      REVENUESPLITID,
      DESIGNATIONID,
      METHODTYPECODE,
      AMOUNT,
      REVENUERECOGNITIONTYPECODEID,
      BASECURRENCYID,
      ORGANIZATIONAMOUNT,
      ORGANIZATIONEXCHANGERATEID,
      ADDEDBYID,
      CHANGEDBYID,
      DATEADDED,
      DATECHANGED
    ) values (
      @DCID,
      @REVENUESPLITID,
      @DESIGNATIONID,
      0,
      @AMOUNT,
      @REVENUERECOGNITIONTYPECODEID,
      @BASECURRENCYID,
      @ORGANIZATIONAMOUNT,
      @ORGANIZATIONEXCHANGERATEID,
      @CHANGEAGENTID,
      @CHANGEAGENTID,
      @NOW,
      @NOW
    )

        set @ENCUMBERED = @ENCUMBERED + @AMOUNT;

        fetch next from AVAILABLEREVENUE into @REVENUESPLITID, @AMOUNT, @DESIGNATIONID, @DATEADDED;
    end

    close AVAILABLEREVENUE
    deallocate AVAILABLEREVENUE

    update DONORCHALLENGE
    set PROCESSLASTRUN = @NOW,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @NOW
    where ID = @DCID


end