USP_REPORT_TEAMFUNDRAISINGTEAMPERFORMANCE
Returns rows for Team Fundraising Team Performance report.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@TEAMQUERYID | uniqueidentifier | IN | |
@TEAMID | uniqueidentifier | IN | |
@GROUPSONLY | bit | IN | |
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN | |
@REPORTUSERID | nvarchar(128) | IN | |
@ALTREPORTUSERID | nvarchar(128) | IN | |
@CURRENCYCODE | tinyint | IN |
Definition
Copy
CREATE procedure dbo.USP_REPORT_TEAMFUNDRAISINGTEAMPERFORMANCE
(
@TEAMQUERYID uniqueidentifier = null,
@TEAMID uniqueidentifier = null,
@GROUPSONLY bit = 0,
@STARTDATE datetime = null,
@ENDDATE datetime = null,
@REPORTUSERID nvarchar(128),
@ALTREPORTUSERID nvarchar(128) = null,
@CURRENCYCODE tinyint = null
)
as
set nocount on;
begin try
create table #FUNDRAISERINFO
(
GROUPID uniqueidentifier,
TEAMID uniqueidentifier,
PARENTTEAMID uniqueidentifier,
TEAMGOAL money,
EVENTID uniqueidentifier,
FUNDRAISERID uniqueidentifier,
REVENUEID uniqueidentifier,
AMOUNTSOLICITED money,
ISINGROUP bit,
SHOWINREPORT bit
)
declare @CURRENTAPPUSERID uniqueidentifier;
set @CURRENTAPPUSERID = dbo.UFN_APPUSER_GETREPORTAPPUSERID(@REPORTUSERID, @ALTREPORTUSERID);
declare @SELECTEDCURRENCYID uniqueidentifier;
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
set @SELECTEDCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
-- Retrieve the table for the selection, if there is one.
declare @DBOBJECTNAME nvarchar(128);
declare @DBOBJECTTYPE smallint;
if @TEAMQUERYID is not null begin
if not exists(select ID from dbo.IDSETREGISTER where ID = @TEAMQUERYID) raiserror('ID set does not exist in the database.', 15, 1);
select @DBOBJECTNAME = DBOBJECTNAME, @DBOBJECTTYPE = OBJECTTYPE from dbo.IDSETREGISTER where ID = @TEAMQUERYID;
if @DBOBJECTTYPE = 1 set @DBOBJECTNAME = @DBOBJECTNAME + '()';
else if @DBOBJECTTYPE = 2 set @DBOBJECTNAME = @DBOBJECTNAME + '(''' + convert(nvarchar(36), @TEAMQUERYID) + ''')';
end
declare @SQLTOEXEC nvarchar(max);
set @SQLTOEXEC =
'declare @INCLUDEDTEAM table(
ID uniqueidentifier,
PARENTTEAMID uniqueidentifier,
TEAMFUNDRAISINGTEAMGROUPID uniqueidentifier,
GOAL money,
APPEALID uniqueidentifier,
SHOWINREPORT bit
)
if @TEAMID is not null
begin
insert into @INCLUDEDTEAM
(
ID,
PARENTTEAMID,
TEAMFUNDRAISINGTEAMGROUPID,
GOAL,
APPEALID,
SHOWINREPORT
)
select
TEAM.ID,
TEAM.PARENTTEAMID,
TEAM.TEAMFUNDRAISINGTEAMGROUPID,
case
when @SELECTEDCURRENCYID = TEAM.BASECURRENCYID then
TEAM.GOAL
when (@CURRENCYCODE = 3) and (@SELECTEDCURRENCYID <> dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()) then
dbo.UFN_CURRENCY_CONVERT(TEAM.ORGANIZATIONGOAL, dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTINCLUDEEXPIRED(dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(), @SELECTEDCURRENCYID, (select [INNERAPPEAL].DATEADDED from dbo.APPEAL [INNERAPPEAL] where [INNERAPPEAL].ID = TEAM.APPEALID), 1, null))
else
TEAM.ORGANIZATIONGOAL
end GOAL,
TEAM.APPEALID,
1
from dbo.TEAMFUNDRAISINGTEAM TEAM
inner join dbo.TEAMFUNDRAISINGTEAM TEAMFILTER on TEAM.TEAMFUNDRAISINGTEAMGROUPID=TEAMFILTER.TEAMFUNDRAISINGTEAMGROUPID
or (TEAMFILTER.TEAMFUNDRAISINGTEAMGROUPID is null and TEAM.ID=TEAMFILTER.ID)
where TEAMFILTER.ID=@TEAMID
end
else
begin
insert into @INCLUDEDTEAM
(
ID,
PARENTTEAMID,
TEAMFUNDRAISINGTEAMGROUPID,
GOAL,
APPEALID,
SHOWINREPORT
)
select
TEAM.ID,
TEAM.PARENTTEAMID,
TEAM.TEAMFUNDRAISINGTEAMGROUPID,
case
when @SELECTEDCURRENCYID = TEAM.BASECURRENCYID then
TEAM.GOAL
when (@CURRENCYCODE = 3) and (@SELECTEDCURRENCYID <> dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()) then
dbo.UFN_CURRENCY_CONVERT(TEAM.ORGANIZATIONGOAL, dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTINCLUDEEXPIRED(dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(), @SELECTEDCURRENCYID, (select [INNERAPPEAL].DATEADDED from dbo.APPEAL [INNERAPPEAL] where [INNERAPPEAL].ID = TEAM.APPEALID), 1, null))
else
TEAM.ORGANIZATIONGOAL
end GOAL,
TEAM.APPEALID,
1
from dbo.TEAMFUNDRAISINGTEAM TEAM
' + nchar(13);
if @TEAMQUERYID is not null
begin
set @SQLTOEXEC = @SQLTOEXEC +
'inner join dbo.TEAMFUNDRAISINGTEAM TEAMFILTER on TEAM.TEAMFUNDRAISINGTEAMGROUPID=TEAMFILTER.TEAMFUNDRAISINGTEAMGROUPID
or (TEAMFILTER.TEAMFUNDRAISINGTEAMGROUPID is null and TEAM.ID=TEAMFILTER.ID)
inner join dbo.' + @DBOBJECTNAME + ' as teamquerytable on teamquerytable.[ID] = TEAMFILTER.[ID]' + nchar(13);
end
set @SQLTOEXEC = @SQLTOEXEC + '
end;
'
--(NOTE: This comment is NOT in the @SQLTOEXEC string because that string became longer than nvarchar(max) :(
-- Retrieve all the data that will be need to do
-- the report calculations
-- The CTE collect subteams of included teams for the purposes of
-- rollup calculations, but if they are not already in the list, do not
-- show them on the report
+'
with CTE_TEAMHIERARCHY(ID,PARENTTEAMID,TEAMFUNDRAISINGTEAMGROUPID,GOAL,APPEALID,SHOWINREPORT)
as
(
select
*
from @INCLUDEDTEAM
union all
select
TEAMFUNDRAISINGTEAM.ID,
TEAMFUNDRAISINGTEAM.PARENTTEAMID,
TEAMFUNDRAISINGTEAM.TEAMFUNDRAISINGTEAMGROUPID,
case
when @SELECTEDCURRENCYID = TEAMFUNDRAISINGTEAM.BASECURRENCYID then
TEAMFUNDRAISINGTEAM.GOAL
when (@CURRENCYCODE = 3) and (@SELECTEDCURRENCYID <> dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()) then
dbo.UFN_CURRENCY_CONVERT(TEAMFUNDRAISINGTEAM.ORGANIZATIONGOAL, dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTINCLUDEEXPIRED(dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(), @SELECTEDCURRENCYID, (select [INNERAPPEAL].DATEADDED from dbo.APPEAL [INNERAPPEAL] where [INNERAPPEAL].ID = TEAMFUNDRAISINGTEAM.APPEALID), 1, null))
else
TEAMFUNDRAISINGTEAM.ORGANIZATIONGOAL
end TEAMGOAL,
TEAMFUNDRAISINGTEAM.APPEALID,
convert(bit,0)
from dbo.TEAMFUNDRAISINGTEAM
inner join CTE_TEAMHIERARCHY on TEAMFUNDRAISINGTEAM.PARENTTEAMID = CTE_TEAMHIERARCHY.ID
)
insert into #FUNDRAISERINFO
(
GROUPID,
TEAMID,
PARENTTEAMID,
TEAMGOAL,
EVENTID,
FUNDRAISERID,
REVENUEID,
AMOUNTSOLICITED,
ISINGROUP,
SHOWINREPORT
)'
set @SQLTOEXEC = @SQLTOEXEC + '
select
coalesce(INCLUDEDTEAM.TEAMFUNDRAISINGTEAMGROUPID,INCLUDEDTEAM.ID),
INCLUDEDTEAM.ID,
INCLUDEDTEAM.PARENTTEAMID,
INCLUDEDTEAM.GOAL,
EVENT.ID,
TEAMFUNDRAISER.ID,
REVENUE.ID,
case when REVENUE.ID is null then 0 else SUM(coalesce(dbo.UFN_REVENUESOLICITOR_GETAMOUNTINCURRENCY(REVENUESOLICITOR.ID, @SELECTEDCURRENCYID),0)) end,
case when INCLUDEDTEAM.TEAMFUNDRAISINGTEAMGROUPID is null then 0 else 1 end,
INCLUDEDTEAM.SHOWINREPORT
from (select distinct * from CTE_TEAMHIERARCHY) INCLUDEDTEAM
inner join dbo.APPEAL on INCLUDEDTEAM.APPEALID = APPEAL.ID
inner join dbo.EVENT on EVENT.APPEALID=APPEAL.ID
left join dbo.TEAMFUNDRAISINGTEAMMEMBER on TEAMFUNDRAISINGTEAMMEMBER.TEAMFUNDRAISINGTEAMID=INCLUDEDTEAM.ID
left join dbo.TEAMFUNDRAISER
on TEAMFUNDRAISER.ID = TEAMFUNDRAISINGTEAMMEMBER.TEAMFUNDRAISERID and TEAMFUNDRAISER.APPEALID = APPEAL.ID
left join dbo.REVENUESOLICITOR on REVENUESOLICITOR.CONSTITUENTID = TEAMFUNDRAISER.CONSTITUENTID
left join dbo.REVENUESPLIT on REVENUESPLIT.ID = REVENUESOLICITOR.REVENUESPLITID
left join dbo.REVENUE with (nolock) on REVENUE.APPEALID = APPEAL.ID and REVENUESPLIT.REVENUEID = REVENUE.ID
where
(APPEAL.STARTDATE >= @STARTDATE or @STARTDATE is null) --On or after start date
and (APPEAL.STARTDATE <= @ENDDATE or @ENDDATE is null) --On or before end date
and
(
(
(REVENUE.TRANSACTIONTYPECODE = 1
or (REVENUE.TRANSACTIONTYPECODE = 0 and REVENUESPLIT.APPLICATIONCODE in (0,3))
--adding event registration donation
or (REVENUE.TRANSACTIONTYPECODE = 0 and REVENUESPLIT.APPLICATIONCODE = 1 and REVENUESPLIT.TYPECODE = 0)
) --Revenue is a pledge, gift, and recurring gift payment
) --Fundraiser has raised money for the event/appeal in question
or REVENUESOLICITOR.ID is null --Fundraiser has not raised anything yet
or ((not REVENUESOLICITOR.ID is null) and REVENUE.ID is null) --Fundraiser has raised money, but it is not for the appeal/event in question
)
and (@CURRENTAPPUSERID is null or dbo.UFN_EVENT_USERHASSITEACCESS(@CURRENTAPPUSERID, EVENT.ID) = 1) --Check site security on event
group by INCLUDEDTEAM.ID, INCLUDEDTEAM.TEAMFUNDRAISINGTEAMGROUPID, INCLUDEDTEAM.PARENTTEAMID, INCLUDEDTEAM.GOAL,
EVENT.ID, TEAMFUNDRAISER.ID, REVENUESOLICITOR.ID, REVENUE.ID, INCLUDEDTEAM.SHOWINREPORT
' + nchar(13);
exec sp_executesql @SQLTOEXEC,
N'@TEAMQUERYID uniqueidentifier,@TEAMID uniqueidentifier, @GROUPSONLY bit, @STARTDATE datetime, @ENDDATE datetime, @CURRENTAPPUSERID uniqueidentifier, @CURRENCYCODE tinyint, @SELECTEDCURRENCYID uniqueidentifier',
@TEAMQUERYID=@TEAMQUERYID, @TEAMID=@TEAMID, @GROUPSONLY=@GROUPSONLY, @STARTDATE=@STARTDATE, @ENDDATE=@ENDDATE,@CURRENTAPPUSERID=@CURRENTAPPUSERID,@CURRENCYCODE=@CURRENCYCODE,@SELECTEDCURRENCYID=@SELECTEDCURRENCYID;
--Filter collected data for calculating team totals
declare @GROUPINFO table(
GROUPID uniqueidentifier,
LATESTTEAMID uniqueidentifier,
REVENUEID uniqueidentifier,
AMOUNTSOLICITED money
)
insert into @GROUPINFO
(
GROUPID,
LATESTTEAMID,
REVENUEID,
AMOUNTSOLICITED
)
select distinct
GROUPID,
dbo.UFN_TEAMFUNDRAISINGTEAMGROUP_GETLATESTTEAMONEVENT(GROUPID,@STARTDATE,@ENDDATE),
REVENUEID,
AMOUNTSOLICITED
from #FUNDRAISERINFO
----Filter collected data for calculating event totals
declare @EVENTTEAMINFO table(
GROUPID uniqueidentifier,
TEAMID uniqueidentifier,
PARENTTEAMID uniqueidentifier,
TEAMGOAL money,
ID uniqueidentifier,
TOTAL money,
NUMGIFTS int,
MAXGIFT money
)
insert into @EVENTTEAMINFO
(
GROUPID,
TEAMID,
PARENTTEAMID,
TEAMGOAL,
ID,
TOTAL,
NUMGIFTS,
MAXGIFT
)
select
GROUPID,
TEAMID,
PARENTTEAMID,
TEAMGOAL,
EVENTID ID,
sum(AMOUNTSOLICITED) TOTAL,
count(REVENUEID) NUMGIFTS,
max(AMOUNTSOLICITED) MAXGIFT
from
(
select distinct
GROUPID,
TEAMID,
PARENTTEAMID,
TEAMGOAL,
EVENTID,
REVENUEID,
AMOUNTSOLICITED
from #FUNDRAISERINFO
) EVENTINFO
group by GROUPID, TEAMID, TEAMGOAL, PARENTTEAMID, EVENTID;
-- Calculate totals and build dataset
with CTE_TEAMCHILDREN( TEAMID, ANCESTORTEAMID, ANCESTORGROUPID, TEAMREVENUE ) as
(
select
TEAMID,
TEAMID,
GROUPID,
TOTAL
from @EVENTTEAMINFO
where TEAMID in (
select PARENTTEAMID
from @EVENTTEAMINFO
)
union all
select
EVENTTEAMINFO.TEAMID,
CTE_TEAMCHILDREN.ANCESTORTEAMID,
CTE_TEAMCHILDREN.ANCESTORGROUPID,
EVENTTEAMINFO.TOTAL
from @EVENTTEAMINFO EVENTTEAMINFO
inner join CTE_TEAMCHILDREN on EVENTTEAMINFO.PARENTTEAMID=CTE_TEAMCHILDREN.TEAMID
)
select
dbo.UFN_IDSET_GETNAME(@TEAMQUERYID) QUERYNAME,
GROUPINFO.ID GROUPID,
dbo.UFN_TEAMFUNDRAISINGTEAM_BUILDFULLNAME(coalesce(GROUPINFO.LATESTTEAMID,EVENTTEAMINFO.TEAMID)) GROUPNAME,
coalesce(GROUPROLLUPTOTALS.ROLLUPTOTAL,GROUPINFO.TOTAL) GROUPROLLUPTOTAL,
GROUPINFO.TOTAL GROUPTOTAL,
coalesce(dbo.UFN_TEAMFUNDRAISINGTEAMGROUP_GETGROUPGOALFOREVENTSINCURRENCY(GROUPINFO.ID,@STARTDATE,@ENDDATE, @SELECTEDCURRENCYID),EVENTTEAMINFO.TEAMGOAL) GROUPGOAL,
GROUPINFO.NUMGIFTS GROUPNUMGIFTS,
GROUPINFO.MAXGIFT GROUPMAXGIFT,
'http://www.blackbaud.com?EVENTID=' + convert(nvarchar(36),EVENT.ID) as EVENTID,
case dbo.UFN_TEAMFUNDRAISINGTEAM_BUILDFULLNAME(coalesce(GROUPINFO.LATESTTEAMID,EVENTTEAMINFO.TEAMID))
when dbo.UFN_TEAMFUNDRAISINGTEAM_BUILDFULLNAME(EVENTTEAMINFO.TEAMID) then EVENT.NAME
else EVENT.NAME+' ('+dbo.UFN_TEAMFUNDRAISINGTEAM_BUILDFULLNAME(EVENTTEAMINFO.TEAMID)+')'
end EVENTNAME,
coalesce(TEAMROLLUPTOTALS.ROLLUPTOTAL,EVENTTEAMINFO.TOTAL) EVENTROLLUPTOTAL,
EVENTTEAMINFO.TOTAL EVENTTOTAL,
EVENTTEAMINFO.TEAMGOAL EVENTGOAL,
EVENTTEAMINFO.NUMGIFTS EVENTNUMGIFTS,
EVENTTEAMINFO.MAXGIFT EVENTMAXGIFT,
FUNDRAISERINFO.ID FUNDRAISERID,
NF.NAME FUNDRAISERNAME,
FUNDRAISERINFO.TOTAL FUNDRAISERTOTAL,
case
when @SELECTEDCURRENCYID = TEAMFUNDRAISER.BASECURRENCYID then
TEAMFUNDRAISER.GOAL
when (@CURRENCYCODE = 3) and (@SELECTEDCURRENCYID <> dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()) then
dbo.UFN_CURRENCY_CONVERT(TEAMFUNDRAISER.ORGANIZATIONGOAL, dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTINCLUDEEXPIRED(dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(), @SELECTEDCURRENCYID, (select [INNERAPPEAL].DATEADDED from dbo.APPEAL [INNERAPPEAL] where [INNERAPPEAL].ID = TEAMFUNDRAISER.APPEALID), 1, null))
else
TEAMFUNDRAISER.ORGANIZATIONGOAL
end FUNDRAISERGOAL,
FUNDRAISERINFO.NUMGIFTS FUNDRAISERNUMGIFTS,
FUNDRAISERINFO.MAXGIFT FUNDRAISERMAXGIFT,
CURRENCYPROPERTIES.ISO4217 [ISOCURRENCYCODE],
CURRENCYPROPERTIES.CURRENCYSYMBOL,
CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE [CURRENCYSYMBOLDISPLAYSETTINGCODE],
CURRENCYPROPERTIES.DECIMALDIGITS
from(
select
GROUPID,
EVENTID,
FUNDRAISERID ID,
sum(AMOUNTSOLICITED) TOTAL,
count(REVENUEID) NUMGIFTS,
max(AMOUNTSOLICITED) MAXGIFT
from #FUNDRAISERINFO
where
SHOWINREPORT = 1
and(
@GROUPSONLY = 0
or ISINGROUP = 1
)
group by GROUPID, EVENTID, FUNDRAISERID
) FUNDRAISERINFO
left join dbo.TEAMFUNDRAISER on TEAMFUNDRAISER.ID = FUNDRAISERINFO.ID
left join dbo.CONSTITUENT with (nolock) on CONSTITUENT.ID = TEAMFUNDRAISER.CONSTITUENTID
inner join @EVENTTEAMINFO EVENTTEAMINFO
on EVENTTEAMINFO.ID = FUNDRAISERINFO.EVENTID and EVENTTEAMINFO.GROUPID=FUNDRAISERINFO.GROUPID
inner join dbo.EVENT on EVENT.ID = EVENTTEAMINFO.ID
inner join(
select
GROUPID ID,
LATESTTEAMID,
sum(AMOUNTSOLICITED) TOTAL,
count(REVENUEID) NUMGIFTS,
max(AMOUNTSOLICITED) MAXGIFT
from @GROUPINFO
group by GROUPID, LATESTTEAMID
) GROUPINFO on GROUPINFO.ID = FUNDRAISERINFO.GROUPID
left join(
select
ANCESTORTEAMID TEAMID,
sum(TEAMREVENUE) ROLLUPTOTAL
from CTE_TEAMCHILDREN
group by ANCESTORTEAMID
) TEAMROLLUPTOTALS on TEAMROLLUPTOTALS.TEAMID=EVENTTEAMINFO.TEAMID
left join(
select
ANCESTORGROUPID GROUPID,
sum(TEAMREVENUE) ROLLUPTOTAL
from CTE_TEAMCHILDREN
group by ANCESTORGROUPID
) GROUPROLLUPTOTALS on GROUPROLLUPTOTALS.GROUPID=GROUPINFO.ID
outer apply dbo.UFN_CURRENCY_GETPROPERTIES(@SELECTEDCURRENCYID) CURRENCYPROPERTIES
outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) NF
order by dbo.UFN_TEAMFUNDRAISINGTEAM_BUILDFULLNAME(coalesce(GROUPINFO.LATESTTEAMID,EVENTTEAMINFO.TEAMID)),
EVENT.STARTDATE, CONSTITUENT.KEYNAME;
drop table #FUNDRAISERINFO;
end try
begin catch
exec dbo.USP_RAISE_ERROR;
drop table #FUNDRAISERINFO;
return 1;
end catch
return 0;