USP_SCHEDULEDATE_GENERATEENTRIES

Generates schedule dates.

Parameters

Parameter Parameter Type Mode Description
@TERMID uniqueidentifier IN
@STARTDATE date IN
@ENDDATE date IN
@TIMETABLEDAYID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN

Definition

Copy


            CREATE PROCEDURE [dbo].[USP_SCHEDULEDATE_GENERATEENTRIES] 
            (
                @TERMID uniqueidentifier,
                @STARTDATE date = null, -- date to generate from

                @ENDDATE date = null, -- date to generate to

                @TIMETABLEDAYID uniqueidentifier = null, -- used to adjust the cycle day

                @CHANGEAGENTID uniqueidentifier = null,
                @CHANGEDATE datetime = null
            )
            as
                set nocount on

                if @CHANGEAGENTID is null
                    exec USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

                if @CHANGEDATE is null
                    set @CHANGEDATE = getdate()

                if @STARTDATE is null
                    select @STARTDATE = STARTDATE from TERM where TERM.ID = @TERMID

                if @ENDDATE is null
                    select @ENDDATE = ENDDATE from TERM where TERM.ID = @TERMID 

                declare @SCHOOLID uniqueidentifier       
                declare @SESSIONID uniqueidentifier
                declare @STARTDAYSEQUENCE integer --term starts with selection; used when setting rownumber offset

                declare @DAYCOUNT integer --used for modulus to repeat day entries for all dates

                declare @TIMETABLEID uniqueidentifier 
                select 
                    @SCHOOLID = ACADEMICYEAR.SCHOOLID,
                    @SESSIONID = SESSION.ID,
                    @STARTDAYSEQUENCE = CYCLEDAY.SEQUENCE - 1, -- bring SEQUENCE to zero base

                    @DAYCOUNT = 
                        (select count(CYCLEDAY.ID) 
                         from CYCLEDAY 
                         inner join TIMETABLE 
                            on TIMETABLE.CYCLEID = CYCLEDAY.CYCLEID
                         inner join SESSION S
                            on S.TIMETABLEID = TIMETABLE.ID
                         where S.ID = SESSION.ID),
                    @TIMETABLEID = SESSION.TIMETABLEID
                from 
                    TERM
                inner join SESSION 
                    on SESSION.ID = TERM.SESSIONID
                inner join ACADEMICYEAR 
                    on ACADEMICYEAR.ID = SESSION.ACADEMICYEARID 
                inner join TIMETABLEDAY
                    on TIMETABLEDAY.ID = Coalesce(@TIMETABLEDAYID, TERM.TIMETABLEDAYID)
                inner join CYCLEDAY 
                    on CYCLEDAY.ID = TIMETABLEDAY.CYCLEDAYID
                where TERM.ID = @TERMID

                declare @TempTbl table (
                   [ID] uniqueidentifier,
                   [DATE] date,
                   [INSESSION] bit,
                   [TIMETABLEDAYID] uniqueidentifier,
                   [ROWOFFSET] integer)

                insert into @TempTbl (ID, DATE
                select 
                    newid(),
                    DATEADD(d,NUM,@STARTDATE)
                from 
                    NUMBERS 
                where 
                    DATEADD(d,NUM,@STARTDATE) <= @ENDDATE

                update @TempTbl 
                    set INSESSION = 
                        (select case 
                        when (DATENAME(WEEKDAY,DATE) = 'Sunday' and (select SUNDAY from SESSION where ID = @SESSIONID) = 1) then 1 
                        when (DATENAME(WEEKDAY,DATE) = 'Monday' and (select MONDAY from SESSION where ID = @SESSIONID) = 1) then 1 
                        when (DATENAME(WEEKDAY,DATE) = 'Tuesday' and (select TUESDAY from SESSION where ID = @SESSIONID) = 1) then 1 
                        when (DATENAME(WEEKDAY,DATE) = 'Wednesday' and (select WEDNESDAY from SESSION where ID = @SESSIONID) = 1) then 1 
                        when (DATENAME(WEEKDAY,DATE) = 'Thursday' and (select THURSDAY from SESSION where ID = @SESSIONID) = 1) then 1 
                        when (DATENAME(WEEKDAY,DATE) = 'Friday' and (select FRIDAY from SESSION where ID = @SESSIONID) = 1) then 1 
                  when (DATENAME(WEEKDAY,DATE) = 'Saturday' and (select SATURDAY from SESSION where ID = @SESSIONID) = 1) then 1 
                        else 0 end)

                declare @offset integer
                -- subtract 1 to start ROWOFFSET offset at zero base 

                select @offset = (@STARTDAYSEQUENCE - 1

                -- set row number starting from offset

                update  @TempTbl
                set @offset = 
                    ROWOFFSET = @offset + 1
                where INSESSION = 1

                update @TempTbl
                set TIMETABLEDAYID =
                    (select TIMETABLEDAY.ID 
                    from 
                        TIMETABLEDAY 
                    inner join CYCLEDAY 
                        on CYCLEDAY.ID = TIMETABLEDAY.CYCLEDAYID
                    where (TIMETABLEDAY.TIMETABLEID = @TIMETABLEID) and
                            (SEQUENCE = (ROWOFFSET % @DAYCOUNT) + 1)) -- add 1 to find one based sequence

                from 
                    @TempTbl
                where INSESSION = 1

                if @@Error <> 0
                    return 1

                -- delete existing entries

                delete 
                    SCHEDULEDATE
                where SCHOOLID = @SCHOOLID and 
                    DATE >= @STARTDATE and DATE <=@ENDDATE

                -- insert new items

                insert into [SCHEDULEDATE] 
                    ([SCHOOLID], 
                    [DATE],
                    [ID],
                    [INSESSION],
                    [TIMETABLEDAYID],                
                    ADDEDBYID, 
                    CHANGEDBYID, 
                    DATEADDED, 
                    DATECHANGED)
                select @SCHOOLID
                    [DATE],
                    [ID],
                    [INSESSION],
                    [TIMETABLEDAYID], 
                    @CHANGEAGENTID
                    @CHANGEAGENTID
                    @CHANGEDATE
                    @CHANGEDATE
                from @TempTbl as [temp]

                --reset all daycounts for the given term

                declare @SESSIONSTARTDATE date
                declare @SESSIONENDDATE date
                select @SESSIONSTARTDATE = STARTDATE from dbo.UFN_SESSION_GETDATES(@SESSIONID)               
                select @SESSIONENDDATE = ENDDATE from dbo.UFN_SESSION_GETDATES(@SESSIONID)  

                update SCHEDULEDATE set SCHEDULEDATE.DAYCOUNT = SD.ROWNUM 
                from 
                (
                    select 
                        SCHEDULEDATE.DATE, SCHEDULEDATE.SCHOOLID, 
                        ROW_NUMBER() OVER(ORDER BY DATE) as ROWNUM 
                    from 
                        SCHEDULEDATE 
                    where 
                        SCHEDULEDATE.DATE >= @SESSIONSTARTDATE and 
                        SCHEDULEDATE.DATE <= @SESSIONENDDATE and 
                        SCHEDULEDATE.SCHOOLID = @SCHOOLID AND INSESSION = 1
                ) SD
                where SD.DATE = SCHEDULEDATE.DATE and SD.SCHOOLID = SCHEDULEDATE.SCHOOLID 

                if @@Error <> 0
                    return 2

                return 0