USP_REPORT_CAMPAIGNRECOGNITIONCREDIT
Generates data on campaign recognition credits.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@CAMPAIGNID | uniqueidentifier | IN | |
@GROUPBY | tinyint | IN | |
@GOALID | uniqueidentifier | IN | |
@RECOGNITIONTYPEID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_REPORT_CAMPAIGNRECOGNITIONCREDIT
(
@CAMPAIGNID uniqueidentifier,
@GROUPBY tinyint,
@GOALID uniqueidentifier,
@RECOGNITIONTYPEID uniqueidentifier
)
as
set nocount on;
--Retrieve campaign goal information we'll need later
declare @STARTDATE datetime;
declare @ENDDATE datetime;
declare @CAMPAIGNGOAL money;
declare @PARAMGOALNAME varchar(100);
declare @CAMPAIGNHIERARCHYID uniqueidentifier;
select
@STARTDATE=STARTDATE,
@ENDDATE=ENDDATE,
@CAMPAIGNGOAL=AMOUNT,
@PARAMGOALNAME=NAME,
@CAMPAIGNHIERARCHYID = CAMPAIGNID
from CAMPAIGNHIERARCHYGOAL
where ID=@GOALID;
--If campaign isn't the top of the hierarchy, get its goal amount
if @CAMPAIGNHIERARCHYID <> @CAMPAIGNID
begin
set @CAMPAIGNGOAL=null
select @CAMPAIGNGOAL=AMOUNT
from CAMPAIGNGOAL
where CAMPAIGNID=@CAMPAIGNID and CAMPAIGNHIERARCHYGOALID=@GOALID
end
--Retrieve the name of the type of recognition credits we are filtering by
declare @PARAMRECOGNITIONTYPENAME nvarchar(100)
if @RECOGNITIONTYPEID is null
begin
set @PARAMRECOGNITIONTYPENAME='All'
end
else
begin
select @PARAMRECOGNITIONTYPENAME=DESCRIPTION
from REVENUERECOGNITIONTYPECODE
where ID=@RECOGNITIONTYPEID
end
--Build a table of recognition totals for all campaigns, by time period.
declare @CAMPAIGNRECOGNITION table(
CAMPAIGNID uniqueidentifier,
AMOUNT money,
PERIODYEAR int,
SEQUENCE int
);
-- Handle grouping by quarter or year
if @GROUPBY <> 0
begin
with CTE_ALLOWEDRECOGNITION(REVENUESPLITID, AMOUNT, DATE, ID)
as(
--All recognitions of the appropriate type
select
RECOGNITIONS.REVENUESPLITID,
RECOGNITIONS.AMOUNT,
RECOGNITIONS.EFFECTIVEDATE,
RECOGNITIONS.ID
from dbo.UFN_RECOGNITIONCREDIT_GETRECOGNITIONS(1, @RECOGNITIONTYPEID, null) RECOGNITIONS
)
insert into @CAMPAIGNRECOGNITION(
CAMPAIGNID,
AMOUNT,
PERIODYEAR,
SEQUENCE
)
select
REVENUESPLITCAMPAIGN.CAMPAIGNID,
sum(coalesce(NONPLEDGEREGONITIION.AMOUNT,0))+sum(coalesce(PLEDGEREGONITIION.AMOUNT,0)),
PERIODS.PERIODYEAR,
PERIODS.SEQUENCE
from dbo.UFN_DESIGNATIONREPORT_GETPERIODS(@STARTDATE, @ENDDATE, @GROUPBY) PERIODS
cross join dbo.REVENUESPLITCAMPAIGN
left join ( --All the recognition that has been given on revenue that isn't a pledge or pledge payment
select
REVENUESPLIT.ID SPLITID,
REVENUERECOGNITION.AMOUNT,
REVENUERECOGNITION.DATE
from dbo.REVENUESPLIT
inner join dbo.REVENUE with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
inner join CTE_ALLOWEDRECOGNITION REVENUERECOGNITION on REVENUERECOGNITION.REVENUESPLITID = REVENUESPLIT.ID
where REVENUE.TRANSACTIONTYPECODE=0
and REVENUESPLIT.APPLICATIONCODE not in (2, 6, 7, 8)
) NONPLEDGEREGONITIION
on NONPLEDGEREGONITIION.SPLITID=REVENUESPLITCAMPAIGN.REVENUESPLITID
and NONPLEDGEREGONITIION.DATE >= PERIODS.STARTDATE
and NONPLEDGEREGONITIION.DATE <= PERIODS.ENDDATE
left join ( -- All the recognition that has been given on revenue that is a pledge or pledge payment.
-- Recognitions on pledge payments defer when there exists a recognition on that payment's pledge.
select distinct
coalesce(PLEDGERECOGNITION.ID,PAYMENTRECOGNITION.ID) as ID,
case when PLEDGERECOGNITION.AMOUNT is null then PAYMENTSPLIT.ID else PLEDGESPLIT.ID end SPLITID,
coalesce(PLEDGERECOGNITION.AMOUNT, PAYMENTRECOGNITION.AMOUNT,0) AMOUNT,
coalesce(PLEDGERECOGNITION.DATE, PAYMENTRECOGNITION.DATE) DATE
from dbo.REVENUESPLIT PLEDGESPLIT
inner join dbo.REVENUE PLEDGE with (nolock) on PLEDGE.ID = PLEDGESPLIT.REVENUEID
left join CTE_ALLOWEDRECOGNITION PLEDGERECOGNITION on PLEDGERECOGNITION.REVENUESPLITID = PLEDGESPLIT.ID
left join (
select
INSTALLMENTSPLITPAYMENT.PLEDGEID as PLEDGEID,
INSTALLMENTSPLITPAYMENT.PAYMENTID as PAYMENTID,
INSTALLMENTSPLIT.DESIGNATIONID as DESIGNATIONID
from dbo.INSTALLMENTSPLITPAYMENT
inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID=INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID
) INSTALLMENTS on INSTALLMENTS.PLEDGEID=PLEDGE.ID and INSTALLMENTS.DESIGNATIONID=PLEDGESPLIT.DESIGNATIONID
left join dbo.REVENUESPLIT PAYMENTSPLIT on PAYMENTSPLIT.ID=INSTALLMENTS.PAYMENTID
left join CTE_ALLOWEDRECOGNITION PAYMENTRECOGNITION on PAYMENTRECOGNITION.REVENUESPLITID=PAYMENTSPLIT.ID
-- Pledge or matching gift claim
where PLEDGE.TRANSACTIONTYPECODE in (1, 3, 4, 6)
) PLEDGEREGONITIION
on PLEDGEREGONITIION.SPLITID=REVENUESPLITCAMPAIGN.REVENUESPLITID
and PLEDGEREGONITIION.DATE >= PERIODS.STARTDATE
and PLEDGEREGONITIION.DATE <= PERIODS.ENDDATE
where @GROUPBY <> 0
group by
PERIODYEAR,
SEQUENCE,
REVENUESPLITCAMPAIGN.CAMPAIGNID
--Calculate the total recognition associated directly with the parent campaign.
declare @CAMPAIGNAMOUNT money
select @CAMPAIGNAMOUNT=sum(AMOUNT)
from @CAMPAIGNRECOGNITION
where CAMPAIGNID=@CAMPAIGNID
--Build result set.
select
case @GROUPBY
when 2 then 'Quarter'
when 3 then 'Year'
else '' end PARAMGROUPTYPE,
@PARAMGOALNAME PARAMGOALNAME,
@STARTDATE PARAMGOALSTARTDATE,
@ENDDATE PARAMGOALENDDATE,
@PARAMRECOGNITIONTYPENAME PARAMRECOGNITIONTYPENAME,
case @GROUPBY
when 2
then 'Q' + convert(nvarchar(10),PERIODS.SEQUENCE) + ', '
+ convert(nvarchar(10),PERIODS.PERIODYEAR)
when 3
then convert(nvarchar(10),PERIODS.PERIODYEAR)
else '' end PERIOD,
@CAMPAIGNID CAMPAIGNID,
PARENT.NAME CAMPAIGNNAME,
@CAMPAIGNGOAL CAMPAIGNGOAL,
@CAMPAIGNAMOUNT CAMPAIGNAMOUNT,
coalesce(PARENTRECOGNITION.AMOUNT,0) CAMPAIGNAMOUNTBYPERIOD,
CHILD.ID CHILDCAMPAIGNID,
CHILD.NAME CHILDCAMPAIGNNAME,
CAMPAIGNGOAL.AMOUNT CHILDCAMPAIGNGOAL,
sum(coalesce(DESCENDANTRECOGNITION.AMOUNT,0)) CHILDCAMPAIGNAMOUNT
from dbo.UFN_DESIGNATIONREPORT_GETPERIODS(@STARTDATE, @ENDDATE, @GROUPBY) PERIODS
cross join dbo.CAMPAIGN PARENT
left join @CAMPAIGNRECOGNITION PARENTRECOGNITION
on PARENTRECOGNITION.CAMPAIGNID=PARENT.ID
and (PARENTRECOGNITION.PERIODYEAR = PERIODS.PERIODYEAR)
and (PARENTRECOGNITION.SEQUENCE = PERIODS.SEQUENCE)
left join dbo.CAMPAIGN CHILD on CHILD.HIERARCHYPATH.GetAncestor(1) = PARENT.HIERARCHYPATH
left join dbo.CAMPAIGNGOAL
on CAMPAIGNGOAL.CAMPAIGNID=CHILD.ID and CAMPAIGNGOAL.CAMPAIGNHIERARCHYGOALID=@GOALID
left join dbo.CAMPAIGN DESCENDANT on DESCENDANT.HIERARCHYPATH.IsDescendantOf(CHILD.HIERARCHYPATH) = 1
left join @CAMPAIGNRECOGNITION DESCENDANTRECOGNITION
on DESCENDANTRECOGNITION.CAMPAIGNID=DESCENDANT.ID
and (DESCENDANTRECOGNITION.PERIODYEAR = PERIODS.PERIODYEAR)
and (DESCENDANTRECOGNITION.SEQUENCE = PERIODS.SEQUENCE)
where PARENT.ID=@CAMPAIGNID
group by
PERIODS.PERIODYEAR,
PERIODS.SEQUENCE,
CHILD.ID,
CHILD.NAME,
CAMPAIGNGOAL.AMOUNT,
PARENT.NAME,
PARENTRECOGNITION.AMOUNT
order by
PERIODS.PERIODYEAR,
PERIODS.SEQUENCE,
CHILD.NAME;
end
else
begin
with CTE_ALLOWEDRECOGNITION(REVENUESPLITID, AMOUNT, DATE, ID)
as(
--All recognitions of the appropriate type
select
RECOGNITIONS.REVENUESPLITID,
RECOGNITIONS.AMOUNT,
RECOGNITIONS.EFFECTIVEDATE,
RECOGNITIONS.ID
from dbo.UFN_RECOGNITIONCREDIT_GETRECOGNITIONS(1, @RECOGNITIONTYPEID, null) RECOGNITIONS
)
insert into @CAMPAIGNRECOGNITION(
CAMPAIGNID,
AMOUNT,
PERIODYEAR,
SEQUENCE
)
select
REVENUESPLITCAMPAIGN.CAMPAIGNID,
sum(coalesce(NONPLEDGEREGONITIION.AMOUNT,0))+sum(coalesce(PLEDGEREGONITIION.AMOUNT,0)),
0 as PERIODYEAR,
0 as SEQUENCE
from dbo.REVENUESPLITCAMPAIGN
left join ( --All the recognition that has been given on revenue that isn't a pledge, grant award, planned gift payment, matching gift payment, grant award payment, or pledge payment
select
REVENUESPLIT.ID SPLITID,
REVENUERECOGNITION.AMOUNT,
REVENUERECOGNITION.DATE
from dbo.REVENUESPLIT
inner join dbo.REVENUE with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
inner join CTE_ALLOWEDRECOGNITION REVENUERECOGNITION on REVENUERECOGNITION.REVENUESPLITID = REVENUESPLIT.ID
where REVENUE.TRANSACTIONTYPECODE=0
and REVENUESPLIT.APPLICATIONCODE not in (2, 6, 7, 8)
) NONPLEDGEREGONITIION
on NONPLEDGEREGONITIION.SPLITID=REVENUESPLITCAMPAIGN.REVENUESPLITID
and NONPLEDGEREGONITIION.DATE >= @STARTDATE
and NONPLEDGEREGONITIION.DATE <= @ENDDATE
left join ( --All the recognition that has been given on revenue that is a pledge or pledge payment.
-- Recognitions on pledge payments defer when there exists a recognition on that payment's pledge.
select distinct
coalesce(PLEDGERECOGNITION.ID,PAYMENTRECOGNITION.ID) as ID,
case when PLEDGERECOGNITION.AMOUNT is null then PAYMENTSPLIT.ID else PLEDGESPLIT.ID end SPLITID,
coalesce(PLEDGERECOGNITION.AMOUNT, PAYMENTRECOGNITION.AMOUNT,0) AMOUNT,
coalesce(PLEDGERECOGNITION.DATE, PAYMENTRECOGNITION.DATE) DATE
from dbo.REVENUESPLIT PLEDGESPLIT
inner join dbo.REVENUE PLEDGE with (nolock) on PLEDGE.ID = PLEDGESPLIT.REVENUEID
left join CTE_ALLOWEDRECOGNITION PLEDGERECOGNITION on PLEDGERECOGNITION.REVENUESPLITID = PLEDGESPLIT.ID
left join (
select
INSTALLMENTSPLITPAYMENT.PLEDGEID as PLEDGEID,
INSTALLMENTSPLITPAYMENT.PAYMENTID as PAYMENTID,
INSTALLMENTSPLIT.DESIGNATIONID as DESIGNATIONID
from dbo.INSTALLMENTSPLITPAYMENT
inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID=INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID
) INSTALLMENTS on INSTALLMENTS.PLEDGEID=PLEDGE.ID and INSTALLMENTS.DESIGNATIONID=PLEDGESPLIT.DESIGNATIONID
left join dbo.REVENUESPLIT PAYMENTSPLIT on PAYMENTSPLIT.ID=INSTALLMENTS.PAYMENTID
left join CTE_ALLOWEDRECOGNITION PAYMENTRECOGNITION on PAYMENTRECOGNITION.REVENUESPLITID=PAYMENTSPLIT.ID
where PLEDGE.TRANSACTIONTYPECODE in (1, 3, 4, 6)
) PLEDGEREGONITIION
on PLEDGEREGONITIION.SPLITID=REVENUESPLITCAMPAIGN.REVENUESPLITID
and PLEDGEREGONITIION.DATE >= @STARTDATE
and PLEDGEREGONITIION.DATE <= @ENDDATE
where @GROUPBY = 0
group by
REVENUESPLITCAMPAIGN.CAMPAIGNID
--Calculate the total recognition associated directly with the parent campaign.
declare @CAMPAIGNAMOUNTNOGROUPING money
select @CAMPAIGNAMOUNTNOGROUPING=sum(AMOUNT)
from @CAMPAIGNRECOGNITION
where CAMPAIGNID=@CAMPAIGNID
--Build result set.
select
'None' as PARAMGROUPTYPE,
@PARAMGOALNAME PARAMGOALNAME,
@STARTDATE PARAMGOALSTARTDATE,
@ENDDATE PARAMGOALENDDATE,
@PARAMRECOGNITIONTYPENAME PARAMRECOGNITIONTYPENAME,
'' as PERIOD,
@CAMPAIGNID CAMPAIGNID,
PARENT.NAME CAMPAIGNNAME,
@CAMPAIGNGOAL CAMPAIGNGOAL,
@CAMPAIGNAMOUNTNOGROUPING CAMPAIGNAMOUNT,
coalesce(PARENTRECOGNITION.AMOUNT,0) CAMPAIGNAMOUNTBYPERIOD,
CHILD.ID CHILDCAMPAIGNID,
CHILD.NAME CHILDCAMPAIGNNAME,
CAMPAIGNGOAL.AMOUNT CHILDCAMPAIGNGOAL,
sum(coalesce(DESCENDANTRECOGNITION.AMOUNT,0)) CHILDCAMPAIGNAMOUNT
from dbo.CAMPAIGN PARENT
left join @CAMPAIGNRECOGNITION PARENTRECOGNITION
on PARENTRECOGNITION.CAMPAIGNID=PARENT.ID
left join dbo.CAMPAIGN CHILD on CHILD.HIERARCHYPATH.GetAncestor(1) = PARENT.HIERARCHYPATH
left join dbo.CAMPAIGNGOAL
on CAMPAIGNGOAL.CAMPAIGNID=CHILD.ID and CAMPAIGNGOAL.CAMPAIGNHIERARCHYGOALID=@GOALID
left join dbo.CAMPAIGN DESCENDANT on DESCENDANT.HIERARCHYPATH.IsDescendantOf(CHILD.HIERARCHYPATH) = 1
left join @CAMPAIGNRECOGNITION DESCENDANTRECOGNITION
on DESCENDANTRECOGNITION.CAMPAIGNID=DESCENDANT.ID
where PARENT.ID=@CAMPAIGNID
group by
CHILD.ID,
CHILD.NAME,
CAMPAIGNGOAL.AMOUNT,
PARENT.NAME,
PARENTRECOGNITION.AMOUNT
order by
CHILD.NAME;
end