UFN_REVENUEBATCH_CALCULATERECEIPTAMOUNT

Return

Return Type
money

Parameters

Parameter Parameter Type Mode Description
@AMOUNT money IN
@RECEIPTAMOUNT money IN
@APPLICATIONINFO nvarchar(60) IN
@DATE datetime IN
@BENEFITSWAIVED bit IN
@BENEFITS xml IN
@PERCENTAGEBENEFITS xml IN
@REVENUESTREAMS xml IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@BASECURRENCYID uniqueidentifier IN
@BASEEXCHANGERATEID uniqueidentifier IN

Definition

Copy


CREATE function dbo.UFN_REVENUEBATCH_CALCULATERECEIPTAMOUNT
(
  @AMOUNT money,
  @RECEIPTAMOUNT money,
  @APPLICATIONINFO nvarchar(60),
  @DATE datetime,
  @BENEFITSWAIVED bit,
  @BENEFITS xml,
  @PERCENTAGEBENEFITS xml,
  @REVENUESTREAMS xml,
  @TRANSACTIONCURRENCYID uniqueidentifier,
  @BASECURRENCYID uniqueidentifier,
  @BASEEXCHANGERATEID uniqueidentifier
)
returns money
with execute as caller
begin

  --Calculate the total amount of benefits

  declare @BENEFITAMOUNT money = 0;

  if @BENEFITSWAIVED = 0
  begin

    select
      @BENEFITAMOUNT = 
        coalesce
        (
          sum
          (
            case
              when BASECURRENCYID <> @TRANSACTIONCURRENCYID then
                dbo.UFN_CURRENCY_CONVERT(BASETOTALVALUE, BASEEXCHANGERATEID)
            else
              BASETOTALVALUE
            end
          ),
          0
        )
    from
    (
      select
        REVBENEFITSFROMXML.QUANTITY * REVBENEFITSFROMXML.UNITVALUE as BASETOTALVALUE,
        BENEFIT.BASECURRENCYID as BASECURRENCYID,
        case
          when REVBENEFITSFROMXML.BASECURRENCYID <> @TRANSACTIONCURRENCYID then
            dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(REVBENEFITSFROMXML.BASECURRENCYID, @TRANSACTIONCURRENCYID, @DATE, 1, null)
          else
            null
        end as BASEEXCHANGERATEID
      from
        dbo.UFN_REVENUE_GETBENEFITS_3_FROMITEMLISTXML(@BENEFITS) as REVBENEFITSFROMXML
      inner join
        dbo.BENEFIT on BENEFIT.ID = REVBENEFITSFROMXML.BENEFITID
    ) as BENEFITSFROMXML;

    select
      @BENEFITAMOUNT = @BENEFITAMOUNT + coalesce(sum(PERCENTAPPLICABLEAMOUNT * VALUEPERCENT / 100), 0)
    from
      dbo.UFN_REVENUEBATCH_GETBENEFITSPCT_FROMITEMLISTXML(@PERCENTAGEBENEFITS);
  end

  --Commitments: Get total amount applied and total receipt amount

  declare @COMMITMENTAPPLIEDAMOUNT money = 0;
  declare @COMMITMENTRECEIPTAMOUNT money = 0;

  declare @SINGLEAPPLICATIONID uniqueidentifier;
  declare @APPLICATIONTYPECODE tinyint;

  if len(@APPLICATIONINFO) > 3
    select
      @SINGLEAPPLICATIONID = SINGLEAPPLICATIONID,
      @APPLICATIONTYPECODE = APPLICATIONTYPECODE
    from
      dbo.UFN_REVENUEBATCH_PARSEAPPLICATIONINFO(@APPLICATIONINFO);

  if @SINGLEAPPLICATIONID is null
  begin
    if @REVENUESTREAMS.exist('/REVENUESTREAMS/ITEM') <> 0
      with STREAMSAPPLICATION_CTE as
      (
        select
          APPLIED,
          APPLICATIONID,
          OVERPAYMENTAPPLICATIONTYPECODE,
          case
            when (BATCHREVENUEREGISTRANT.ID is not null) or (REGISTRANT.ID is not null) then
              6
            when FINANCIALTRANSACTION.ID is not null then
              case FINANCIALTRANSACTION.TYPECODE
                when 6 then
                  9
                when 8 then
                  10
                else
                  FINANCIALTRANSACTION.TYPECODE
              end
            else
              APPLICATIONS.TYPECODE
          end as TYPECODE,
          case
            when BATCHREVENUEREGISTRANT.ID is not null then
              1
            else
              0
          end as APPLIEDTOBATCHREGISTRANT
        from
        (
          select
            APPLIED,
            coalesce(APPLICATIONID, APPLICATIONCOMMITMENTID) as APPLICATIONID,
            OVERPAYMENTAPPLICATIONTYPECODE,
            TYPECODE
          from
            dbo.UFN_REVENUEBATCH_GETAPPLICATIONS_FROMITEMLISTXML(@REVENUESTREAMS)
          where
            APPLIED > 0
        )
          as APPLICATIONS
        left join
          dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = APPLICATIONS.APPLICATIONID
        left join
          dbo.BATCHREVENUEREGISTRANT on BATCHREVENUEREGISTRANT.ID = APPLICATIONS.APPLICATIONID
        left join
          dbo.REGISTRANT on REGISTRANT.ID = APPLICATIONS.APPLICATIONID
      ),
      STREAMSRECEIPTAMOUNT_CTE as
      (
        select
         APPLIED,
          case
            when TYPECODE = 6 then
              dbo.UFN_EVENTREGISTRANT_GETRECEIPTAMOUNT_NOBENEFITS
              (
                APPLICATIONID, @DATE, APPLIED, @TRANSACTIONCURRENCYID, @BASECURRENCYID, @BASEEXCHANGERATEID, 0, APPLIEDTOBATCHREGISTRANT, null
              )
            when TYPECODE = 1 then
              dbo.UFN_PLEDGE_CALCULATERECEIPTAMOUNT(APPLICATIONID, APPLIED, OVERPAYMENTAPPLICATIONTYPECODE)
            else
              APPLIED
          end as RECEIPTAMOUNT --JamesWill WI125245 2010-10-19 Event receipt amounts are in the receipt amount field. So don't double count them here.

        from
          STREAMSAPPLICATION_CTE
      )
      select
        @COMMITMENTAPPLIEDAMOUNT = coalesce(sum(APPLIED), 0),
        @COMMITMENTRECEIPTAMOUNT = coalesce(sum(RECEIPTAMOUNT), 0)
      from
        STREAMSRECEIPTAMOUNT_CTE
  end
  else
  begin
    set @COMMITMENTAPPLIEDAMOUNT = @AMOUNT;

    if @APPLICATIONTYPECODE = 5 -- pledge

    begin
      set @COMMITMENTRECEIPTAMOUNT = dbo.UFN_PLEDGE_CALCULATERECEIPTAMOUNT(@SINGLEAPPLICATIONID, @AMOUNT, default);
    end
    else if @APPLICATIONTYPECODE = 7 -- event registration

    begin
      select
      @COMMITMENTRECEIPTAMOUNT = dbo.UFN_EVENTREGISTRANT_GETRECEIPTAMOUNT_NOBENEFITS
                                 (
                                   @SINGLEAPPLICATIONID, @DATE, @AMOUNT, @TRANSACTIONCURRENCYID, @BASECURRENCYID,
                                   @BASEEXCHANGERATEID, 0, 0, null
                                 )
    end
    else
    begin
      set @COMMITMENTRECEIPTAMOUNT = @AMOUNT;
    end
  end

  --Donations: Receipt amount defaults to the applied amount

  declare @DONATIONAPPLIEDAMOUNT money = @AMOUNT - @COMMITMENTAPPLIEDAMOUNT;
  declare @DONATIONRECEIPTAMOUNT money = @DONATIONAPPLIEDAMOUNT;

  declare @CALCULATEDRECEIPTAMOUNT money = (@DONATIONRECEIPTAMOUNT + @COMMITMENTRECEIPTAMOUNT) - @BENEFITAMOUNT;

  if @CALCULATEDRECEIPTAMOUNT < 0
    set @CALCULATEDRECEIPTAMOUNT = 0;

  return @CALCULATEDRECEIPTAMOUNT;
end