USP_DATALIST_VOLUNTEERMATCHES_CALENDAR

This datalist returns all matches for a volunteer.

Parameters

Parameter Parameter Type Mode Description
@VOLUNTEERID uniqueidentifier IN Input parameter indicating the context ID for the data list.
@JOBOCCURENCEID uniqueidentifier IN Job name
@LOCATIONID uniqueidentifier IN Location
@STARTDATE date IN
@ENDDATE date IN
@INCLUDEINACTIVE bit IN Include inactive
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.

Definition

Copy


CREATE procedure dbo.USP_DATALIST_VOLUNTEERMATCHES_CALENDAR 
(
    @VOLUNTEERID uniqueidentifier = null
    @JOBOCCURENCEID uniqueidentifier = null,
    @LOCATIONID uniqueidentifier = null,
    @STARTDATE date = null
    @ENDDATE date = null
    @INCLUDEINACTIVE bit = 0,
    @CURRENTAPPUSERID uniqueidentifier = null
)
as
    set nocount on;

    declare @TODAY datetime;

    /*CONSTANTS FOR MATCHING*/
    set @TODAY = dbo.UFN_DATE_GETEARLIESTTIME(getdate());

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

    declare @DAYLIST nvarchar(max) = '';
    declare @JOB_STARTDATE datetime
    declare @JOB_ENDDATE datetime;
    declare @STARTTIME dbo.UDT_HOURMINUTE = '';
    declare @ENDTIME dbo.UDT_HOURMINUTE = '';

    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, '')

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

    /*FIND AVAILABLE*/
    select 
        VACANCIES.OCCURRENCEID, 
        JOBOCCURRENCE.JOBID, 
        AVAILABLE.AVAILABLEDATE STARTDATE
    into #AVAILABLE
    from dbo.[UFN_JOBOCCURRENCE_VACANTSPECIFICDAYS](@DAYLIST,null,null) VACANCIES 
    inner join dbo.JOBOCCURRENCE 
        on JOBOCCURRENCE.ID = VACANCIES.OCCURRENCEID
    inner join dbo.JOB
        on JOBOCCURRENCE.JOBID = JOB.ID
    inner join dbo.[UFN_VOLUNTEER_AVAILABLESPECIFICDAYS](@DAYLIST, @VOLUNTEERID, 0) AVAILABLE
        on AVAILABLE.AVAILABLEDATE = VACANCIES.ASSIGNMENTDATE
    left outer join dbo.VOLUNTEERASSIGNMENT 
        on VOLUNTEERASSIGNMENT.JOBOCCURRENCEID = JOBOCCURRENCE.ID 
            and VOLUNTEERASSIGNMENT.DATE = AVAILABLE.AVAILABLEDATE
    left outer join dbo.VOLUNTEERVOLUNTEERTYPE VOLTYPE
        on VOLTYPE.VOLUNTEERID = @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 
        (@JOBOCCURENCEID is null or JOBOCCURRENCE.ID = @JOBOCCURENCEID) and
        (JOB.VOLUNTEERTYPEID is null or VOLTYPE.VOLUNTEERTYPEID = JOB.VOLUNTEERTYPEID) and
        (AVAILABLE.STARTTIME <= JOBOCCURRENCE.STARTTIME or JOBOCCURRENCE.STARTTIME = '')
        and
        (AVAILABLE.ENDTIME >= JOBOCCURRENCE.ENDTIME or AVAILABLE.ENDTIME = '')
        and 
        (@LOCATIONID is null or JOBOCCURRENCE.LOCATIONCODEID = @LOCATIONID)
        and
        (JOBOCCURRENCE.LOCATIONCODEID is null -- no location

            or VOLUNTEERVOLUNTEERLOCATION.ID is null --none

            or VOLUNTEERVOLUNTEERLOCATION.VOLUNTEERLOCATIONCODEID = JOBOCCURRENCE.LOCATIONCODEID)
        and AVAILABLE.AVAILABLEDATE >= @TODAY 
        and (dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID,JOBOCCURRENCE.SITEID) = 1)
        and (dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID,JOB.SITEID) = 1)
        and (@INCLUDEINACTIVE = 1 or JOB.ISACTIVE = 1)
    group by 
        VACANCIES.OCCURRENCEID, 
        JOBOCCURRENCE.JOBID, 
        AVAILABLE.AVAILABLEDATE
    having 
        max(case when ASSIGNEDJO.ID is null then 0 else 1 end) = 0;

    create index AVAILABLE_OCCURRENCEIDID on #AVAILABLE(OCCURRENCEID);

    /*Remove jobs that do not have all of the required special needs*/
    delete from #AVAILABLE
    where JOBID in 
        (select AVAIL.JOBID
         from #AVAILABLE AVAIL
         inner join VOLUNTEERSPECIALNEED VSN
            on VSN.VOLUNTEERID = @VOLUNTEERID
         left outer join dbo.JOBSPECIALNEED JSN
            on JSN.JOBID = AVAIL.JOBID and JSN.SPECIALNEEDCODEID = VSN.SPECIALNEEDCODEID
         where JSN.ID is null)

    /*FIND TRAITS*/
    select    
        AVAIL.OCCURRENCEID,
        AVAIL.JOBID,
        AVAIL.STARTDATE,
        cast((select count(*) from dbo.[UFN_JOB_TRAITS](AVAIL.JOBID) where TRAITTYPEID <> 7) as numeric(13,2)) AS TRAITCOUNT,
        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(VOLUNTEERSKILLLEVEL.ID)) TRAITHIT,
        sum(
                case 
                    when JOBADMINISTRATIVE.ISREQUIRED = 1 and VOLUNTEERADMINISTRATIVE.ID is null then 1
                    when JOBCERTIFICATION.ISREQUIRED = 1 and VOLUNTEERCERTIFICATION.ID is null then 1
                    when JOBCOURSE.ISREQUIRED = 1 and VOLUNTEERCOURSE.ID is null then 1
                    when JOBINTEREST.ISREQUIRED = 1 and VOLUNTEERINTEREST.ID is null then 1
                    when JOBLICENSE.ISREQUIRED = 1 and VOLUNTEERLICENSE.ID is null then 1
                    when JOBMEDICAL.ISREQUIRED = 1 and VOLUNTEERMEDICAL.ID is null then 1
                    when JOBSKILL.ISREQUIRED = 1 and VOLUNTEERSKILLLEVEL.ID is null then 1
                    else 0
                end
            ) as MISSINGREQUIREDTRAITCOUNT
    into #TRAITS
    from #AVAILABLE AVAIL
    left outer join dbo.JOBADMINISTRATIVE
        on JOBADMINISTRATIVE.JOBID = AVAIL.JOBID 
    left outer join dbo.VOLUNTEERADMINISTRATIVE
        on VOLUNTEERADMINISTRATIVE.VOLUNTEERID = @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 = AVAIL.JOBID 
    left outer join dbo.VOLUNTEERCERTIFICATION
        on VOLUNTEERCERTIFICATION.VOLUNTEERID = @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 = AVAIL.JOBID 
    left outer join dbo.VOLUNTEERCOURSE
        on VOLUNTEERCOURSE.VOLUNTEERID = @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 = AVAIL.JOBID 
    left outer join dbo.VOLUNTEERINTEREST
        on VOLUNTEERINTEREST.VOLUNTEERID = @VOLUNTEERID 
                and VOLUNTEERINTEREST.VOLUNTEERINTERESTCODEID = JOBINTEREST.VOLUNTEERINTERESTCODEID 
    left outer join dbo.JOBLICENSE
        on JOBLICENSE.JOBID = AVAIL.JOBID 
    left outer join dbo.VOLUNTEERLICENSE
        on VOLUNTEERLICENSE.VOLUNTEERID = @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 = AVAIL.JOBID 
    left outer join dbo.VOLUNTEERMEDICAL
        on VOLUNTEERMEDICAL.VOLUNTEERID = @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 = AVAIL.JOBID 
    left outer join dbo.VOLUNTEERSKILLLEVEL as [JOBSKILLLEVEL]
        on JOBSKILLLEVEL.ID = JOBSKILL.SKILLLEVELID
    left outer join dbo.VOLUNTEERSKILL
        on VOLUNTEERSKILL.VOLUNTEERID = @VOLUNTEERID 
                and VOLUNTEERSKILL.SKILLCODEID = JOBSKILL.SKILLCODEID
    left outer join dbo.VOLUNTEERSKILLLEVEL
        on VOLUNTEERSKILLLEVEL.ID = VOLUNTEERSKILL.SKILLLEVELID
                and VOLUNTEERSKILLLEVEL.SEQUENCE >= JOBSKILLLEVEL.SEQUENCE
    group by AVAIL.OCCURRENCEID,
            AVAIL.JOBID,
            AVAIL.STARTDATE

    create index TRAITS_JOBID on #TRAITS(JOBID);

    /*PUT IT ALL TOGETHER */
    select  
        TRAITS.JOBID,
        TRAITS.OCCURRENCEID,
        (cast(TRAITS.OCCURRENCEID as nvarchar(36)) + cast(@VOLUNTEERID as nvarchar(36)) + convert(nvarchar, TRAITS.STARTDATE, 112)) ASSIGN_ACTION,
        (cast(@VOLUNTEERID as nvarchar(36)) + cast(TRAITS.OCCURRENCEID as nvarchar(36))) ADD_MULTIPLE_ACTION,
        JOB.NAME NAME,
        '(' + cast(cast(round(
            case 
                when TRAITCOUNT = 0 then 1
                else TRAITHIT/TRAITCOUNT end * 100, 0
        as int) as varchar) + '% Match)' DESCRIPTION,
        TRAITS.STARTDATE STARTDATE,
        TRAITS.STARTDATE ENDDATE,
        JOBOCCURRENCE.STARTTIME,
        JOBOCCURRENCE.ENDTIME
    from #TRAITS TRAITS
    inner join dbo.JOBOCCURRENCE
        on TRAITS.OCCURRENCEID = JOBOCCURRENCE.ID
    inner join dbo.JOB 
        on TRAITS.JOBID = JOB.ID
    where
        coalesce(TRAITS.MISSINGREQUIREDTRAITCOUNT, 0) = 0
    order by 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