USP_REPORT_APPEALPERIODCOMPARISON
USP_REPORT_APPEALPERIODCOMPARISON
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@APPEAL1ID | uniqueidentifier | IN | |
@APPEAL1YEAR | smallint | IN | |
@APPEAL2ID | uniqueidentifier | IN | |
@APPEAL2YEAR | smallint | IN | |
@PERIODTYPE | tinyint | IN | |
@YEARTYPE | tinyint | IN | |
@CURRENCYCODE | tinyint | IN |
Definition
Copy
CREATE procedure dbo.USP_REPORT_APPEALPERIODCOMPARISON
(
@APPEAL1ID uniqueidentifier,
@APPEAL1YEAR smallint,
@APPEAL2ID uniqueidentifier,
@APPEAL2YEAR smallint,
@PERIODTYPE tinyint,
@YEARTYPE tinyint,
@CURRENCYCODE tinyint = null
)
as
declare @ORGANIZATIONCURRENCYID uniqueidentifier;
declare @GRAPHCURRENCYID uniqueidentifier;
declare @SELECTEDCURRENCYID uniqueidentifier;
declare @DECIMALDIGITS tinyint;
declare @ROUNDINGTYPECODE tinyint;
declare @SELECTEDCURRENCY2ID uniqueidentifier;
declare @DECIMALDIGITS2 tinyint;
declare @ROUNDINGTYPECODE2 tinyint;
if coalesce(@CURRENCYCODE, 1) = 1
begin
set @CURRENCYCODE = 1;
select
@SELECTEDCURRENCYID = CURRENCY.ID,
@ORGANIZATIONCURRENCYID = CURRENCY.ID,
@DECIMALDIGITS = CURRENCY.DECIMALDIGITS,
@ROUNDINGTYPECODE = CURRENCY.ROUNDINGTYPECODE
from
dbo.CURRENCY
where
CURRENCY.ID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
end
else begin
set @CURRENCYCODE = 0;
--Find base currency of the first appeal
select
@GRAPHCURRENCYID = BASECURRENCYID,
@SELECTEDCURRENCYID = BASECURRENCYID,
@DECIMALDIGITS = CURRENCY.DECIMALDIGITS,
@ROUNDINGTYPECODE = CURRENCY.ROUNDINGTYPECODE
from
dbo.APPEAL
inner join
dbo.CURRENCY on APPEAL.BASECURRENCYID = CURRENCY.ID
where APPEAL.ID = @APPEAL1ID
--Find base of the second appeal
select
@SELECTEDCURRENCY2ID = BASECURRENCYID,
@DECIMALDIGITS2 = CURRENCY.DECIMALDIGITS,
@ROUNDINGTYPECODE2 = CURRENCY.ROUNDINGTYPECODE
from
dbo.APPEAL
inner join
dbo.CURRENCY on APPEAL.BASECURRENCYID = CURRENCY.ID
where APPEAL.ID = @APPEAL2ID
set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
--If appeals' currencies are different set the graph currency to the organizational currency
if @GRAPHCURRENCYID <> @SELECTEDCURRENCY2ID
set @GRAPHCURRENCYID = @ORGANIZATIONCURRENCYID;
end
declare @YEARSTART table
(
APPEALID uniqueidentifier,
YEARSTART datetime
);
-- using a results table to later insert dummy rows for {appeal, period} combinations without data
declare @RESULTS table
(
REVENUECATEGORY nvarchar(25),
APPEALID uniqueidentifier,
NAME nvarchar(100),
PERIOD int,
CONSTITUENTCOUNT int,
REVENUECOUNT int,
REVENUEAMOUNT money,
REVENUEAMOUNTINGRAPHCURRENCY money,
TOTALCONSTITUENTCOUNT int,
TOTALGIFTCOUNT int
);
declare @STARTMONTH smallint;
if @YEARTYPE = 0
begin
set @STARTMONTH = 1;
end
else if @YEARTYPE = 1
begin
declare @FISCALYEARFINALMONTH tinyint;
select @FISCALYEARFINALMONTH = FISCALYEARFINALMONTH from dbo.INSTALLATIONINFO;
declare @FISCALYEARFIRSTMONTH tinyint = (@FISCALYEARFINALMONTH + 1);
if @FISCALYEARFIRSTMONTH = 13
set @FISCALYEARFIRSTMONTH = 1;
set @STARTMONTH = @FISCALYEARFIRSTMONTH;
end
insert into @YEARSTART
select @APPEAL1ID, cast(cast(@APPEAL1YEAR * 10000 + @STARTMONTH * 100 + 1 as varchar) as datetime) union all
select @APPEAL2ID, cast(cast(@APPEAL2YEAR * 10000 + @STARTMONTH * 100 + 1 as varchar) as datetime);
-- Cash gifts --> Pledges and donations --> LocalType = 0
-- Regular gifts --> Recurring gift payments --> LocalType = 1
declare @GIFTS table (
REVENUEID uniqueidentifier,
APPEALID uniqueidentifier,
CONSTITUENTID uniqueidentifier,
AMOUNT money,
AMOUNTINGRAPHCURRENCY money,
PERIOD int,
LOCALTYPE int
)
insert into @GIFTS (REVENUEID, APPEALID, CONSTITUENTID, AMOUNT, AMOUNTINGRAPHCURRENCY, PERIOD, LOCALTYPE)
select
REVENUE.ID as REVENUEID,
REVENUE.APPEALID,
REVENUE.CONSTITUENTID,
case
when (REVENUE.APPEALID = @APPEAL1ID) then sum(RS_A1.AMOUNTINCURRENCY)
else sum(RS_A2.AMOUNTINCURRENCY)
end as [AMOUNT],
sum(REVENUESPLIT.AMOUNTINCURRENCY) [AMOUNTINGRAPHCURRENCY],
case @PERIODTYPE
when 0 then datediff(week, APPEALYEARSTART.YEARSTART, REVENUE.DATE) + 1
when 1 then datediff(month, APPEALYEARSTART.YEARSTART, REVENUE.DATE) + 1
when 2 then datediff(quarter, APPEALYEARSTART.YEARSTART, REVENUE.DATE) + 1
end as PERIOD,
case
when REVENUE.TRANSACTIONTYPECODE = 1 then 0
when REVENUE.TRANSACTIONTYPECODE = 0 and (REVENUESPLIT.APPLICATIONCODE = 0 or (REVENUESPLIT.APPLICATIONCODE = 1 and REVENUESPLIT.TYPECODE = 0)) then 0
when REVENUE.TRANSACTIONTYPECODE = 0 and REVENUESPLIT.APPLICATIONCODE = 3 then 1
end as LOCALTYPE
from
dbo.REVENUE
left outer join
@YEARSTART [APPEALYEARSTART] on APPEALYEARSTART.APPEALID = REVENUE.APPEALID
inner join
dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@GRAPHCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as REVENUESPLIT on REVENUESPLIT.REVENUEID = REVENUE.ID
inner join
dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as RS_A1 on REVENUESPLIT.ID = RS_A1.ID
inner join
dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCY2ID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS2, @ROUNDINGTYPECODE2) as RS_A2 on REVENUESPLIT.ID = RS_A2.ID
left join
dbo.APPEAL on APPEAL.ID = REVENUE.APPEALID
where
(REVENUE.APPEALID = @APPEAL1ID or REVENUE.APPEALID = @APPEAL2ID)
and
DATEDIFF(month, APPEALYEARSTART.YEARSTART, REVENUE.DATE) <= 12
and
(
(REVENUE.TRANSACTIONTYPECODE = 1)
or
(REVENUE.TRANSACTIONTYPECODE = 0 and (REVENUESPLIT.APPLICATIONCODE = 0 or (REVENUESPLIT.APPLICATIONCODE = 1 and REVENUESPLIT.TYPECODE = 0)))
or
(REVENUE.TRANSACTIONTYPECODE = 0 and REVENUESPLIT.APPLICATIONCODE = 3)
)
group by
REVENUE.ID, REVENUE.APPEALID, REVENUE.CONSTITUENTID, REVENUE.DATE, REVENUE.TRANSACTIONTYPECODE, REVENUESPLIT.APPLICATIONCODE, REVENUESPLIT.TYPECODE, APPEALYEARSTART.YEARSTART;
insert into @RESULTS (REVENUECATEGORY, APPEALID, NAME, PERIOD, CONSTITUENTCOUNT, REVENUECOUNT, REVENUEAMOUNT, REVENUEAMOUNTINGRAPHCURRENCY)
select
'Cash gifts',
gifts.APPEALID,
dbo.UFN_APPEAL_GETNAME(gifts.APPEALID) [NAME],
gifts.PERIOD,
coalesce(COUNT(distinct gifts.CONSTITUENTID), 0) [CONSTITUENTCOUNT],
coalesce(COUNT(distinct gifts.REVENUEID), 0) [REVENUECOUNT],
coalesce(SUM(gifts.AMOUNT), 0) [REVENUEAMOUNT],
coalesce(SUM(gifts.AMOUNTINGRAPHCURRENCY), 0) [REVENUEAMOUNTINGRAPHCURRENCY]
from @GIFTS gifts
where LOCALTYPE = 0
group by gifts.APPEALID, gifts.PERIOD;
insert into @RESULTS (REVENUECATEGORY, APPEALID, NAME, PERIOD, CONSTITUENTCOUNT, REVENUECOUNT, REVENUEAMOUNT, REVENUEAMOUNTINGRAPHCURRENCY)
select
'Regular gifts',
gifts.APPEALID,
dbo.UFN_APPEAL_GETNAME(gifts.APPEALID) [NAME],
gifts.PERIOD,
coalesce(COUNT(distinct gifts.CONSTITUENTID), 0) [CONSTITUENTCOUNT],
coalesce(COUNT(gifts.REVENUEID), 0) [REVENUECOUNT],
coalesce(SUM(gifts.AMOUNT), 0) [REVENUEAMOUNT],
coalesce(SUM(gifts.AMOUNTINGRAPHCURRENCY), 0) [REVENUEAMOUNTINGRAPHCURRENCY]
from @GIFTS gifts
where gifts.LOCALTYPE = 1
group by gifts.APPEALID, gifts.PERIOD;
-- Insert dummy rows for {appeal, period} combinations which do not have revenue.
-- @PERIODUPPERBOUND is how many periods appear in a year given @PERIODTYPE
-- PERIODS_CTE is a list of all of those periods
-- APPEALPERIODS_CTE is a list of all possible {appeal, period} combinations
declare @PERIODUPPERBOUND int =
case @PERIODTYPE
when 0 then 52
when 1 then 12
when 2 then 4
end;
with PERIODS_CTE as
(
select 1 as PERIOD
union all
select PERIOD + 1 from PERIODS_CTE where PERIOD < @PERIODUPPERBOUND
),
APPEALPERIODS_CTE as
(
select
APPEALID,
PERIOD
from
PERIODS_CTE
cross join
(select @APPEAL1ID [APPEALID] union select @APPEAL2ID [APPEALID]) as APPEALS
)
insert into @RESULTS
(
REVENUECATEGORY,
APPEALID,
NAME,
PERIOD
)
select
'Cash gifts',
APPEALPERIODS_CTE.APPEALID,
(select APPEAL.NAME from dbo.APPEAL where APPEAL.ID = APPEALPERIODS_CTE.APPEALID),
APPEALPERIODS_CTE.PERIOD
from
APPEALPERIODS_CTE
except
(select REVENUECATEGORY, APPEALID, NAME, PERIOD from @RESULTS)
union all
select
'Regular gifts',
APPEALPERIODS_CTE.APPEALID,
(select APPEAL.NAME from dbo.APPEAL where APPEAL.ID = APPEALPERIODS_CTE.APPEALID),
APPEALPERIODS_CTE.PERIOD
from
APPEALPERIODS_CTE
except
(select REVENUECATEGORY, APPEALID, NAME, PERIOD from @RESULTS);
update
@RESULTS
set
CONSTITUENTCOUNT = coalesce(CONSTITUENTCOUNT, 0),
REVENUECOUNT = coalesce(REVENUECOUNT, 0),
REVENUEAMOUNT = coalesce(REVENUEAMOUNT, 0),
REVENUEAMOUNTINGRAPHCURRENCY = coalesce(REVENUEAMOUNTINGRAPHCURRENCY, 0),
TOTALCONSTITUENTCOUNT = coalesce(TOTALCONSTITUENTCOUNT, 0),
TOTALGIFTCOUNT = coalesce(TOTALGIFTCOUNT, 0);
-- Count the total number of constituents and gifts per period and appeal
-- Only setting total counts on 'Cash gifts' records to support running totals in the report
-- If the value is set for both and use running totals is selected, the values will be doubled
update @RESULTS set
TOTALCONSTITUENTCOUNT = (
select
coalesce(count(distinct CONSTITUENTID), 0)
from @GIFTS gifts
where gifts.APPEALID = results.APPEALID
and gifts.PERIOD = results.PERIOD
),
TOTALGIFTCOUNT = (
select
coalesce(count(distinct REVENUEID), 0)
from @GIFTS gifts
where gifts.APPEALID = results.APPEALID
and gifts.PERIOD = results.PERIOD
)
from @RESULTS results
where results.REVENUECATEGORY = 'Cash gifts';
select
REVENUECATEGORY,
APPEALID,
r.NAME,
PERIOD,
CONSTITUENTCOUNT,
REVENUECOUNT,
REVENUEAMOUNT,
case
when APPEALID = @APPEAL1ID then 1
when APPEALID = @APPEAL2ID then 2
end as APPEALORDER,
TOTALCONSTITUENTCOUNT,
TOTALGIFTCOUNT,
CURRENCYPROPERTIES.ID as CURRENCYID,
CURRENCYPROPERTIES.ISO4217 as CURRENCYISO,
CURRENCYPROPERTIES.DECIMALDIGITS as CURRENCYDECIMALDIGITS,
CURRENCYPROPERTIES.CURRENCYSYMBOL as CURRENCYSYMBOL,
CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE as CURRENCYSYMBOLDISPLAYSETTINGCODE,
GRAPHCURRENCYPROPERTIES.ID as GRAPHCURRENCYID,
GRAPHCURRENCYPROPERTIES.ISO4217 as GRAPHCURRENCYISO,
GRAPHCURRENCYPROPERTIES.DECIMALDIGITS as GRAPHCURRENCYDECIMALDIGITS,
GRAPHCURRENCYPROPERTIES.CURRENCYSYMBOL as GRAPHCURRENCYSYMBOL,
GRAPHCURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE as GRAPHCURRENCYSYMBOLDISPLAYSETTINGCODE,
REVENUEAMOUNTINGRAPHCURRENCY
from
@RESULTS r
left join dbo.APPEAL on APPEAL.ID = r.APPEALID
outer apply dbo.UFN_CURRENCY_GETPROPERTIES(case when @CURRENCYCODE = 1 then @ORGANIZATIONCURRENCYID else APPEAL.BASECURRENCYID end) CURRENCYPROPERTIES
outer apply dbo.UFN_CURRENCY_GETPROPERTIES(case when @CURRENCYCODE = 1 then @ORGANIZATIONCURRENCYID else @GRAPHCURRENCYID end) GRAPHCURRENCYPROPERTIES
where
(r.PERIOD > 0 and r.PERIOD <= @PERIODUPPERBOUND)
order by
APPEALORDER, APPEALID, r.NAME, PERIOD;