UFN_REFUND_GETPRORATEDDISCOUNTSPLITS
Returns prorated discount 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_GETPRORATEDDISCOUNTSPLITS(@CREDITID uniqueidentifier)
returns table as
return
-- Order-level discounts. They have their own refund line items, which makes this queery the simplest.
select
ORIGINALDISCOUNTLI.SOURCELINEITEMID as REVENUESPLITID,
REFUNDEDDISCOUNTLI.ID as CREDITITEMID,
ORIGINALDISCOUNTLI.ID as DISCOUNTCREDITITEMID,
'Refund-Discount-Order-' + convert(nvarchar(50), SALESORDER.SEQUENCEID) as REFERENCE,
ORIGINALDISCOUNTLI.BASEAMOUNT as AMOUNT
from dbo.FINANCIALTRANSACTIONLINEITEM REFUNDEDDISCOUNTLI
inner join dbo.FINANCIALTRANSACTIONLINEITEM ORIGINALDISCOUNTLI on ORIGINALDISCOUNTLI.ID = REFUNDEDDISCOUNTLI.SOURCELINEITEMID
inner join dbo.SALESORDER on SALESORDER.REVENUEID = ORIGINALDISCOUNTLI.FINANCIALTRANSACTIONID
where REFUNDEDDISCOUNTLI.FINANCIALTRANSACTIONID = @CREDITID
and ORIGINALDISCOUNTLI.TYPECODE = 5 -- Discount
and ORIGINALDISCOUNTLI.BASEAMOUNT <> 0
union all
-- Item-level discounts. Their refunds do not exist as line items, so we have to twist back through RSO.
select
ORDERLI.ID as REVENUESPLITID,
REFUNDLI_EXT.ID as CREDITITEMID,
DISCOUNTITEM.ID as DISCOUNTCREDITITEMID,
'Refund-Discount-Order-' + convert(nvarchar(50),SALESORDER.SEQUENCEID) as REFERENCE,
CREDITITEMITEMDISCOUNT.AMOUNT
from dbo.CREDITITEM_EXT REFUNDLI_EXT -- refunded ticket or merch item's ext
inner join dbo.CREDITITEMITEMDISCOUNT on REFUNDLI_EXT.ID = CREDITITEMITEMDISCOUNT.CREDITITEMID -- reversed item-level discount for the refunded ticket or merch item
inner join dbo.SALESORDERITEMITEMDISCOUNT on CREDITITEMITEMDISCOUNT.SALESORDERITEMITEMDISCOUNTID = SALESORDERITEMITEMDISCOUNT.ID -- original item-level discount
inner join dbo.SALESORDERITEM on REFUNDLI_EXT.SALESORDERITEMID = SALESORDERITEM.ID -- original ticket or merch item
left join dbo.SALESORDERITEMTICKET on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
left join dbo.SALESORDERITEMMERCHANDISE on SALESORDERITEM.ID = SALESORDERITEMMERCHANDISE.ID
inner join dbo.SALESORDER on SALESORDERITEM.SALESORDERID = SALESORDER.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM as ORDERLI on ORDERLI.FINANCIALTRANSACTIONID = SALESORDER.REVENUEID -- ticket or merch item's order line item
inner join dbo.REVENUESPLITORDER on ORDERLI.ID = REVENUESPLITORDER.ID
cross apply (
select top 1
DISCOUNTLI.ID
from dbo.FINANCIALTRANSACTIONLINEITEM DISCOUNTLI
inner join dbo.CREDITITEM_EXT DISCOUNTLI_EXT on DISCOUNTLI_EXT.ID = DISCOUNTLI.ID
where
DISCOUNTLI.TYPECODE = 5
and DISCOUNTLI_EXT.DISCOUNTID = SALESORDERITEMITEMDISCOUNT.DISCOUNTID
and DISCOUNTLI.SOURCELINEITEMID = ORDERLI.ID
) DISCOUNTITEM
where
(
(REVENUESPLITORDER.PROGRAMID = SALESORDERITEMTICKET.PROGRAMID and SALESORDERITEMTICKET.EVENTID is null)
or REVENUESPLITORDER.EVENTID = SALESORDERITEMTICKET.EVENTID
or REVENUESPLITORDER.MERCHANDISEPRODUCTINSTANCEID = SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID
)
and REFUNDLI_EXT.CREDITID = @CREDITID
and CREDITITEMITEMDISCOUNT.AMOUNT > 0
and ORDERLI.DELETEDON is null
and ORDERLI.TYPECODE <> 1 -- Reversal
union all
-- Discounts for membership revenue.
select
REFUNDMEMBERSHIPLI.SOURCELINEITEMID REVENUESPLITID,
REFUNDMEMBERSHIPLI.ID as CREDITITEMID,
DISCOUNTITEM.ID as DISCOUNTCREDITITEMID,
'Refund-Discount-Order-' + convert(nvarchar(50),SALESORDER.SEQUENCEID) as REFERENCE,
case
when CONTRIBUTEDREVENUE.AMOUNT > 0 and CREDITITEMMEMBERSHIPITEMPROMOTION.AMOUNT > CONTRIBUTEDREVENUE.AMOUNT then
CREDITITEMMEMBERSHIPITEMPROMOTION.AMOUNT - CONTRIBUTEDREVENUE.AMOUNT
else
CREDITITEMMEMBERSHIPITEMPROMOTION.AMOUNT
end AMOUNT
from dbo.FINANCIALTRANSACTIONLINEITEM REFUNDMEMBERSHIPLI
inner join dbo.CREDITITEM_EXT REFUNDMEMBERSHIPLI_EXT on REFUNDMEMBERSHIPLI_EXT.ID = REFUNDMEMBERSHIPLI.ID
inner join dbo.CREDITITEMMEMBERSHIPITEMPROMOTION on REFUNDMEMBERSHIPLI_EXT.ID = CREDITITEMMEMBERSHIPITEMPROMOTION.CREDITITEMID
inner join dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION on CREDITITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMMEMBERSHIPITEMPROMOTIONID = SALESORDERITEMMEMBERSHIPITEMPROMOTION.ID
inner join dbo.SALESORDERITEM on REFUNDMEMBERSHIPLI_EXT.SALESORDERITEMID = SALESORDERITEM.ID
inner join dbo.SALESORDER on SALESORDERITEM.SALESORDERID = SALESORDER.ID
cross apply (
select top 1
MEMBERSHIPPROMOLI_EXT.ID
from dbo.FINANCIALTRANSACTIONLINEITEM MEMBERSHIPPROMOLI
inner join dbo.CREDITITEM_EXT MEMBERSHIPPROMOLI_EXT on MEMBERSHIPPROMOLI_EXT.ID = MEMBERSHIPPROMOLI.ID
where MEMBERSHIPPROMOLI.TYPECODE = 5
and MEMBERSHIPPROMOLI_EXT.SALESORDERITEMMEMBERSHIPITEMPROMOTIONID = SALESORDERITEMMEMBERSHIPITEMPROMOTION.ID
and MEMBERSHIPPROMOLI.SOURCELINEITEMID = REFUNDMEMBERSHIPLI.SOURCELINEITEMID
) DISCOUNTITEM
outer apply (
select
sum(DONATIONLI.BASEAMOUNT) as AMOUNT
from dbo.FINANCIALTRANSACTIONLINEITEM DONATIONLI
inner join dbo.REVENUESPLIT_EXT DONATIONLI_EXT on DONATIONLI_EXT.ID = DONATIONLI.ID
where DONATIONLI.SOURCELINEITEMID = REFUNDMEMBERSHIPLI.SOURCELINEITEMID
and DONATIONLI_EXT.TYPECODE = 0
and DONATIONLI_EXT.APPLICATIONCODE = 0
) CONTRIBUTEDREVENUE
where REFUNDMEMBERSHIPLI_EXT.CREDITID = @CREDITID
and CREDITITEMMEMBERSHIPITEMPROMOTION.AMOUNT > 0
and (isnull(CONTRIBUTEDREVENUE.AMOUNT, 0) <= 0 or CREDITITEMMEMBERSHIPITEMPROMOTION.AMOUNT > CONTRIBUTEDREVENUE.AMOUNT)
union all
-- Discounts for contributed revenue on memberships.
select
DONATIONLI.ID REVENUESPLITID,
REFUNDMEMBERSHIPLI.ID CREDITITEMID,
DISCOUNTLI_EXT.ID DISCOUNTCREDITITEMID,
'Refund-' + DONATIONLI_EXT.[TYPE] as REFERENCE,
DONATIONLI.ORGAMOUNT - isnull(PAYMENTDONATIONLI.ORGAMOUNT, 0) AMOUNT
from dbo.CREDITITEM_EXT REFUNDMEMBERSHIPLI_EXT
inner join dbo.CREDITITEMMEMBERSHIPITEMPROMOTION on REFUNDMEMBERSHIPLI_EXT.ID = CREDITITEMMEMBERSHIPITEMPROMOTION.CREDITITEMID
inner join dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION on CREDITITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMMEMBERSHIPITEMPROMOTIONID = SALESORDERITEMMEMBERSHIPITEMPROMOTION.ID
inner join dbo.CREDITITEM_EXT DISCOUNTLI_EXT on DISCOUNTLI_EXT.SALESORDERITEMMEMBERSHIPITEMPROMOTIONID = SALESORDERITEMMEMBERSHIPITEMPROMOTION.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM REFUNDMEMBERSHIPLI on REFUNDMEMBERSHIPLI.ID = REFUNDMEMBERSHIPLI_EXT.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM MEMBERSHIPLI on MEMBERSHIPLI.ID = REFUNDMEMBERSHIPLI.SOURCELINEITEMID
inner join dbo.REVENUESPLIT_EXT MEMBERSHIPLI_EXT on MEMBERSHIPLI_EXT.ID = MEMBERSHIPLI.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM DONATIONLI on DONATIONLI.SOURCELINEITEMID = MEMBERSHIPLI.ID
inner join dbo.REVENUESPLIT_EXT DONATIONLI_EXT on DONATIONLI_EXT.ID = DONATIONLI.ID
left join dbo.FINANCIALTRANSACTIONLINEITEM PAYMENTDONATIONLI on PAYMENTDONATIONLI.SOURCELINEITEMID = DONATIONLI.ID
left join dbo.REVENUESPLIT_EXT PAYMENTDONATIONLI_EXT on PAYMENTDONATIONLI_EXT.ID = PAYMENTDONATIONLI.ID
left join dbo.FINANCIALTRANSACTION PAYMENTDONATIONFT on PAYMENTDONATIONFT.ID = PAYMENTDONATIONLI.FINANCIALTRANSACTIONID
where REFUNDMEMBERSHIPLI_EXT.CREDITID = @CREDITID
and CREDITITEMMEMBERSHIPITEMPROMOTION.AMOUNT > 0
and MEMBERSHIPLI_EXT.TYPECODE = 2 --membership
and MEMBERSHIPLI_EXT.APPLICATIONCODE = 5 --membership
and DONATIONLI_EXT.TYPECODE = 0 --Gift
and DONATIONLI_EXT.APPLICATIONCODE = 0 --Donation
and (PAYMENTDONATIONFT.ID is null or PAYMENTDONATIONFT.TYPECODE = 0) --Standard (don't want to grab refund payments)
and (PAYMENTDONATIONLI_EXT.ID is null or PAYMENTDONATIONLI_EXT.TYPECODE = 0) --gift
and (PAYMENTDONATIONLI_EXT.ID is null or PAYMENTDONATIONLI_EXT.APPLICATIONCODE = 10); --order (payments applied to order)