UFN_REFUND_GETPRORATEDSPLITS

Returns prorated splits for a supplied refund.

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@CREDITID uniqueidentifier IN

Definition

Copy


        CREATE function dbo.UFN_REFUND_GETPRORATEDSPLITS(@CREDITID uniqueidentifier)
            returns table as
            return
            with ORDERDISCOUNTS_CTE as (
                select ID, AMOUNT 
                from dbo.UFN_SPLITS_GETPRORATEDSPLITS(
                    (
                        select sum(((LI.QUANTITY * LI.UNITVALUE) - [CREDITITEM].DISCOUNTS))
                        from dbo.CREDITITEM_EXT CREDITITEM
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = CREDITITEM.ID
                        where
                            CREDITID = @CREDITID and
                            ((LI.QUANTITY * LI.UNITVALUE) - [CREDITITEM].DISCOUNTS) > 0 and
                            exists (select 1
                                        from dbo.[SALESORDERITEMORDERDISCOUNTDETAIL]
                                        where [SALESORDERITEMORDERDISCOUNTDETAIL].[SALESORDERITEMID] = [CREDITITEM].[SALESORDERITEMID])
                    ),
                    (
                        select sum(abs((LI.QUANTITY * LI.UNITVALUE) - [CREDITITEM].DISCOUNTS))
                        from dbo.CREDITITEM_EXT CREDITITEM
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = CREDITITEM.ID
                        inner join dbo.SALESORDERITEMORDERDISCOUNT on CREDITITEM.SALESORDERITEMID = SALESORDERITEMORDERDISCOUNT.ID
                        where CREDITITEM.CREDITID = @CREDITID
                    ), 
                    (
                        select distinct
                            B.ID as ID,
                            ((LI.QUANTITY * LI.UNITVALUE) - B.DISCOUNTS) as AMOUNT
                        from dbo.CREDITITEM_EXT as B
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = B.ID
                        inner join dbo.[SALESORDERITEMORDERDISCOUNTDETAIL]
                            on [SALESORDERITEMORDERDISCOUNTDETAIL].[SALESORDERITEMID] = [B].[SALESORDERITEMID]
                        where 
                            B.CREDITID = @CREDITID
                        for xml raw('ITEM'),TYPE,ELEMENTS,root('AMOUNTSTOPRORATE'),binary base64
                    )
                ) 
            ),
            CONTRIBUTEDREVENUE_CTE as (
                select
                    REFUNDMEMBERSHIPLI.ID,
                    sum(DONATIONLI.ORGAMOUNT) as AMOUNT
                from dbo.FINANCIALTRANSACTIONLINEITEM REFUNDMEMBERSHIPLI
                inner join dbo.CREDITITEM_EXT REFUNDMEMBERSHIPEXT on REFUNDMEMBERSHIPEXT.ID = REFUNDMEMBERSHIPLI.ID
                inner join dbo.FINANCIALTRANSACTIONLINEITEM MEMBERSHIPLI on MEMBERSHIPLI.ID = REFUNDMEMBERSHIPLI.SOURCELINEITEMID
                inner join dbo.REVENUESPLIT_EXT MEMBERSHIPEXT on MEMBERSHIPEXT.ID = MEMBERSHIPLI.ID
                inner join dbo.FINANCIALTRANSACTIONLINEITEM DONATIONLI on DONATIONLI.SOURCELINEITEMID = MEMBERSHIPLI.ID
                inner join dbo.REVENUESPLIT_EXT DONATIONEXT on DONATIONEXT.ID = DONATIONLI.ID
                where REFUNDMEMBERSHIPLI.FINANCIALTRANSACTIONID = @CREDITID
                    and (REFUNDMEMBERSHIPEXT.TYPECODE = 1 or REFUNDMEMBERSHIPEXT.TYPECODE = 6)
                    and ((MEMBERSHIPEXT.TYPECODE = 2 and MEMBERSHIPEXT.APPLICATIONCODE = 5) or (MEMBERSHIPEXT.TYPECODE = 1 and MEMBERSHIPEXT.APPLICATIONCODE = 1))
                    and ((DONATIONEXT.TYPECODE = 0 and DONATIONEXT.APPLICATIONCODE = 0) or (DONATIONEXT.TYPECODE = 0 and DONATIONEXT.APPLICATIONCODE = 1))
                group by REFUNDMEMBERSHIPLI.ID
            ),
            SOURCEITEMS_CTE as (
                select distinct coalesce(SALESORDERITEMTICKET.PROGRAMID, [EVENT].PROGRAMID) as PROGRAMID,
                    case CREDITITEM.TYPECODE
                        when 1 then  -- Membership

                            LI.SOURCELINEITEMID
                        else
                            null
                    end as MEMBERSHIPREVENUESPLITID,
                    SALESORDERITEMFEE.FEEID,
                    SALESORDERITEMTAX.TAXID,
                    COALESCE(SALESORDERITEMTICKET.EVENTID, REGISTRANT.EVENTID) AS EVENTID,
                    REGISTRANT.ID AS REGISTRANTID,
                    CREDITITEM.CREDITID,
                    CREDITITEM.ID as CREDITITEMID,
                    case
                        when ISNULL(CONTRIBUTEDREVENUE.AMOUNT, 0) > CREDITITEM.DISCOUNTS then --the discount is only taken out of the contributed revenue

                            CREDITITEMMINUSDICOUNT.TOTAL - CONTRIBUTEDREVENUE.AMOUNT
                        when SALESORDERITEM.ID is null and SOURCELIEXT.TYPECODE = 0 and SOURCELIEXT.APPLICATIONCODE = 0 then --this is the contributed revenue and we want it to be whatever the payment was

                            (select
                                sum(SOURCEPAYMENTLI.ORGAMOUNT)
                            from dbo.FINANCIALTRANSACTIONLINEITEM SOURCEPAYMENTLI
                            inner join dbo.FINANCIALTRANSACTION SOURCEPAYMENTFT on SOURCEPAYMENTFT.ID = SOURCEPAYMENTLI.FINANCIALTRANSACTIONID
                            where SOURCEPAYMENTLI.SOURCELINEITEMID = SOURCELIEXT.ID
                                and SOURCEPAYMENTFT.TYPECODE = 0)
                        else
                            [CREDITITEMMINUSDICOUNT].[TOTAL] - credititem.discounts
                    end TOTAL,
                    FT.TRANSACTIONAMOUNT as CREDITAMOUNT,
                    CREDIT_EXT.SALESORDERID,
                    SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID,
                    SALESORDERITEMMEMBERSHIPADDON.MEMBERSHIPADDONID,
                    SOURCELIEXT.DESIGNATIONID,
                    LI.SOURCELINEITEMID
                from dbo.CREDITITEM_EXT CREDITITEM
                inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = CREDITITEM.ID
                inner join dbo.FINANCIALTRANSACTION FT on FT.ID = LI.FINANCIALTRANSACTIONID
                left join dbo.SALESORDERITEM ON SALESORDERITEM.ID = CREDITITEM.SALESORDERITEMID
                left join dbo.SALESORDERITEMTICKET ON SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
                left join dbo.[EVENT] on SALESORDERITEMTICKET.EVENTID = [EVENT].ID
                left join dbo.SALESORDERITEMTAX ON SALESORDERITEM.ID = SALESORDERITEMTAX.TAXITEMID
                left join dbo.SALESORDERITEMEVENTREGISTRATION ON SALESORDERITEM.ID = SALESORDERITEMEVENTREGISTRATION.ID
                left join dbo.REGISTRANT ON SALESORDERITEMEVENTREGISTRATION.REGISTRANTID = REGISTRANT.ID
                left join dbo.SALESORDERITEMFEE ON SALESORDERITEM.ID = SALESORDERITEMFEE.ID
                left join dbo.SALESORDERITEMMERCHANDISE on SALESORDERITEM.ID = SALESORDERITEMMERCHANDISE.ID
                left join dbo.SALESORDERITEMMEMBERSHIPADDON on SALESORDERITEMMEMBERSHIPADDON.ID = SALESORDERITEM.ID
                left join CONTRIBUTEDREVENUE_CTE CONTRIBUTEDREVENUE on CONTRIBUTEDREVENUE.ID = LI.ID
                inner join dbo.CREDIT_EXT on CREDIT_EXT.ID = CREDITITEM.CREDITID
                inner join dbo.REVENUESPLIT_EXT SOURCELIEXT on SOURCELIEXT.ID = LI.SOURCELINEITEMID
                cross apply (select (LI.QUANTITY * LI.UNITVALUE) - coalesce((select AMOUNT from ORDERDISCOUNTS_CTE OD where OD.ID = CREDITITEM.ID), 0) as [TOTAL]) [CREDITITEMMINUSDICOUNT]
                where 
                    CREDITITEM.CREDITID = @CREDITID and 
                    [CREDITITEMMINUSDICOUNT].[TOTAL] > 0 and
                    CREDIT_EXT.SALESORDERID is not null
            ) ,
            SOURCESPLITS_CTE as (
                select
                    FTLI.ID as REVENUESPLITID,
                    FTLI.FINANCIALTRANSACTIONID,
                    REVENUESPLIT_EXT.TYPE +'-Order-'+ convert(nvarchar(50), SALESORDER.SEQUENCEID) as TYPE,
                    CREDITPAYMENT.AMOUNT as REFUNDPAYMENTTOTAL,
                    SUM(SOURCEITEMS.TOTAL) as REFUNDSPLITAMOUNT,
                    SOURCEITEMS.CREDITAMOUNT as CREDITAMOUNT,
                    CREDITPAYMENT.ID as CREDITPAYMENTID,
                    REVENUESPLIT_EXT.TYPECODE,
                    [CREDITPAYMENT].[PAYMENTMETHODCODE],
                    SOURCEITEMS.CREDITITEMID
                from SOURCEITEMS_CTE AS SOURCEITEMS
                inner join dbo.CREDITPAYMENT ON SOURCEITEMS.CREDITID = CREDITPAYMENT.CREDITID
                inner join dbo.SALESORDER on SOURCEITEMS.SALESORDERID = SALESORDER.ID
                inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on SALESORDER.REVENUEID = FTLI.FINANCIALTRANSACTIONID
                inner join dbo.REVENUESPLIT_EXT on FTLI.ID = REVENUESPLIT_EXT.ID
                inner join dbo.REVENUESPLITORDER on FTLI.ID = REVENUESPLITORDER.ID
                left outer join dbo.EVENTREGISTRANTPAYMENT on FTLI.ID = EVENTREGISTRANTPAYMENT.PAYMENTID
                where 
                    (
                        (REVENUESPLITORDER.PROGRAMID = SOURCEITEMS.PROGRAMID and REVENUESPLITORDER.EVENTID is null)
                        or (REVENUESPLITORDER.EVENTID = SOURCEITEMS.EVENTID and SOURCEITEMS.REGISTRANTID is null)
                        or (EVENTREGISTRANTPAYMENT.REGISTRANTID = SOURCEITEMS.REGISTRANTID and REVENUESPLIT_EXT.TYPECODE = 1)
                    )
                    --OR (REVENUESPLITORDER.MEMBERSHIPLEVELID = SOURCEITEMS.MEMBERSHIPLEVELID)

                    or (FTLI.ID = SOURCEITEMS.MEMBERSHIPREVENUESPLITID)
                    or (REVENUESPLITORDER.FEEID = SOURCEITEMS.FEEID)
                    or (REVENUESPLITORDER.TAXID = SOURCEITEMS.TAXID)
                    or (REVENUESPLITORDER.MERCHANDISEPRODUCTINSTANCEID = SOURCEITEMS.MERCHANDISEPRODUCTINSTANCEID)
                    or (REVENUESPLITORDER.MEMBERSHIPADDONID = SOURCEITEMS.MEMBERSHIPADDONID)
                    or (REVENUESPLITORDER.DESIGNATIONID = SOURCEITEMS.DESIGNATIONID and REVENUESPLITORDER.ID = SOURCEITEMS.SOURCELINEITEMID)
                group by FTLI.ID, FTLI.FINANCIALTRANSACTIONID, CREDITPAYMENT.AMOUNT, SOURCEITEMS.CREDITAMOUNT, CREDITPAYMENT.ID, REVENUESPLIT_EXT.TYPE, SALESORDER.SEQUENCEID, REVENUESPLIT_EXT.TYPECODE, CREDITPAYMENT.PAYMENTMETHODCODE, SOURCEITEMS.CREDITITEMID


                --back office event registrations.

                union all
                select ORIGLI.ID as REVENUESPLITID,
                    ORIGLI.FINANCIALTRANSACTIONID,
                    REVENUESPLIT_EXT.TYPE,
                    CREDITPAYMENT.AMOUNT AS REFUNDPAYMENTTOTAL,
                    FT.TRANSACTIONAMOUNT AS REFUNDSPLITAMOUNT, -- 2013-7-12 SW: formerly, using CREDITPAYMENT amount here caused payments to be prorated according to each other's values. Similar change below for membership may be necessary if we ever allow multiple backoffice payments toward a single membership.

                    FT.TRANSACTIONAMOUNT AS CREDITAMOUNT,
                    CREDITPAYMENT.ID AS CREDITPAYMENTID,
                    REVENUESPLIT_EXT.TYPECODE,
                    [CREDITPAYMENT].[PAYMENTMETHODCODE],
                    REFUNDLI.ID [CREDITITEMID]
                from dbo.CREDIT_EXT CREDIT
                inner join dbo.FINANCIALTRANSACTION FT on FT.ID = CREDIT.ID
                inner join dbo.CREDITPAYMENT on CREDITPAYMENT.CREDITID = CREDIT.ID
                inner join dbo.FINANCIALTRANSACTIONLINEITEM ORIGLI on ORIGLI.ID = CREDITPAYMENT.REVENUESPLITID
                inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = ORIGLI.ID
                left join dbo.FINANCIALTRANSACTIONLINEITEM REFUNDLI on REFUNDLI.SOURCELINEITEMID = ORIGLI.ID
                where 
                    CREDIT.SALESORDERID is null
                    and CREDIT.ID = @CREDITID
                    and REVENUESPLIT_EXT.TYPECODE = 1

                --Security deposit refund

                union all
                select
                    FTLI.ID as REVENUESPLITID,
                    FTLI.FINANCIALTRANSACTIONID,
                    REVENUESPLIT_EXT.TYPE,
                    CP.AMOUNT AS REFUNDPAYMENTTOTAL,
                    CP.AMOUNT AS REFUNDSPLITAMOUNT,
                    FT.TRANSACTIONAMOUNT AS CREDITAMOUNT,
                    CP.ID AS CREDITPAYMENTID,
                    REVENUESPLIT_EXT.TYPECODE,
                    [CP].[PAYMENTMETHODCODE],
                    LI.ID [CREDITITEMID]
                from dbo.CREDIT_EXT CREDIT
                inner join dbo.FINANCIALTRANSACTION FT on FT.ID = CREDIT.ID
                inner join dbo.CREDITPAYMENT CP ON CREDIT.ID = CP.CREDITID
                inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on CP.REVENUESPLITID = FTLI.ID
                inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FTLI.ID
                left join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.SOURCELINEITEMID = FTLI.ID
                where
                    REVENUESPLIT_EXT.TYPECODE = 13 and CREDIT.ID = @CREDITID

                -- Donation refund

                union all
                select
                    FTLI.ID as REVENUESPLITID,
                    FTLI.FINANCIALTRANSACTIONID,
                    REVENUESPLIT_EXT.TYPE,
                    CP.AMOUNT AS REFUNDPAYMENTTOTAL,
                    LI.TRANSACTIONAMOUNT AS REFUNDSPLITAMOUNT,
                    FT.TRANSACTIONAMOUNT AS CREDITAMOUNT,
                    CP.ID AS CREDITPAYMENTID,
                    REVENUESPLIT_EXT.TYPECODE,
                    [CP].[PAYMENTMETHODCODE],
                    CREDITITEM.ID CREDITITEMID
                from dbo.CREDITITEM_EXT CREDITITEM 
                inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = CREDITITEM.ID
                inner join dbo.FINANCIALTRANSACTION FT on FT.ID = LI.FINANCIALTRANSACTIONID
                inner join dbo.CREDITPAYMENT CP on CREDITITEM.CREDITID = CP.CREDITID
                inner join dbo.SALESORDERITEM on CREDITITEM.SALESORDERITEMID    = SALESORDERITEM.ID
                inner join dbo.SALESORDERITEMDONATION on SALESORDERITEMDONATION.ID = SALESORDERITEM.ID
                inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on SALESORDERITEMDONATION.REVENUESPLITID = FTLI.ID
                inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FTLI.ID
                where
                    REVENUESPLIT_EXT.TYPECODE = 0 and CREDITITEM.CREDITID = @CREDITID

                --back office membership and membership add-ons.

                --these work differently because we cannot populate the revenuesplitid

                --on the credit payment table (the credit payment

                --is not associated with just one revenue split)

                union all
                select
                    FINANCIALTRANSACTIONLINEITEM.SOURCELINEITEMID as REVENUESPLITID,
                        FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID as REVENUEID,
                        CREDITITEM_EXT.TYPE,
                        FINANCIALTRANSACTION.ORGAMOUNT AS REFUNDPAYMENTTOTAL,
                        FINANCIALTRANSACTIONLINEITEM.ORGAMOUNT AS REFUNDSPLITAMOUNT,
                        FINANCIALTRANSACTION.ORGAMOUNT AS CREDITAMOUNT,
                        CREDITPAYMENT.ID AS CREDITPAYMENTID,
                        CREDITITEM_EXT.TYPECODE,
                        CREDITPAYMENT.PAYMENTMETHODCODE,
                        FINANCIALTRANSACTIONLINEITEM.ID CREDITITEMID
                from dbo.CREDIT_EXT
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = CREDIT_EXT.ID
                    inner join dbo.CREDITITEM_EXT ON CREDITITEM_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
                    inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = CREDIT_EXT.ID
                    inner join dbo.CREDITPAYMENT on CREDITPAYMENT.CREDITID = CREDIT_EXT.ID
                where
                    CREDIT_EXT.SALESORDERID is null
                    and CREDIT_EXT.ID = @CREDITID
                    and (CREDITITEM_EXT.TYPECODE = 16 or CREDITITEM_EXT.TYPECODE = 1)
                    and CREDITITEM_EXT.SALESORDERITEMID is null
            ),
            DISTRIBUTIONS_CTE as (
                select
                    CREDITAMOUNTS.CREDITPAYMENTID,
                    DISTRIBUTIONS.ID as REVENUESPLITID,
                    DISTRIBUTIONS.AMOUNT,
                    DISTRIBUTIONS.CREDITITEMID
                from (
                    select distinct
                        CREDITPAYMENTID, CREDITAMOUNT, REFUNDPAYMENTTOTAL
                    from SOURCESPLITS_CTE
                ) as CREDITAMOUNTS
                outer apply (
                    select
                        ID, AMOUNT, CREDITITEMID
                    from dbo.UFN_SPLITS_GETPRORATEDSPLITS(CREDITAMOUNTS.CREDITAMOUNT, CREDITAMOUNTS.REFUNDPAYMENTTOTAL,
                        (
                            select
                                SOURCESPLITS_CTE.REVENUESPLITID as ID, 
                                SOURCESPLITS_CTE.REFUNDSPLITAMOUNT as AMOUNT,
                                SOURCESPLITS_CTE.CREDITITEMID
                            from SOURCESPLITS_CTE
                            where SOURCESPLITS_CTE.CREDITPAYMENTID = CREDITAMOUNTS.CREDITPAYMENTID
                            for xml raw('ITEM'), type, elements, root('AMOUNTSTOPRORATE'), binary base64
                        )
                    )
                ) as DISTRIBUTIONS
            )

            select distinct
                SPLITS.REVENUESPLITID,
                SPLITS.CREDITPAYMENTID,
                'Refund-'+SPLITS.TYPE as REFERENCE,
                DISTRIBUTIONS_CTE.AMOUNT,
                [SPLITS].[TYPECODE] as [REVENUETYPECODE],
                [SPLITS].[PAYMENTMETHODCODE],
                SPLITS.CREDITITEMID
            from
                SOURCESPLITS_CTE as SPLITS
            inner join
                DISTRIBUTIONS_CTE on DISTRIBUTIONS_CTE.CREDITPAYMENTID = SPLITS.CREDITPAYMENTID and DISTRIBUTIONS_CTE.CREDITITEMID = SPLITS.CREDITITEMID
            inner join 
                dbo.CREDITITEM_EXT on SPLITS.CREDITITEMID = CREDITITEM_EXT.ID 
            where CREDITITEM_EXT.CREDITID = @CREDITID