USP_DATALIST_ITINERARYITINERARYITEMSTAFFRESOURCEJOBOCCURRENCEMATCH

Returns volunteers with match percentages for a given Itinerary or Itinerary Item Staff Resource.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN Input parameter indicating the context ID for the data list.
@ISITINERARYRESOURCE bit IN

Definition

Copy


            CREATE procedure dbo.USP_DATALIST_ITINERARYITINERARYITEMSTAFFRESOURCEJOBOCCURRENCEMATCH
            (
                @ID uniqueidentifier,
                @ISITINERARYRESOURCE bit = 1
            )
            as
                set nocount on;

                declare @MATCHSTARTDATETIME datetime
                declare @MATCHENDDATETIME datetime
                declare @JOBOCCURRENCEID uniqueidentifier
                declare @JOBID uniqueidentifier
                declare @VOLUNTEERTYPEID uniqueidentifier
                declare @TRAITCOUNT numeric(13,2);
                declare @REQUIREDTRAITCOUNT int = 0;
                declare @LOCATIONID uniqueidentifier

                if @ISITINERARYRESOURCE = 1
                begin
                    select
                        @MATCHSTARTDATETIME = ITINERARY.STARTDATETIME, 
                        @MATCHENDDATETIME = ITINERARY.ENDDATETIME,
                        @JOBOCCURRENCEID = ITINERARYSTAFFRESOURCE.JOBOCCURRENCEID,
                        @JOBID = ITINERARYSTAFFRESOURCE.JOBID
                    from dbo.ITINERARY
                    inner join dbo.ITINERARYSTAFFRESOURCE on
                        ITINERARY.ID = ITINERARYSTAFFRESOURCE.ITINERARYID
                    where
                        ITINERARYSTAFFRESOURCE.ID = @ID
                end
                else
                begin
                    select
                        @MATCHSTARTDATETIME = ITINERARYITEM.STARTDATETIME, 
                        @MATCHENDDATETIME = ITINERARYITEM.ENDDATETIME,
                        @JOBOCCURRENCEID = ITINERARYITEMSTAFFRESOURCE.JOBOCCURRENCEID,
                        @JOBID = ITINERARYITEMSTAFFRESOURCE.JOBID
                    from dbo.ITINERARYITEM
                    inner join dbo.ITINERARYITEMSTAFFRESOURCE on
                        ITINERARYITEM.ID = ITINERARYITEMSTAFFRESOURCE.ITINERARYITEMID
                    where
                        ITINERARYITEMSTAFFRESOURCE.ID = @ID
                end

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

                -- Constants for matching

                declare @TODAY datetime;
                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


                declare @VOLUNTEERMATCH table
                (
                    ID uniqueidentifier,
                    VALIDINTIME bit,
                    TRAITHIT tinyint,
                    REQUIREDTRAITCOUNT tinyint
                )

                insert into @VOLUNTEERMATCH
                (
                    ID,
                    VALIDINTIME,
                    TRAITHIT,
                    REQUIREDTRAITCOUNT
                )
                select    
                    VA.VOLUNTEERID,
                    VA.VALIDINTIME,
                    count(distinct(VOLUNTEERADMINISTRATIVE.ID)) + 
                    count(distinct(VOLUNTEERCERTIFICATION.ID)) + 
                    count(distinct(VOLUNTEERCOURSE.ID)) + 
                    count(distinct(VOLUNTEERINTEREST.ID)) + 
                    count(distinct(VOLUNTEERLICENSE.ID)) + 
                    count(distinct(VOLUNTEERMEDICAL.ID)) + 
                    count(distinct(VOLUNTEERSKILL.ID)) as TRAITHIT,
                    sum(
                            case 
                                when JOBADMINISTRATIVE.ISREQUIRED = 1 and VOLUNTEERADMINISTRATIVE.ID is not null then 1
                                when JOBCERTIFICATION.ISREQUIRED = 1 and VOLUNTEERCERTIFICATION.ID is not null then 1
                                when JOBCOURSE.ISREQUIRED = 1 and VOLUNTEERCOURSE.ID is not null then 1
                                when JOBINTEREST.ISREQUIRED = 1 and VOLUNTEERINTEREST.ID is not null then 1
                                when JOBLICENSE.ISREQUIRED = 1 and VOLUNTEERLICENSE.ID is not null then 1
                                when JOBMEDICAL.ISREQUIRED = 1 and VOLUNTEERMEDICAL.ID is not null then 1
                                when JOBSKILL.ISREQUIRED = 1 and VOLUNTEERSKILL.ID is not null then 1
                                else 0
                            end
                        ) as REQUIREDTRAITCOUNT
                from dbo.JOB
                cross join [dbo].[UFN_VOLUNTEER_GETVOLUNTEERSAVAILABLEFORDATERANGE](@MATCHSTARTDATETIME, @MATCHENDDATETIME, @VOLUNTEERTYPEID) as VA
                left outer join dbo.JOBADMINISTRATIVE on 
                    JOBADMINISTRATIVE.JOBID = JOB.ID 
                left outer join dbo.VOLUNTEERADMINISTRATIVE on 
                    VOLUNTEERADMINISTRATIVE.VOLUNTEERID = VA.VOLUNTEERID and 
                    VOLUNTEERADMINISTRATIVE.ADMINISTRATIVECODEID = JOBADMINISTRATIVE.ADMINISTRATIVECODEID and 
                    VOLUNTEERADMINISTRATIVE.VERIFIED = 1 and 
                    (
                        VOLUNTEERADMINISTRATIVE.EXPIRESON is null or
                        VOLUNTEERADMINISTRATIVE.EXPIRESON >= @TODAY
                    )
                left outer join dbo.JOBCERTIFICATION on 
                    JOBCERTIFICATION.JOBID = JOB.ID 
                left outer join dbo.VOLUNTEERCERTIFICATION on 
                    VOLUNTEERCERTIFICATION.VOLUNTEERID = VA.VOLUNTEERID and 
                    VOLUNTEERCERTIFICATION.CERTIFICATIONCODEID = JOBCERTIFICATION.CERTIFICATIONCODEID and 
                    VOLUNTEERCERTIFICATION.VERIFIED = 1 and 
                    (
                        VOLUNTEERCERTIFICATION.EXPIRESON is null or 
                        VOLUNTEERCERTIFICATION.EXPIRESON >= @TODAY
                    )
                left outer join dbo.JOBCOURSE on 
                    JOBCOURSE.JOBID = JOB.ID
                left outer join dbo.VOLUNTEERCOURSE    on 
                    VOLUNTEERCOURSE.VOLUNTEERID = VA.VOLUNTEERID and 
                    VOLUNTEERCOURSE.COURSECODEID = JOBCOURSE.COURSECODEID and 
                    VOLUNTEERCOURSE.VERIFIED = 1 and 
                    (
                        VOLUNTEERCOURSE.EXPIRESON is null or 
                        VOLUNTEERCOURSE.EXPIRESON >= @TODAY
                    )
                left outer join dbo.JOBINTEREST    on 
                    JOBINTEREST.JOBID = JOB.ID
                left outer join dbo.VOLUNTEERINTEREST on 
                    VOLUNTEERINTEREST.VOLUNTEERID = VA.VOLUNTEERID and 
                    VOLUNTEERINTEREST.VOLUNTEERINTERESTCODEID = JOBINTEREST.VOLUNTEERINTERESTCODEID 
                left outer join dbo.JOBLICENSE on 
                    JOBLICENSE.JOBID = JOB.ID 
                left outer join dbo.VOLUNTEERLICENSE on 
                    VOLUNTEERLICENSE.VOLUNTEERID = VA.VOLUNTEERID and 
                    VOLUNTEERLICENSE.LICENSECODEID = JOBLICENSE.LICENSECODEID and 
                    VOLUNTEERLICENSE.VERIFIED = 1 and 
                    (
                        VOLUNTEERLICENSE.EXPIRESON is null or 
                        VOLUNTEERLICENSE.EXPIRESON >= @TODAY
                    )
                left outer join dbo.JOBMEDICAL on 
                    JOBMEDICAL.JOBID = JOB.ID
                left outer join dbo.VOLUNTEERMEDICAL on 
                    VOLUNTEERMEDICAL.VOLUNTEERID = VA.VOLUNTEERID and 
                    VOLUNTEERMEDICAL.MEDICALCODEID = JOBMEDICAL.MEDICALCODEID and 
                    VOLUNTEERMEDICAL.VERIFIED = 1 and 
                    (
                        VOLUNTEERMEDICAL.EXPIRESON is null or 
                        VOLUNTEERMEDICAL.EXPIRESON >= @TODAY
                    )
                left outer join dbo.JOBSKILL on 
                    JOBSKILL.JOBID = JOB.ID 
                left outer join dbo.VOLUNTEERSKILLLEVEL as [JOBSKILLLEVEL] on 
                    JOBSKILLLEVEL.ID = JOBSKILL.SKILLLEVELID
                    left outer join (
                        select
                            VOLUNTEERSKILL.ID,
                            VOLUNTEERSKILL.VOLUNTEERID,
                            VOLUNTEERSKILL.SKILLCODEID,
                            VOLUNTEERSKILLLEVEL.SEQUENCE
                        from dbo.VOLUNTEERSKILL
                        inner join dbo.VOLUNTEERSKILLLEVEL on VOLUNTEERSKILLLEVEL.ID = VOLUNTEERSKILL.SKILLLEVELID
                    ) as VOLUNTEERSKILL
                        on VOLUNTEERSKILL.VOLUNTEERID = VA.VOLUNTEERID
                            and VOLUNTEERSKILL.SKILLCODEID = JOBSKILL.SKILLCODEID
                            and VOLUNTEERSKILL.SEQUENCE >= JOBSKILLLEVEL.SEQUENCE
                left outer join    dbo.VOLUNTEERVOLUNTEERLOCATION
                    on VA.VOLUNTEERID = VOLUNTEERVOLUNTEERLOCATION.VOLUNTEERID
                where
                    JOB.ID = @JOBID and
                    (
                        @LOCATIONID is null or -- no location

                        VOLUNTEERVOLUNTEERLOCATION.ID is null or --none

                        VOLUNTEERVOLUNTEERLOCATION.VOLUNTEERLOCATIONCODEID = @LOCATIONID
                    )
                group by VA.VOLUNTEERID, JOB.ID, VA.VALIDINTIME;


                /* Remove volunteers that do not have fulfilled special needs */
                with UNFILLEDSPECIAL_CTE as
                (
                    select 
                        VM.ID as ID
                    from @VOLUNTEERMATCH as VM
                    inner join VOLUNTEERSPECIALNEED VSN on 
                        VSN.VOLUNTEERID = VM.ID
                    left outer join dbo.JOBSPECIALNEED as JSN on 
                        JSN.JOBID = @JOBID and 
                        JSN.SPECIALNEEDCODEID = VSN.SPECIALNEEDCODEID
                    where 
                        JSN.ID is null
                )
                delete from @VOLUNTEERMATCH
                from UNFILLEDSPECIAL_CTE
                where 
                    [@VOLUNTEERMATCH].ID = UNFILLEDSPECIAL_CTE.ID 

                /*PUT IT ALL TOGETHER */
                select distinct 
                    VM.ID,
                    VM.VALIDINTIME,
                    cast(round(case when @TRAITCOUNT = 0 then 1
                            else TRAITHIT / @TRAITCOUNT end * 100, 0) as int) as PERCENTMATCH,
                    dbo.UFN_CONSTITUENT_BUILDNAME(VM.ID) as VOLUNTEERNAME
                from @VOLUNTEERMATCH as VM
                where
                    @REQUIREDTRAITCOUNT = VM.REQUIREDTRAITCOUNT
                order by PERCENTMATCH desc, VOLUNTEERNAME asc;