UFN_REVENUE_GENERATEAUCTIONPURCHASEGLDISTRIBUTION_2

Generates GL Account Code for auction purchases from the account code mappings defined in the system.

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@IGNOREREVENUEID uniqueidentifier IN

Definition

Copy


            CREATE function dbo.UFN_REVENUE_GENERATEAUCTIONPURCHASEGLDISTRIBUTION_2
            (
                @REVENUEID uniqueidentifier,
                @IGNOREREVENUEID uniqueidentifier
            )
            returns @DISTRIBUTIONS table
            (
                REVENUEID uniqueidentifier,
                GLPAYMENTMETHODREVENUETYPEMAPPINGID uniqueidentifier,
                TRANSACTIONTYPECODE tinyint,
                POSTDATE datetime,
                POSTSTATUSCODE tinyint,
                ACCOUNTSTRING nvarchar(100),
                PROJECT nvarchar(100),
                AMOUNT money,
                REFERENCE nvarchar(255),
                ERRORMESSAGE nvarchar(max),
                PAYMENTMETHODCODE tinyint,
                REVENUETRANSACTIONTYPECODE tinyint,
                ACCOUNTID uniqueidentifier,
                REVENUESPLITTYPECODE tinyint,
                AUCTIONITEMVALUE money,
                AUCTIONITEMPOSTSTATUSCODE tinyint,
                REVENUEPURCHASEID uniqueidentifier,
                AUCTIONITEMPURCHASEAMOUNT money,
                REVENUESPLITAMOUNT money,
                REVENUESPLITTRANSACTIONAMOUNT money,
                REVENUESPLITORGANIZATIONAMOUNT money,
                AUCTIONITEMTRANSACTIONPURCHASEAMOUNT money,
                AUCTIONITEMORGANIZATIONPURCHASEAMOUNT money,
                TRANSACTIONAMOUNT money,
                ORGANIZATIONAMOUNT money,
                BASECURRENCYID uniqueidentifier,
                TRANSACTIONCURRENCYID uniqueidentifier,
                BASEEXCHANGERATEID uniqueidentifier,
                ORGANIZATIONEXCHANGERATEID uniqueidentifier,
                AUCTIONITEMDONATIONDATE datetime,
                MAPPEDVALUES xml,
                REVENUESPLITID uniqueidentifier
            )
            as
                begin

                    -- Currently, we only take payments for auction item donations in the same currencies and PDACCOUNTSYSTEM

                    -- as the initial auction item donation.


                    --The distributions for auction items/auction item purchases are different than

                    --everything else in the system.  Auction items can be purchased by multiple

                    --revenue transactions, and we have to calculate a all distributions based off of all

                    --the postable payments towards the auction item.

                    --When one payment changes, we must re-calculate all of the distributions!!


                    --If the @IGNOREREVENUEID is not null, then we do not count any revenue towards auction items

                    --with that ID


                    declare @ORGANIZATIONCURRENCYDECIMALDIGITS int;
                    declare @ORGANIZATIONCURRENCYID uniqueidentifier;
                    declare @ORGANIZATIONAMOUNTORIGINCODE tinyint;

                    select
                        @ORGANIZATIONCURRENCYID = CURRENCY.ID,
                        @ORGANIZATIONCURRENCYDECIMALDIGITS = CURRENCY.DECIMALDIGITS
                    from dbo.CURRENCY
                    where ID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()

                    select top 1
                        @ORGANIZATIONAMOUNTORIGINCODE = ORGANIZATIONAMOUNTORIGINCODE
                    from
                        dbo.MULTICURRENCYCONFIGURATION;

                    declare @AUCTIONITEMS table
                    (
                        ID uniqueidentifier,
                        REVENUEAUCTIONDONATIONID uniqueidentifier,
                        VALUE decimal(20,8),
                        DONOTPOST tinyint,
                        PAYMENTCOUNT int,
                        TRANSACTIONCURRENCYID uniqueidentifier,
                        BASECURRENCYID uniqueidentifier,
                        TRANSACTIONVALUE money,
                        ORGANIZATIONVALUE money,
                        BASECURRENCYDECIMALDIGITS int,
                        TRANSACTIONCURRENCYDECIMALDIGITS int
                    )

                    --Start by finding all items that are affected by this payment

                    insert into @AUCTIONITEMS
                    select 
                        AUCTIONITEM.ID,
                        AUCTIONITEM.REVENUEAUCTIONDONATIONID,
                        AUCTIONITEM.VALUE,
                        REVENUE.DONOTPOST,
             count(AUCTIONITEMREVENUEPURCHASE.ID),
                        AUCTIONITEM.TRANSACTIONCURRENCYID,
                        AUCTIONITEM.BASECURRENCYID,
                        AUCTIONITEM.TRANSACTIONVALUE,
                        AUCTIONITEM.ORGANIZATIONVALUE,
                        BASE_CURRENCY.DECIMALDIGITS,
                        TRANSACTION_CURRENCY.DECIMALDIGITS
                    from 
                        dbo.AUCTIONITEMREVENUEPURCHASE
                        inner join dbo.AUCTIONITEM on AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID = AUCTIONITEM.ID
                        inner join dbo.REVENUE on AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID = REVENUE.ID
                        left join dbo.REVENUEPOSTED on REVENUE.ID = REVENUEPOSTED.ID
                        left join dbo.CURRENCY BASE_CURRENCY on AUCTIONITEM.BASECURRENCYID = BASE_CURRENCY.ID
                        left join dbo.CURRENCY TRANSACTION_CURRENCY on AUCTIONITEM.TRANSACTIONCURRENCYID = TRANSACTION_CURRENCY.ID
                    where
                        AUCTIONITEM.ID in (select AUCTIONITEMID from dbo.AUCTIONITEMREVENUEPURCHASE [AUCTIONITEMPURCHASE] where [AUCTIONITEMPURCHASE].REVENUEPURCHASEID = @REVENUEID)
                        and AUCTIONITEM.TYPECODE = 0
                        and (@IGNOREREVENUEID is null or REVENUE.ID <> @IGNOREREVENUEID)
                    group by AUCTIONITEM.ID,AUCTIONITEM.REVENUEAUCTIONDONATIONID,AUCTIONITEM.VALUE,REVENUE.DONOTPOST,
                            AUCTIONITEM.TRANSACTIONCURRENCYID,AUCTIONITEM.BASECURRENCYID,AUCTIONITEM.TRANSACTIONVALUE,AUCTIONITEM.ORGANIZATIONVALUE,
                            BASE_CURRENCY.DECIMALDIGITS,TRANSACTION_CURRENCY.DECIMALDIGITS

                    -- Create a cursor to generate new distributions for affected items/payments

                    -- We do that by finding all payment records that helped pay for the items

                    declare @AUCTIONITEM_CURRENTPAYMENTCOUNT int = 0;

                    -- Variables to keep track of "wash" distribution amounts

                    declare @ITEM_TRANSACTIONAMOUNT_TO_DISTRIBUTE money = 0;
                    declare @ITEM_AMOUNT_TO_DISTRIBUTE money = 0;
                    declare @ITEM_ORGANIZATIONAMOUNT_TO_DISTRIBUTE money = 0;
                    declare @DISTRIBUTED_ITEM_TRANSACTIONAMOUNT money = 0;
                    declare @DISTRIBUTED_ITEM_AMOUNT money = 0;
                    declare @DISTRIBUTED_ITEM_ORGANIZATIONAMOUNT money = 0;
                    declare @TOTALDISTRIBUTED_ITEM_TRANSACTIONAMOUNT money = 0;
                    declare @TOTALDISTRIBUTED_ITEM_AMOUNT money = 0;
                    declare @TOTALDISTRIBUTED_ITEM_ORGANIZATIONAMOUNT money = 0;

                    -- Variables to keep track of gain/loss amounts

                    declare @TOTALBASEGAINLOSS money = 0;
                    declare @TOTALORGANIZATIONGAINLOSS money = 0;
                    declare @GAINLOSS_TRANSACTIONAMOUNT_TO_DISTRIBUTE money = 0;
                    --declare @GAINLOSS_AMOUNT_TO_DISTRIBUTE money = 0;

                    --declare @GAINLOSS_ORGANIZATIONAMOUNT_TO_DISTRIBUTE money = 0;

                    declare @DISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT money = 0;
                    declare @DISTRIBUTED_GAINLOSS_AMOUNT money = 0;
                    declare @DISTRIBUTED_GAINLOSS_ORGANIZATIONAMOUNT money = 0;
                    declare @TOTALDISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT money = 0;
                    declare @TOTALDISTRIBUTED_GAINLOSS_AMOUNT money = 0;
                    declare @TOTALDISTRIBUTED_GAINLOSS_ORGANIZATIONAMOUNT money = 0;

                    -- Variables to keep track of currency gain/loss amounts

                    declare @TOTALITEMBASEGAINLOSS money = 0;
                    declare @TOTALITEMORGANIZATIONGAINLOSS money = 0;
                    declare @TOTALBASECURRENCYGAINLOSS money = 0;
                    declare @TOTALORGANIZATIONCURRENCYGAINLOSS money = 0;
                    declare @DISTRIBUTED_CURRENCYGAINLOSS_AMOUNT money = 0;
                    declare @DISTRIBUTED_CURRENCYGAINLOSS_ORGANIZATIONAMOUNT money = 0;
                    declare @TOTALDISTRIBUTED_CURRENCYGAINLOSS_AMOUNT money = 0;
                    declare @TOTALDISTRIBUTED_CURRENCYGAINLOSS_ORGANIZATIONAMOUNT money = 0;

                    -- Variables for the payment/item cursor

                    declare @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID uniqueidentifier,@PAYMENTCURSOR_REVENUEPURCHASEID uniqueidentifier, @PAYMENTCURSOR_AUCTIONITEMID uniqueidentifier, @PAYMENTCURSOR_PAYMENTCOUNT integer;
                    declare @PAYMENTCURSOR_ITEMTRANSACTIONCURRENCYID uniqueidentifier, @PAYMENTCURSOR_ITEMBASECURRENCYID uniqueidentifier;
                    declare @PAYMENTCURSOR_ITEMVALUE money, @PAYMENTCURSOR_ITEMTRANSACTIONVALUE money, @PAYMENTCURSOR_ITEMORGANIZATIONVALUE money;
                    declare @PAYMENTCURSOR_ITEMBASECURRENCYDECIMALDIGITS int, @PAYMENTCURSOR_ITEMTRANSACTIONCURRENCYDECIMALDIGITS int;

                    declare PAYMENTCURSOR cursor local fast_forward
                    for select 
                            AUCTIONITEMS.REVENUEAUCTIONDONATIONID,
                            AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID, 
                            AUCTIONITEMS.ID, 
                            AUCTIONITEMS.PAYMENTCOUNT, 
                            AUCTIONITEMS.TRANSACTIONCURRENCYID, 
                            AUCTIONITEMS.BASECURRENCYID,
                            AUCTIONITEMS.VALUE,
                            AUCTIONITEMS.TRANSACTIONVALUE,
                            AUCTIONITEMS.ORGANIZATIONVALUE,
                            AUCTIONITEMS.BASECURRENCYDECIMALDIGITS,
                            AUCTIONITEMS.TRANSACTIONCURRENCYDECIMALDIGITS
                        from
                            @AUCTIONITEMS AUCTIONITEMS
                            inner join dbo.AUCTIONITEMREVENUEPURCHASE on AUCTIONITEMS.ID = AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID
                        where
                            ((@IGNOREREVENUEID is null) or (AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID <> @IGNOREREVENUEID))
                        order by AUCTIONITEMS.ID, AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID

                    open PAYMENTCURSOR
                    fetch next from PAYMENTCURSOR into 
                        @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID,@PAYMENTCURSOR_REVENUEPURCHASEID,@PAYMENTCURSOR_AUCTIONITEMID,
                        @PAYMENTCURSOR_PAYMENTCOUNT,@PAYMENTCURSOR_ITEMTRANSACTIONCURRENCYID,@PAYMENTCURSOR_ITEMBASECURRENCYID,
                        @PAYMENTCURSOR_ITEMVALUE,@PAYMENTCURSOR_ITEMTRANSACTIONVALUE,@PAYMENTCURSOR_ITEMORGANIZATIONVALUE,
                        @PAYMENTCURSOR_ITEMBASECURRENCYDECIMALDIGITS, @PAYMENTCURSOR_ITEMTRANSACTIONCURRENCYDECIMALDIGITS

                    while @@FETCH_STATUS = 0
                    begin

                        -- Keep track of the payment count

                        select @AUCTIONITEM_CURRENTPAYMENTCOUNT = @AUCTIONITEM_CURRENTPAYMENTCOUNT + 1;

                        -- Generate the distribution rows for the payment/item

                        -- We do not generate the amounts for the distributions here.  We handle this

                        -- below to ensure no rounding issues, and proper conversions.

                        insert into @DISTRIBUTIONS
                        (
                            REVENUEID,
                            GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                            TRANSACTIONTYPECODE,
                            POSTDATE,
                            POSTSTATUSCODE,
                            ACCOUNTSTRING,
                            PROJECT,
                            AMOUNT,
                            REFERENCE,
                            ERRORMESSAGE,
                            PAYMENTMETHODCODE,
                            REVENUETRANSACTIONTYPECODE,
                   ACCOUNTID,
                            REVENUESPLITTYPECODE,
                            AUCTIONITEMVALUE,
                            AUCTIONITEMPOSTSTATUSCODE,
                            REVENUEPURCHASEID,
                            AUCTIONITEMPURCHASEAMOUNT,
                            REVENUESPLITAMOUNT,
                            REVENUESPLITTRANSACTIONAMOUNT,
                            REVENUESPLITORGANIZATIONAMOUNT,
                            AUCTIONITEMTRANSACTIONPURCHASEAMOUNT,
                            AUCTIONITEMORGANIZATIONPURCHASEAMOUNT,
                            BASECURRENCYID,
                            TRANSACTIONCURRENCYID,
                            BASEEXCHANGERATEID,
                            ORGANIZATIONEXCHANGERATEID,
                            AUCTIONITEMDONATIONDATE,
                            MAPPEDVALUES,
                            REVENUESPLITID
                        )
                        select 
                            AUCTIONITEM.REVENUEAUCTIONDONATIONID as REVENUEID, 
                            dbo.UFN_POSTTOGLPROCESS_GETGLPAYMENTMETHODREVENUETYPEMAPPINGID(REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE, REVENUE.TRANSACTIONTYPECODE, CODES.REVENUESPLITTYPECODE, 12, tf.TRANSACTIONTYPECODE) as GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                            tf.TRANSACTIONTYPECODE, 
                            REVENUE.POSTDATE,
                            case when REVENUE.DONOTPOST = 1 then 2 when REVENUEPOSTED.ID is not null then 0 else 1 end as POSTSTATUSCODE,
                            tf.ACCOUNTSTRING, 
                            tf.PROJECTCODE as PROJECT,
                            0 as AMOUNT,  -- We figure this below to ensure no rounding issues

                            dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, REVENUEPAYMENTMETHOD.PAYMENTMETHOD, CODES.REVENUESPLITTYPE) as REFERENCE,
                            tf.ERRORMESSAGE,
                            REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE,
                            REVENUE.TRANSACTIONTYPECODE as REVENUETRANSACTIONTYPECODE,
                            tf.ACCOUNTID as ACCOUNTID,
                            CODES.REVENUESPLITTYPECODE,
                            AUCTIONITEM.VALUE as AUCTIONITEMVALUE,
                            case 
                                when AUCTIONITEMDONATION.DONOTPOST = 1 then 2 
                                when AUCTIONITEMDONATIONPOSTED.ID is not null then 0 
                                else 1 
                            end as AUCTIONITEMPOSTSTATUSCODE,
                            REVENUE.ID as REVENUEPURCHASEID,
                            case
                                when @IGNOREREVENUEID is null then
                                    PURCHASEPRICE.AMOUNT
                                when @IGNOREREVENUEID is not null then
                                    PURCHASEPRICEIGNOREREVENUE.AMOUNT
                            end as AUCTIONITEMPURCHASEAMOUNT,
                            REVENUESPLIT.AMOUNT,
                            REVENUESPLIT.TRANSACTIONAMOUNT,
                            REVENUESPLIT.ORGANIZATIONAMOUNT,
                            case
                                when @IGNOREREVENUEID is null then
                                    PURCHASEPRICE.TRANSACTIONAMOUNT
                                when @IGNOREREVENUEID is not null then
                                    PURCHASEPRICEIGNOREREVENUE.TRANSACTIONAMOUNT
                            end as AUCTIONITEMTRANSACTIONPURCHASEAMOUNT,
                            case
                                when @IGNOREREVENUEID is null then
                                    PURCHASEPRICE.ORGANIZATIONAMOUNT
                                when @IGNOREREVENUEID is not null then
                                    PURCHASEPRICEIGNOREREVENUE.ORGANIZATIONAMOUNT
                            end as AUCTIONITEMORGANIZATIONPURCHASEAMOUNT,
                            case    
                                when CODES.REVENUESPLITTYPECODE = 12 then AUCTIONITEM.BASECURRENCYID
                                when CODES.REVENUESPLITTYPECODE in (203, 204) then coalesce(REVENUESPLIT.BASECURRENCYID, REVENUE.BASECURRENCYID)
                            end as BASECURRENCYID,
                            case    
                            when CODES.REVENUESPLITTYPECODE = 12 then AUCTIONITEM.TRANSACTIONCURRENCYID
                                when CODES.REVENUESPLITTYPECODE in (203, 204) then coalesce(REVENUESPLIT.TRANSACTIONCURRENCYID, REVENUE.TRANSACTIONCURRENCYID)
                            end as TRANSACTIONCURRENCYID,
                            AUCTIONITEM.BASEEXCHANGERATEID as BASEEXCHANGERATEID,
                            AUCTIONITEM.ORIGINTOORGANIZATIONEXCHANGERATEID as ORGANIZATIONEXCHANGERATEID,
                            AUCTIONITEMDONATION.DATE,
                            tf.MAPPEDVALUES,
                            REVENUESPLIT.ID
                        from 
                            dbo.REVENUE with (nolock)            
                            inner join dbo.REVENUEPAYMENTMETHOD with (nolock) on REVENUE.ID = REVENUEPAYMENTMETHOD.REVENUEID
                            left join dbo.REVENUEPOSTED with (nolock) on REVENUEPOSTED.ID = REVENUE.ID
                            inner join dbo.REVENUESPLIT with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
                            inner join dbo.AUCTIONITEMPURCHASE with (nolock) on AUCTIONITEMPURCHASE.PURCHASEID = REVENUESPLIT.ID
                            inner join dbo.AUCTIONITEM with (nolock) on AUCTIONITEM.ID = AUCTIONITEMPURCHASE.AUCTIONITEMID
                            inner join dbo.REVENUE as AUCTIONITEMDONATION with (nolock) on AUCTIONITEM.REVENUEAUCTIONDONATIONID = AUCTIONITEMDONATION.ID
                            left join dbo.REVENUEPOSTED as AUCTIONITEMDONATIONPOSTED with (nolock) on AUCTIONITEMDONATIONPOSTED.ID = AUCTIONITEMDONATION.ID
                            cross join 
                                ( 
                                    select '12' as REVENUESPLITTYPECODE, 'Auction purchase' as REVENUESPLITTYPE, 'Payment' as REVENUETYPE, '0' as REVENUETYPECODE
                                        union all
                                    select '203' as REVENUESPLITTYPECODE, 'Auction purchase gain' AS REVENUESPLITTYPE, 'Payment' as REVENUETYPE, '0' as REVENUETYPECODE
                                        union all  
                                    select '204' as REVENUESPLITTYPECODE, 'Auction purchase loss' AS REVENUESPLITTYPE, 'Payment' as REVENUETYPE, '0' as REVENUETYPECODE
                                ) as CODES
                            cross apply dbo.UFN_REVENUE_GENERATEGLACCOUNT(REVENUESPLIT.ID, REVENUE.TRANSACTIONTYPECODE, CODES.REVENUESPLITTYPECODE, REVENUESPLIT.APPLICATIONCODE, REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE, null) as tf
                            cross apply dbo.UFN_AUCTIONITEM_GETPOSTABLEPURCHASEAMOUNT(AUCTIONITEM.ID, null) as PURCHASEPRICE
                            cross apply dbo.UFN_AUCTIONITEM_GETPOSTABLEPURCHASEAMOUNT(AUCTIONITEM.ID, @IGNOREREVENUEID) as PURCHASEPRICEIGNOREREVENUE
                        where 
                            (REVENUE.ID = @PAYMENTCURSOR_REVENUEPURCHASEID)
                            and
                            (@IGNOREREVENUEID is null or (REVENUE.ID <> @IGNOREREVENUEID))
                            and
                            (AUCTIONITEM.ID = @PAYMENTCURSOR_AUCTIONITEMID)
                            and 
                            (   
                                (@IGNOREREVENUEID is null and CODES.REVENUESPLITTYPECODE = 203 and tf.TRANSACTIONTYPECODE = 1 and AUCTIONITEM.TRANSACTIONVALUE < PURCHASEPRICE.TRANSACTIONAMOUNT)    -- Gain

                                or
                                (@IGNOREREVENUEID is not null and CODES.REVENUESPLITTYPECODE = 203 and tf.TRANSACTIONTYPECODE = 1 and AUCTIONITEM.TRANSACTIONVALUE < PURCHASEPRICEIGNOREREVENUE.TRANSACTIONAMOUNT)    -- Gain

                                or
                                (@IGNOREREVENUEID is null and CODES.REVENUESPLITTYPECODE = 204 and tf.TRANSACTIONTYPECODE = 0 and AUCTIONITEM.TRANSACTIONVALUE > PURCHASEPRICE.TRANSACTIONAMOUNT)    -- Loss

                                or
                                (@IGNOREREVENUEID is not null and CODES.REVENUESPLITTYPECODE = 204 and tf.TRANSACTIONTYPECODE = 0 and AUCTIONITEM.TRANSACTIONVALUE > PURCHASEPRICEIGNOREREVENUE.TRANSACTIONAMOUNT)    -- Loss

                                or
                                (CODES.REVENUESPLITTYPECODE = 12)
                            )
                            and
                            (REVENUE.DONOTPOST <> 1)

            declare @BASECURRENCYID uniqueidentifier
                        declare @TRANSACTIONCURRENCYID uniqueidentifier
                        declare @BASEEXCHANGERATEID uniqueidentifier
                        declare @ORGEXCHANGERATEID uniqueidentifier

                        --Figure the distribution amounts here                        

                        if @AUCTIONITEM_CURRENTPAYMENTCOUNT = 1
                        begin

                            -- If this is the first payment towards an item, find the "wash" and gain/loss amounts that need to be

                            -- distributed across all payments towards an item.


                            -- The "wash" distributions need to be for the exact amounts as the original auction item donation.

                            -- So, we set the amount to distribute equal to the item values.

                            select @ITEM_TRANSACTIONAMOUNT_TO_DISTRIBUTE = @PAYMENTCURSOR_ITEMTRANSACTIONVALUE;
                            select @ITEM_AMOUNT_TO_DISTRIBUTE = @PAYMENTCURSOR_ITEMVALUE;
                            select @ITEM_ORGANIZATIONAMOUNT_TO_DISTRIBUTE = @PAYMENTCURSOR_ITEMORGANIZATIONVALUE;

                            -- The gain/loss distributions need to use the same currencies and exchange rates as the original auction

                            -- item donation.  The gain/loss amounts for currency exchange rate changes are done elsewhere.

                            select top 1
                                @GAINLOSS_TRANSACTIONAMOUNT_TO_DISTRIBUTE = abs(DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT - @PAYMENTCURSOR_ITEMTRANSACTIONVALUE),
                                @TOTALBASEGAINLOSS = abs(DISTRIBUTIONS.AUCTIONITEMPURCHASEAMOUNT - @PAYMENTCURSOR_ITEMVALUE),
                                @TOTALORGANIZATIONGAINLOSS = abs(DISTRIBUTIONS.AUCTIONITEMORGANIZATIONPURCHASEAMOUNT - @PAYMENTCURSOR_ITEMORGANIZATIONVALUE),
                                @TOTALBASECURRENCYGAINLOSS = case
                                                                when DISTRIBUTIONS.BASEEXCHANGERATEID is not null then
                                                                    abs(DISTRIBUTIONS.AUCTIONITEMPURCHASEAMOUNT - (select dbo.UFN_AUCTIONPACKAGE_CONVERT_UNROUNDED(DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, DISTRIBUTIONS.BASEEXCHANGERATEID)))
                                                                else
                                                                    0
                                                            end,                                            
                                @TOTALORGANIZATIONCURRENCYGAINLOSS = case
                                                                        when DISTRIBUTIONS.ORGANIZATIONEXCHANGERATEID is not null then
                                                                            abs(DISTRIBUTIONS.AUCTIONITEMORGANIZATIONPURCHASEAMOUNT - (select dbo.UFN_AUCTIONPACKAGE_CONVERTTOORGANIZATIONCURRENCY_UNROUNDED(DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, DISTRIBUTIONS.ORGANIZATIONEXCHANGERATEID, DISTRIBUTIONS.AUCTIONITEMPURCHASEAMOUNT)))
                                                                        when DISTRIBUTIONS.BASEEXCHANGERATEID is not null then
                                                                            abs(DISTRIBUTIONS.AUCTIONITEMPURCHASEAMOUNT - (select dbo.UFN_AUCTIONPACKAGE_CONVERT_UNROUNDED(DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, DISTRIBUTIONS.BASEEXCHANGERATEID)))
                                                                        else
                                                                            0                                                                        
                                                                    end            
                            from 
                                @DISTRIBUTIONS DISTRIBUTIONS
                            where 
                                DISTRIBUTIONS.REVENUEPURCHASEID = @PAYMENTCURSOR_REVENUEPURCHASEID 
                                and DISTRIBUTIONS.REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID 

                            select @TOTALITEMBASEGAINLOSS = abs(@TOTALBASEGAINLOSS - @TOTALBASECURRENCYGAINLOSS)
                            select @TOTALITEMORGANIZATIONGAINLOSS = abs(@TOTALORGANIZATIONGAINLOSS - @TOTALORGANIZATIONCURRENCYGAINLOSS)

                        end

                        declare @TEMP_BASEGAINLOSS money = 0;
                        declare @TEMP_ORGANIZATIONGAINLOSS money = 0;
                        select 
                            @TEMP_BASEGAINLOSS = dbo.UFN_AUCTIONPACKAGE_CONVERTBYPROPORTION_UNROUNDED(DISTRIBUTIONS.REVENUESPLITTRANSACTIONAMOUNT, DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, @TOTALBASEGAINLOSS, @PAYMENTCURSOR_ITEMBASECURRENCYDECIMALDIGITS),
                            @TEMP_ORGANIZATIONGAINLOSS = dbo.UFN_AUCTIONPACKAGE_CONVERTBYPROPORTION_UNROUNDED(DISTRIBUTIONS.REVENUESPLITTRANSACTIONAMOUNT, DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, @TOTALORGANIZATIONGAINLOSS, @ORGANIZATIONCURRENCYDECIMALDIGITS)
                                                        ,@BASECURRENCYID = DISTRIBUTIONS.BASECURRENCYID
                            ,@TRANSACTIONCURRENCYID = DISTRIBUTIONS.TRANSACTIONCURRENCYID
                            ,@BASEEXCHANGERATEID = DISTRIBUTIONS.BASEEXCHANGERATEID
                            ,@ORGEXCHANGERATEID = DISTRIBUTIONS.ORGANIZATIONEXCHANGERATEID
                        from
                            @DISTRIBUTIONS DISTRIBUTIONS
                        where
                            DISTRIBUTIONS.REVENUEPURCHASEID = @PAYMENTCURSOR_REVENUEPURCHASEID 
                            and DISTRIBUTIONS.REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID


                        if @PAYMENTCURSOR_PAYMENTCOUNT <> @AUCTIONITEM_CURRENTPAYMENTCOUNT
                        begin

                           -- If this is not the last payment, we need to calculate the distribution amounts.

                           -- The "wash" and gain/loss amounts are proportions of the payment amount towards 

                           -- the entire purchase amount of the auction item donation.


                           -- Example:  If 3 payment pay for an item... One payment is half the total purchase price, and the

                           --           other two payments are for one quarter of the total purchase price... The payment

                           --           for half the total purchase price needs to receive half of the "wash" and gain/loss

                           --           amounts (if gain/loss exists).  The other payments will receive one quarter of the

                           --           "wash" and gain/loss amounts.


                            select top 1
                                @DISTRIBUTED_ITEM_TRANSACTIONAMOUNT = dbo.UFN_AUCTIONPACKAGE_CONVERTBYPROPORTION_UNROUNDED(DISTRIBUTIONS.REVENUESPLITTRANSACTIONAMOUNT, DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, @ITEM_TRANSACTIONAMOUNT_TO_DISTRIBUTE, @PAYMENTCURSOR_ITEMTRANSACTIONCURRENCYDECIMALDIGITS),
                                @DISTRIBUTED_ITEM_AMOUNT = dbo.UFN_AUCTIONPACKAGE_CONVERTBYPROPORTION_UNROUNDED(DISTRIBUTIONS.REVENUESPLITTRANSACTIONAMOUNT, DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, @ITEM_AMOUNT_TO_DISTRIBUTE, @PAYMENTCURSOR_ITEMBASECURRENCYDECIMALDIGITS),
                                @DISTRIBUTED_ITEM_ORGANIZATIONAMOUNT = dbo.UFN_AUCTIONPACKAGE_CONVERTBYPROPORTION_UNROUNDED(DISTRIBUTIONS.REVENUESPLITTRANSACTIONAMOUNT, DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, @ITEM_ORGANIZATIONAMOUNT_TO_DISTRIBUTE, @ORGANIZATIONCURRENCYDECIMALDIGITS),
                                @DISTRIBUTED_CURRENCYGAINLOSS_AMOUNT = dbo.UFN_AUCTIONPACKAGE_CONVERTBYPROPORTION_UNROUNDED(DISTRIBUTIONS.REVENUESPLITTRANSACTIONAMOUNT, DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, @TOTALBASECURRENCYGAINLOSS, @PAYMENTCURSOR_ITEMBASECURRENCYDECIMALDIGITS),
                                @DISTRIBUTED_CURRENCYGAINLOSS_ORGANIZATIONAMOUNT = dbo.UFN_AUCTIONPACKAGE_CONVERTBYPROPORTION_UNROUNDED(DISTRIBUTIONS.REVENUESPLITTRANSACTIONAMOUNT, DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, @TOTALORGANIZATIONCURRENCYGAINLOSS, @ORGANIZATIONCURRENCYDECIMALDIGITS)                                
                            from 
                                @DISTRIBUTIONS DISTRIBUTIONS
                            where 
                                REVENUEPURCHASEID = @PAYMENTCURSOR_REVENUEPURCHASEID 
                                and REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID

                            select top 1
                                @DISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT = dbo.UFN_AUCTIONPACKAGE_CONVERTBYPROPORTION_UNROUNDED(DISTRIBUTIONS.REVENUESPLITTRANSACTIONAMOUNT, DISTRIBUTIONS.AUCTIONITEMTRANSACTIONPURCHASEAMOUNT, @GAINLOSS_TRANSACTIONAMOUNT_TO_DISTRIBUTE, @PAYMENTCURSOR_ITEMTRANSACTIONCURRENCYDECIMALDIGITS)
                            from
                                @DISTRIBUTIONS DISTRIBUTIONS
                            where 
                                REVENUEPURCHASEID = @PAYMENTCURSOR_REVENUEPURCHASEID 
                                and REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID;

                            set @DISTRIBUTED_GAINLOSS_AMOUNT = case when isnull(@TRANSACTIONCURRENCYID, @BASECURRENCYID) = @BASECURRENCYID then @DISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT else dbo.UFN_CURRENCY_CONVERT(@DISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT, @BASEEXCHANGERATEID) end
                            set @DISTRIBUTED_GAINLOSS_ORGANIZATIONAMOUNT = 
                                                            case when @ORGANIZATIONAMOUNTORIGINCODE = 0
                                                                then case when @BASECURRENCYID = @ORGANIZATIONCURRENCYID
                                                                    then @DISTRIBUTED_GAINLOSS_AMOUNT
                                                                    else dbo.UFN_CURRENCY_CONVERT(@DISTRIBUTED_GAINLOSS_AMOUNT, @ORGEXCHANGERATEID)
                                                                end
                                                                else case when isnull(@TRANSACTIONCURRENCYID, @ORGANIZATIONCURRENCYID) = @ORGANIZATIONCURRENCYID
                                                                    then @DISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT
                                                                    else dbo.UFN_CURRENCY_CONVERT(@DISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT, @ORGEXCHANGERATEID)
                                                                end
                                                            end

                            -- Keep track of how much we have already distributed

                            set @TOTALDISTRIBUTED_ITEM_TRANSACTIONAMOUNT = @TOTALDISTRIBUTED_ITEM_TRANSACTIONAMOUNT + @DISTRIBUTED_ITEM_TRANSACTIONAMOUNT;
                            set @TOTALDISTRIBUTED_ITEM_AMOUNT = @TOTALDISTRIBUTED_ITEM_AMOUNT + @DISTRIBUTED_ITEM_AMOUNT;
                            set @TOTALDISTRIBUTED_ITEM_ORGANIZATIONAMOUNT = @TOTALDISTRIBUTED_ITEM_ORGANIZATIONAMOUNT + @DISTRIBUTED_ITEM_ORGANIZATIONAMOUNT;
                            set @TOTALDISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT = @TOTALDISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT + @DISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT;
                            set @TOTALDISTRIBUTED_GAINLOSS_AMOUNT = @TOTALDISTRIBUTED_GAINLOSS_AMOUNT + @DISTRIBUTED_GAINLOSS_AMOUNT;
                            set @TOTALDISTRIBUTED_GAINLOSS_ORGANIZATIONAMOUNT = @TOTALDISTRIBUTED_GAINLOSS_ORGANIZATIONAMOUNT + @DISTRIBUTED_GAINLOSS_ORGANIZATIONAMOUNT;
                            set @TOTALDISTRIBUTED_CURRENCYGAINLOSS_AMOUNT = @TOTALDISTRIBUTED_CURRENCYGAINLOSS_AMOUNT + @DISTRIBUTED_CURRENCYGAINLOSS_AMOUNT;
                            set @TOTALDISTRIBUTED_CURRENCYGAINLOSS_ORGANIZATIONAMOUNT = @TOTALDISTRIBUTED_CURRENCYGAINLOSS_ORGANIZATIONAMOUNT + @DISTRIBUTED_CURRENCYGAINLOSS_ORGANIZATIONAMOUNT;

                            -- Update the amount fields in the distributions temp table

                            update @DISTRIBUTIONS
                            set AMOUNT = 
                                case
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 0 then
                                        REVENUESPLITAMOUNT
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 1 then
                                        @DISTRIBUTED_ITEM_AMOUNT
                                    when REVENUESPLITTYPECODE in (203,204) then
                           @DISTRIBUTED_GAINLOSS_AMOUNT
                                    else
                                        0
                                end,
                                TRANSACTIONAMOUNT = 
                                case
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 0 then
                                        REVENUESPLITTRANSACTIONAMOUNT
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 1 then
                                        @DISTRIBUTED_ITEM_TRANSACTIONAMOUNT
                                    when REVENUESPLITTYPECODE in (203,204) then
                                        @DISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT
                                    else
                                        0
                                end,
                                ORGANIZATIONAMOUNT = 
                                case
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 0 then
                                        REVENUESPLITORGANIZATIONAMOUNT
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 1 then
                                        @DISTRIBUTED_ITEM_ORGANIZATIONAMOUNT
                                    when REVENUESPLITTYPECODE in (203,204) then
                                        @DISTRIBUTED_GAINLOSS_ORGANIZATIONAMOUNT
                                    else
                                        0
                                end
                            where REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID and REVENUEPURCHASEID = @PAYMENTCURSOR_REVENUEPURCHASEID
                        end
                        else
                        begin
                            --The last payment towards an item deals with the rounding issues

                            --It gets what is left to distribute

                            declare @GAINLOSS_TRAN money = abs(@GAINLOSS_TRANSACTIONAMOUNT_TO_DISTRIBUTE - @TOTALDISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT);
                            declare @GAINLOSS_BASE money = case when isnull(@TRANSACTIONCURRENCYID, @BASECURRENCYID) = @BASECURRENCYID then @GAINLOSS_TRAN else dbo.UFN_CURRENCY_CONVERT(@GAINLOSS_TRAN, @BASEEXCHANGERATEID) end;
                            declare @GAINLOSS_ORG money = 
                                            case when @ORGANIZATIONAMOUNTORIGINCODE = 0
                                                then case when @BASECURRENCYID = @ORGANIZATIONCURRENCYID
                                                    then @GAINLOSS_BASE
                                                    else dbo.UFN_CURRENCY_CONVERT(@GAINLOSS_BASE, @ORGEXCHANGERATEID)
                                                end
                                                else case when isnull(@TRANSACTIONCURRENCYID, @ORGANIZATIONCURRENCYID) = @ORGANIZATIONCURRENCYID
                                                    then @GAINLOSS_TRAN
                                                    else dbo.UFN_CURRENCY_CONVERT(@GAINLOSS_TRAN, @ORGEXCHANGERATEID)
                                                end
                                            end;

                            update @DISTRIBUTIONS
                            set AMOUNT = 
                                case
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 0 then
                                        REVENUESPLITAMOUNT
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 1 then
                                        abs(@ITEM_AMOUNT_TO_DISTRIBUTE - @TOTALDISTRIBUTED_ITEM_AMOUNT)
                                    when REVENUESPLITTYPECODE in (203,204) then          
                                        @GAINLOSS_BASE
                                    else
                                        0
                                end,
                                TRANSACTIONAMOUNT = 
                                case
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 0 then
                                        REVENUESPLITTRANSACTIONAMOUNT
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 1 then
                                        abs(@ITEM_TRANSACTIONAMOUNT_TO_DISTRIBUTE - @TOTALDISTRIBUTED_ITEM_TRANSACTIONAMOUNT)
                                 when REVENUESPLITTYPECODE in (203,204) then
                                        @GAINLOSS_TRAN
                                    else
                                        0
                                end,
                                ORGANIZATIONAMOUNT = 
                                case
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 0 then
                                        REVENUESPLITORGANIZATIONAMOUNT
                                    when REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 1 then
                                        abs(@ITEM_ORGANIZATIONAMOUNT_TO_DISTRIBUTE - @TOTALDISTRIBUTED_ITEM_ORGANIZATIONAMOUNT)
                                    when REVENUESPLITTYPECODE in (203,204)then
                                        @GAINLOSS_ORG
                                    else
                                        0
                                end
                            where REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID and REVENUEPURCHASEID = @PAYMENTCURSOR_REVENUEPURCHASEID
                        end                    

                        --Reset the payment count and totals if we are moving on to a different item

                        if @PAYMENTCURSOR_PAYMENTCOUNT = @AUCTIONITEM_CURRENTPAYMENTCOUNT
                        begin
                            select @AUCTIONITEM_CURRENTPAYMENTCOUNT = 0;

                            select @GAINLOSS_TRANSACTIONAMOUNT_TO_DISTRIBUTE = 0;
                            --select @GAINLOSS_AMOUNT_TO_DISTRIBUTE = 0;

                            --select @GAINLOSS_ORGANIZATIONAMOUNT_TO_DISTRIBUTE = 0;

                            select @DISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT = 0;
                            select @DISTRIBUTED_GAINLOSS_AMOUNT = 0;
                            select @DISTRIBUTED_GAINLOSS_ORGANIZATIONAMOUNT = 0;
                            select @TOTALDISTRIBUTED_GAINLOSS_TRANSACTIONAMOUNT = 0;
                            select @TOTALDISTRIBUTED_GAINLOSS_AMOUNT = 0;
                            select @TOTALDISTRIBUTED_GAINLOSS_ORGANIZATIONAMOUNT = 0;

                            select @ITEM_TRANSACTIONAMOUNT_TO_DISTRIBUTE = 0;
                            select @ITEM_AMOUNT_TO_DISTRIBUTE = 0;
                            select @ITEM_ORGANIZATIONAMOUNT_TO_DISTRIBUTE = 0;
                            select @DISTRIBUTED_ITEM_TRANSACTIONAMOUNT = 0;
                            select @DISTRIBUTED_ITEM_AMOUNT = 0;
                            select @DISTRIBUTED_ITEM_ORGANIZATIONAMOUNT = 0;
                            select @TOTALDISTRIBUTED_ITEM_TRANSACTIONAMOUNT = 0;
                            select @TOTALDISTRIBUTED_ITEM_AMOUNT = 0;
                            select @TOTALDISTRIBUTED_ITEM_ORGANIZATIONAMOUNT = 0;

                            select @TOTALBASEGAINLOSS = 0;
                            select @TOTALORGANIZATIONGAINLOSS = 0;
                            select @TOTALITEMBASEGAINLOSS = 0;
                            select @TOTALITEMORGANIZATIONGAINLOSS = 0;
                            select @TOTALBASECURRENCYGAINLOSS = 0;
                            select @TOTALORGANIZATIONCURRENCYGAINLOSS = 0;
                            select @DISTRIBUTED_CURRENCYGAINLOSS_AMOUNT = 0;
                            select @DISTRIBUTED_CURRENCYGAINLOSS_ORGANIZATIONAMOUNT = 0;
                            select @TOTALDISTRIBUTED_CURRENCYGAINLOSS_AMOUNT = 0;
                            select @TOTALDISTRIBUTED_CURRENCYGAINLOSS_ORGANIZATIONAMOUNT = 0;
                        end

                        fetch next from PAYMENTCURSOR into 
                            @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID,@PAYMENTCURSOR_REVENUEPURCHASEID,@PAYMENTCURSOR_AUCTIONITEMID,
                            @PAYMENTCURSOR_PAYMENTCOUNT,@PAYMENTCURSOR_ITEMTRANSACTIONCURRENCYID,@PAYMENTCURSOR_ITEMBASECURRENCYID,
                       @PAYMENTCURSOR_ITEMVALUE,@PAYMENTCURSOR_ITEMTRANSACTIONVALUE,@PAYMENTCURSOR_ITEMORGANIZATIONVALUE,
                            @PAYMENTCURSOR_ITEMBASECURRENCYDECIMALDIGITS, @PAYMENTCURSOR_ITEMTRANSACTIONCURRENCYDECIMALDIGITS
                    end

                    close PAYMENTCURSOR
                    deallocate PAYMENTCURSOR

                return
            end