USP_DATALIST_SALESREPORT
Returns list of sales revenue by sales order item type.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@FROM | datetime | IN | from |
@TO | datetime | IN | to |
@SALESMETHODID | uniqueidentifier | IN | Sales method |
Definition
Copy
CREATE procedure dbo.USP_DATALIST_SALESREPORT
(
@FROM datetime = null,
@TO datetime = null,
@SALESMETHODID uniqueidentifier = null
)
with recompile
as
set nocount on;
declare @SALESMETHODTYPECODE tinyint = null;
select @SALESMETHODTYPECODE = [TYPECODE]
from dbo.[SALESMETHOD]
where [ID] = @SALESMETHODID;
set @FROM = dbo.UFN_DATE_GETEARLIESTTIME(@FROM)
set @TO = dbo.UFN_DATE_GETLATESTTIME(@TO)
--Note, since users want to see the report in order of Admission, Events, and Memberships... SALESORDERITEM.TYPECODEs are overridden for sorting
--Admission = 0, Events = 5, Membership = 10, Donations = 15, Resources = 20, Volunteers = 25, Fees = 30, Facility rentals = 35, Merchandise = 40 (Numbers separated to provide room for future item types)
-- Group order discount details under the item types they are discounting
--Select program totals (with order-level discounts)
select
[SALESORDERITEMTYPECODE],
[PROGRAMNAME],
[QUANTITY],
[GROSS],
[DISCOUNT],
[REFUND],
[ISORDERDISCOUNT],
[CATEGORY]
from
(select
case
when [SALESORDERITEM].[TYPECODE] = 0 then 0
when [SALESORDERITEM].[TYPECODE] = 5 then
case DISCOUNTEDITEM.TYPECODE
when 0 then 0
when 14 then 40
end
--when [SALESORDERITEM].[TYPECODE] = 6 then 5 event registration are broken out below
when [SALESORDERITEM].[TYPECODE] = 1 then 10
when [SALESORDERITEM].[TYPECODE] = 2 then 15
when [SALESORDERITEM].[TYPECODE] in (8,9) then 20
when [SALESORDERITEM].[TYPECODE] in (10,11) then 25
when [SALESORDERITEM].[TYPECODE] = 3 then 30
when [SALESORDERITEM].[TYPECODE] = 7 then 35
when [SALESORDERITEM].[TYPECODE] = 14 then 40
end as [SALESORDERITEMTYPECODE],
case [SALESORDERITEM].[TYPECODE]
when 0 then [SALESORDERITEMTICKET].[PROGRAMNAME]
when 1 then [SALESORDERITEMMEMBERSHIP].[MEMBERSHIPPROGRAMNAME]
when 2 then [SALESORDERITEMDONATION].[DESIGNATIONNAME]
when 3 then [SALESORDERITEMFEE].[FEENAME]
when 5 then [SALESORDERITEMORDERDISCOUNT].[DISCOUNTNAME]
when 7 then [SALESORDERITEMFACILITY].[EVENTLOCATIONNAME]
when 8 then [SALESORDERITEMITINERARYRESOURCE].[RESOURCENAME]
when 9 then [SALESORDERITEMITINERARYITEMRESOURCE].[RESOURCENAME]
when 10 then [SALESORDERITEMITINERARYSTAFFRESOURCE].[VOLUNTEERTYPENAME]
when 11 then [SALESORDERITEMITINERARYITEMSTAFFRESOURCE].[VOLUNTEERTYPENAME]
when 14 then [MERCHANDISEDEPARTMENT].[NAME]
end as [PROGRAMNAME],
case [SALESORDERITEM].[TYPECODE]
when 5 then 0
else coalesce(sum([SALESORDERITEM].[QUANTITY]),0)
end as [QUANTITY],
case [SALESORDERITEM].[TYPECODE]
when 5 then 0
else coalesce(sum([SALESORDERITEM].[TOTAL]),0)
end as [GROSS],
case [SALESORDERITEM].[TYPECODE]
when 1 then ( select
coalesce(sum([SOIMIP].[AMOUNT]),0)
from dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION SOIMIP
inner join dbo.SALESORDERITEM SOI2 on SOIMIP.SALESORDERITEMID = SOI2.ID
inner join dbo.SALESORDERITEMMEMBERSHIP SOIM2 on SOI2.ID = SOIM2.ID
where
SOIM2.MEMBERSHIPPROGRAMNAME = SALESORDERITEMMEMBERSHIP.MEMBERSHIPPROGRAMNAME and
SOI2.SALESORDERID in ( select ID
from dbo.SALESORDER SO2
where
([SO2].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
[SO2].[TRANSACTIONDATE] between @FROM and @TO and
[SO2].[STATUSCODE] = 1 ) )
when 5 then isnull(sum(SALESORDERITEMORDERDISCOUNTDETAIL.AMOUNT), 0)
else coalesce(sum([SALESORDERITEMITEMDISCOUNT].[AMOUNT]),0)
end as [DISCOUNT],
0 as [REFUND],
case [SALESORDERITEM].[TYPECODE]
when 5 then 1
else 0
end as [ISORDERDISCOUNT],
case [SALESORDERITEM].[TYPECODE]
when 0 then [SALESORDERITEMTICKET].[PROGRAMCATEGORYNAME]
when 8 then [SALESORDERITEMITINERARYRESOURCE].[RESOURCECATEGORYNAME]
when 9 then [SALESORDERITEMITINERARYITEMRESOURCE].[RESOURCECATEGORYNAME]
else null
end as [CATEGORY]
from dbo.[SALESORDERITEM]
inner join dbo.[SALESORDER]
on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
--Tickets
left join dbo.[SALESORDERITEMTICKET]
on [SALESORDERITEM].[ID] = [SALESORDERITEMTICKET].[ID]
--Item level discounts
left join dbo.[SALESORDERITEMITEMDISCOUNT]
on [SALESORDERITEM].[ID] = [SALESORDERITEMITEMDISCOUNT].[SALESORDERITEMID]
--Memberships
left join dbo.[SALESORDERITEMMEMBERSHIP]
on [SALESORDERITEM].[ID] = [SALESORDERITEMMEMBERSHIP].[ID]
--Donations
left join dbo.[SALESORDERITEMDONATION]
on [SALESORDERITEM].[ID] = [SALESORDERITEMDONATION].[ID]
--Order discounts
left join dbo.[SALESORDERITEMORDERDISCOUNT]
on [SALESORDERITEM].[ID] = [SALESORDERITEMORDERDISCOUNT].[ID]
--Resources (for the purposes of this report, combine itinerary and itinerary item resources)
left join dbo.[SALESORDERITEMITINERARYRESOURCE]
on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYRESOURCE].[SALESORDERITEMID]
left join dbo.[SALESORDERITEMITINERARYITEMRESOURCE]
on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYITEMRESOURCE].[SALESORDERITEMID]
--Staffing Resources (for the purposes of this report, combine itinerary and itinerary item resources)
left join dbo.[SALESORDERITEMITINERARYSTAFFRESOURCE]
on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYSTAFFRESOURCE].[SALESORDERITEMID]
left join dbo.[SALESORDERITEMITINERARYITEMSTAFFRESOURCE]
on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYITEMSTAFFRESOURCE].[SALESORDERITEMID]
--Fees
left join dbo.[SALESORDERITEMFEE]
on [SALESORDERITEM].[ID] = [SALESORDERITEMFEE].[ID]
--Facility Rentals
left join dbo.[SALESORDERITEMFACILITY]
on [SALESORDERITEM].[ID] = [SALESORDERITEMFACILITY].ID
--Merchandise
left join dbo.[SALESORDERITEMMERCHANDISE]
on [SALESORDERITEM].[ID] = [SALESORDERITEMMERCHANDISE].[ID]
left join dbo.[MERCHANDISEDEPARTMENT]
on [SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID] = [MERCHANDISEDEPARTMENT].[ID]
-- Order level discounts
left outer join
dbo.SALESORDERITEMORDERDISCOUNTDETAIL on SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMORDERDISCOUNTID = SALESORDERITEM.ID
left outer join
dbo.SALESORDERITEM DISCOUNTEDITEM on DISCOUNTEDITEM.ID = SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID
--ADD MORE SALESORDERITEMS HERE--
where
([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
[SALESORDER].[TRANSACTIONDATE] between @FROM and @TO and
[SALESORDER].[STATUSCODE] = 1 and
([SALESORDERITEM].[TYPECODE] <> 4 and [SALESORDERITEM].[TYPECODE] <> 6) --Report does not include taxes, event registrations are below due to complex refunds
group by
[SALESORDERITEM].[TYPECODE],
[SALESORDERITEMTICKET].[PROGRAMNAME],
[SALESORDERITEMMEMBERSHIP].[MEMBERSHIPPROGRAMNAME],
[SALESORDERITEMDONATION].[DESIGNATIONNAME],
[SALESORDERITEMFEE].[FEENAME],
[SALESORDERITEMORDERDISCOUNT].[DISCOUNTNAME],
[SALESORDERITEMITINERARYRESOURCE].[RESOURCENAME],
[SALESORDERITEMITINERARYITEMRESOURCE].[RESOURCENAME],
[SALESORDERITEMITINERARYSTAFFRESOURCE].[VOLUNTEERTYPENAME],
[SALESORDERITEMITINERARYITEMSTAFFRESOURCE].[VOLUNTEERTYPENAME],
[SALESORDERITEMTICKET].[PROGRAMCATEGORYNAME],
[SALESORDERITEMITINERARYRESOURCE].[RESOURCECATEGORYNAME],
[SALESORDERITEMITINERARYITEMRESOURCE].[RESOURCECATEGORYNAME],
[SALESORDERITEMFACILITY].[EVENTLOCATIONNAME],
[MERCHANDISEDEPARTMENT].[NAME],
SALESORDERITEMORDERDISCOUNTDETAIL.AMOUNT,
DISCOUNTEDITEM.TYPECODE
--In-order Refunds (except for registrations)
union all
select
case
when [SALESORDERITEM].[TYPECODE] = 0 then 0
when [SALESORDERITEM].[TYPECODE] = 1 then 10
when [SALESORDERITEM].[TYPECODE] = 3 then 30
when [SALESORDERITEM].[TYPECODE] = 14 then 40
when [SALESORDERITEM].[TYPECODE] = 5 then
case [DISCOUNTEDITEM].[TYPECODE]
when 0 then 0
when 14 then 40
end
end as [SALESORDERITEMTYPECODE],
case [SALESORDERITEM].[TYPECODE]
when 0 then [SALESORDERITEMTICKET].[PROGRAMNAME]
when 1 then [SALESORDERITEMMEMBERSHIP].[MEMBERSHIPPROGRAMNAME]
when 3 then [SALESORDERITEMFEE].[FEENAME]
when 5 then [SALESORDERITEMORDERDISCOUNT].[DISCOUNTNAME]
when 14 then [MERCHANDISEDEPARTMENT].[NAME]
end as [PROGRAMNAME],
case [SALESORDERITEM].[TYPECODE]
when 5 then 0
else
-1 * coalesce(sum(FINANCIALTRANSACTIONLINEITEM.QUANTITY),0)
end as [QUANTITY],
0 as [GROSS],
0 as [DISCOUNT],
case [SALESORDERITEM].[TYPECODE]
when 5 then -1 * isnull(sum([SALESORDERITEMORDERDISCOUNTDETAIL].[AMOUNT]), 0)
else coalesce(sum((FINANCIALTRANSACTIONLINEITEM.QUANTITY * FINANCIALTRANSACTIONLINEITEM.UNITVALUE) - CREDITITEM_EXT.DISCOUNTS),0)
end [REFUND],
case [SALESORDERITEM].[TYPECODE]
when 5 then 1
else 0
end as [ISORDERDISCOUNT],
case [SALESORDERITEM].[TYPECODE]
when 0 then [SALESORDERITEMTICKET].[PROGRAMCATEGORYNAME]
else null
end as [CATEGORY]
from
dbo.FINANCIALTRANSACTION
inner join
dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
inner join
dbo.CREDITITEM_EXT on CREDITITEM_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
inner join
dbo.SALESORDERITEM on SALESORDERITEM.ID = CREDITITEM_EXT.SALESORDERITEMID
inner join dbo.[SALESORDER]
on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
--Tickets
left join dbo.[SALESORDERITEMTICKET]
on [SALESORDERITEM].[ID] = [SALESORDERITEMTICKET].[ID]
--Memberships
left join dbo.[SALESORDERITEMMEMBERSHIP]
on [SALESORDERITEM].[ID] = [SALESORDERITEMMEMBERSHIP].[ID]
--Fees
left join dbo.[SALESORDERITEMFEE]
on [SALESORDERITEM].[ID] = [SALESORDERITEMFEE].[ID]
--Merchandise
left join dbo.[SALESORDERITEMMERCHANDISE]
on [SALESORDERITEM].[ID] = [SALESORDERITEMMERCHANDISE].[ID]
left join dbo.[MERCHANDISEDEPARTMENT]
on [SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID] = [MERCHANDISEDEPARTMENT].[ID]
--Order discounts
left join
dbo.[SALESORDERITEMORDERDISCOUNT] on [SALESORDERITEM].[ID] = [SALESORDERITEMORDERDISCOUNT].[ID]
left outer join
dbo.[SALESORDERITEMORDERDISCOUNTDETAIL] on [SALESORDERITEMORDERDISCOUNTDETAIL].[SALESORDERITEMORDERDISCOUNTID] = [SALESORDERITEM].[ID]
left outer join
dbo.SALESORDERITEM DISCOUNTEDITEM on [DISCOUNTEDITEM].[ID] = [SALESORDERITEMORDERDISCOUNTDETAIL].[SALESORDERITEMID]
where
([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
[SALESORDERITEM].[TYPECODE] in (0,1,3,5,14) and
FINANCIALTRANSACTION.CALCULATEDDATE between @FROM and @TO
and FINANCIALTRANSACTION.TYPECODE = 23 -- Refund
group by
[SALESORDERITEM].[TYPECODE],
[SALESORDERITEMTICKET].[PROGRAMNAME],
[SALESORDERITEMMEMBERSHIP].[MEMBERSHIPPROGRAMNAME],
[SALESORDERITEMFEE].[FEENAME],
[SALESORDERITEMTICKET].[PROGRAMCATEGORYNAME],
[SALESORDERITEMORDERDISCOUNT].[DISCOUNTNAME],
[MERCHANDISEDEPARTMENT].[NAME],
[SALESORDERITEMORDERDISCOUNTDETAIL].[AMOUNT],
[SALESORDERITEMORDERDISCOUNTDETAIL].[ID],
[DISCOUNTEDITEM].[TYPECODE]
--Outside-order Refunds (Memberships)
union all
select
10 as [SALESORDERITEMTYPECODE],
[CREDITITEMMEMBERSHIP].[MEMBERSHIPPROGRAMNAME],
-1 * count(1) as [QUANTITY],
0 as [GROSS],
0 as [DISCOUNT],
sum((FINANCIALTRANSACTIONLINEITEM.QUANTITY * FINANCIALTRANSACTIONLINEITEM.UNITVALUE) - CREDITITEM_EXT.DISCOUNTS) as [REFUND],
0 as [ISORDERDISCOUNT],
null as CATEGORY
from
dbo.FINANCIALTRANSACTION
inner join
dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
inner join
dbo.CREDITITEM_EXT on CREDITITEM_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
inner join
dbo.CREDITITEMMEMBERSHIP on CREDITITEMMEMBERSHIP.ID = FINANCIALTRANSACTIONLINEITEM.ID
where
@SALESMETHODTYPECODE is null
and FINANCIALTRANSACTION.CALCULATEDDATE between @FROM and @TO
and FINANCIALTRANSACTION.TYPECODE = 23 -- Refund
and CREDITITEM_EXT.SALESORDERITEMID is null
group by
[CREDITITEMMEMBERSHIP].[MEMBERSHIPPROGRAMNAME]
--Event Registrations and event registration refunds
union all
select
5 as [SALESORDERITEMTYPECODE],
[PROGRAMNAME],
sum(
case
when [GROSS] = 0 and [REFUND] > 0 then
-1
when [GROSS] > [REFUND] or ([GROSS] = 0 and [REFUND] = 0) then
1
else
0
end
) [QUANTITY],
sum([GROSS]) [GROSS],
0 as [DISCOUNT],
sum([REFUND]) [REFUND],
0 as [ISORDERDISCOUNT],
null as [CATEGORY]
from --Sum the gross and refund for each registrant so we can compare it for the quantity calculation
(select
[PROGRAMNAME],
sum([GROSS]) as [GROSS],
sum([REFUND]) as [REFUND],
[REGISTRANTID]
from --Get all the payment and refund pieces so that we can aggregate them for each registrant
(select --Event registration payments
[EVENT].[NAME] as [PROGRAMNAME],
coalesce(sum([SALESORDERITEM].[TOTAL]),0) as [GROSS],
0 as [REFUND],
[SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] as REGISTRANTID
from
dbo.[SALESORDERITEMEVENTREGISTRATION]
inner join
dbo.[SALESORDERITEM] on [SALESORDERITEMEVENTREGISTRATION].[ID] = [SALESORDERITEM].[ID]
inner join dbo.[REGISTRANT]
on [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANT].[ID]
inner join dbo.[EVENT]
on [REGISTRANT].[EVENTID] = [EVENT].[ID]
inner join dbo.[SALESORDER]
on [SALESORDER].[ID] = [SALESORDERITEM].[SALESORDERID]
where [SALESORDER].[TRANSACTIONDATE] between @FROM and @TO and
([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null)
group by
[SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID],
[EVENT].[NAME]
union all
select
[EVENT].[NAME] as [PROGRAMNAME],
0 as [GROSS],
coalesce(sum((FINANCIALTRANSACTIONLINEITEM.QUANTITY * FINANCIALTRANSACTIONLINEITEM.UNITVALUE) - CREDITITEM_EXT.DISCOUNTS),0) as [REFUND],
[SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] as REGISTRANTID
from
dbo.FINANCIALTRANSACTION
inner join
dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
inner join
dbo.CREDITITEM_EXT on CREDITITEM_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
inner join
dbo.SALESORDERITEM on SALESORDERITEM.ID = CREDITITEM_EXT.SALESORDERITEMID
inner join dbo.[SALESORDERITEMEVENTREGISTRATION]
on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]
inner join dbo.[REGISTRANT]
on [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANT].[ID]
inner join dbo.[EVENT]
on [REGISTRANT].[EVENTID] = [EVENT].[ID]
inner join dbo.[SALESORDER]
on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
where
FINANCIALTRANSACTION.CALCULATEDDATE between @FROM and @TO
and ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null)
group by
[SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID],
[EVENT].[NAME]
--Event Registration refunds/exchanges purchased outside the context of an order
union all
select
[EVENT].[NAME] as [PROGRAMNAME],
0 as [GROSS],
coalesce(sum(EVENTREGISTRATIONTRANSACTION.BASEAMOUNT),0) as [REFUND],
[EVENTREGISTRANTPAYMENT].[REGISTRANTID] as REGISTRANTID
from
dbo.FINANCIALTRANSACTION as REFUNDTRANSACTION
inner join
dbo.CREDITPAYMENT on CREDITPAYMENT.CREDITID = REFUNDTRANSACTION.ID
inner join
dbo.FINANCIALTRANSACTIONLINEITEM as REFUNDEDLINEITEM on REFUNDEDLINEITEM.ID = CREDITPAYMENT.REVENUESPLITID
inner join
dbo.EVENTREGISTRANTPAYMENT on EVENTREGISTRANTPAYMENT.PAYMENTID = REFUNDEDLINEITEM.ID
inner join
dbo.[REGISTRANT] on [REGISTRANT].[ID] = [EVENTREGISTRANTPAYMENT].[REGISTRANTID]
inner join
dbo.[EVENT] on [REGISTRANT].[EVENTID] = [EVENT].[ID]
inner join
dbo.FINANCIALTRANSACTION as EVENTREGISTRATIONTRANSACTION on EVENTREGISTRATIONTRANSACTION.ID = REFUNDEDLINEITEM.FINANCIALTRANSACTIONID
where
REFUNDTRANSACTION.CALCULATEDDATE between @FROM and @TO
and @SALESMETHODTYPECODE is null
group by
[EVENTREGISTRANTPAYMENT].[REGISTRANTID], [EVENT].[NAME]
) PAYMENTPIECES
group by
[PROGRAMNAME], [REGISTRANTID]
)REGISTRANTS
group by [PROGRAMNAME], [REGISTRANTID]) REPORTITEMS
order by
[SALESORDERITEMTYPECODE],
[ISORDERDISCOUNT],
[PROGRAMNAME]
return 0;