UFN_SMARTQUERY_REVENUEDYNAMICS
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@INCLUDENEW | bit | IN | |
@INCLUDERECAPTURE | bit | IN | |
@INCLUDEUPGRADE | bit | IN | |
@INCLUDESAME | bit | IN | |
@INCLUDEDOWNGRADE | bit | IN | |
@INCLUDELAPSEDNEW | bit | IN | |
@INCLUDELAPSEDREPEAT | bit | IN | |
@PREVIOUSFROMDATE | datetime | IN | |
@PREVIOUSTODATE | datetime | IN | |
@THISFROMDATE | datetime | IN | |
@THISTODATE | datetime | IN | |
@DESIGNATIONS | xml | IN | |
@CAMPAIGNS | xml | IN | |
@TYPECODES | xml | IN | |
@PREVIOUSDATERANGE | tinyint | IN | |
@THISDATERANGE | tinyint | IN | |
@EXCLUDEGIFTSOVER | money | IN | |
@CURRENCYCODE | tinyint | IN | |
@ENABLEEXCLUDEGIFTSOVER | bit | IN | |
@CURRENCYID | uniqueidentifier | IN | |
@CURRENTAPPUSERID | uniqueidentifier | IN | |
@MAXROWS | int | IN |
Definition
Copy
create function dbo.UFN_SMARTQUERY_REVENUEDYNAMICS
(
@INCLUDENEW bit = 0,
@INCLUDERECAPTURE bit = 0,
@INCLUDEUPGRADE bit = 0,
@INCLUDESAME bit = 0,
@INCLUDEDOWNGRADE bit = 0,
@INCLUDELAPSEDNEW bit = 0,
@INCLUDELAPSEDREPEAT bit = 0,
@PREVIOUSFROMDATE datetime,
@PREVIOUSTODATE datetime,
@THISFROMDATE datetime,
@THISTODATE datetime,
@DESIGNATIONS xml,
@CAMPAIGNS xml,
@TYPECODES xml,
@PREVIOUSDATERANGE tinyint,
@THISDATERANGE tinyint,
@EXCLUDEGIFTSOVER money,
@CURRENCYCODE tinyint,
@ENABLEEXCLUDEGIFTSOVER bit,
@CURRENCYID uniqueidentifier,
@CURRENTAPPUSERID uniqueidentifier = null,
@MAXROWS int = null
)
returns @T table
(
ID uniqueidentifier not null,
NAME nvarchar(154),
PREVIOUSAMOUNT money,
THISAMOUNT money,
ALLOTHERAMOUNT money,
BEHAVIORTYPECODE tinyint,
CURRENCYID uniqueidentifier
)
as
begin
declare @ISADMIN bit;
set @ISADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
set @CURRENCYID = case @CURRENCYCODE
when 0 then dbo.UFN_APPUSER_GETBASECURRENCY(@CURRENTAPPUSERID)
else dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()
end
if @PREVIOUSDATERANGE <> 0
begin
if @PREVIOUSDATERANGE=6 begin
-- Current month
set @PREVIOUSFROMDATE = dbo.UFN_DATE_THISMONTH_FIRSTDAY(@PREVIOUSFROMDATE, 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_THISMONTH_LASTDAY(@PREVIOUSTODATE, 1);
end else if @PREVIOUSDATERANGE=12 begin
-- Previous month
set @PREVIOUSFROMDATE = dbo.UFN_DATE_LASTMONTH_FIRSTDAY(@PREVIOUSFROMDATE, 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_LASTMONTH_LASTDAY(@PREVIOUSTODATE, 1);
end else if @PREVIOUSDATERANGE=39 begin
-- Current fiscal year
set @PREVIOUSFROMDATE = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(@PREVIOUSFROMDATE, 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_THISFISCALYEAR_LASTDAY(@PREVIOUSTODATE, 1);
end else if @PREVIOUSDATERANGE=38 begin
-- Previous fiscal year
set @PREVIOUSFROMDATE = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(dateadd(year,-1,@PREVIOUSFROMDATE), 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_THISFISCALYEAR_LASTDAY(dateadd(year,-1,@PREVIOUSTODATE), 1);
end else if @PREVIOUSDATERANGE=7 begin
-- This calendar year
set @PREVIOUSFROMDATE = dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(@PREVIOUSFROMDATE, 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_THISCALENDARYEAR_LASTDAY(@PREVIOUSTODATE, 1);
end else if @PREVIOUSDATERANGE=13 begin
-- Last calendar year
set @PREVIOUSFROMDATE = dbo.UFN_DATE_LASTCALENDARYEAR_FIRSTDAY(@PREVIOUSFROMDATE, 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_LASTCALENDARYEAR_LASTDAY(@PREVIOUSTODATE, 1);
end else if @PREVIOUSDATERANGE=43 begin
-- This quarter
set @PREVIOUSFROMDATE = dbo.UFN_DATE_THISQUARTER_FIRSTDAY(@PREVIOUSFROMDATE, 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_THISQUARTER_LASTDAY(@PREVIOUSTODATE, 1);
end else if @PREVIOUSDATERANGE=45 begin
-- Last quarter
set @PREVIOUSFROMDATE = dbo.UFN_DATE_LASTQUARTER_FIRSTDAY(@PREVIOUSFROMDATE, 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_LASTQUARTER_LASTDAY(@PREVIOUSTODATE, 1);
end else if @PREVIOUSDATERANGE=5 begin
-- This week
set @PREVIOUSFROMDATE = dbo.UFN_DATE_THISWEEK_FIRSTDAY(@PREVIOUSFROMDATE, 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_THISWEEK_LASTDAY(@PREVIOUSTODATE, 1);
end else if @PREVIOUSDATERANGE=11 begin
-- Last week
set @PREVIOUSFROMDATE = dbo.UFN_DATE_LASTWEEK_FIRSTDAY(@PREVIOUSFROMDATE, 0);
set @PREVIOUSTODATE = dbo.UFN_DATE_LASTWEEK_LASTDAY(@PREVIOUSTODATE, 1);
end
end
if @THISDATERANGE <> 0
begin
if @THISDATERANGE=6 begin
-- Current month
set @THISFROMDATE = dbo.UFN_DATE_THISMONTH_FIRSTDAY(@THISFROMDATE, 0);
set @THISTODATE = dbo.UFN_DATE_THISMONTH_LASTDAY(@THISTODATE, 1);
end else if @THISDATERANGE=12 begin
-- Previous month
set @THISFROMDATE = dbo.UFN_DATE_LASTMONTH_FIRSTDAY(@THISFROMDATE, 0);
set @THISTODATE = dbo.UFN_DATE_LASTMONTH_LASTDAY(@THISTODATE, 1);
end else if @THISDATERANGE=39 begin
-- Current fiscal year
set @THISFROMDATE = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(@THISFROMDATE, 0);
set @THISTODATE = dbo.UFN_DATE_THISFISCALYEAR_LASTDAY(@THISTODATE, 1);
end else if @THISDATERANGE=38 begin
-- Previous fiscal year
set @THISFROMDATE = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(dateadd(year,-1,@THISFROMDATE), 0);
set @THISTODATE = dbo.UFN_DATE_THISFISCALYEAR_LASTDAY(dateadd(year,-1,@THISTODATE), 1);
end else if @THISDATERANGE=7 begin
-- This calendar year
set @THISFROMDATE = dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(@THISFROMDATE, 0);
set @THISTODATE = dbo.UFN_DATE_THISCALENDARYEAR_LASTDAY(@THISTODATE, 1);
end else if @THISDATERANGE=13 begin
-- Last calendar year
set @THISFROMDATE = dbo.UFN_DATE_LASTCALENDARYEAR_FIRSTDAY(@THISFROMDATE, 0);
set @THISTODATE = dbo.UFN_DATE_LASTCALENDARYEAR_LASTDAY(@THISTODATE, 1);
end else if @THISDATERANGE=43 begin
-- This quarter
set @THISFROMDATE = dbo.UFN_DATE_THISQUARTER_FIRSTDAY(@THISFROMDATE, 0);
set @THISTODATE = dbo.UFN_DATE_THISQUARTER_LASTDAY(@THISTODATE, 1);
end else if @THISDATERANGE=45 begin
-- Last quarter
set @THISFROMDATE = dbo.UFN_DATE_LASTQUARTER_FIRSTDAY(@THISFROMDATE, 0);
set @THISTODATE = dbo.UFN_DATE_LASTQUARTER_LASTDAY(@THISTODATE, 1);
end else if @THISDATERANGE=5 begin
-- This week
set @THISFROMDATE = dbo.UFN_DATE_THISWEEK_FIRSTDAY(@THISFROMDATE, 0);
set @THISTODATE = dbo.UFN_DATE_THISWEEK_LASTDAY(@THISTODATE, 1);
end else if @THISDATERANGE=11 begin
-- Last week
set @THISFROMDATE = dbo.UFN_DATE_LASTWEEK_FIRSTDAY(@THISFROMDATE, 0);
set @THISTODATE = dbo.UFN_DATE_LASTWEEK_LASTDAY(@THISTODATE, 1);
end
end
set @PREVIOUSFROMDATE = dbo.UFN_DATE_GETEARLIESTTIME(@PREVIOUSFROMDATE);
set @PREVIOUSTODATE = dbo.UFN_DATE_GETLATESTTIME(@PREVIOUSTODATE);
set @THISFROMDATE = dbo.UFN_DATE_GETEARLIESTTIME(@THISFROMDATE);
set @THISTODATE = dbo.UFN_DATE_GETLATESTTIME(@THISTODATE);
set @EXCLUDEGIFTSOVER = coalesce(@EXCLUDEGIFTSOVER, 0);
declare @GIFTTYPESFILTER table (TYPECODE tinyint, APPLICATIONCODE tinyint primary key (TYPECODE, APPLICATIONCODE));
declare @DESIGNATIONSFILTER table (ID uniqueidentifier primary key);
declare @CAMPAIGNSFILTER table(ID uniqueidentifier primary key);
if @TYPECODES is null
begin
insert into @GIFTTYPESFILTER(TYPECODE,APPLICATIONCODE) values (0,0)
end
else
begin
insert into @GIFTTYPESFILTER(TYPECODE,APPLICATIONCODE)
select distinct
case T.c.value('(TYPECODEID)[1]','tinyint')
when 1 then 1 --Pledge
when 3 then 3 --Matching gift claim
when 9 then 4 --Planned gift
when 13 then 7 --Auction donation
when 15 then 8 --Donor challenge claim
when 17 then 6 --Grant award
else 0
end as TYPECODE,
case T.c.value('(TYPECODEID)[1]','tinyint')
when 4 then 2 --Pledge payment
when 5 then 3 --RG payment
when 6 then 1 --Event registration fee
when 8 then 7 --Matching gift payment
when 10 then 6 --Planned gift payment
when 11 then 5 --Membership
when 12 then 4 --Other
when 16 then 13 --Donor challenge
when 18 then 8 --Grant award
when 14 then 12 --Auction purchase
else 0 --Gift, pledge, planned gift, and matching gift claim
end as APPLICATIONCODE
FROM @TYPECODES.nodes('/TYPECODES/ITEM') T(c)
if exists (select 1 from @GIFTTYPESFILTER where TYPECODE = 1)
insert into @GIFTTYPESFILTER(TYPECODE,APPLICATIONCODE)
select 1,5 union all select 1,4; --Add pledges applied to memberships and applied to other
-- If Gifts selected, include Sales order donations
if exists(select 1 from @GIFTTYPESFILTER where TYPECODE = 0 and APPLICATIONCODE = 0)
insert into @GIFTTYPESFILTER(TYPECODE, APPLICATIONCODE)
values (5, 0);
-- Bug 262313 If Memberships selected, include Sales order memberships
if exists(select 1 from @GIFTTYPESFILTER where TYPECODE = 0 and APPLICATIONCODE = 5)
insert into @GIFTTYPESFILTER(TYPECODE, APPLICATIONCODE)
values (5, 5);
end
if @DESIGNATIONS is not null
insert into @DESIGNATIONSFILTER(ID) select distinct
T.c.value('(ID)[1]','uniqueidentifier')
FROM @DESIGNATIONS.nodes('/DESIGNATIONS/ITEM') T(c);
if not exists (select ID from @DESIGNATIONSFILTER)
set @DESIGNATIONS = null;
if @CAMPAIGNS is not null
insert into @CAMPAIGNSFILTER(ID) select distinct
T.c.value('(ID)[1]','uniqueidentifier')
FROM @CAMPAIGNS.nodes('/CAMPAIGNS/ITEM') T(c);
if not exists (select ID from @CAMPAIGNSFILTER)
set @CAMPAIGNS = null;
-- todo account for writeoffs
with REVENUE_CTE as
(
select
REVENUE.ID,
REVENUE.CONSTITUENTID,
sum(dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID, @CURRENCYID)) [AMOUNT],
REVENUE.DATE
from
dbo.FINANCIALTRANSACTION as REVENUE
inner join
dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
inner join
dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
inner join
@GIFTTYPESFILTER as GIFTTYPESFILTER on GIFTTYPESFILTER.TYPECODE = REVENUE.TYPECODE and GIFTTYPESFILTER.APPLICATIONCODE = REVENUESPLIT_EXT.APPLICATIONCODE
where
REVENUESPLIT.DELETEDON IS NULL and
REVENUESPLIT.TYPECODE <> 1 and
REVENUE.DELETEDON IS NULL and
REVENUE.TYPECODE IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) and
(
(
@DESIGNATIONS is null
)
or
(
(
REVENUESPLIT.ID in
(
select
REVENUESPLIT.ID
from
dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT
inner join
dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
inner join
@DESIGNATIONSFILTER as DESIGNATIONSFILTER on DESIGNATIONSFILTER.ID = REVENUESPLIT_EXT.DESIGNATIONID
)
)
or
(
REVENUE.TYPECODE = 0 and REVENUESPLIT_EXT.APPLICATIONCODE = 1
)
)
)
and
(
(
@CAMPAIGNS is null
)
or
(
(
REVENUESPLIT.ID in
(
select
REVENUESPLIT.ID
from
dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT
inner join
dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
inner join
dbo.REVENUESPLITCAMPAIGN on REVENUESPLIT.ID = REVENUESPLITCAMPAIGN.REVENUESPLITID
inner join
@CAMPAIGNSFILTER as CAMPAIGNSFILTER on REVENUESPLITCAMPAIGN.CAMPAIGNID = CAMPAIGNSFILTER.ID
)
)
or
(
REVENUE.TYPECODE = 0 and REVENUESPLIT_EXT.APPLICATIONCODE = 1
)
)
)
and
(@EXCLUDEGIFTSOVER = 0 or dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(REVENUE.ID, @CURRENCYID) <= @EXCLUDEGIFTSOVER)
and
(
@ISADMIN = 1
or
(
(dbo.UFN_SECURITY_APPUSER_GRANTED_SMARTQUERY_FORREVENUE(@CURRENTAPPUSERID, '6e022da3-e987-4d91-bd99-4beabe7e791e', REVENUE.ID) = 1 )
and
(dbo.UFN_SECURITY_APPUSER_GRANTED_SMARTQUERY_FORCONSTIT(@CURRENTAPPUSERID, '6e022da3-e987-4d91-bd99-4beabe7e791e', REVENUE.CONSTITUENTID) = 1)
and
(dbo.UFN_SECURITY_APPUSER_GRANTED_SMARTQUERY_FORCONSTIT_BYSITE(@CURRENTAPPUSERID, '6e022da3-e987-4d91-bd99-4beabe7e791e', REVENUE.CONSTITUENTID) = 1)
)
)
group by
REVENUE.ID, REVENUE.CONSTITUENTID, REVENUE.TYPECODE, REVENUE.DATE
),
CONSTITUENTREVENUE_CTE as
(
select
REVENUE_CTE.CONSTITUENTID,
SUM(
case
when (REVENUE_CTE.DATE < @PREVIOUSFROMDATE) then REVENUE_CTE.AMOUNT
else 0
end
) [ALLOTHERAMOUNT],
SUM(
case
when REVENUE_CTE.DATE between @PREVIOUSFROMDATE and @PREVIOUSTODATE then REVENUE_CTE.AMOUNT
else 0
end
) [PREVIOUSPERIODAMOUNT],
SUM(
case
when REVENUE_CTE.DATE between @THISFROMDATE and @THISTODATE then REVENUE_CTE.AMOUNT
else 0
end
) [THISPERIODAMOUNT]
from
REVENUE_CTE
group by
REVENUE_CTE.CONSTITUENTID
)
insert into @T
select
CONSTITUENTREVENUE_CTE.CONSTITUENTID,
CONSTITUENT.NAME,
CONSTITUENTREVENUE_CTE.PREVIOUSPERIODAMOUNT,
CONSTITUENTREVENUE_CTE.THISPERIODAMOUNT,
CONSTITUENTREVENUE_CTE.ALLOTHERAMOUNT,
case
when THISPERIODAMOUNT > 0 and PREVIOUSPERIODAMOUNT = 0 and ALLOTHERAMOUNT = 0 then 0
when THISPERIODAMOUNT > 0 and PREVIOUSPERIODAMOUNT = 0 and ALLOTHERAMOUNT > 0 then 1
when THISPERIODAMOUNT > PREVIOUSPERIODAMOUNT and PREVIOUSPERIODAMOUNT > 0 then 2
when THISPERIODAMOUNT = PREVIOUSPERIODAMOUNT and PREVIOUSPERIODAMOUNT > 0 then 3
when THISPERIODAMOUNT < PREVIOUSPERIODAMOUNT and THISPERIODAMOUNT > 0 then 4
when THISPERIODAMOUNT = 0 and PREVIOUSPERIODAMOUNT > 0 and ALLOTHERAMOUNT = 0 then 5
when THISPERIODAMOUNT = 0 and PREVIOUSPERIODAMOUNT > 0 and ALLOTHERAMOUNT > 0 then 6
else -1
end,
@CURRENCYID
from
CONSTITUENTREVENUE_CTE
inner join
dbo.CONSTITUENT on CONSTITUENT.ID = CONSTITUENTREVENUE_CTE.CONSTITUENTID
where
(@INCLUDENEW = 1 and THISPERIODAMOUNT > 0 and PREVIOUSPERIODAMOUNT = 0 and ALLOTHERAMOUNT = 0)
or
(@INCLUDERECAPTURE = 1 and THISPERIODAMOUNT > 0 and PREVIOUSPERIODAMOUNT = 0 and ALLOTHERAMOUNT > 0)
or
(@INCLUDEUPGRADE = 1 and THISPERIODAMOUNT > PREVIOUSPERIODAMOUNT and PREVIOUSPERIODAMOUNT > 0)
or
(@INCLUDESAME = 1 and THISPERIODAMOUNT = PREVIOUSPERIODAMOUNT and PREVIOUSPERIODAMOUNT > 0)
or
(@INCLUDEDOWNGRADE = 1 and THISPERIODAMOUNT < PREVIOUSPERIODAMOUNT and THISPERIODAMOUNT > 0)
or
(@INCLUDELAPSEDNEW = 1 and THISPERIODAMOUNT = 0 and PREVIOUSPERIODAMOUNT > 0 and ALLOTHERAMOUNT = 0)
or
(@INCLUDELAPSEDREPEAT = 1 and THISPERIODAMOUNT = 0 and PREVIOUSPERIODAMOUNT > 0 and ALLOTHERAMOUNT > 0)
return;
end;