USP_REPORT_JOBOCCURRENCESCHEDULE

Stored procedure as datasource for job occurrence schedule report.

Parameters

Parameter Parameter Type Mode Description
@JOBID uniqueidentifier IN
@JOBOCCURRENCEID uniqueidentifier IN
@DEPARTMENTID uniqueidentifier IN
@RANGE int IN
@FROM datetime IN
@TO datetime IN
@CURRENTAPPUSERID uniqueidentifier IN

Definition

Copy


            CREATE procedure dbo.USP_REPORT_JOBOCCURRENCESCHEDULE(
                @JOBID uniqueidentifier = null,
                @JOBOCCURRENCEID uniqueidentifier = null,
                @DEPARTMENTID uniqueidentifier = null,
                @RANGE int = null,
                @FROM datetime = null,
                @TO datetime = null,
                @CURRENTAPPUSERID uniqueidentifier = null
            )
            as
                set nocount on;

                begin try
                    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);

                    /* @RANGE is a legacy field left to allow for backwards compatibility*/
                    /* if @RANGE is null then use the dates passed in */

                    if @RANGE = 1 --this month

                    BEGIN
                        select @FROM = dbo.UFN_DATE_THISMONTH_FIRSTDAY(getdate(), 0);
                        select @TO = dbo.UFN_DATE_THISMONTH_LASTDAY(getdate(), 0);
                    END

                    if @RANGE = 2 --next month

                    BEGIN
                        select @FROM = dbo.UFN_DATE_NEXTMONTH_FIRSTDAY(getdate(), 0);
                        select @TO = dbo.UFN_DATE_NEXTMONTH_LASTDAY(getdate(), 0);
                    END

                    if @RANGE = 3 --this week

                    BEGIN
                        select @FROM = dbo.UFN_DATE_THISWEEK_FIRSTDAY(getdate(), 0);
                        select @TO = dbo.UFN_DATE_THISWEEK_LASTDAY(getdate(), 0);
                    END

                    if @RANGE = 4 --next week

                    BEGIN
                        select @FROM = dbo.UFN_DATE_NEXTWEEK_FIRSTDAY(getdate(), 0);
                        select @TO = dbo.UFN_DATE_NEXTWEEK_LASTDAY(getdate(), 0);
                    END

                    declare @RESULTS table
                    (
                        JOBNAME nvarchar(100),
                        JOBOCCURRENCEDESCRIPTION nvarchar(30),
                        LOCATION nvarchar(100),
                        DEPARTMENT nvarchar(100),
                        ASSIGNMENTDATE datetime,
                        CONSTITUENTID uniqueidentifier,
                        VOLUNTEERNAME nvarchar(200),
                        NUMBER nvarchar(100),
                        STARTTIMEDATE datetime,
                        ENDTIMEDATE datetime,
                        JOBOCCURRENCEID uniqueidentifier
                    )

                    insert into @RESULTS
                    SELECT  JOB.NAME AS JOBNAME, 
                            JOBOCCURRENCE.DESCRIPTION AS JOBOCCURRENCEDESCRIPTION, 
                            VOLUNTEERLOCATIONCODE.DESCRIPTION AS LOCATION, 
                            DEPARTMENTCODE.DESCRIPTION AS DEPARTMENT, 
                            SCHED.ASSIGNMENTDATE, 
                            VOLUNTEERASSIGNMENT.VOLUNTEERID as CONSTITUENTID,
                            null as VOLUNTEERNAME,
                            null as NUMBER,
                            case when len(JOBOCCURRENCE.STARTTIME)=4 then convert(datetime, left(JOBOCCURRENCE.STARTTIME, 2) + ':' + right(JOBOCCURRENCE.STARTTIME, 2)) else null end STARTTIMEDATE,
                            case when len(JOBOCCURRENCE.ENDTIME)=4 then convert(datetime, left(JOBOCCURRENCE.ENDTIME, 2) + ':' + right(JOBOCCURRENCE.ENDTIME, 2)) else null end ENDTIMEDATE,
                            JOBOCCURRENCE.ID as JOBOCCURRENCEID
                    FROM UFN_JOBOCCURRENCE_SCHEDULE(@FROM, @TO, @JOBOCCURRENCEID, null) SCHED
                    INNER JOIN JOBOCCURRENCE ON SCHED.OCCURRENCEID = JOBOCCURRENCE.ID 
                    INNER JOIN JOB ON JOBOCCURRENCE.JOBID = JOB.ID 
                    LEFT OUTER JOIN VOLUNTEERASSIGNMENT ON SCHED.OCCURRENCEID = VOLUNTEERASSIGNMENT.JOBOCCURRENCEID AND SCHED.ASSIGNMENTDATE = VOLUNTEERASSIGNMENT.DATE
                    LEFT OUTER JOIN VOLUNTEERLOCATIONCODE ON JOBOCCURRENCE.LOCATIONCODEID = VOLUNTEERLOCATIONCODE.ID 
                    LEFT OUTER JOIN DEPARTMENTCODE ON JOBOCCURRENCE.DEPARTMENTCODEID = DEPARTMENTCODE.ID 
                    WHERE (@DEPARTMENTID is null or JOBOCCURRENCE.DEPARTMENTCODEID = @DEPARTMENTID)
                        and (@JOBID is null or JOB.ID = @JOBID)
                        and (@CURRENTAPPUSERID is null or dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID,JOBOCCURRENCE.SITEID)=1)
                        and (@CURRENTAPPUSERID is null or dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID,JOB.SITEID)=1)
                    union all

                    --recurring jobs

                    SELECT  JOB.NAME AS JOBNAME, 
                            JOBOCCURRENCE.DESCRIPTION AS JOBOCCURRENCEDESCRIPTION, 
                            VOLUNTEERLOCATIONCODE.DESCRIPTION AS LOCATION, 
                            DEPARTMENTCODE.DESCRIPTION AS DEPARTMENT, 
                            VOLUNTEERASSIGNMENT.DATE as ASSIGNMENTDATE, 
                            VOLUNTEERASSIGNMENT.VOLUNTEERID as CONSTITUENTID,
                            null as VOLUNTEERNAME,
                            null as NUMBER,
                            case when len(JOBOCCURRENCE.STARTTIME)=4 then convert(datetime, left(JOBOCCURRENCE.STARTTIME, 2) + ':' + right(JOBOCCURRENCE.STARTTIME, 2)) else null end STARTTIMEDATE,
                            case when len(JOBOCCURRENCE.ENDTIME)=4 then convert(datetime, left(JOBOCCURRENCE.ENDTIME, 2) + ':' + right(JOBOCCURRENCE.ENDTIME, 2)) else null end ENDTIMEDATE,
                            JOBOCCURRENCE.ID as JOBOCCURRENCEID
                    FROM JOBOCCURRENCE
                    INNER JOIN JOB ON JOBOCCURRENCE.JOBID = JOB.ID 
                    LEFT OUTER JOIN VOLUNTEERASSIGNMENT ON JOBOCCURRENCE.ID = VOLUNTEERASSIGNMENT.JOBOCCURRENCEID
                    LEFT OUTER JOIN VOLUNTEERLOCATIONCODE ON JOBOCCURRENCE.LOCATIONCODEID = VOLUNTEERLOCATIONCODE.ID 
                    LEFT OUTER JOIN DEPARTMENTCODE ON JOBOCCURRENCE.DEPARTMENTCODEID = DEPARTMENTCODE.ID 
                    WHERE not exists (select top 1 1 from dbo.UFN_JOBOCCURRENCE_SCHEDULE(VOLUNTEERASSIGNMENT.DATE, VOLUNTEERASSIGNMENT.DATE, JOBOCCURRENCE.ID, null))
                        and (VOLUNTEERASSIGNMENT.DATE between @FROM and @TO)
                        and (@DEPARTMENTID is null or JOBOCCURRENCE.DEPARTMENTCODEID = @DEPARTMENTID)
                        and (@JOBID is null or JOB.ID = @JOBID)
                        and (@JOBOCCURRENCEID is null or JOBOCCURRENCE.ID = @JOBOCCURRENCEID)
                        and (@CURRENTAPPUSERID is null or dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID,JOBOCCURRENCE.SITEID)=1)
                        and (@CURRENTAPPUSERID is null or dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID,JOB.SITEID)=1)

                    update @RESULTS
                    set
                        VOLUNTEERNAME = 
                            coalesce (
                                case
                                    when CONSTITUENT.ISORGANIZATION = 1 then case CONSTITUENT.KEYNAMEPREFIX when '' then CONSTITUENT.KEYNAME else CONSTITUENT.KEYNAME + ', ' + CONSTITUENT.KEYNAMEPREFIX end
                                    else dbo.UFN_NAMEFORMAT_08(CONSTITUENT.ID, CONSTITUENT.KEYNAME, CONSTITUENT.FIRSTNAME, CONSTITUENT.MIDDLENAME, null, null, null, null, null, null, null)
                                end,
                                'No assignments'
                            ),
                        NUMBER = dbo.UFN_PHONE_GETINTERNATIONALNUMBER(PHONE.COUNTRYID, PHONE.NUMBER)
                    from
                        @RESULTS R
                        left outer join dbo.CONSTITUENT with (nolock) on 
                            R.CONSTITUENTID = CONSTITUENT.ID 
                            and (@ISADMIN = 1 or 
                                    (
                                        (@APPUSER_IN_NONRACROLE = 1 or
                                        dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, CONSTITUENT.ID, @APPUSER_IN_NOSECGROUPROLE) = 1)
                                        and
                                        (@APPUSER_IN_NONSITEROLE = 1 or
                                        dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT_BYSITE(@CURRENTAPPUSERID, CONSTITUENT.ID, @APPUSER_IN_NOSITEROLE) = 1)
                                    )
                                )
                        left outer join PHONE on PHONE.CONSTITUENTID = CONSTITUENT.ID and PHONE.ISPRIMARY = 1;

                    --Since volunteers the user doesn't have access to (due to constituent record security)

                    --  show up in the results as "No assignment" rows, we need to filter the results for

                    --  those rows.  We should only show a "No assignment" row if there are no non-"No assignment"

                    --  rows for the given job occurrence and even then, only show one such row.


                    select distinct 
                        r1.JOBNAME,
                        r1.JOBOCCURRENCEDESCRIPTION,
                        cast('' as nvarchar(1)) as STARTTIME,
                        cast('' as nvarchar(1)) as ENDTIME,
                        r1.LOCATION,
                        r1.DEPARTMENT,
                        r1.ASSIGNMENTDATE,
                        r1.VOLUNTEERNAME,
                        r1.NUMBER,
                        r1.STARTTIMEDATE,
                        r1.ENDTIMEDATE,
                        r1.JOBOCCURRENCEID
                    from @RESULTS r1
                    where VOLUNTEERNAME <> 'No assignments' 
                        or     (VOLUNTEERNAME = 'No assignments'
                            and not    exists(
                                select r2.JOBNAME 
                                from @RESULTS r2
                                where                            
                                    r2.VOLUNTEERNAME <> 'No assignments' and
                                    (r2.JOBNAME=r1.JOBNAME or (r2.JOBNAME is null and r1.JOBNAME is null)) and
                                    (r2.JOBOCCURRENCEDESCRIPTION=r1.JOBOCCURRENCEDESCRIPTION or (r2.JOBOCCURRENCEDESCRIPTION is null and r1.JOBOCCURRENCEDESCRIPTION is null)) and
                                    (r2.LOCATION=r1.LOCATION or (r2.LOCATION is null and r1.LOCATION is null)) and
                                    (r2.DEPARTMENT=r1.DEPARTMENT or (r2.DEPARTMENT is null and r1.DEPARTMENT is null)) and
                                    (r2.ASSIGNMENTDATE=r1.ASSIGNMENTDATE or (r2.ASSIGNMENTDATE is null and r1.ASSIGNMENTDATE is null)) and
                                    --Bug 3831 - AdamBu - Comparing on NUMBER allows volunteers with number to show with the 'No Assignments' row.

                                    --(r2.NUMBER=r1.NUMBER or (r2.NUMBER is null and r1.NUMBER is null)) and

                                    (r2.STARTTIMEDATE=r1.STARTTIMEDATE or (r2.STARTTIMEDATE is null and r1.STARTTIMEDATE is null)) and
                                    (r2.ENDTIMEDATE=r1.ENDTIMEDATE or (r2.ENDTIMEDATE is null and r1.ENDTIMEDATE is null)) and
                                    (r2.JOBOCCURRENCEID=r1.JOBOCCURRENCEID or (r2.JOBOCCURRENCEID is null and r1.JOBOCCURRENCEID is null))
                                    -- Don't check first and last name since those are used to compute VOLUNTEERNAME.

                                    -- There are better ways of doing this but since we have to keep whole name in for binary compatibility purposes,

                                    -- I don't think it makes sense to not get full name inside of the original select.

                            )
                        )
                    order by
                        --order by date/time first since this is supposed to be schedule

                        r1.ASSIGNMENTDATE,
                        r1.STARTTIMEDATE,
                        r1.ENDTIMEDATE,

                        --then order by the fields which are shown on the report, in the order in which they are shown

                        r1.JOBNAME,
                        r1.JOBOCCURRENCEDESCRIPTION,
                        r1.DEPARTMENT,
                        r1.LOCATION,
                        r1.VOLUNTEERNAME;
                end try

                begin catch
                    exec dbo.USP_RAISE_ERROR;
                    return 1;
                end catch

                return 0;