USP_REPORT_MERCHANDISESALES
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@DEPARTMENTID | uniqueidentifier | IN | |
@DEPARTMENTQUERY | uniqueidentifier | IN | |
@FROMDATE | datetime | IN | |
@TODATE | datetime | IN | |
@SALESMETHODID | uniqueidentifier | IN | |
@VENDORID | uniqueidentifier | IN | |
@VENDORQUERY | uniqueidentifier | IN |
Definition
Copy
create procedure dbo.USP_REPORT_MERCHANDISESALES
(
@DEPARTMENTID uniqueidentifier = null,
@DEPARTMENTQUERY uniqueidentifier = null,
@FROMDATE datetime = null,
@TODATE datetime = null,
@SALESMETHODID uniqueidentifier = null,
@VENDORID uniqueidentifier = null,
@VENDORQUERY uniqueidentifier = null
)
as
set nocount on;
set @FROMDATE = convert(date, @FROMDATE);
set @TODATE = dbo.UFN_DATE_GETLATESTTIME(@TODATE);
declare @SALESMETHODTYPECODE tinyint = null;
select @SALESMETHODTYPECODE = TYPECODE
from dbo.SALESMETHOD
where ID = @SALESMETHODID;
declare @DEPARTMENTS table (ID uniqueidentifier);
declare @VENDORS table (ID uniqueidentifier);
if @DEPARTMENTQUERY is not null begin
insert into @DEPARTMENTS
select ID from dbo.UFN_IDSETREADER_GETRESULTS_GUID(@DEPARTMENTQUERY);
end
if @VENDORQUERY is not null begin
insert into @VENDORS
select ID from dbo.UFN_IDSETREADER_GETRESULTS_GUID(@VENDORQUERY);
end
;with MERCHANDISE_CTE as (
select
MERCHANDISEPRODUCTINSTANCE.ID,
MERCHANDISEPRODUCTINSTANCE.ITEMDETAILS,
MERCHANDISEPRODUCTINSTANCE.BARCODE,
MERCHANDISEPRODUCTINSTANCE.COST,
VENDOR_NF.NAME as VENDOR,
MERCHANDISEDEPARTMENT.NAME DEPARTMENT,
MERCHANDISEDEPARTMENTCATEGORY.NAME CATEGORY
from dbo.MERCHANDISEPRODUCTINSTANCE with (nolock)
inner join dbo.MERCHANDISEPRODUCT with (nolock)
on MERCHANDISEPRODUCTINSTANCE.MERCHANDISEPRODUCTID = MERCHANDISEPRODUCT.ID
inner join dbo.PRODUCTVENDOR with (nolock)
on PRODUCTVENDOR.PRODUCTID = MERCHANDISEPRODUCTINSTANCE.MERCHANDISEPRODUCTID
inner join dbo.MERCHANDISEDEPARTMENT with (nolock)
on MERCHANDISEPRODUCT.MERCHANDISEDEPARTMENTID = MERCHANDISEDEPARTMENT.ID
left outer join dbo.MERCHANDISEDEPARTMENTCATEGORY with (nolock)
on MERCHANDISEPRODUCT.MERCHANDISEDEPARTMENTCATEGORYID = MERCHANDISEDEPARTMENTCATEGORY.ID
outer apply
dbo.UFN_CONSTITUENT_DISPLAYNAME(PRODUCTVENDOR.VENDORID) as VENDOR_NF
where
(@DEPARTMENTID is null or MERCHANDISEDEPARTMENT.ID = @DEPARTMENTID)
and (@DEPARTMENTQUERY is null or MERCHANDISEDEPARTMENT.ID in (select ID from @DEPARTMENTS))
and (@VENDORID is null or PRODUCTVENDOR.VENDORID = @VENDORID)
and (@VENDORQUERY is null or PRODUCTVENDOR.VENDORID in (select ID from @VENDORS))
),
SHIPMENT_CTE as
(
select
MERCHANDISEPRODUCTINSTANCEID,
ACTIONDATE,
AVERAGECOST
from dbo.MERCHANDISEPRODUCTINSTANCEHISTORY with (nolock)
inner join MERCHANDISE_CTE
on MERCHANDISEPRODUCTINSTANCEHISTORY.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISE_CTE.ID
where
(
MERCHANDISEPRODUCTINSTANCEHISTORY.ACTIONTYPECODE = 0 -- Shipments
or (MERCHANDISEPRODUCTINSTANCEHISTORY.ACTIONTYPECODE = 2 and MERCHANDISEPRODUCTINSTANCEHISTORY.AVERAGECOST is not null) -- Initial physical count
)
),
MERCHANDISEWITHSALESORDERS_CTE as
(
select
isnull(sum(SALESORDERITEM.QUANTITY), 0) QUANTITY,
isnull(sum(SALESORDERITEM.TOTAL), 0) TOTALS,
SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID,
MERCHANDISE_CTE.ITEMDETAILS,
MERCHANDISE_CTE.BARCODE,
MERCHANDISE_CTE.VENDOR,
isnull(sum(SALESORDERITEM.QUANTITY * coalesce(SHIPMENTHISTORY.AVERAGECOST, SHIPMENTFUTURE.AVERAGECOST, MERCHANDISE_CTE.COST, 0)), 0) COST,
MERCHANDISE_CTE.DEPARTMENT,
MERCHANDISE_CTE.CATEGORY
from dbo.SALESORDER with (nolock)
inner join
dbo.SALESORDERITEM with (nolock) on SALESORDER.ID = SALESORDERITEM.SALESORDERID
inner join
dbo.SALESORDERITEMMERCHANDISE with (nolock) on SALESORDERITEM.ID= SALESORDERITEMMERCHANDISE.ID
inner join
MERCHANDISE_CTE on SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISE_CTE.ID
outer apply (
select top 1
SHIPMENT_CTE.MERCHANDISEPRODUCTINSTANCEID,
SHIPMENT_CTE.AVERAGECOST
from SHIPMENT_CTE
where SHIPMENT_CTE.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISE_CTE.ID
and SALESORDER.TRANSACTIONDATEWITHTIMEOFFSET >= SHIPMENT_CTE.ACTIONDATE
order by SHIPMENT_CTE.ACTIONDATE desc
) SHIPMENTHISTORY
outer apply (
select top 1
AVERAGECOST
from SHIPMENT_CTE
where SHIPMENT_CTE.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISE_CTE.ID
and SALESORDER.TRANSACTIONDATEWITHTIMEOFFSET <= SHIPMENT_CTE.ACTIONDATE
order by SHIPMENT_CTE.ACTIONDATE asc
) SHIPMENTFUTURE
where
(@FROMDATE is null or SALESORDER.TRANSACTIONDATE >= @FROMDATE)
and (@TODATE is null or SALESORDER.TRANSACTIONDATE <= @TODATE)
and SALESORDER.STATUSCODE = 1 -- Completed Orders Only
and (@SALESMETHODTYPECODE is null or SALESORDER.SALESMETHODTYPECODE = @SALESMETHODTYPECODE)
group by
SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID,
MERCHANDISE_CTE.ITEMDETAILS,
MERCHANDISE_CTE.DEPARTMENT,
MERCHANDISE_CTE.CATEGORY,
MERCHANDISE_CTE.BARCODE,
MERCHANDISE_CTE.VENDOR
),
DISCOUNTAMOUNTS_CTE as
(
select
isnull(sum(SALESORDERITEMITEMDISCOUNT.AMOUNT), 0) + isnull(sum([SALESORDERITEMORDERDISCOUNTDETAIL].[AMOUNT]), 0) as DISCOUNTS,
SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID MERCHANDISEPRODUCTINSTANCEID
from
dbo.SALESORDER with (nolock)
inner join
dbo.SALESORDERITEM with (nolock) on SALESORDERITEM.SALESORDERID = SALESORDER.ID
inner join
dbo.SALESORDERITEMMERCHANDISE with (nolock) on SALESORDERITEMMERCHANDISE.ID = SALESORDERITEM.ID
left join
dbo.SALESORDERITEMITEMDISCOUNT with (nolock) on SALESORDERITEM.ID = SALESORDERITEMITEMDISCOUNT.SALESORDERITEMID
left outer join
(
select
SALESORDERITEMID,
SUM(AMOUNT) as AMOUNT
from
dbo.[SALESORDERITEMORDERDISCOUNTDETAIL] with (nolock)
group by
[SALESORDERITEMORDERDISCOUNTDETAIL].[SALESORDERITEMID]
) [SALESORDERITEMORDERDISCOUNTDETAIL] on [SALESORDERITEMORDERDISCOUNTDETAIL].[SALESORDERITEMID] = [SALESORDERITEM].[ID]
where
(@FROMDATE is null or SALESORDER.TRANSACTIONDATE >= @FROMDATE)
and (@TODATE is null or SALESORDER.TRANSACTIONDATE <= @TODATE)
and SALESORDER.STATUSCODE = 1 -- Completed Orders Only
and (@SALESMETHODTYPECODE is null or SALESORDER.SALESMETHODTYPECODE = @SALESMETHODTYPECODE)
group by
MERCHANDISEPRODUCTINSTANCEID
),
REPORTPARAMETERS_CTE as
(
-- merchandise sold
select
MERCHANDISEWITHSALESORDERS_CTE.MERCHANDISEPRODUCTINSTANCEID as ID,
MERCHANDISEWITHSALESORDERS_CTE.ITEMDETAILS DESCRIPTION,
MERCHANDISEWITHSALESORDERS_CTE.DEPARTMENT,
isnull(MERCHANDISEWITHSALESORDERS_CTE.CATEGORY, '<No Category>') as CATEGORY,
MERCHANDISEWITHSALESORDERS_CTE.TOTALS as GROSS,
DISCOUNTAMOUNTS_CTE.DISCOUNTS,
0 as REFUNDS,
0 as FEES,
MERCHANDISEWITHSALESORDERS_CTE.QUANTITY as QUANTITY,
0 as NUMREFUNDED,
MERCHANDISEWITHSALESORDERS_CTE.BARCODE,
MERCHANDISEWITHSALESORDERS_CTE.VENDOR,
MERCHANDISEWITHSALESORDERS_CTE.COST as COST
from
MERCHANDISEWITHSALESORDERS_CTE
--there can be more than one discount applied to a merchandise item, so
left outer join
DISCOUNTAMOUNTS_CTE on DISCOUNTAMOUNTS_CTE.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISEWITHSALESORDERS_CTE.MERCHANDISEPRODUCTINSTANCEID
group by
MERCHANDISEWITHSALESORDERS_CTE.ITEMDETAILS,
MERCHANDISEWITHSALESORDERS_CTE.MERCHANDISEPRODUCTINSTANCEID,
MERCHANDISEWITHSALESORDERS_CTE.DEPARTMENT,
MERCHANDISEWITHSALESORDERS_CTE.CATEGORY,
MERCHANDISEWITHSALESORDERS_CTE.TOTALS,
DISCOUNTAMOUNTS_CTE.DISCOUNTS,
MERCHANDISEWITHSALESORDERS_CTE.QUANTITY,
MERCHANDISEWITHSALESORDERS_CTE.BARCODE,
MERCHANDISEWITHSALESORDERS_CTE.VENDOR,
MERCHANDISEWITHSALESORDERS_CTE.COST
union all
-- merchandise refunded
select
MERCHANDISE_CTE.ID,
MERCHANDISE_CTE.ITEMDETAILS DESCRIPTION,
MERCHANDISE_CTE.DEPARTMENT,
isnull(MERCHANDISE_CTE.CATEGORY, '<No Category>') CATEGORY,
0 as GROSS,
0 as DISCOUNTS,
isnull(sum(CREDITITEM.TOTAL + CREDITITEM.FEES), 0) as REFUNDS,
0 as FEES,
0 as QUANTITY,
isnull(sum(CREDITITEM.REFUNDED), 0) as NUMREFUNDED,
MERCHANDISE_CTE.BARCODE,
MERCHANDISE_CTE.VENDOR,
-isnull(sum(CREDITITEM.REFUNDED * coalesce(SHIPMENTHISTORY.AVERAGECOST, SHIPMENTFUTURE.AVERAGECOST, MERCHANDISE_CTE.COST, 0)), 0) COST
from
dbo.SALESORDERITEMMERCHANDISE with (nolock)
inner join
dbo.SALESORDERITEM with (nolock) on SALESORDERITEM.ID = SALESORDERITEMMERCHANDISE.ID
inner join
dbo.SALESORDER with (nolock) on SALESORDER.ID = SALESORDERITEM.SALESORDERID
inner join
MERCHANDISE_CTE on SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISE_CTE.ID
inner join
(
select
EXT.SALESORDERITEMID,
isnull(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS), 0) - isnull(ORDERDISCOUNTDETAIL.AMOUNT, 0) as TOTAL,
sum(EXT.FEES) FEES,
sum(LI.QUANTITY) REFUNDED
from
dbo.FINANCIALTRANSACTIONLINEITEM as LI with (nolock)
inner join
dbo.CREDITITEM_EXT as EXT with (nolock) on EXT.ID = LI.ID
inner join
dbo.FINANCIALTRANSACTION as FT with (nolock) on FT.ID = LI.FINANCIALTRANSACTIONID
outer apply (
select sum(SALESORDERITEMORDERDISCOUNTDETAIL.AMOUNT) as AMOUNT
from dbo.SALESORDERITEMORDERDISCOUNTDETAIL with (nolock)
where SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID = EXT.SALESORDERITEMID
) as ORDERDISCOUNTDETAIL
where
(@FROMDATE is null or FT.CALCULATEDDATE >= @FROMDATE)
and (@TODATE is null or FT.CALCULATEDDATE <= @TODATE)
group by
EXT.SALESORDERITEMID,
ORDERDISCOUNTDETAIL.AMOUNT
) CREDITITEM on SALESORDERITEM.ID = CREDITITEM.SALESORDERITEMID
outer apply (
select top 1
SHIPMENT_CTE.MERCHANDISEPRODUCTINSTANCEID,
SHIPMENT_CTE.AVERAGECOST
from SHIPMENT_CTE
where SHIPMENT_CTE.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISE_CTE.ID
and SALESORDER.TRANSACTIONDATEWITHTIMEOFFSET >= SHIPMENT_CTE.ACTIONDATE
order by SHIPMENT_CTE.ACTIONDATE desc
) SHIPMENTHISTORY
outer apply (
select top 1
AVERAGECOST
from SHIPMENT_CTE
where SHIPMENT_CTE.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISE_CTE.ID
and SALESORDER.TRANSACTIONDATEWITHTIMEOFFSET <= SHIPMENT_CTE.ACTIONDATE
order by SHIPMENT_CTE.ACTIONDATE asc
) SHIPMENTFUTURE
where (@SALESMETHODTYPECODE is null or SALESORDER.SALESMETHODTYPECODE = @SALESMETHODTYPECODE)
and SALESORDER.STATUSCODE = 1
group by
MERCHANDISE_CTE.ID,
MERCHANDISE_CTE.ITEMDETAILS,
MERCHANDISE_CTE.DEPARTMENT,
MERCHANDISE_CTE.CATEGORY,
MERCHANDISE_CTE.BARCODE,
MERCHANDISE_CTE.VENDOR
)
select
DESCRIPTION,
DEPARTMENT,
CATEGORY,
SUM(QUANTITY) - SUM(NUMREFUNDED) as QUANTITY,
SUM(GROSS) + SUM(FEES) as GROSS,
SUM(DISCOUNTS) as DISCOUNTS,
SUM(REFUNDS) as REFUNDS,
SUM(GROSS) - SUM(DISCOUNTS) - SUM(REFUNDS) as NET,
BARCODE,
VENDOR,
SUM(COST) as COST
from
REPORTPARAMETERS_CTE
group by
REPORTPARAMETERS_CTE.ID,
REPORTPARAMETERS_CTE.DESCRIPTION,
REPORTPARAMETERS_CTE.DEPARTMENT,
REPORTPARAMETERS_CTE.CATEGORY,
REPORTPARAMETERS_CTE.BARCODE,
REPORTPARAMETERS_CTE.VENDOR
order by
DEPARTMENT, DESCRIPTION
option (recompile);
return 0;