UFN_FEPSUBMITPROCESS_GETDATA

This function retrieves the data to be sent by the fundraising effectiveness project submit process

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@TYPE tinyint IN
@PERIOD1STARTDATE datetime IN
@PERIOD1ENDDATE datetime IN
@PERIOD2STARTDATE datetime IN
@PERIOD2ENDDATE datetime IN
@SITEID uniqueidentifier IN

Definition

Copy


CREATE function dbo.UFN_FEPSUBMITPROCESS_GETDATA
(
    @TYPE tinyint,
    @PERIOD1STARTDATE datetime,
    @PERIOD1ENDDATE datetime,
    @PERIOD2STARTDATE datetime,
    @PERIOD2ENDDATE datetime,
    @SITEID uniqueidentifier
)
returns @RESULTS table(
    SEQUENCE integer,
    CATEGORY nvarchar(50),
    PERIOD1NUMDONORS integer default 0,
    PERIOD1AMOUNT money default 0.00,
    PERIOD2NUMDONORS integer default 0,
    PERIOD2AMOUNT money default 0.00,
    GAINSLOSSES money default 0.00,
    GAINSLOSSESPERCENT decimal(7,2) default 0.00
)
with execute as caller
as begin

    -- @TYPE 

    --        0 - All constituents

    --        1 - Individuals only

    --        2 - Organizations only


    declare @REVENUE table(
        REVENUEID uniqueidentifier,
        CONSTITUENTID uniqueidentifier,
        AMOUNT money,
        DATE datetime
    )
    insert into @REVENUE
        select
            REVENUE.ID,
            REVENUE.CONSTITUENTID,
            sum(REVENUESPLIT.AMOUNT) [AMOUNT],
            REVENUE.DATE            
        from dbo.REVENUE
        inner join dbo.REVENUESPLIT 
            on REVENUE.ID = REVENUESPLIT.REVENUEID
        inner join dbo.CONSTITUENT
            on REVENUE.CONSTITUENTID = CONSTITUENT.ID
        where REVENUE.TRANSACTIONTYPECODE = 0            -- all donations, regardless of application type

            and REVENUE.DATE <= @PERIOD2ENDDATE
            and 
            (
                @TYPE = 0
                or
                (@TYPE = 1 and CONSTITUENT.ISORGANIZATION = 0)
                or
                (@TYPE = 2 and CONSTITUENT.ISORGANIZATION = 1)
            )
            and (@SITEID is null or @SITEID = dbo.UFN_SITEID_MAPFROM_DESIGNATIONID(REVENUESPLIT.DESIGNATIONID))

        group by REVENUE.ID, REVENUE.CONSTITUENTID, REVENUE.TRANSACTIONTYPECODE, REVENUE.DATE;

    declare @REVENUE_PRIOR table(
        REVENUEID uniqueidentifier,
        CONSTITUENTID uniqueidentifier,
        AMOUNT money,
        DATE datetime
    )
    insert into @REVENUE_PRIOR
        select *
        from @REVENUE
        where DATE < @PERIOD1STARTDATE;

    declare @REVENUE_PERIOD1 table(
        REVENUEID uniqueidentifier,
        CONSTITUENTID uniqueidentifier,
        AMOUNT money,
        DATE datetime
    )
    insert into @REVENUE_PERIOD1
        select *
        from @REVENUE
        where DATE between @PERIOD1STARTDATE and @PERIOD1ENDDATE

    declare @REVENUE_PERIOD2 table(
        REVENUEID uniqueidentifier,
        CONSTITUENTID uniqueidentifier,
        AMOUNT money,
        DATE datetime
    )
    insert into @REVENUE_PERIOD2
        select *
        from @REVENUE
        where DATE between @PERIOD2STARTDATE and @PERIOD2ENDDATE

    -- New

    insert into @RESULTS (SEQUENCE, CATEGORY, PERIOD2NUMDONORS, PERIOD2AMOUNT)
        select
            1,
            'New',
            count(Distinct CONSTITUENTID),
            coalesce(sum(AMOUNT), 0)
        from @REVENUE_PERIOD2 period2
        where not exists (select CONSTITUENTID from @REVENUE_PERIOD1 period1 where period1.CONSTITUENTID = period2.CONSTITUENTID)
            and not exists (select CONSTITUENTID from @REVENUE_PRIOR prior where prior.CONSTITUENTID = period2.CONSTITUENTID);

        -- update New row with new donors for period 1        

        declare @PERIOD1NUMDONORS_New integer;
        declare @PERIOD1AMOUNT_New money;

        select
            @PERIOD1NUMDONORS_New = count(distinct CONSTITUENTID),
            @PERIOD1AMOUNT_New = coalesce(sum(AMOUNT), 0)
        from @REVENUE_PERIOD1 period1
        where not exists (select CONSTITUENTID from @REVENUE_PRIOR prior where prior.CONSTITUENTID = period1.CONSTITUENTID); 

        update @RESULTS set
            PERIOD1NUMDONORS = @PERIOD1NUMDONORS_New,
            PERIOD1AMOUNT = @PERIOD1AMOUNT_New;


    -- Recapture

    insert into @RESULTS (SEQUENCE, CATEGORY, PERIOD2NUMDONORS, PERIOD2AMOUNT)
        select
            2,
            'Recaptured',
            count(Distinct CONSTITUENTID),
            coalesce(sum(AMOUNT), 0)
        from @REVENUE_PERIOD2 period2
        where not exists (select CONSTITUENTID from @REVENUE_PERIOD1 period1 where period1.CONSTITUENTID = period2.CONSTITUENTID)
            and exists (select CONSTITUENTID from @REVENUE_PRIOR prior where prior.CONSTITUENTID = period2.CONSTITUENTID);

    -- Create temp tables for calculating Same, Upgrades and Downgrades

    declare @TEMP_PERIOD1 table(
        CONSTITUENTID uniqueidentifier,
        AMOUNT money
    )

    insert into @TEMP_PERIOD1 (CONSTITUENTID, AMOUNT)
        select
            CONSTITUENTID,
            coalesce(sum(AMOUNT), 0)
        from @REVENUE_PERIOD1 period1
        where exists (select CONSTITUENTID from @REVENUE_PERIOD2 period2 where period2.CONSTITUENTID = period1.CONSTITUENTID)
        group by CONSTITUENTID;

    declare @TEMP_PERIOD2 table(
        CONSTITUENTID uniqueidentifier,
        AMOUNT money
    )    

    insert into @TEMP_PERIOD2 (CONSTITUENTID, AMOUNT)
        select
            CONSTITUENTID,
            coalesce(sum(AMOUNT), 0)
        from @REVENUE_PERIOD2 period2
        where exists (select CONSTITUENTID from @REVENUE_PERIOD1 period1 where period1.CONSTITUENTID = period2.CONSTITUENTID)
        group by CONSTITUENTID;

    -- Upgrade

        insert into @RESULTS (SEQUENCE, CATEGORY, PERIOD1NUMDONORS, PERIOD1AMOUNT, PERIOD2NUMDONORS, PERIOD2AMOUNT)
            select
                3,
                'Upgraded',
                count(Distinct period1.CONSTITUENTID),
                coalesce(sum(period1.AMOUNT), 0),
                count(Distinct period2.CONSTITUENTID),
                coalesce(sum(period2.AMOUNT), 0)
            from @TEMP_PERIOD1 period1
            inner join @TEMP_PERIOD2 period2
                on period1.CONSTITUENTID = period2.CONSTITUENTID
            where period1.AMOUNT < period2.AMOUNT;

    -- Same

    insert into @RESULTS (SEQUENCE, CATEGORY, PERIOD1NUMDONORS, PERIOD1AMOUNT, PERIOD2NUMDONORS, PERIOD2AMOUNT)
        select
            4,
            'Same',
            count(Distinct period1.CONSTITUENTID),
            coalesce(sum(period1.AMOUNT), 0),
            count(Distinct period2.CONSTITUENTID),
            coalesce(sum(period2.AMOUNT), 0)
        from @TEMP_PERIOD1 period1
        inner join @TEMP_PERIOD2 period2
            on period1.CONSTITUENTID = period2.CONSTITUENTID
        where period1.AMOUNT = period2.AMOUNT;

    -- Downgrade

    insert into @RESULTS (SEQUENCE, CATEGORY, PERIOD1NUMDONORS, PERIOD1AMOUNT, PERIOD2NUMDONORS, PERIOD2AMOUNT)
        select
            5,
            'Downgraded',
            count(Distinct period1.CONSTITUENTID),
            coalesce(sum(period1.AMOUNT), 0),
            count(Distinct period2.CONSTITUENTID),
            coalesce(sum(period2.AMOUNT), 0)
        from @TEMP_PERIOD1 period1
        inner join @TEMP_PERIOD2 period2
            on period1.CONSTITUENTID = period2.CONSTITUENTID
        where period1.AMOUNT > period2.AMOUNT;

    -- Lapsed new

    insert into @RESULTS (SEQUENCE, CATEGORY, PERIOD1NUMDONORS, PERIOD1AMOUNT)
        select
            6,
            'Lapsed new',
            count(Distinct CONSTITUENTID),
            coalesce(sum(AMOUNT), 0)
        from @REVENUE_PERIOD1 period1
        where not exists (select CONSTITUENTID from @REVENUE_PRIOR prior where prior.CONSTITUENTID = period1.CONSTITUENTID)
            and not exists (select CONSTITUENTID from @REVENUE_PERIOD2 period2 where period2.CONSTITUENTID = period1.CONSTITUENTID)

    -- Lapsed repeat

    insert into @RESULTS (SEQUENCE, CATEGORY, PERIOD1NUMDONORS, PERIOD1AMOUNT)
        select
            7,
            'Lapsed repeat',
            count(Distinct CONSTITUENTID),
            coalesce(sum(AMOUNT), 0)
        from @REVENUE_PERIOD1 period1
        where exists (select CONSTITUENTID from @REVENUE_PRIOR prior where prior.CONSTITUENTID = period1.CONSTITUENTID)
            and not exists (select CONSTITUENTID from @REVENUE_PERIOD2 period2 where period2.CONSTITUENTID = period1.CONSTITUENTID)

    -- Delete rows with no values

    delete @RESULTS where PERIOD1NUMDONORS = 0 and PERIOD2NUMDONORS = 0;

    -- Total

    if exists (select CATEGORY from @RESULTS)
        begin
            insert into @RESULTS (SEQUENCE, CATEGORY, PERIOD1NUMDONORS, PERIOD1AMOUNT, PERIOD2NUMDONORS, PERIOD2AMOUNT, GAINSLOSSES)
                select
                    8,
                    'Total',
                    sum(PERIOD1NUMDONORS),
                    sum(PERIOD1AMOUNT),
                    sum(PERIOD2NUMDONORS),
                    sum(PERIOD2AMOUNT),
                    sum(GAINSLOSSES)
                from @RESULTS

            -- Update results table to include Gains/Losses

            update @RESULTS set
                GAINSLOSSES = PERIOD2AMOUNT - PERIOD1AMOUNT

            update @RESULTS set
                GAINSLOSSESPERCENT = 
                        case
                            when PERIOD1AMOUNT = 0 then 1.00
                            else GAINSLOSSES / PERIOD1AMOUNT
                        end
                where GAINSLOSSES <> 0
        end

    return;
end