USP_REPORT_APPEALBUDGETPERFORMANCE
Retrieves cost information for all or a selection of appeals.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN | |
@CATEGORYID | uniqueidentifier | IN | |
@BUSINESSUNITID | uniqueidentifier | IN | |
@REPORTCODEID | uniqueidentifier | IN | |
@SITEID | uniqueidentifier | IN | |
@REPORTUSERID | nvarchar(128) | IN | |
@APPEALID | uniqueidentifier | IN | |
@CURRENCYCODE | tinyint | IN | |
@ALTREPORTUSERID | nvarchar(128) | IN |
Definition
Copy
CREATE procedure dbo.[USP_REPORT_APPEALBUDGETPERFORMANCE]
(
@STARTDATE datetime = null,
@ENDDATE datetime = null,
@CATEGORYID uniqueidentifier = null,
@BUSINESSUNITID uniqueidentifier = null,
@REPORTCODEID uniqueidentifier = null,
@SITEID uniqueidentifier = null,
@REPORTUSERID nvarchar(128) = null,
@APPEALID uniqueidentifier = null,
@CURRENCYCODE tinyint = null,
@ALTREPORTUSERID nvarchar(128) = null
)
as
set nocount on;
set transaction isolation level read uncommitted;
declare @CURRENTAPPUSERID uniqueidentifier = dbo.[UFN_APPUSER_GETREPORTAPPUSERID](@REPORTUSERID, @ALTREPORTUSERID);
declare @ISSYSADMIN as bit = dbo.[UFN_APPUSER_ISSYSADMIN](@CURRENTAPPUSERID);
declare @SELECTEDCURRENCYID uniqueidentifier;
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.[UFN_CURRENCY_GETORGANIZATIONCURRENCY]();
declare @DECIMALDIGITS tinyint;
declare @ROUNDINGTYPECODE tinyint;
if @STARTDATE is not null
set @STARTDATE = dbo.[UFN_DATE_GETEARLIESTTIME](@STARTDATE);
if @ENDDATE is not null
set @ENDDATE = dbo.[UFN_DATE_GETLATESTTIME](@ENDDATE);
if @CURRENCYCODE = 0
set @SELECTEDCURRENCYID = null;
else if @CURRENCYCODE = 2
set @SELECTEDCURRENCYID = dbo.[UFN_APPUSER_GETBASECURRENCY](@CURRENTAPPUSERID);
else
begin
set @CURRENCYCODE = 1;
set @SELECTEDCURRENCYID = @ORGANIZATIONCURRENCYID;
end
select
@DECIMALDIGITS = [DECIMALDIGITS],
@ROUNDINGTYPECODE = [ROUNDINGTYPECODE]
from dbo.[CURRENCY]
where [ID] = @SELECTEDCURRENCYID;
declare @APPEALS table (
[ID] uniqueidentifier not null primary key,
[NAME] nvarchar(100) not null,
[CURRENCYID] uniqueidentifier,
[CURRENCYISO] nvarchar(3),
[CURRENCYDECIMALDIGITS] tinyint,
[CURRENCYSYMBOL] nvarchar(5),
[CURRENCYSYMBOLDISPLAYSETTINGCODE] tinyint
);
--All appeals that meet the criteria
insert into @APPEALS ([ID], [NAME], [CURRENCYID], [CURRENCYISO], [CURRENCYDECIMALDIGITS], [CURRENCYSYMBOL], [CURRENCYSYMBOLDISPLAYSETTINGCODE])
select distinct
[APPEAL].[ID],
[APPEAL].[NAME],
[CURRENCYPROPERTIES].[ID] as [CURRENCYID],
[CURRENCYPROPERTIES].[ISO4217] as [CURRENCYISO],
[CURRENCYPROPERTIES].[DECIMALDIGITS] as [CURRENCYDECIMALDIGITS],
[CURRENCYPROPERTIES].[CURRENCYSYMBOL] as [CURRENCYSYMBOL],
[CURRENCYPROPERTIES].[SYMBOLDISPLAYSETTINGCODE] as [CURRENCYSYMBOLDISPLAYSETTINGCODE]
from dbo.[UFN_APPEAL_GETGOALINCURRENCY_BULK2](@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, 1) as [APPEAL]
/*#IDSETEXTENSION*/
left join dbo.[APPEALBUSINESSUNIT] on [APPEALBUSINESSUNIT].[APPEALID] = [APPEAL].[ID]
outer apply dbo.[UFN_CURRENCY_GETPROPERTIES](isnull(@SELECTEDCURRENCYID, [APPEAL].[BASECURRENCYID])) as [CURRENCYPROPERTIES]
where (@REPORTCODEID is null or [APPEAL].[APPEALREPORT1CODEID] = @REPORTCODEID)
and (@CATEGORYID is null or [APPEAL].[APPEALCATEGORYCODEID] = @CATEGORYID)
and (@BUSINESSUNITID is null or [APPEALBUSINESSUNIT].[BUSINESSUNITCODEID] = @BUSINESSUNITID)
and (@SITEID is null or [APPEAL].[SITEID] = @SITEID)
and (@ISSYSADMIN = 1 or dbo.[UFN_SITEALLOWEDFORUSER](@CURRENTAPPUSERID, [APPEAL].[SITEID]) = 1)
and (@APPEALID is null or [APPEAL].[ID] = @APPEALID);
if object_id('tempdb..#APPEALREVENUESPLIT') is not null
drop table #APPEALREVENUESPLIT;
create table #APPEALREVENUESPLIT (
[APPEALID] uniqueidentifier not null,
[REVENUEID] uniqueidentifier not null,
[ISPLEDGE] bit not null,
[REVENUESPLITAMOUNTINCURRENCY] money,
[WRITEOFFSPLITAMOUNTINCURRENCY] money
);
--Revenue that matches the appeal and meets the date criteria
insert into #APPEALREVENUESPLIT ([APPEALID], [REVENUEID], [ISPLEDGE], [REVENUESPLITAMOUNTINCURRENCY], [WRITEOFFSPLITAMOUNTINCURRENCY])
select
[APPEALS].[ID] as [APPEALID],
[REVENUESPLITAMOUNTS].[REVENUEID],
(case when [TRANSACTIONTYPECODE] in (1,3,4,8) then 1 else 0 end) as [ISPLEDGE],
[REVENUESPLITAMOUNTS].[REVENUESPLITAMOUNTINCURRENCY],
[REVENUESPLITAMOUNTS].[WRITEOFFSPLITAMOUNTINCURRENCY]
from @APPEALS as [APPEALS]
inner join dbo.[UFN_APPEALREVENUESPLIT_GETAMOUNTSINCURRENCY_BULK](@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, @CURRENCYCODE) as [REVENUESPLITAMOUNTS] on [REVENUESPLITAMOUNTS].[APPEALID] = [APPEALS].[ID]
where (
--Revenue (excluding pledge payments)
([REVENUESPLITAMOUNTS].[TRANSACTIONTYPECODE] = 0 and [REVENUESPLITAMOUNTS].[APPLICATIONCODE] not in (2,3))
or
--Pledges
[REVENUESPLITAMOUNTS].[TRANSACTIONTYPECODE] in (1,3,4,8)
)
and (@STARTDATE is null or [REVENUESPLITAMOUNTS].[DATE] >= @STARTDATE)
and (@ENDDATE is null or [REVENUESPLITAMOUNTS].[DATE] <= @ENDDATE);
with [APPEALREVENUE_CTE] ([APPEALID], [REVENUEID], [RECEIVEDAMOUNT], [PLEDGEDAMOUNT], [PLEDGEWRITEOFFAMOUNT]) as
(
select
[APPEALID],
[REVENUEID],
(case when [ISPLEDGE] = 1 then 0 else isnull(sum([REVENUESPLITAMOUNTINCURRENCY]), 0) end) as [RECEIVEDAMOUNT],
(case when [ISPLEDGE] = 1 then isnull(sum([REVENUESPLITAMOUNTINCURRENCY]), 0) else 0 end) as [PLEDGEDAMOUNT],
(case when [ISPLEDGE] = 1 then isnull(sum([WRITEOFFSPLITAMOUNTINCURRENCY]), 0) else 0 end) as [PLEDGEWRITEOFFAMOUNT]
from #APPEALREVENUESPLIT as [ARS]
group by [APPEALID], [REVENUEID], [ISPLEDGE]
),
[APPEALMAILINGREVENUE_CTE] ([APPEALID], [MAILINGID], [RECEIVEDAMOUNT], [PLEDGEDAMOUNT], [PLEDGEWRITEOFFAMOUNT]) as
(
--Segment revenue: Matches to a segment within a mailing
select
[APPEALREVENUE_CTE].[APPEALID],
[MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID],
[APPEALREVENUE_CTE].[RECEIVEDAMOUNT],
[APPEALREVENUE_CTE].[PLEDGEDAMOUNT],
[APPEALREVENUE_CTE].[PLEDGEWRITEOFFAMOUNT]
from [APPEALREVENUE_CTE]
inner join dbo.[REVENUESEGMENT] on [REVENUESEGMENT].[REVENUEID] = [APPEALREVENUE_CTE].[REVENUEID]
inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [REVENUESEGMENT].[SEGMENTID]
union all
--Indirect revenue: Matches to the mailing only (no segment)
select
[APPEALREVENUE_CTE].[APPEALID],
[REVENUE_EXT].[MAILINGID],
[APPEALREVENUE_CTE].[RECEIVEDAMOUNT],
[APPEALREVENUE_CTE].[PLEDGEDAMOUNT],
[APPEALREVENUE_CTE].[PLEDGEWRITEOFFAMOUNT]
from [APPEALREVENUE_CTE]
inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [APPEALREVENUE_CTE].[REVENUEID]
where not exists(select * from dbo.[REVENUESEGMENT] where [REVENUEID] = [APPEALREVENUE_CTE].[REVENUEID])
and [REVENUE_EXT].[MAILINGID] is not null
),
[MAILINGREVENUE_CTE] ([APPEALID], [MAILINGID], [TOTALRECEIVED], [TOTALPLEDGED], [TOTALPLEDGESWRITTENOFF]) as
(
--Revenue and cost totals for revenue that matches to a mailing
select
[APPEALS].[ID] as [APPEALID],
[MKTSEGMENTATION].[ID] as [MAILINGID],
isnull(sum([APPEALMAILINGREVENUE_CTE].[RECEIVEDAMOUNT]), 0) as [TOTALRECEIVED],
isnull(sum([APPEALMAILINGREVENUE_CTE].[PLEDGEDAMOUNT]), 0) as [TOTALPLEDGED],
isnull(sum([APPEALMAILINGREVENUE_CTE].[PLEDGEWRITEOFFAMOUNT]), 0) as [TOTALPLEDGESWRITTENOFF]
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] and [MKTSEGMENTATION].[ACTIVE] = 1 /*Activated mailings only*/
left join [APPEALMAILINGREVENUE_CTE] on [APPEALMAILINGREVENUE_CTE].[APPEALID] = [APPEALS].[ID] and [APPEALMAILINGREVENUE_CTE].[MAILINGID] = [MKTSEGMENTATION].[ID]
group by [APPEALS].[ID], [MKTSEGMENTATION].[ID]
),
[NONMAILINGREVENUE_CTE] ([APPEALID], [TOTALRECEIVED], [TOTALPLEDGED], [TOTALPLEDGESWRITTENOFF]) as
(
--Revenue totals for revenue that does NOT match to any mailing
select
[APPEALREVENUE_CTE].[APPEALID],
isnull(sum([APPEALREVENUE_CTE].[RECEIVEDAMOUNT]), 0) as [TOTALRECEIVED],
isnull(sum([APPEALREVENUE_CTE].[PLEDGEDAMOUNT]), 0) as [TOTALPLEDGED],
isnull(sum([APPEALREVENUE_CTE].[PLEDGEWRITEOFFAMOUNT]), 0) as [TOTALPLEDGESWRITTENOFF]
from @APPEALS as [APPEALS]
left join [APPEALREVENUE_CTE] on [APPEALREVENUE_CTE].[APPEALID] = [APPEALS].[ID]
left join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [APPEALREVENUE_CTE].[REVENUEID]
where [REVENUE_EXT].[MAILINGID] is null
and not exists(select * from dbo.[REVENUESEGMENT] where [REVENUEID] = [APPEALREVENUE_CTE].[REVENUEID])
group by [APPEALREVENUE_CTE].[APPEALID]
)
--Revenue that matches to a mailing
select
[MAILINGREVENUE_CTE].[MAILINGID],
[MKTSEGMENTATION].[NAME],
convert(money, [MAILINGAMOUNTS].[TOTALCOSTINCURRENCY]) as [TOTALCOST],
convert(money, ([MAILINGREVENUE_CTE].[TOTALRECEIVED] + [MAILINGREVENUE_CTE].[TOTALPLEDGED] - [MAILINGREVENUE_CTE].[TOTALPLEDGESWRITTENOFF])) as [TOTALINCOME],
convert(money, ([MAILINGREVENUE_CTE].[TOTALRECEIVED] + [MAILINGREVENUE_CTE].[TOTALPLEDGED] - [MAILINGREVENUE_CTE].[TOTALPLEDGESWRITTENOFF] - [MAILINGAMOUNTS].[TOTALCOSTINCURRENCY])) as [TOTALPROFIT],
(case when [MAILINGAMOUNTS].[TOTALCOSTINCURRENCY] <> 0
then convert(money, ([MAILINGREVENUE_CTE].[TOTALRECEIVED] + [MAILINGREVENUE_CTE].[TOTALPLEDGED] - [MAILINGREVENUE_CTE].[TOTALPLEDGESWRITTENOFF] - [MAILINGAMOUNTS].[TOTALCOSTINCURRENCY]) / [MAILINGAMOUNTS].[TOTALCOSTINCURRENCY])
else convert(money, 0)
end) as [ROI],
(case when ([MAILINGREVENUE_CTE].[TOTALRECEIVED] + [MAILINGREVENUE_CTE].[TOTALPLEDGED] - [MAILINGREVENUE_CTE].[TOTALPLEDGESWRITTENOFF]) <> 0
then convert(money, ([MAILINGAMOUNTS].[TOTALCOSTINCURRENCY] / ([MAILINGREVENUE_CTE].[TOTALRECEIVED] + [MAILINGREVENUE_CTE].[TOTALPLEDGED] - [MAILINGREVENUE_CTE].[TOTALPLEDGESWRITTENOFF])))
else convert(money, (case when isnull([MAILINGAMOUNTS].[TOTALCOSTINCURRENCY], 0) = 0 then 0 else 1 end))
end) as [COSTPERDOLLARRAISED],
[MAILINGREVENUE_CTE].[APPEALID],
[APPEALS].[NAME] as [APPEALNAME],
'http://www.blackbaud.com/APPEALID?APPEALID=' + convert(nvarchar(36), [MAILINGREVENUE_CTE].[APPEALID]) as [APPEALLINK],
'http://www.blackbaud.com/' + (case when [MKTSEGMENTATION].[MAILINGTYPECODE] = 4 then 'PUBLICMEDIAEFFORTID' else 'MAILINGID' end) + '?MAILINGID=' + convert(nvarchar(36), [MAILINGREVENUE_CTE].[MAILINGID]) as [MAILINGLINK],
cast((case when [APPEALMAILING].[ID] is not null then 1 else 0 end) as bit) as [ISAPPEALMAILING],
'http://www.blackbaud.com/APPEALMAILINGID?APPEALMAILINGID=' + convert(nvarchar(36), [APPEALMAILING].[ID]) as [APPEALMAILINGLINK],
[APPEALS].[CURRENCYID],
[APPEALS].[CURRENCYISO],
[APPEALS].[CURRENCYDECIMALDIGITS],
[APPEALS].[CURRENCYSYMBOL],
[APPEALS].[CURRENCYSYMBOLDISPLAYSETTINGCODE]
from [MAILINGREVENUE_CTE]
left join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MAILINGREVENUE_CTE].[MAILINGID]
left join dbo.[UFN_MKTSEGMENTATION_GETAMOUNTSINCURRENCY_BULK](@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as [MAILINGAMOUNTS] on [MAILINGAMOUNTS].[ID] = [MKTSEGMENTATION].[ID]
left join @APPEALS as [APPEALS] on [APPEALS].[ID] = [MAILINGREVENUE_CTE].[APPEALID]
left join dbo.[APPEALMAILING] on [APPEALMAILING].[ID] = [MAILINGREVENUE_CTE].[MAILINGID]
union all
--Revenue that does NOT match to any mailing
select
null as [MAILINGID],
'(No mailing)' as [NAME],
convert(money, 0) as [TOTALCOST],
convert(money, ([NONMAILINGREVENUE_CTE].[TOTALRECEIVED] + [NONMAILINGREVENUE_CTE].[TOTALPLEDGED] - [NONMAILINGREVENUE_CTE].[TOTALPLEDGESWRITTENOFF])) as [TOTALINCOME],
convert(money, ([NONMAILINGREVENUE_CTE].[TOTALRECEIVED] + [NONMAILINGREVENUE_CTE].[TOTALPLEDGED] - [NONMAILINGREVENUE_CTE].[TOTALPLEDGESWRITTENOFF])) as [TOTALPROFIT],
0 as [ROI],
0 as [COSTPERDOLLARRAISED],
[NONMAILINGREVENUE_CTE].[APPEALID],
[APPEALS].[NAME] as [APPEALNAME],
'http://www.blackbaud.com/APPEALID?APPEALID=' + convert(nvarchar(36), [NONMAILINGREVENUE_CTE].[APPEALID]) as [APPEALLINK],
null as [MAILINGLINK],
cast(0 as bit) as [ISAPPEALMAILING],
null as [APPEALMAILINGLINK],
[APPEALS].[CURRENCYID],
[APPEALS].[CURRENCYISO],
[APPEALS].[CURRENCYDECIMALDIGITS],
[APPEALS].[CURRENCYSYMBOL],
[APPEALS].[CURRENCYSYMBOLDISPLAYSETTINGCODE]
from [NONMAILINGREVENUE_CTE]
left join @APPEALS as [APPEALS] on [APPEALS].[ID] = [NONMAILINGREVENUE_CTE].[APPEALID]
order by [APPEALNAME], [NAME];
drop table #APPEALREVENUESPLIT;