UFN_VOLUNTEER_JOBOCCURRENCE_GETMATCH

Returns match percentage for a given volunteer and job occurrence

Return

Return Type
int

Parameters

Parameter Parameter Type Mode Description
@VOLUNTEERID uniqueidentifier IN
@JOBOCCURRENCEID uniqueidentifier IN
@STARTDATE date IN
@ENDDATE date IN

Definition

Copy


CREATE function dbo.UFN_VOLUNTEER_JOBOCCURRENCE_GETMATCH
(
    @VOLUNTEERID uniqueidentifier,
    @JOBOCCURRENCEID uniqueidentifier,
    @STARTDATE date,
    @ENDDATE date
)
returns integer

as begin
    declare @TRAITPERCENT int;
    declare @TRAITCOUNT numeric(13,2);
    declare @DAYCOUNT numeric(13,2);
    declare @TODAY datetime;
    declare @REQUIREDTRAITCOUNT int = 0;
    declare @DAYLIST nvarchar(max) = '';

    declare    @LOCATIONID uniqueidentifier;
    declare    @VOLUNTEERTYPEID uniqueidentifier;
    declare    @JOBID uniqueidentifier;

    /* CONSTANTS FOR WEIGHTING */
    select @TRAITPERCENT  = 100;

    /*CONSTANTS FOR MATCHING*/
    set @TODAY = dbo.UFN_DATE_GETEARLIESTTIME(getdate());
    select 
        @TRAITCOUNT = count(*),
        @REQUIREDTRAITCOUNT = coalesce(sum(case when ISREQUIRED = 1 then 1 else 0 end), 0)
    from 
        dbo.[UFN_JOBOCCURRENCE_TRAITIDS](@JOBOCCURRENCEID
    where 
        TRAITTYPEID <> 7 --exclude special needs


    select 
        @DAYLIST = stuff((select convert(varchar, DATEADD(d,NUM,@STARTDATE), 112
            from 
                dbo.NUMBERS 
            where 
                DATEADD(d,NUM,@STARTDATE) <= @ENDDATE
            for xml path(''), type).value('.', 'nvarchar(max)'), 1, 0, '')

    set @DAYCOUNT = len(@DAYLIST) / 8;

    select  
        @LOCATIONID = LOCATIONCODEID,
        @VOLUNTEERTYPEID = VOLUNTEERTYPEID,
        @JOBID = JOB.ID
    from dbo.JOBOCCURRENCE 
    inner join dbo.JOB
        on dbo.JOBOCCURRENCE.JOBID = dbo.JOB.ID
    where JOBOCCURRENCE.ID = @JOBOCCURRENCEID

    declare @AVAILABLE bit = 0
    select 
        @AVAILABLE = (case when AVAILABLE.VOLUNTEERID is null then 0 else 1 end)
    from dbo.UFN_JOBOCCURRENCE_SCHEDULE(@STARTDATE, @ENDDATE, @JOBOCCURRENCEID, null) SCHEDULE
    inner join dbo.JOBOCCURRENCE 
        on JOBOCCURRENCE.ID = @JOBOCCURRENCEID
    inner join dbo.[UFN_VOLUNTEER_AVAILABLESPECIFICDAYS](@DAYLIST, @VOLUNTEERID, 1) AVAILABLE
        on AVAILABLE.AVAILABLEDATE = SCHEDULE.ASSIGNMENTDATE
    left outer join dbo.VOLUNTEERVOLUNTEERTYPE VOLTYPE
        on AVAILABLE.VOLUNTEERID = VOLTYPE.VOLUNTEERID AND VOLTYPE.STATUSCODE = 1
    left outer join    dbo.VOLUNTEERVOLUNTEERLOCATION
        on AVAILABLE.VOLUNTEERID = VOLUNTEERVOLUNTEERLOCATION.VOLUNTEERID
    left outer join (
        select 
            OCCURRENCEID,
            VOLUNTEERASSIGNMENT.DATE,
            VOLUNTEERASSIGNMENT.VOLUNTEERID,
            JOBSTARTTIME,
            JOBENDTIME  
        from dbo.VOLUNTEERASSIGNMENT 
        outer apply dbo.UFN_JOBOCCURRENCE_SCHEDULE(@STARTDATE, @ENDDATE, VOLUNTEERASSIGNMENT.JOBOCCURRENCEID, null)) as ASSIGNEDJOB 
            on ASSIGNEDJOB.VOLUNTEERID = AVAILABLE.VOLUNTEERID
                and ASSIGNEDJOB.DATE = SCHEDULE.ASSIGNMENTDATE
                and ((ASSIGNEDJOB.JOBSTARTTIME between JOBOCCURRENCE.STARTTIME and JOBOCCURRENCE.ENDTIME)
                or (ASSIGNEDJOB.JOBENDTIME between JOBOCCURRENCE.STARTTIME and JOBOCCURRENCE.ENDTIME)
                or ASSIGNEDJOB.JOBSTARTTIME = '' or ASSIGNEDJOB.JOBENDTIME = ''
                or JOBOCCURRENCE.STARTTIME = '' or JOBOCCURRENCE.ENDTIME  = '')
    where
        (@VOLUNTEERTYPEID is null or VOLTYPE.VOLUNTEERTYPEID = @VOLUNTEERTYPEID) and
        (AVAILABLE.STARTTIME <= JOBOCCURRENCE.STARTTIME or JOBOCCURRENCE.STARTTIME = '') and
        (AVAILABLE.ENDTIME >= JOBOCCURRENCE.ENDTIME or AVAILABLE.ENDTIME = '') and
        (@LOCATIONID is null -- no location

            or VOLUNTEERVOLUNTEERLOCATION.ID is null --none

            or VOLUNTEERVOLUNTEERLOCATION.VOLUNTEERLOCATIONCODEID = @LOCATIONID)
    group by AVAILABLE.VOLUNTEERID, SCHEDULE.ASSIGNMENTDATE 
    having max(case when ASSIGNEDJOB.OCCURRENCEID is null or ASSIGNEDJOB.OCCURRENCEID = @JOBOCCURRENCEID then 0 else 1 end) = 0;

    /* volunteer not available when special needs are not met. */
    if exists (
        select VSN.VOLUNTEERID
        from VOLUNTEERSPECIALNEED VSN
        left outer join dbo.JOBSPECIALNEED JSN
            on JSN.JOBID = @JOBID and JSN.SPECIALNEEDCODEID = VSN.SPECIALNEEDCODEID
        where JSN.ID is null and VSN.VOLUNTEERID = @VOLUNTEERID)
        set @AVAILABLE = 0

    declare @MATCH integer = 0;

    if @AVAILABLE = 1
    begin
        declare @TRAITS table
        (
            VOLUNTEERID uniqueidentifier, 
            TRAITWEIGHT int
            REQUIREDTRAITCOUNT int
        )

        /*FIND TRAITS*/
        insert into @TRAITS
        select    
            @VOLUNTEERID,
            round(CASE when @TRAITCOUNT = 0 
                then 1
                else
                    sum(case when coalesce(
                                VOLUNTEERADMINISTRATIVE.ID,
                                VOLUNTEERCERTIFICATION.ID,
                                VOLUNTEERCOURSE.ID,
                                VOLUNTEERINTEREST.ID,
                                VOLUNTEERLICENSE.ID,
                                VOLUNTEERMEDICAL.ID,
                                VOLUNTEERSKILLLEVEL.ID) is null then 0 else 1 end)
                    /@TRAITCOUNT 
                end * @TRAITPERCENT, 0)
                as TRAITWEIGHT,
                sum(case 
                        when ISREQUIRED = 0 then 0
                        else case when coalesce(
                                VOLUNTEERADMINISTRATIVE.ID,
                                VOLUNTEERCERTIFICATION.ID,
                                VOLUNTEERCOURSE.ID,
                                VOLUNTEERINTEREST.ID,
                                VOLUNTEERLICENSE.ID,
                                VOLUNTEERMEDICAL.ID,
                                VOLUNTEERSKILLLEVEL.ID) is null then 0 else 1 end
                    end) REQUIREDTRAITCOUNT
        from dbo.[UFN_JOBOCCURRENCE_TRAITIDS](@JOBOCCURRENCEID) JT
        left outer join dbo.VOLUNTEERADMINISTRATIVE
            on VOLUNTEERADMINISTRATIVE.VOLUNTEERID = @VOLUNTEERID
                    and VOLUNTEERADMINISTRATIVE.ADMINISTRATIVECODEID = JT.ADMINISTRATIVECODEID 
                    and VOLUNTEERADMINISTRATIVE.VERIFIED = 1 
                    and (VOLUNTEERADMINISTRATIVE.EXPIRESON is null 
                         or 
                        VOLUNTEERADMINISTRATIVE.EXPIRESON >= @TODAY)
        left outer join dbo.VOLUNTEERCERTIFICATION
            on VOLUNTEERCERTIFICATION.VOLUNTEERID = @VOLUNTEERID
                    and VOLUNTEERCERTIFICATION.CERTIFICATIONCODEID = JT.CERTIFICATIONCODEID 
                    and VOLUNTEERCERTIFICATION.VERIFIED = 1
                    and (VOLUNTEERCERTIFICATION.EXPIRESON is null 
                         or 
                        VOLUNTEERCERTIFICATION.EXPIRESON >= @TODAY)
        left outer join dbo.VOLUNTEERCOURSE
            on VOLUNTEERCOURSE.VOLUNTEERID = @VOLUNTEERID
                    and VOLUNTEERCOURSE.COURSECODEID = JT.COURSECODEID 
                    and VOLUNTEERCOURSE.VERIFIED = 1
                    and (VOLUNTEERCOURSE.EXPIRESON is null 
                         or 
                        VOLUNTEERCOURSE.EXPIRESON >= @TODAY)
        left outer join dbo.VOLUNTEERINTEREST
            on VOLUNTEERINTEREST.VOLUNTEERID = @VOLUNTEERID
                    and VOLUNTEERINTEREST.VOLUNTEERINTERESTCODEID = JT.VOLUNTEERINTERESTCODEID
        left outer join dbo.VOLUNTEERLICENSE
            on VOLUNTEERLICENSE.VOLUNTEERID = @VOLUNTEERID 
                    and VOLUNTEERLICENSE.LICENSECODEID = JT.LICENSECODEID 
                    and VOLUNTEERLICENSE.VERIFIED = 1
                    and (VOLUNTEERLICENSE.EXPIRESON is null 
                         or 
                        VOLUNTEERLICENSE.EXPIRESON >= @TODAY)
        left outer join dbo.VOLUNTEERMEDICAL
            on VOLUNTEERMEDICAL.VOLUNTEERID = @VOLUNTEERID 
                    and VOLUNTEERMEDICAL.MEDICALCODEID = JT.MEDICALCODEID 
                    and VOLUNTEERMEDICAL.VERIFIED = 1
                    and (VOLUNTEERMEDICAL.EXPIRESON is null 
                         or 
                        VOLUNTEERMEDICAL.EXPIRESON >= @TODAY)
        left outer join dbo.VOLUNTEERSKILL
            on VOLUNTEERSKILL.VOLUNTEERID = @VOLUNTEERID 
                    and VOLUNTEERSKILL.SKILLCODEID = JT.SKILLCODEID
        left outer join dbo.VOLUNTEERSKILLLEVEL
            on VOLUNTEERSKILLLEVEL.ID = VOLUNTEERSKILL.SKILLLEVELID 
                and VOLUNTEERSKILLLEVEL.SEQUENCE >= JT.SKILLLEVEL
        where TRAITTYPEID is null or TRAITTYPEID <> 7;

        /*PUT IT ALL TOGETHER */
        select 
            @MATCH = coalesce(TRAITWEIGHT, 0)
        from @TRAITS TRAITS
        inner join dbo.CONSTITUENT 
            on TRAITS.VOLUNTEERID = CONSTITUENT.ID
        where
            @REQUIREDTRAITCOUNT = TRAITS.REQUIREDTRAITCOUNT;
    end

    return @MATCH;
end