USP_REPORT_REVENUEBYPAYMENTMETHODALTRU
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUETYPES | xml | IN | |
@PAYMENTMETHODS | xml | IN | |
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN | |
@REPORTUSERID | nvarchar(128) | IN | |
@CURRENCYCODE | tinyint | IN | |
@ALTREPORTUSERID | nvarchar(128) | IN |
Definition
Copy
create procedure dbo.USP_REPORT_REVENUEBYPAYMENTMETHODALTRU
(
@REVENUETYPES xml = null,
@PAYMENTMETHODS xml = null,
@STARTDATE datetime = null,
@ENDDATE datetime = null,
@REPORTUSERID nvarchar(128) = null,
@CURRENCYCODE tinyint = null,
@ALTREPORTUSERID nvarchar(128) = null
)
as begin
set nocount on;
declare @SELECTEDCURRENCYID uniqueidentifier;
declare @REVENUEPAYMENTMETHODTABLEID uniqueidentifier = '611E9794-28B4-4F03-A6A5-54BD92FB506B';
declare @REVENUESPLITTABLEID uniqueidentifier = '274a03e5-066c-4f34-bfc2-fbb352fad140';
--declare @REVENUESPLITTABLEID uniqueidentifier = '59E46B6A-F096-45A5-AA88-03C690F5D8ED';
declare @CURRENTAPPUSERID uniqueidentifier = dbo.UFN_APPUSER_GETREPORTAPPUSERID(@REPORTUSERID, @ALTREPORTUSERID);
declare @ORGANIZATIONCURRENCYID uniqueidentifier;
declare @DECIMALDIGITS tinyint;
declare @ROUNDINGTYPECODE tinyint;
if @CURRENCYCODE = 3
begin
if dbo.UFN_CURRENCYSET_GETAPPUSERCURRENCYSET(@CURRENTAPPUSERID) is not null
begin
select @SELECTEDCURRENCYID = [CURRENCYSET].[BASECURRENCYID]
from dbo.[CURRENCYSET]
where
[CURRENCYSET].[ID] = dbo.UFN_CURRENCYSET_GETAPPUSERCURRENCYSET(@CURRENTAPPUSERID);
end
else
begin
select @SELECTEDCURRENCYID = [CURRENCYSET].[BASECURRENCYID]
from dbo.[CURRENCYSET]
where
[CURRENCYSET].[ID] = dbo.UFN_CURRENCYSET_GETAPPUSERDEFAULTCURRENCYSET();
end
end
else -- 2014/04/02 - Is there a begin/end missing here? I'm reducing the indentation of subsequent currency lines to better reflect the reality of execution.
set @SELECTEDCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
select @DECIMALDIGITS = [DECIMALDIGITS],
@ROUNDINGTYPECODE = [ROUNDINGTYPECODE]
from dbo.[CURRENCY]
where ID = @SELECTEDCURRENCYID;
create table #PAYMENTMETHODS_T
(
[PAYMENTMETHODCODE] tinyint,
[PAYMENTMETHOD] nvarchar(100)
);
insert into #PAYMENTMETHODS_T([PAYMENTMETHODCODE], [PAYMENTMETHOD])
select distinct
[ENUMVALUES].[ENUMXML].value('@ID', 'tinyint'),
[ENUMVALUES].[ENUMXML].value('@Translation', 'nvarchar(100)')
from
dbo.[TABLECATALOG]
cross apply [TABLECATALOG].[TABLESPECXML].nodes
(
'declare namespace bbtable="bb_appfx_table";
/*/bbtable:Fields/bbtable:EnumField[@Name="PAYMENTMETHODCODE"]/bbtable:EnumValues/bbtable:EnumValue'
) as [ENUMVALUES]([ENUMXML])
where [TABLECATALOG].[ID] = @REVENUEPAYMENTMETHODTABLEID;
/* Determine available payment methods: */
create table #AVAILABLEPAYMENTMETHODS
(
[PAYMENTMETHODCODE] tinyint primary key,
[PAYMENTMETHOD] nvarchar(100)
);
insert into #AVAILABLEPAYMENTMETHODS
(
[PAYMENTMETHODCODE],
[PAYMENTMETHOD]
)
select
[PAYMENTMETHODS_T].[PAYMENTMETHODCODE], [PAYMENTMETHODS_T].[PAYMENTMETHOD]
from #PAYMENTMETHODS_T as [PAYMENTMETHODS_T]
where [PAYMENTMETHODS_T].[PAYMENTMETHODCODE] in
(
select
[PAYMENTMETHODS].[PAYMENTMETHOD].value('PAYMENTMETHOD[1]', 'tinyint')
from
@PAYMENTMETHODS.nodes('PAYMENTMETHODS/ITEM') as [PAYMENTMETHODS]([PAYMENTMETHOD])
) or @PAYMENTMETHODS is null;
/* Determine available revenue types: */
create table #AVAILABLEREVENUETYPES
(
[REVENUETYPECODE] tinyint primary key,
[REVENUETYPE] nvarchar(100)
);
insert into #AVAILABLEREVENUETYPES
select distinct
[ENUMVALUES].[ENUMXML].value('@ID', 'tinyint'),
[ENUMVALUES].[ENUMXML].value('@Translation', 'nvarchar(100)')
from
dbo.[TABLECATALOG]
cross apply [TABLECATALOG].[TABLESPECXML].nodes
(
'declare namespace bbtable="bb_appfx_table";
/*/bbtable:Fields/bbtable:EnumField[@Name="TYPECODE"]/bbtable:EnumValues/bbtable:EnumValue'
) as [ENUMVALUES]([ENUMXML])
where [TABLECATALOG].[ID] = @REVENUESPLITTABLEID and
ENUMVALUES.[ENUMXML].value('@ID', 'tinyint') in(
select
[REVENUETYPES].[REVENUETYPE].value('REVENUETYPE[1]', 'tinyint')
from
@REVENUETYPES.nodes('REVENUETYPES/ITEM') as [REVENUETYPES]([REVENUETYPE])
) or @REVENUETYPES is null
--Add in the fake 'Group Sales Deposit' type since group sales revenue
--points to tickets until the order is complete (and incomplete group sales
--revenue is included)
if exists
(
select 1
from @REVENUETYPES.nodes('REVENUETYPES/ITEM') as [REVENUETYPES]([REVENUETYPE])
where [REVENUETYPES].[REVENUETYPE].value('REVENUETYPE[1]', 'tinyint') = 255
)
begin
insert into #AVAILABLEREVENUETYPES
values (255, 'Group Sales Deposit')
end;
declare @ISOCURRENCYCODE nvarchar(3)
declare @CURRENCYSYMBOL nvarchar(5)
declare @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint
declare @CURRENCYDECIMALDIGITS integer
select
@ISOCURRENCYCODE = CURRENCYPROPERTIES.ISO4217,
@CURRENCYSYMBOL = CURRENCYPROPERTIES.CURRENCYSYMBOL,
@CURRENCYSYMBOLDISPLAYSETTINGCODE = CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE,
@CURRENCYDECIMALDIGITS = CURRENCYPROPERTIES.DECIMALDIGITS
from dbo.UFN_CURRENCY_GETPROPERTIES(@SELECTEDCURRENCYID) CURRENCYPROPERTIES;
/* Select out the cartesian product of revenue types and payment methods; then join that with revenue: */
/* Use a fake payment method table to turn auction donations from having a payment method of None to a payment method of Auction donation */
create table #REVENUEDATA (
ID uniqueidentifier,
AMOUNT money,
PAYMENTMETHODCODE tinyint,
REVENUETYPECODE tinyint,
TRANSACTIONID uniqueidentifier
)
create clustered index REVENUEDATA_IX1 on #REVENUEDATA (ID)
insert into #REVENUEDATA
select
REVENUESPLIT.ID,
0 as AMOUNT,
REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE,
case
when SALESMETHODTYPECODE = 3 and (SALESORDER.STATUSCODE in (0, 2, 3, 4)) then -- Group sales and (pending/tentative/confirmed/Finalized)
255 --'Group Sales Deposit'
else
REVENUESPLIT.TYPECODE
end as REVENUETYPECODE,
REVENUE.ID as TRANSACTIONID
from dbo.FINANCIALTRANSACTION as REVENUE
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = REVENUE.ID
inner join dbo.REVENUESPLIT_EXT as REVENUESPLIT on REVENUESPLIT.ID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
left join dbo.SALESORDERPAYMENT on REVENUE.ID = SALESORDERPAYMENT.PAYMENTID
left join dbo.SALESORDER on SALESORDERPAYMENT.SALESORDERID = SALESORDER.ID
where
(@STARTDATE is null or REVENUE.DATE >= @STARTDATE)
and (@ENDDATE is null or REVENUE.DATE <= @ENDDATE)
and REVENUE.TYPECODE in (0,7) -- Payment, auction donation
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
--refund splits
--when the splits return null, this means that the revenue is missing
--which is only the case for membership renewals since the transaction is
--deleted
insert into #REVENUEDATA
select
null,
case when REVENUESPLIT_EXT.TYPECODE = 1 then
-(LI.TRANSACTIONAMOUNT)
else
-((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS)
end as AMOUNT,
CREDITPAYMENT.PAYMENTMETHODCODE,
REVENUESPLIT_EXT.TYPECODE,
FT.ID
from
dbo.FINANCIALTRANSACTION as FT
inner join
dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
inner join
dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
inner join
dbo.CREDITPAYMENT on CREDITPAYMENT.CREDITID = FT.ID
inner join
dbo.FINANCIALTRANSACTIONLINEITEM as SOURCELINEITEM on SOURCELINEITEM.ID = LI.SOURCELINEITEMID
inner join
dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = SOURCELINEITEM.ID
where
(@STARTDATE is null or cast(FT.DATE as datetime) >= @STARTDATE)
and (@ENDDATE is null or cast(FT.DATE as datetime) <= @ENDDATE)
and FT.TYPECODE = 23 -- Refund
and LI.DELETEDON is null
and EXT.TYPECODE <> 255; -- Unearned revenue
update R
set R.AMOUNT = REVENUESPLITINCURRENCY.AMOUNTINCURRENCY
from #REVENUEDATA R
inner join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as REVENUESPLITINCURRENCY on REVENUESPLITINCURRENCY.ID = R.ID
where R.AMOUNT >= 0 and REVENUESPLITINCURRENCY.AMOUNTINCURRENCY is not null;
select
AVAILABLEREVENUETYPES.REVENUETYPE,
AVAILABLEPAYMENTMETHODS.PAYMENTMETHOD,
count(distinct REVENUEDATA.TRANSACTIONID) as NUMBEROFTRANSACTIONS,
coalesce(sum(REVENUEDATA.AMOUNT), 0) as TOTALREVENUE,
@ISOCURRENCYCODE ISOCURRENCYCODE,
@CURRENCYSYMBOL CURRENCYSYMBOL,
@CURRENCYSYMBOLDISPLAYSETTINGCODE CURRENCYSYMBOLDISPLAYSETTINGCODE,
@CURRENCYDECIMALDIGITS DECIMALDIGITS
from #AVAILABLEREVENUETYPES as AVAILABLEREVENUETYPES
cross join #AVAILABLEPAYMENTMETHODS as AVAILABLEPAYMENTMETHODS
left join #REVENUEDATA REVENUEDATA on REVENUEDATA.REVENUETYPECODE = AVAILABLEREVENUETYPES.REVENUETYPECODE and REVENUEDATA.PAYMENTMETHODCODE = AVAILABLEPAYMENTMETHODS.PAYMENTMETHODCODE
where REVENUEDATA.ID is null
or exists (
select REPORTPERMISSIONS.HASPERMISSION
from dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(REVENUEDATA.ID) as REVENUESITES
cross apply dbo.UFN_REPORT_HASUSERSITEPERMISSION(@CURRENTAPPUSERID, '6e42c3f3-294c-4890-944c-763651b244d1', REVENUESITES.SITEID) as REPORTPERMISSIONS
)
group by AVAILABLEREVENUETYPES.REVENUETYPE, AVAILABLEPAYMENTMETHODS.PAYMENTMETHOD
order by AVAILABLEREVENUETYPES.REVENUETYPE;
drop table #REVENUEDATA;
drop table #AVAILABLEREVENUETYPES;
drop table #AVAILABLEPAYMENTMETHODS;
drop table #PAYMENTMETHODS_T;
end