<?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.6 Release Notes</doc-title>
<release>
	<version>4.6.99</version>
	<release-date>Fri, 16 Dec 2022</release-date>
	<category>
		<title>Administration</title>
		<item>
			<name>Manage Solvers: Solver Allocated Memory
			</name>
			<description>
				<line>Added ability to disable computation of allocated memory of each solver instance (by setting unitime.solvers.memory to false).</line>
			</description>
		</item>
		<item>
			<name>Roll Forward Session: Building and Room Data, Teaching Requests</name>
			<description>
				<line>Fixed the following two errors caused by PostgreSQL being less lenient when it comes to query parameter types than MySQL or Oracle.
					<line>Roll Building and Room Data Forward From Session: operator does not exist: boolean = integer</line>
					<line>Roll Forward Teaching Request For Subject Areas: operator does not exist: bigint = character varying</line>
				</line>
			</description>
		</item>
		<item>
			<name>Edit Academic Session: Bugfix</name>
			<description>
				<line>Ensure that the academic session is not updated when the page is reloaded due to a date change.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.6.96</version>
	<release-date>Tue, 28 Jun 2022</release-date>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Instructional Offering Detail: Wait-Listing</name>
			<description>
				<line>Always show that the offering is wait-listed when
					<line>wait-listing is set differently on the offering from what is set by default (unitime.offering.waitListDefault is true)</line>
					<line>or the offering allows for wait-listing.</line>
				</line>
				<line>So, when the default is true and it is not changed on the offering, show that the offering is being wait-listed.
					<line>This allows to always check and show wait-listing problems (e.g., course is wait-listed and allows for closed section overrides at the same time).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Finder: Courses with matching campus first</name>
			<description>
				<line>When subject area starts with the student's campus code, move courses that match student's primary campus to the top of the list.</line>
				<line>This is disabled by default, enable by setting unitime.enrollment.listOfferings.campusFirst to true.</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Dashboards: Enrollments</name>
			<description>
				<line>Corrected display of the number of not-assigned no-sub course requests.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Edit Course Offering: Permissions for External Managers</name>
			<description>
				<line>It is now possible to give external managers some control over the offering.</line>
				<line>When unitime.permissions.courseOfferingAllowExternalEdits is true (defaults to false):
					<line>EditCourseOfferingCoordinators: passes when the external manager can edit at least one of the classes (ManagerLimitedEdit)</line>
					<line>EditCourseOfferingNote: passes when the external manager can edit at least one of the classes (ManagerLimitedEdit)</line>
					<line>EditCourseOffering: passes for the controlling course when the external manager can edit all the classes (ManagerEdit)</line>
				</line>
				<line>It now also possible for the external managers to edit reservations if all the classes are in their control (ReservationOffering permission).</line>
			</description>
		</item>
		<item>
			<name>Instructor Availability</name>
			<description>
				<line>Corrected combination of unavailable dates and blocking events (when unitime.events.instructorUnavailability is set to true).</line>
				<line>This fixes an issue where unavailable dates were ignored when instructor unavailability events were enabled.</line>
			</description>
		</item>
		<item>
			<name>Distribution Type: Max N Consecutive Days</name>
			<description>
				<line>Added a distribution constraint that limits the number of consecutive days that can be taught each week.</line>
				<line>Individual weeks are considered when FlexibleConstraint.CheckWeeks is set to true.</line>
			</description>
		</item>
		<item>
			<name>Distribution Type: Max N Days, Max N Half-Days</name>
			<description>
				<line>Added ability to evaluate the Max N Days and Max N Half-Days constraints separately for each week.</line>
				<line>When FlexibleConstraint.CheckWeeks is set to true, defaults to false.</line>
			</description>
		</item>
		<item>
			<name>Distribution Type: Same Days-Room-Start</name>
			<description>
				<line>Given classes must start at the same time of day, on the same days and in the same room.</line>
				<line>It is the combination of Same Days, Same Start and Same Room distribution preferences.</line>
				<line>When prohibited or (strongly) discouraged: Any pair of classes classes cannot be taught on the same days during the same time in the same room.</line>
			</description>
		</item>
		<item>
			<name>Spread Constraint</name>
			<description>
				<line>Fixed an ArrayIndexOutOfBoundsException thrown when there are 7 working days (i.e., all days of the week are working days).</line>
			</description>
		</item>
		<item>
			<name>Timetable Grid: Export XLS</name>
			<description>
				<line>Avoid exporting empty resources (resources with no matching classes/meetings).
					<line>This is to fix NullPointerException in per-date mode, e.g., if there is an instructor with no classes.</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Reporting: Room Utilization Report Helpers</name>
			<description>
				<line>Added code that can be called from scripts to generate room utilization and occupancy reports.</line>
				<line>Currently these only work with the Oracle database.</line>
				<line>The data generated by the reports can be broken down by room or building.</line>
				<line>Within a room, it can also be further subdivided by the department and/or subject area teaching the classes using the room.</line>
				<line>Within a building the data can be be further subdivided by the room type, department and/or subject area teaching the classes using the room.</line>
				<line>Example utilization reports are available in the Documentation/Scripts.</line>
			</description>
		</item>
		<item>
			<name>Name Format: Include External ID</name>
			<description>
				<line>Added ability to include external id in the name format.</line>
				<line>The following options are not available:
					<line>ext-last-first-middle</line>
					<line>ext-first-middle-last</line>
					<line>ext-last-first-middle-title</line>
					<line>ext-title-first-middle-last</line>
					<line>ext-title-initial-last</line>
					<line>ext-title-last-initial</line>
				</line>
				<line>To make (some of) them available, added them as options in Administration &gt; Defaults &gt; User Settings, name parameter.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.6.82</version>
	<release-date>Mon, 28 Feb 2022</release-date>
	<category>
		<title>Administration</title>
		<item>
			<name>Data Exchange: Course Offering XML Import</name>
			<description>
				<line>Fixed parsing of boolean values in some of the imports (including Course Offering XML import).</line>
			</description>
		</item>
		<item>
			<name>Data Exchange: Event XML Load</name>
			<description>
				<line>Added an ability to specify the current academic session on the root element (year and term attributes).
					<line>Course elements for course-related events do not need year and term specified separately in this case.</line>
				</line>
				<line>Lookup for the rooms in the current/default academic session first, only look for the rooms in all sessions when no matching room is found in the current/default session.</line>
			</description>
		</item>
		<item>
			<name>People Lookup: Source Mapping</name>
			<description>
				<line>Corrected source mapping when unitime.lookup.source.defaults property is used.</line>
			</description>
		</item>
	</category>
