USP_DATAFORMTEMPLATE_ADD_DONORCHALLENGEENCUMBEREDFUND

The save procedure used by the add dataform template "Donor Challenge Encumbered Fund Add Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@DONORCHALLENGEID uniqueidentifier IN Input parameter indicating the context ID for the record being added.
@REVENUEID uniqueidentifier IN Gift

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_DONORCHALLENGEENCUMBEREDFUND
(
  @ID uniqueidentifier = null output,
  @CHANGEAGENTID uniqueidentifier = null,
  @CURRENTAPPUSERID uniqueidentifier,
  @DONORCHALLENGEID uniqueidentifier,
  @REVENUEID uniqueidentifier
)
as
begin
  set nocount on;

  begin try

    declare @CURRENTDATE datetime = getdate();

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

    declare @CONTEXTCACHE varbinary(128) = CONTEXT_INFO();
      set CONTEXT_INFO @CHANGEAGENTID;

    --Remove any removed funds for this revenue associated with the donor challenge

    delete DCE from
      dbo.DONORCHALLENGEENCUMBERED DCE
    inner join
      dbo.REVENUESPLIT on REVENUESPLIT.ID = DCE.REVENUESPLITID
    where
      DCE.DONORCHALLENGEID = @DONORCHALLENGEID
      and DCE.STATUSTYPECODE = 2
      and REVENUESPLIT.REVENUEID = @REVENUEID

    --Delete Encumbered pledge payments if the Pledge is being added

    delete DCE from
      dbo.DONORCHALLENGEENCUMBERED DCE
    inner join
      dbo.REVENUESPLIT on REVENUESPLIT.ID = DCE.REVENUESPLITID
    inner join
      dbo.INSTALLMENTSPLITPAYMENT on REVENUESPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
    inner join
      dbo.INSTALLMENTSPLIT on INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID 
    inner join
      dbo.REVENUE on INSTALLMENTSPLIT.PLEDGEID = REVENUE.ID
    inner join
      dbo.REVENUESPLIT PLEDGESPLIT on REVENUE.ID = PLEDGESPLIT.REVENUEID and INSTALLMENTSPLIT.DESIGNATIONID = PLEDGESPLIT.DESIGNATIONID
    where
      REVENUE.ID = @REVENUEID
      and REVENUE.TRANSACTIONTYPECODE = 1 --Pledge

      and DCE.DONORCHALLENGEID = @DONORCHALLENGEID
      and DCE.STATUSTYPECODE = 0 --Pledge payment is encumbered

      and REVENUESPLIT.APPLICATIONCODE = 2 --Pledge payment


    if not @CONTEXTCACHE is null
      set CONTEXT_INFO @CONTEXTCACHE;

    declare @TOTALFUNDS money;
    declare @MATCHINGFACTOR decimal(5,2);
    declare @MATCHTYPECODE tinyint;
    declare @REVENUERECOGNITIONTYPECODEID uniqueidentifier;
    declare @TYPECODE tinyint;
    declare @ORGANIZATIONCURRENCYID uniqueidentifier;
    declare @BASECURRENCYID uniqueidentifier;
    declare @BASECURRENCYDECIMALDIGITS tinyint;
    declare @BASECURRENCYROUNDINGTYPECODE tinyint;
    declare @MAXMATCHPERGIFT money;

    select
      @TOTALFUNDS = case when TYPECODE = 1 then MATCHTHRESHOLD else TOTALFUNDS end,
      @MATCHINGFACTOR = case when TYPECODE = 1 then 1 else MATCHINGFACTOR end,
      @MATCHTYPECODE = MATCHTYPECODE,
      @REVENUERECOGNITIONTYPECODEID = REVENUERECOGNITIONTYPECODEID,
      @TYPECODE = TYPECODE,
      @BASECURRENCYID = BASECURRENCYID,
      @MAXMATCHPERGIFT = DONORCHALLENGE.MAXMATCHPERGIFT
    from
      dbo.DONORCHALLENGE
    where
      ID = @DONORCHALLENGEID;

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

    set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

    declare @ENCUMBERED money;
    select @ENCUMBERED = coalesce(dbo.UFN_DONORCHALLENGE_ENCUMBEREDAMOUNT(@DONORCHALLENGEID), 0) + coalesce(dbo.UFN_DONORCHALLENGE_MATCHEDAMOUNT(@DONORCHALLENGEID), 0);

    declare @REVENUESPLITID uniqueidentifier;
    declare @AMOUNT money = 0;
    declare @DESIGNATIONID uniqueidentifier;

    declare @DATEADDED datetime;
    select @DATEADDED = REVENUE.DATEADDED from dbo.REVENUE where REVENUE.ID = @REVENUEID;

    declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier = dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATEADDED, 0, null);
    declare @ORGANIZATIONAMOUNT money;

    declare AVAILABLEREVENUE cursor local fast_forward for  
      select
        REVENUESPLIT.ID,
        case 
          when @MATCHTYPECODE = 1 and REVENUE.TRANSACTIONTYPECODE <> 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,
        DESIGNATIONID
      from
        dbo.REVENUESPLIT
      inner join
        dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
      where
        REVENUEID = @REVENUEID

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

    while (@@FETCH_STATUS = 0 and @ENCUMBERED < @TOTALFUNDS)
    begin
      set @AMOUNT = dbo.UFN_CURRENCY_ROUND(@AMOUNT * @MATCHINGFACTOR, @BASECURRENCYDECIMALDIGITS, @BASECURRENCYROUNDINGTYPECODE);

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

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

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

          insert into dbo.DONORCHALLENGEENCUMBERED
          (
            ID,
            DONORCHALLENGEID,
            REVENUESPLITID,
            DESIGNATIONID,
            METHODTYPECODE,
            AMOUNT,
            REVENUERECOGNITIONTYPECODEID,
            BASECURRENCYID,
            ORGANIZATIONAMOUNT,
            ORGANIZATIONEXCHANGERATEID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
          )
      select
            newid(),
            @DONORCHALLENGEID,
            REVENUESPLIT.ID,
            case when @TYPECODE = 1 then null else coalesce(DCDM.MATCHINGDESIGNATIONID, REVENUESPLIT.DESIGNATIONID, DCMM.MATCHINGDESIGNATIONID) end,
            1,
            @AMOUNT,
            @REVENUERECOGNITIONTYPECODEID,
            @BASECURRENCYID,
            @ORGANIZATIONAMOUNT,
            @ORGANIZATIONEXCHANGERATEID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
          from
            dbo.REVENUESPLIT
          left join
            dbo.DONORCHALLENGEDESIGNATIONMAP DCDM on DCDM.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID and DCDM.DONORCHALLENGEID = @DONORCHALLENGEID
          left join
            dbo.MEMBERSHIPTRANSACTION MT on MT.REVENUESPLITID = REVENUESPLIT.ID
          left join
            dbo.DONORCHALLENGEMEMBERSHIPLEVELMAP DCMM on DCMM.MEMBERSHIPLEVELID = MT.MEMBERSHIPLEVELID and DCMM.DONORCHALLENGEID = @DONORCHALLENGEID
          left join
            dbo.DONORCHALLENGEENCUMBERED DCE on DCE.REVENUESPLITID = REVENUESPLIT.ID and DCE.DONORCHALLENGEID = @DONORCHALLENGEID
          where
            REVENUESPLIT.ID = @REVENUESPLITID
            and DCE.REVENUESPLITID is null
            and ((REVENUESPLIT.APPLICATIONCODE <> 2) or 
                --allow individual pledge payments to be added unless the associated pledge is already added and does not have Removed status

                ((REVENUESPLIT.APPLICATIONCODE = 2) and 
                  (not exists (select DCE2.REVENUESPLITID 
                              from dbo.DONORCHALLENGEENCUMBERED DCE2
                              inner join dbo.REVENUESPLIT RS on DCE2.REVENUESPLITID = RS.ID
                              inner join dbo.REVENUE R on R.ID = RS.REVENUEID
                              inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.PLEDGEID = R.ID and INSTALLMENTSPLIT.DESIGNATIONID = RS.DESIGNATIONID
                              inner join dbo.INSTALLMENTSPLITPAYMENT on INSTALLMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID
                              where INSTALLMENTSPLITPAYMENT.PAYMENTID = REVENUESPLIT.ID and DCE2.DONORCHALLENGEID = @DONORCHALLENGEID and DCE2.STATUSTYPECODE <> 2))));

      set @ENCUMBERED = @ENCUMBERED + @AMOUNT;

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

    --When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long

    close AVAILABLEREVENUE;
    deallocate AVAILABLEREVENUE;

    end try
  begin catch
    exec dbo.USP_RAISE_ERROR
    return 1
  end catch

  return 0

end