USP_CONSTITUENT_RECOGNITIONSUMMARYGET
Returns recognition summary values for a constituent.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@CONSTITUENTID | uniqueidentifier | IN | |
@RECOGNITIONTOTALNUMBER | int | INOUT | |
@RECOGNITIONTOTALAMOUNT | money | INOUT | |
@RECOGNITIONAVERAGEAMOUNT | money | INOUT | |
@RECOGNITIONMOSTFREQUENTAMOUNT | money | INOUT | |
@RECOGNITIONTOTALYEARS | int | INOUT | |
@RECOGNITIONCONSECUTIVEYEARS | int | INOUT | |
@RECOGNITIONGIVENSINCEFISCALYEAR | datetime | INOUT | |
@CURRENTAPPUSERID | uniqueidentifier | IN | |
@SITEFILTERMODE | tinyint | IN | |
@SITESSELECTED | xml | IN | |
@SECURITYFEATUREID | uniqueidentifier | IN | |
@SECURITYFEATURETYPE | tinyint | IN | |
@TOTALRECOGNITIONWITHGIFTAID | money | INOUT | |
@CURRENCYID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_CONSTITUENT_RECOGNITIONSUMMARYGET
(
@CONSTITUENTID uniqueidentifier,
@RECOGNITIONTOTALNUMBER int = null output,
@RECOGNITIONTOTALAMOUNT money = null output,
@RECOGNITIONAVERAGEAMOUNT money = null output,
@RECOGNITIONMOSTFREQUENTAMOUNT money = null output,
@RECOGNITIONTOTALYEARS int = null output,
@RECOGNITIONCONSECUTIVEYEARS int = null output,
@RECOGNITIONGIVENSINCEFISCALYEAR datetime = null output,
@CURRENTAPPUSERID uniqueidentifier = null,
@SITEFILTERMODE tinyint = 0,
@SITESSELECTED xml = null,
@SECURITYFEATUREID uniqueidentifier = null,
@SECURITYFEATURETYPE tinyint = null,
@TOTALRECOGNITIONWITHGIFTAID money = null output,
@CURRENCYID uniqueidentifier = null
)
as
set nocount on
declare @CURRENTDATE datetime;
declare @CURRENTDATEEARLIESTTIME datetime;
declare @FIRSTDAYTHISFISCALYEAR datetime;
declare @FIRSTDAYPREVIOUSFISCALYEAR datetime;
declare @ISSYSADMIN bit;
declare @DECIMALDIGITS tinyint;
declare @ROUNDINGTYPECODE tinyint;
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
set @CURRENTDATE = getdate();
set @CURRENTDATEEARLIESTTIME = dbo.UFN_DATE_GETEARLIESTTIME(@CURRENTDATE);
set @FIRSTDAYTHISFISCALYEAR = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(@CURRENTDATE,0);
set @FIRSTDAYPREVIOUSFISCALYEAR = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(dateadd(year,-1,@CURRENTDATE),0);
set @ISSYSADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
if @CURRENCYID is null
set @CURRENCYID = @ORGANIZATIONCURRENCYID
select
@ROUNDINGTYPECODE = ROUNDINGTYPECODE,
@DECIMALDIGITS = DECIMALDIGITS
from
dbo.CURRENCY
where
CURRENCY.ID = @CURRENCYID
create table #RECOGNITIONS (
ID uniqueidentifier primary key,
REVENUESPLITID uniqueidentifier,
TRANSACTIONTYPECODE tinyint,
FIRSTDAYOFEFFECTIVEDATEYEAR datetime
);
insert into #RECOGNITIONS (ID, REVENUESPLITID, TRANSACTIONTYPECODE, FIRSTDAYOFEFFECTIVEDATEYEAR)
select
RR.ID,
RR.REVENUESPLITID,
RR.TRANSACTIONTYPECODE,
dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(RR.EFFECTIVEDATE,0) as FIRSTDAYOFEFFECTIVEDATEYEAR
from dbo.UFN_RECOGNITIONCREDIT_GETRECOGNITIONS_NOCONSTITNAME(@CURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, @ORGANIZATIONCURRENCYID) RR
where RR.CONSTITUENTID = @CONSTITUENTID;
with AIC_CTE (ID, CONSTITUENTID, AMOUNTINCURRENCY, EFFECTIVEDATE, APPLICATIONCODE, TRANSACTIONTYPECODE, REVENUECONSTITUENTID, DATE, REVENUEID, REVENUESPLITID)
as
(
select RR.ID, RR.CONSTITUENTID, RR.AMOUNTINCURRENCY, RR.EFFECTIVEDATE, RR.APPLICATIONCODE, RR.TRANSACTIONTYPECODE, RR.REVENUECONSTITUENTID, RR.DATE, RR.REVENUEID, RR.REVENUESPLITID
from dbo.UFN_REVENUERECOGNITION_GETAMOUNTINCURRENCY_BULK(@CURRENCYID, null, 2, 1) RR
union all
select RC.ID, RC.CONSTITUENTID, RC.AMOUNTINCURRENCY, RC.EFFECTIVEDATE, RC.APPLICATIONCODE, RC.TRANSACTIONTYPECODE, RC.REVENUECONSTITUENTID, RC.DATE, RC.REVENUEID, RC.REVENUESPLITID
from dbo.UFN_RECOGNITIONCREDIT_GETAMOUNTINCURRENCY_BULK(@CURRENCYID, null, 2, 1) RC
)
select
@RECOGNITIONTOTALNUMBER = count(RR.ID),
@RECOGNITIONTOTALAMOUNT = sum(AIC_CTE.AMOUNTINCURRENCY),
@RECOGNITIONAVERAGEAMOUNT = cast(avg(cast(AIC_CTE.AMOUNTINCURRENCY as decimal(20,5))) as money),
@TOTALRECOGNITIONWITHGIFTAID = cast(sum(cast(AIC_CTE.AMOUNTINCURRENCY + coalesce(dbo.UFN_RECOGNITIONCREDIT_GETTAXCLAIMAMOUNTINCURRENCY(FINANCIALTRANSACTIONLINEITEM.ID, dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(FINANCIALTRANSACTIONLINEITEM.ID, @CURRENCYID), AIC_CTE.AMOUNTINCURRENCY, RR.TRANSACTIONTYPECODE, REVENUESPLIT_EXT.APPLICATIONCODE, @CURRENCYID), 0) as decimal(20,5))) as money)
from #RECOGNITIONS RR
inner join AIC_CTE
on AIC_CTE.ID = RR.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = RR.REVENUESPLITID
inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
left join dbo.V_PLANNEDGIFTREVENUE_WITHADDITIONS PGR on PGR.REVENUEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
left join dbo.PLANNEDGIFT PG on PG.ID = PGR.PLANNEDGIFTID
where
(RR.TRANSACTIONTYPECODE = 1 or --Pledge
RR.TRANSACTIONTYPECODE = 7 or --Auction donation
RR.TRANSACTIONTYPECODE = 8 or --Donor challenge claim
RR.TRANSACTIONTYPECODE = 3 or --Matching Gift Claim
(RR.TRANSACTIONTYPECODE = 4 and PG.VEHICLECODE in (0,1,2,5,6,7,8,9,10,11,12,13)) or --Planned gift
(RR.TRANSACTIONTYPECODE = 0 and (REVENUESPLIT_EXT.APPLICATIONCODE in (0, 3, 7) or (REVENUESPLIT_EXT.APPLICATIONCODE = 1 and REVENUESPLIT_EXT.TYPECODE = 0)))) --Payment
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
and exists
(
select top 1 FTLISUB.ID from dbo.FINANCIALTRANSACTIONLINEITEM FTLISUB
cross apply dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(FTLISUB.ID) REVSITES
where FTLISUB.FINANCIALTRANSACTIONID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
-- Using a case statement since the standard site extension filters
-- resulted in a poor plan
and case
when @ISSYSADMIN = 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)
)
)
set @RECOGNITIONTOTALNUMBER = coalesce(@RECOGNITIONTOTALNUMBER, 0);
set @RECOGNITIONTOTALAMOUNT = coalesce(@RECOGNITIONTOTALAMOUNT, 0);
--MODE
select top 1
@RECOGNITIONMOSTFREQUENTAMOUNT = X.AMOUNT
from
(select
dbo.UFN_REVENUERECOGNITION_GETAMOUNTINCURRENCY(RR.ID, @CURRENCYID) as AMOUNT,
count(RR.ID) TOTAL,
max(count(RR.ID)) over () MAXCOUNT
from
#RECOGNITIONS RR
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = RR.REVENUESPLITID
inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
left join dbo.V_PLANNEDGIFTREVENUE_WITHADDITIONS PGR on PGR.REVENUEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
left join dbo.PLANNEDGIFT PG on PG.ID = PGR.PLANNEDGIFTID
where
(RR.TRANSACTIONTYPECODE = 1 or --Pledge
RR.TRANSACTIONTYPECODE = 7 or --Auction donation
RR.TRANSACTIONTYPECODE = 8 or --Donor challenge claim
RR.TRANSACTIONTYPECODE = 3 or --Matching Gift Claim
(RR.TRANSACTIONTYPECODE = 4 and PG.VEHICLECODE in (0,1,2,5,6,7,8,9,10,11,12,13)) or --Planned gift
(RR.TRANSACTIONTYPECODE = 0 and (REVENUESPLIT_EXT.APPLICATIONCODE in (0, 3, 7) or (REVENUESPLIT_EXT.APPLICATIONCODE = 1 and REVENUESPLIT_EXT.TYPECODE = 0)))) --Payment
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
and exists
(
select top 1 FTLISUB.ID from dbo.FINANCIALTRANSACTIONLINEITEM FTLISUB
cross apply dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(FTLISUB.ID) REVSITES
where FTLISUB.FINANCIALTRANSACTIONID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
-- Using a case statement since the standard site extension filters
-- resulted in a poor plan
and case
when @ISSYSADMIN = 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)
)
)
group by
dbo.UFN_REVENUERECOGNITION_GETAMOUNTINCURRENCY(RR.ID, @CURRENCYID)) X
where
X.TOTAL = X.MAXCOUNT and X.TOTAL > 1
order by
X.AMOUNT desc;
--TOTALYEARS
select
@RECOGNITIONTOTALYEARS = count(distinct(RR.FIRSTDAYOFEFFECTIVEDATEYEAR))
from
#RECOGNITIONS RR
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = RR.REVENUESPLITID
inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
left join dbo.V_PLANNEDGIFTREVENUE_WITHADDITIONS PGR on PGR.REVENUEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
left join dbo.PLANNEDGIFT PG on PG.ID = PGR.PLANNEDGIFTID
where
(RR.TRANSACTIONTYPECODE = 1 or --Pledge
RR.TRANSACTIONTYPECODE = 7 or --Auction donation
RR.TRANSACTIONTYPECODE = 8 or --Donor challenge claim
RR.TRANSACTIONTYPECODE = 3 or --Matching Gift Claim
(RR.TRANSACTIONTYPECODE = 4 and PG.VEHICLECODE in (0,1,2,5,6,7,8,9,10,11,12,13)) or --Planned gift
(RR.TRANSACTIONTYPECODE = 0 and (REVENUESPLIT_EXT.APPLICATIONCODE in (0, 3, 7) or (REVENUESPLIT_EXT.APPLICATIONCODE = 1 and REVENUESPLIT_EXT.TYPECODE = 0)))) --Payment
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
and exists
(
select top 1 FTLISUB.ID from dbo.FINANCIALTRANSACTIONLINEITEM FTLISUB
cross apply dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(FTLISUB.ID) REVSITES
where FTLISUB.FINANCIALTRANSACTIONID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
-- Using a case statement since the standard site extension filters
-- resulted in a poor plan
and case
when @ISSYSADMIN = 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)
)
)
--CONSECUTIVE YEARS
declare @RECOGNITIONFISCALYEAR_FIRSTDAY datetime;
declare @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY datetime;
declare @CONTINUE bit;
declare RECOGNITIONFISCALYEARCURSOR cursor local fast_forward for
select
RR.FIRSTDAYOFEFFECTIVEDATEYEAR FISCALYEAR_FIRSTDAY
from
#RECOGNITIONS RR
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = RR.REVENUESPLITID
inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
left join dbo.V_PLANNEDGIFTREVENUE_WITHADDITIONS PGR on PGR.REVENUEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
left join dbo.PLANNEDGIFT PG on PG.ID = PGR.PLANNEDGIFTID
where
(RR.TRANSACTIONTYPECODE = 1 or --Pledge
RR.TRANSACTIONTYPECODE = 7 or --Auction donation
RR.TRANSACTIONTYPECODE = 8 or --Donor challenge claim
RR.TRANSACTIONTYPECODE = 3 or --Matching Gift Claim
(RR.TRANSACTIONTYPECODE = 4 and PG.VEHICLECODE in (0,1,2,5,6,7,8,9,10,11,12,13)) or --Planned gift
(RR.TRANSACTIONTYPECODE = 0 and (REVENUESPLIT_EXT.APPLICATIONCODE in (0, 3, 7) or (REVENUESPLIT_EXT.APPLICATIONCODE = 1 and REVENUESPLIT_EXT.TYPECODE = 0)))) --Payment
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
and exists
(
select top 1 FTLISUB.ID from dbo.FINANCIALTRANSACTIONLINEITEM FTLISUB
cross apply dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(FTLISUB.ID) REVSITES
where FTLISUB.FINANCIALTRANSACTIONID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
-- Using a case statement since the standard site extension filters
-- resulted in a poor plan
and case
when @ISSYSADMIN = 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)
)
)
group by
RR.FIRSTDAYOFEFFECTIVEDATEYEAR
order by
RR.FIRSTDAYOFEFFECTIVEDATEYEAR desc;
set @RECOGNITIONCONSECUTIVEYEARS = 0;
set @RECOGNITIONGIVENSINCEFISCALYEAR = null;
open RECOGNITIONFISCALYEARCURSOR;
fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONFISCALYEAR_FIRSTDAY;
if @@FETCH_STATUS = 0 begin
if @RECOGNITIONFISCALYEAR_FIRSTDAY > @FIRSTDAYTHISFISCALYEAR begin
set @CONTINUE = 1;
fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
end
else if @RECOGNITIONFISCALYEAR_FIRSTDAY = @FIRSTDAYTHISFISCALYEAR or
@RECOGNITIONFISCALYEAR_FIRSTDAY = @FIRSTDAYPREVIOUSFISCALYEAR begin
set @RECOGNITIONCONSECUTIVEYEARS = @RECOGNITIONCONSECUTIVEYEARS + 1;
set @CONTINUE = 1;
fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
end
else
set @CONTINUE = 0;
end
while @@FETCH_STATUS = 0 and @CONTINUE = 1 begin
if @RECOGNITIONCONSECUTIVEYEARS = 0 begin
if @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY > @FIRSTDAYTHISFISCALYEAR begin
set @RECOGNITIONFISCALYEAR_FIRSTDAY = @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
end
else if @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY = @FIRSTDAYTHISFISCALYEAR or
@RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY = @FIRSTDAYPREVIOUSFISCALYEAR begin
set @RECOGNITIONCONSECUTIVEYEARS = @RECOGNITIONCONSECUTIVEYEARS + 1;
set @RECOGNITIONFISCALYEAR_FIRSTDAY = @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
end
else
set @CONTINUE = 0
end
else if @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY = dateadd(year, -1, @RECOGNITIONFISCALYEAR_FIRSTDAY) begin
set @RECOGNITIONCONSECUTIVEYEARS = @RECOGNITIONCONSECUTIVEYEARS + 1;
set @RECOGNITIONFISCALYEAR_FIRSTDAY = @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
end
else
set @CONTINUE = 0;
end
--When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long
close RECOGNITIONFISCALYEARCURSOR;
deallocate RECOGNITIONFISCALYEARCURSOR;
if @RECOGNITIONCONSECUTIVEYEARS > 0
set @RECOGNITIONGIVENSINCEFISCALYEAR = @RECOGNITIONFISCALYEAR_FIRSTDAY;
drop table #RECOGNITIONS;