USP_DATALIST_VOLUNTEERMATCHES
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. |
@DAYLIST | nvarchar(max) | IN | Days |
@CURRENTAPPUSERID | uniqueidentifier | IN | Input parameter indicating the ID of the current user. |
Definition
Copy
CREATE procedure dbo.USP_DATALIST_VOLUNTEERMATCHES (@VOLUNTEERID uniqueidentifier = null, @DAYLIST nvarchar(max) = '', @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
/*FIND AVAILABLE*/
select VACANCIES.OCCURRENCEID, JOBOCCURRENCE.JOBID, replace(dbo.UDA_BUILDLIST(distinct convert(nvarchar(8), AVAILABLE.AVAILABLEDATE, 112)), '; ', '') DAYS
into #AVAILABLE
from [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.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 (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
(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)
group by VACANCIES.OCCURRENCEID, JOBOCCURRENCE.JOBID
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.DAYS,
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.DAYS
create index TRAITS_JOBID on #TRAITS(JOBID);
/*PUT IT ALL TOGETHER */
select distinct
TRAITS.OCCURRENCEID,
cast(round(case when TRAITCOUNT = 0 then 1
else TRAITHIT/TRAITCOUNT end * 100, 0) as int) as MATCH,
JOB.NAME + char(13) + JOBOCCURRENCE.DESCRIPTION as NAME,
JOB.ID,
TRAITS.DAYS
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 MATCH desc, 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