USP_CONSTITUENT_REVENUESUMMARYEXPANDED
Returns recognition summary values for a constituent (used in enterprise expanded views).
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@CONSTITUENTID | uniqueidentifier | IN | |
@ISGROUP | bit | IN | |
@HOUSEHOLDID | uniqueidentifier | IN | |
@REVENUEFILTERID | uniqueidentifier | IN | |
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN | |
@CURRENTAPPUSERID | uniqueidentifier | IN | |
@SITEFILTERMODE | tinyint | IN | |
@SITESSELECTED | xml | IN | |
@SECURITYFEATUREID | uniqueidentifier | IN | |
@SECURITYFEATURETYPE | tinyint | IN | |
@CURRENCYCODE | tinyint | IN | |
@TOTALNUMBER | int | INOUT | |
@TOTALAMOUNT | money | INOUT | |
@TOTALAMOUNT_HOUSEHOLD | money | INOUT | |
@TOTALYEARS | int | INOUT | |
@CONSECUTIVEYEARS | int | INOUT | |
@GIVENSINCEFISCALYEAR | datetime | INOUT | |
@TOTALREVENUEWITHGIFTAID | money | INOUT | |
@FIRSTID | uniqueidentifier | INOUT | |
@FIRSTRECORDID | uniqueidentifier | INOUT | |
@FIRSTDATE | datetime | INOUT | |
@FIRSTTYPECODE | tinyint | INOUT | |
@FIRSTTYPE | nvarchar(50) | INOUT | |
@FIRSTAMOUNT | money | INOUT | |
@LATESTID | uniqueidentifier | INOUT | |
@LATESTRECORDID | uniqueidentifier | INOUT | |
@LATESTDATE | datetime | INOUT | |
@LATESTTYPECODE | tinyint | INOUT | |
@LATESTTYPE | nvarchar(50) | INOUT | |
@LATESTAMOUNT | money | INOUT | |
@CURRENCYISOCURRENCYCODE | nvarchar(3) | INOUT | |
@CURRENCYDECIMALDIGITS | tinyint | INOUT | |
@CURRENCYSYMBOL | nvarchar(5) | INOUT | |
@CURRENCYSYMBOLDISPLAYSETTINGCODE | tinyint | INOUT | |
@ONLYGETSUMMARY | bit | IN | |
@BREAKDOWNBY | tinyint | IN | |
@CAMPAIGNFILTERMODE | tinyint | IN | |
@CAMPAIGNSSELECTED | xml | IN |
Definition
Copy
CREATE procedure [dbo].[USP_CONSTITUENT_REVENUESUMMARYEXPANDED](
@CONSTITUENTID uniqueidentifier,
@ISGROUP bit = 0,
@HOUSEHOLDID uniqueidentifier = null,
@REVENUEFILTERID uniqueidentifier = null,
@STARTDATE datetime = null,
@ENDDATE datetime = null,
@CURRENTAPPUSERID uniqueidentifier = null,
@SITEFILTERMODE tinyint = 0,
@SITESSELECTED xml = null,
@SECURITYFEATUREID uniqueidentifier = null,
@SECURITYFEATURETYPE tinyint = null,
@CURRENCYCODE tinyint = 1,
@TOTALNUMBER int = null output,
@TOTALAMOUNT money = null output,
@TOTALAMOUNT_HOUSEHOLD money = null output,
@TOTALYEARS int = null output,
@CONSECUTIVEYEARS int = null output,
@GIVENSINCEFISCALYEAR datetime = null output,
@TOTALREVENUEWITHGIFTAID money = null output,
@FIRSTID uniqueidentifier = null output,
@FIRSTRECORDID uniqueidentifier = null output,
@FIRSTDATE datetime = null output,
@FIRSTTYPECODE tinyint = null output,
@FIRSTTYPE nvarchar(50) = null output,
@FIRSTAMOUNT money = null output,
@LATESTID uniqueidentifier = null output,
@LATESTRECORDID uniqueidentifier = null output,
@LATESTDATE datetime = null output,
@LATESTTYPECODE tinyint = null output,
@LATESTTYPE nvarchar(50) = null output,
@LATESTAMOUNT money = null output,
@CURRENCYISOCURRENCYCODE nvarchar(3) = null output,
@CURRENCYDECIMALDIGITS tinyint = 0 output,
@CURRENCYSYMBOL nvarchar(5) = null output,
@CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint = 0 output,
@ONLYGETSUMMARY bit = 0,
@BREAKDOWNBY tinyint = 0,
@CAMPAIGNFILTERMODE tinyint = 0,
@CAMPAIGNSSELECTED xml = null
)
with execute as OWNER
as
begin
set nocount on
declare @CONSTITID uniqueidentifier;
declare @DATEFROM datetime;
declare @DATETO datetime;
declare @ISUK bit;
declare @INCLUDEMEMBERGIVING bit = 0;
if @ISGROUP = 1
select @INCLUDEMEMBERGIVING =
case
when GROUPDATA.GROUPTYPECODE = 0 or GROUPTYPE.INCLUDEMEMBERGIVING = 1 then 1
else 0
end
from dbo.GROUPDATA
left join dbo.GROUPTYPE on GROUPDATA.GROUPTYPEID = GROUPTYPE.ID
where GROUPDATA.ID = @CONSTITUENTID;
set @ISUK = dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D');
/* Get currency info */
declare @ORGANIZATIONCURRENCYID uniqueidentifier = null;
declare @CURRENCYID uniqueidentifier = null;
declare @CURRENCYROUNDINGTYPECODE tinyint;
set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
declare @ORIGINCODE tinyint
select @ORIGINCODE = ORGANIZATIONAMOUNTORIGINCODE
from dbo.MULTICURRENCYCONFIGURATION;
if @CURRENCYCODE = 1
set @CURRENCYID = @ORGANIZATIONCURRENCYID;
else
set @CURRENCYID = dbo.UFN_APPUSER_GETBASECURRENCY(@CURRENTAPPUSERID);
select
@CURRENCYISOCURRENCYCODE = CURRENCY.ISO4217,
@CURRENCYDECIMALDIGITS = CURRENCY.DECIMALDIGITS,
@CURRENCYROUNDINGTYPECODE = CURRENCY.ROUNDINGTYPECODE,
@CURRENCYSYMBOL = CURRENCY.CURRENCYSYMBOL,
@CURRENCYSYMBOLDISPLAYSETTINGCODE = CURRENCY.SYMBOLDISPLAYSETTINGCODE
from dbo.CURRENCY where ID = @CURRENCYID;
declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();
/* Get Recognition IDs */
if object_id('tempdb..#TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS') is not null
drop table #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS;
create table #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS
(
ID uniqueidentifier,
CONSTITUENTID uniqueidentifier,
REVENUEID uniqueidentifier,
[DATE] datetime,
TRANSACTIONAMOUNT money,
TRANSACTIONTYPECODE tinyint,
TRANSACTIONTYPE nvarchar(50) collate database_default,
REVENUEDATEADDED datetime,
REVENUEBASECURRENCYID uniqueidentifier,
REVENUETRANSACTIONCURRENCYID uniqueidentifier,
REVENUESPLITTYPE nvarchar(50) collate database_default
);
create index IDX on #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS(ID,DATE,REVENUEBASECURRENCYID,REVENUEID,REVENUETRANSACTIONCURRENCYID,TRANSACTIONTYPECODE)
/* Performance: Replaced dynamic SQL with a SQL table variable *
* and added branching logic to filter the records based *
* @CAMPAIGNFILTERMODE or @INCLUDEMEMBERGIVING */
declare @CAMPAIGNFILTERTABLE table (ID uniqueidentifier)
if @CAMPAIGNFILTERMODE != 0
begin
insert into @CAMPAIGNFILTERTABLE
select T.c.value('(ID)[1]','uniqueidentifier')
from @CAMPAIGNSSELECTED.nodes('/CAMPAIGNSSELECTED/ITEM') T(c);
end
-- Using dynamic SQL so the proper plan can be generated for the revenue filter. When the revenue filter was passed in as a parameter,
-- the plan was created to account for all available revenue filters. Putting the value in the query allows the optimizer to create a
-- plan with only the correct revenue filter. Not using "option (recompile)" so the plan for the same filter can be re-used.
declare @FILTEREDREVENUESQL as nvarchar(max) = '
declare @CONSTITS table (CONSTITUENTID uniqueidentifier, STARTDATE datetime, ENDDATE datetime);
insert into @CONSTITS
values(@CONSTITUENTID, @STARTDATE, @ENDDATE);
if @INCLUDEMEMBERGIVING = 1
begin
insert into @CONSTITS
select
GROUPMEMBER.MEMBERID as CONSTITUENTID,
case
when GROUPMEMBERDATERANGE.DATEFROM is null or GROUPMEMBERDATERANGE.DATEFROM < @STARTDATE then
@STARTDATE
else
GROUPMEMBERDATERANGE.DATEFROM
end STARTDATE,
case
when GROUPMEMBERDATERANGE.DATETO is null or GROUPMEMBERDATERANGE.DATETO > @ENDDATE then
@ENDDATE
else
GROUPMEMBERDATERANGE.DATETO
end ENDDATE
from dbo.GROUPMEMBER
left join dbo.GROUPMEMBERDATERANGE on GROUPMEMBERDATERANGE.GROUPMEMBERID = GROUPMEMBER.ID
where GROUPMEMBER.GROUPID = @CONSTITUENTID
end
if object_id(''tempdb..#TMP_DATA_REVENUESUMMARY_CONSTITUENTREVENUE'') is not null
drop table #TMP_DATA_REVENUESUMMARY_CONSTITUENTREVENUE;
create table #TMP_DATA_REVENUESUMMARY_CONSTITUENTREVENUE (
ID uniqueidentifier primary key,
CONSTITUENTID uniqueidentifier,
DATE datetime,
TYPECODE tinyint,
TYPE nvarchar(50),
DATEADDED datetime,
TRANSACTIONCURRENCYID uniqueidentifier,
PDACCOUNTSYSTEMID uniqueidentifier,
DELETEDON datetime
)
insert into #TMP_DATA_REVENUESUMMARY_CONSTITUENTREVENUE(
ID,
CONSTITUENTID,
DATE,
TYPECODE,
TYPE,
DATEADDED,
TRANSACTIONCURRENCYID,
PDACCOUNTSYSTEMID,
DELETEDON
)
select
REVENUE.ID,
REVENUE.CONSTITUENTID,
REVENUE.CALCULATEDDATE [DATE],
REVENUE.TYPECODE,
REVENUE.TYPE,
REVENUE.DATEADDED,
REVENUE.TRANSACTIONCURRENCYID,
REVENUE.PDACCOUNTSYSTEMID,
REVENUE.DELETEDON
from @CONSTITS as CONSTITS
inner join FINANCIALTRANSACTION as REVENUE on CONSTITS.CONSTITUENTID = REVENUE.CONSTITUENTID
inner join dbo.REVENUE_EXT on REVENUE.ID = REVENUE_EXT.ID
where
(REVENUE.CALCULATEDDATE >= isnull(CONSTITS.STARTDATE, REVENUE.CALCULATEDDATE)) and
(REVENUE.CALCULATEDDATE <= isnull(CONSTITS.ENDDATE, REVENUE.CALCULATEDDATE)) and
REVENUE.DELETEDON is null and
REVENUE.TYPECODE in (0,1,3,4,5,6,7,8,9,15)
-- NOTE: The columns selected need to match the columns on #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS since
-- when executing the select, it is inserted into #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS
select
REVENUESPLIT.ID
,REVENUE.CONSTITUENTID
,REVENUESPLIT.FINANCIALTRANSACTIONID
,REVENUE.DATE
,REVENUESPLIT.TRANSACTIONAMOUNT
,REVENUE.TYPECODE
,REVENUE.TYPE
,REVENUE.DATEADDED '
if dbo.UFN_CONDITIONSETTING_EVALUATEEXISTSCONDITION(N'Multicurrency') = 1
set @FILTEREDREVENUESQL += ',CS.BASECURRENCYID '
else
set @FILTEREDREVENUESQL += ',REVENUE.TRANSACTIONCURRENCYID '
set @FILTEREDREVENUESQL += ',REVENUE.TRANSACTIONCURRENCYID
,REVENUESPLIT_EXT.TYPE
from #TMP_DATA_REVENUESUMMARY_CONSTITUENTREVENUE as REVENUE
inner join dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT
on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
inner join dbo.REVENUESPLIT_EXT
on REVENUESPLIT_EXT.ID = REVENUESPLIT.ID '
if @REVENUEFILTERID is not null
begin
set @FILTEREDREVENUESQL = @FILTEREDREVENUESQL + '
-- Specifying an additional join clause when @REVENUEFILTERID is in use
inner join dbo.UFN_REVENUEFILTER_BYID(''' + cast(@REVENUEFILTERID as nvarchar(36)) + ''') FILTERED
on REVENUESPLIT.ID = FILTERED.ID'
end
if dbo.UFN_CONDITIONSETTING_EVALUATEEXISTSCONDITION(N'Multicurrency') = 1
set @FILTEREDREVENUESQL = @FILTEREDREVENUESQL + '
left join dbo.PDACCOUNTSYSTEM as PDA
on REVENUE.PDACCOUNTSYSTEMID = PDA.ID
left join dbo.CURRENCYSET as CS
on CS.ID = PDA.CURRENCYSETID '
set @FILTEREDREVENUESQL = @FILTEREDREVENUESQL + '
where
-- Exclude order payment splits and use the order splits
REVENUESPLIT_EXT.APPLICATIONCODE <> 10 and
REVENUESPLIT.DELETEDON is null;
drop table #TMP_DATA_REVENUESUMMARY_CONSTITUENTREVENUE;'
insert into #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS(
ID
,CONSTITUENTID
,REVENUEID
,DATE
,TRANSACTIONAMOUNT
,TRANSACTIONTYPECODE
,TRANSACTIONTYPE
,REVENUEDATEADDED
,REVENUEBASECURRENCYID
,REVENUETRANSACTIONCURRENCYID
,REVENUESPLITTYPE
)
exec sp_executesql @FILTEREDREVENUESQL, N'@CONSTITUENTID uniqueidentifier, @STARTDATE datetime, @ENDDATE datetime, @INCLUDEMEMBERGIVING bit',
@CONSTITUENTID, @STARTDATE, @ENDDATE, @INCLUDEMEMBERGIVING;
if @CAMPAIGNFILTERMODE != 0
begin
delete T from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS as T
where
not exists (
select
1
from
dbo.REVENUESPLITCAMPAIGN
inner join @CAMPAIGNFILTERTABLE CAMPAIGNFILTER on REVENUESPLITCAMPAIGN.CAMPAIGNID = CAMPAIGNFILTER.ID
where
T.ID = REVENUESPLITCAMPAIGN.REVENUESPLITID
)
end
/*remove based on site filter*/
if (dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) <> 1 or @SITEFILTERMODE != 0) and exists(select top 1 1 from dbo.SITE)
begin
delete FILTERED
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS FILTERED
where
not exists
(
select top 1 REVSITES.SITEID
from dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(FILTERED.ID) REVSITES
where
-- Using a case statement since the standard site extension filters
-- resulted in a poor plan
case
when exists (select 1 from dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,@SECURITYFEATUREID,@SECURITYFEATURETYPE) where SITEID=[REVSITES].[SITEID] or (SITEID is null and [REVSITES].[SITEID] is null)) then 1
else 0
end = 1
and
(
@SITEFILTERMODE = 0
or
exists(select UFN_SITE_BUILDDATALISTSITEFILTER.SITEID from dbo.UFN_SITE_BUILDDATALISTSITEFILTER(@CURRENTAPPUSERID, @SITEFILTERMODE, @SITESSELECTED) where UFN_SITE_BUILDDATALISTSITEFILTER.SITEID = REVSITES.SITEID)
)
)
end
/* Get Constituent totals */
--Do not check for the existence of refunds unless basic programs is installed
if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('BB1C17BC-9E0B-4683-B490-EE40D511FA05') = 1
with REV_CTE as
(
select
FILTERED.REVENUEID ID,
case when FILTERED.TRANSACTIONTYPECODE in (
1, --Pledge
3, --Matching gift claim
4, --Planned gift
6, --Grant award
8, --Donor challenge claim
9, --Pending gift
15 --Membership Installment Plan
)
then
(select REVENUESPLITBALANCE.BALANCE
from dbo.UFN_PLEDGE_GETREVALUEDSPLITBALANCESINCURRENCY(
FILTERED.REVENUEID,
@CURRENCYID,
@ORGANIZATIONCURRENCYID,
@CURRENCYDECIMALDIGITS,
@CURRENCYROUNDINGTYPECODE,
@CURRENTDATE,
@ORIGINCODE,
@CURRENCYCODE
) as REVENUESPLITBALANCE
where REVENUESPLITBALANCE.ID = FILTERED.ID)
else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(FILTERED.ID, @CURRENCYID) - coalesce(CREDITSPLIT.CREDITTOTAL, 0)
end AMOUNT,
case when @BREAKDOWNBY = 0 then
dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(FILTERED.DATE,0)
else dbo.UFN_GLFISCALYEAR_GETYEARFROMDATE(FILTERED.DATE) end YEAR,
case when @ISUK = 0 then null
else
case FILTERED.TRANSACTIONTYPECODE
when 1 then case @CURRENCYCODE
when 0 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUEBASECURRENCYID)
when 2 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUETRANSACTIONCURRENCYID)
else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, @CURRENCYID) end
when 15 then case @CURRENCYCODE
when 0 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUEBASECURRENCYID)
when 2 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUETRANSACTIONCURRENCYID)
else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, @CURRENCYID) end
when 4 then 0
else
case @CURRENCYCODE
when 0 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(FILTERED.ID, 1,FILTERED.REVENUEBASECURRENCYID)
when 2 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(FILTERED.ID, 1,FILTERED.REVENUETRANSACTIONCURRENCYID)
else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(FILTERED.ID, 1,@CURRENCYID)
end
end
end REVENUEWITHGIFTAID,
FILTERED.TRANSACTIONTYPECODE
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS FILTERED
left outer join dbo.UFN_CREDIT_GETSPLITCREDITAMOUNT_BULK() as CREDITSPLIT
on CREDITSPLIT.SOURCELINEITEMID = FILTERED.ID
)
select
@TOTALNUMBER = count(distinct ID),
@TOTALAMOUNT = sum(AMOUNT),
@TOTALYEARS = count(distinct(YEAR)),
@TOTALREVENUEWITHGIFTAID = sum(case when TRANSACTIONTYPECODE = 9 then 0 else REVENUEWITHGIFTAID end)
from REV_CTE
else
begin
--Do not compensate for multicurrency if it is not installed
if dbo.UFN_CONDITIONSETTING_EVALUATEEXISTSCONDITION(N'Multicurrency') = 0
with REV_CTE as
(
select
FILTERED.REVENUEID ID,
case when FILTERED.TRANSACTIONTYPECODE in (
1, --Pledge
3, --Matching gift claim
4, --Planned gift
6, --Grant award
8, --Donor challenge claim
9, --Pending gift
15 --Membership Installment Plan
)
then dbo.UFN_PLEDGE_GETSPLITBALANCE(FILTERED.REVENUEID, FILTERED.ID)
else FILTERED.TRANSACTIONAMOUNT
end AMOUNT,
case when @BREAKDOWNBY = 0 then
dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(FILTERED.DATE,0)
else dbo.UFN_GLFISCALYEAR_GETYEARFROMDATE(FILTERED.DATE) end YEAR,
case when @ISUK = 0 then null
else
case FILTERED.TRANSACTIONTYPECODE
when 1 then case @CURRENCYCODE
when 0 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUEBASECURRENCYID)
when 2 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUETRANSACTIONCURRENCYID)
else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, @CURRENCYID) end
when 15 then case @CURRENCYCODE
when 0 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUEBASECURRENCYID)
when 2 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUETRANSACTIONCURRENCYID)
else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, @CURRENCYID) end
when 4 then 0
else
case @CURRENCYCODE
when 0 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(FILTERED.ID, 1,FILTERED.REVENUEBASECURRENCYID)
when 2 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(FILTERED.ID, 1,FILTERED.REVENUETRANSACTIONCURRENCYID)
else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(FILTERED.ID, 1,@CURRENCYID)
end
end
end REVENUEWITHGIFTAID,
FILTERED.TRANSACTIONTYPECODE
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS FILTERED
)
select
@TOTALNUMBER = count(distinct ID),
@TOTALAMOUNT = sum(AMOUNT),
@TOTALYEARS = count(distinct(YEAR)),
@TOTALREVENUEWITHGIFTAID = sum(case when TRANSACTIONTYPECODE = 9 then 0 else REVENUEWITHGIFTAID end)
from REV_CTE
else
with REV_CTE as
(
select
FILTERED.REVENUEID ID,
case when FILTERED.TRANSACTIONTYPECODE in (
1, --Pledge
3, --Matching gift claim
4, --Planned gift
6, --Grant award
8, --Donor challenge claim
9, --Pending gift
15 --Membership Installment Plan
)
then
(select REVENUESPLITBALANCE.BALANCE
from dbo.UFN_PLEDGE_GETREVALUEDSPLITBALANCESINCURRENCY(
FILTERED.REVENUEID,
@CURRENCYID,
@ORGANIZATIONCURRENCYID,
@CURRENCYDECIMALDIGITS,
@CURRENCYROUNDINGTYPECODE,
@CURRENTDATE,
@ORIGINCODE,
@CURRENCYCODE
) as REVENUESPLITBALANCE
where REVENUESPLITBALANCE.ID = FILTERED.ID)
else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(FILTERED.ID, @CURRENCYID)
end AMOUNT,
case when @BREAKDOWNBY = 0 then
dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(FILTERED.DATE,0)
else dbo.UFN_GLFISCALYEAR_GETYEARFROMDATE(FILTERED.DATE) end YEAR,
case when @ISUK = 0 then null
else
case FILTERED.TRANSACTIONTYPECODE
when 1 then case @CURRENCYCODE
when 0 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUEBASECURRENCYID)
when 2 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUETRANSACTIONCURRENCYID)
else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, @CURRENCYID) end
when 15 then case @CURRENCYCODE
when 0 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUEBASECURRENCYID)
when 2 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, FILTERED.REVENUETRANSACTIONCURRENCYID)
else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNTBALANCE(FILTERED.ID, @CURRENCYID) end
when 4 then 0
else
case @CURRENCYCODE
when 0 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(FILTERED.ID, 1,FILTERED.REVENUEBASECURRENCYID)
when 2 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(FILTERED.ID, 1,FILTERED.REVENUETRANSACTIONCURRENCYID)
else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(FILTERED.ID, 1,@CURRENCYID)
end
end
end REVENUEWITHGIFTAID,
FILTERED.TRANSACTIONTYPECODE
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS FILTERED
)
select
@TOTALNUMBER = count(distinct ID),
@TOTALAMOUNT = sum(AMOUNT),
@TOTALYEARS = count(distinct(YEAR)),
@TOTALREVENUEWITHGIFTAID = sum(case when TRANSACTIONTYPECODE = 9 then 0 else REVENUEWITHGIFTAID end)
from REV_CTE
end
set @TOTALNUMBER = coalesce(@TOTALNUMBER, 0);
set @TOTALAMOUNT = coalesce(@TOTALAMOUNT, 0);
set @TOTALREVENUEWITHGIFTAID = coalesce(@TOTALREVENUEWITHGIFTAID, 0);
if @ONLYGETSUMMARY <> 1
begin
declare @YEARSQL nvarchar(max);
declare @YEARSNIPPET nvarchar(100);
if @BREAKDOWNBY = 0
set @YEARSNIPPET = 'dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(R.DATE,0)';
else
set @YEARSNIPPET = 'dbo.UFN_GLFISCALYEAR_GETYEARFROMDATE(R.DATE)';
set @YEARSQL =
'select ' + @YEARSNIPPET + ' FISCALYEAR_FIRSTDAY
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS R
group by ' + @YEARSNIPPET + '
order by ' + @YEARSNIPPET + ' desc'
declare @THISYEAR datetime;
declare @LASTYEAR datetime;
set @THISYEAR = case when @BREAKDOWNBY = 0 then dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(@CURRENTDATE, 0) else dbo.UFN_GLFISCALYEAR_GETYEARFROMDATE(@CURRENTDATE) end;
set @LASTYEAR = case when @BREAKDOWNBY = 0 then dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(dateadd(year,-1,@CURRENTDATE),0) else dbo.UFN_GLFISCALYEAR_GETYEARFROMDATE(dateadd(year,-1,@CURRENTDATE)) end;
--CONSECUTIVE YEARS
exec dbo.USP_CONSTITUENT_GETCONSECUTIVEYEARSFROMGIVENSET
@YEARSQL,
@THISYEAR,
@LASTYEAR,
@CONSECUTIVEYEARS output,@GIVENSINCEFISCALYEAR output
if dbo.UFN_CONDITIONSETTING_EVALUATEEXISTSCONDITION(N'Multicurrency') = 1
begin
--FIRST GIFT
select top 1
@FIRSTID = min(convert(nvarchar(36),RS.ID)),
@FIRSTRECORDID = FILTERED.REVENUEID,
@FIRSTDATE = FILTERED.DATE,
@FIRSTTYPECODE = FILTERED.TRANSACTIONTYPECODE,
@FIRSTTYPE = FILTERED.TRANSACTIONTYPE,
@FIRSTAMOUNT = sum(RS.AMOUNTINCURRENCY)
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS FILTERED
left join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(
@CURRENCYID,
@ORGANIZATIONCURRENCYID,
@CURRENCYDECIMALDIGITS,
@CURRENCYROUNDINGTYPECODE) as RS on FILTERED.ID = RS.ID
group by
FILTERED.REVENUEID, FILTERED.DATE, FILTERED.TRANSACTIONTYPECODE, FILTERED.TRANSACTIONTYPE, FILTERED.REVENUEDATEADDED
order by
FILTERED.DATE asc, FILTERED.REVENUEDATEADDED asc;
--LATEST GIFT
select top 1
@LATESTID = min(convert(nvarchar(36),RS.ID)),
@LATESTRECORDID = FILTERED.REVENUEID,
@LATESTDATE = FILTERED.DATE,
@LATESTTYPECODE = FILTERED.TRANSACTIONTYPECODE,
@LATESTTYPE = FILTERED.TRANSACTIONTYPE,
@LATESTAMOUNT = sum(RS.AMOUNTINCURRENCY)
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS FILTERED
left join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(
@CURRENCYID,
@ORGANIZATIONCURRENCYID,
@CURRENCYDECIMALDIGITS,
@CURRENCYROUNDINGTYPECODE) as RS on FILTERED.ID = RS.ID
group by
FILTERED.REVENUEID, FILTERED.DATE, FILTERED.TRANSACTIONTYPECODE, FILTERED.TRANSACTIONTYPE, FILTERED.REVENUEDATEADDED
order by
FILTERED.DATE desc, FILTERED.REVENUEDATEADDED desc;
end
else
begin
--FIRST GIFT
select top 1
@FIRSTID = min(convert(nvarchar(36),FILTERED.ID)),
@FIRSTRECORDID = FILTERED.REVENUEID,
@FIRSTDATE = FILTERED.DATE,
@FIRSTTYPECODE = FILTERED.TRANSACTIONTYPECODE,
@FIRSTTYPE = FILTERED.TRANSACTIONTYPE,
@FIRSTAMOUNT = sum(FILTERED.TRANSACTIONAMOUNT)
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS FILTERED
group by
FILTERED.REVENUEID, FILTERED.DATE, FILTERED.TRANSACTIONTYPECODE, FILTERED.TRANSACTIONTYPE, FILTERED.REVENUEDATEADDED
order by
FILTERED.DATE asc, FILTERED.REVENUEDATEADDED asc;
--LATEST GIFT
select top 1
@LATESTID = min(convert(nvarchar(36),FILTERED.ID)),
@LATESTRECORDID = FILTERED.REVENUEID,
@LATESTDATE = FILTERED.DATE,
@LATESTTYPECODE = FILTERED.TRANSACTIONTYPECODE,
@LATESTTYPE = FILTERED.TRANSACTIONTYPE,
@LATESTAMOUNT = sum(FILTERED.TRANSACTIONAMOUNT)
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS FILTERED
group by
FILTERED.REVENUEID, FILTERED.DATE, FILTERED.TRANSACTIONTYPECODE, FILTERED.TRANSACTIONTYPE, FILTERED.REVENUEDATEADDED
order by
FILTERED.DATE desc, FILTERED.REVENUEDATEADDED desc;
end
end
/* Get Group\Household figures */
if @INCLUDEMEMBERGIVING = 1 or @HOUSEHOLDID is not null
begin
if object_id('tempdb..#TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS') is not null
drop table #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS;
create table #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS
(
ID uniqueidentifier,
REVENUEID uniqueidentifier,
TRANSACTIONTYPECODE tinyint,
[DATE] datetime,
TRANSACTIONAMOUNT money,
REVENUESPLITTYPE nvarchar(50) collate database_default
);
--Get the revenue to include
if @ISGROUP = 1
begin
--Insert members from previous get to keep from having to get them twice
insert into #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS(ID,REVENUEID,[DATE],TRANSACTIONAMOUNT,TRANSACTIONTYPECODE,REVENUESPLITTYPE)
select FILTERED.ID,FILTERED.REVENUEID,FILTERED.[DATE],FILTERED.TRANSACTIONAMOUNT,FILTERED.TRANSACTIONTYPECODE,FILTERED.REVENUESPLITTYPE
from #TMP_DATA_REVENUESUMMARY_CONSTITREVSPLITIDS FILTERED
where FILTERED.CONSTITUENTID <> @CONSTITUENTID;
end
else
begin
declare @SQL nvarchar(max) = '
declare @HOUSEHOLDANDMEMBERS table (CONSTITUENTID uniqueidentifier, STARTDATE datetime, ENDDATE datetime)
insert into @HOUSEHOLDANDMEMBERS (CONSTITUENTID, STARTDATE, ENDDATE)
select
@HOUSEHOLDID as CONSTITUENTID,
null as STARTDATE,
null as ENDDATE
union all
select
GROUPMEMBER.MEMBERID as CONSTITUENTID,
case when GROUPMEMBERDATERANGE.DATEFROM is null or GROUPMEMBERDATERANGE.DATEFROM < @STARTDATE then @STARTDATE else GROUPMEMBERDATERANGE.DATEFROM end STARTDATE,
case when GROUPMEMBERDATERANGE.DATETO is null or GROUPMEMBERDATERANGE.DATETO > @ENDDATE then @ENDDATE else GROUPMEMBERDATERANGE.DATETO end ENDDATE
from dbo.GROUPMEMBER
left join dbo.GROUPMEMBERDATERANGE on GROUPMEMBERDATERANGE.GROUPMEMBERID = GROUPMEMBER.ID
where
GROUPMEMBER.GROUPID = @HOUSEHOLDID
';
if @CAMPAIGNFILTERMODE != 0
begin
set @SQL = @SQL + '
declare @CAMPAIGNFILTERTABLE table (ID uniqueidentifier)
insert into @CAMPAIGNFILTERTABLE
select T.c.value(''(ID)[1]'',''uniqueidentifier'')
from @CAMPAIGNSSELECTED.nodes(''/CAMPAIGNSSELECTED/ITEM'') T(c);' + char(13);
end
select @SQL = @SQL + '
-- NOTE: The columns selected need to match the columns on #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS since
-- when executing the select, it is inserted into #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS
select REVENUESPLIT.ID,REVENUESPLIT.FINANCIALTRANSACTIONID,REVENUE.TYPECODE,cast(REVENUE.DATE as datetime),REVENUESPLIT.TRANSACTIONAMOUNT,REVENUESPLIT_EXT.TYPE
from dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID' + char(13);
if @REVENUEFILTERID is not null
set @SQL = @SQL + 'inner join dbo.UFN_REVENUEFILTER_BYID(''' + cast(@REVENUEFILTERID as nvarchar(36)) + ''') FILTERED on REVENUESPLIT.ID = FILTERED.ID ' + char(13);
set @SQL = @SQL +
'
inner join dbo.FINANCIALTRANSACTION as REVENUE on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
inner join @HOUSEHOLDANDMEMBERS CONSTITS on CONSTITS.CONSTITUENTID = REVENUE.CONSTITUENTID
where
REVENUE.TYPECODE in (0,1,3,4,5,6,7,8,9,15) and
-- Exclude order payment splits and use the order splits
REVENUESPLIT_EXT.APPLICATIONCODE <> 10 and
REVENUE.DELETEDON is null and
REVENUESPLIT.DELETEDON is null and
REVENUESPLIT.TYPECODE <> 1 and
(CONSTITS.STARTDATE is null or REVENUE.CALCULATEDDATE >= CONSTITS.STARTDATE) and
(CONSTITS.ENDDATE is null or REVENUE.CALCULATEDDATE <= CONSTITS.ENDDATE)';
if @CAMPAIGNFILTERMODE != 0
begin
set @SQL = @SQL +
'and exists (
select 1
from dbo.REVENUESPLITCAMPAIGN
inner join @CAMPAIGNFILTERTABLE CAMPAIGNFILTER on REVENUESPLITCAMPAIGN.CAMPAIGNID = CAMPAIGNFILTER.ID
where REVENUESPLITCAMPAIGN.REVENUESPLITID = REVENUESPLIT.ID
)' + char(13);
end
insert into #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS(ID,REVENUEID,TRANSACTIONTYPECODE,DATE,TRANSACTIONAMOUNT,REVENUESPLITTYPE)
exec sp_executesql @SQL, N'@HOUSEHOLDID uniqueidentifier, @STARTDATE datetime, @ENDDATE datetime, @CAMPAIGNSSELECTED xml',
@HOUSEHOLDID, @STARTDATE, @ENDDATE, @CAMPAIGNSSELECTED;
end
/*remove based on site filter*/
if dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) <> 1 and exists(select top 1 1 from dbo.SITE)
begin
delete FILTERED
from #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS FILTERED
where
not exists
(
select top 1 REVSITES.SITEID
from dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(FILTERED.ID) REVSITES
where
-- Using a case statement since the standard site extension filters
-- resulted in a poor plan
case
when dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1 then 1
when exists (select 1 from dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,@SECURITYFEATUREID,@SECURITYFEATURETYPE) where SITEID=[REVSITES].[SITEID] or (SITEID is null and [REVSITES].[SITEID] is null)) then 1
else 0
end = 1
and
(
@SITEFILTERMODE = 0
or
exists(select UFN_SITE_BUILDDATALISTSITEFILTER.SITEID from dbo.UFN_SITE_BUILDDATALISTSITEFILTER(@CURRENTAPPUSERID, @SITEFILTERMODE, @SITESSELECTED) where UFN_SITE_BUILDDATALISTSITEFILTER.SITEID = REVSITES.SITEID)
)
);
end
/* Get Constituent totals */
if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('BB1C17BC-9E0B-4683-B490-EE40D511FA05') = 1
with REV_CTE as
(
select
case
when FILTERED.TRANSACTIONTYPECODE in (
1, --Pledge
3, --Matching gift claim
4, --Planned gift
6, --Grant award
8, --Donor challenge claim
9, --Pending gift
15 --Membership Installment Plan
)
then
(select REVENUESPLITBALANCE.BALANCE
from dbo.UFN_PLEDGE_GETREVALUEDSPLITBALANCESINCURRENCY(
FILTERED.REVENUEID,
@CURRENCYID,
@ORGANIZATIONCURRENCYID,
@CURRENCYDECIMALDIGITS,
@CURRENCYROUNDINGTYPECODE,
@CURRENTDATE,
@ORIGINCODE,
@CURRENCYCODE
) as REVENUESPLITBALANCE
where REVENUESPLITBALANCE.ID = FILTERED.ID)
else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(FILTERED.ID, @CURRENCYID) - coalesce(CREDITSPLIT.CREDITTOTAL, 0)
end AMOUNT
from #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS FILTERED
left outer join dbo.UFN_CREDIT_GETSPLITCREDITAMOUNT_BULK() as CREDITSPLIT
on CREDITSPLIT.SOURCELINEITEMID = FILTERED.ID
)
select
@TOTALAMOUNT_HOUSEHOLD = sum(AMOUNT)
from REV_CTE;
else
begin
--Do not compensate for multicurrency if it is not installed
if dbo.UFN_CONDITIONSETTING_EVALUATEEXISTSCONDITION(N'Multicurrency') = 0
with REV_CTE as
(
select
case
when FILTERED.TRANSACTIONTYPECODE in (
1, --Pledge
3, --Matching gift claim
4, --Planned gift
6, --Grant award
8, --Donor challenge claim
9, --Pending gift
15 --Membership Installment Plan
)
then dbo.UFN_PLEDGE_GETSPLITBALANCE(FILTERED.REVENUEID, FILTERED.ID)
else FILTERED.TRANSACTIONAMOUNT
end AMOUNT
from #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS FILTERED
)
select
@TOTALAMOUNT_HOUSEHOLD = sum(AMOUNT)
from REV_CTE;
else
with REV_CTE as
(
select
case
when FILTERED.TRANSACTIONTYPECODE in (
1, --Pledge
3, --Matching gift claim
4, --Planned gift
6, --Grant award
8, --Donor challenge claim
9, --Pending gift
15 --Membership Installment Plan
)
then
(select REVENUESPLITBALANCE.BALANCE
from dbo.UFN_PLEDGE_GETREVALUEDSPLITBALANCESINCURRENCY(
FILTERED.REVENUEID,
@CURRENCYID,
@ORGANIZATIONCURRENCYID,
@CURRENCYDECIMALDIGITS,
@CURRENCYROUNDINGTYPECODE,
@CURRENTDATE,
@ORIGINCODE,
@CURRENCYCODE
) as REVENUESPLITBALANCE
where REVENUESPLITBALANCE.ID = FILTERED.ID)
else dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(FILTERED.ID, @CURRENCYID)
end AMOUNT
from #TMP_DATA_REVENUESUMMARY_HOUSEHOLDREVSPLITIDS FILTERED
)
select
@TOTALAMOUNT_HOUSEHOLD = sum(AMOUNT)
from REV_CTE;
end
end
end