USP_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS

Returns current and potential volunteers for a given job occurrence and date range.

Parameters

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

Definition

Copy


CREATE procedure dbo.USP_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS 
(
    @JOBOCCURRENCEID uniqueidentifier,
    @STARTDATE date,
    @ENDDATE date,
    @CURRENTAPPUSERID uniqueidentifier = null
)
with execute as owner
as

    set nocount on;

    declare @ISADMIN bit;
    declare @APPUSER_IN_NONRACROLE bit;
    declare @APPUSER_IN_NOSECGROUPROLE bit;
    declare @APPUSER_IN_NONSITEROLE bit;
    declare @APPUSER_IN_NOSITEROLE bit;

    set @ISADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
    set @APPUSER_IN_NONRACROLE = dbo.UFN_SECURITY_APPUSER_IN_NONRACROLE(@CURRENTAPPUSERID);
    set @APPUSER_IN_NOSECGROUPROLE = dbo.UFN_SECURITY_APPUSER_IN_NO_SECURITY_GROUP_ROLE(@CURRENTAPPUSERID);
    set @APPUSER_IN_NONSITEROLE = dbo.UFN_SECURITY_APPUSER_IN_NONSITEROLE(@CURRENTAPPUSERID);
    set @APPUSER_IN_NOSITEROLE = dbo.UFN_SECURITY_APPUSER_IN_NO_SITE_ROLE(@CURRENTAPPUSERID);

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

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


    declare @DAYCOUNT int = 0;

    if @STARTDATE is not null and @ENDDATE is not null and @STARTDATE <= @ENDDATE
        set @DAYCOUNT = datediff(dd, @STARTDATE, @ENDDATE) + 1
    else
        return;      

    declare @DAYSXML xml;
    set @DAYSXML = (
        select 
            convert(varchar, DATEADD(d,NUM,@STARTDATE), 112) [DATE]
        from 
            dbo.NUMBERS 
        where 
            DATEADD(d,NUM,@STARTDATE) <= @ENDDATE
        for xml path('ITEM'), type)

    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 @TRAITSCTE nvarchar(max) = ''
    declare @REQUIREDTRAITID uniqueidentifier;

    declare REQUIREDJOBADMINISTRATIVECURSOR cursor local fast_forward for
        select 
            JOBADMINISTRATIVE.ADMINISTRATIVECODEID
        from dbo.JOBADMINISTRATIVE 
        where 
            JOBADMINISTRATIVE.JOBID = @JOBID 
            and JOBADMINISTRATIVE.ISREQUIRED = 1

    open REQUIREDJOBADMINISTRATIVECURSOR;
    fetch next from REQUIREDJOBADMINISTRATIVECURSOR into @REQUIREDTRAITID;

    while (@@FETCH_STATUS = 0)
    begin
        if len(@TRAITSCTE) > 0
            set @TRAITSCTE = @TRAITSCTE + 'and '

        set @TRAITSCTE = @TRAITSCTE + '
            exists (
                select 1
                from 
                    dbo.VOLUNTEERADMINISTRATIVE
                where 
                    VOLUNTEERADMINISTRATIVE.ADMINISTRATIVECODEID = ''' + cast(@REQUIREDTRAITID as nvarchar(36)) + '''
                    and VOLUNTEERADMINISTRATIVE.VERIFIED = 1
                    and (VOLUNTEERADMINISTRATIVE.EXPIRESON is null or VOLUNTEERADMINISTRATIVE.EXPIRESON >= @TODAY)
                    and VOLUNTEERADMINISTRATIVE.VOLUNTEERID = VOLUNTEER.ID
            ) '

        fetch next from REQUIREDJOBADMINISTRATIVECURSOR into @REQUIREDTRAITID;
    end

    close REQUIREDJOBADMINISTRATIVECURSOR;
    deallocate REQUIREDJOBADMINISTRATIVECURSOR;

    declare REQUIREDJOBCERTIFICATIONCURSOR cursor local fast_forward for
    select 
        JOBCERTIFICATION.CERTIFICATIONCODEID
    from dbo.JOBCERTIFICATION 
    where 
        JOBCERTIFICATION.JOBID = @JOBID 
        and JOBCERTIFICATION.ISREQUIRED = 1

    open REQUIREDJOBCERTIFICATIONCURSOR;
    fetch next from REQUIREDJOBCERTIFICATIONCURSOR into @REQUIREDTRAITID;

    while (@@FETCH_STATUS = 0)
    begin
        if len(@TRAITSCTE) > 0
            set @TRAITSCTE = @TRAITSCTE + 'and '

        set @TRAITSCTE = @TRAITSCTE + '
            exists (
                select 1
                from 
                    dbo.VOLUNTEERCERTIFICATION
                where 
                    VOLUNTEERCERTIFICATION.CERTIFICATIONCODEID = ''' + cast(@REQUIREDTRAITID as nvarchar(36)) + '''
                    and VOLUNTEERCERTIFICATION.VERIFIED = 1
                    and (VOLUNTEERCERTIFICATION.EXPIRESON is null or VOLUNTEERCERTIFICATION.EXPIRESON >= @TODAY)
                    and VOLUNTEERCERTIFICATION.VOLUNTEERID = VOLUNTEER.ID
            ) '

        fetch next from REQUIREDJOBCERTIFICATIONCURSOR into @REQUIREDTRAITID;
    end

    close REQUIREDJOBCERTIFICATIONCURSOR;
    deallocate REQUIREDJOBCERTIFICATIONCURSOR;

    declare REQUIREDJOBCOURSECURSOR cursor local fast_forward for
    select 
        JOBCOURSE.COURSECODEID
    from dbo.JOBCOURSE 
    where 
        JOBCOURSE.JOBID = @JOBID 
        and JOBCOURSE.ISREQUIRED = 1

    open REQUIREDJOBCOURSECURSOR;
    fetch next from REQUIREDJOBCOURSECURSOR into @REQUIREDTRAITID;

    while (@@FETCH_STATUS = 0)
    begin
        if len(@TRAITSCTE) > 0
            set @TRAITSCTE = @TRAITSCTE + 'and '

        set @TRAITSCTE = @TRAITSCTE + '
            exists (
                select 1
                from 
                    dbo.VOLUNTEERCOURSE
                where 
                    VOLUNTEERCOURSE.COURSECODEID = ''' + cast(@REQUIREDTRAITID as nvarchar(36)) + '''
                    and VOLUNTEERCOURSE.VERIFIED = 1
                    and (VOLUNTEERCOURSE.EXPIRESON is null or VOLUNTEERCOURSE.EXPIRESON >= @TODAY)
                    and VOLUNTEERCOURSE.VOLUNTEERID = VOLUNTEER.ID
            ) '

        fetch next from REQUIREDJOBCOURSECURSOR into @REQUIREDTRAITID;
    end

    close REQUIREDJOBCOURSECURSOR;
    deallocate REQUIREDJOBCOURSECURSOR;

    declare REQUIREDJOBINTERESTCURSOR cursor local fast_forward for
    select 
        JOBINTEREST.VOLUNTEERINTERESTCODEID
    from dbo.JOBINTEREST 
    where 
        JOBINTEREST.JOBID = @JOBID 
        and JOBINTEREST.ISREQUIRED = 1

    open REQUIREDJOBINTERESTCURSOR;
    fetch next from REQUIREDJOBINTERESTCURSOR into @REQUIREDTRAITID;

    while (@@FETCH_STATUS = 0)
    begin
        if len(@TRAITSCTE) > 0
            set @TRAITSCTE = @TRAITSCTE + 'and '

        set @TRAITSCTE = @TRAITSCTE + '
            exists (
                select 1
                from 
                    dbo.VOLUNTEERINTEREST
                where 
                    VOLUNTEERINTEREST.VOLUNTEERINTERESTCODEID = ''' + cast(@REQUIREDTRAITID as nvarchar(36)) + '''
                    and VOLUNTEERINTEREST.VOLUNTEERID = VOLUNTEER.ID
            ) '

        fetch next from REQUIREDJOBINTERESTCURSOR into @REQUIREDTRAITID;
    end

    close REQUIREDJOBINTERESTCURSOR;
    deallocate REQUIREDJOBINTERESTCURSOR;

    declare REQUIREDJOBLICENSECURSOR cursor local fast_forward for
    select 
        JOBLICENSE.LICENSECODEID
    from dbo.JOBLICENSE 
    where 
        JOBLICENSE.JOBID = @JOBID 
        and JOBLICENSE.ISREQUIRED = 1

    open REQUIREDJOBLICENSECURSOR;
    fetch next from REQUIREDJOBLICENSECURSOR into @REQUIREDTRAITID;

    while (@@FETCH_STATUS = 0)
    begin
        if len(@TRAITSCTE) > 0
            set @TRAITSCTE = @TRAITSCTE + 'and '

        set @TRAITSCTE = @TRAITSCTE + '
            exists (
                select 1
                from 
                    dbo.VOLUNTEERLICENSE
                where 
                    VOLUNTEERLICENSE.LICENSECODEID = ''' + cast(@REQUIREDTRAITID as nvarchar(36)) + '''
                    and VOLUNTEERLICENSE.VERIFIED = 1
                    and (VOLUNTEERLICENSE.EXPIRESON is null or VOLUNTEERLICENSE.EXPIRESON >= @TODAY)
                    and VOLUNTEERLICENSE.VOLUNTEERID = VOLUNTEER.ID
            ) '

        fetch next from REQUIREDJOBLICENSECURSOR into @REQUIREDTRAITID;
    end

    close REQUIREDJOBLICENSECURSOR;
    deallocate REQUIREDJOBLICENSECURSOR;

    declare REQUIREDJOBMEDICALCURSOR cursor local fast_forward for
    select 
        JOBMEDICAL.MEDICALCODEID
    from dbo.JOBMEDICAL 
    where 
        JOBMEDICAL.JOBID = @JOBID 
        and JOBMEDICAL.ISREQUIRED = 1

    open REQUIREDJOBMEDICALCURSOR;
    fetch next from REQUIREDJOBMEDICALCURSOR into @REQUIREDTRAITID;

    while (@@FETCH_STATUS = 0)
    begin
        if len(@TRAITSCTE) > 0
            set @TRAITSCTE = @TRAITSCTE + 'and '

        set @TRAITSCTE = @TRAITSCTE + '
            exists (
                select 1
                from 
                    dbo.VOLUNTEERMEDICAL
                where 
                    VOLUNTEERMEDICAL.MEDICALCODEID = ''' + cast(@REQUIREDTRAITID as nvarchar(36)) + '''
                    and VOLUNTEERMEDICAL.VERIFIED = 1
                    and (VOLUNTEERMEDICAL.EXPIRESON is null or VOLUNTEERMEDICAL.EXPIRESON >= @TODAY)
                    and VOLUNTEERMEDICAL.VOLUNTEERID = VOLUNTEER.ID
            ) '

        fetch next from REQUIREDJOBMEDICALCURSOR into @REQUIREDTRAITID;
    end

    close REQUIREDJOBMEDICALCURSOR;
    deallocate REQUIREDJOBMEDICALCURSOR;

    declare @SKILLLEVELSEQUENCE int;
    declare REQUIREDJOBSKILLCURSOR cursor local fast_forward for
    select 
        JOBSKILL.SKILLCODEID,
        VOLUNTEERSKILLLEVEL.SEQUENCE
    from dbo.JOBSKILL 
        inner join dbo.VOLUNTEERSKILLLEVEL on  VOLUNTEERSKILLLEVEL.ID = JOBSKILL.SKILLLEVELID
    where 
        JOBSKILL.JOBID = @JOBID 
        and JOBSKILL.ISREQUIRED = 1

    open REQUIREDJOBSKILLCURSOR;
    fetch next from REQUIREDJOBSKILLCURSOR into @REQUIREDTRAITID, @SKILLLEVELSEQUENCE;

    while (@@FETCH_STATUS = 0)
    begin
        if len(@TRAITSCTE) > 0
            set @TRAITSCTE = @TRAITSCTE + 'and '

        set @TRAITSCTE = @TRAITSCTE + '
            exists (
                select 1
                from 
                    dbo.VOLUNTEERSKILL
                    inner join dbo.VOLUNTEERSKILLLEVEL on VOLUNTEERSKILLLEVEL.ID = VOLUNTEERSKILL.SKILLLEVELID 
                where 
                    VOLUNTEERSKILL.SKILLCODEID = ''' + cast(@REQUIREDTRAITID as nvarchar(36)) + '''
                    and VOLUNTEERSKILLLEVEL.SEQUENCE >= ' + cast(@SKILLLEVELSEQUENCE as nvarchar(20)) + '
                    and VOLUNTEERSKILL.VOLUNTEERID = VOLUNTEER.ID
            ) '

        fetch next from REQUIREDJOBSKILLCURSOR into @REQUIREDTRAITID, @SKILLLEVELSEQUENCE;
    end

    close REQUIREDJOBSKILLCURSOR;
    deallocate REQUIREDJOBSKILLCURSOR;

    if object_id('tempdb..#TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEIDS') is not null
        drop table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEIDS;

    create table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEIDS
    (  
        VOLUNTEERID uniqueidentifier
    );    

    CREATE INDEX IDX_AVAILABLEIDS_VOLUNTEERID
    ON #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEIDS (VOLUNTEERID)

    if object_id('tempdb..#TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES') is not null
        drop table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES;

    create table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES
    (  
        AVAILABLEDATE date,
        VOLUNTEERID uniqueidentifier,
        STARTTIME varchar(4) collate DATABASE_DEFAULT,
        ENDTIME varchar(4) collate DATABASE_DEFAULT
    );    

    if object_id('tempdb..#TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE') is not null
        drop table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE;

    create table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE
    (
        ASSIGNMENTDATE datetime
        OCCURRENCEID uniqueidentifier, 
        JOBID uniqueidentifier, 
        JOBSTARTTIME varchar(4) collate DATABASE_DEFAULT, 
        JOBENDTIME varchar(4) collate DATABASE_DEFAULT, 
        VOLUNTEERSNEEDED int
        OPENINGS int
    )

    CREATE INDEX IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES_AVAILABLEDATE
    ON #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES (AVAILABLEDATE)

    CREATE INDEX IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES_STARTTIME
    ON #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES (STARTTIME)

    CREATE INDEX IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES_ENDTIME
    ON #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES (ENDTIME)

    CREATE INDEX IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE_ASSIGNMENTDATE
    ON #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE (ASSIGNMENTDATE)

    CREATE INDEX IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE_OCCURRENCEID
    ON #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE (OCCURRENCEID)

    CREATE INDEX IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE_JOBSTARTTIME
    ON #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE (JOBSTARTTIME)

    CREATE INDEX IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE_JOBENDTIME
    ON #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE (JOBENDTIME)

    insert into #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES
    select 
        AVAILABILITY.AVAILABLEDATE, 
        AVAILABILITY.VOLUNTEERID, 
        AVAILABILITY.STARTTIME, 
        AVAILABILITY.ENDTIME
    from 
        dbo.[UFN_VOLUNTEER_AVAILABLESPECIFICDAYS_2](@DAYSXML, null, @TODAY) AVAILABILITY
    where
        AVAILABILITY.VOLUNTEERID in (
            select VOLUNTEERID
            from dbo.[UFN_VOLUNTEER_AVAILABLESPECIFICDAYS_2](@DAYSXML, null, @TODAY) AVAILABILITY
            group by VOLUNTEERID
            having count(*) >= @DAYCOUNT)

    insert into #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE
    select * from dbo.UFN_JOBOCCURRENCE_SCHEDULE(@STARTDATE, @ENDDATE, @JOBOCCURRENCEID, null)

    /*FIND AVAILABLE*/
    declare @SQL nvarchar(max) = '';

    if len(@TRAITSCTE) > 0
    begin
        set @SQL = '
            with TRAITS_CTE as (
                select 
                    VOLUNTEER.ID
                from
                    dbo.VOLUNTEER
                where ' + @TRAITSCTE + ') '
    end

    set @SQL = @SQL + '
        insert into #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEIDS
        select 
            distinct AVAILABLE.VOLUNTEERID
        from #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE SCHEDULE
        inner join dbo.JOBOCCURRENCE 
            on JOBOCCURRENCE.ID = @JOBOCCURRENCEID
        inner join #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES AVAILABLE
            on AVAILABLE.AVAILABLEDATE = SCHEDULE.ASSIGNMENTDATE '

    if len(@TRAITSCTE) > 0
    begin
        set @SQL = @SQL + '
        inner join TRAITS_CTE on TRAITS_CTE.ID = AVAILABLE.VOLUNTEERID '
    end    

    set @SQL = @SQL + '
        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 
            inner join #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES  VOLUNTEERS
                on VOLUNTEERS.VOLUNTEERID = VOLUNTEERASSIGNMENT.VOLUNTEERID 
            outer apply dbo.UFN_JOBOCCURRENCE_SCHEDULE(@STARTDATE, @ENDDATE, VOLUNTEERASSIGNMENT.JOBOCCURRENCEID, null)
            where VOLUNTEERASSIGNMENT.DATE between @STARTDATE and @ENDDATE) 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 (ASSIGNEDJOB.OCCURRENCEID is null) and
            (AVAILABLE.STARTTIME <= JOBOCCURRENCE.STARTTIME or JOBOCCURRENCE.STARTTIME = '''') and
            (AVAILABLE.ENDTIME >= JOBOCCURRENCE.ENDTIME or AVAILABLE.ENDTIME = '''') '

    if @VOLUNTEERTYPEID is not null
        set @SQL = @SQL + 'and (VOLTYPE.VOLUNTEERTYPEID = @VOLUNTEERTYPEID) '

    if @LOCATIONID is not null
        set @SQL = @SQL + 'and (VOLUNTEERVOLUNTEERLOCATION.ID is null or VOLUNTEERVOLUNTEERLOCATION.VOLUNTEERLOCATIONCODEID = @LOCATIONID) '

    if @ISADMIN = 0
    begin
        if @APPUSER_IN_NONRACROLE = 0
            set @SQL = @SQL + 'and dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, AVAILABLE.VOLUNTEERID, @APPUSER_IN_NOSECGROUPROLE) = 1 '
        if @APPUSER_IN_NONSITEROLE  = 0
            set @SQL = @SQL + 'and dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT_BYSITE(@CURRENTAPPUSERID, AVAILABLE.VOLUNTEERID, @APPUSER_IN_NOSITEROLE) = 1 '
    end

    --set @SQL = @SQL + '

    --    group by AVAILABLE.VOLUNTEERID, SCHEDULE.ASSIGNMENTDATE 

    --    having max(case when ASSIGNEDJOB.OCCURRENCEID is null then 0 else 1 end) = 0 '


    exec sp_executesql @SQL, N'@STARTDATE datetime, @ENDDATE datetime, @JOBOCCURRENCEID uniqueidentifier, @DAYSXML xml, @DAYCOUNT int, @TODAY datetime, @VOLUNTEERTYPEID uniqueidentifier, @LOCATIONID uniqueidentifier, @CURRENTAPPUSERID uniqueidentifier, @APPUSER_IN_NOSECGROUPROLE bit, @APPUSER_IN_NOSITEROLE bit'
        @STARTDATE, @ENDDATE, @JOBOCCURRENCEID, @DAYSXML, @DAYCOUNT, @TODAY, @VOLUNTEERTYPEID, @LOCATIONID, @CURRENTAPPUSERID, @APPUSER_IN_NOSECGROUPROLE, @APPUSER_IN_NOSITEROLE;

    drop index IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE_ASSIGNMENTDATE on #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE
    drop index IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE_OCCURRENCEID on #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE
    drop index IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE_JOBSTARTTIME on #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE
    drop index IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE_JOBENDTIME on #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE

    drop index IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES_AVAILABLEDATE on #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES
    drop index IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES_STARTTIME on #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES
    drop index IDX_TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES_ENDTIME on #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES

    drop table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_SCHEDULE
    drop table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEFORALLDATES

    /* remove volunteers whose special needs are not met. */
    delete from #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEIDS
    where VOLUNTEERID in 
        (select VSN.VOLUNTEERID
         from #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEIDS 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)

    if object_id('tempdb..#TMP_DATA_JOBOCCURRENCE_ASSIGN_GET_VOLUNTEERS_TRAITS') is not null
        drop table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GET_VOLUNTEERS_TRAITS;

    create table #TMP_DATA_JOBOCCURRENCE_ASSIGN_GET_VOLUNTEERS_TRAITS 
        (
            VOLUNTEERID uniqueidentifier, 
            TRAITWEIGHT int
            REQUIREDTRAITCOUNT int
    )

    CREATE INDEX IDX_TRAITS_VOLUNTEERID
    ON #TMP_DATA_JOBOCCURRENCE_ASSIGN_GET_VOLUNTEERS_TRAITS (VOLUNTEERID)

    /*FIND TRAITS*/
    insert into #TMP_DATA_JOBOCCURRENCE_ASSIGN_GET_VOLUNTEERS_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
    from #TMP_DATA_JOBOCCURRENCE_ASSIGN_GETVOLUNTEERS_AVAILABLEIDS 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

    /*PUT IT ALL TOGETHER */
    select 
        TRAITS.VOLUNTEERID VOLUNTEERID,
        cast(coalesce(TRAITWEIGHT, 0) as nvarchar(3)) + '%' as MATCH,
        NF.NAME
    from #TMP_DATA_JOBOCCURRENCE_ASSIGN_GET_VOLUNTEERS_TRAITS TRAITS
    inner join dbo.CONSTITUENT 
        on TRAITS.VOLUNTEERID = CONSTITUENT.ID
    left join dbo.DECEASEDCONSTITUENT on DECEASEDCONSTITUENT.ID = CONSTITUENT.ID
    outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) NF
    where
        @REQUIREDTRAITCOUNT = TRAITS.REQUIREDTRAITCOUNT
        and DECEASEDCONSTITUENT.ID is null
    order by MATCH desc, CONSTITUENT.KEYNAME asc;