UFN_REVENUE_GETGIFTINKINDPAYMENTMETHODDETAILSPLITSBYTRANSACTION

Generates the splits for Gift-in-kind Gain/Loss by transaction.

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@TRANSACTIONID uniqueidentifier IN
@PAYMENTMETHODCODE int IN

Definition

Copy


CREATE function dbo.UFN_REVENUE_GETGIFTINKINDPAYMENTMETHODDETAILSPLITSBYTRANSACTION
(
    @TRANSACTIONID uniqueidentifier, 
    @PAYMENTMETHODCODE int
)
returns @SPLITS TABLE
(
    REVENUESPLITID uniqueidentifier,
    AMOUNT money,
    TRANSACTIONAMOUNT money,
    REVENUEID uniqueidentifier,
    GIFTINKINDSALEID uniqueidentifier,
    TRANSACTIONSPLITAMOUNT money,
    ORGANIZATIONAMOUNT money
)
as
begin
    --Retrieve information about the revenue record.

    declare @TRANSACTIONREVENUEAMOUNT money;
    declare @BASEREVENUEAMOUNT money;
    declare @ORGANIZATIONREVENUEAMOUNT money;
    declare @TRANSACTIONCURRENCYID uniqueidentifier;
    declare @BASECURRENCYID uniqueidentifier;
    declare @ORGANIZATIONCURRENCYID uniqueidentifier;
    declare @TOTALGIFTINKINDCOUNT int

    select 
        @TRANSACTIONREVENUEAMOUNT = REVENUE.TRANSACTIONAMOUNT,
        @BASEREVENUEAMOUNT = REVENUE.AMOUNT,
        @ORGANIZATIONREVENUEAMOUNT = REVENUE.ORGANIZATIONAMOUNT,
        @TRANSACTIONCURRENCYID = REVENUE.TRANSACTIONCURRENCYID,
        @BASECURRENCYID = REVENUE.BASECURRENCYID,
        @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(),
        @TOTALGIFTINKINDCOUNT = GIFTINKINDPAYMENTMETHODDETAIL.NUMBEROFUNITS
    from dbo.REVENUE with (nolock) 
        inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = REVENUE.ID
        inner join dbo.GIFTINKINDPAYMENTMETHODDETAIL on GIFTINKINDPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
    where REVENUE.ID = @TRANSACTIONID;

    --Count the number of splits for aggregation later.

    declare @NUMBEROFSPLITS int
    select @NUMBEROFSPLITS = count(ID)
    from dbo.REVENUESPLIT
    where REVENUEID = @TRANSACTIONID;

    --Count the number of Gift-in-kind sales and units of sold Gift-in-kind for aggregation later.

    declare @NUMBEROFGIFTINKINDSALES int;
    declare @SOLDGIFTINKINDCOUNT int;
    select 
        @NUMBEROFGIFTINKINDSALES = count(GIFTINKINDSALE.ID),
        @SOLDGIFTINKINDCOUNT = sum(GIFTINKINDSALE.NUMBEROFUNITS)
    from dbo.GIFTINKINDSALE with (nolock)
        inner join dbo.GIFTINKINDPAYMENTMETHODDETAIL on GIFTINKINDPAYMENTMETHODDETAIL.ID = GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID
        inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.ID = GIFTINKINDPAYMENTMETHODDETAIL.ID
    where REVENUEPAYMENTMETHOD.REVENUEID = @TRANSACTIONID;

    --Has all the Gift-in-kind been sold?

    declare @ALLGIFTINKINDSOLD bit = 0;
    if @SOLDGIFTINKINDCOUNT >= @TOTALGIFTINKINDCOUNT
    begin
        set @ALLGIFTINKINDSOLD = 1;
    end

    --Retrieve decimal digit values for each currency for rounding later.

    declare @TRANSACTIONCURRENCYDECIMALDIGITS int
    select @TRANSACTIONCURRENCYDECIMALDIGITS = DECIMALDIGITS
    from dbo.CURRENCY
    where ID = @TRANSACTIONCURRENCYID;

    declare @BASECURRENCYDECIMALDIGITS int
    select @BASECURRENCYDECIMALDIGITS = DECIMALDIGITS
    from dbo.CURRENCY
    where ID = @BASECURRENCYID;

    declare @ORGANIZATIONCURRENCYDECIMALDIGITS int
    select @ORGANIZATIONCURRENCYDECIMALDIGITS = DECIMALDIGITS
    from dbo.CURRENCY
    where ID = @ORGANIZATIONCURRENCYID;

    --Values needed for math in the cursor, regardless of PAYMENTMETHODCODE

    declare @TRANSACTIONIDEALAMOUNT money;
    declare @TRANSACTIONWEIGHTEDAMOUNT money;
    declare @BASEWEIGHTEDAMOUNT money;
    declare @ORGANIZATIONWEIGHTEDAMOUNT money;
    declare @TRANSACTIONAMOUNTROLLUP money;
    declare @BASEAMOUNTROLLUP money;
    declare @ORGANIZATIONAMOUNTROLLUP money;

    declare @TRANSACTIONSPLITAMOUNTDISTRIBUTEDIDEAL money = 0;
    declare @TRANSACTIONSPLITAMOUNTDISTRIBUTED money = 0;
    declare @BASESPLITAMOUNTDISTRIBUTED money = 0;
    declare @ORGANIZATIONSPLITAMOUNTDISTRIBUTED money = 0;

    declare @SPLITIDEALAMOUNTLIST table
    (
        SPLITID uniqueidentifier,
        IDEALAMOUNT money,
        TRANSACTIONDISTRIBUTEDAMOUNT money,
        BASEDISTRIBUTEDAMOUNT money,
        ORGANIZATIONDISTRIBUTEDAMOUNT money
    );

    declare @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTEDIDEAL money = 0;
    declare @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTED money = 0;
    declare @BASEGIFTINKINDSALEAMOUNTDISTRIBUTED money = 0;
    declare @ORGANIZATIONGIFTINKINDSALEAMOUNTDISTRIBUTED money = 0;

    declare @GIFTINKINDSALEIDEALAMOUNTLIST table
    (
        GIFTINKINDSALEID uniqueidentifier,
        IDEALAMOUNT money,
        TRANSACTIONDISTRIBUTEDAMOUNT money,
        BASEDISTRIBUTEDAMOUNT money,
        ORGANIZATIONDISTRIBUTEDAMOUNT money
    );

    declare @SPLITCOUNT int = 1;
    declare @GIFTINKINDSALECOUNT int = 0;

    --Hold values from all cursors

    declare @REVENUESPLITID uniqueidentifier;
    declare @GIFTINKINDSALEID uniqueidentifier;
    declare @TRANSACTIONSPLITAMOUNT money;

    --If generating for Gift-in-kind sold or gain/loss GL, we need to calculate expected amounts

    if @PAYMENTMETHODCODE in (12, 207, 208)
    begin

        --Hold values from expected amount cursor

        declare @GIFTINKINDSALENUMBEROFUNITS int;

        --Fill tables to hold accumulations with IDs for relevant splits and Gift-in-kind sales.

        insert into @SPLITIDEALAMOUNTLIST(SPLITID)
        select ID from REVENUESPLIT where REVENUEID = @TRANSACTIONID;

        insert into @GIFTINKINDSALEIDEALAMOUNTLIST(GIFTINKINDSALEID)
        select GIFTINKINDSALE.ID
        from dbo.GIFTINKINDSALE with (nolock)
            inner join dbo.GIFTINKINDPAYMENTMETHODDETAIL on GIFTINKINDPAYMENTMETHODDETAIL.ID = GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID
            inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.ID = GIFTINKINDPAYMENTMETHODDETAIL.ID
        where REVENUEPAYMENTMETHOD.REVENUEID = @TRANSACTIONID;

        --Expected amount cursor will need IDs, split amounts per split, and the number of units of Gift-in-kind sold per Gift-in-kind sale.

        --  Order by ensures that we iterate over all the Gift-in-kind sales with a given split before going to the next split,

        --  which is necessary because we have solid expected amount totals for splits, but not Gift-in-kind sales.

        declare EXPECTEDAMOUNT_CURSOR cursor local fast_forward for
        select 
            REVENUESPLIT.ID as REVENUESPLITID,
            GIFTINKINDSALE.ID as GIFTINKINDSALEID,
            REVENUESPLIT.TRANSACTIONAMOUNT,
            GIFTINKINDSALE.NUMBEROFUNITS 
        from dbo.REVENUE with (nolock)
            inner join dbo.REVENUESPLIT with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
            inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = REVENUE.ID
            inner join dbo.GIFTINKINDPAYMENTMETHODDETAIL on GIFTINKINDPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
            inner join dbo.GIFTINKINDSALE on GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID = GIFTINKINDPAYMENTMETHODDETAIL.ID
        where
            REVENUE.ID = @TRANSACTIONID
        order by REVENUESPLIT.ID, GIFTINKINDSALE.ID

        open EXPECTEDAMOUNT_CURSOR;
        fetch next from EXPECTEDAMOUNT_CURSOR into @REVENUESPLITID, @GIFTINKINDSALEID, @TRANSACTIONSPLITAMOUNT, @GIFTINKINDSALENUMBEROFUNITS;

        while @@FETCH_STATUS = 0 begin
            set @GIFTINKINDSALECOUNT = @GIFTINKINDSALECOUNT + 1;

            --Retrieve accumulated values.

            select
                @TRANSACTIONSPLITAMOUNTDISTRIBUTEDIDEAL = coalesce(IDEALAMOUNT,0),
                @TRANSACTIONSPLITAMOUNTDISTRIBUTED = coalesce(TRANSACTIONDISTRIBUTEDAMOUNT,0),
                @BASESPLITAMOUNTDISTRIBUTED = coalesce(BASEDISTRIBUTEDAMOUNT,0),
                @ORGANIZATIONSPLITAMOUNTDISTRIBUTED = coalesce(ORGANIZATIONDISTRIBUTEDAMOUNT,0)
            from @SPLITIDEALAMOUNTLIST
            where SPLITID = @REVENUESPLITID 

            select
                @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTEDIDEAL = coalesce(IDEALAMOUNT,0),
                @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTED = coalesce(TRANSACTIONDISTRIBUTEDAMOUNT,0),
                @BASEGIFTINKINDSALEAMOUNTDISTRIBUTED = coalesce(BASEDISTRIBUTEDAMOUNT,0),
                @ORGANIZATIONGIFTINKINDSALEAMOUNTDISTRIBUTED = coalesce(ORGANIZATIONDISTRIBUTEDAMOUNT,0)
            from @GIFTINKINDSALEIDEALAMOUNTLIST
            where GIFTINKINDSALEID = @GIFTINKINDSALEID 

            --If any Gift-in-kind as been sold, calculate the ideal expected amount in transaction currency

            if @TOTALGIFTINKINDCOUNT  <> 0
            begin
                set @TRANSACTIONIDEALAMOUNT = (@TRANSACTIONSPLITAMOUNT  * @GIFTINKINDSALENUMBEROFUNITS) / @TOTALGIFTINKINDCOUNT;
            end
            else
            begin
                set @TRANSACTIONIDEALAMOUNT = 0;
            end

            --If we aren't on the last split, roll up and convert by proportion using the total applied to the current split.

            if @SPLITCOUNT < @NUMBEROFSPLITS
            begin
                set @TRANSACTIONWEIGHTEDAMOUNT = round(@TRANSACTIONIDEALAMOUNT + @TRANSACTIONSPLITAMOUNTDISTRIBUTEDIDEAL - @TRANSACTIONSPLITAMOUNTDISTRIBUTED, @TRANSACTIONCURRENCYDECIMALDIGITS);

                select
                    @BASEWEIGHTEDAMOUNT = BASEAMOUNT - @BASESPLITAMOUNTDISTRIBUTED,
                    @ORGANIZATIONWEIGHTEDAMOUNT = ORGANIZATIONAMOUNT - @ORGANIZATIONSPLITAMOUNTDISTRIBUTED
                from dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
                    (@TRANSACTIONWEIGHTEDAMOUNT + @TRANSACTIONSPLITAMOUNTDISTRIBUTED),
                    @TRANSACTIONREVENUEAMOUNT,
                    @BASECURRENCYID,
                    @BASEREVENUEAMOUNT,
                    @BASECURRENCYDECIMALDIGITS,
                    @TRANSACTIONCURRENCYID,
                    default,
                    @ORGANIZATIONCURRENCYID,
                    @ORGANIZATIONREVENUEAMOUNT,
                    @ORGANIZATIONCURRENCYDECIMALDIGITS,
                    default
                );

            end
            else --We are on the last split, so roll up and convert by proportion using the total applied to the current Gift-in-kind sale.

            begin
                set @TRANSACTIONWEIGHTEDAMOUNT = round(@TRANSACTIONIDEALAMOUNT + @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTEDIDEAL - @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTED, @TRANSACTIONCURRENCYDECIMALDIGITS);

                select
                    @BASEWEIGHTEDAMOUNT = BASEAMOUNT - @BASEGIFTINKINDSALEAMOUNTDISTRIBUTED,
                    @ORGANIZATIONWEIGHTEDAMOUNT = ORGANIZATIONAMOUNT - @ORGANIZATIONGIFTINKINDSALEAMOUNTDISTRIBUTED
                from dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
                    (@TRANSACTIONWEIGHTEDAMOUNT + @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTED),
                    @TRANSACTIONREVENUEAMOUNT,
                    @BASECURRENCYID,
                    @BASEREVENUEAMOUNT,
                    @BASECURRENCYDECIMALDIGITS,
                    @TRANSACTIONCURRENCYID,
                    default,
                    @ORGANIZATIONCURRENCYID,
                    @ORGANIZATIONREVENUEAMOUNT,
                    @ORGANIZATIONCURRENCYDECIMALDIGITS,
                    default
                );

            end

            --Populate return table

            insert into @SPLITS (
                REVENUESPLITID,
                TRANSACTIONAMOUNT,
                REVENUEID,
                GIFTINKINDSALEID,
                TRANSACTIONSPLITAMOUNT,
                AMOUNT,
                ORGANIZATIONAMOUNT
            )
            values(
                @REVENUESPLITID,
                @TRANSACTIONREVENUEAMOUNT,
                @TRANSACTIONID,
                @GIFTINKINDSALEID,
                @TRANSACTIONWEIGHTEDAMOUNT,
                @BASEWEIGHTEDAMOUNT,
                @ORGANIZATIONWEIGHTEDAMOUNT
            );

            --Update accumulation tables.

            update @SPLITIDEALAMOUNTLIST
            set
                IDEALAMOUNT = @TRANSACTIONSPLITAMOUNTDISTRIBUTEDIDEAL + @TRANSACTIONIDEALAMOUNT,
                TRANSACTIONDISTRIBUTEDAMOUNT = @TRANSACTIONSPLITAMOUNTDISTRIBUTED + @TRANSACTIONWEIGHTEDAMOUNT,
                BASEDISTRIBUTEDAMOUNT = @BASESPLITAMOUNTDISTRIBUTED + @BASEWEIGHTEDAMOUNT,
                ORGANIZATIONDISTRIBUTEDAMOUNT = @ORGANIZATIONSPLITAMOUNTDISTRIBUTED + @ORGANIZATIONWEIGHTEDAMOUNT
            where SPLITID = @REVENUESPLITID 

            update @GIFTINKINDSALEIDEALAMOUNTLIST
            set
                IDEALAMOUNT = @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTEDIDEAL + @TRANSACTIONIDEALAMOUNT,
                TRANSACTIONDISTRIBUTEDAMOUNT = @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTED + @TRANSACTIONWEIGHTEDAMOUNT,
                BASEDISTRIBUTEDAMOUNT = @BASEGIFTINKINDSALEAMOUNTDISTRIBUTED + @BASEWEIGHTEDAMOUNT,
                ORGANIZATIONDISTRIBUTEDAMOUNT = @ORGANIZATIONGIFTINKINDSALEAMOUNTDISTRIBUTED + @ORGANIZATIONWEIGHTEDAMOUNT
            where GIFTINKINDSALEID = @GIFTINKINDSALEID 

            --If we've gone through all the Gift-in-kind sales for the currency split, so reset the Gift-in-kind sale counter and increment the split counter.

            if @GIFTINKINDSALECOUNT >= @NUMBEROFGIFTINKINDSALES
            begin
                set @GIFTINKINDSALECOUNT = 0;
                set @SPLITCOUNT = @SPLITCOUNT + 1;
            end

            fetch next from EXPECTEDAMOUNT_CURSOR into @REVENUESPLITID, @GIFTINKINDSALEID, @TRANSACTIONSPLITAMOUNT, @GIFTINKINDSALENUMBEROFUNITS;
        end

        close EXPECTEDAMOUNT_CURSOR;
        deallocate EXPECTEDAMOUNT_CURSOR;

        --If generating for gain/loss GL, we need to calculate difference between expected and actual amounts.

        if @PAYMENTMETHODCODE in (207, 208)
        begin
            --Table to hold expected amounts so we can clear the return table, as we don't actually want to send back expected amounts.

            declare @EXPECTEDAMOUNTS table
            (
                REVENUESPLITID uniqueidentifier,
                GIFTINKINDSALEID uniqueidentifier,
                EXPECTEDAMOUNT money
            );
            insert into @EXPECTEDAMOUNTS
            select
                REVENUESPLITID,
                GIFTINKINDSALEID,
                TRANSACTIONSPLITAMOUNT
            from @SPLITS

            delete @SPLITS

            --Hold values from revenue gain/loss cursor

            declare @TRANSACTIONGIFTINKINDSALESALEAMOUNT money;
            declare @BASEGIFTINKINDSALESALEAMOUNT money;
            declare @ORGANIZATIONGIFTINKINDSALESALEAMOUNT money;
            declare @TRANSACTIONGIFTINKINDSALESPLITEXPECTEDAMOUNT money;

            --Reset counters.

            set @SPLITCOUNT = 0;
            set @GIFTINKINDSALECOUNT = 1;

            --Clear, then fill tables to hold accumulations with IDs for relevant splits and Gift-in-kind sales.

            delete @SPLITIDEALAMOUNTLIST
            insert into @SPLITIDEALAMOUNTLIST(SPLITID)
            select ID from REVENUESPLIT where REVENUEID = @TRANSACTIONID 

            delete @GIFTINKINDSALEIDEALAMOUNTLIST
            insert into @GIFTINKINDSALEIDEALAMOUNTLIST(GIFTINKINDSALEID)
            select GIFTINKINDSALE.ID
            from dbo.GIFTINKINDSALE with (nolock)
                inner join dbo.GIFTINKINDPAYMENTMETHODDETAIL on GIFTINKINDPAYMENTMETHODDETAIL.ID = GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID
                inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.ID = GIFTINKINDPAYMENTMETHODDETAIL.ID
            where REVENUEPAYMENTMETHOD.REVENUEID = @TRANSACTIONID;

            --Revenue gain/loss cursor will need IDs, split amounts per split, and sale amounts per Gift-in-kind sale.

            --    Order by ensures that we iterate over all the splits with a given Gift-in-kind sale before going to the next Gift-in-kind sale,

            --    which is necessary because we have solid actual amount totals for Gift-in-kind sales, but not splits.

            declare GAINLOSS_CURSOR cursor local fast_forward for
            select 
                REVENUESPLIT.ID,
                GIFTINKINDSALE.ID,
                REVENUESPLIT.TRANSACTIONAMOUNT,
                GIFTINKINDSALE.TRANSACTIONSALEAMOUNT,
                GIFTINKINDSALE.SALEAMOUNT,
                GIFTINKINDSALE.ORGANIZATIONSALEAMOUNT
            from dbo.REVENUE with (nolock)
                inner join dbo.REVENUESPLIT with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
                inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = REVENUE.ID
                inner join dbo.GIFTINKINDPAYMENTMETHODDETAIL on GIFTINKINDPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
                inner join dbo.GIFTINKINDSALE on GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID = GIFTINKINDPAYMENTMETHODDETAIL.ID
            where
                REVENUE.ID = @TRANSACTIONID
            order by GIFTINKINDSALE.ID, REVENUESPLIT.ID

            open GAINLOSS_CURSOR;
            fetch next from GAINLOSS_CURSOR into @REVENUESPLITID, @GIFTINKINDSALEID, @TRANSACTIONSPLITAMOUNT, @TRANSACTIONGIFTINKINDSALESALEAMOUNT, @BASEGIFTINKINDSALESALEAMOUNT, @ORGANIZATIONGIFTINKINDSALESALEAMOUNT;

            while @@FETCH_STATUS = 0 begin
                set @SPLITCOUNT = @SPLITCOUNT + 1;

                --Retrieve accumulated values.

                select
                    @TRANSACTIONSPLITAMOUNTDISTRIBUTEDIDEAL = coalesce(IDEALAMOUNT,0),
                    @TRANSACTIONSPLITAMOUNTDISTRIBUTED = coalesce(TRANSACTIONDISTRIBUTEDAMOUNT,0),
                    @BASESPLITAMOUNTDISTRIBUTED = coalesce(BASEDISTRIBUTEDAMOUNT,0),
                    @ORGANIZATIONSPLITAMOUNTDISTRIBUTED = coalesce(ORGANIZATIONDISTRIBUTEDAMOUNT,0)
                from @SPLITIDEALAMOUNTLIST
                where SPLITID = @REVENUESPLITID 

                select
                    @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTEDIDEAL = coalesce(IDEALAMOUNT,0),
                    @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTED = coalesce(TRANSACTIONDISTRIBUTEDAMOUNT,0),
                    @BASEGIFTINKINDSALEAMOUNTDISTRIBUTED = coalesce(BASEDISTRIBUTEDAMOUNT,0),
                    @ORGANIZATIONGIFTINKINDSALEAMOUNTDISTRIBUTED = coalesce(ORGANIZATIONDISTRIBUTEDAMOUNT,0)
                from @GIFTINKINDSALEIDEALAMOUNTLIST
                where GIFTINKINDSALEID = @GIFTINKINDSALEID 

                --If revenue has an amount, calculate the ideal expected amount in transaction currency

                if @TRANSACTIONREVENUEAMOUNT <> 0
                begin
                    select @TRANSACTIONGIFTINKINDSALESPLITEXPECTEDAMOUNT = EXPECTEDAMOUNT 
                    from @EXPECTEDAMOUNTS 
                    where REVENUESPLITID = @REVENUESPLITID and GIFTINKINDSALEID = @GIFTINKINDSALEID;

                    set @TRANSACTIONIDEALAMOUNT = abs(@TRANSACTIONGIFTINKINDSALESPLITEXPECTEDAMOUNT - (@TRANSACTIONGIFTINKINDSALESALEAMOUNT * @TRANSACTIONSPLITAMOUNT) / @TRANSACTIONREVENUEAMOUNT);
                end
                else
                begin
                    set @TRANSACTIONIDEALAMOUNT = 0;
                end

                --If the ideal amount is 0, then there was no gain/loss, so don't generate GL distributions.

                if @TRANSACTIONIDEALAMOUNT <> 0
                begin
                    --If we aren't on the last Gift-in-kind sale or not all the Gift-in-kind has been sold, roll up and convert by proportion using the total applied to the current Gift-in-kind sale.

                    if @GIFTINKINDSALECOUNT < @NUMBEROFGIFTINKINDSALES or @ALLGIFTINKINDSOLD = 0
                    begin
                        set @TRANSACTIONWEIGHTEDAMOUNT = (ROUND(@TRANSACTIONIDEALAMOUNT + @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTEDIDEAL - @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTED, @TRANSACTIONCURRENCYDECIMALDIGITS));

                        select
                            @BASEWEIGHTEDAMOUNT = BASEAMOUNT - @BASEGIFTINKINDSALEAMOUNTDISTRIBUTED,
                            @ORGANIZATIONWEIGHTEDAMOUNT = ORGANIZATIONAMOUNT - @ORGANIZATIONGIFTINKINDSALEAMOUNTDISTRIBUTED
                        from dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
                            (@TRANSACTIONWEIGHTEDAMOUNT + @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTED),
                            @TRANSACTIONREVENUEAMOUNT,
                            @BASECURRENCYID,
                            @BASEREVENUEAMOUNT,
                            @BASECURRENCYDECIMALDIGITS,
                            @TRANSACTIONCURRENCYID,
                            default,
                            @ORGANIZATIONCURRENCYID,
                            @ORGANIZATIONREVENUEAMOUNT,
                            @ORGANIZATIONCURRENCYDECIMALDIGITS,
                            default
                        );

                    end
                    else --We are on the Gift-in-kind sale and have sold all the Gift-in-kind, so roll up and convert by proportion using the total applied to the current split.

                    begin
                        set @TRANSACTIONWEIGHTEDAMOUNT = (ROUND(@TRANSACTIONIDEALAMOUNT + @TRANSACTIONSPLITAMOUNTDISTRIBUTEDIDEAL - @TRANSACTIONSPLITAMOUNTDISTRIBUTED, @TRANSACTIONCURRENCYDECIMALDIGITS));

                        select
                            @BASEWEIGHTEDAMOUNT = BASEAMOUNT - @BASESPLITAMOUNTDISTRIBUTED,
                            @ORGANIZATIONWEIGHTEDAMOUNT = ORGANIZATIONAMOUNT - @ORGANIZATIONSPLITAMOUNTDISTRIBUTED
                        from dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
                            (@TRANSACTIONWEIGHTEDAMOUNT + @TRANSACTIONSPLITAMOUNTDISTRIBUTED),
                            @TRANSACTIONREVENUEAMOUNT,
                            @BASECURRENCYID,
                            @BASEREVENUEAMOUNT,
                            @BASECURRENCYDECIMALDIGITS,
                            @TRANSACTIONCURRENCYID,
                            default,
                            @ORGANIZATIONCURRENCYID,
                            @ORGANIZATIONREVENUEAMOUNT,
                            @ORGANIZATIONCURRENCYDECIMALDIGITS,
                            default
                        );

                    end

                    --Populate return table

                    insert into @SPLITS (
                        REVENUESPLITID,
                        TRANSACTIONAMOUNT,
                        REVENUEID,
                        GIFTINKINDSALEID,
                        TRANSACTIONSPLITAMOUNT,
                        AMOUNT,
                        ORGANIZATIONAMOUNT
                    )
                    values(
                        @REVENUESPLITID,
                        @TRANSACTIONREVENUEAMOUNT,
                        @TRANSACTIONID,
                        @GIFTINKINDSALEID,
                        @TRANSACTIONWEIGHTEDAMOUNT,
                        @BASEWEIGHTEDAMOUNT,
                        @ORGANIZATIONWEIGHTEDAMOUNT
                    );

                    --Update accumulation tables.

                    update @SPLITIDEALAMOUNTLIST
                    set
                        IDEALAMOUNT = @TRANSACTIONSPLITAMOUNTDISTRIBUTEDIDEAL + @TRANSACTIONIDEALAMOUNT,
                        TRANSACTIONDISTRIBUTEDAMOUNT = @TRANSACTIONSPLITAMOUNTDISTRIBUTED + @TRANSACTIONWEIGHTEDAMOUNT,
                        BASEDISTRIBUTEDAMOUNT = @BASESPLITAMOUNTDISTRIBUTED + @BASEWEIGHTEDAMOUNT,
                        ORGANIZATIONDISTRIBUTEDAMOUNT = @ORGANIZATIONSPLITAMOUNTDISTRIBUTED + @ORGANIZATIONWEIGHTEDAMOUNT
                    where SPLITID = @REVENUESPLITID;

                    update @GIFTINKINDSALEIDEALAMOUNTLIST
                    set
                        IDEALAMOUNT = @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTEDIDEAL + @TRANSACTIONIDEALAMOUNT,
                        TRANSACTIONDISTRIBUTEDAMOUNT = @TRANSACTIONGIFTINKINDSALEAMOUNTDISTRIBUTED + @TRANSACTIONWEIGHTEDAMOUNT,
                        BASEDISTRIBUTEDAMOUNT = @BASEGIFTINKINDSALEAMOUNTDISTRIBUTED + @BASEWEIGHTEDAMOUNT,
                        ORGANIZATIONDISTRIBUTEDAMOUNT = @ORGANIZATIONGIFTINKINDSALEAMOUNTDISTRIBUTED + @ORGANIZATIONWEIGHTEDAMOUNT
                    where GIFTINKINDSALEID = @GIFTINKINDSALEID;
                end

                --If we've gone through all the splits for the currency split, so reset the split counter and increment the Gift-in-kind sale counter.

                if @SPLITCOUNT >= @NUMBEROFSPLITS 
                begin
                    set @SPLITCOUNT = 0;
                    set @GIFTINKINDSALECOUNT = @GIFTINKINDSALECOUNT + 1;
                end

                fetch next from GAINLOSS_CURSOR into @REVENUESPLITID, @GIFTINKINDSALEID, @TRANSACTIONSPLITAMOUNT, @TRANSACTIONGIFTINKINDSALESALEAMOUNT, @BASEGIFTINKINDSALESALEAMOUNT, @ORGANIZATIONGIFTINKINDSALESALEAMOUNT;
            end

            close GAINLOSS_CURSOR;
            deallocate GAINLOSS_CURSOR;
        end
    end
    return;
end