<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/css" href="Release-Notes.css"?>
<!DOCTYPE release-history PUBLIC "-//UniTime//UniTime Release Notes DTD/EN" "Release-Notes.dtd">
<!--
 * Licensed to The Apereo Foundation under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for
 * additional information regarding copyright ownership.
 *
 * The Apereo Foundation licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 -->

<release-history>

<doc-title>UniTime 4.8 Release Notes</doc-title>

<release>
	<version>4.8.224</version>
	<release-date>Sun, 24 May 2026</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Suggestions</name>
			<description>
				<line>Compute and populate conflicting constraints when a placement with conflicts is selected from the Suggestions table in the Placements mode.</line>
				<line>Fixed a problem when an invalid placement is selected for the 2nd or later class from the Selected Assignment, which was causing conflicting placements to get unassigned.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Subject Areas: Delete</name>
			<description>
				<line>Fixed a Hibernate exception (ObjectDeletedException) when deleting a subject area that has some not-offered courses.</line>
				<line>Caused by the latest Hibernate upgrade (to version 6.6).</line>
			</description>
		</item>
		<item>
			<name>Student &amp; Instructor Name Format</name>
			<description>
				<line>Fixed an exception that was thrown when a first name or a last name is just a single space for name formats using initials.</line>
			</description>
		</item>
		<item>
			<name>Add/Edit Subject Area</name>
			<description>
				<line>List all available departments (excluding externally managed ones) for a subject area.
					<line>Instead of those that are being used (have a manager, a room, or another subject).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Export: Encrypted URLs</name>
			<description>
				<line>Fixed a potential vulnerability problem with encrypted export URLs, allowing an attacker to inject a wrong user ID.</line>
				<line>It is now possible to specify which exporters allow encrypted URL authorizations (by default, only the iCalendar exports are allowed).
					<line>This can be configured using the unitime.export.authorizeEncodedQueries application property.</line>
				</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.8.219</version>
	<release-date>Mon, 27 Oct 2025</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Edit Course Offering</name>
			<description>
				<line>Fixed a Hibernate error thrown when a course that has been just added in a cross-list is being edited.</line>
				<line>Caused by the latest Hibernate upgrade (to version 6.6).</line>
			</description>
		</item>
		<item>
			<name>Class Assignment</name>
			<description>
				<line>Fixed a potential Hibernate exception (TransientObjectException) when making a larger change.</line>
				<line>Caused by the latest Hibernate upgrade (to version 6.6).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Data Exchange</title>
		<item>
			<name>Course Offering XML Import</name>
			<description>
				<line>Fixed a Hibernate exception when importing exams with instructors.</line>
				<line>Caused by the latest Hibernate upgrade (to version 6.6).</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.8.216</version>
	<release-date>Tue, 9 Sep 2025</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Curricula: Add/Edit Curriculum</name>
			<description>
				<line>Added an ability to customize the course selection box width (unitime.curricula.courseWidth property, defaults to 130px).</line>
				<line>The setting gets also used to set the course selection box width on the Add/Edit Reservation page.</line>
			</description>
		</item>
		<item>
			<name>Instructional Offering Cross Lists</name>
			<description>
				<line>Fixed a Hibernate exception when removing/addding a course from/to a cross-list, if the course is listed as demand course on some other course of the cross-list.</line>
				<line>Caused by the latest Hibernate upgrade (to version 6.6).</line>
			</description>
		</item>
		<item>
			<name>Multiple Class Setup</name>
			<description>
				<line>Fixed a Hibernate exception when removing multiple classes assigned to the same instructor.</line>
				<line>Caused by the latest Hibernate upgrade (to version 6.6).</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.8.213</version>
	<release-date>Sat, 9 Aug 2025</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Instructional Offering Cross Lists</name>
			<description>
				<line>Fixed a Hibernate exception when removing a course from a cross-list that has some advisor course recommendations.</line>
				<line>Likely caused by the latest Hibernate upgrade (to version 6.6).</line>
			</description>
		</item>
		<item>
			<name>Multiple Class Setup</name>
			<description>
				<line>Fixed a Hibernate exception that is sometimes thrown when deleting two or more classes in a parent-child relation.</line>
				<line>Likely caused by the latest Hibernate upgrade (to version 6.6).</line>
			</description>
		</item>
		
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Authentication &amp; Authorization: User Name</name>
			<description>
				<line>Added an ability to use the student's name from the most recent applicable active academic session as the user name.
					<line>Enable by setting unitime.authorization.preferStudentName to true (defaults to false).</line>
				</line>
				<line>Added an ability to customize user name format by setting unitime.authorization.userNameFormat, defaults to last-first-middle.</line>
			</description>
		</item>
		<item>
			<name>Data Exchange: Course Offering XML Import</name>
			<description>
				<line>Removed a Hibernate session refresh that was occasionally causing the import to fail after the Hibernate upgrade to version 6.6.</line>
			</description>
		</item>
		<item>
			<name>Student Groups, Solver Parameters</name>
			<description>
				<line>Corrected the Export CSV/PDF when the filter is set to All.</line>
			</description>
		</item>
		<item>
			<name>Roll Forward Session: Roll Exam Configuration Data</name>
			<description>
				<line>Fixed the QueryTypeMismatchException when checking for existing examination period.</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.8.204</version>
	<release-date>Thu, 26 Jun 2025</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Suggestions, Instructor Survey: Maximize</name>
			<description>
				<line>Added an ability to maximize the Suggestions and Instructor Survey dialogs.</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Initial Student Sectioning</name>
			<description>
				<line>Added the ability to skip the assignment of a student to the course when there is a reservation for a class or a course that is not being loaded (e.g., distance configuration when solving on-campus students).</line>
				<line>Enable by setting StudentSectioning.MustFollowReservations in the solver configuration to true (defaults to false, which is the existing behavior).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Student Solver Reports, Student Dashboard: Not Available message</name>
			<description>
				<line>Added a better explanation of why a course is not available for a student.
					<line>Applies to the Not-Assigned Course Requests report.</line>
					<line>Applies to the List of Classes tab when a student is clicked.</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Data Exchange: Import</name>
			<description>
				<line>Avoid an issue with the import file being removed before it is imported by:
					<line>1. Renaming the file once it is passed to the data exchange form</line>
					<line>2. Remove the file only after the import is finished</line>
				</line>
				<line>This resolves the occasional "The system cannot find the file specified" error that may occur during the import.</line>
			</description>
		</item>
		<item>
			<name>JSON API: Reservations</name>
			<description>
				<line>Added an ability to indicate that a given field or class should be excluded from JSON serialization (with the new @ExcludeFromJsonApi annotation).</line>
				<line>Fixed an issue with both IdName and Subpart/Clazz having a parent field.</line>
				<line>Fixed an issue with Subpart.config and Clazz.subpart creating a circle.</line>
			</description>
		</item>
		<item>
			<name>Technology Upgrade</name>
			<description>
				<line>Hibernate upgraded to version 6.6.</line>
				<line>Infinispan upgraded to version 15.0.
					<line>This fixes the issue with Java 23 or later (ISPN-14375 issue), however, this change also bumps the minimal version to Java 17.</line>
				</line>
				<line>Apache Struts upgraded to version 6.7</line>
				<line>JGroups upgraded to version 6.5</line>
				<line>GWT upgraded to version 2.12</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.8.198</version>
	<release-date>Wed, 16 Apr 2025</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Course Timetabling Solver: Exact Times</name>
			<description>
				<line>Do not allow for a date pattern &amp; exact time combination that has no meetings.</line>
			</description>
		</item>
		<item>
			<name>Rooms: Availability</name>
			<description>
				<line>Fixed an array index out of bounds when generating the room availability thumbnail icons in some instances.</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling Solver: Instructor Unavailable Dates</name>
			<description>
				<line>Unavailability checking for externally managed classes has been corrected.
					<line>Use the department of the instructor, not the department for which the instructor is being loaded in.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Timetable Grid: Per Date Display</name>
			<description>
				<line>Avoid showing incorrect dates when the client is in a different time zone than the server.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Examination Timetabling</title>
		<item>
			<name>Examination Solver: Duplicate Instructor Fix</name>
			<description>
				<line>Avoid Null exceptions when the same instructor is listed two times on the same exam (under different departments).</line>
			</description>
		</item>
		<item>
			<name>Add/Edit Examination: Classes / Courses Fix</name>
			<description>
				<line>Fixed an issue of the Classes / Courses table not loading courses for a subject area with a course that has a quotation mark in the title.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Online Student Scheduling</title>
		<item>
			<name>Online Student Scheduling Dashboard: Student PIN</name>
			<description>
				<line>On the Students tab, show student PINs for students that have their PIN released.</line>
				<line>Allow admins and/or advisors to release/suppress student PINs (Student Scheduling Can Release Pin permission needed).</line>
				<line>For students that do not have PIN filled in, added a custom interface for populating student PINs (unitime.custom.StudentPinsProvider property).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Event Management</title>
		<item>
			<name>Sponsoring Organizations</name>
			<description>
				<line>Added an option to make sponsoring organization a mandatory field for special events.</line>
				<line>Enabled by setting unitime.events.sponsoringOrgRequired to true (defaults to false).</line>
				<line>When set to true, sponsoring organization must be set when creating a new special event.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Data Exchange: Student PIN</name>
			<description>
				<line>Added student PIN and PIN released flags in the student and course requests XML imports and exports.</line>
				<line>Student XML: added pin and pinReleased attributes to the student element.</line>
				<line>Requests XML: added pin element under updateDemographics with value and released attributes.</line>
			</description>
		</item>
		<item>
			<name>Timetabling Managers: Short Name</name>
			<description>
				<line>Added an ability to customize the short name format which is used, e.g., in the Last Changes component.</line>
				<line>Can be changed using the unitime.managers.shortNameFormat property, defaults to initial-last.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.182</version>
	<release-date>Thu, 30 Jan 2025</release-date>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Student Scheduling Solver: Hard Distance Conflicts</name>
			<description>
				<line>Added an ability to make some distance conflicts hard (not allowed).</line>
				<line>To enable, set the solver parameter Sectioning.HardDistanceConflict to true (defaults to false).</line>
				<line>A distance conflict is considered hard when:
					<line>The distance between the two classes (or a class and an unavailability) is HardDistanceConflict.DistanceHardLimitInMinutes or more (defaults to 60).</line>
					<line>The travel time exceeds the time for travel (break time + gap) by more than HardDistanceConflict.AllowedDistanceInMinutes (defaults to 30).</line>
				</line>
				<line>So, in other words, a distance conflict with a travel time of 60 or more minutes will be considered hard if the student has less than 30 minutes to travel between the two classes.</line>
			</description>
		</item>
		<item>
			<name>Scheduling Assistant, Dashboards: Hard/Long Distance Conflicts</name>
			<description>
				<line>Long Distance Conflicts: A distance conflict is considered long, when the travel time is HardDistanceConflict.DistanceLongLimitInMinutes (default to 60) minutes.
					<line>Long distance conflicts show a different icon in the user interface (a red racing car instead of a road runner).</line>
				</line>
				<line>When a student cannot be enrolled in a course due to a hard distance conflict, show a Conflicts with X warning message.
					<line>Just like when the course is conflicting with some other course X due to time overlaps.</line>
				</line>
				<line>Allow for hard distance conflicts when student checks the &quot;Include conflicting suggestions&quot; toggle.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Instructional Offering Detail: Instructor Requirements</name>
			<description>
				<line>Better formatting of the Instructor Requirements table, especially when there is a column with a lot of text.</line>
			</description>
		</item>
		<item>
			<name>Distribution Preferences</name>
			<description>
				<line>Added three new group constraints (distribution types).</line>
				<line>SAME_STUD_NODST: Students No Distance Constraint
					<line>This distribution is the same as the Same Students distribution, except there is no distance conflict checking and no work-day limit.</line>
					<line>Also, the distribution gets ignored when there is the Ignore Student Conflicts distribution between the two classes.</line>
					<line>To replace DIFF_TIME in General.AutoSameStudentsConstraint
						<line>This constraint can be used as the Same Student Constraint in the solver configuration, e.g., in the interactive mode,
							replacing the Different Time constraint which does not ignore cases when there is the Ignore Student Conflicts between two classes in a parent-child relation.
						</line>
					</line>
				</line>
				<line>DIFF_TIME_IGN_STUDS: Different Time + Ignore Student Conflicts
					<line>Combination of two constraints, Different Time and Ignore Student Conflicts.</line>
					<line>Given classes cannot overlap in time, replacing any student conflicts between these classes.</line>
					<line>When prohibited or (strongly) discouraged: every pair of classes in the constraint must overlap in time. Still, student conflicts are ignored.</line>
				</line>
				<line>FOLLOWING_DATES: Following Dates
					<line>Given classes must be taught on back-to-back dates and in the given order.</line>
					<line>When prohibited or (strongly) discouraged: given classes must be taught on dates in the given order, with at least one day between the following classes.</line>
					<line>Note: The primary use for this constraint is for classes that meet only once.
					The constraint cannot be satisfied when one of the meetings falls on a holiday, and the other does not.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Instructor Unavailable Dates</name>
			<description>
				<line>Course Timetabling Solver: Consider instructor's department when checking for the unavailable dates.
					<line>This is to allow for an instructor to have different unavailable dates on each of the departments they are teaching.</line>
				</line>
				<line>Class Assignment page: Do not list class times during which the instructor is not available.
					<line>Either because they have Instructor Unavailable Dates set.</line>
					<line>Or because instructor event availability is enabled (unitime.events.instructorUnavailability=true).</line>
				</line>
				<line>Instructional Offering Detail, Class Detail, Instructor Detail: Include instructor availability in the conflict checking.
					<line>That is, show a class conflicting warning when the class is placed at a time during which the instructor is not available
					due to an event, or unavailable dates.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Curricula</name>
			<description>
				<line>Multiple Majors: Fixed a Hibernate issue when setting up a curriculum with multiple majors.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Instructor Scheduling</title>
		<item>
			<name>Instructor Distribution Preferences</name>
			<description>
				<line>Many course timetabling distributions (group constraint and flexible constraints) have been included in the instructor scheduling problem, namely
					<line>At Most N Hours A Day: Classes are to be placed in a way that there is no more than given number of hours in any day.</line>
					<line>Same Weeks: Given classes must be taught during the same weeks (i.e., must have the same date pattern).</line>
					<line>N Hour Workday: Classes are to be placed in a way that there is no more than given number of hours between the start of the first class and the end of the class one on any day.</line>
					<line>Minimal Gap Between Classes: Classes need to be placed in a way that there is at least the given number of minutes between any two of them.</line>
					<line>Max Block: Given classes must be taught in a way there is a break between two blocks of classes.</line>
					<line>Max Breaks: Limit number of breaks between adjacent classes on a day.</line>
					<line>Max Days: Limit number of days of a week.</line>
					<line>Break: There must be a break of a given length in a given time interval.</line>
					<line>Max Weeks: Limit number of weeks on which an a class can take place.</line>
					<line>Max Holes: Minimize free time of an instructor during a day (between the first and the last class).</line>
					<line>Max Half-Days: Limit number of half-days of a week.</line>
					<line>Max Consecutive Days: Limit number of consecutive days of a week.</line>
				</line>
				<line>See https://help.unitime.org/additional-distribution-constraints for more details about the additional distribution constraint types.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Event Management</title>
		<item>
			<name>Events Personal Schedule: All Sessions</name>
			<description>
				<line>When All Sessions flag is used on personal schedule, added an ability to lookup classes, exams, and course-related events from all academic sessions.</line>
				<line>By default, only (previous and past) academic sessions with the same academic initiative are considered.</line>
				<line>Enable by setting unitime.events.personal.allSessions.skipSessionCheck to true (defaults false).</line>
			</description>
		</item>
	</category>	
	<category>
		<title>Administration</title>
		<item>
			<name>Hibernate Community Dialects</name>
			<description>
				<line>Added hibernate-community-dialects dependency to include additional dialects.
					<line>Namely the org.hibernate.community.dialect.OracleLegacyDialect allowing for older Oracle Database versions.</line>
				</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.170</version>
	<release-date>Fri, 6 Dec 2024</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Class Assignment: Room Partitions</name>
			<description>
				<line>Consider room partitions when checking room availability (other non-class events).</line>
			</description>
		</item>
		<item>
			<name>Multiple Class Setup: Room-related Columns</name>
			<description>
				<line>In order to be consistent with the Instructional Offering Configuration page, the order of the room-related columns changed to be: Nbr Rooms, Splt Attd, and Room Ratio.
					<line>Instead of Room Ratio, Nbr Rooms, and Splt Attd.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Edit Scheduling Subpart: Subpart Credit</name>
			<description>
				<line>Max Units made editable when editing Variable Min/Max credit without the need to change the credit type first (when editing existing credit information).</line>
				<line>Fixed an issue when no units or max units are provided (for a type that requires units/max units) or when the provided units are not a number.</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling Solver: Optimization</name>
			<description>
				<line>In order for the solver to start optimization even when a complete solution cannot be found, added an ability to halt the initial search phase when a maximum number of non-improving iterations is reached.</line>
				<line>This can be controlled by the Search.MaxIdleIterations parameter.
					<line>It defaults to 1000.</line>
					<line>Set to -1 to disable the ability to halt the initial search phase (previous behavior).</line>
					<line>Set to 0 to disable the construction heuristics, going directly to the optimization phases.</line>
				</line>
				<line>Added an ability to disable the max-idle limitation during the first part of the search, effectively setting up a minimal construction time.
					<line>Parameter Search.MinConstructionTime, which can be in seconds or in percentage of the total time (Termination.TimeOut).</line>
					<line>Defaults to 10% of the total time limit. So, if max-idle is enabled, it will not stop construction or the IFS phase during the first 10% time of the solver run.</line>
				</line>
				<line>Improved the ability to assign an unassigned class during the optimization phase.
					<line>To enable this, add ;org.cpsolver.coursett.neighbourhoods.Suggestion@0.1 to the following parameters:
						<line>HillClimber.AdditionalNeighbours</line>
						<line>GreatDeluge.AdditionalNeighbours</line>
						<line>SimulatedAnnealing.AdditionalNeighbours</line>
					</line>
					<line>This is especially needed when the construction phase is disabled, or the solver struggles to find a complete solution when one exists.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling Solver: Random Student Swap Selection</name>
			<description>
				<line>Added a neighborhood selection that attempts to swap a student between alternative sections of a course.</line>
				<line>To be used with the Hill Climber (HC), Great Deluge (GD), or Simulated Annealing (SA) algorithms.
					<line>Enable by adding the RandomStudentSwap class to the AdditionalNeighbours properties.</line>
				</line>
				<line>The selection is only available/enabled when the solver is using a single thread as student class assignments are not included in the solution/</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling Solver: Simulated Annealing</name>
			<description>
				<line>Various improvements and changes in an attempt to make the SA algorithm more reliable.</line>
				<line>Added minimal and maximal temperature.</line>
				<line>Improved temperature training (when SimulatedAnnealing.InitialTemperature is set to -1)</line>
			</description>
		</item>
	</category>
	<category>
		<title>Examination Timetabling</title>
		<item>
			<name>Room Partitions</name>
			<description>
				<line>Added support for room partitions in the examination timetabling.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Student Scheduling Solver: Linked Classes</name>
			<description>
				<line>Allow one class to be present in multiple Linked Classes distributions between the same two courses.</line>
				<line>This allows for the Linked Classes to overlap with each other, e.g., when most classes can be linked one-to-one, but there are exceptions (e.g., one course has an additional course that can be used with any class of the other course).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Events</title>
		<item>
			<name>Lookup Classes/Examination: Bugfix</name>
			<description>
				<line>Populate the event filter even when it is not present.</line>
				<line>This fixes an issue caused by a recent change, having the events and rooms parameters incorrectly interpreted.</line>
			</description>
		</item>
		<item>
			<name>Edit Event: Meeting Contacts</name>
			<description>
				<line>Record which meetings have their contacts changed in the Notes.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Data Exchange: Course Offering XML</name>
			<description>
				<line>Added an optional attribute class.roomRatio, defaults to 1.</line>
				<line>Added an optional attribute class.splitAttendance for classes with two or more rooms, defaults to false.</line>
			</description>
		</item>
		<item>
			<name>Add/Edit Date Pattern: Make Default</name>
			<description>
				<line>Added a confirmation dialog when Make Default button is clicked.</line>
				<line>Added an option to hide Make Default button on this page by setting unitime.pattern.showMakeDefault to false.
					<line>If Make Default button is disabled, the default date pattern can still be set on the Edit Academic Session page.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Scripts: ECMAScript</name>
			<description>
				<line>Nashorn is now included in the UniTime distribution.
					<line>Starting with Java 15, ECMAScript has been removed from JDK.</line>
				</line>
				<line>Jython is now included in the UniTime distribution so that Python scripts do work out of the box.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.159</version>
	<release-date>Fri, 27 Sep 2024</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Instructional Offering Configuration</name>
			<description>
				<line>Delete: Fixed a possible &quot;deleted object would be re-saved by cascade&quot; exception when deleting a configuration that participates in a distribution preference.</line>
				<line>Delete: Fixed a possible &quot;deleted instance passed to merge&quot; exception when deleting a configuration that has teaching requests.</line>
				<line>Delete: Skip validation for a configuration that is being deleted.</line>
			</description>
		</item>
		<item>
			<name>Solution (Database) Save</name>
			<description>
				<line>A few changes to make the save faster:
					<line>Faster computation of number of no-conflict placements in variable info.</line>
					<line>When General.SaveConstraintInfos is false, do not compute no-conflict placements in variable infos at all.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Edit Class/Scheduling Subpart</name>
			<description>
				<line>Added an ability to search the list of available date patterns.</line>
				<line>Enable by setting unitime.classEdit.searchableDatePattern to true (defautls to false).</line>
				<line>When enabled, the Date Pattern list box is replaced by a text field with suggestions.</line>
			</description>
		</item>
		<item>
			<name>Extended Student Conflicts Constraint</name>
			<description>
				<line>Fixed a concurrency issue.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Wait-Listing</name>
			<description>
				<line>Position: Consider current enrollment when computing wait-list position.</line>
				<line>Processing Order: Do not prioritize students wait-listing for a course swap.</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Assistant</name>
			<description>
				<line>Suggestions: When the Suggestions dialog is opened, include ARIA status labels for drop and wait-list buttons when the buttons are present.</line>
				<line>Suggestions: Made the Drop and Wait-List buttons easier to get to.</line>
			</description>
		</item>
		<item>
			<name>Unavailabilities</name>
			<description>
				<line>Added unavailability distance conflicts (distance conflicts between sections and unavailabilities).</line>
				<line>This is particularly useful when unavailabilities from other overlapping academic sessions are enabled.</line>
				<line>A different max travel time in minutes can be defined for unavailabilities using the new solver parameter Distances.MaxTravelDistanceInMinutes.</line>
				<line>Added Student Unavailability Conflicts solver report (listing both time and distance conflicts).</line>
			</description>
		</item>
		<item>
			<name>Batch Scheduling: Visiting F2F Priority</name>
			<description>
				<line>Added a new course request priority Visiting F2F that can be used to lower priority of visiting students for getting in face-to-face courses.</line>
				<line>Can be enabled by identifying visiting students with Load.VisitingStudentFilter (e.g., not campus:XX)</line>
				<line>A course request is considered face-to-face, if there is at least one possible enrollment that has a face-to-face class.
					<line>When Load.VisitingFaceToFaceCheckFirstChoiceOnly is set to true (defaults to false), only the first-choice course is checked for face-to-face classes.</line>
					<line>Only course requests without a priority can have their priority lowered (set to Visiting F2F).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Advisor Course Recommendations</name>
			<description>
				<line>Show recommendations from the other academic session(s) if a student is advised in two or more parallel sessions.</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Assistant / Student Course Requests</name>
			<description>
				<line>Available Sessions: Prefer sessions with matching student campus (in the order they are displayed).
					<line>If two or more academic sessions start on the same date, prefer the academic session whose initiative matches the student's campus.
						<line>Property unitime.studentScheduling.preferredStudentCampus can be used to provide regular expression for preferred student campuses.</line>
					</line>
					<line>Enable by setting unitime.studentScheduling.preferSessionsWithMatchingCampus to true, defaults to false.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Solver: Credit Limits</name>
			<description>
				<line>Added an ability to adjust the student's min/max credit limit by their enrollment in other parallel sessions.
					<line>I.e., sessions with matching academic term and year, but different initiative.</line>
				</line>
				<line>Enable by setting the solver parameter Load.DecreaseCreditLimitsByOtherSessionEnrollments to true (defaults to false).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Examination Timetabling</title>
		<item>
			<name>Distribution Constraints</name>
			<description>
				<line>The examination distribution constraints were rewritten to make them easier to extend and customize.</line>
				<line>For soft constraints, penalizations are now counted on individual examination pairs.
					<line>This better ascertains how well the constraint is satisfied, especially for constraints posted between many exams.</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Events</title>
		<item>
			<name>Personal Schedule: Additional Emails</name>
			<description>
				<line>Added an option to disable lookup for events where the person's email is listed in the Additional Emails field.
					<line>Disable by setting unitime.events.personal.considerAdditionalEmails to false, defaults to true.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Event Filter</name>
			<description>
				<line>Added an ability to skip computation of most event counts on the filter to make it load and operate faster.
					<line>To enable set unitime.events.eventFilter.skipCounts to true (defaults to false).</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Other</title>
		<item>
			<name>GWT-Based Pages: Cookies</name>
			<description>
				<line>Avoid using cookies when possible (e.g., to store filter settings). Use HTML5 local/session storage instead.</line>
				<line>This is to avoid error 400 - Bad Request: Request header is too large when using long texts in the filters.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Add/Edit Timetable Manager</name>
			<description>
				<line>External Manager Lookup: Only reset the email address (to the one from the LDAP directory) when it is left blank.</line>
			</description>
		</item>
		<item>
			<name>Data Exchange API</name>
			<description>
				<line>Corrected XML import response.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.147</version>
	<release-date>Thu, 25 Jul 2024</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Multiple Class Setup</name>
			<description>
				<line>Date Pattern: Corrected the name of the default date pattern when a date pattern is set on the scheduling subpart.</line>
			</description>
		</item>
		<item>
			<name>Add/Edit Room</name>
			<description>
				<line>Preference: Do not allow for Required preference (for a department) unless there is already a required department for the room.
					<line>Required preference set directly on a room usually makes no or very little sense and usually only creates confusion when a room is accidentally marked as required (as no other rooms can be used for the department by the course timetabling solver).</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Batch Student Solver Reports, Online Student Scheduling Reports</name>
			<description>
				<line>Filter: In the filter's drop-down, added Advisor text field and My Students checkbox.
					<line>This is to make it easier for non-admin users to use.</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Other</title>
		<item>
			<name>Main page</name>
			<description>
				<line>To prevent an XSS vulnerability, sanitize the message when provided as a parameter.</line>				
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.145</version>
	<release-date>Fri, 19 Jul 2024</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Instructional Offerings / Classes</name>
			<description>
				<line>Added an experimental user settings that allows for the header row on the Instructional Offerings and Classes pages to freeze (has sticky position).</line>
				<line>To enable, add stickyTables manager setting with yes and no options (using Default Manager Settings page, sticky table headers are enabled when set to yes).</line>
			</description>
		</item>
		<item>
			<name>Instructional Offering Configuration</name>
			<description>
				<line>When unlimited enrollment is selected, make sure that all classes have zero number of rooms.</line>
			</description>
		</item>
		<item>
			<name>Reservations, Instructional Offering Detail, Student Scheduling Dashboards</name>
			<description>
				<line>Reservations table: Always show the reservation flags such as Allow Time Conflict,
					Can Assign Over Limit, Student Must Follow, and Do Not Reserve Space.</line>
				<line>This is to ensure that it is always clear what the reservation/override does.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Event Management</title>
		<item>
			<name>Events: Filter by Day of Week</name>
			<description>
				<line>Fixed a Hibernate 6.x issue when filtering by day of the week on MySQL and PostreSQL.</line>
			</description>
		</item>
		<item>
			<name>Administration: Event Statuses</name>
			<description>
				<line>Corrected an issue causing a room sometimes being shown under a wrong department/room type.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Batch Student Solver Reports, Online Student Scheduling Reports</name>
			<description>
				<line>Added an ability to filter reports using a Filter with similar capabilities as on the dashboard pages.</line>
				<line>Added Conflicting Course Requests report: variant of Not-Assigned Course Requests report, but only showing course requests with time conflict.</line>
				<line>Added Not-Used Curriculum Reservations report.</line>
				<line>Added Reservations report: showing all reservations and their current enrollments / limits.</line>
				<line>Added XLS export.</line>
			</description>
		</item>
		<item>
			<name>Batch Student Solver Dashboard, Online Student Scheduling Dashboard</name>
			<description>
				<line>Reservation Tooltip:
					<line>Do not show limit (null) for unlimited classes.</line>
					<line>Show flags for curriculum override reservations.</line>
					<line>Individual, Curriculum: Limit the number of restrictions to 5 lines.</line>
				</line>
				<line>Added XLS export.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Rooms: Custom URL</name>
			<description>
				<line>Added an ability to provide custom URLs for rooms (based on their name, building, room number, or external id).</line>
				<line>For more details, see the unitime.rooms.url properties.</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.8.139</version>
	<release-date>Tue, 18 Jun 2024</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Multiple Class Setup</name>
			<description>
				<line>Added column with the capacity of the assigned room (Cap).</line>
				<line>Added mouse-over for assigned rooms.</line>
				<line>Fixed the ability to clear External Id (when modification of external ids is allowed).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Student Email Notifications</name>
			<description>
				<line>Created a plain-text template alternative for student scheduling emails.</line>
				<line>Plain-text student emails can be enabled by setting unitime.enrollment.email.plainText to true (defaults to false).</line>
			</description>
		</item>
		<item>
			<name>Advisor Course Recommendations</name>
			<description>
				<line>Ensure that the advisor's additional notes do not overlap with signature on the generated PDF.</line>
			</description>
		</item>
		<item>
			<name>Online Student Scheduling Dashboard: Filter</name>
			<description>
				<line>The the following checks now allow for partial match using %:
					<line>area, classification, major, concentration, </line>
					<line>campus, accommodation, degree, program, minor, </line>
    				<line>primary-area, primary-classification, primary-major, primary-concentration, primary-degree, </line>
    				<line>group, status</line>
    			</line>
    			<line>For example, a:A% matches all areas starting with A. Or, LC:% matches all students that are in a group of LC type.</line>
			</description>
		</item>
		<item>
			<name>Universal Reservation Override: Student Filter</name>
			<description>
    			<line>Added a missing check on student minors.</line>
				<line>The the following checks now allow for partial match using %:
					<line>area, classification, major, concentration, </line>
					<line>campus, accommodation, degree, program, minor, </line>
    				<line>primary-area, primary-classification, primary-major, primary-concentration, primary-degree, </line>
    				<line>group, status</line>
    			</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Roll Forward: Travel Times, Room Partitions</name>
			<description>
				<line>Corrected roll forward of room partitions and travel times on Oracle (empty external id check was incorrect).</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.8.134</version>
	<release-date>Wed, 29 May 2024</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Extended Student Conflicts</name>
			<description>
				<line>Added an experimental global constraint that does not allow any two classes that the same student can attend to have a conflict.</line>
				<line>The constraint checks any two classes of different offerings that share at least one student and that the student is allowed to take (not restricted by reservations).
					<line>Class pairs included in the Ignore Student Conflicts constraints are ignored.</line>
				</line>
				<line>Some classes may be excluded by using ExtendedStudentConflicts.IgnoreClasses parameter which may contain a regular expression matching class name(s).</line>
				<line>Pairs of classes of the same offering are checked, too.
					<line>In this case, the course structure must allow the two classes to be attended together (e.g., they are from the same configuration),</line>
					<line>and at least one student in the offering is allowed to take both classes.</line>
					<line>This feature is enabled by default and can be disabled by setting ExtendedStudentConflicts.CheckSameCourse to false.</line>
				</line>	
				<line>To enable this constraint, add org.cpsolver.coursett.constraint.ExtendedStudentConflicts to General.GlobalConstraints
					(which contains a semicolon separated list of global constraint classes that should be automatically added to the problem)</line>
			</description>
		</item>
		<item>
			<name>Room Edit: Room Features &amp; Groups</name>
			<description>
				<line>Disabled pre-fetching of room relations (such as departments, features, and groups) when loading the data for the Room Edit page.</line>
				<line>This fixes a potential Hibernate issue that is causing room groups and features to disappear (not get loaded) in some cases that are hard to explain or reproduce.</line>
				<line>The pre-fetching can be enabled by setting unitime.rooms.prefetchRelations to true.</line>
			</description>
		</item>
		<item>
			<name>Multiple Class Setup</name>
			<description>
				<line>Multiple Class Setup page rewritten to GWT to make the page faster and more reliable.</line>
				<line>To use the old (Struts2-based) page, set unitime.legacy.course.multiple_class_setup to true.</line>
				<line>When managing department is changed, only remove preferences that no longer apply (e.g., keep global room feature/group preferences).
					<line>Former behavior (clear all room-related preferences) set unitime.legacy.course.clear_preferences to true.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Instructional Offering Configuration</name>
			<description>
				<line>Instructional Offering Configuration page rewritten to GWT to make the page faster and more reliable.</line>
				<line>To use the old (Struts2-based) page, set unitime.legacy.course.instr_offering_config to true.</line>
				<line>When managing department is changed, only remove preferences that no longer apply (e.g., keep global room feature/group preferences).
					<line>Former behavior (clear all room-related preferences) set unitime.legacy.course.clear_preferences to true.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Scheduling Subpart Detail: Classes</name>
			<description>
				<line>Show External Id column when there is at least one classes with an external id filled in
					(instead of showing the column when there is a class with a timetable).</line>
				<line>Show Student Schedule Note when there is at least one class with a note
					(instead of always showing the column).</line>
			</description>
		</item>
		<item>
			<name>Instructional Offering Detail: Configuration</name>
			<description>
				<line>Show Timetable column when there is at least one class with a timetable
					  (instead of always showing the Timetable columns).</line>
				<line>Show External Id column when there is at least one classes with an external id filled in
					(instead of always showing the column).</line>
				<line>Show Student Schedule Note when there is at least one class with a note
					(instead of never showing the column).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Scheduling Assistant: Submit Schedule</name>
			<description>
				<line>Fixed a possible TransientObjectException when a new course request is added to an existing course demand.</line>
				<line>The problem seems to be related to the recent Hibernate 6.2.22 update.</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling: Reservations</name>
			<description>
				<line>Student Scheduling Solver: Improved handling of reservations with restrictions from two or more configurations by computing and using configuration-specific limit caps and reservation limits.
					<line>This makes the computation of reserved and unreserved space for a config or a section much more accurate.</line>
				</line>
				<line>Online Student Scheduling: Corrected the computation of reservation limit for reservations with restrictions from two or more configurations.
					<line>This fixes an issue causing some space not to be reserved when a reservation was set between a configuration and one or more sections of a different config.</line>
				</line>
				<line>Online Student Scheduling: The checking of available space (e.g., when a student clicks Submit Schedule) for reservations with restrictions from two or more configurations has been corrected.
					<line>This is especially applicable to reservations marked as exclusive (to be checked only at the levels they are set).</line>
				</line>
				<line>Add/Edit Reservation: Corrected computation of the selected spaces when restrictions from two or more configurations are selected.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Examination Timetabling</title>
		<item>
			<name>Examination Timetable</name>
			<description>
				<line>When showing data from the database, load the examination grid page faster.</line>
				<line>This is done by pre-fetching all exams and their relations (like the Examination Reports page already does).</line>
			</description>
		</item>
		<item>
			<name>Room Splits</name>
			<description>
				<line>No longer impose a limit on the number of rooms an exam can use.</line>
				<line>This fixes the ArrayIndexOutOfBoundsException when an exam is being split into more than 32 rooms.</line>
			</description>
		</item>
	</category>	
	<category>
		<title>Administration</title>
		<item>
			<name>Data Exchange: Last-Like Course Demand Import</name>
			<description>
				<line>Open transaction before subject areas are loaded.</line>
				<line>This fixes a Null exception introduced with Hibernate 6.x changes.</line>
			</description>
		</item>
		<item>
			<name>Data Exchange: Curriculum Import</name>
			<description>
				<line>Added an incremental mode (when incremental="true" in the root element).</line>
				<line>Only curricula of matching abbreviations are removed.
					<line>If the XML contains curriculum A/M1, the existing A/M1 curriculum is deleted first.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Data Exchange: Reservations Import</name>
			<description>
				<line>Added an incremental mode (when incremental="true" in the root element).</line>
				<line>Only reservations of matching courses and types are removed.
					<line>If the XML contains a curriculum reservation for ALG 101, all previous curriculum reservations for this course are deleted first.</line>
				</line>
			</description>
		</item>
		<item>
			<name>User Context: Test Sessions</name>
			<description>
				<line>Added checking for test session status for Advisor, Instructor, and Student roles.</line>
				<line>The test session is only available when the role has the Allow Test Sessions permission.</line>
			</description>
		</item>
		<item>
			<name>Technology Upgrade</name>
			<description>
				<line>Hibernate upgraded to version 6.4 (from 6.2).
					<line>Please note that in HQL, = null or != null no longer works (use is null or is not null instead).</line>
				</line>
				<line>Apache Struts upgraded to version 6.4 (from 2.5).</line>
			</description>
		</item>
		<item>
			<name>Authentication: OAuth2</name>
			<description>
				<line>Added an ability to use OAuth2 authentication.</line>
				<line>See https://help.unitime.org/OAuth2 for more details.</line>
			</description>
		</item>
		<item>
			<name>Docker Installation</name>
			<description>
				<line>Added an ability to install UniTime as a Docker container.</line>
				<line>See https://help.unitime.org/docker for more details.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.115</version>
	<release-date>Wed, 13 Mar 2024</release-date>
		<category>
		<title>Course Timetabling</title>
		<item>
			<name>Scheduling Subparts: Limit, Course Name</name>
			<description>
				<line>Do not pre-compute scheduling subpart limits and course names.</line>
				<line>This fixes an issue of showing an incorrect limit after a class limit change or when a class has been added or removed from a subpart.</line>
				<line>The drawback is that these fields are no longer available in the reports, to fix this replace
					<line>ss.limit with (select sum(c.expectedCapacity) from Class_ c where c.schedulingSubpart = s)</line>
					<line>ss.courseName with (select co.subjectAreaAbbv || ' ' || co.courseNbr from CourseOffering co where co.isControl = true and co.instructionalOffering = ss.instrOfferingConfig.instructionalOffering)</line>
				</line>
			</description>
		</item>
		<item>
			<name>Multiple Class Setup</name>
			<description>
				<line>Prevent premature submission of the page by only enabling all the submit buttons after the page is fully loaded.</line>
				<line>This fixes a problem when some classes are deleted because the page is submitted for a massive course configuration while it is still being loaded.</line>
			</description>
		</item>
		<item>
			<name>Instructional Offering: Limit, Demand</name>
			<description>
				<line>Do not compute demand and limit fields within the data model (formula).
					<line>It does not save anve time and just complicates the query.</line>
					<line>This is to avoid showing old data, e.g., when an instructional offering configuration is updated.</line>
				</line>
				<line>The drawback is that these fields are no longer available in the reports, to fix this replace
					<line>io.limit with (select sum(ioc.limit) from InstrOfferingConfig ioc where ioc.instructionalOffering = io)</line>
					<line>io.demand with (select sum(co.demand + (case when cox is null then 0 else cox.demand end)) from CourseOffering co left outer join co.demandOffering cox where co.instructionalOffering = io)</line>
				</line>
				<line>This way, the fields are only computed when needed.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Batch Student Solver Reports: Export CSV</name>
			<description>
				<line>Corrected permission checking for the published student scheduling solver.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.110</version>
	<release-date>Tue, 27 Feb 2024</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Instructor Unavailability: Daylight Saving Dates</name>
			<description>
				<line>Corrected instructor unavailability on daylight saving days (i.e., days with 23 or 25 hours).</line>
			</description>
		</item><item>
			<name>Travel Time: Default/Computed Distances</name>
			<description>
				<line>Show default/computed distances in blue.</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Multiple Rooms Split Attendance</name>
			<description>
				<line>When a class needs two or more rooms, added an ability to set the class as requiring split attendance.</line>
				<line>When split attendance is set for the class, the class is expected to be split among the assigned rooms (the total room capacity must meet the class limit times room ratio).</line>
				<line>When split attendance is not set for the class (which is the default), each room must be big enough to fit the class.</line>
				<line>Split Attendance can be set on the Instructional Offering Configuration page (all classes of a subpart) or the Multiple Class Setup page (individual classes).</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Multiple Rooms With Different Preferences</name>
			<description>
				<line>The ability to provide different preferences for each room has been added for classes that need two or more rooms.</line>
				<line>This includes cases when some rooms are prohibited in some positions, e.g., a class needs a classroom and some other room.</line>
				<line>Room-related preferences can be only defined on the class or the scheduling subpart level, for rooms, room groups, room features, and buildings.</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Solution Commit</name>
			<description>
				<line>Solution commit made a little faster by loading the event date mappings only once.</line>
			</description>
		</item>
	</category>
	<category>	
		<title>Student Scheduling</title>
		<item>
			<name>Student Scheduling Assistant / Course Requests: Access Control</name>
			<description>
				<line>Added an ability to limit how many users can use the page (Scheduling Assistant and/or Course Requests) at the same time.</line>
				<line>Automatically leave the page after a given time of inactivity (showing a warning first).</line>
				<line>Parameters for Scheduling Assistant:
					<line>unitime.accessControl.sectioning.maxActiveUsers .. Maximal number of users using the page at the same time (not set or zero for disabled).</line>
					<line>unitime.accessControl.sectioning.activeLimitInMinutes .. Number of minutes of inactivity for the user to get the Inactive Warning (defaults to 15 minutes, set to zero to disable).</line>
				</line>
				<line>Parameters for Course Requests:
					<line>unitime.accessControl.requests.maxActiveUsers .. Maximal number of users using the page at the same time (not set or zero for disabled).</line>
					<line>unitime.accessControl.requests.activeLimitInMinutes .. Number of minutes of inactivity for the user to get the Inactive Warning (defaults to 15 minutes, set to zero to disable).</line>
				</line>
				<line>When the Inactive Warning shows, the user has a minute to dismiss the warning before the page is exited automatically.</line>
			</description>
		</item>
		<item>
			<name>Universal Reservation Override: Student Filter</name>
			<description>
				<line>Added a universal reservation override type that allows to reserve space for students using a student filter.</line>
				<line>Student filter is a boolean expression that may contain the following attributes:
					<line>area, classification, campus, major, minor, concentration, degree, program, group, accommodation, student, advisor, status</line>
					<line>primary-area, primary-classification, primary-major, primary-concentration, primary-degree, primary-program, primary-campus</line>
				</line>
				<line>For example, the following filter will match all programs that ends with -OL or -HY:
					<line>primary-program:%-OL or primary-program:%-HY</line>
				</line>
			</description>
		</item>
		<item>
			<name>Student Availability: Check Other Academic Sessions</name>
			<description>
				<line>Added an ability to check student schedules from other overlapping academic sessions.The classes of other academic sessions show up as unavailablies (blue color, not clickable).</line>
				<line>They are also used as unavailabilities: the solver would not assign a class in the current academic session to a time that conflicts with a class of some other academic session that the student has.</line>
				<line>Unless the class is of scheduling subpart that allows for overlaps, in which case the overlapping time is minimized instead.</line>
				<line>This feature is not enabled by default, to enable it set the following properties:
					<line>Batch student scheduling: set the solver parameter Load.IncludeUnavailabilitiesFromOtherSessions to true.</line>
					<line>Online student scheduling: there are two options, 
						<line>the unavailable times are either loaded from the database (when General.CheckUnavailabilitiesFromOtherSessionsUsingDatabase is true),</line>
						<line>or from the other online student scheduling solver servers (when General.CheckUnavailabilitiesFromOtherSessions is true).</line>
					</line>
				</line>
			</description>
		</item>
	</category>	
	<category>
		<title>Event Management</title>
		<item>
			<name>Rooms: Event Email</name>
			<description>
				<line>Added event emails on rooms, non-university locations, and event statuses.</line>
				<line>When sending an event confirmation email, automatically CC all rooms of changed meetings.</line>
				<line>Event Statuses page can now edit a default event email for a department and a room type pairs.</line>
				<line>Event Statusess and Add/Edit Room pages can now edit event emails of an individual room.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Data Exchange: Academic Session Export</name>
			<description>
				<line>Fixed the occasional "Unable to export: No row with the given identifier exists" error on records that do exists.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.98</version>
	<release-date>Fri, 5 Jan 2024</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Instructional Offering Detail: Instructor Requirements</name>
			<description>
				<line>Ensure that only requirements (instructor surveys) from the correct academic session are listed.</line>
				<line>Include instructor surveys for assigned instructors that did not fill in course requirements for the course.</line>
			</description>
		</item>
		<item>
			<name>Classes, Class Assignments: Manager Filter</name>
			<description>
				<line>Added an ability to select multiple managers.</line>
			</description>
		</item>
		<item>
			<name>Timetable: Room Filter</name>
			<description>
				<line>Added an option to include the Room Filter (from the Rooms page) in the Filter section.</line>
				<line>To be enabled by setting unitime.timeGrid.roomFilter to true (defaults to false).</line>
				<line>When room or class filters are used, do not show instructors, curricula, etc. that have no matching classes.</line>
			</description>
		</item>
		<item>
			<name>Instructor Survey: Copy Course Requirements</name>
			<description>
				<line>Corrected copy of courses from a different academic session (the query filling in the remaining courses that the instructor has currently assigned was wrong).</line>
			</description>
		</item>
		<item>
			<name>Timetable Grid: Curriculum</name>
			<description>
				<line>When showing a saved/committed solution, corrected matching of a curriculum reservation when the displayed curriculum has no major.</line>
			</description>
		</item>
		<item>
			<name>Class Weights: Number of Weeks Class Weights</name>
			<description>
				<line>Added &quot;Nbr Weeks Class Weights&quot; option for the Class Weights solver parameter, weighting classes by the number of weeks they are using.
					<line>Classes using the default date pattern have a weight of 1.0, a class meeting only every other week would be weighted 0.5.</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Event Management</title>
		<item>
			<name>Events Timetable: Curriculum</name>
			<description>
				<line>Corrected matching of a curriculum reservation when the displayed curriculum has no major.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Online Student Scheduling</title>
		<item>
			<name>Instructor Schedule Changes</name>
			<description>
				<line>Corrected change detection when assignment changes are disabled (and there is a Lec-Lec combination with the same external id).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Timetabling Managers: Update Other Academic Sessions</name>
			<description>
				<line>Added an ability to update departments and solver groups in the academic sessions with the same academic initiative.</line>
				<line>Academic sessions in the finished status are not included.</line>
				<line>By default, the current and all future sessions (with the same initiative) are selected when a new manager is being added.</line>
				<line>For existing managers, the academic sessions with the same departments and solver groups are selected by default.</line>
			</description>
		</item>
		<item>
			<name>Test HQL, Reports: Improved Error Handling</name>
			<description>
				<line>When the provided HQL is incorrect, display a more meaningful error message.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.92</version>
	<release-date>Thu, 14 Dec 2023</release-date>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Instructor Survey</name>
			<description>
				<line>Added an ability for departmental schedule managers to unsubmit the survey directly from the Instructor Survey page/dialog (meaning save and unsubmit).</line>
			</description>
		</item>
		<item>
			<name>Edit Instructor</name>
			<description>
				<line>It is now possible to reset the instructor's position.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Batch Student Scheduling</title>
		<item>
			<name>Solver Reports</name>
			<description>
				<line>Added Student Priority and Request Priority columns on various reports.</line>
				<line>Added Not-Assigned LC Course Requests and Not-Assigned Critical Course Requests reports.</line>
				<line>Added Critical Time Conflicts, Critical Availability Conflicts, and Critical Time &amp; Availability Conflicts reports.
					<line>Only listing course requests that have Important, Vital, Critical, or LC priority.</line>
					<line>For time conflicts, only courses with the same or higher priority are considered.</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Online Student Scheduling</title>
		<item>
			<name>Email Notification Types</name>
			<description>
				<line>Added an ability to define which email notifications will be set based on the student status.</line>
				<line>The following options are available:
					<line>Student Request Change (student made a change using the Student Course Requests page)</line>
					<line>Student Enrollment Change (student made an enrollment change using the Student Scheduling Assistant page)</line>
					<line>Admin Request Change (administrator or advisor made a change using the Student Course Requests page)</line>
					<line>Admin Enrollment Change (administrator or advisor made an enrollment change using the Student Scheduling Assistant page)</line>
					<line>Enrollment Approval (enrollment requiring a consent has been approved)</line>
					<line>Course Schedule Change (time or room of one of the classes has changed due to re-scheduling)</line>
					<line>Course Enrollment Change (an enrollment change was done by wait-listing or re-scheduling)</line>
					<line>Course Failed Enrollment Change (UniTime failed to make an enrollment change during wait-listing or re-scheduling)</line>
					<line>External Enrollment Change (there has been an enrollment change done externally, outside of UniTime)</line>
				</line>
			</description>
		</item>
		<item>
			<name>Instructor Schedule Changes</name>
			<description>
				<line>An email notification can be automatically sent to the instructor when
					<line>the instructor assignment is changed (instructor is added to/removed from a class),</line>
					<line>the class that the instructor has is moved in time and/or room, or</line>
					<line>the class that the instructor has assigned is canceled or reopened.</line>
					<line>Optionally, an email can be sent when the percent share, check conflicts, or responsibility is changed.</line>
				</line>
				<line>Configuration:
					<line>Enable instructor notifications be setting unitime.notifications.instructorChanges.enabled=true (defaults to false).</line>
					<line>Include the list of all currently assigned classes that the instructor has in the email notification by setting unitime.notifications.instructorChanges.includeSchedule (defaults to true).</line>
					<line>Check/display the instructor's percent share, responsibility, and check for conflict changes by setting unitime.notifications.instructorChanges.checkShare (defaults to false).</line>
				</line>
				<line>Note: Instructor schedule changes are only available when the online student scheduling server is running, as the offering-reload action (Unlock button) triggers and tracks the changes.</line>
			</description>
		</item>
		<item>
			<name>Email Notifications Begin/End Dates</name>
			<description>
				<line>Added Notification Begin/End Date on the academic session.</line>
				<line>One or both dates can be null (not set), in which case there is no begin and/or end date defined.</line>
				<line>Other settings still apply, i.e., email notifications must be enabled for students and/or instructors, and student status must allow for the notifications.</line>
				<line>It is possible to enable/disable notifications date checking for students and/or instructors.
					<line>For instructors, by setting unitime.notifications.instructorChanges.checkNotificationDates (defaults to true).</line>
					<line>For students, by setting unitime.enrollment.email.checkNotificationDates (defaults to true).
						<line>Or only particular actions can check for dates by setting unitime.enrollment.email.&lt;operation&gt;.checkNotificationDates parameter (not set by default).</line>
					</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Other</title>
		<item>
			<name>Name Formats</name>
			<description>
				<line>Added the following name formats, adding an external id after the last name or at the end of the name:
					<line>last-ext-first-middle</line>
					<line>last-ext-first-middle-title</line>
					<line>last-first-middle-ext</line>
					<line>first-middle-last-ext</line>
					<line>last-first-middle-title-ext</line>
					<line>title-first-middle-last-ext</line>
					<line>title-initial-last-ext</line>
					<line>title-last-initial-ext</line>
				</line>
				<line>These can be added on the Administration &gt; Defaults &gt; User Settings, name property (and then selected on Preferences &gt; Settings).</line>
			</description>
		</item>
		<item>
			<name>Default Solver Configuration</name>
			<description>
				<line>Added ability to change the default solver configuration by changing the unitime.solverConfig.defaultXxx application property.</line>
			</description>
		</item>
		<item>
			<name>Authentication: Active Directory</name>
			<description>
				<line>Added a Spring Security configuration compatible with Active Directory (unitime.spring.context.security=securityContextLDAP-AD.xml).</line>
				<line>Using LDAP server authentication, user search instead of user DN matching, and using user name as the user's external id.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Bug Fixes</title>
		<item>
			<name>Online Scheduling Dashboards: Filter</name>
			<description>
				<line>Fixed the query when filtering by course and instructional method at the same time.</line>
				<line>Corrected the ability to use not assignment:XX in the filter on the Enrollments tab, e.g.: not assignment:Vital</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Dashboards: Enrollments</name>
			<description>
				<line>When listing individual enrollments on the Courses tab:
					<line>Request priority column did not show for Vital and LC courses.</line>
					<line>Adjusted display of request Priority column (include text, not just an icon).</line>
					<line>Improved sorting by Priority, Alternative, and (request) Priority.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling Solver: Export CSV</name>
			<description>
				<line>Corrected Export Solution when the class names include external ids/class suffixes (i.e., unitime.solver.showClassSuffixes is true).</line>
			</description>
		</item>
		<item>
			<name>Multiple Class Setup: Delete Classes</name>
			<description>
				<line>When deleting an assignment, remove all related constraint infos to avoid Hibernate cache issues when an orphaned constraint info is automatically deleted.</line>
				<line>This fixes a No row with the given identifier exists: ConstraintInfo issues.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.8.67</version>
	<release-date>Fri, 6 Oct 2023</release-date>
	<category>
		<title>Technology Upgrade</title>
		<item>
			<name>Hibernate 6.2 / JGroups 5.2</name>
			<description>
				<line>UniTime updated to use the latest versions of Hibernate 6.2 and JGroups 5.2.</line>
				<line>Infinispan 14 is now used for second level cache and cache replication/invalidation when there are multiple web servers.</line>
				<line>This, however, requires UniTime to use Java 11 or later (Java 8 is no longer supported).</line>
				<line>Some HQL reports may need to be updated due to the Hibernate upgrade, e.g.,
					<line>table = id no longer works (e.g., Session = %SESSION% must be changed to Session.uniqueId = %SESSION%)</line>
					<line>x is true needs to be changed to x = true</line>
					<line>function BIT_AND needs to be changed to BITAND</line>
					<line>InstructionalOffering.coordinators needs to be changed to InstructionalOffering.offeringCoordinators</line>
					<line>Assignment.classId needs to be changed to Assignment.clazz.uniqueId</line>
					<line>CourseOffering.isControl = 1 needs to be changed to CourseOffering.isControl = true</line>
					<line>mod(x, n) may need to be changed to mod(cast(x as int), n)</line>
					<line>sysdate - :days (where :days is an integer) may need to be changed to sysdate - numtodsinterval(:days, 'day')</line>
				</line>
				<line>Some Scripts may need to be updated due to the Hibernate upgrade, e.g,
					<line>Query.setLong, setString, setDate, etc., needs to be changed to setParameter</line>
					<line>QueueIn/QueueOut.setXml/getXML now takes a string (use setDocument/getDocument for XML access)</line>
				</line>
			</description>
		</item>
	</category>	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Instructor Survey</name>
			<description>
				<line>Added a new page (Instructor Survey) that can be used by instructors to fill in their preferences and course requirements.</line>
				<line>To be enabled by the Instructor Survey toggle on the academic session status page (Status Types page).</line>
				<line>See https://help48.unitime.org/instructor-survey for more details.</line>
			</description>
		</item>
		<item>
			<name>Instructional Offering Cross Lists</name>
			<description>
				<line>Fix the instructors and offering coordinators when the controlling department is changed.
					<line>This means that each instructor/coordinator gets replaced with an instructor/coordinator from the controlling department with the matching external id.</line>
					<line>An instructor/coordinator assignment gets deleted otherwise (the instructor has no external id or no matching instructor in the new controlling department).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Instructional Offering Detail: Make NOT Offered</name>
			<description>
				<line>Departmental schedule mangers cannot make a course not offered when it has a class they cannot edit (e.g., there is an externally managed class that is being timetabled).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Online Student Scheduling</title>
		<item>
			<name>Online Student Scheduling Dashboard: Advisor Recommendation</name>
			<description>
				<line>In the table showing the advisor recommendations for a student, added the following two columns:
					<line>Advised: date and time when the line was added or modified last</line>
					<line>Advisor: person who advised the student (who added/modified the line last)</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Finder, Online Scheduling Dashboard</name>
			<description>
				<line>When showing data direcly from the database (online scheduling server is not running)
					<line>Correct date pattern formatting (using unitime.pattern.format.useDates property)</line>
					<line>Include date pattern and required room for arrange hours classes</line>
					<line>This applies to
						<line>List of classes on the Course Finder dialog</line>
						<line>Enrollments of a student on the online dashboard (Student dialog)</line>
						<line>Classes listed on the Enrollments tab</line>
					</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Finder: Filter</name>
			<description>
				<line>Course Finder dialog on the Scheduling Assistant, Course Requests, and Advisor Course Recommendations pages improved.</line>
				<line>Added Filter section, which allows for filtering courses by:
					<line>Class start/end date (given course must have an enrollment that does not start before the given From date, or lasts past the To date)</line>
					<line>Min/max credit</line>
					<line>Instructor name (given course must have a class with matching instructor name)</line>
				</line>
				<line>Notes:
					<line>Classes that do not display instructors are not considered by the instructor filter.</line>
					<line>Classes that are not enabled for student scheduling are ignored (both instructor and class dates filters).</line>
					<line>The filter is ONLY used for the list of courses, it does not guarantee that the student gets a class with the given instructor or within the given dates.</line>
					<line>When used on the Student Course Requests page or Advisor Course Recommendations page at the time when the schedule of classes has not been published yet,
						only allow for credit filter (no filtering by class dates or instructor names until the schedule of classes is published).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Dashboards: Show/Hide Columns</name>
			<description>
				<line>Added ability to show/hide columns on the dashboard tables (Enrollments, Students, and Change Log).</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Rules</name>
			<description>
				<line>Added student scheduling rules that can be used to define which courses a particular group of students can request/enroll in.These rules can be defined on Administration > Other > Student Scheduling Rules page.</line>
				<line>A group of students can be a student filter (same format as on the dashboards, e.g., group:SpecialStudents or primary-major:%-OL).</line>
				<line>Each group of students can be restricted to particular course types (provided using a regular expression, e.g., !No Pre-Reg),
					course names (provided using a regular expression, e.g, .*[0-9]OL for all courses with OL suffix),
					or instructional methods (provided using a regular expression, e.g., PO|PH for course configurations with PO or PH instructional methods).
					<line>A course name or instructional method regular expression can be negated by using an exclamation mark as a prefix (e.g., !.*[0-9]OL for all courses without an OL suffix).</line>
					<line>If multiple expressions are provided (e.g., both course and instructional method), depending on the mode of the rule, all of the expressions must match or just one.</line>
				</line>
				<line>Each rule can be restricted by a regular expression matching academic initiative, a regular expression matching term, start and end year.</line>
				<line>The rules are processed in the given order.</line>
				<line>For each student, the first matching rule is used (there are no course or instructional method restrictions when no rule applies).</line>
				<line>A rule can apply only to filter (ability to lookup a course), online scheduling, and/or batch scheduling.Advisors and/or admins may be allowed to ignore the rule (there could be special courses that only advisors and/or admins can put the students in).</line>
			</description>
		</item>
	</category>	
	<category>
		<title>Batch Student Scheduling</title>
		<item>
			<name>Solver Load: Replace Pending courses with Substitutes</name>
			<description>
				<line>Added ability to treat substitute course demands as primary when a primary course demand was skipped entirely due to one of the following reasons:
					<line>pending override request (when Load.ReplacePendingWithSubstitute is true, defaults to false)</line>
					<line>canceled override request (when Load.ReplaceCancelledWithSubstitute is true, defaults to false)</line>
					<line>rejected override request (when Load.ReplaceRejectedWithSubstitute is true, defaults to false)</line>
					<line>not offered course (when Load.ReplaceNotOfferedWithSubstitute is true, defaults to false)</line>
				</line>
				<line>More precisely, when a course demand is skipped (all its courses are skipped for some reason),
					and at least one of the courses is skipped due to a reason that is enabled, then
					<line>Take the top most substitute course demand and treat it as primary.</line>
					<line>The position of the substitute course is kept (it shows at the bottom of the primary requests instead of at the top of the substitutes).</line>
				</line>
				<line>Course demands that do not allow for substitutes (Wait-List or No-Sub toggle is checked) are not replaced with a substitute.</line>
			</description>
		</item>
		<item>
			<name>Batch Student Solver Reports: Solution Statistics</name>
			<description>
				<line>Added Requested Courses - impossible row: percentage of requested courses that have no possible enrollment (e.g., due to having all classes disabled).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Bug Fixes</title>
		<item>
			<name>Academic Sessions</name>
			<description>
				<line>Academic Session column: use academic year (instead of session start year) when identifying an academic session.</line>
			</description>
		</item>
		<item>
			<name>Examination PDF Reports, Enrollment Audit PDF Reports</name>
			<description>
				<line>Use academic year (instead of session start year) when naming an output file.</line>
			</description>
		</item>
		<item>
			<name>Instructor Detail</name>
			<description>
				<line>Previous/Next buttons on the Instructor Detail page: follow the order in which the instructors were listed on the Instructors page.
					<line>Instead of using the default order (instructor names).</line>
				</line>
				<line>Also applies to Previous/Next buttons on the Edit Instructor, Instructor Assignment Preferences, and Instructor Preferences pages.</line>
			</description>
		</item>
	</category>	
</release>
</release-history>