</release>
<release>
	<version>4.6.77</version>
	<release-date>Wed, 29 Jan 2022</release-date>
	<category>
		<title>Online Student Scheduling: Wait-Listing</title>
		<item>
			<name>Configuration</name>
			<description>
				<line>Only certain courses may be enabled for wait-listing (there is a toggle on the Edit Course Offering page).
					<line>By default, only selected courses can be wait-listed. This can be changed using unitime.offering.waitListDefault which defaults to false.</line>
					<line>Certain overrides can be disabled for wait-listed courses (using unitime.offering.waitList.prohibitedOverride).
						<line>For example, a student should not be allowed to request a class limit override for a course that can be wait-listed.</line>
					</line>
				</line>
				<line>There is now a different toggle for wait-listing (Wait-List) and for just indicating that a course cannot be substituted (No-Subs).
					<line>A student (Course Requests, Scheduling Assistant) can use one or the other, based on the student status.</line>
					<line>An advisor (Course Recommendations) can use one or the other, based on the unitime.acr.waitlist setting (defaults to None) or based on the student status.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Assistant</name>
			<description>
				<line>An additional information about wait-listed courses is displayed, in the Wait-Listed Courses section (shown when at least one course is wait-listed).</line>
				<line>As only some course can be wait-listed, the Wait-List checkbox is only available if the first-choice course can be wait-listed.</line>
				<line>There is a warning when a wait-listed course overlaps with the rest of the schedule.</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Dashboard</name>
			<description>
				<line>Wait-List and No-Sub toggles are separated, including the Filter / assignment.</line>
				<line>A course only shows as wait-listed while the student is allowed to wait-list and the course can be wait-listed.</line>
				<line>Show wait-listed courses in the detail of a student, and additional wait-list information (like the wait-listed time stamp, or student's position on the wait-list) on various places of the page.</line>
				<line>Various improvements in the filtering for wait-listed courses.</line>
			</description>
		</item>
		<item>
			<name>Custom Validation</name>
			<description>
				<line>A custom validation of the wait-listed course requests can be implemented using the WaitListValidationProvider class.
					<line>The validation does work similarly to pre-registration, using a test schedule, but doing one course at a time on top of the existing schedule.</line>
					<line>It may include max credit overrides.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Process Changes</name>
			<description>
				<line>Re-scheduling is disabled by default (students are not moved around during course unlock).
					<line>Can be enabled by setting solver configuration parameter Enrollment.ReSchedulingEnabled to true.</line>
				</line>
				<line>Students wait-listed for a course are processed in the following order:
					<line>Course request priority (critical courses) first, student priority second, wait-listed time stamp last.</line>
					<line>Students with a pending override, a time conflict, or students over max credit are skipped.</line>
					<line>The order can be customized (e.g., only be based on the wait-listed time stamp)</line>
				</line>
				<line>Email notifications added when custom enrollment fails (it is not possible to enroll student because of registration error).</line>
				<line>Wait-list toggle is no longer automatically enabled when a student attempts to enroll to a course that is currently locked.</line>
				<line>Various improvements across all the wait-listing functionality.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Special Registration: Variable Title Workflow</name>
			<description>
				<line>Added an ability to plug-in a variable title course request workflow.</line>
				<line>This include a new functionality on the Scheduling Assistant page and an API that can be used to create a variable title course in UniTime.</line>
			</description>
		</item>
		<item>
			<name>Course Requests: Requested Credit</name>
			<description>
				<line>Requested credit computation updated to consider students (and optionally) advisor's no-subs/wait-listed courses.
					<line>A no-sub/wait-listed course cannot be replaced by a substitute course.</line>
					<line>The advisor recommendations are only considered when the solver parameter Load.UseAdvisorWaitLists is set to true.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Online Student Scheduling Dashboard: Requested Approvals</name>
			<description>
				<line>Details of a student: show student's requested approvals in a new tab when available.</line>
			</description>
		</item>
		<item>
			<name>Batch Student Scheduling: Section Times</name>
			<description>
				<line>Added ability to load arranged hours (no time) classes with a time (listing the date pattern but no time) and rooms (that are required by the class).
					<line>This allows the effective date pattern and required room to show on arranged hours classes on the solver dashboard.</line>
					<line>Can be disabled by setting the solver parameter Load.ArrangedHoursPlacements to false (defaults to true).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Dashboards: Enrollments</name>
			<description>
				<line>When showing classes of a course, list all classes (but the classes that do not match the filter are grayed out).</line>
				<line>It is possible to switch between showing all classes and just the matching classes using the sctdashShowUnmatchedClasses user setting parameter (defaults to yes, show unmatched classes).</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Dashboards: Additional Filter Capabilities</name>
			<description>
				<line>Requested credit range (e.g., requested-credit:&gt;=15 for students that requested 15+ credit hours)</line>
				<line>First-choice credit range (e.g., first-choice-credit:&gt;=15 for students with their first-choice requested courses of 15 or more credit hours)</line>
				<line>Choice / alternativity (e.g., choice:&gt;1 for cases where an alternative course is assigned, or not-assigned primary course request has at least one alternative)</line>
				<line>Request Priority (e.g., rp:&lt;=2 for course requests that are of priority 1 or 2)</line>
				<line>Online / Face-to-face / Has-Time / No-Time (e.g., face-to-face:&lt;2 for students with less than two face-to-face classes, or online:&gt;50% for students with more than half of their classes online)</line>
				<line>Added ability to filter by primary academic area, classification, major, concentration, or program (e.g., primary-area:A)</line>
			</description>
		</item>
		<item>
			<name>Student Program</name>
			<description>
				<line>Added ability to include an optional program field on a student, with academic area, major, and classification.</line>
				<line>Included in Student XML and Course Requests XML exports and imports.</line>
				<line>Student Scheduling Dashboards: Added optional Program column and the ability to filter by program.</line>
			</description>
		</item>
		<item>
			<name>Student Campus</name>
			<description>
				<line>Added ability to include an optional program field on a student, with academic area, major, and classification.</line>
				<line>Included in Student XML and Course Requests XML exports and imports.</line>
				<line>Student Scheduling Dashboards: Added optional Campus column and the ability to filter by program.</line>
			</description>
		</item>
		<item>
			<name>Course Finder</name>
			<description>
				<line>Sections that the student cannot be enrolled in are grayed out even when there is space in them.</line>
				<line>Hide sections and instructional methods not allowed by the Online-Only filter.</line>
				<line>Added a column listing whether the course is wait-listed and/or has some allowed overrides.</line>
			</description>
		</item>
		<item>
			<name>Banner XE API</name>
			<description>
				<line>Added ability define whether advisors using the XE API will set or not set the admin flag (systemIn parameter).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Examination Timetabling</title>
		<item>
			<name>Examination PDF Reports</name>
			<description>
				<line>Added new output format options: CSV, XLS, and PDF using a non-monospaced font.</line>
			</description>
		</item>
	</category>
		<category>
		<title>Course Timetabling</title>
		<item>
			<name>Solver: Stop</name>
			<description>
				<line>Added ability to stop the solver after it has finished, while running the when finished actions, including:
					<line>solution save (all solvers),</line>
					<line>student sectioning (course timetabling solver),</line>
					<line>validation (student scheduling solver).</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Administration</title>
		<item>
			<name>Roll Forward Session</name>
			<description>
				<line>Roll date pattern preferences (for alternative date patterns) forward.</line>
				<line>Corrected rolling forward of learning community reservations (special case of student group reservation).</line>
				<line>Added ability to roll forward wait-listing (is an offering wait-listed) and prohibited overrides.</line>
			</description>
		</item>
		<item>
			<name>Added Support for JDK 16+</name>
			<description>
				<line>Various dependencies updated to avoid illegal access exceptions.</line>
				<line>MemoryCounter updated to avoid illegal access calls (using the Unsafe access instead).</line>
				<line>LDAP authentication is disabled by default, to enable add the following line to catalina.properties:
					<line>unitime.spring.context.security=securityContextLDAP.xml</line>
				</line>
			</description>
		</item>		
		<item>
			<name>Added Support for Apache Tomcat 10</name>
			<description>
				<line>Due to the move from Java EE to Jakarta EE, the Tomcat 10 compatible version of UniTime is available under web-tomcat10 in the distribution.
					<line>It is built using the Apache Tomcat migration tool for Jakarta EE.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Dependencies / Technology Update</name>
			<description>
				<line>GWT updated to version 2.9.0 (was 2.8.2).</line>
				<line>Javassist updated to version 3.28.0 (was 3.18.2).</line>
				<line>Spring core libraries updated to version 5.3.14 (was 4.3.40).</line>
				<line>Spring security updated to 5.4.9 (was 4.2.20).</line>
				<line>Spring integration updated to 5.4.12 (was 4.3.24).</line>
				<line>Protocol Buffers updated to version 3.18.2 (was 2.6.1)</line>
				<line>Log4j updated to 2.17.1 (was 1.2.17).</line>
			</description>
		</item>
	</category>
</release>
</release-history>
