UFN_REVENUE_GETSTOCKDETAILSPLITSBYTRANSACTION

Generates the splits for stock gain/loss and brokerfee 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_GETSTOCKDETAILSPLITSBYTRANSACTION
(
    @TRANSACTIONID uniqueidentifier, 
    @PAYMENTMETHODCODE int
)
returns @SPLITS TABLE
(
    REVENUESPLITID uniqueidentifier,
    AMOUNT money,
    TRANSACTIONAMOUNT money,
    REVENUEID uniqueidentifier,
    STOCKSALEID 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 @TOTALSTOCKCOUNT decimal(21,4);

    declare @SALETRANSACTIONAMOUNT money;
    declare @SALEBASEAMOUNT money;
    declare @SALEORGAMOUNT money;

    select 
        @TRANSACTIONREVENUEAMOUNT = REVENUE.TRANSACTIONAMOUNT,
        @BASEREVENUEAMOUNT = REVENUE.AMOUNT,
        @ORGANIZATIONREVENUEAMOUNT = REVENUE.ORGANIZATIONAMOUNT,
        @TRANSACTIONCURRENCYID = REVENUE.TRANSACTIONCURRENCYID,
        @BASECURRENCYID = REVENUE.BASECURRENCYID,
        @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(),
        @TOTALSTOCKCOUNT = STOCKDETAIL.NUMBEROFUNITS
    from dbo.REVENUE with (nolock) 
        inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = REVENUE.ID
        inner join dbo.STOCKDETAIL on STOCKDETAIL.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 stock sales and units of sold stock for aggregation later.

    declare @NUMBEROFSTOCKSALES int;
    declare @SOLDSTOCKCOUNT decimal(21,4);
    select 
        @NUMBEROFSTOCKSALES = count(STOCKSALE.ID),
        @SOLDSTOCKCOUNT = sum(STOCKSALE.NUMBEROFUNITS)
    from dbo.STOCKSALE with (nolock)
        inner join dbo.STOCKDETAIL on STOCKDETAIL.ID = STOCKSALE.STOCKDETAILID
        inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.ID = STOCKDETAIL.ID
    where REVENUEPAYMENTMETHOD.REVENUEID = @TRANSACTIONID;

    --Has all the stock been sold?

    declare @ALLSTOCKSOLD bit = 0;
    if @SOLDSTOCKCOUNT >= @TOTALSTOCKCOUNT
    begin
        set @ALLSTOCKSOLD = 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 @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL money = 0;
    declare @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED money = 0;
    declare @BASESTOCKSALEAMOUNTDISTRIBUTED money = 0;
    declare @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED money = 0;

    declare @STOCKSALEIDEALAMOUNTLIST table
    (
        STOCKSALEID uniqueidentifier,
        IDEALAMOUNT money,
        TRANSACTIONDISTRIBUTEDAMOUNT money,
        BASEDISTRIBUTEDAMOUNT money,
        ORGANIZATIONDISTRIBUTEDAMOUNT money
    );

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

    --Hold values from all cursors

    declare @REVENUESPLITID uniqueidentifier;
    declare @STOCKSALEID uniqueidentifier;
    declare @TRANSACTIONSPLITAMOUNT money;

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

    if @PAYMENTMETHODCODE in (7, 200, 202)
    begin

        --Hold values from expected amount cursor

        declare @STOCKSALENUMBEROFUNITS decimal(21,4);

        --Fill tables to hold accumulations with IDs for relevant splits and stock sales.

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

        insert into @STOCKSALEIDEALAMOUNTLIST(STOCKSALEID)
        select STOCKSALE.ID
        from dbo.STOCKSALE with (nolock)
            inner join dbo.STOCKDETAIL on STOCKDETAIL.ID = STOCKSALE.STOCKDETAILID
            inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.ID = STOCKDETAIL.ID
        where REVENUEPAYMENTMETHOD.REVENUEID = @TRANSACTIONID;

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

        --    Order by ensures that we iterate over all the stock 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 stock sales.

        declare EXPECTEDAMOUNT_CURSOR cursor local fast_forward for
        select 
            REVENUESPLIT.ID as REVENUESPLITID,
            STOCKSALE.ID as STOCKSALEID,
            REVENUESPLIT.TRANSACTIONAMOUNT,
            STOCKSALE.NUMBEROFUNITS 
            ,STOCKSALE.TRANSACTIONSALEAMOUNT
            ,STOCKSALE.SALEAMOUNT
            ,STOCKSALE.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.STOCKDETAIL on STOCKDETAIL.ID = REVENUEPAYMENTMETHOD.ID
            inner join dbo.STOCKSALE on STOCKSALE.STOCKDETAILID = STOCKDETAIL.ID
        where
            REVENUE.ID = @TRANSACTIONID
        order by REVENUESPLIT.ID, STOCKSALE.ID

        open EXPECTEDAMOUNT_CURSOR;
        fetch next from EXPECTEDAMOUNT_CURSOR into @REVENUESPLITID, @STOCKSALEID, @TRANSACTIONSPLITAMOUNT, @STOCKSALENUMBEROFUNITS, @SALETRANSACTIONAMOUNT, @SALEBASEAMOUNT, @SALEORGAMOUNT;

        while @@FETCH_STATUS = 0 begin
            set @STOCKSALECOUNT = @STOCKSALECOUNT + 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
                @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL = coalesce(IDEALAMOUNT,0),
                @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED = coalesce(TRANSACTIONDISTRIBUTEDAMOUNT,0),
                @BASESTOCKSALEAMOUNTDISTRIBUTED = coalesce(BASEDISTRIBUTEDAMOUNT,0),
                @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED = coalesce(ORGANIZATIONDISTRIBUTEDAMOUNT,0)
            from @STOCKSALEIDEALAMOUNTLIST
            where STOCKSALEID = @STOCKSALEID 

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

            if @TOTALSTOCKCOUNT  <> 0
            begin
                set @TRANSACTIONIDEALAMOUNT = (@TRANSACTIONSPLITAMOUNT  * @STOCKSALENUMBEROFUNITS) / @TOTALSTOCKCOUNT;
            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),
                    @SALETRANSACTIONAMOUNT,
                    @BASECURRENCYID,
                    @SALEBASEAMOUNT,
                    @BASECURRENCYDECIMALDIGITS,
                    @TRANSACTIONCURRENCYID,
                    default,
                    @ORGANIZATIONCURRENCYID,
                    @SALEORGAMOUNT,
                    @ORGANIZATIONCURRENCYDECIMALDIGITS,
                    default
                );

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

            begin
                set @TRANSACTIONWEIGHTEDAMOUNT = ROUND(@TRANSACTIONIDEALAMOUNT + @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL - @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED, @TRANSACTIONCURRENCYDECIMALDIGITS);

                select
                    @BASEWEIGHTEDAMOUNT = BASEAMOUNT - @BASESTOCKSALEAMOUNTDISTRIBUTED,
                    @ORGANIZATIONWEIGHTEDAMOUNT = ORGANIZATIONAMOUNT - @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED
                from dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
                    (@TRANSACTIONWEIGHTEDAMOUNT + @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED),
                    @SALETRANSACTIONAMOUNT,
                    @BASECURRENCYID,
                    @SALEBASEAMOUNT,
                    @BASECURRENCYDECIMALDIGITS,
                    @TRANSACTIONCURRENCYID,
                    default,
                    @ORGANIZATIONCURRENCYID,
                    @SALEORGAMOUNT,
                    @ORGANIZATIONCURRENCYDECIMALDIGITS,
                    default
                );

            end        

            --Populate return table

            insert into @SPLITS (
                REVENUESPLITID,
                TRANSACTIONAMOUNT,
                REVENUEID,
                STOCKSALEID,
                TRANSACTIONSPLITAMOUNT,
                AMOUNT,
                ORGANIZATIONAMOUNT
            )
            values(
                @REVENUESPLITID,
                @TRANSACTIONREVENUEAMOUNT,
                @TRANSACTIONID,
                @STOCKSALEID,
                @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 @STOCKSALEIDEALAMOUNTLIST
            set
                IDEALAMOUNT = @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL + @TRANSACTIONIDEALAMOUNT,
                TRANSACTIONDISTRIBUTEDAMOUNT = @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED + @TRANSACTIONWEIGHTEDAMOUNT,
                BASEDISTRIBUTEDAMOUNT = @BASESTOCKSALEAMOUNTDISTRIBUTED + @BASEWEIGHTEDAMOUNT,
                ORGANIZATIONDISTRIBUTEDAMOUNT = @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED + @ORGANIZATIONWEIGHTEDAMOUNT
            where STOCKSALEID = @STOCKSALEID 

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

            if @STOCKSALECOUNT >= @NUMBEROFSTOCKSALES
            begin
                set @STOCKSALECOUNT = 0;
                set @SPLITCOUNT = @SPLITCOUNT + 1;
            end

            fetch next from EXPECTEDAMOUNT_CURSOR into @REVENUESPLITID, @STOCKSALEID, @TRANSACTIONSPLITAMOUNT, @STOCKSALENUMBEROFUNITS, @SALETRANSACTIONAMOUNT, @SALEBASEAMOUNT, @SALEORGAMOUNT;
        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 (200, 202)
        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,
                STOCKSALEID uniqueidentifier,
                EXPECTEDAMOUNT money
            );
            insert into @EXPECTEDAMOUNTS
            select
                REVENUESPLITID,
                STOCKSALEID,
                TRANSACTIONSPLITAMOUNT
            from @SPLITS

            delete @SPLITS

            --Hold values from gain/loss cursor

            declare @TRANSACTIONSTOCKSALESALEAMOUNT money;
            declare @BASESTOCKSALESALEAMOUNT money;
            declare @ORGANIZATIONSTOCKSALESALEAMOUNT money;
            declare @TRANSACTIONSTOCKSALESPLITEXPECTEDAMOUNT money;

            --Reset counters.

            set @SPLITCOUNT = 0;
            set @STOCKSALECOUNT = 1;

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

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

            delete @STOCKSALEIDEALAMOUNTLIST
            insert into @STOCKSALEIDEALAMOUNTLIST(STOCKSALEID)
            select STOCKSALE.ID
            from dbo.STOCKSALE with (nolock)
                inner join dbo.STOCKDETAIL on STOCKDETAIL.ID = STOCKSALE.STOCKDETAILID
                inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.ID = STOCKDETAIL.ID
            where REVENUEPAYMENTMETHOD.REVENUEID = @TRANSACTIONID;

            --Gain/loss cursor will need IDs, split amounts per split, and sale amounts per stock sale.

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

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

            declare GAINLOSS_CURSOR cursor local fast_forward for
            select 
                REVENUESPLIT.ID,
                STOCKSALE.ID,
                REVENUESPLIT.TRANSACTIONAMOUNT,
                STOCKSALE.TRANSACTIONSALEAMOUNT,
                STOCKSALE.SALEAMOUNT,
                STOCKSALE.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.STOCKDETAIL on STOCKDETAIL.ID = REVENUEPAYMENTMETHOD.ID
                inner join dbo.STOCKSALE on STOCKSALE.STOCKDETAILID = STOCKDETAIL.ID
            where
                REVENUE.ID = @TRANSACTIONID
            order by STOCKSALE.ID, REVENUESPLIT.ID

            open GAINLOSS_CURSOR;
            fetch next from GAINLOSS_CURSOR into @REVENUESPLITID, @STOCKSALEID, @TRANSACTIONSPLITAMOUNT, @TRANSACTIONSTOCKSALESALEAMOUNT, @BASESTOCKSALESALEAMOUNT, @ORGANIZATIONSTOCKSALESALEAMOUNT;

            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
                    @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL = coalesce(IDEALAMOUNT,0),
                    @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED = coalesce(TRANSACTIONDISTRIBUTEDAMOUNT,0),
                    @BASESTOCKSALEAMOUNTDISTRIBUTED = coalesce(BASEDISTRIBUTEDAMOUNT,0),
                    @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED = coalesce(ORGANIZATIONDISTRIBUTEDAMOUNT,0)
                from @STOCKSALEIDEALAMOUNTLIST
                where STOCKSALEID = @STOCKSALEID 

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

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

                    set @TRANSACTIONIDEALAMOUNT = abs(@TRANSACTIONSTOCKSALESPLITEXPECTEDAMOUNT - (@TRANSACTIONSTOCKSALESALEAMOUNT * @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 stock sale or not all the stock has been sold, roll up and convert by proportion using the total applied to the current stock sale.

                    if @STOCKSALECOUNT < @NUMBEROFSTOCKSALES or @ALLSTOCKSOLD = 0
                    begin
                        set @TRANSACTIONWEIGHTEDAMOUNT = (ROUND(@TRANSACTIONIDEALAMOUNT + @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL - @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED, @TRANSACTIONCURRENCYDECIMALDIGITS));

                        select
                            @BASEWEIGHTEDAMOUNT = BASEAMOUNT - @BASESTOCKSALEAMOUNTDISTRIBUTED,
                            @ORGANIZATIONWEIGHTEDAMOUNT = ORGANIZATIONAMOUNT - @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED
                        from dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
                            (@TRANSACTIONWEIGHTEDAMOUNT + @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED),
                            @TRANSACTIONSTOCKSALESALEAMOUNT,
                            @BASECURRENCYID,
                            @BASESTOCKSALESALEAMOUNT,
                            @BASECURRENCYDECIMALDIGITS,
                            @TRANSACTIONCURRENCYID,
                            default,
                            @ORGANIZATIONCURRENCYID,
                            @ORGANIZATIONSTOCKSALESALEAMOUNT,
                            @ORGANIZATIONCURRENCYDECIMALDIGITS,
                            default
                        );

                    end
                    else --We are on the stock sale and have sold all the stock, 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),
                            @TRANSACTIONSTOCKSALESALEAMOUNT,
                            @BASECURRENCYID,
                            @BASESTOCKSALESALEAMOUNT,
                            @BASECURRENCYDECIMALDIGITS,
                            @TRANSACTIONCURRENCYID,
                            default,
                            @ORGANIZATIONCURRENCYID,
                            @ORGANIZATIONSTOCKSALESALEAMOUNT,
                            @ORGANIZATIONCURRENCYDECIMALDIGITS,
                            default
                        );

                    end

                    --Populate return table

                    insert into @SPLITS (
                        REVENUESPLITID,
                        TRANSACTIONAMOUNT,
                        REVENUEID,
                        STOCKSALEID,
                        TRANSACTIONSPLITAMOUNT,
                        AMOUNT,
                        ORGANIZATIONAMOUNT
                    )
                    values(
                        @REVENUESPLITID,
                        @TRANSACTIONREVENUEAMOUNT,
                        @TRANSACTIONID,
                        @STOCKSALEID,
                        @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 @STOCKSALEIDEALAMOUNTLIST
                    set
                        IDEALAMOUNT = @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL + @TRANSACTIONIDEALAMOUNT,
                        TRANSACTIONDISTRIBUTEDAMOUNT = @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED + @TRANSACTIONWEIGHTEDAMOUNT,
                        BASEDISTRIBUTEDAMOUNT = @BASESTOCKSALEAMOUNTDISTRIBUTED + @BASEWEIGHTEDAMOUNT,
                        ORGANIZATIONDISTRIBUTEDAMOUNT = @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED + @ORGANIZATIONWEIGHTEDAMOUNT
                    where STOCKSALEID = @STOCKSALEID;
                end

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

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

                fetch next from GAINLOSS_CURSOR into @REVENUESPLITID, @STOCKSALEID, @TRANSACTIONSPLITAMOUNT, @TRANSACTIONSTOCKSALESALEAMOUNT, @BASESTOCKSALESALEAMOUNT, @ORGANIZATIONSTOCKSALESALEAMOUNT;
            end

            close GAINLOSS_CURSOR;
            deallocate GAINLOSS_CURSOR;
        end

        --select * from @SPLITS

        --order by STOCKSALEID, REVENUESPLITID

    end
    else if @PAYMENTMETHODCODE = 204 --If generating for fees GL, we need to calculate fee amounts.

    begin

        --Hold values from fee cursor

        declare @TRANSACTIONSTOCKSALEFEE money;
        declare @BASESTOCKSALEFEE money;
        declare @ORGANIZATIONSTOCKSALEFEE money;

        --Fill tables to hold accumulations with IDs for relevant stock sales.

        insert into @STOCKSALEIDEALAMOUNTLIST(STOCKSALEID)
        select STOCKSALE.ID
        from dbo.STOCKSALE with (nolock)
            inner join dbo.STOCKDETAIL on STOCKDETAIL.ID = STOCKSALE.STOCKDETAILID
            inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.ID = STOCKDETAIL.ID
        where REVENUEPAYMENTMETHOD.REVENUEID = @TRANSACTIONID;

        --Fee cursor will need IDs, split amounts per split, and fees per stock sale.

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

        --    which is necessary because we have solid actual fee totals for stock sales, but not splits.

        declare FEE_CURSOR cursor local fast_forward for
        select 
            REVENUESPLIT.ID,
            STOCKSALE.ID,
            REVENUESPLIT.TRANSACTIONAMOUNT,
            STOCKSALE.TRANSACTIONFEE,
            STOCKSALE.FEE,
            STOCKSALE.ORGANIZATIONFEE
        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.STOCKDETAIL on STOCKDETAIL.ID = REVENUEPAYMENTMETHOD.ID
            inner join dbo.STOCKSALE on STOCKSALE.STOCKDETAILID = STOCKDETAIL.ID
        where
            REVENUE.ID = @TRANSACTIONID
        order by STOCKSALE.ID, REVENUESPLIT.ID

        open FEE_CURSOR;
        fetch next from FEE_CURSOR into @REVENUESPLITID, @STOCKSALEID, @TRANSACTIONSPLITAMOUNT, @TRANSACTIONSTOCKSALEFEE, @BASESTOCKSALEFEE, @ORGANIZATIONSTOCKSALEFEE;

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

            --Retrieve accumulated values.

            select
                @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL = coalesce(IDEALAMOUNT,0),
                @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED = coalesce(TRANSACTIONDISTRIBUTEDAMOUNT,0),
                @BASESTOCKSALEAMOUNTDISTRIBUTED = coalesce(BASEDISTRIBUTEDAMOUNT,0),
                @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED = coalesce(ORGANIZATIONDISTRIBUTEDAMOUNT,0)
            from @STOCKSALEIDEALAMOUNTLIST
            where STOCKSALEID = @STOCKSALEID

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

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

            set @TRANSACTIONWEIGHTEDAMOUNT = ROUND(@TRANSACTIONIDEALAMOUNT + @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL - @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED, @TRANSACTIONCURRENCYDECIMALDIGITS);

            select
                @BASEWEIGHTEDAMOUNT = BASEAMOUNT - @BASESTOCKSALEAMOUNTDISTRIBUTED,
                @ORGANIZATIONWEIGHTEDAMOUNT = ORGANIZATIONAMOUNT - @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED
            from dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
                (@TRANSACTIONWEIGHTEDAMOUNT + @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED),
                @TRANSACTIONSTOCKSALEFEE,
                @BASECURRENCYID,
                @BASESTOCKSALEFEE,
                @BASECURRENCYDECIMALDIGITS,
                @TRANSACTIONCURRENCYID,
                default,
                @ORGANIZATIONCURRENCYID,
                @ORGANIZATIONSTOCKSALEFEE,
                @ORGANIZATIONCURRENCYDECIMALDIGITS,
                default
            );

            --Populate return table

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

            --Update accumulation tables.            

            update @STOCKSALEIDEALAMOUNTLIST
            set
                IDEALAMOUNT = @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTEDIDEAL + @TRANSACTIONIDEALAMOUNT,
                TRANSACTIONDISTRIBUTEDAMOUNT = @TRANSACTIONSTOCKSALEAMOUNTDISTRIBUTED + @TRANSACTIONWEIGHTEDAMOUNT,
                BASEDISTRIBUTEDAMOUNT = @BASESTOCKSALEAMOUNTDISTRIBUTED + @BASEWEIGHTEDAMOUNT,
                ORGANIZATIONDISTRIBUTEDAMOUNT = @ORGANIZATIONSTOCKSALEAMOUNTDISTRIBUTED + @ORGANIZATIONWEIGHTEDAMOUNT
            where STOCKSALEID = @STOCKSALEID;

            fetch next from FEE_CURSOR into @REVENUESPLITID, @STOCKSALEID, @TRANSACTIONSPLITAMOUNT, @TRANSACTIONSTOCKSALEFEE, @BASESTOCKSALEFEE, @ORGANIZATIONSTOCKSALEFEE;
        end

        close FEE_CURSOR;
        deallocate FEE_CURSOR;

        --select * from @SPLITS

        --order by STOCKSALEID, REVENUESPLITID

    end

    return;
end