UFN_EVENTREGISTRANT_GETRECEIPTAMOUNT_NOBENEFITS

Returns the receipt amount for an event registration payment, without consideration for benefits.

Return

Return Type
money

Parameters

Parameter Parameter Type Mode Description
@REGISTRANTID uniqueidentifier IN
@REVENUEDATE datetime IN
@TRANSACTIONAMOUNT money IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@BASECURRENCYID uniqueidentifier IN
@BASEEXCHANGERATEID uniqueidentifier IN
@SPOTRATE decimal(20, 8) IN
@REGISTRATIONEXISTSINBATCH bit IN
@EXISTINGREVENUEID uniqueidentifier IN

Definition

Copy


CREATE function dbo.UFN_EVENTREGISTRANT_GETRECEIPTAMOUNT_NOBENEFITS
(
    @REGISTRANTID uniqueidentifier,
    @REVENUEDATE datetime,
    @TRANSACTIONAMOUNT money,
    @TRANSACTIONCURRENCYID uniqueidentifier,
    @BASECURRENCYID uniqueidentifier,
    @BASEEXCHANGERATEID uniqueidentifier,
    @SPOTRATE decimal(20,8) = 0,
    @REGISTRATIONEXISTSINBATCH bit = 0,
    @EXISTINGREVENUEID uniqueidentifier = null
)
returns money
as
begin
    --Get the event's currency.

    declare @APPLICATIONCURRENCYID uniqueidentifier;
    if @REGISTRATIONEXISTSINBATCH = 0
    begin
        select
            @APPLICATIONCURRENCYID = EVENT.BASECURRENCYID
        from
            dbo.REGISTRANT
            inner join dbo.EVENT on EVENT.ID = REGISTRANT.EVENTID
        where
            REGISTRANT.ID = @REGISTRANTID;
    end
    else
    begin
        select
            @APPLICATIONCURRENCYID = EVENT.BASECURRENCYID
        from
            dbo.BATCHREVENUEREGISTRANT
            inner join dbo.EVENT on EVENT.ID = BATCHREVENUEREGISTRANT.EVENTID
        where
            BATCHREVENUEREGISTRANT.ID = @REGISTRANTID
    end

    declare @APPLICATIONCURRENCYDECIMALDIGITS int;
    declare @APPLICATIONCURRENCYROUNDINGTYPE int = 0;
    select
        @APPLICATIONCURRENCYDECIMALDIGITS = CURRENCY.DECIMALDIGITS,
        @APPLICATIONCURRENCYROUNDINGTYPE = CURRENCY.ROUNDINGTYPECODE
    from dbo.CURRENCY
    where CURRENCY.ID = @APPLICATIONCURRENCYID;

    declare @TRANSACTIONCURRENCYDECIMALDIGITS int;
    declare @TRANSACTIONCURRENCYROUNDINGTYPE int = 0;
    select
        @TRANSACTIONCURRENCYDECIMALDIGITS = CURRENCY.DECIMALDIGITS,
        @TRANSACTIONCURRENCYROUNDINGTYPE = CURRENCY.ROUNDINGTYPECODE
    from dbo.CURRENCY
    where CURRENCY.ID = @TRANSACTIONCURRENCYID;

    --Calculate the application amount, getting an exchange rate if need be.

    declare @APPLICATIONEXCHANGERATE decimal(20,8);
    declare @APPLICATIONEXCHANGERATEID uniqueidentifier;
    declare @APPLICATIONAMOUNT money;
    declare @EVENTPRICE MONEY;

    if @APPLICATIONCURRENCYID = @TRANSACTIONCURRENCYID
    begin
        set @APPLICATIONAMOUNT = @TRANSACTIONAMOUNT;
    end
    else
    begin
        if @APPLICATIONCURRENCYID = @BASECURRENCYID
        begin
            if @BASEEXCHANGERATEID <> '00000000-0000-0000-0000-000000000001'
            begin
                select
                    @APPLICATIONEXCHANGERATE = RATE,
                    @APPLICATIONEXCHANGERATEID = ID
                from dbo.CURRENCYEXCHANGERATE
                where ID = @BASEEXCHANGERATEID;
            end
            else
            begin
                set @APPLICATIONEXCHANGERATE = @SPOTRATE;
            end
        end
        else
        begin
            set @APPLICATIONEXCHANGERATEID = dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(@TRANSACTIONCURRENCYID, @APPLICATIONCURRENCYID, @REVENUEDATE, 1, null);
            if @APPLICATIONEXCHANGERATEID is null
            begin
                --If we have no exchange rate, we can't calculate the receipt amount

                return 0;
            end

            select @APPLICATIONEXCHANGERATE = RATE
            from dbo.CURRENCYEXCHANGERATE
            where ID = @APPLICATIONEXCHANGERATEID;
        end

        --Convert the transaction amount to the event's base currency

        set @APPLICATIONAMOUNT = dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(@TRANSACTIONAMOUNT, @APPLICATIONEXCHANGERATE),@APPLICATIONCURRENCYDECIMALDIGITS,@APPLICATIONCURRENCYROUNDINGTYPE);
    end


    declare @RECEIPTAMOUNT money;


            --Get total registration price and the info needed to calculate total registration cost

            declare @APPLICATIONTOTALPRICE money;
            declare @APPLICATIONTOTALCOST money;
            if @REGISTRATIONEXISTSINBATCH = 0
            begin
                select
                    @APPLICATIONTOTALPRICE = sum(REGISTRANTREGISTRATION.AMOUNT), --The amount of the registration

                    @APPLICATIONTOTALCOST = sum(EVENTPRICE.COST * REGISTRANTREGISTRATION.QUANTITY) --The cost of the registration option * the number of options selected

                from
                    dbo.REGISTRANTREGISTRATION
                    inner join dbo.EVENTPRICE on EVENTPRICE.ID = REGISTRANTREGISTRATION.EVENTPRICEID
                where
                    REGISTRANTREGISTRATION.REGISTRANTID = @REGISTRANTID 
                    and (
                        REGISTRANTREGISTRATION.AMOUNT > 0
                        or EVENTPRICE.AMOUNT = 0
                    );
            end
            else
            begin
                select
                    @APPLICATIONTOTALPRICE = sum(BATCHREVENUEREGISTRANTREGISTRATION.AMOUNT), --The amount of the registration

                    @APPLICATIONTOTALCOST = sum(EVENTPRICE.COST * BATCHREVENUEREGISTRANTREGISTRATION.QUANTITY) --The cost of the registration option * the number of options selected

                from
                    dbo.BATCHREVENUEREGISTRANTREGISTRATION
                    inner join dbo.EVENTPRICE on EVENTPRICE.ID = BATCHREVENUEREGISTRANTREGISTRATION.EVENTPRICEID
                where
                    BATCHREVENUEREGISTRANTREGISTRATION.REGISTRANTID = @REGISTRANTID 
                    and
                    (
                        BATCHREVENUEREGISTRANTREGISTRATION.AMOUNT > 0
                        or EVENTPRICE.AMOUNT = 0
                    );
            end

            --Get the amount previously applied to this registration

            declare @APPLICATIONPREVIOUSAMOUNT money;
            declare @APPLICATIONPREVIOUSRECEIPTAMOUNT money;
            declare @APPLICATIONPREVIOUSCOST money = 0;
            declare @APPLICATIONPREVIOUSBENEFITS money;

            select
                @APPLICATIONPREVIOUSAMOUNT = coalesce(sum(EVENTREGISTRANTPAYMENT.AMOUNT), 0),
                @APPLICATIONPREVIOUSRECEIPTAMOUNT = coalesce(sum(EVENTREGISTRANTPAYMENT.RECEIPTAMOUNT), 0)
             from
                dbo.EVENTREGISTRANTPAYMENT
                inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = EVENTREGISTRANTPAYMENT.PAYMENTID
                where
                EVENTREGISTRANTPAYMENT.REGISTRANTID = @REGISTRANTID
                and (@EXISTINGREVENUEID is null or FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID <> @EXISTINGREVENUEID)
                and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1;

            -- Fetch benefits amount applied in previous payment

            select @APPLICATIONPREVIOUSBENEFITS = isnull(sum(REVENUEBENEFIT.TOTALVALUE),0)
            from dbo.REVENUEBENEFIT
            inner join dbo.REVENUESPLIT on REVENUESPLIT.REVENUEID = REVENUEBENEFIT.REVENUEID 
            inner join dbo.EVENTREGISTRANTPAYMENT on EVENTREGISTRANTPAYMENT.PAYMENTID = REVENUESPLIT.ID
            where REGISTRANTID =  @REGISTRANTID
            and REVENUEBENEFIT.UNITVALUE > 0;

            declare @TRANSACTIONTOTALPRICE money;
            declare @TRANSACTIONTOTALRECEIPT money;
            declare @TRANSACTIONPREVIOUSLYPAID money;
            declare @TRANSACTIONPREVIOUSLYRECEIPTED money;

            --Calculate the total expected receipts in transaction currency.

            if @APPLICATIONEXCHANGERATE <> 0
            begin
                -- Do an inverse conversion because we want to ensure that the transaction receipt amounts, when converted to the event's 

                -- currency, sum up to the registration's price minus cost

                set @TRANSACTIONTOTALPRICE = dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(@APPLICATIONTOTALPRICE, 1/@APPLICATIONEXCHANGERATE),@TRANSACTIONCURRENCYDECIMALDIGITS,@TRANSACTIONCURRENCYROUNDINGTYPE);
                set @TRANSACTIONTOTALRECEIPT = dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(@APPLICATIONTOTALPRICE - @APPLICATIONTOTALCOST, 1/@APPLICATIONEXCHANGERATE),@TRANSACTIONCURRENCYDECIMALDIGITS,@TRANSACTIONCURRENCYROUNDINGTYPE);
                set @TRANSACTIONPREVIOUSLYPAID = dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(@APPLICATIONPREVIOUSAMOUNT, 1/@APPLICATIONEXCHANGERATE),@TRANSACTIONCURRENCYDECIMALDIGITS,@TRANSACTIONCURRENCYROUNDINGTYPE);
                set @TRANSACTIONPREVIOUSLYRECEIPTED = dbo.UFN_CURRENCY_CONVERT(@APPLICATIONPREVIOUSRECEIPTAMOUNT, @APPLICATIONEXCHANGERATEID);
            end
            else
            begin
                set @TRANSACTIONTOTALPRICE = @APPLICATIONTOTALPRICE;
                set @TRANSACTIONTOTALRECEIPT = @APPLICATIONTOTALPRICE - @APPLICATIONTOTALCOST;
                set @TRANSACTIONPREVIOUSLYPAID = @APPLICATIONPREVIOUSAMOUNT;
                set @TRANSACTIONPREVIOUSLYRECEIPTED = @APPLICATIONPREVIOUSRECEIPTAMOUNT;
                set @APPLICATIONPREVIOUSCOST = @APPLICATIONPREVIOUSAMOUNT - @APPLICATIONPREVIOUSRECEIPTAMOUNT - @APPLICATIONPREVIOUSBENEFITS;
            end

            -- This percentage-based algorithm is meant to mimic logic found in USP_EVENT_ADDPAYMENT

            declare @PERCENTOFREMAINING float = 1;
            declare @TRANSACTIONAMOUNTREMAINING money = @TRANSACTIONTOTALPRICE - @TRANSACTIONPREVIOUSLYPAID;
                -- Handles when event cost is zero and Total Receipt amount is equal to registration fee only

            if @TRANSACTIONAMOUNTREMAINING =  @TRANSACTIONTOTALRECEIPT - @TRANSACTIONPREVIOUSLYPAID
                set @RECEIPTAMOUNT = @TRANSACTIONAMOUNT;
            else    
            begin
            if @TRANSACTIONAMOUNTREMAINING > 0 and @TRANSACTIONAMOUNT <= @TRANSACTIONAMOUNTREMAINING
            begin
                set @PERCENTOFREMAINING = @TRANSACTIONAMOUNT / @TRANSACTIONAMOUNTREMAINING;
            end

            set @RECEIPTAMOUNT = round((@TRANSACTIONTOTALRECEIPT - @TRANSACTIONPREVIOUSLYPAID + @APPLICATIONPREVIOUSCOST) * @PERCENTOFREMAINING, 2);
            end
                --Check if this is an event with designations, receipt amount calculation is different.

        if exists(
            select 1 from dbo.REGISTRANT 
                inner join dbo.EVENT on EVENT.ID = REGISTRANT.EVENTID
                 inner join dbo.REGISTRANTDESIGNATION on REGISTRANTDESIGNATION.REGISTRANTID = REGISTRANT.ID 
            where 
                REGISTRANT.ID = @REGISTRANTID
                and EVENT.DESIGNATIONSONFEES = 1
                and REGISTRANTDESIGNATION.AMOUNT > 0)
            and exists(select 1 from dbo.REGISTRANTDESIGNATION where REGISTRANTID = @REGISTRANTID and AMOUNT > 0)
        begin
    if @REGISTRATIONEXISTSINBATCH = 0 
    begin
    select
      @EVENTPRICE = EVENTPRICE.AMOUNT
    from
      dbo.REGISTRANTREGISTRATION
      inner join dbo.EVENTPRICE on REGISTRANTREGISTRATION.EVENTPRICEID = EVENTPRICE.ID
      inner join dbo.EVENT on EVENTPRICE.EVENTID = EVENT.ID
    where
      REGISTRANTREGISTRATION.REGISTRANTID = @REGISTRANTID;
      end 
  else 
     begin
    select
      @EVENTPRICE = EVENTPRICE.AMOUNT
    from
      dbo.BATCHREVENUEREGISTRANTREGISTRATION
      inner join dbo.EVENTPRICE on BATCHREVENUEREGISTRANTREGISTRATION.EVENTPRICEID = EVENTPRICE.ID
      inner join dbo.EVENT on EVENTPRICE.EVENTID = EVENT.ID
    where
      REGISTRANTID = @REGISTRANTID;
     end

            --If this event registration is being paid in full, the benefits are also applied to the payment so just use the non-designation calculation result.

            if  @APPLICATIONTOTALPRICE <> @APPLICATIONAMOUNT and (@EVENTPRICE = 0 or @APPLICATIONAMOUNT % @EVENTPRICE <> 0)
            begin
                    declare @EVENTPORTIONBALANCE money = dbo.UFN_EVENTREGISTRANT_GETBALANCEEVENTPORTION(@REGISTRANTID);
                    declare @EVENTPORTIONAMOUNTAPPLIED money;
                    declare @REMAININGAMOUNTTOAPPLY money;

                    --Apply as much as possible towards the event portion before applying towards designations.

                    if @APPLICATIONAMOUNT >= @EVENTPORTIONBALANCE
                    begin
                     set @EVENTPORTIONAMOUNTAPPLIED = @EVENTPORTIONBALANCE;
                     set @REMAININGAMOUNTTOAPPLY = (@APPLICATIONAMOUNT - @EVENTPORTIONBALANCE);
                    end
                    else
                    begin
                     set @EVENTPORTIONAMOUNTAPPLIED =  @APPLICATIONAMOUNT;
                     set @REMAININGAMOUNTTOAPPLY = 0;
                    end

                        set @RECEIPTAMOUNT = @REMAININGAMOUNTTOAPPLY
            end

        end


    if @RECEIPTAMOUNT > @TRANSACTIONAMOUNT or @RECEIPTAMOUNT < 0
        set @RECEIPTAMOUNT = 0.00;

    return @RECEIPTAMOUNT;
end