USP_DATALIST_APPEALPACKAGEPERFORMANCEREPORT
Returns information on appeals and packages.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@APPEALSELECTIONID | uniqueidentifier | IN | Appeal selection |
@REVENUESELECTIONID | uniqueidentifier | IN | Revenue selection |
@CURRENCYCODE | tinyint | IN | Currency |
@REPORTUSERID | nvarchar(128) | IN | |
@ALTREPORTUSERID | nvarchar(128) | IN |
Definition
Copy
CREATE procedure dbo.[USP_DATALIST_APPEALPACKAGEPERFORMANCEREPORT]
(
@APPEALSELECTIONID uniqueidentifier = null,
@REVENUESELECTIONID uniqueidentifier = null,
@CURRENCYCODE tinyint = 1,
@REPORTUSERID nvarchar(128) = null,
@ALTREPORTUSERID nvarchar(128) = null
)
with execute as owner
as
set nocount on;
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.[UFN_CURRENCY_GETORGANIZATIONCURRENCY]();
declare @SQL nvarchar(max);
declare @CURRENTAPPUSERID uniqueidentifier = dbo.[UFN_APPUSER_GETREPORTAPPUSERID](@REPORTUSERID, @ALTREPORTUSERID);
if object_id('tempdb..#APPEALS') is not null
drop table #APPEALS;
create table #APPEALS (
[ID] uniqueidentifier not null primary key,
[NAME] nvarchar(100) collate database_default not null,
[BASECURRENCYID] uniqueidentifier
);
set @SQL = 'with [SECURITY] ([CURRENTAPPUSERID], [ISSYSADMIN], [INNONRACROLE], [INNOGROUPROLE]) as ' + char(13) +
'(' + char(13) +
' select' + char(13) +
' @CURRENTAPPUSERID as [CURRENTAPPUSERID],' + char(13) +
' dbo.[UFN_APPUSER_ISSYSADMIN](@CURRENTAPPUSERID) as [ISSYSADMIN],' + char(13) +
' dbo.[UFN_SECURITY_APPUSER_IN_NONRACROLE](@CURRENTAPPUSERID) as [INNONRACROLE],'+ char(13) +
' dbo.[UFN_SECURITY_APPUSER_IN_NO_SECURITY_GROUP_ROLE](@CURRENTAPPUSERID) as [INNOGROUPROLE] )' + char(13) +
'insert into #APPEALS ([ID], [NAME], [BASECURRENCYID])' + char(13) +
' select' + char(13) +
' [ID],' + char(13) +
' [NAME],' + char(13) +
' [BASECURRENCYID]' + char(13) +
' from dbo.[APPEAL]' + char(13) +
' cross apply [SECURITY]' + char(13) +
' where ([SECURITY].[ISSYSADMIN] = 1 or dbo.[UFN_SITEALLOWEDFORUSER]([SECURITY].[CURRENTAPPUSERID], [APPEAL].[SITEID]) = 1)';
if @APPEALSELECTIONID is not null
set @SQL += char(13) + ' and [ID] in (select [ID] from dbo.' + dbo.[UFN_MKTSELECTION_GETFUNCTIONNAME](@APPEALSELECTIONID) + ')';
exec sp_executesql @SQL, N'@CURRENTAPPUSERID uniqueidentifier', @CURRENTAPPUSERID = @CURRENTAPPUSERID;
if object_id('tempdb..#SEGMENTS') is not null
drop table #SEGMENTS;
create table #SEGMENTS (
[SEGMENTID] uniqueidentifier not null,
[TESTSEGMENTID] uniqueidentifier,
[APPEALID] uniqueidentifier not null,
[PACKAGEID] uniqueidentifier not null,
[QUANTITY] int not null
);
with [MAILINGS] ([ID], [APPEALID]) as
(
select
[MKTSEGMENTATION].[ID],
[APPEALS].[ID]
from #APPEALS as [APPEALS]
inner join dbo.[MKTSEGMENTATIONACTIVATE] on [MKTSEGMENTATIONACTIVATE].[APPEALSYSTEMID] = cast([APPEALS].[ID] as nvarchar(36)) and [MKTSEGMENTATIONACTIVATE].[RECORDSOURCEID] = 'DFB4B8C1-5E9A-4C14-ACE3-01C096B53BA0'
inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID]
where [MKTSEGMENTATION].[ACTIVE] = 1
)
insert into #SEGMENTS ([SEGMENTID], [TESTSEGMENTID], [APPEALID], [PACKAGEID], [QUANTITY])
--Segments
select
[MKTSEGMENTATIONSEGMENT].[ID] as [SEGMENTID],
null as [TESTSEGMENTID],
[MAILINGS].[APPEALID],
[MKTSEGMENTATIONSEGMENT].[PACKAGEID],
[MKTSEGMENTATIONSEGMENTACTIVE].[QUANTITY]
from [MAILINGS]
inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = [MAILINGS].[ID] and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0
inner join dbo.[MKTSEGMENTATIONSEGMENTACTIVE] on [MKTSEGMENTATIONSEGMENTACTIVE].[SEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID] and [MKTSEGMENTATIONSEGMENTACTIVE].[TESTSEGMENTID] is null
union all
--Test segments
select
[MKTSEGMENTATIONSEGMENT].[ID] as [SEGMENTID],
[MKTSEGMENTATIONTESTSEGMENT].[ID] as [TESTSEGMENTID],
[MAILINGS].[APPEALID],
[MKTSEGMENTATIONTESTSEGMENT].[PACKAGEID],
[MKTSEGMENTATIONSEGMENTACTIVE].[QUANTITY]
from [MAILINGS]
inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = [MAILINGS].[ID] and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0
inner join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID]
inner join dbo.[MKTSEGMENTATIONSEGMENTACTIVE] on [MKTSEGMENTATIONSEGMENTACTIVE].[SEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID] and [MKTSEGMENTATIONSEGMENTACTIVE].[TESTSEGMENTID] = [MKTSEGMENTATIONTESTSEGMENT].[ID];
--Check if we are a SQL Server Enterprise server before creating the proper index...
if serverproperty('engineedition') = 3 --Enterprise
create nonclustered index [IX_SEGMENTS_APPEALID_PACKAGEID] on #SEGMENTS ([APPEALID], [PACKAGEID]) include ([QUANTITY]) with (DATA_COMPRESSION=PAGE);
else
create nonclustered index [IX_SEGMENTS_APPEALID_PACKAGEID] on #SEGMENTS ([APPEALID], [PACKAGEID]) include ([QUANTITY]);
set @SQL = 'with [MATCHINGIFTCLAIMS] ([REVENUEID], [SEGMENTID], [TESTSEGMENTID]) as' + char(13) +
'(' + char(13) +
' select' + char(13) +
' [REVENUEMATCHINGGIFT].[ID],' + char(13) +
' [REVENUESEGMENT].[SEGMENTID],' + char(13) +
' [REVENUESEGMENT].[TESTSEGMENTID]' + char(13) +
' from dbo.[REVENUEMATCHINGGIFT]' + char(13) +
' left join dbo.[REVENUESEGMENT] on [REVENUESEGMENT].[REVENUEID] = [REVENUEMATCHINGGIFT].[MGSOURCEREVENUEID]' + char(13) +
'),' + char(13) +
'[REVENUES] ([ID], [APPEALID], [APPEALNAME], [SEGMENTID], [TESTSEGMENTID], [AMOUNT], [CURRENCYID]) as' + char(13) +
'(' + char(13) +
' select' + char(13) +
' [REVENUE].[ID],' + char(13) +
' [REVENUE].[APPEALID],' + char(13) +
' [APPEALS].[NAME],' + char(13) +
-- If gift is a matching gift claim, then use the matching gift claim segment or test segment id
' isnull([REVENUESEGMENT].[SEGMENTID], [MATCHINGIFTCLAIMS].[SEGMENTID]) as [SEGMENTID],' + char(13) +
' isnull([REVENUESEGMENT].[TESTSEGMENTID], [MATCHINGIFTCLAIMS].[TESTSEGMENTID]) as [TESTSEGMENTID],' + char(13);
if @CURRENCYCODE = 1
set @SQL += ' [REVENUE].[ORGANIZATIONAMOUNT],' + char(13) +
' @ORGANIZATIONCURRENCYID' + char(13);
else
set @SQL += ' case' + char(13) +
' when [REVENUE].[BASECURRENCYID] = @ORGANIZATIONCURRENCYID then' + char(13) +
' [REVENUE].[ORGANIZATIONAMOUNT]' + char(13) +
' when [REVENUE].[BASECURRENCYID] = [APPEALS].[BASECURRENCYID] then' + char(13) +
' [REVENUE].[AMOUNT]' + char(13) +
' when dbo.[UFN_CURRENCYEXCHANGERATE_GETLATESTINCLUDEEXPIRED]([REVENUE].[BASECURRENCYID], [APPEALS].[BASECURRENCYID], [REVENUE].[DATEADDED], 1, null) is not null then' + char(13) +
' dbo.[UFN_CURRENCY_CONVERT]([REVENUE].[AMOUNT], dbo.[UFN_CURRENCYEXCHANGERATE_GETLATESTINCLUDEEXPIRED]([REVENUE].[BASECURRENCYID], [APPEALS].[BASECURRENCYID], [REVENUE].[DATEADDED], 1, null))' + char(13) +
' else' + char(13) +
' dbo.[UFN_CURRENCY_CONVERTINVERSE]([REVENUE].[AMOUNT], dbo.[UFN_CURRENCYEXCHANGERATE_GETLATESTINCLUDEEXPIRED]([APPEALS].[BASECURRENCYID], [REVENUE].[BASECURRENCYID], [REVENUE].[DATEADDED], 1, null))' + char(13) +
' end,' + char(13) +
' [APPEALS].[BASECURRENCYID]' + char(13);
set @SQL += ' from dbo.[REVENUE]' + char(13);
if @REVENUESELECTIONID is not null
set @SQL += ' inner join dbo.' + dbo.[UFN_MKTSELECTION_GETFUNCTIONNAME](@REVENUESELECTIONID) + ' as [REVENUESELECTION] on [REVENUESELECTION].[ID] = [REVENUE].[ID]' + char(13);
set @SQL += ' inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [REVENUE].[ID]' + char(13) +
' inner join dbo.[REVENUESPLIT_EXT] on [REVENUESPLIT_EXT].[ID] = [FINANCIALTRANSACTIONLINEITEM].[ID]' + char(13) +
' inner join #APPEALS as [APPEALS] on [APPEALS].[ID] = [REVENUE].[APPEALID]' + char(13) +
' left join dbo.[REVENUESEGMENT] on [REVENUESEGMENT].[REVENUEID] = [REVENUE].[ID]' + char(13) +
' left join [MATCHINGIFTCLAIMS] on [MATCHINGIFTCLAIMS].[REVENUEID] = [REVENUE].[ID]' + char(13) +
' where (' + char(13) +
' --Revenue (excluding pledge, recurring gift, and matching gift payments)' + char(13) +
' ([REVENUE].[TRANSACTIONTYPECODE] = 0 and [REVENUESPLIT_EXT].[APPLICATIONCODE] not in (2,3,7))' + char(13) +
' or' + char(13) +
' --Pledges' + char(13) +
' [REVENUE].[TRANSACTIONTYPECODE] in (1,3,4,8)' + char(13) +
' )' + char(13) +
'),' + char(13);
--SQL only allows you to concat 4000 chars at a time to a string, so we have to arbitrarily break up how we build this SQL statement...
set @SQL += '[PACKAGETOTALS] ([APPEALID], [APPEALNAME], [PACKAGEID], [QUANTITY], [RESPONSES], [TOTALREVENUE], [CURRENCYID]) as' + char(13) +
'(' + char(13) +
' select' + char(13) +
' [SEGMENTS].[APPEALID],' + char(13) +
' [APPEALS].[NAME],' + char(13) +
' [SEGMENTS].[PACKAGEID],' + char(13) +
' (select sum([S].[QUANTITY]) from #SEGMENTS as [S] where [S].[APPEALID] = [SEGMENTS].[APPEALID] and [S].[PACKAGEID] = [SEGMENTS].[PACKAGEID]) as [QUANTITY],' + char(13) +
' count([REVENUES].[ID]) as [RESPONSES],' + char(13) +
' isnull(sum([REVENUES].[AMOUNT]), 0) as [TOTALREVENUE],' + char(13) +
' isnull([REVENUES].[CURRENCYID], ' + (case when @CURRENCYCODE = 1 then '@ORGANIZATIONCURRENCYID' else '[APPEALS].[BASECURRENCYID]' end) + ')' + char(13) +
' from #SEGMENTS as [SEGMENTS]' + char(13) +
' left join [REVENUES] on [REVENUES].[SEGMENTID] = [SEGMENTS].[SEGMENTID] and (([REVENUES].[TESTSEGMENTID] is null and [SEGMENTS].[TESTSEGMENTID] is null) or [REVENUES].[TESTSEGMENTID] = [SEGMENTS].[TESTSEGMENTID])' + char(13) +
' left join #APPEALS as [APPEALS] on [APPEALS].[ID] = [SEGMENTS].[APPEALID]' + char(13) +
' group by [SEGMENTS].[APPEALID], [APPEALS].[NAME], [SEGMENTS].[PACKAGEID], isnull([REVENUES].[CURRENCYID], ' + (case when @CURRENCYCODE = 1 then '@ORGANIZATIONCURRENCYID' else '[APPEALS].[BASECURRENCYID]' end) + ')' + char(13) +
'),' + char(13) +
'[NONPACKAGETOTALS] ([APPEALID], [APPEALNAME], [RESPONSES], [TOTALREVENUE], [CURRENCYID]) as' + char(13) +
'(' + char(13) +
' select' + char(13) +
' [REVENUES].[APPEALID],' + char(13) +
' [REVENUES].[APPEALNAME],' + char(13) +
' count([REVENUES].[ID]) as [RESPONSES],' + char(13) +
' isnull(sum([REVENUES].[AMOUNT]), 0) as [TOTALREVENUE],' + char(13) +
' [REVENUES].[CURRENCYID]' + char(13) +
' from [REVENUES]' + char(13) +
' where [REVENUES].[SEGMENTID] is null' + char(13) +
' group by [REVENUES].[APPEALID], [REVENUES].[APPEALNAME], [REVENUES].[CURRENCYID]' + char(13) +
')' + char(13);
--SQL only allows you to concat 4000 chars at a time to a string, so we have to arbitrarily break up how we build this SQL statement...
set @SQL += '--Appeals and packages with revenue' + char(13) +
'select' + char(13) +
' [PACKAGETOTALS].[APPEALID],' + char(13) +
' [PACKAGETOTALS].[APPEALNAME],' + char(13) +
' [MKTPACKAGE].[ID] as [PACKAGEID],' + char(13) +
' [MKTPACKAGE].[NAME] as [PACKAGENAME],' + char(13) +
' [PACKAGETOTALS].[QUANTITY],' + char(13) +
' [PACKAGETOTALS].[RESPONSES],' + char(13) +
' [PACKAGETOTALS].[TOTALREVENUE],' + char(13) +
' cast((case when [PACKAGETOTALS].[QUANTITY] > 0 then cast([PACKAGETOTALS].[RESPONSES] as decimal(19,4)) / cast([PACKAGETOTALS].[QUANTITY] as decimal(19,4)) else 0 end) as decimal(19,4)) as [RESPONSERATE],' + char(13) +
' cast((case when [PACKAGETOTALS].[RESPONSES] > 0 then [PACKAGETOTALS].[TOTALREVENUE] / [PACKAGETOTALS].[RESPONSES] else 0 end) as money) as [AVGGIFT],' + char(13) +
' cast((case when [PACKAGETOTALS].[QUANTITY] > 0 then [PACKAGETOTALS].[TOTALREVENUE] / [PACKAGETOTALS].[QUANTITY] else 0 end) as money) as [REVENUEPERPIECE],' + char(13) +
' [CURRENCY].[ISO4217] as [CURRENCYISOCURRENCYCODE],' + char(13) +
' [CURRENCY].[DECIMALDIGITS] as [CURRENCYDECIMALDIGITS],' + char(13) +
' [CURRENCY].[CURRENCYSYMBOL] as [CURRENCYSYMBOL],' + char(13) +
' [CURRENCY].[SYMBOLDISPLAYSETTINGCODE] as [CURRENCYSYMBOLDISPLAYSETTINGCODE],' + char(13) +
' ''http://www.blackbaud.com/APPEALID?APPEALID='' + convert(nvarchar(36), [PACKAGETOTALS].[APPEALID]) as [APPEALLINK],' + char(13) +
' ''http://www.blackbaud.com/PACKAGEID?PACKAGEID='' + convert(nvarchar(36), [MKTPACKAGE].[ID]) as [PACKAGELINK]' + char(13) +
'from [PACKAGETOTALS]' + char(13) +
'left join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [PACKAGETOTALS].[PACKAGEID]' + char(13) +
'left join dbo.[CURRENCY] on [CURRENCY].[ID] = [PACKAGETOTALS].[CURRENCYID]' + char(13) +
char(13) +
'union all' + char(13) +
char(13) +
'--Appeals with revenue (no packages)' + char(13) +
'select' + char(13) +
' [NONPACKAGETOTALS].[APPEALID],' + char(13) +
' [NONPACKAGETOTALS].[APPEALNAME],' + char(13) +
' null as [PACKAGEID],' + char(13) +
' ''(No package)'' as [PACKAGENAME],' + char(13) +
' cast(0 as int) as [QUANTITY],' + char(13) +
' [NONPACKAGETOTALS].[RESPONSES],' + char(13) +
' [NONPACKAGETOTALS].[TOTALREVENUE],' + char(13) +
' cast(0 as decimal(19,4)) as [RESPONSERATE],' + char(13) +
' cast((case when [NONPACKAGETOTALS].[RESPONSES] > 0 then [NONPACKAGETOTALS].[TOTALREVENUE] / [NONPACKAGETOTALS].[RESPONSES] else 0 end) as money) as [AVGGIFT],' + char(13) +
' cast(0 as money) as [REVENUEPERPIECE],' + char(13) +
' [CURRENCY].[ISO4217] as [CURRENCYISOCURRENCYCODE],' + char(13) +
' [CURRENCY].[DECIMALDIGITS] as [CURRENCYDECIMALDIGITS],' + char(13) +
' [CURRENCY].[CURRENCYSYMBOL] as [CURRENCYSYMBOL],' + char(13) +
' [CURRENCY].[SYMBOLDISPLAYSETTINGCODE] as [CURRENCYSYMBOLDISPLAYSETTINGCODE],' + char(13) +
' ''http://www.blackbaud.com/APPEALID?APPEALID='' + convert(nvarchar(36), [NONPACKAGETOTALS].[APPEALID]) as [APPEALLINK],' + char(13) +
' '''' as [PACKAGELINK]' + char(13) +
'from [NONPACKAGETOTALS]' + char(13) +
'left join dbo.[CURRENCY] on [CURRENCY].[ID] = [NONPACKAGETOTALS].[CURRENCYID]' + char(13) +
'order by [APPEALNAME], [PACKAGENAME]';
exec sp_executesql @SQL, N'@ORGANIZATIONCURRENCYID uniqueidentifier', @ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID;
drop table #APPEALS;
drop table #SEGMENTS;
return 0;