UFN_CREDIT_GETSALESORDERITEMS
Returns order items for a given sales order id
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SALESORDERID | uniqueidentifier | IN |
Definition
Copy
CREATE function dbo.UFN_CREDIT_GETSALESORDERITEMS
(
@SALESORDERID uniqueidentifier
) returns @SALESORDERITEMS table
(
SALESORDERITEMID uniqueidentifier,
DESCRIPTION nvarchar(510),
QUANTITY decimal(20,4),
QUANTITYREFUNDING int,
PRICE money,
FEES money,
TOTAL money,
REFUNDTOTAL money,
DISCOUNTS money,
INCLUDE bit,
DISCOUNTED bit,
TYPECODE int,
PROGRAMID uniqueidentifier, --program id for tickets, merchandise department id for merch
ISCOMBINATION bit,
GROUPID uniqueidentifier,
GROUPTYPECODE tinyint,
ITEMID uniqueidentifier,
REVENUESPLITID uniqueidentifier,
HASCONTRIBUTEDREVENUE bit
)
begin
-- Adding this table to save some performance tax later on when linking back to the revenue split for the item
declare @ITEMS table (
SALESORDERITEMID uniqueidentifier,
DESCRIPTION nvarchar(510),
QUANTITY decimal(20,4),
QUANTITYREFUNDING int,
PRICE money,
FEES money,
TOTAL money,
REFUNDTOTAL money,
DISCOUNTS money,
INCLUDE bit,
DISCOUNTED bit,
TYPECODE int,
PROGRAMID uniqueidentifier,
ISCOMBINATION bit,
GROUPID uniqueidentifier,
GROUPTYPECODE tinyint,
ITEMID uniqueidentifier,
REVENUESPLITID uniqueidentifier,
MEMBERSHIPTRANSACTIONID uniqueidentifier,
/*
Fields used to link back to the order split for the item for
the cases that we have to get it from REVENUESPLITORDER
*/
EVENTID uniqueidentifier,
DESIGNATIONID uniqueidentifier,
FEEID uniqueidentifier,
MERCHANDISEPRODUCTINSTANCEID uniqueidentifier,
REGISTRANTID uniqueidentifier,
/* end linking back fields */
HASCONTRIBUTEDREVENUE bit
)
declare @CALCULATEDFIELDS table (
[SALESORDERITEMID] uniqueidentifier,
[QUANTITY] decimal(20,4),
[FEES] money,
[DISCOUNTS] money,
[PROGRAMID] uniqueidentifier -- program id for tickets, merchandise department id for merch
);
insert into @CALCULATEDFIELDS
select
[SALESORDERITEM].[ID],
case
when [SALESORDERITEM].[TYPECODE] = 0 then
[SALESORDERITEM].[QUANTITY] - coalesce(
(
select count(*)
from dbo.[TICKET]
where [TICKET].[SALESORDERITEMTICKETID] = [SALESORDERITEM].[ID]
and ([TICKET].[STATUSCODE] not in (0,1) or [TICKET].[APPLIEDTOMEMBERSHIP] = 1)
), 0)
else
[SALESORDERITEM].[QUANTITY] - REFUNDTOTALS.QUANTITY
end as [QUANTITY],
FEESAMOUNT.AMOUNT - REFUNDTOTALS.FEES as [FEES],
case SALESORDERITEM.TYPECODE
when 1 then
isnull(MEMBERSHIPPROMOAMOUNT.AMOUNT, 0) + SALESORDERITEMMEMBERSHIPITEMPROMOTIONAMOUNT.AMOUNT
else (
select coalesce(sum([AMOUNT]),0.0)
from dbo.[SALESORDERITEMITEMDISCOUNT]
where [SALESORDERITEMID] = [SALESORDERITEM].[ID]
)
end as [DISCOUNTS],
case [SALESORDERITEM].[TYPECODE]
when 0 then--tickets
[SALESORDERITEMTICKET].[PROGRAMID]
when 14 then --merchandise
[SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID]
else
null
end [PROGRAMID]
from dbo.[SALESORDERITEM]
left join dbo.[SALESORDERITEMTICKET]
on [SALESORDERITEM].[ID] = [SALESORDERITEMTICKET].[ID]
left join dbo.[SALESORDERITEMMERCHANDISE]
on [SALESORDERITEM].[ID] = [SALESORDERITEMMERCHANDISE].[ID]
outer apply (
select isnull(sum(FEEITEM.TOTAL), 0) as AMOUNT
from dbo.SALESORDERITEMFEE
inner join dbo.SALESORDERITEM as FEEITEM on FEEITEM.ID = SALESORDERITEMFEE.ID
where SALESORDERITEMFEE.SALESORDERITEMID = SALESORDERITEM.ID
) as FEESAMOUNT
outer apply (
select
isnull(sum(LI.QUANTITY), 0) as QUANTITY,
isnull(sum(EXT.FEES), 0) as FEES
from dbo.FINANCIALTRANSACTIONLINEITEM as LI
inner join dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
where EXT.SALESORDERITEMID = SALESORDERITEM.ID
) as REFUNDTOTALS
outer apply (
select
case
when MEMBERSHIPPROMOITEM.[PERCENT] > 0 then
SALESORDERITEM.TOTAL * MEMBERSHIPPROMOITEM.[PERCENT] * 0.01
else
MEMBERSHIPPROMOITEM.PRICE
end as AMOUNT
from dbo.SALESORDERITEM as MEMBERSHIPPROMOITEM
inner join dbo.SALESORDERITEMMEMBERSHIPPROMO on SALESORDERITEMMEMBERSHIPPROMO.ID = SALESORDERITEM.ID
where
MEMBERSHIPPROMOITEM.SALESORDERID = @SALESORDERID
and MEMBERSHIPPROMOITEM.PRICE > 0
and SALESORDERITEMMEMBERSHIPPROMO.INUSE = 1
) as MEMBERSHIPPROMOAMOUNT
outer apply (
select isnull(sum(SALESORDERITEMMEMBERSHIPITEMPROMOTION.AMOUNT), 0) as AMOUNT
from dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
where SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID = SALESORDERITEM.ID
) as SALESORDERITEMMEMBERSHIPITEMPROMOTIONAMOUNT
where
[SALESORDERITEM].[SALESORDERID] = @SALESORDERID
declare @DISCOUNTEDPROGRAMS dbo.UDT_GENERICID;
insert into @DISCOUNTEDPROGRAMS
select distinct
coalesce([SALESORDERITEMTICKET].[PROGRAMID], [SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID])
from dbo.[SALESORDERITEM]
left join dbo.[SALESORDERITEMTICKET] on [SALESORDERITEMTICKET].[ID] = [SALESORDERITEM].[ID]
inner join @CALCULATEDFIELDS as [CALCULATEDFIELDS] on [CALCULATEDFIELDS].[SALESORDERITEMID] = [SALESORDERITEM].[ID]
left join dbo.[SALESORDERITEMMERCHANDISE] on [SALESORDERITEM].[ID] = [SALESORDERITEMMERCHANDISE].[ID]
where [SALESORDERID] = @SALESORDERID
and [CALCULATEDFIELDS].[DISCOUNTS] > 0
and (SALESORDERITEMTICKET.PROGRAMID is not null or SALESORDERITEMMERCHANDISE.MERCHANDISEDEPARTMENTID is not null);
--Select only valid items that belong to this order
insert into @ITEMS
select
[SALESORDERITEM].[ID],
case
when [SALESORDERITEM].[TYPECODE] = 0 and [SALESORDERITEMTICKET].[EVENTID] is not null then
[SALESORDERITEM].[DESCRIPTION] + ' - ' + convert(nvarchar(8),[EVENT].[STARTDATE], 1) + ' ' + dbo.UFN_HOURMINUTE_DISPLAYTIME([EVENT].[STARTTIME])
when [SALESORDERITEM].[TYPECODE] = 6 then
dbo.UFN_CONSTITUENT_BUILDNAME([REGISTRANT].[CONSTITUENTID]) + ' - ' + [SALESORDERITEM].[DESCRIPTION]
else
[SALESORDERITEM].[DESCRIPTION]
end [DESCRIPTION],
[CALCULATEDFIELDS].[QUANTITY],
0 as [QUANTITYREFUNDING],
[SALESORDERITEM].[PRICE],
[CALCULATEDFIELDS].[FEES] / [CALCULATEDFIELDS].[QUANTITY],
([CALCULATEDFIELDS].[QUANTITY] * [SALESORDERITEM].[PRICE]) + [CALCULATEDFIELDS].[FEES] - [CALCULATEDFIELDS].[DISCOUNTS] as [TOTAL],
0 as [REFUNDTOTAL],
[CALCULATEDFIELDS].[DISCOUNTS],
0,
case
when [CALCULATEDFIELDS].[PROGRAMID] in
(select ID from @DISCOUNTEDPROGRAMS) or
(select sum([AMOUNT]) from dbo.[SALESORDERITEMORDERDISCOUNTDETAIL] where[SALESORDERITEMORDERDISCOUNTDETAIL].[SALESORDERITEMID] = [SALESORDERITEM].[ID]) > 0
then
1
when [SALESORDERITEM].[TYPECODE] = 1 and [CALCULATEDFIELDS].[DISCOUNTS] > 0
then 1
else
0
end [DISCOUNTED],
[SALESORDERITEM].[TYPECODE],
[CALCULATEDFIELDS].[PROGRAMID],
0,
case
when [SALESORDERITEM].[TYPECODE] = 6
then
[SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
else
null
end [GROUPID],
case
when [SALESORDERITEM].[TYPECODE] = 6
then
1
else
0
end [GROUPTYPECODE],
case
when [SALESORDERITEM].[TYPECODE] = 16 then
[SALESORDERITEMMEMBERSHIPADDON].[MEMBERSHIPADDONID]
when [SALESORDERITEM].[TYPECODE] = 1 then
[SALESORDERITEMMEMBERSHIP].[MEMBERSHIPTRANSACTIONID]
else
null
end [ITEMID],
-- We already have the addon/transaction, so grab the revenuesplitid now for memberships/addons
case
when SALESORDERITEM.TYPECODE = 16 then
[MEMBERSHIPADDON].[REVENUESPLITID]
when SALESORDERITEM.TYPECODE = 1 then
MEMBERSHIPTRANSACTION.REVENUESPLITID
else
null
end REVENUESPLITID,
case
when [SALESORDERITEM].[TYPECODE] = 16 then
[MEMBERSHIPADDON].[MEMBERSHIPTRANSACTIONID]
else
[SALESORDERITEMMEMBERSHIP].[MEMBERSHIPTRANSACTIONID]
end [MEMBERSHIPTRANSACTIONID],
SALESORDERITEMTICKET.EVENTID,
SALESORDERITEMDONATION.DESIGNATIONID,
SALESORDERITEMFEE.FEEID,
SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID,
SALESORDERITEMEVENTREGISTRATION.REGISTRANTID,
0 as HASCONTRIBUTEDREVENUE
from dbo.[SALESORDERITEM]
inner join dbo.SALESORDER
on SALESORDER.ID = SALESORDERITEM.SALESORDERID
inner join @CALCULATEDFIELDS as [CALCULATEDFIELDS]
on [SALESORDERITEM].[ID] = [CALCULATEDFIELDS].[SALESORDERITEMID]
left outer join dbo.[SALESORDERITEMTICKET]
on [SALESORDERITEM].[ID] = [SALESORDERITEMTICKET].[ID]
left outer join dbo.[SALESORDERITEMTICKETCOMBINATION]
on [SALESORDERITEMTICKET].[ID] = [SALESORDERITEMTICKETCOMBINATION].[ID]
left outer join dbo.[EVENT]
on [SALESORDERITEMTICKET].[EVENTID] = [EVENT].[ID]
left outer join [dbo].[SALESORDERITEMFEE]
on [dbo].[SALESORDERITEMFEE].[ID] = [dbo].[SALESORDERITEM].[ID]
left outer join dbo.[SALESORDERITEMEVENTREGISTRATION]
on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]
left outer join dbo.[REGISTRANT]
on [REGISTRANT].ID = SALESORDERITEMEVENTREGISTRATION.REGISTRANTID
left outer join dbo.[SALESORDERITEMMEMBERSHIPADDON]
on [SALESORDERITEMMEMBERSHIPADDON].[ID] = [SALESORDERITEM].[ID]
left outer join dbo.[MEMBERSHIPADDON]
on [MEMBERSHIPADDON].[ID] = [SALESORDERITEMMEMBERSHIPADDON].[MEMBERSHIPADDONID]
left outer join dbo.SALESORDERITEMMEMBERSHIP
on SALESORDERITEMMEMBERSHIP.ID = SALESORDERITEM.ID
left outer join dbo.MEMBERSHIPTRANSACTION
on SALESORDERITEMMEMBERSHIP.MEMBERSHIPTRANSACTIONID = MEMBERSHIPTRANSACTION.ID
left outer join dbo.SALESORDERITEMDONATION
on SALESORDERITEMDONATION.ID = SALESORDERITEM.ID
left outer join dbo.SALESORDERITEMMERCHANDISE
on SALESORDERITEMMERCHANDISE.ID = SALESORDERITEM.ID
where
[SALESORDER].ID = @SALESORDERID
and [SALESORDERITEMTICKETCOMBINATION].[ID] is null
and (dbo.UFN_CREDIT_ISVALIDREFUNDTYPE([SALESORDERITEM].[TYPECODE], [SALESORDERITEMFEE].[APPLIESTOCODE]) = 1)
and [CALCULATEDFIELDS].QUANTITY > 0
union all
-- select combination items in the order
select
SALESORDERITEM.ID as [ID],
[COMBINATION].[NAME] + ' - ' + [PRICETYPECODE].[DESCRIPTION] + ' - ' +
stuff((select ';' + case
when [ITEMTICKET].PROGRAMID is not null then P.NAME
else E.NAME + ' ' + convert(nvarchar(8),e.[STARTDATE], 1) + ' ' + dbo.UFN_HOURMINUTE_DISPLAYTIME(e.[STARTTIME])
end
from dbo.[SALESORDERITEM] [ITEM]
inner join dbo.[SALESORDERITEMTICKET] [ITEMTICKET] on [ITEM].[ID] = [ITEMTICKET].[ID]
inner join dbo.[SALESORDERITEMTICKETCOMBINATION] [TICKETCOMBINATION] on [ITEMTICKET].[ID] = [TICKETCOMBINATION].[ID]
left join dbo.[PROGRAM] P on ([ITEMTICKET].[PROGRAMID] = P.[ID] and [ITEMTICKET].[PROGRAMID] is not null)
left join dbo.[EVENT] E on ([ITEMTICKET].[EVENTID] = E.[ID] and [ITEMTICKET].[EVENTID] is not null)
where [TICKETCOMBINATION].TICKETCOMBINATIONID = [SALESORDERITEMTICKETCOMBINATION].TICKETCOMBINATIONID
and ITEMTICKET.PRICETYPECODEID = SALESORDERITEMTICKET.PRICETYPECODEID
order by 1 asc -- this guarantees that programs will be in the same order every time
for xml path('')), 1, 1, '')
as [DESCRIPTION],
[CALCULATEDFIELDS].[QUANTITY] as [QUANTITY],
0 as [QUANTITYREFUNDING],
dbo.UFN_SALESORDER_GETTICKETCOMBINATIONPRICE([SALESORDERITEM].[ID]),
(dbo.UFN_SALESORDER_GETTICKETCOMBINATIONFEES([SALESORDERITEM].[ID]) - dbo.UFN_SALESORDER_GETTICKETCOMBINATIONFEESREFUNDED([SALESORDERITEM].[ID])) / [CALCULATEDFIELDS].[QUANTITY],
[CALCULATEDFIELDS].[QUANTITY] * dbo.UFN_SALESORDER_GETTICKETCOMBINATIONPRICE([SALESORDERITEM].[ID]) + dbo.UFN_SALESORDER_GETTICKETCOMBINATIONFEES([SALESORDERITEM].[ID]) - dbo.UFN_SALESORDER_GETTICKETCOMBINATIONFEESREFUNDED([SALESORDERITEM].[ID]),
0 as [REFUNDTOTAL],
0,
0,
-- combination only is discounted when there is order level discount
case
when exists (select * from dbo.SALESORDERITEMORDERDISCOUNTDETAIL where SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID = SALESORDERITEM.ID) then
1
else
0
end [DISCOUNTED],
[SALESORDERITEM].[TYPECODE],
isnull(SALESORDERITEMTICKET.PROGRAMID, SALESORDERITEMTICKET.EVENTID),
1,
null,
0,
null as [ITEMID],
null as [REVENUESPLITID],
null as [MEMBERSHIPTRANSACTIONID],
SALESORDERITEMTICKET.EVENTID,
null as DESIGNATIONID,
null as FEEID,
null as MERCHANDISEPRODUCTINSTANCEID,
null as REGISTRANTID,
0 as HASCONTRIBUTEDREVENUE
from dbo.[SALESORDERITEM]
inner join @CALCULATEDFIELDS as [CALCULATEDFIELDS] on [SALESORDERITEM].[ID] = [CALCULATEDFIELDS].[SALESORDERITEMID]
inner join dbo.[SALESORDERITEMTICKET] on [SALESORDERITEM].[ID] = [SALESORDERITEMTICKET].[ID]
inner join dbo.[SALESORDERITEMTICKETCOMBINATION] on [SALESORDERITEMTICKET].[ID] = [SALESORDERITEMTICKETCOMBINATION].[ID]
inner join dbo.[COMBINATION] on [SALESORDERITEMTICKETCOMBINATION].[COMBINATIONID] = [COMBINATION].[ID]
inner join dbo.[PRICETYPECODE] on [SALESORDERITEMTICKET].[PRICETYPECODEID] = [PRICETYPECODE].[ID]
where
[SALESORDERITEM].[SALESORDERID] = @SALESORDERID
and [SALESORDERITEM].[QUANTITY] > 0
and [SALESORDERITEMTICKETCOMBINATION].PROGRAMGROUPID in (
-- Selecting top 1 is important here because we only want to match one program group
-- for the refund form to work correctly.
select top 1 ID
from dbo.PROGRAMGROUP
where PROGRAMGROUP.COMBINATIONID = [SALESORDERITEMTICKETCOMBINATION].COMBINATIONID
)
and [CALCULATEDFIELDS].QUANTITY > 0
/*
Update the revenuesplitid field in a separate step since $0 sales order items don't
generate a revenue split if they are the only item of that category (ie only ticket
for that program). Due to this behavior, the above query would require more complex
logic to detect this case. The performance impact is less strenuous if the revenue
split field is updated here for items that do have an associated split.
*/
update ITEMS set
REVENUESPLITID = REVENUESPLIT.ID
from @ITEMS ITEMS
inner join dbo.SALESORDERITEM
on SALESORDERITEM.ID = ITEMS.SALESORDERITEMID
inner join dbo.SALESORDER
on SALESORDER.ID = SALESORDERITEM.SALESORDERID
left outer join dbo.EVENTREGISTRANTPAYMENT
on ITEMS.REGISTRANTID = EVENTREGISTRANTPAYMENT.REGISTRANTID
left outer join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
on REVENUESPLIT.FINANCIALTRANSACTIONID = SALESORDER.REVENUEID
left outer join dbo.REVENUESPLIT_EXT
on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
left outer join dbo.REVENUESPLITORDER
on REVENUESPLIT.ID = REVENUESPLITORDER.ID
-- Membership addons and memberships have already had their revenuespilts populated
where ITEMS.REVENUESPLITID is null and
-- Tickets
(
SALESORDERITEM.TYPECODE <> 0 or (
REVENUESPLITORDER.PROGRAMID = ITEMS.PROGRAMID
and (ITEMS.EVENTID is null or REVENUESPLITORDER.EVENTID = ITEMS.EVENTID)
)
) and
-- Donations
(
SALESORDERITEM.TYPECODE <> 2 or (
REVENUESPLIT_EXT.DESIGNATIONID = ITEMS.DESIGNATIONID
)
) and
-- Fees
(
SALESORDERITEM.TYPECODE <> 3 or (
REVENUESPLITORDER.FEEID = ITEMS.FEEID
)
) and
-- Event registration
(
SALESORDERITEM.TYPECODE <> 6 or (
EVENTREGISTRANTPAYMENT.PAYMENTID = REVENUESPLIT.ID
)
) and
-- Merchandise
(
SALESORDERITEM.TYPECODE <> 14 or (
REVENUESPLITORDER.MERCHANDISEPRODUCTINSTANCEID = ITEMS.MERCHANDISEPRODUCTINSTANCEID
)
)
--Update it if it has contributed revenue
;with CONTRIBUTEDREVENUE_CTE as
(
select
case
when sum(FTLI.TRANSACTIONAMOUNT) > 0 then
1
else
0
end HASCONTRIBUTEDREVENUE,
I.REVENUESPLITID as ID
from @ITEMS I
inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.SOURCELINEITEMID = I.REVENUESPLITID
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FTLI.ID
where REVENUESPLIT_EXT.TYPECODE = 0 and REVENUESPLIT_EXT.APPLICATIONCODE = 0 --only donations
and FTLI.TYPECODE = 0 --only standard ft line items
group by I.REVENUESPLITID
)
update @ITEMS
set HASCONTRIBUTEDREVENUE = CTE.HASCONTRIBUTEDREVENUE
from CONTRIBUTEDREVENUE_CTE CTE where CTE.ID = REVENUESPLITID
insert into @SALESORDERITEMS
select
SALESORDERITEMID,
DESCRIPTION,
QUANTITY,
QUANTITYREFUNDING,
PRICE,
FEES,
TOTAL,
REFUNDTOTAL,
DISCOUNTS,
INCLUDE,
DISCOUNTED,
TYPECODE,
PROGRAMID,
ISCOMBINATION,
GROUPID,
GROUPTYPECODE,
ITEMID,
REVENUESPLITID,
HASCONTRIBUTEDREVENUE
from @ITEMS
order by
case
when TYPECODE = 16 then 1 --group add-ons with memberships
else TYPECODE
end,
MEMBERSHIPTRANSACTIONID,
case --list memberships before add-ons
when TYPECODE = 1 then 1
when TYPECODE = 16 then 2
end,
PROGRAMID,
DESCRIPTION;
return;
end