UFN_CREDIT_SALESORDERITEMTAXREMAININGREFUNDABLEAMOUNT

Return

Return Type
money

Parameters

Parameter Parameter Type Mode Description
@SALESORDERITEMTAXID uniqueidentifier IN

Definition

Copy


CREATE function dbo.UFN_CREDIT_SALESORDERITEMTAXREMAININGREFUNDABLEAMOUNT
(
    @SALESORDERITEMTAXID uniqueidentifier
)
returns money
as begin
    declare 
        @TAXTOTAL money,
        @AMTPAIDREFUNDEDORAPPLIEDTIX money,
        @AMTPAIDREFUNDEDMERCH money,
        @AMTPAIDREFUNDEDITEMFEES money,
        @AMTPAIDREFUNDEDORDERFEES money,
        @AMTPAIDALLTIX money,
        @AMTPAIDALLMERCH money,
        @AMTPAIDITEMFEES money,
        @AMTPAIDORDERFEES money;

    set @TAXTOTAL = (select TOTAL from dbo.SALESORDERITEM where ID = @SALESORDERITEMTAXID);

    -- 2014-01-17 WD:

    -- By the time this stored procedure is called, the relevant order will have been pulled up in the refund form,

    -- which means that TICKET and SALESORDERITEMMERCHANDISEUNIT records for all the items available for refund

    -- in the order will exist, so we're safe to use AMOUNTPAID. There is a slight concern related to refunds made

    -- before the partial refund work and merchandise, because CREDITITEM_EXT would not have a link to the

    -- SALESORDERITEMMERCHANDISEUNIT record via SALESORDERITEMIZEDITEMID in such a case. That is addressed below


    set @AMTPAIDALLTIX =    coalesce((
                                select 
                                    sum(TICKET.AMOUNTPAID)
                                from
                                    dbo.SALESORDERITEMTAX
                                    inner join dbo.TICKET
                                        on TICKET.SALESORDERITEMTICKETID = SALESORDERITEMTAX.SALESORDERITEMID
                                where
                                    SALESORDERITEMTAX.TAXITEMID = @SALESORDERITEMTAXID
                            ), 0);

    set @AMTPAIDALLMERCH =    coalesce((
                                select
                                    sum(SALESORDERITEMMERCHANDISEUNIT.AMOUNTPAID)
                                from
                                    dbo.SALESORDERITEMTAX
                                    inner join dbo.SALESORDERITEMMERCHANDISEUNIT
                                        on SALESORDERITEMMERCHANDISEUNIT.SALESORDERITEMMERCHANDISEID = SALESORDERITEMTAX.SALESORDERITEMID
                                where
                                    SALESORDERITEMTAX.TAXITEMID = @SALESORDERITEMTAXID
                            ), 0);

    set @AMTPAIDITEMFEES =    coalesce((
                                select
                                    sum(SALESORDERITEMTICKETFEE.AMOUNT)
                                from
                                    dbo.SALESORDERITEMTAX
                                    inner join dbo.SALESORDERITEMTICKETFEE
                                        on SALESORDERITEMTICKETFEE.SALESORDERITEMFEEID = SALESORDERITEMTAX.SALESORDERITEMID
                                where
                                    SALESORDERITEMTAX.TAXITEMID = @SALESORDERITEMTAXID
                            ), 0);

    set @AMTPAIDORDERFEES =    coalesce((
                                select
                                    sum(SALESORDERITEM.PRICE)
                                from
                                    dbo.SALESORDERITEMTAX
                                    inner join dbo.SALESORDERITEM
                                        on SALESORDERITEM.ID = SALESORDERITEMTAX.SALESORDERITEMID
                                    inner join dbo.SALESORDERITEMFEE
                                        on SALESORDERITEMFEE.ID = SALESORDERITEM.ID
                                where
                                    SALESORDERITEMTAX.TAXITEMID = @SALESORDERITEMTAXID
                                    and SALESORDERITEM.TYPECODE = 3
                                    and SALESORDERITEMFEE.APPLIESTOCODE = 0
                            ), 0);

    set @AMTPAIDREFUNDEDORAPPLIEDTIX =    coalesce((
                                            select 
                                                sum(TICKET.AMOUNTPAID)
                                            from
                                                dbo.SALESORDERITEMTAX
                                                inner join dbo.TICKET
                                                    on TICKET.SALESORDERITEMTICKETID = SALESORDERITEMTAX.SALESORDERITEMID
                                            where
                                                SALESORDERITEMTAX.TAXITEMID = @SALESORDERITEMTAXID
                                                and (TICKET.ISREFUNDED = 1 or TICKET.APPLIEDTOMEMBERSHIP = 1)
                                        ), 0);

    -- Because we don't know if there are old style refunds existing on an order with merchandise, we have to be prepared

    -- We're safe when relying on FTLI.BASEAMOUNT because, before non-partial refunds, if there was an order-level discount

    -- (which is not reflected in FTLI.BASEAMOUNT) you would have had to refund the whole order, or at least all the items

    -- that the discount applied to. Item-level discounts ARE reflected in FTLI.BASEAMOUNT, so it should be an accurate

    -- representation of the amount refunded, which is equal to amount paid in old-style refunds, of the merchandise


    set @AMTPAIDREFUNDEDMERCH =    coalesce((
                                            select 
                                                sum(AMOUNT)
                                            from (
                                                select
                                                    case
                                                        when SOIMU.ID is null then 
                                                            FTLI.BASEAMOUNT
                                                        else 
                                                            SOIMU.AMOUNTPAID
                                                    end AMOUNT
                                                from 
                                                    dbo.FINANCIALTRANSACTIONLINEITEM FTLI
                                                    inner join dbo.CREDITITEM_EXT EXT 
                                                        on EXT.ID = FTLI.ID
                                                    inner join dbo.SALESORDERITEMTAX SOITAX
                                                        on SOITAX.SALESORDERITEMID = EXT.SALESORDERITEMID
                                                    left join dbo.SALESORDERITEMMERCHANDISEUNIT SOIMU 
                                                        on SOIMU.ID = EXT.SALESORDERITEMIZEDITEMID
                                                where 
                                                    SOITAX.TAXITEMID = @SALESORDERITEMTAXID
                                                    and EXT.TYPECODE = 14  -- Merch (you may not need to filter by typecode, depending on what's outside the subquery)

                                                    and FTLI.TYPECODE = 0  -- excluding discounts from original order - if not linking to refund FT, this may be necessary

                                            ) REFUDEDMERCH
                                        ), 0);

    set @AMTPAIDREFUNDEDITEMFEES =    coalesce((
                                        select
                                            sum(SALESORDERITEMTICKETFEE.AMOUNT)
                                        from
                                            dbo.SALESORDERITEMTAX
                                            inner join dbo.SALESORDERITEMTICKETFEE
                                                on SALESORDERITEMTICKETFEE.SALESORDERITEMFEEID = SALESORDERITEMTAX.SALESORDERITEMID
                                        where
                                            SALESORDERITEMTAX.TAXITEMID = @SALESORDERITEMTAXID
                                            and SALESORDERITEMTICKETFEE.REFUNDEDAMOUNT > 0
                                    ), 0);

    set @AMTPAIDREFUNDEDORDERFEES =    coalesce((
                                        select
                                            sum(SALESORDERITEM.PRICE)
                                        from
                                            dbo.SALESORDERITEMTAX
                                            inner join dbo.SALESORDERITEM
                                                on SALESORDERITEM.ID = SALESORDERITEMTAX.SALESORDERITEMID
                                            inner join dbo.CREDITITEM_EXT
                                                on CREDITITEM_EXT.SALESORDERITEMID = SALESORDERITEM.ID
                                            inner join dbo.SALESORDERITEMFEE
                                                on SALESORDERITEMFEE.ID = SALESORDERITEM.ID
                                        where
                                            SALESORDERITEMTAX.TAXITEMID = @SALESORDERITEMTAXID
                                            and SALESORDERITEM.TYPECODE = 3
                                            and SALESORDERITEMFEE.APPLIESTOCODE = 0
                                    ), 0);

    -- Do not factor out @TAXTOTAL. We require it to be inside the rounding function so that fractions of cents are treated the same

    -- in this calculation as they are when a refund is actually completed. If it is factored out, then fractions of cents will not

    -- be correctly calculated compared to the amount of tax actually refunded.

    return (@TAXTOTAL - ROUND((@TAXTOTAL) * ((@AMTPAIDREFUNDEDMERCH + @AMTPAIDREFUNDEDORAPPLIEDTIX + @AMTPAIDREFUNDEDITEMFEES + @AMTPAIDREFUNDEDORDERFEES) / (@AMTPAIDALLTIX + @AMTPAIDALLMERCH + @AMTPAIDITEMFEES + @AMTPAIDORDERFEES)), 2));
end