USP_DATALIST_JOBOCCURRENCEMATCHES

This datalist returns all matches for an occurrence.

Parameters

Parameter Parameter Type Mode Description
@JOBOCCURRENCEID uniqueidentifier IN Input parameter indicating the context ID for the data list.
@DAYLIST nvarchar(max) IN Days
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@SECURITYFEATUREID uniqueidentifier IN Input parameter indicating the ID of the feature to use for site security checking.
@SECURITYFEATURETYPE tinyint IN Input parameter indicating the type of the feature to use for site security checking.

Definition

Copy


            CREATE procedure dbo.USP_DATALIST_JOBOCCURRENCEMATCHES 
            (
                @JOBOCCURRENCEID uniqueidentifier = null,
                @DAYLIST nvarchar(max) = '',
                @CURRENTAPPUSERID uniqueidentifier = null,
                @SECURITYFEATUREID uniqueidentifier = null,
                @SECURITYFEATURETYPE tinyint = null
            )
            as
                set nocount on;

                declare    @LOCATIONID uniqueidentifier;
                declare    @VOLUNTEERTYPEID uniqueidentifier;
                declare    @JOBID uniqueidentifier;
                declare @TRAITPERCENT int;
                declare @TRAITCOUNT numeric(13,2);
                declare @DAYCOUNT numeric(13,2);
                declare @TODAY datetime;
                declare @REQUIREDTRAITCOUNT int = 0;


                if len(@DAYLIST) = 0 or @DAYLIST = '00000000'
                    return;

                /* 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


                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

                /*TABLE CLEANUP */
                if not object_id('tempdb..#AVAILABLE') is null  
                    drop table #AVAILABLE
                if not object_id('tempdb..#TRAITS') is null  
                    drop table #TRAITS

                /*FIND AVAILABLE*/
                select AVAILABLE.VOLUNTEERID
                into #AVAILABLE
                from [UFN_JOBOCCURRENCE_VACANTSPECIFICDAYS](@DAYLIST,@JOBOCCURRENCEID,null) VACANCIES 
                inner join dbo.JOBOCCURRENCE 
                    on JOBOCCURRENCE.ID = @JOBOCCURRENCEID
                inner join dbo.[UFN_VOLUNTEER_AVAILABLESPECIFICDAYS](@DAYLIST, null, 1) AVAILABLE
                    on AVAILABLE.AVAILABLEDATE = VACANCIES.ASSIGNMENTDATE
                left outer join dbo.VOLUNTEERVOLUNTEERTYPE VOLTYPE
                    on AVAILABLE.VOLUNTEERID = VOLTYPE.VOLUNTEERID AND VOLTYPE.STATUSCODE = 1
                left outer join dbo.VOLUNTEERASSIGNMENT VAS
                    on AVAILABLE.VOLUNTEERID = VAS.VOLUNTEERID
                        and VAS.DATE = VACANCIES.ASSIGNMENTDATE
                left outer join dbo.JOBOCCURRENCE ASSIGNEDJO
                    on ASSIGNEDJO.ID = VAS.JOBOCCURRENCEID and
                       (ASSIGNEDJO.STARTTIME between JOBOCCURRENCE.STARTTIME and JOBOCCURRENCE.ENDTIME
                        or
                       ASSIGNEDJO.ENDTIME between JOBOCCURRENCE.STARTTIME and JOBOCCURRENCE.ENDTIME
                       or ASSIGNEDJO.STARTTIME = '' or ASSIGNEDJO.ENDTIME = ''
                       or JOBOCCURRENCE.STARTTIME = '' or JOBOCCURRENCE.ENDTIME  = '')
                left outer join    dbo.VOLUNTEERVOLUNTEERLOCATION
                    on AVAILABLE.VOLUNTEERID = VOLUNTEERVOLUNTEERLOCATION.VOLUNTEERID
                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)
                      and
                      ((case 
                        when dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID)=1 
                            then 1
                        when (dbo.UFN_SECURITY_APPUSER_GRANTED_DATALIST_FORCONSTIT(@CURRENTAPPUSERID, '44C7B85C-A2FB-4705-976F-69A58E612402', AVAILABLE.VOLUNTEERID) = 1 
                            and    exists(
                                select 1 from dbo.CONSTITUENT C
                                left join dbo.CONSTITUENTSITE on CONSTITUENTSITE.CONSTITUENTID = C.ID
                                where
                                    C.ID = AVAILABLE.VOLUNTEERID
                                and 
                                    (dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1 or exists (select 1 from dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,@SECURITYFEATUREID,@SECURITYFEATURETYPE) where SITEID=[CONSTITUENTSITE].[SITEID] or (SITEID is null and [CONSTITUENTSITE].[SITEID] is null)))
                            )                            
                        ) then 1
                        when @CURRENTAPPUSERID is null 
                            then 1
                        else 0 
                       end) = 1)
                group by AVAILABLE.VOLUNTEERID
                having max(case when ASSIGNEDJO.ID is null then 0 else 1 end) = 0
                        and count(distinct VACANCIES.ASSIGNMENTDATE) = @DAYCOUNT;

                create index AVAILABLE_VOLUNTEERID on #AVAILABLE(VOLUNTEERID);

                /* remove volunteers whose special needs are not met. */
                delete from #AVAILABLE
                where VOLUNTEERID in 
                    (select VSN.VOLUNTEERID
                     from #AVAILABLE AVAIL
                     inner join VOLUNTEERSPECIALNEED VSN
                        on AVAIL.VOLUNTEERID = VSN.VOLUNTEERID
                     left outer join dbo.JOBSPECIALNEED JSN
                        on JSN.JOBID = @JOBID and JSN.SPECIALNEEDCODEID = VSN.SPECIALNEEDCODEID
                     where JSN.ID is null)

                /*FIND TRAITS*/
                select    AVAIL.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
                into #TRAITS
                from #AVAILABLE AVAIL
                left outer join dbo.[UFN_JOBOCCURRENCE_TRAITIDS](@JOBOCCURRENCEID) JT
                    on 1 = 1
                left outer join dbo.VOLUNTEERADMINISTRATIVE
                    on VOLUNTEERADMINISTRATIVE.VOLUNTEERID = AVAIL.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 = AVAIL.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 = AVAIL.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 = AVAIL.VOLUNTEERID 
                            and VOLUNTEERINTEREST.VOLUNTEERINTERESTCODEID = JT.VOLUNTEERINTERESTCODEID
                left outer join dbo.VOLUNTEERLICENSE
                    on VOLUNTEERLICENSE.VOLUNTEERID = AVAIL.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 = AVAIL.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 = AVAIL.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
                group by AVAIL.VOLUNTEERID
                create index TRAITS_VOLUNTEERID on #TRAITS(VOLUNTEERID);

                /*PUT IT ALL TOGETHER */
                select TRAITS.VOLUNTEERID VOLUNTEERID,
                        cast(coalesce(TRAITWEIGHT, 0) as int) as MATCH,
                        CONSTITUENT.NAME
                from #TRAITS TRAITS
                inner join dbo.CONSTITUENT 
                    on TRAITS.VOLUNTEERID = CONSTITUENT.ID
                where
                    @REQUIREDTRAITCOUNT = TRAITS.REQUIREDTRAITCOUNT
                order by MATCH desc, CONSTITUENT.NAME asc;

                /*TABLE CLEANUP */
                if not object_id('tempdb..#AVAILABLE') is null
                    drop table #AVAILABLE
                if not object_id('tempdb..#TRAITS') is null
                    drop table #TRAITS