USP_DATAFORMTEMPLATE_ADD_ENROLLGROUPINCLASSES

The save procedure used by the add dataform template "Enroll group in classes".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@ENROLLMETHOD tinyint IN Enroll students using
@FACULTYID uniqueidentifier IN Faculty
@CLASSID uniqueidentifier IN Class
@GRADELEVELID uniqueidentifier IN Grade level
@STUDENTSELECTIONID uniqueidentifier IN Selection
@CLASSES xml IN
@EXCEEDTARGETCLASSSIZE bit IN Exceed target class size

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_ENROLLGROUPINCLASSES
(
    @ID uniqueidentifier = null output,
    @CHANGEAGENTID uniqueidentifier = null,
    @CURRENTAPPUSERID uniqueidentifier,
    @ENROLLMETHOD tinyint,
    @FACULTYID uniqueidentifier = null,
    @CLASSID uniqueidentifier = null,
    @GRADELEVELID uniqueidentifier = null,
    @STUDENTSELECTIONID uniqueidentifier = null,
    @CLASSES xml = null,
    @EXCEEDTARGETCLASSSIZE bit = null
)
as
    declare @SESSIONID uniqueidentifier
    declare @SESSION_STARTDATE date
    declare @SESSION_ENDDATE date
    declare @STUDENTCOUNT int

    if @CHANGEAGENTID is null  
    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

    declare @CURRENTDATE datetime
    set @CURRENTDATE = getdate()

    select
        @SESSIONID = APPUSERSESSION.SESSIONID,
        @SESSION_STARTDATE = min(STARTDATE),
        @SESSION_ENDDATE = max(ENDDATE)
    from dbo.TERM
        inner join dbo.APPUSERSESSION on TERM.SESSIONID = APPUSERSESSION.SESSIONID
    where APPUSERSESSION.ID = @CURRENTAPPUSERID
    group by APPUSERSESSION.ID, APPUSERSESSION.SESSIONID

    declare @STUDENTS table
    (
        ID uniqueidentifier
    )

    if @ENROLLMETHOD = 0
    begin
        insert into @STUDENTS
        select EDUCATIONALHISTORY.CONSTITUENTID
        from dbo.STUDENTPROGRESSION
            inner join dbo.EDUCATIONALHISTORY on STUDENTPROGRESSION.ENROLLMENTID = EDUCATIONALHISTORY.ID
        where STUDENTPROGRESSION.HOMEROOMTEACHERID = @FACULTYID
            and STUDENTPROGRESSION.STARTDATE <= @SESSION_STARTDATE
            and STUDENTPROGRESSION.ENDDATE >= @SESSION_ENDDATE 
        group by EDUCATIONALHISTORY.CONSTITUENTID

        set @STUDENTCOUNT = @@ROWCOUNT
    end
    else if @ENROLLMETHOD = 1
    begin
        insert into @STUDENTS
        select EDUCATIONALHISTORY.CONSTITUENTID
        from dbo.STUDENTPROGRESSION
            inner join dbo.EDUCATIONALHISTORY on STUDENTPROGRESSION.ENROLLMENTID = EDUCATIONALHISTORY.ID
            inner join dbo.STUDENTCOURSE on EDUCATIONALHISTORY.CONSTITUENTID = STUDENTCOURSE.STUDENTID
            inner join dbo.STUDENTCLASSMEETINGGROUP on STUDENTCOURSE.ID = STUDENTCLASSMEETINGGROUP.STUDENTCOURSEID
            inner join dbo.CLASSMEETINGGROUP on STUDENTCLASSMEETINGGROUP.CLASSMEETINGGROUPID = CLASSMEETINGGROUP.ID
        where CLASSMEETINGGROUP.CLASSID = @CLASSID
            and STUDENTPROGRESSION.STARTDATE <= @SESSION_STARTDATE
            and STUDENTPROGRESSION.ENDDATE >= @SESSION_ENDDATE
      and STUDENTCLASSMEETINGGROUP.STATUSCODE = 0
        group by EDUCATIONALHISTORY.CONSTITUENTID

        set @STUDENTCOUNT = @@ROWCOUNT
    end
    else if @ENROLLMETHOD = 2
    begin
        insert into @STUDENTS
        select EDUCATIONALHISTORY.CONSTITUENTID
        from dbo.STUDENTPROGRESSION
            inner join dbo.EDUCATIONALHISTORY on STUDENTPROGRESSION.ENROLLMENTID = EDUCATIONALHISTORY.ID
            inner join SCHOOLGRADELEVEL on STUDENTPROGRESSION.SCHOOLGRADELEVELID = SCHOOLGRADELEVEL.ID
        where SCHOOLGRADELEVEL.GRADELEVELID = @GRADELEVELID
            and STUDENTPROGRESSION.STARTDATE <= @SESSION_STARTDATE
            and STUDENTPROGRESSION.ENDDATE >= @SESSION_ENDDATE
        group by EDUCATIONALHISTORY.CONSTITUENTID

        set @STUDENTCOUNT = @@ROWCOUNT
    end
    else if @ENROLLMETHOD = 3
    begin
        insert into @STUDENTS (ID)
        exec dbo.USP_STUDENT_GETSTUDENTSELECTION @STUDENTSELECTIONID

        delete from @STUDENTS
        from @STUDENTS STUDENTS
            left join dbo.EDUCATIONALHISTORY on STUDENTS.ID = EDUCATIONALHISTORY.CONSTITUENTID
            left join dbo.STUDENTPROGRESSION on EDUCATIONALHISTORY.ID = STUDENTPROGRESSION.ENROLLMENTID
                and STUDENTPROGRESSION.STARTDATE <= @SESSION_STARTDATE
                and STUDENTPROGRESSION.ENDDATE >= @SESSION_ENDDATE
        where STUDENTPROGRESSION.ID is null

        select @STUDENTCOUNT = count(STUDENTS.ID)
        from @STUDENTS STUDENTS
    end

    if @STUDENTCOUNT <= 0
    begin
        raiserror('BBERR_ENROLLGROUPINCLASS_NOSTUDENTS', 13, 1);
        return 1;
    end

    declare @CLASS table
    (
        ID uniqueidentifier,
        CLASSSIZETARGET int,
        CLASSSIZEMAXIMUM int,
        CURRENTCLASSSIZE int
    )

    insert into @CLASS
    (
        ID,
        CLASSSIZETARGET,
        CLASSSIZEMAXIMUM,
        CURRENTCLASSSIZE    -- Ignores students both in the class and in the list to be added

    )
    select
        CLASS.ID,
        CLASS.CLASSSIZETARGET,
        CLASS.CLASSSIZEMAXIMUM,
        coalesce(CLASSENROLLMENT.[COUNT], 0)
    from (select
            T.c.value('(CLASSID)[1]','uniqueidentifier') as ID
            from @CLASSES.nodes('/CLASSES/ITEM') as T(c)) CLASSES
        inner join dbo.CLASS on CLASSES.ID = CLASS.ID
        left join
        (
            select
                CLASSID,
                max([COUNT]) as [COUNT]
            from (
                select 
                    CLASSMEETINGGROUP.CLASSID,
                    (count(distinct STUDENTCLASSMEETINGGROUP.ID) - count(distinct STUDENTS.ID)) as [COUNT]
                from dbo.CLASSMEETINGGROUP
                    inner join dbo.STUDENTCLASSMEETINGGROUP on CLASSMEETINGGROUP.ID = STUDENTCLASSMEETINGGROUP.CLASSMEETINGGROUPID
                    inner join dbo.STUDENTCOURSE on STUDENTCLASSMEETINGGROUP.STUDENTCOURSEID = STUDENTCOURSE.ID
                    left join @STUDENTS STUDENTS on STUDENTCOURSE.STUDENTID = STUDENTS.ID
                where STUDENTCLASSMEETINGGROUP.STATUSCODE = 0
                group by CLASSMEETINGGROUP.ID, CLASSMEETINGGROUP.CLASSID
            ) T
            group by CLASSID
        ) CLASSENROLLMENT on CLASS.ID = CLASSENROLLMENT.CLASSID

    if exists(
        select 1
        from @CLASS
        where CLASSSIZEMAXIMUM > 0 and (CURRENTCLASSSIZE + @STUDENTCOUNT) > CLASSSIZEMAXIMUM)
    begin
        raiserror('BBERR_ENROLLGROUPINCLASS_MAXIMUMEXCEEDED', 13, 1);
        return 1;
    end

    -- validate that the number of students being added to every course is less then the number needed

    if @EXCEEDTARGETCLASSSIZE = 0 and exists(
        select 1
        from @CLASS
        where (CURRENTCLASSSIZE + @STUDENTCOUNT) > CLASSSIZETARGET)
    begin
        raiserror('BBERR_ENROLLGROUPINCLASSES_TARGETEXCEEDED', 13, 1);
        return 1;
    end

    declare @STUDENTCOURSE table
    (
        ID uniqueidentifier,
        STUDENTID uniqueidentifier,
        CLASSID uniqueidentifier,
        COURSEID uniqueidentifier,
        ADDRECORD bit
    )

    -- Select the existing class enrollment if one exists,

    --   to prevent adding the student to a class they are already in

    insert into @STUDENTCOURSE
    (
        ID,
        STUDENTID,
        CLASSID,
        COURSEID,
        ADDRECORD
    )
    select
        STUDENTCOURSES.ID,
        STUDENTS.ID as STUDENTID,
        CLASSES.ID as CLASSID,
        CLASS.COURSEID as COURSEID,
        0 as ADDRECORD
    from @STUDENTS STUDENTS
        cross join @CLASS CLASSES
        inner join dbo.CLASS on CLASSES.ID = CLASS.ID
        left join (
            select
                STUDENTCOURSE.ID,
                STUDENTCOURSE.STUDENTID,
                STUDENTCOURSE.COURSEID,
                CLASSMEETINGGROUP.CLASSID
            from dbo.STUDENTCOURSE
                left join dbo.STUDENTCLASSMEETINGGROUP on STUDENTCOURSE.ID = STUDENTCLASSMEETINGGROUP.STUDENTCOURSEID
                left join dbo.CLASSMEETINGGROUP on STUDENTCLASSMEETINGGROUP.CLASSMEETINGGROUPID = CLASSMEETINGGROUP.ID
            group by STUDENTCOURSE.ID, STUDENTCOURSE.STUDENTID, STUDENTCOURSE.COURSEID, CLASSMEETINGGROUP.CLASSID
        ) STUDENTCOURSES on STUDENTS.ID = STUDENTCOURSES.STUDENTID
            and CLASSES.ID = STUDENTCOURSES.CLASSID
            and CLASS.COURSEID = STUDENTCOURSES.COURSEID

    -- Select the first non-fulfilled request if one exists

    update @STUDENTCOURSE
    set
        ID = coalesce(STUDENTCOURSES2.ID, newid()),
        ADDRECORD = case when STUDENTCOURSES2.ID is null then 1 else 0 end
    from @STUDENTCOURSE STUDENTCOURSES
        left join
        ( 
            select
                STUDENTCOURSE.ID,
                STUDENTCOURSE.STUDENTID,
                CLASS.ID as CLASSID,
                STUDENTCOURSE.COURSEID,
                ROW_NUMBER() over (partition by STUDENTCOURSE.STUDENTID, CLASS.ID order by STUDENTCOURSE.DATEADDED) as ROW 
            from dbo.STUDENTCOURSE
                inner join dbo.STUDENTCOURSEREQUEST on STUDENTCOURSE.ID = STUDENTCOURSEREQUEST.ID
                inner join dbo.CLASS on STUDENTCOURSE.COURSEID = CLASS.COURSEID
            where STUDENTCOURSEREQUEST.STARTDATE <= CLASS.STARTDATE
                and STUDENTCOURSEREQUEST.ENDDATE >= CLASS.ENDDATE
                and (
                        STUDENTCOURSEREQUEST.CLASSSTARTDATE is null or
                        STUDENTCOURSEREQUEST.CLASSSTARTDATE = CLASS.STARTDATE
                    )
                and not exists (select ID from dbo.STUDENTCLASSMEETINGGROUP where STUDENTCOURSEID = STUDENTCOURSE.ID) 
        ) STUDENTCOURSES2 on STUDENTCOURSES2.STUDENTID = STUDENTCOURSES.STUDENTID
            and STUDENTCOURSES2.COURSEID = STUDENTCOURSES.COURSEID
            and STUDENTCOURSES2.CLASSID = STUDENTCOURSES.CLASSID
            and STUDENTCOURSES2.ROW = 1
    where STUDENTCOURSES.ID is null

    insert into dbo.STUDENTCOURSE
    (
        ID,
        STUDENTID,
        COURSEID,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
    )
    select
        STUDENTCOURSES.ID,
        STUDENTCOURSES.STUDENTID,
        STUDENTCOURSES.COURSEID,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
    from @STUDENTCOURSE STUDENTCOURSES
    where STUDENTCOURSES.ADDRECORD <> 0

    insert into dbo.STUDENTCLASSMEETINGGROUP
    (
        ID,
        STUDENTCOURSEID,
        CLASSMEETINGGROUPID,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
    )
    select
        newid(),
        STUDENTCOURSES.ID,
        CLASSMEETINGGROUP.ID,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
    from @STUDENTCOURSE STUDENTCOURSES
        inner join dbo.CLASSMEETINGGROUP on STUDENTCOURSES.CLASSID = CLASSMEETINGGROUP.CLASSID
        left join dbo.STUDENTCLASSMEETINGGROUP
            on CLASSMEETINGGROUP.ID = STUDENTCLASSMEETINGGROUP.CLASSMEETINGGROUPID
            and STUDENTCOURSES.ID = STUDENTCLASSMEETINGGROUP.STUDENTCOURSEID
    where STUDENTCLASSMEETINGGROUP.ID is null

return 0