UFN_PARTICIPANT_DONOR_RETENTION

returns donors retention for a given participant

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID uniqueidentifier IN
@EVENTID uniqueidentifier IN

Definition

Copy


create function dbo.UFN_PARTICIPANT_DONOR_RETENTION
(
    @CONSTITUENTID uniqueidentifier,
    @EVENTID uniqueidentifier
)
returns @ret table
(
    RetainedDonorCount int,
    RetentionRate float
)
as
begin
    DECLARE @PREVIOUSEVENTID uniqueidentifier
    DECLARE @TEAMID uniqueidentifier
    DECLARE @PREVIOUSTEAMID uniqueidentifier
    DECLARE @TEAMCONSTITUENTID uniqueidentifier
    DECLARE @PREVIOUSTEAMCONSTITUENTID uniqueidentifier
    DECLARE @RETAINEDDONORCOUNT int = 0
    DECLARE @PRIORDONORCOUNT int = 0
    DECLARE @ISTEAMLEADER bit
    DECLARE @ISPREVIOUSTEAMLEADER bit

    SELECT @PREVIOUSEVENTID = PRIORYEAREVENTID from dbo.EVENTEXTENSION (NOLOCK) WHERE EVENTID = @EVENTID;  

    IF @PREVIOUSEVENTID IS NOT NULL  
    BEGIN  
        SELECT @TEAMID = TEAMID from dbo.UFN_FAF_GETTEAMINFO_BY_REGISTRANT(@CONSTITUENTID, @EVENTID);  
        SELECT @TEAMCONSTITUENTID = TEAMCONSTITUENTID from TEAMEXTENSION (nolock) where TEAMFUNDRAISINGTEAMID = @TEAMID  
        IF EXISTS(SELECT 1 FROM dbo.TEAMFUNDRAISINGTEAMCAPTAIN WHERE CONSTITUENTID = @CONSTITUENTID AND TEAMFUNDRAISINGTEAMID = @TEAMID)  
            SET @ISTEAMLEADER = 1

        SELECT @PREVIOUSTEAMID = TEAMID from dbo.UFN_FAF_GETTEAMINFO_BY_REGISTRANT(@CONSTITUENTID, @PREVIOUSEVENTID);  
        SELECT @PREVIOUSTEAMCONSTITUENTID = TEAMCONSTITUENTID from TEAMEXTENSION (nolock) where TEAMFUNDRAISINGTEAMID = @PREVIOUSTEAMID;  
        IF EXISTS(SELECT 1 FROM dbo.TEAMFUNDRAISINGTEAMCAPTAIN WHERE CONSTITUENTID = @CONSTITUENTID AND TEAMFUNDRAISINGTEAMID = @PREVIOUSTEAMID)  
            SET @ISPREVIOUSTEAMLEADER = 1  

        DECLARE @PREVDONORS as table([CONSTITUENTID]    uniqueidentifier)
        DECLARE @CURRDONORS as table([CONSTITUENTID]    uniqueidentifier)

        insert @PREVDONORS 
        select CONSTITUENTID from [dbo].[UFN_FAFEVENT_PARTICIPANTDONORS](@PREVIOUSEVENTID, @CONSTITUENTID
        union 
        select CONSTITUENTID FROM [dbo].[UFN_FAFEVENT_PARTICIPANTDONORS](@PREVIOUSEVENTID, @PREVIOUSTEAMCONSTITUENTID)
        where @PREVIOUSTEAMCONSTITUENTID IS NOT NULL AND ISNULL(@ISPREVIOUSTEAMLEADER, 0) = 1

        insert @CURRDONORS 
        select CONSTITUENTID from [dbo].[UFN_FAFEVENT_PARTICIPANTDONORS](@EVENTID, @CONSTITUENTID
        union 
        select CONSTITUENTID FROM [dbo].[UFN_FAFEVENT_PARTICIPANTDONORS](@EVENTID, @TEAMCONSTITUENTID)
        where @TEAMCONSTITUENTID IS NOT NULL AND ISNULL(@ISTEAMLEADER, 0) = 1

        select @PRIORDONORCOUNT = COUNT(*) from @PREVDONORS  

        select @RETAINEDDONORCOUNT = COUNT(*)
        from @CURRDONORS C
        inner join @PREVDONORS P on P.CONSTITUENTID = C.CONSTITUENTID    
    END

    insert @ret (RetainedDonorCount, RetentionRate)
    values (@RETAINEDDONORCOUNT,
            case when @PRIORDONORCOUNT > 0 then cast(@RETAINEDDONORCOUNT as float)/cast(@PRIORDONORCOUNT as float) else 0 end)

    return
end