UFN_REFUND_GETITEMAMOUNTSFORGL
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@CREDITID | uniqueidentifier | IN |
Definition
Copy
CREATE function dbo.UFN_REFUND_GETITEMAMOUNTSFORGL
(
@CREDITID uniqueidentifier
)
returns table
as return
with ORDERDISCOUNTS_CTE as (
select
REFUNDLI.ID,
case when dbo.UFN_REFUND_HASREVERSEDORDERLEVELDISCOUNT(@CREDITID) = 1
then coalesce(TICKET.ORDERLEVELDISCOUNTSAPPLIED, MERCHUNIT.ORDERLEVELDISCOUNTSAPPLIED)
else 0
end as REVERSEDDISCOUNTAMOUNT
from dbo.FINANCIALTRANSACTIONLINEITEM REFUNDLI
inner join dbo.CREDITITEM_EXT REFUNDLI_EXT on REFUNDLI_EXT.ID = REFUNDLI.ID
left join dbo.TICKET on TICKET.ID = REFUNDLI_EXT.SALESORDERITEMIZEDITEMID
left join dbo.SALESORDERITEMMERCHANDISEUNIT MERCHUNIT on MERCHUNIT.ID = REFUNDLI_EXT.SALESORDERITEMIZEDITEMID
where REFUNDLI.FINANCIALTRANSACTIONID = @CREDITID
and REFUNDLI_EXT.TYPECODE in (0, 14) -- Only tickets and merchandise are order-level-discountable.
and coalesce(TICKET.ORDERLEVELDISCOUNTSAPPLIED, MERCHUNIT.ORDERLEVELDISCOUNTSAPPLIED) > 0
),
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 (
-- TODO: figure out if this "distinct" I copied over is necessary
select distinct coalesce(SALESORDERITEMTICKET.PROGRAMID, [EVENT].PROGRAMID) as PROGRAMID,
case REFUNDSPLIT_EXT.TYPECODE
when 1 then -- Membership
REFUNDSPLIT.SOURCELINEITEMID
else
null
end as MEMBERSHIPREVENUESPLITID,
SALESORDERITEMFEE.FEEID,
SALESORDERITEMTAX.TAXID,
coalesce(SALESORDERITEMTICKET.EVENTID, REGISTRANT.EVENTID) as EVENTID,
REGISTRANT.ID as REGISTRANTID,
REFUNDSPLIT_EXT.CREDITID,
REFUNDSPLIT_EXT.ID as CREDITITEMID,
case
when isnull(CONTRIBUTEDREVENUE.AMOUNT, 0) > REFUNDSPLIT_EXT.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 - REFUNDSPLIT_EXT.DISCOUNTS
end TOTAL,
REFUND.TRANSACTIONAMOUNT as CREDITAMOUNT,
CREDIT_EXT.SALESORDERID,
SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID,
SALESORDERITEMMEMBERSHIPADDON.MEMBERSHIPADDONID,
SOURCELIEXT.DESIGNATIONID,
REFUNDSPLIT.SOURCELINEITEMID
from dbo.CREDITITEM_EXT REFUNDSPLIT_EXT
inner join dbo.FINANCIALTRANSACTIONLINEITEM REFUNDSPLIT on REFUNDSPLIT.ID = REFUNDSPLIT_EXT.ID
inner join dbo.FINANCIALTRANSACTION REFUND on REFUND.ID = REFUNDSPLIT.FINANCIALTRANSACTIONID
left join dbo.SALESORDERITEM ON SALESORDERITEM.ID = REFUNDSPLIT_EXT.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 = REFUNDSPLIT.ID
inner join dbo.CREDIT_EXT on CREDIT_EXT.ID = REFUNDSPLIT_EXT.CREDITID
inner join dbo.REVENUESPLIT_EXT SOURCELIEXT on SOURCELIEXT.ID = REFUNDSPLIT.SOURCELINEITEMID
cross apply (
select
(REFUNDSPLIT.QUANTITY * REFUNDSPLIT.UNITVALUE)
- coalesce((select REVERSEDDISCOUNTAMOUNT from ORDERDISCOUNTS_CTE OD where OD.ID = REFUNDSPLIT_EXT.ID), 0) as TOTAL
) as CREDITITEMMINUSDICOUNT -- This represents the value of the split after Order-level discounts are removed (if applicable)
where
REFUNDSPLIT_EXT.CREDITID = @CREDITID and
CREDITITEMMINUSDICOUNT.TOTAL > 0 and
CREDIT_EXT.SALESORDERID is not null
)
-- Normal sales items
select
FTLI.ID as REVENUESPLITID,
FTLI.FINANCIALTRANSACTIONID,
REVENUESPLIT_EXT.TYPE +'-Order-'+ convert(nvarchar(50), SALESORDER.SEQUENCEID) as TYPE,
CP.AMOUNT as REFUNDPAYMENTTOTAL,
sum(SOURCEITEMS.TOTAL) as REFUNDSPLITAMOUNT,
SOURCEITEMS.CREDITAMOUNT as CREDITAMOUNT,
CP.ID as CREDITPAYMENTID,
REVENUESPLIT_EXT.TYPECODE,
CP.PAYMENTMETHODCODE,
SOURCEITEMS.CREDITITEMID
from SOURCEITEMS_CTE as SOURCEITEMS
inner join dbo.CREDITPAYMENT CP on SOURCEITEMS.CREDITID = CP.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 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 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) -- TODO: sourcelineitemid implies contributed revenue? Why is this here, but normal donations are treated separately?
group by FTLI.ID, FTLI.FINANCIALTRANSACTIONID, CP.AMOUNT, SOURCEITEMS.CREDITAMOUNT, CP.ID, REVENUESPLIT_EXT.TYPE, SALESORDER.SEQUENCEID, REVENUESPLIT_EXT.TYPECODE, CP.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;