UFN_AUCTIONITEM_GETGAINLOSS

Returns the gains or losses for an auction item, distributed across all the purchases for that item.

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@AUCTIONITEMID uniqueidentifier IN

Definition

Copy


            CREATE function dbo.UFN_AUCTIONITEM_GETGAINLOSS
            (
                @AUCTIONITEMID uniqueidentifier
            )
            returns @PAYMENTS table
            (
                AUCTIONITEMID uniqueidentifier,
                REVENUEID uniqueidentifier,
                REVENUESPLITID uniqueidentifier,
                REVENUESPLITAMOUNT money,
                AUCTIONITEMGAINLOSSAMOUNT money,
                TRANSACTIONCURRENCYID uniqueidentifier,
                TRANSACTIONCURRENCYDECIMALDIGITS int
            )
            as 
                begin
                    --NOTE: This function is UFN_AUCTIONITEM_GETRECEIPTAMOUNTS with the condition that strips away losses removed. It's also

                    --had the various variables renamed from RECEIPTAMOUNT to GAINLOSSAMOUNT.


                    declare @TYPECODE tinyint;
                    select @TYPECODE = AUCTIONITEM.TYPECODE from dbo.AUCTIONITEM where AUCTIONITEM.ID = @AUCTIONITEMID

                    declare @ITEMFMV money;
                    select 
                        @ITEMFMV = ITEMVALUES.TRANSACTIONVALUE
                    from 
                        dbo.UFN_AUCTIONITEM_GETVALUES_INCURRENCY(@AUCTIONITEMID) ITEMVALUES

                    if @TYPECODE = 0
                    begin
                        insert into @PAYMENTS
                        (
                            AUCTIONITEMID,
                            REVENUEID,
                            REVENUESPLITID,
                            REVENUESPLITAMOUNT,
                            TRANSACTIONCURRENCYID,
                            TRANSACTIONCURRENCYDECIMALDIGITS
                        )
                            select
                                AUCTIONITEMPURCHASE.AUCTIONITEMID,
                                FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID,
                                FINANCIALTRANSACTIONLINEITEM.ID,
                                FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT,
                                FINANCIALTRANSACTION.TRANSACTIONCURRENCYID,
                                CURRENCY.DECIMALDIGITS
                            from
                                dbo.AUCTIONITEMPURCHASE
                                left join dbo.FINANCIALTRANSACTIONLINEITEM on AUCTIONITEMPURCHASE.PURCHASEID = FINANCIALTRANSACTIONLINEITEM.ID
                                left join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
                                left join dbo.CURRENCY on FINANCIALTRANSACTION.TRANSACTIONCURRENCYID = CURRENCY.ID
                            where
                                FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                                and AUCTIONITEMPURCHASE.AUCTIONITEMID = @AUCTIONITEMID
                    end
                    else
                    begin

                        insert into @PAYMENTS
                        (
                            AUCTIONITEMID,
                            REVENUEID,
                            REVENUESPLITID,
                            REVENUESPLITAMOUNT,
                            TRANSACTIONCURRENCYID,
                            TRANSACTIONCURRENCYDECIMALDIGITS
                        )
                            select
                                AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID,
                                FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID,
                                FINANCIALTRANSACTIONLINEITEM.ID,
                                FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT,
                                FINANCIALTRANSACTION.TRANSACTIONCURRENCYID,
                                CURRENCY.DECIMALDIGITS
                            from
                                dbo.AUCTIONITEMREVENUEPURCHASE
                                left join dbo.FINANCIALTRANSACTIONLINEITEM on AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
                                left join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
                                left join dbo.CURRENCY on FINANCIALTRANSACTION.TRANSACTIONCURRENCYID = CURRENCY.ID
                            where
                                FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                                and AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID = @AUCTIONITEMID

                    end

                    declare @PAYMENTCOUNT int;
                    select @PAYMENTCOUNT = count(REVENUESPLITID) from @PAYMENTS

                    declare @PURCHASEPRICE money;
                    select @PURCHASEPRICE = sum(REVENUESPLITAMOUNT) from @PAYMENTS

                    if @PAYMENTCOUNT = 1
                    begin
                        update @PAYMENTS set AUCTIONITEMGAINLOSSAMOUNT = (@PURCHASEPRICE - @ITEMFMV)
                    end
                    else
                    begin

                        declare @GAINLOSSAMOUNT_TO_DISTRIBUTE money = 0;
                        declare @DISTRIBUTED_GAINLOSS_AMOUNT money = 0;
                        declare @TOTALDISTRIBUTED_GAINLOSS_AMOUNT money = 0;

                        select @GAINLOSSAMOUNT_TO_DISTRIBUTE = abs(@PURCHASEPRICE - @ITEMFMV);
                        declare @CURRENTPAYMENTCOUNT int = 0;

                        declare @PAYMENTCURSOR_REVENUEID uniqueidentifier,@PAYMENTCURSOR_REVENUESPLITID uniqueidentifier;
                        declare @PAYMENTCURSOR_REVENUESPLITAMOUNT money,@PAYMENTCURSOR_TRANSACTIONCURRENCYDECIMALDIGITS int;
                        declare PAYMENTCURSOR cursor local fast_forward
                            for select PAYMENTS.REVENUEID,PAYMENTS.REVENUESPLITID,PAYMENTS.REVENUESPLITAMOUNT,PAYMENTS.TRANSACTIONCURRENCYDECIMALDIGITS
                                from @PAYMENTS PAYMENTS

                        open PAYMENTCURSOR
                        fetch next from PAYMENTCURSOR into @PAYMENTCURSOR_REVENUEID,@PAYMENTCURSOR_REVENUESPLITID,@PAYMENTCURSOR_REVENUESPLITAMOUNT,@PAYMENTCURSOR_TRANSACTIONCURRENCYDECIMALDIGITS

                        while @@FETCH_STATUS = 0
                        begin

                            select @CURRENTPAYMENTCOUNT = @CURRENTPAYMENTCOUNT + 1;

                            if @CURRENTPAYMENTCOUNT <> @PAYMENTCOUNT
                            begin

                                select @DISTRIBUTED_GAINLOSS_AMOUNT = dbo.UFN_CURRENCY_CONVERTBYPROPORTION(@PAYMENTCURSOR_REVENUESPLITAMOUNT,@PURCHASEPRICE,@GAINLOSSAMOUNT_TO_DISTRIBUTE,@PAYMENTCURSOR_TRANSACTIONCURRENCYDECIMALDIGITS)

                                update 
                                    @PAYMENTS
                                set 
                                    AUCTIONITEMGAINLOSSAMOUNT = case 
                                                                    when @PURCHASEPRICE - @ITEMFMV > 0 then
                                                                        @DISTRIBUTED_GAINLOSS_AMOUNT
                                                                    else
                                                                        -(@DISTRIBUTED_GAINLOSS_AMOUNT)
                                                                end
                                where 
                                    REVENUEID = @PAYMENTCURSOR_REVENUEID 
                                    and REVENUESPLITID = @PAYMENTCURSOR_REVENUESPLITID

                                set @TOTALDISTRIBUTED_GAINLOSS_AMOUNT = @TOTALDISTRIBUTED_GAINLOSS_AMOUNT + @DISTRIBUTED_GAINLOSS_AMOUNT;
                            end
                            else
                            begin
                                --The last payment towards an item deals with the rounding issues

                                --It just gets what is left to distribute

                                update 
                                    @PAYMENTS
                                set 
                                    AUCTIONITEMGAINLOSSAMOUNT = case 
                                                                    when @PURCHASEPRICE - @ITEMFMV > 0 then
                                                                        (@GAINLOSSAMOUNT_TO_DISTRIBUTE    - @TOTALDISTRIBUTED_GAINLOSS_AMOUNT)
                                                                    else
                                                                        -(@GAINLOSSAMOUNT_TO_DISTRIBUTE    - @TOTALDISTRIBUTED_GAINLOSS_AMOUNT)
                                                                end
                                where 
                                    REVENUEID = @PAYMENTCURSOR_REVENUEID 
                                    and REVENUESPLITID = @PAYMENTCURSOR_REVENUESPLITID
                            end

                            fetch next from PAYMENTCURSOR into @PAYMENTCURSOR_REVENUEID,@PAYMENTCURSOR_REVENUESPLITID,@PAYMENTCURSOR_REVENUESPLITAMOUNT,@PAYMENTCURSOR_TRANSACTIONCURRENCYDECIMALDIGITS
                        end
                        close PAYMENTCURSOR
                        deallocate PAYMENTCURSOR
                    end

                    return;
                end