USP_CONSTITUENTSMARTFIELD_REVENUESPLITAMOUNTS
Returns aggregate revenue values to be used in various constituent revenue application smart fields.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN | |
@CALCULATIONTYPE | tinyint | IN | |
@CALCULATEDREVENUE | tinyint | IN | |
@ASOF | datetime | IN | |
@DATETYPECODE | tinyint | IN | |
@STARTDATERECENTDATEUNITCODE | tinyint | IN | |
@STARTDATERECENTDATEINTERVAL | int | IN | |
@REVENUETYPECODES | xml | IN | |
@APPLICATIONTRANSACTIONTYPECODES | xml | IN | |
@REVENUEAPPLICATIONSELECTION | uniqueidentifier | IN | |
@RECOGNITIONTYPES | xml | IN | |
@CURRENCYID | uniqueidentifier | IN | |
@SMARTFIELDID | uniqueidentifier | IN | |
@SITES | xml | IN |
Definition
Copy
CREATE procedure dbo.USP_CONSTITUENTSMARTFIELD_REVENUESPLITAMOUNTS
(
@STARTDATE datetime = null,
@ENDDATE datetime = null,
@CALCULATIONTYPE tinyint,
@CALCULATEDREVENUE tinyint,
@ASOF datetime,
@DATETYPECODE tinyint = null,
@STARTDATERECENTDATEUNITCODE tinyint = null,
@STARTDATERECENTDATEINTERVAL int = null,
@REVENUETYPECODES xml = null,
@APPLICATIONTRANSACTIONTYPECODES xml = null,
@REVENUEAPPLICATIONSELECTION uniqueidentifier = null,
@RECOGNITIONTYPES xml = null,
@CURRENCYID uniqueidentifier = null,
@SMARTFIELDID uniqueidentifier = null,
@SITES xml = null
)
with execute as owner
as
/*
This smart field will return an aggregation of revenue application values for ALL constituents in the database
*/
declare @DECIMALDIGITS tinyint;
declare @ROUNDINGTYPECODE tinyint;
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.[UFN_CURRENCY_GETORGANIZATIONCURRENCY]();
if @CURRENCYID is null
set @CURRENCYID = @ORGANIZATIONCURRENCYID;
select
@DECIMALDIGITS = [CURRENCY].[DECIMALDIGITS],
@ROUNDINGTYPECODE = [CURRENCY].[ROUNDINGTYPECODE]
from dbo.[CURRENCY]
where [CURRENCY].[ID] = @CURRENCYID;
if object_id('tempdb..#TMP_REVENUERECORDS_REVENUESPLITAMOUNTS') is not null
drop table #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS
create table #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS
(
ID uniqueidentifier,
CONSTITUENTID uniqueidentifier,
AMOUNT money,
DATE datetime,
DATEADDED datetime
);
declare @REVENUETYPESFILTER table
(
REVENUECODE tinyint primary key
);
declare @APPLICATIONTRANSACTIONTYPECODESFILTER table
(
APPLICATIONCODE tinyint,
TRANSACTIONTYPECODE tinyint
);
declare @RECOGNITIONTYPECODESFILTER table (
RECOGNITIONTYPECODEID uniqueidentifier primary key
);
if object_id('tempdb..#TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS') is not null
drop table #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS
create table #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS
(
ID uniqueidentifier primary key
);
/*
Calculate start and end dates
*/
declare @CURRENTDATEEARLIESTTIME datetime;
set @CURRENTDATEEARLIESTTIME = dbo.UFN_DATE_GETEARLIESTTIME(getdate());
declare @COMPUTEDSTARTDATE datetime;
declare @COMPUTEDENDDATE datetime;
if @DATETYPECODE = 0
begin
set @COMPUTEDSTARTDATE = @STARTDATE;
set @COMPUTEDENDDATE = @ENDDATE;
end
else if @DATETYPECODE = 1
begin
set @COMPUTEDSTARTDATE =
case @STARTDATERECENTDATEUNITCODE
when 0 then dateadd(year, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
when 1 then dateadd(quarter, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
when 2 then dateadd(month, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
when 3 then dateadd(week, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
when 4 then dateadd(day, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
end;
set @COMPUTEDENDDATE = null;
end
set @COMPUTEDSTARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@COMPUTEDSTARTDATE);
set @COMPUTEDENDDATE = dbo.UFN_DATE_GETLATESTTIME(@COMPUTEDENDDATE);
/* Load filter tables based on user selected conditions. */
if @REVENUETYPECODES is not null
begin
insert into @REVENUETYPESFILTER(REVENUECODE)
select distinct T.c.value('(REVENUETYPES)[1]','tinyint')
from @REVENUETYPECODES.nodes('/REVENUETYPECODES/ITEM') T(c);
if not exists (select 1 from @REVENUETYPESFILTER)
set @REVENUETYPECODES = null;
end
if @APPLICATIONTRANSACTIONTYPECODES is not null
begin
insert into @APPLICATIONTRANSACTIONTYPECODESFILTER(APPLICATIONCODE, TRANSACTIONTYPECODE)
select
T.c.value('(APPLICATION)[1]','tinyint') [APPLICATIONCODE],
T.c.value('(TRANSACTIONTYPE)[1]','tinyint') [TRANSACTIONTYPECODE]
from @APPLICATIONTRANSACTIONTYPECODES.nodes('/SELECTIONS/ITEM') T(c)
where T.c.value('(TRANSACTIONTYPE)[1]','tinyint') is not null;
if not exists (select 1 from @APPLICATIONTRANSACTIONTYPECODESFILTER)
set @APPLICATIONTRANSACTIONTYPECODES = null;
end
if @RECOGNITIONTYPES is not null
begin
insert into @RECOGNITIONTYPECODESFILTER(RECOGNITIONTYPECODEID)
select T.c.value('(ID)[1]','uniqueidentifier')
from @RECOGNITIONTYPES.nodes('/RECOGNITIONTYPECODES/ITEM') T(c);
--JamesWill 2010-01-20 Some smart fields seem to be using the above XML and others the XML here.
--The correct fix would be to update all the smart fields to use the same XML. But we ship next week
--and I am not at all confident that I wouldn't miss one. I'd rather do this and ship without the bug.
if not exists (select 1 from @RECOGNITIONTYPECODESFILTER)
insert into @RECOGNITIONTYPECODESFILTER(RECOGNITIONTYPECODEID)
select T.c.value('(RECOGNITIONTYPECODEID)[1]','uniqueidentifier')
from @RECOGNITIONTYPES.nodes('/RECOGNITIONTYPES/ITEM') T(c);
if not exists (select 1 from @RECOGNITIONTYPECODESFILTER)
set @RECOGNITIONTYPES = null;
end
declare @SITESFILTER table(ID uniqueidentifier primary key);
insert into
@SITESFILTER(ID)
select distinct
T.c.value('(SITEID)[1]','uniqueidentifier')
FROM
@SITES.nodes('/SITES/ITEM') T(c)
create table #CONSTITUENTSITEFILTER (ID uniqueidentifier primary key);
insert into
#CONSTITUENTSITEFILTER(ID)
select distinct
CONSTITUENTSITE.CONSTITUENTID
from
CONSTITUENTSITE
inner join
@SITESFILTER as SITES on SITES.ID = CONSTITUENTSITE.SITEID
/*
Find all valid constituents based on the date that the smart field was last updated.
If there is no @ASOF value then all constituents need to be processed.
If the date type is 'Recent dates' then all constituents need to be processed.
If the calculation type is 'Consecutive giving year' then all constituents need to be processed.
*/
/*
if the query used by this smart field has changed since this smartfield was last processed, then
we need to process as if the smart field had never been processed, so clear the @ASOF date
*/
if @ASOF is not null
and nullif(@REVENUEAPPLICATIONSELECTION,'00000000-0000-0000-0000-000000000000') is not null
and exists(select top 1 1
from dbo.SMARTFIELD
where ID=@SMARTFIELDID
and LASTRUNON < coalesce(
(
select top 1 DATECHANGED
from dbo.IDSETREGISTER
where ID=@REVENUEAPPLICATIONSELECTION
)
,LASTRUNON
)
)
set @ASOF=null;
declare @CONSTITUENTFILTERVIEW as nvarchar(50) = '#TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS'
if @ASOF is null or @CALCULATIONTYPE = 11 or (@DATETYPECODE = 1 and @STARTDATERECENTDATEINTERVAL is not null)
begin
if @SITES is null
begin
set @CONSTITUENTFILTERVIEW = 'dbo.CONSTITUENT'
end
else
begin
insert into
#TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS
select
ID
from
#CONSTITUENTSITEFILTER
end
end
else if @CALCULATEDREVENUE = 0 --REVENUE
begin
if @SITES is null
begin
insert into #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS(ID)
select CONSTITUENTID from dbo.FINANCIALTRANSACTION
where FINANCIALTRANSACTION.DATECHANGED > @ASOF and CONSTITUENTID is not null and FINANCIALTRANSACTION.DELETEDON is null
union
select REVENUEAUDIT.CONSTITUENTID
from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT
inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID
where REVENUEAUDIT.AUDITDATE > @ASOF and REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15)
union
select FINANCIALTRANSACTION.CONSTITUENTID
from dbo.FINANCIALTRANSACTION
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
where FINANCIALTRANSACTIONLINEITEM.DATECHANGED > @ASOF and FINANCIALTRANSACTION.CONSTITUENTID is not null
and FINANCIALTRANSACTION.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
union
select ID from dbo.CONSTITUENT where DATEADDED > @ASOF;
end
else
begin
insert into #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS(ID)
select CONSTITUENTID from dbo.FINANCIALTRANSACTION
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = FINANCIALTRANSACTION.CONSTITUENTID
where FINANCIALTRANSACTION.DATECHANGED > @ASOF and CONSTITUENTID is not null and FINANCIALTRANSACTION.DELETEDON is null
union
select CONSTITUENTSITE.CONSTITUENTID
from dbo.CONSTITUENTSITE as CONSTITUENTSITE
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENTSITE.CONSTITUENTID
where CONSTITUENTSITE.DATECHANGED > @ASOF and CONSTITUENTID is not null
union
select REVENUEAUDIT.CONSTITUENTID
from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT
inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUEAUDIT.CONSTITUENTID
where REVENUEAUDIT.AUDITDATE > @ASOF and REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15)
union
select FINANCIALTRANSACTION.CONSTITUENTID
from dbo.FINANCIALTRANSACTION
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = FINANCIALTRANSACTION.CONSTITUENTID
where FINANCIALTRANSACTIONLINEITEM.DATECHANGED > @ASOF and FINANCIALTRANSACTION.CONSTITUENTID is not null
and FINANCIALTRANSACTION.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
union
select CONSTITUENT.ID from dbo.CONSTITUENT
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENT.ID
where DATEADDED > @ASOF;
end
end
else if @CALCULATEDREVENUE = 1 --Revenue Recognition
begin
if @SITES is null
begin
insert into #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS(ID)
select CONSTITUENTID from dbo.REVENUERECOGNITION where REVENUERECOGNITION.DATECHANGED > @ASOF and CONSTITUENTID is not null
union
select CONSTITUENTID from dbo.REVENUERECOGNITIONAUDIT where REVENUERECOGNITIONAUDIT.AUDITDATE > @ASOF and CONSTITUENTID is not null
union
select CONSTITUENTID from dbo.FINANCIALTRANSACTION where FINANCIALTRANSACTION.DATECHANGED > @ASOF and CONSTITUENTID is not null and FINANCIALTRANSACTION.DELETEDON is null
union
select REVENUEAUDIT.CONSTITUENTID
from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT
inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID
where REVENUEAUDIT.AUDITDATE > @ASOF and REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15)
union
select FINANCIALTRANSACTION.CONSTITUENTID
from dbo.FINANCIALTRANSACTION
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
where FINANCIALTRANSACTIONLINEITEM.DATECHANGED > @ASOF and FINANCIALTRANSACTION.CONSTITUENTID is not null
and FINANCIALTRANSACTION.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
union
select REVENUERECOGNITION.CONSTITUENTID
from dbo.FINANCIALTRANSACTION
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
inner join dbo.REVENUERECOGNITION on FINANCIALTRANSACTIONLINEITEM.ID = REVENUERECOGNITION.REVENUESPLITID
where FINANCIALTRANSACTION.DATECHANGED > @ASOF and REVENUERECOGNITION.CONSTITUENTID is not null
and FINANCIALTRANSACTION.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
union
select REVENUERECOGNITION.CONSTITUENTID
from dbo.FINANCIALTRANSACTION
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
inner join dbo.REVENUERECOGNITION on FINANCIALTRANSACTIONLINEITEM.ID = REVENUERECOGNITION.REVENUESPLITID
where FINANCIALTRANSACTIONLINEITEM.DATECHANGED > @ASOF and REVENUERECOGNITION.CONSTITUENTID is not null
and FINANCIALTRANSACTION.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
union
select ID from dbo.CONSTITUENT where DATEADDED > @ASOF;
end
else
begin
insert into #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS(ID)
select CONSTITUENTID from dbo.REVENUERECOGNITION
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUERECOGNITION.CONSTITUENTID
where REVENUERECOGNITION.DATECHANGED > @ASOF and CONSTITUENTID is not null
union
select CONSTITUENTID from dbo.REVENUERECOGNITIONAUDIT
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUERECOGNITIONAUDIT.CONSTITUENTID
where REVENUERECOGNITIONAUDIT.AUDITDATE > @ASOF and CONSTITUENTID is not null
union
select CONSTITUENTID from dbo.FINANCIALTRANSACTION
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = FINANCIALTRANSACTION.CONSTITUENTID
where FINANCIALTRANSACTION.DATECHANGED > @ASOF and CONSTITUENTID is not null
and FINANCIALTRANSACTION.DELETEDON is null
union
select CONSTITUENTSITE.CONSTITUENTID
from dbo.CONSTITUENTSITE as CONSTITUENTSITE
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENTSITE.CONSTITUENTID
where CONSTITUENTSITE.DATECHANGED > @ASOF and CONSTITUENTID is not null
union
select REVENUEAUDIT.CONSTITUENTID
from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT
inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUEAUDIT.CONSTITUENTID
where REVENUEAUDIT.AUDITDATE > @ASOF and REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15)
union
select FINANCIALTRANSACTION.CONSTITUENTID
from dbo.FINANCIALTRANSACTION
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = FINANCIALTRANSACTION.CONSTITUENTID
where FINANCIALTRANSACTIONLINEITEM.DATECHANGED > @ASOF and FINANCIALTRANSACTION.CONSTITUENTID is not null
and FINANCIALTRANSACTION.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
union
select REVENUERECOGNITION.CONSTITUENTID
from dbo.FINANCIALTRANSACTION
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
inner join dbo.REVENUERECOGNITION on FINANCIALTRANSACTIONLINEITEM.ID = REVENUERECOGNITION.REVENUESPLITID
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = FINANCIALTRANSACTION.CONSTITUENTID
where FINANCIALTRANSACTION.DATECHANGED > @ASOF and REVENUERECOGNITION.CONSTITUENTID is not null
and FINANCIALTRANSACTION.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
union
select REVENUERECOGNITION.CONSTITUENTID
from dbo.FINANCIALTRANSACTION
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
inner join dbo.REVENUERECOGNITION on FINANCIALTRANSACTIONLINEITEM.ID = REVENUERECOGNITION.REVENUESPLITID
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = FINANCIALTRANSACTION.CONSTITUENTID
where FINANCIALTRANSACTIONLINEITEM.DATECHANGED > @ASOF and REVENUERECOGNITION.CONSTITUENTID is not null
and FINANCIALTRANSACTION.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
union
select CONSTITUENT.ID from dbo.CONSTITUENT
inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENT.ID
where DATEADDED > @ASOF;
end
end
drop table #CONSTITUENTSITEFILTER;
/*
Retrieve revenue application data based on filter criteria. Only revenue data for constituents modified since the @ASOF value will be returned by this SP.
*/
declare @revenuesql nvarchar(max) = ''
declare @wheresql nvarchar(max) = ''
declare @tempsql nvarchar(max) = ''
set @revenuesql = 'declare @REVENUETYPESFILTER table
(
REVENUECODE tinyint primary key
);
declare @APPLICATIONTRANSACTIONTYPECODESFILTER table
(
APPLICATIONCODE tinyint,
TRANSACTIONTYPECODE tinyint
);
declare @RECOGNITIONTYPECODESFILTER table (
RECOGNITIONTYPECODEID uniqueidentifier primary key
);
declare @REVENUETYPECODES xml = ' + coalesce('''' + cast(@REVENUETYPECODES as nvarchar(max)) + '''', 'null') + '
if @REVENUETYPECODES is not null
begin
insert into @REVENUETYPESFILTER(REVENUECODE)
select distinct T.c.value(''(REVENUETYPES)[1]'',''tinyint'')
from @REVENUETYPECODES.nodes(''/REVENUETYPECODES/ITEM'') T(c);
if not exists (select 1 from @REVENUETYPESFILTER)
set @REVENUETYPECODES = null;
end
declare @APPLICATIONTRANSACTIONTYPECODES xml = ' + coalesce('''' + cast(@APPLICATIONTRANSACTIONTYPECODES as nvarchar(max)) + '''', 'null') + '
if @APPLICATIONTRANSACTIONTYPECODES is not null
begin
insert into @APPLICATIONTRANSACTIONTYPECODESFILTER(APPLICATIONCODE, TRANSACTIONTYPECODE)
select
T.c.value(''(APPLICATION)[1]'',''tinyint''),
T.c.value(''(TRANSACTIONTYPE)[1]'',''tinyint'')
from @APPLICATIONTRANSACTIONTYPECODES.nodes(''/SELECTIONS/ITEM'') T(c)
where T.c.value(''(TRANSACTIONTYPE)[1]'',''tinyint'') is not null;
if not exists (select 1 from @APPLICATIONTRANSACTIONTYPECODESFILTER)
set @APPLICATIONTRANSACTIONTYPECODES = null;
end
declare @RECOGNITIONTYPES xml = ' + coalesce('''' + cast(@RECOGNITIONTYPES as nvarchar(max)) + '''', 'null') + '
if @RECOGNITIONTYPES is not null
begin
insert into @RECOGNITIONTYPECODESFILTER(RECOGNITIONTYPECODEID)
select T.c.value(''(RECOGNITIONTYPECODEID)[1]'',''uniqueidentifier'')
from @RECOGNITIONTYPES.nodes(''/RECOGNITIONTYPES/ITEM'') T(c);
if not exists (select 1 from @RECOGNITIONTYPECODESFILTER)
set @RECOGNITIONTYPES = null;
end
declare @REVENUEAPPLICATIONSELECTION uniqueidentifier = ' + coalesce('''' + cast(@REVENUEAPPLICATIONSELECTION as nvarchar(36)) + '''', 'null') + ' '
declare @REVENUETABLEFUNCTIONALIAS nvarchar(100);
declare @REVENUETABLETYPECODENAME nvarchar(100);
declare @REVENUESPLITIDNAME nvarchar(100);
-- We need revenuesql's declared parameters except the SELECT clause
set @tempsql = @revenuesql + ';';
if @CALCULATEDREVENUE = 0 --REVENUE
begin
set @revenuesql = @revenuesql + 'select
[REVENUESPLITAMOUNTINCURRENCY].[ID],
[REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID],
case when [REVENUESPLITAMOUNTINCURRENCY].[TRANSACTIONTYPECODE] in(1,3) then
[REVENUESPLITAMOUNTINCURRENCY].[AMOUNTINCURRENCY] - coalesce((
select
sum([WRITEOFFSPLITAMOUNTINCURRENCY].[AMOUNTINCURRENCY]) as [AMOUNT]
from dbo.[UFN_WRITEOFFSPLIT_GETAMOUNTINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as [WRITEOFFSPLITAMOUNTINCURRENCY]
where [WRITEOFFSPLITAMOUNTINCURRENCY].[REVENUEID] = [REVENUESPLITAMOUNTINCURRENCY].[REVENUEID] and [WRITEOFFSPLITAMOUNTINCURRENCY].[DESIGNATIONID] = [REVENUESPLITAMOUNTINCURRENCY].[DESIGNATIONID]
) ,0)
else
[REVENUESPLITAMOUNTINCURRENCY].[AMOUNTINCURRENCY] end as [AMOUNT],
[REVENUESPLITAMOUNTINCURRENCY].[DATE],
[REVENUESPLITAMOUNTINCURRENCY].[REVENUEDATEADDED]
from dbo.[UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as [REVENUESPLITAMOUNTINCURRENCY]'
-- If the constituent filter is all constituents, then simply filtering out null is faster than joining
if @CONSTITUENTFILTERVIEW != 'dbo.CONSTITUENT'
begin
set @revenuesql = @revenuesql + ' inner join ' + @CONSTITUENTFILTERVIEW + ' as [CONSTITUENTFILTER] on [CONSTITUENTFILTER].[ID] = [REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID]'
end
else
begin
if LEN(@wheresql) > 0 set @wheresql = @wheresql + ' and '
set @wheresql = @wheresql + ' ([REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID] is not null)'
end
if @COMPUTEDSTARTDATE is not null
begin
if LEN(@wheresql) > 0 set @wheresql = @wheresql + ' and '
set @wheresql = @wheresql + ' ([REVENUESPLITAMOUNTINCURRENCY].[DATE] >= @COMPUTEDSTARTDATE)'
end
if @COMPUTEDENDDATE is not null
begin
if LEN(@wheresql) > 0 set @wheresql = @wheresql + ' and '
set @wheresql = @wheresql + ' ([REVENUESPLITAMOUNTINCURRENCY].[DATE] <= @COMPUTEDENDDATE)'
end
set @REVENUETABLEFUNCTIONALIAS = 'REVENUESPLITAMOUNTINCURRENCY';
set @REVENUETABLETYPECODENAME = 'TYPECODE';
set @REVENUESPLITIDNAME = 'ID';
end
else if @CALCULATEDREVENUE = 1 --Revenue Recognition
begin
set @revenuesql = @revenuesql + 'select
[REVENUERECOGNITIONAMOUNTINCURRENCY].[REVENUESPLITID],
[REVENUERECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID],
[REVENUERECOGNITIONAMOUNTINCURRENCY].[AMOUNTINCURRENCY],
[REVENUERECOGNITIONAMOUNTINCURRENCY].[EFFECTIVEDATE],
[REVENUERECOGNITIONAMOUNTINCURRENCY].[REVENUEDATEADDED],
[REVENUERECOGNITIONAMOUNTINCURRENCY].[REVENUERECOGNITIONTYPECODEID],
[REVENUERECOGNITIONAMOUNTINCURRENCY].[REVENUESPLITTYPECODE],
[REVENUERECOGNITIONAMOUNTINCURRENCY].[TRANSACTIONTYPECODE],
[REVENUERECOGNITIONAMOUNTINCURRENCY].[APPLICATIONCODE]
from dbo.[UFN_REVENUERECOGNITION_GETAMOUNTINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as [REVENUERECOGNITIONAMOUNTINCURRENCY]'
-- If the constituent filter is all constituents, then simply filtering out null is faster than joining
if @CONSTITUENTFILTERVIEW != 'dbo.CONSTITUENT'
begin
set @revenuesql = @revenuesql + ' inner join ' + @CONSTITUENTFILTERVIEW + ' as [CONSTITUENTFILTER] on [CONSTITUENTFILTER].[ID] = [REVENUERECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID]'
end
else
begin
if LEN(@wheresql) > 0 set @wheresql = @wheresql + ' and '
set @wheresql = @wheresql + ' ([REVENUERECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID] is not null)'
end
if @COMPUTEDSTARTDATE is not null
begin
if LEN(@wheresql) > 0 set @wheresql = @wheresql + ' and '
set @wheresql = @wheresql + ' ([REVENUERECOGNITIONAMOUNTINCURRENCY].[DATE] >= @COMPUTEDSTARTDATE)'
end
if @COMPUTEDENDDATE is not null
begin
if LEN(@wheresql) > 0 set @wheresql = @wheresql + ' and '
set @wheresql = @wheresql + ' ([REVENUERECOGNITIONAMOUNTINCURRENCY].[DATE] <= @COMPUTEDENDDATE)'
end
if @RECOGNITIONTYPES is not null
begin
if LEN(@wheresql) > 0 set @wheresql = @wheresql + ' and '
set @wheresql = @wheresql + ' [REVENUERECOGNITIONAMOUNTINCURRENCY].[REVENUERECOGNITIONTYPECODEID] in (select [FILTER].[RECOGNITIONTYPECODEID] from @RECOGNITIONTYPECODESFILTER as [FILTER]) '
end
set @REVENUETABLEFUNCTIONALIAS = 'REVENUERECOGNITIONAMOUNTINCURRENCY';
set @REVENUETABLETYPECODENAME = 'REVENUESPLITTYPECODE';
set @REVENUESPLITIDNAME = 'REVENUESPLITID';
end
if @REVENUETYPECODES is not null
begin
if LEN(@wheresql) > 0 set @wheresql = @wheresql + ' and '
set @wheresql = @wheresql + ' ([' + @REVENUETABLEFUNCTIONALIAS + '].[' + @REVENUETABLETYPECODENAME + '] in (select [SPLITTYPECODESFILTER].[REVENUECODE] from @REVENUETYPESFILTER as [SPLITTYPECODESFILTER])) '
end
if @APPLICATIONTRANSACTIONTYPECODES is not null
begin
if LEN(@wheresql) > 0 set @wheresql = @wheresql + ' and '
set @wheresql = @wheresql + ' exists (select 1 from @APPLICATIONTRANSACTIONTYPECODESFILTER as [FILTER]
where [FILTER].[TRANSACTIONTYPECODE] = [' + @REVENUETABLEFUNCTIONALIAS + '].[TRANSACTIONTYPECODE]
and [FILTER].[APPLICATIONCODE] = [' + @REVENUETABLEFUNCTIONALIAS + '].[APPLICATIONCODE])'
end
if @REVENUEAPPLICATIONSELECTION is not null or @REVENUEAPPLICATIONSELECTION <> '00000000-0000-0000-0000-000000000000'
begin
declare @ISSTATIC bit = 0
declare @DBOBJECTTYPE tinyint = 0
declare @DBOBJECTNAME nvarchar(128)
declare @ADHOCQUERYID uniqueidentifier
select @DBOBJECTNAME = IDSETREGISTER.DBOBJECTNAME, @DBOBJECTTYPE = IDSETREGISTER.OBJECTTYPE, @ISSTATIC = IDSETREGISTER.STATIC, @ADHOCQUERYID=IDSETREGISTERADHOCQUERY.ADHOCQUERYID from dbo.IDSETREGISTER
left join dbo.IDSETREGISTERADHOCQUERY on IDSETREGISTER.ID = IDSETREGISTERADHOCQUERY.IDSETREGISTERID
where IDSETREGISTER.ID = @REVENUEAPPLICATIONSELECTION
if @DBOBJECTTYPE > 0
begin
if @DBOBJECTTYPE = 1 and @ADHOCQUERYID is not null
begin
if @ISSTATIC = 1
select @DBOBJECTNAME = dbo.UFN_ADHOCQUERY_MAKEIDSETSTATICTABLENAME(@ADHOCQUERYID)
else
select @DBOBJECTNAME = dbo.UFN_ADHOCQUERY_MAKEIDSETFUNCTIONNAME(@ADHOCQUERYID) + '()'
end
else
set @DBOBJECTNAME = 'UFN_IDSETREADER_GETRESULTS_GUID(@REVENUEAPPLICATIONSELECTION)'
end
end
if LEN(@DBOBJECTNAME) > 0
set @revenuesql = @revenuesql + '
inner join dbo.' + @DBOBJECTNAME + ' as [REVENUESPLITFILTER] on [' + @REVENUETABLEFUNCTIONALIAS + '].[' + @REVENUESPLITIDNAME + '] = [REVENUESPLITFILTER].[ID]';
if LEN(@wheresql) > 0 set @wheresql = ' where ' + @wheresql
if @CALCULATEDREVENUE = 1 --Revenue Recognition
begin
set @revenuesql = @revenuesql + ' option (recompile)'
--New temp table to store all records without filters
if object_id('tempdb..#TMP_REVENUERECORDS_REVENUESPLITAMOUNTS_ALLDATA') is not null
drop table #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS_ALLDATA ;
create table #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS_ALLDATA
(
ID uniqueidentifier,
CONSTITUENTID uniqueidentifier,
AMOUNT money,
DATE datetime,
DATEADDED datetime,
REVENUERECOGNITIONTYPECODEID uniqueidentifier,
REVENUESPLITTYPECODE tinyint,
TRANSACTIONTYPECODE tinyint,
APPLICATIONCODE tinyint
);
--Records without filters applied
insert into #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS_ALLDATA(ID, CONSTITUENTID, AMOUNT, DATE, DATEADDED,REVENUERECOGNITIONTYPECODEID,REVENUESPLITTYPECODE,TRANSACTIONTYPECODE,APPLICATIONCODE)
exec sp_executesql @revenuesql, N'@CURRENCYID uniqueidentifier, @ORGANIZATIONCURRENCYID uniqueidentifier, @DECIMALDIGITS tinyint, @ROUNDINGTYPECODE tinyint, @COMPUTEDSTARTDATE datetime, @COMPUTEDENDDATE datetime',
@CURRENCYID = @CURRENCYID,
@ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID,
@DECIMALDIGITS = @DECIMALDIGITS,
@ROUNDINGTYPECODE = @ROUNDINGTYPECODE,
@COMPUTEDSTARTDATE = @COMPUTEDSTARTDATE,
@COMPUTEDENDDATE = @COMPUTEDENDDATE;
--Query to filter the records based on the @wheresql clause
set @tempsql = @tempsql + ' select ID, CONSTITUENTID, AMOUNT, DATE, DATEADDED
from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS_ALLDATA REVENUERECOGNITIONAMOUNTINCURRENCY ' + @wheresql + ';'
--Records after filters applied
insert into #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS(ID, CONSTITUENTID, AMOUNT, DATE, DATEADDED)
exec sp_executesql @tempsql,N'@CURRENCYID uniqueidentifier, @ORGANIZATIONCURRENCYID uniqueidentifier, @DECIMALDIGITS tinyint, @ROUNDINGTYPECODE tinyint, @COMPUTEDSTARTDATE datetime, @COMPUTEDENDDATE datetime',
@CURRENCYID = @CURRENCYID,
@ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID,
@DECIMALDIGITS = @DECIMALDIGITS,
@ROUNDINGTYPECODE = @ROUNDINGTYPECODE,
@COMPUTEDSTARTDATE = @COMPUTEDSTARTDATE,
@COMPUTEDENDDATE = @COMPUTEDENDDATE;
drop table #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS_ALLDATA;
end
else
begin
set @revenuesql = @revenuesql + @wheresql + ' option (recompile)'
insert into #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS(ID, CONSTITUENTID, AMOUNT, DATE, DATEADDED)
exec sp_executesql @revenuesql, N'@CURRENCYID uniqueidentifier, @ORGANIZATIONCURRENCYID uniqueidentifier, @DECIMALDIGITS tinyint, @ROUNDINGTYPECODE tinyint, @COMPUTEDSTARTDATE datetime, @COMPUTEDENDDATE datetime',
@CURRENCYID = @CURRENCYID,
@ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID,
@DECIMALDIGITS = @DECIMALDIGITS,
@ROUNDINGTYPECODE = @ROUNDINGTYPECODE,
@COMPUTEDSTARTDATE = @COMPUTEDSTARTDATE,
@COMPUTEDENDDATE = @COMPUTEDENDDATE;
end
create index IX_TMP_REVENUERECORDS_REVENUESPLITAMOUNTS_CONSTITUENTID_DATE_DATEADDED on #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS (CONSTITUENTID,DATE,DATEADDED)
create index IX_TMP_REVENUERECORDS_REVENUESPLITAMOUNTS_CONSTITUENTID_ID on #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS (CONSTITUENTID,ID) include(AMOUNT)
create index IX_TMP_REVENUERECORDS_REVENUESPLITAMOUNTS_ID on #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS (ID)
--Removing records based on site security
if @SITES is not null
begin
if @CALCULATEDREVENUE = 0
begin
delete from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS
where ID not in
(
select distinct
TMP.ID
from
#TMP_REVENUERECORDS_REVENUESPLITAMOUNTS TMP
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = TMP.ID
cross apply dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(TMP.ID) as SITES
inner join @SITESFILTER as SITESFILTER on SITESFILTER.ID = SITES.SITEID
where FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
)
end
if @CALCULATEDREVENUE = 1
begin
delete from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS
where ID not in
(
select distinct
TMP.ID
from
REVENUERECOGNITION
inner join #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS TMP on TMP.ID = REVENUERECOGNITION.REVENUESPLITID
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = TMP.ID
cross apply dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(TMP.ID) as SITES
inner join @SITESFILTER as SITESFILTER on SITESFILTER.ID = SITES.SITEID
where FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
)
end
end
/*
Calculate totals based on calculation type.
*/
-- Backwards compatibility
if @SMARTFIELDID is not null
set @revenuesql = 'with SF_CTE (ID, VALUE) as ('
else
set @revenuesql = ''
if @CALCULATIONTYPE = 0 --Max(amount)
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(max(REVENUERECORDS.AMOUNT),0)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join (select REVENUERECORDS.ID, REVENUERECORDS.CONSTITUENTID, sum(REVENUERECORDS.AMOUNT) AMOUNT from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS group by REVENUERECORDS.CONSTITUENTID, REVENUERECORDS.ID) REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 1 --Min(amount)
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(min(REVENUERECORDS.AMOUNT),0)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join (select REVENUERECORDS.ID, REVENUERECORDS.CONSTITUENTID, sum(REVENUERECORDS.AMOUNT) AMOUNT from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS group by REVENUERECORDS.CONSTITUENTID, REVENUERECORDS.ID) REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 2 --Sum(amount)
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(sum(REVENUERECORDS.AMOUNT),0)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 3 --Avg(amount)
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(avg(REVENUERECORDS.AMOUNT),0)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join (select REVENUERECORDS.ID, REVENUERECORDS.CONSTITUENTID, sum(REVENUERECORDS.AMOUNT) AMOUNT from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS group by REVENUERECORDS.CONSTITUENTID, REVENUERECORDS.ID) REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 4 --First revenue application amount
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(sum(REVENUERECORDS.AMOUNT), 0)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
where
((REVENUERECORDS.ID is null)
or (REVENUERECORDS.ID = (select top 1 ID from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as SUBR where SUBR.CONSTITUENTID = CONSTITUENTFILTER.id order by SUBR.DATE asc, SUBR.DATEADDED asc)))
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 5 --Latest revenue application amount
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(sum(REVENUERECORDS.AMOUNT), 0)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
where
((REVENUERECORDS.ID is null)
or (REVENUERECORDS.ID = (select top 1 ID from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as SUBR where SUBR.CONSTITUENTID = CONSTITUENTFILTER.id order by SUBR.DATE desc, SUBR.DATEADDED desc)))
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 6 --Min(date)
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
min(REVENUERECORDS.DATE)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 7 --Max(date)
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
max(REVENUERECORDS.DATE)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 8 --Giving years
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(datediff(year,min(REVENUERECORDS.DATE), max(REVENUERECORDS.DATE)), -1) + 1
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by CONSTITUENTFILTER.ID, REVENUERECORDS.CONSTITUENTID'
else if @CALCULATIONTYPE = 9 --Distinct giving years
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
count(distinct REVENUEDATES.YEAR)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join (select distinct REVENUERECORDS.CONSTITUENTID, datepart(year, REVENUERECORDS.DATE) as YEAR from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS) as REVENUEDATES on REVENUEDATES.CONSTITUENTID = CONSTITUENTFILTER.ID
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 10 --Count(revenue application)
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
count(REVENUERECORDS.ID)
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by CONSTITUENTFILTER.ID'
else if @CALCULATIONTYPE = 11 --Consecutive giving years
begin
declare @totalfiscalyears int;
select
@totalfiscalyears = count(1)
from
(
select GLFISCALYEARID from dbo.GLFISCALPERIOD
where STARTDATE between @COMPUTEDSTARTDATE and @COMPUTEDENDDATE
and ENDDATE between @COMPUTEDSTARTDATE and @COMPUTEDENDDATE
group by GLFISCALYEARID
)
GETFISCALYEARS;
set @revenuesql =
'with MAXREVENUEDATE([CONSITITUENTID], [DATE]) as
(
select [REVENUERECORDS].[CONSTITUENTID], max([REVENUERECORDS].[DATE])
from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS
group by [REVENUERECORDS].[CONSTITUENTID]
having max([REVENUERECORDS].[DATE]) > getdate()
),
[BANDING]([CONSTITUENTID], [BAND]) as
(
select
CONSTITUENTFILTER.ID,
-1
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
union all
select
REVENUERECORDS.CONSTITUENTID,
datediff(year, [REVENUERECORDS].[DATE], coalesce([MAXREVENUEDATE].[DATE], @COMPUTEDENDDATE, getdate()))
from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS
left join [MAXREVENUEDATE] on [MAXREVENUEDATE].[CONSITITUENTID] = [REVENUERECORDS].[CONSTITUENTID]
),
[GAPS]([CONSTITUENTID],[BAND]) as
(
select distinct
[B1].[CONSTITUENTID],
case when '+ cast(@totalfiscalyears as varchar) +'= '''' then [B1].[BAND] + 1
when '+ cast(@totalfiscalyears as varchar) +'<= [B1].[BAND] then [B1].[BAND]
else [B1].[BAND] + 1 end
from [BANDING] [B1]
where not exists (select 1 from [BANDING] [B2] where [B2].[CONSTITUENTID] = [B1].[CONSTITUENTID] and [B2].[BAND] = [B1].[BAND] + 1)
)'
if @SMARTFIELDID is not null
set @revenuesql = @revenuesql + ', SF_CTE (ID, VALUE) as ('
set @revenuesql = @revenuesql + char(10) +
'select
[CONSTITUENTID],
case when min([BAND]) <0 then 0 else min([BAND]) end
from [GAPS]
group by [CONSTITUENTID]'
end
else if @CALCULATIONTYPE = 12 --First date of largest application amount
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
REVENUERECORDS.DATE
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
outer apply (select top 1 DATE from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as SUBR where SUBR.CONSTITUENTID = CONSTITUENTFILTER.id order by SUBR.AMOUNT desc, SUBR.DATE) REVENUERECORDS'
else if @CALCULATIONTYPE = 13 --Is annual giver
set @revenuesql = @revenuesql + char(10) + '
select
CONSTITUENTFILTER.ID,
case
when (coalesce(datediff(year,min(REVENUERECORDS.DATE), max(REVENUERECORDS.DATE)), 0) = (REVENUEDATES.YEARS - 1)) and (REVENUEDATES.YEARS > 1)
then cast(1 as bit)
else
cast(0 as bit)
end
from ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join (select REVENUERECORDS.CONSTITUENTID, count(distinct datepart(year, REVENUERECORDS.DATE)) as YEARS from #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS group by REVENUERECORDS.CONSTITUENTID) as REVENUEDATES on REVENUEDATES.CONSTITUENTID = CONSTITUENTFILTER.ID
left outer join #TMP_REVENUERECORDS_REVENUESPLITAMOUNTS as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by CONSTITUENTFILTER.ID, REVENUEDATES.YEARS'
-- Backwards compatibility
if @SMARTFIELDID is null
begin
insert into #TMP_CONSTITUENTSMARTFIELD_HH_REVENUESPLITANDRECOGNITIONS
exec sp_executesql @revenuesql, N'@COMPUTEDENDDATE datetime', @COMPUTEDENDDATE = @COMPUTEDENDDATE;
end
else
begin
declare @TARGET nvarchar(100)
declare @TARGET_FIELD nvarchar(128)
select
@TARGET = TABLECATALOG.TABLENAME,
@TARGET_FIELD = SMARTFIELD.VALUECOLUMNNAME
from dbo.SMARTFIELD
left join dbo.TABLECATALOG on SMARTFIELD.TABLECATALOGID = TABLECATALOG.ID
where SMARTFIELD.ID = @SMARTFIELDID
set @revenuesql = @revenuesql + ')
merge dbo.' + @TARGET + ' as target
using SF_CTE as source
on target.ID = source.ID
when matched then
update set ' + @TARGET_FIELD + ' = source.VALUE
when not matched by target then
insert (ID, ' + @TARGET_FIELD + ')
values (source.ID, source.VALUE);';
exec sp_executesql @revenuesql, N'@COMPUTEDENDDATE datetime', @COMPUTEDENDDATE = @COMPUTEDENDDATE;
select @@ROWCOUNT;
end