USP_KPI_REVENUEGROWTH

Parameters

Parameter Parameter Type Mode Description
@VALUE decimal(19, 2) INOUT
@ASOFDATE datetime IN
@CAMPAIGNID uniqueidentifier IN
@DESIGNATIONID uniqueidentifier IN
@YEARTYPE tinyint IN
@COMPARISONPERIODTYPECODE tinyint IN

Definition

Copy


CREATE procedure dbo.USP_KPI_REVENUEGROWTH
(
    @VALUE decimal(19, 2) output
    @ASOFDATE datetime,
    @CAMPAIGNID uniqueidentifier,
    @DESIGNATIONID uniqueidentifier,
    @YEARTYPE tinyint = 0,
    @COMPARISONPERIODTYPECODE tinyint = 1
)
as
    set nocount on;

    declare @PREVIOUSFROMDATE datetime;
    declare @PREVIOUSTODATE datetime;
    declare @THISFROMDATE datetime;
    declare @THISTODATE datetime = @ASOFDATE;

    -- this year to date versus prior year total

    if @COMPARISONPERIODTYPECODE = 0
    begin
        if @YEARTYPE = 0
        begin
            exec dbo.USP_RESOLVEDATEFILTER 16, @THISFROMDATE output, null, @ASOFDATE;
            exec dbo.USP_RESOLVEDATEFILTER 17, @PREVIOUSFROMDATE output, @PREVIOUSTODATE output, @ASOFDATE;
        end else 
        begin
            exec dbo.USP_RESOLVEDATEFILTER 11, @THISFROMDATE output, null, @ASOFDATE;
            exec dbo.USP_RESOLVEDATEFILTER 12, @PREVIOUSFROMDATE output, @PREVIOUSTODATE output, @ASOFDATE;
        end
    end

    -- this year to date versus prior year to same date

    if @COMPARISONPERIODTYPECODE = 1
    begin
        if @YEARTYPE = 0
            exec dbo.USP_RESOLVEDATEFILTER 16, @THISFROMDATE output, null, @ASOFDATE;
        else
            exec dbo.USP_RESOLVEDATEFILTER 11, @THISFROMDATE output, null, @ASOFDATE;

        set @PREVIOUSFROMDATE = dateadd(year, -1, @THISFROMDATE);
        set @PREVIOUSTODATE = dateadd(year, -1, @ASOFDATE);
    end

    -- last 12 months to 12 months prior to that

    if @COMPARISONPERIODTYPECODE = 2
    begin
        exec dbo.USP_RESOLVEDATEFILTER 9, @THISFROMDATE output, @THISTODATE output, @ASOFDATE;
        set @PREVIOUSFROMDATE = dateadd(year,-1,@THISFROMDATE);
        set @PREVIOUSTODATE = dateadd(year,-1,@THISTODATE);
    end

    declare @CAMPAIGNHIERARCHYPATH hierarchyid;
    select 
        @CAMPAIGNHIERARCHYPATH=HIERARCHYPATH
    from dbo.CAMPAIGN
        where CAMPAIGN.ID = @CAMPAIGNID;

    declare @PREVIOUSPERIODSUM money;
    declare @THISPERIODSUM money;

    with REVENUE_CTE as
    (
        select
            REVENUE.ID,
            REVENUE.CONSTITUENTID,
            sum(REVENUESPLIT.ORGANIZATIONAMOUNT) [AMOUNT],
            REVENUE.DATE
        from
            dbo.REVENUE
        inner join
            dbo.REVENUESPLIT on REVENUE.ID = REVENUESPLIT.REVENUEID
        where
            (
                (REVENUE.TRANSACTIONTYPECODE = 1) --Pledge

                or 
                (REVENUE.TRANSACTIONTYPECODE = 0 and (REVENUESPLIT.APPLICATIONCODE in (0, 3) or (REVENUESPLIT.APPLICATIONCODE = 1 and REVENUESPLIT.TYPECODE = 0))) --Payment (Gift and Recurring Gift)

            )    
        and
            (
                (@DESIGNATIONID is null)
                or 
                exists (
                    select top(1)
                        REVENUESPLIT.ID 
                    from 
                        dbo.REVENUESPLIT 
                    where 
                        REVENUESPLIT.REVENUEID = REVENUE.ID 
                    and 
                        REVENUESPLIT.DESIGNATIONID = @DESIGNATIONID
                )            
            )
        and
            (
                (@CAMPAIGNID is null)
                or 
                exists (
                    select top(1)
                        REVENUESPLITCAMPAIGN.ID
                    from 
                        dbo.REVENUESPLITCAMPAIGN 
                    inner join 
                        CAMPAIGN on CAMPAIGN.ID = REVENUESPLITCAMPAIGN.CAMPAIGNID 
                    inner join 
                        REVENUESPLIT on REVENUESPLIT.ID = REVENUESPLITCAMPAIGN.REVENUESPLITID
                    where 
                        REVENUESPLIT.REVENUEID = REVENUE.ID 
                    and 
                        CAMPAIGN.HIERARCHYPATH.IsDescendantOf(@CAMPAIGNHIERARCHYPATH)=1
                )
            )
        group by
            REVENUE.ID, REVENUE.CONSTITUENTID, REVENUE.TRANSACTIONTYPECODE, REVENUE.DATE
    )
    select
        @THISPERIODSUM = sum(
                case 
                    when REVENUE_CTE.DATE between @THISFROMDATE and @THISTODATE then REVENUE_CTE.AMOUNT
                    else 0
                end
        ),
        @PREVIOUSPERIODSUM = sum(
                case
                    when REVENUE_CTE.DATE between @PREVIOUSFROMDATE and @PREVIOUSTODATE then REVENUE_CTE.AMOUNT
                    else 0
                end
        )
    from
        REVENUE_CTE

    set @PREVIOUSPERIODSUM = coalesce(@PREVIOUSPERIODSUM, 0);
    set @THISPERIODSUM = coalesce(@THISPERIODSUM, 0);

    -- handle divide by zero

    if @PREVIOUSPERIODSUM = 0
        if @THISPERIODSUM = 0
            set @VALUE = 0;
        else
            set @VALUE = 1;
    else
        set @VALUE = (@THISPERIODSUM - @PREVIOUSPERIODSUM) / @PREVIOUSPERIODSUM;