<?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.0 Release Notes</doc-title>

<release>
	<version>4.0.49</version>
	<release-date>Wed, 24 Feb 2016</release-date>
	<category>
		<title>Bug Fixes</title>
		<item>
			<name>Online Student Scheduling</name>
			<description>
				<line>Reservations: Fixed an issue that was causing the server to take all the properties (reservation priority, must be used, can assign over limit, allow overlap)
				from parameters of individual reservations regardless of the reservation type.</line>
			</description>
		</item>
		<item>
			<name>Examination Timetabling</name>
			<description>
				<line>Add/Edit Examinations, Add/Edit Examination Distribution Preferences: avoid ClassCastException in certain setups (Java 8 with Tomcat 7)</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.0.47</version>
	<release-date>Thu, 3 Dec 2015</release-date>
	<category>
		<title>Bug Fixes</title>
		<item>
			<name>Instructional Offering Detail</name>
			<description>
				<line>Curricula Table: Fixed a null pointer exception that sometimes occurs.</line>
			</description>
		</item>
		<item>
			<name>Data Exchange</name>
			<description>
				<line>Course Catalog XML Import: Fixed setting of the fractionalCreditAllowed attribute.</line>
			</description>
		</item>
		<item>
			<name>Edit Course Offering</name>
			<description>
				<line>By Reservation Only, Enrollment Deadlines: Corrected the condition when the by reservation only toggle and the enrollment deadlines are updated.
					<line>This fixes the problem of the by reservation only toggle not being updated when the course has no credit information.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Date Patterns</name>
			<description>
				<line>Week Number: Corrected computation of the week number to folow the formal definition in ISO 8601.
					<line>Week 1 is the week with the year's first Thursday in it.</line>
				</line>
				<line>Comparison: Compare date patterns using numbers of weeks and offsets instead of sizes and start dates.
					<line>This also fixes the transitivity of the comparison (IllegalArgumentException: Comparison method violates its general contract).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Event Management</name>
			<description>
				<line>Fixed a NullPointerException error when there is Display Conflicts in the event filter with nothing in the room filter and the query returns a meeting that has no room.</line>
			</description>
		</item>
		<item>
			<name>Online Student Scheduling</name>
			<description>
				<line>Course Types: Fixed an issue of ignoring course types when the online scheduling server runs in the replicated mode.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Other Improvements</title>
		<item>
			<name>Session Roll Forward</name>
			<description>
				<line>Instructional Offerings: When adding new instructional offerings based on course catalog data for a session,
					set up the course credit unit configuration if it exists in the course catalog.
					<line>This was already done when the course catalog was being used in conjunction with rolling existing courses forward for a session, but not for a new offering.</line>
				</line>
			</description>
		</item>
		<item>
			<name>UniTime RESTful API</name>
			<description>
				<line>API Permission Checks: Check any authority instead of the current (default) one.</line>
			</description>
		</item>
		<item>
			<name>Class Assignment</name>
			<description>
				<line>Rooms: display the GWT-based room tool tip on mouse over. It also contains the room preference, and the conflicting class (if there is a conflict) as a note.</line>
				<line>Times: display the GWT-based time tool tip on mouse over. It shows time pattern grid with the time preferences and the selected time highlighted.</line>
				<line>Rooms: added ability to select between departmental, timetabling, and all rooms.
					<line>Timetabling rooms are all the rooms that have at least one department in the room sharing, i.e., rooms that can be used for course timetabling by at least one department.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Room Availability Interface</name>
			<description>
			 	<line>Room availability interface changed to pass only unique ids instead of the whole Location / DepartmentalInstructor objects.</line>
			 	<line>This is to avoid unnecessary serialization between the remote solver server and the web server.</line>
  			</description>
		</item>
		<item>
			<name>Solver (RPC) Cluster</name>
			<description>
				<line>When calling refresh solution, pass the refresh to all local servers (not just the first one).</line>
			</description>
		</item>
		<item>
			<name>Config Edit</name>
			<description>
				<line>Added the ability to configure a maximum number of classes allowed to be created for a scheduling subpart.
					<line>The property unitime.subpart.max_num_classes determines the maximum number of classes that can be created for a scheduling subpart using the Config Edit page.  The property defaults to 998 classes.</line>
				</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.0.37</version>
	<release-date>Thu, 1 Oct 2015</release-date>
	<category>
		<title>Bug Fixes</title>
		<item>
			<name>Course Timetabling: Student Sectioning</name>
			<description>
				<line>Include committed student conflicts in the check whether a student swap was improving.</line>
				<line>Undo the swap if it was not improving (this fixes the problem that could cause student sectioning to hang).</line>
			</description>
		</item>
		<item>
			<name>Online Student Scheduling: Custom Student Enrollment Interface</name>
			<description>
				<line>Fixed an issue with the disabled for student scheduling check (do not drop a student if he/she is already in the section).</line>
				<line>Keep sections that cannot be dropped in the add (courseReferenceNumbers) list.</line>
				<line>When a course is locked and there is a change, also mark dropped sections as failed.</line>
				<line>When UniTime does not know about the student, but there is an enrollment provider capable of requesting updates, then use the custom eligibility check to request an update.</line>
				<line>During enrollment, ensure that there is a request for any course that the student failed to drop because of the custom student enrollment interface rejected the drop.</line>
				<line>Avoid inclusing classes that were rejected to be added by the custom student enrollment interface in the consecutive enrollment request.</line>
			</description>
		</item>
		<item>
			<name>Instructional Offering Configuration</name>
			<description>
				<line>Fixed an issue preventing a configuration with two or more levels of parent-child relations from being deleted (ObjectDeletedException).</line>
			</description>
		</item>
		<item>
			<name>Permissions</name>
			<description>
				<line>Remember the roles and their order when the page is loaded, use this list for the updates.</line>
				<line>This fixes the issue with the permissions getting shifted between roles as the order of the roles is changed between updates
					(number of permissions of a role is used in the ordering).</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Missing Solver Group</name>
			<description>
				<line>Fixed a NullPointerException thrown when the solver tries to load a class that is managed by a department which does not have a solver group.</line>
				<line>Warning "Manager of class X has no solver group." is logged instead.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Other Improvements</title>
		<item>
			<name>Course Timetabling: N Hour Work Day</name>
			<description>
				<line>Added constraint N Hour Work Day (where N can be 6, 7, 8, ..., 12)</line>
				<line>The constraint limits the time between the start of the first class and the end of the last class on any day.</line>
				<line>Distribution type reference is WORKDAY(N), where N is between 6 and 12.</line>
				<line>The constraint needs to be registered. This can be done by a script:
					<line>Download the script from http://goo.gl/9nyu0U and import it on the Administration &gt; Academic Sessions &gt; Data Exchange page.</line>
					<line>Run the script Distribution Types: Create Work Day Constraints on the Administration &gt; Utilities &gt; Scripts page.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Events Lookup Backend: Personal Schedule</name>
			<description>
				<line>Added ability to filter events by role (student, instructor, coordinator, contact):
					<line>contact: only list events that has the user as main or additional contact,</line>
					<line>student: only list class, course related and examination events attended by the person (as a student),</line>
					<line>instructor: only list classes, course related and examination events with the person assigned as instructor,</line>
					<line>coordinator: only list classes, course related and examination events with the person assigned as course coordinator.</line>
				</line>
				<line>Multiple roles can be provided (default is student, instructor, and contact).</line>
				<line>Added ability to type in role (or roles) on the Personal Timetable page (but the roles do not show up in the Event Filter).</line>
			</description>
		</item>
		<item>
			<name>Event Filter: Do not count conflicting events</name>
			<description>
				<line>Added ability to avoid counting conflicting events in the Event Filter.
					<line>To be enabled by setting the application property unitime.events.eventFilter.skipConflictCounts to true (defaults is false).</line>
					<line>This makes the component load faster, especially on MySQL.</line>
				</line>
			</description>
		</item>
		<item>
			<name>UniTime RESTful API</name>
			<description>
				<line>First take on creating a RESTful API in UniTime.</line>
				<line>Following conntectors have been created so far:
					<line>/api/events: ability to retrieve events (using the EventInterface class converted to JSON, example: GET UniTime/api/events?type=PERSON&amp;ext=1001&amp;term=Fal2010)</line>
					<line>/api/json: JSON interface for GWT calls (that implement the GwtRpcRequest interface)</line>
					<line>/api/exchange: to export/import UniTime's data exchange XML files
						<line>export example: GET UniTime/api/exchange?term=Fal2010&amp;type=students</line>
						<line>import example: POST UniTime/api/exchange (with the XML as payload)</line>
					</line>
					<line>/api/roles?id=&lt;externalId&gt; returns a list of academic sessions (and roles) for a person (returns a list of academic sessions when there is no id parameter)</line>
					<line>/api/enrollments?eventId=&lt;id&gt; returns student enrollments for an event, a class (when classId parameter is used instead),
						 an exam (examId), a course offering (courseId), an instructional offering (offeringId), or instructional offering configuration (configId)</line>
					<line>/api/instructor-schedule?id=&lt;externalId&gt;&amp;term=&lt;term&gt; returns classes, courses, and examinations assigned to an instructor.</line>
					<line>/api/class-info?classId=&lt;id&gt; returns information about a class (including assinged instructors and coordinators)</line>
				</line>
				<line>Each connector has the appropriate permission (see Api... permissions), with the ability to either use HTTP-simple authentication or an API token.</line>
				<line>It is possible to change the hibernate cache mode for a particular API connector by setting the unitime.api.X.cacheMode application property (where X is the connector name).
					<line>For example, setting unitime.api.enrollments.cacheMode=REFRESH will make the /api/enrollments connector to never read the hibernate cache, but it will keep it updated.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Online Student Scheduling: Scheduling Assistant</name>
			<description>
				<line>If eligibility check fails, keep on displaying the eligibility check message. This makes it easier to see why the Submit Schedule button is not visible.</line>
				<line>Added ability to execute the custom eligibility check when the Submit Schedule is pressed:
					<line>when the custom eligibility chek returns RECHECK_BEFORE_ENROLLMENT flag, or</line>
					<line>when unitime.enrollment.recheckCustomEligibility is set tu true (defaults to false).</line>
				</line>
				<line>Course Requests: Added a missing notification when a course is selected using the Course Finder dialog.
					<line>This fixes the issue of the course alternative not being enabled when the course is entered using the Course Finder dialog.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Online Student Scheduling: Locking</name>
			<description>
				<line>Added ability to tune the locking using application properties.</line>
				<line>For each action, it is possible to specify if the student as well as the related offerings should be locked.</line>
				<line>By default, the following operations no longer lock offerings (they only lock the student): eligibility, status-change, student-email.</line>
				<line>The locking can be changed by the following properties:
					<line>unitime.sectioning.config.X.LockOfferings (include offerings in the lock for the action named X)</line>
					<line>unitime.sectioning.config.X.LockStudents  (include student in the lock for the action named X)</line>
				</line>
			</description>
		</item>
		<item>
			<name>Online Student Scheduling Reports</name>
			<description>
				<line>CSV Export: Added ability to provide the academic session as parameter. This allows for the exporter to be called from outside of UniTime.</line>
				<line>Individual Time Overlaps: Added a new report computing individual student time conflicts. There are four variants:
					<line>Individual Student Time Overlaps lists all time conflicts, showing why a conflict is allowed,</line>
					<line>Not Allowed Time Overlaps only lists time conflicts that are not allowed (and should not be present in the data),</line>
					<line>Individual Student Time Overlaps (Exclude Break Times) lists all time conflicts, but break times are excluded from conflict checking,</line>
					<line>Not Allowed Time Overlaps (Exclude Break Times) lists all time conflicts that are not allowed even when break times are excluded from conflict checking</line>
				</line>
			</description>
		</item>
		<item>
			<name>Online Student Scheduling: Enrollments table</name>
			<description>
				<line>Do not list enrollment message for requests that are enrolled (enrollment message contains a reason why a request is not enrolled).</line>
			</description>
		</item>
		<item>
			<name>Data Exchange: Student Enrollments and Student Sectioning XML imports</name>
			<description>
				<line>The import can now work with a case where class external ids are NOT unique (e.g., when Lec 1 and Lec 1a share the same external id).</line>
				<line>Fixed an issue with dropping alternative course request (deleted object would be re-saved by cascade).</line>
				<line>Fixed an issue with parsing free-time request days of week (Thursday, Sunday were incorrectly parsed).</line>
				<line>Added ability to have &lt;alternative&gt; element of an &lt;alternative&gt; element (which is the way how 2nd alternative is exported).</line>
				<line>When a student is enrolled into an existing course request, drop the enrollment message if there is one (enrollment message contains a reason why a request is not enrolled).</line>
			</description>
		</item>
		<item>
			<name>Data Exchange: Course Offering XML export and import</name>
			<description>
				<line>Added course offering reserved space (reserved attribute of the course element).</line>
			</description>
		</item>
		<item>
			<name>Technology Update: GWT 2.7.0</name>
			<description>
				<line>GWT updated to version 2.7.0 (was 2.6.1).</line>
				<line>Also updated CGLIB to version 3.1 (was 2.2.2), to use the same version of ASM as GWT (5.0.3, was 3.3.1).</line>
			</description>
		</item>
		<item>
			<name>Timetable Managers: Show all managers</name>
			<description>
				<line>Added ability to hide managers that have no session independent role and no relation to the current academic session.
					<line>By default only managers that have a session independent role or at least one department of the current academic session are shown.</line>
					<line>This can be changed by checking the "Show all managers" at the bottom of the list.</line>
				</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.0.17</version>
	<release-date>Sat, 16 May 2015</release-date>
	<category>
		<title>Bug Fixes</title>
		<item>
			<name>Data Exchange: Session Restore</name>
			<description>
				<line>Avoid conversion of a binary object to utf-8 and back.</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Assistant: Authentication</name>
			<description>
				<line>When authentication is required but the user login dialog is not allowed: fixed the case when the Login page was not loaded at times.</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Ignore Room Check</name>
			<description>
				<line>Improved handing of locations that have the ignore room check toggle set:
					<line>No overlaps are checked in such locations during commit.</line>
					<line>No committed placements (of other problems) nor other approved events are loaded as unavailabilities for such locations (ignore room check location is always available).</line>
				</line>
			</description>
		</item>
		<item>
			<name>UniTime Registration</name>
			<description>
				<line>Main page: fixed the ability to register the UniTime instance.</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>4.0.12</version>
	<release-date>Sun, 19 April 2015</release-date>
	<category>
		<title>Bug Fixes</title>
		<item>
			<name>Online Student Scheduling Server</name>
			<description>
				<line>Get course by name or by name and title: fix the case when there is a dash in the subject area abbreviation or a course number.</line>
				<line>Improved handling of the case when a student is enrolled into the same offering multiple times, under different course names.</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Database Load</name>
			<description>
				<line>Ensure that an instructor distribution preference is loaded in only once when the following two conditions are met:
					<line>a) inherited instructor preferences is enabled on an external department,</line>
					<line>b) both the external department and the instructor's department are being loaded in.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Data Exchange: Session Restore</name>
			<description>
				<line>Fixed ability to import a new instructional type (id was not set).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Other Improvements</title>
		<item>
			<name>Online Student Scheduling: Eligibility Check</name>
			<description>
				<line>When there is no student record matching with the external id of the authenticated user:
					<line>"You are not registered as a student in {0}." message changed to "You are not eligible to register in {0}.".</line>
					<line>Do not display the message when in the assistant mode (enrollment is not enabled).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Solution Reports: Violated Distribution Preferences</name>
			<description>
				<line>Added a column counting the number of violations (violated pairs).</line>
				<line>Include flexible group constraints in the list.</line>
			</description>
		</item>
		<item>
			<name>Suggestions: Flexible Constraints</name>
			<description>
				<line>Include flexible group constraints in the Distribution Preferences counters.</line>
				<line>Include flexible group constraints on the Violated Constraints list.</line>
			</description>
		</item>
		<item>
			<name>Batch Student Sectioning: Database Loader</name>
			<description>
				<line>Minimal Perturbation Problem: Add current class assignments as selected choices.
					<line>This helps keeping students close to their original enrolment when the original enrolment is not in the domain.</line>
				</line>
				<line>Added ability to load student groups as request groups.
					<line>Request groups are loaded in only when the solver paramter Load.RequestGroups is set to true, default is false.</line>
					<line>Solver parameter StudentWeights.SameGroup (defaults to 0.1) can be used to change the impact of the same group criterion.</line>
					<line>Request Groups solver report has been also added.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Localization</name>
			<description>
				<line>Added ability to let users to choose the locale by defining the unitime.locale manager settings.</line>
			</description>
		</item>
		<item>
			<name>HQL Reports: Reference Tables</name>
			<description>
				<line>Added ability to include any reference table (room type, distribution type, etc.) as query parameter.</line>
			</description>
		</item>
		<item>
			<name>Scripts: Import / Export XML</name>
			<description>
				<line>Added ability to export a script in XML format.</line>
				<line>Added ability to import XML with one ore more scripts.</line>
			</description>
		</item>
		<item>
			<name>Events: Standard Notes</name>
			<description>
				<line>Added Select button when selecting a standard note (both Standard Notes dialog and Approval dialog).</line>
				<line>This fixes the issue of not being able to select a standard note on a mobile device (due to the inability to double click).</line>
			</description>
		</item>
		<item>
			<name>CAS Authentication</name>
			<description>
				<line>Added ability to always translate the returned external user id by setting unitime.authentication.cas.id-translate to true (defaults to false).</line>
				<line>Added ability to lookup multiple attributes in the CAS ticket (the unitime.authentication.cas.id-translate can contain a comma separated list of attributes).
					<line>Each attribute may or may not be translated (the unitime.authentication.cas.id-translate can contain a comma separated list of true and false values, one for each attribute).</line>
				</line>
			</description>
		</item>
		<item>
			<name>External User Id Translation</name>
			<description>
				<line>Added ability to translate user names (as returned by the authentication) to the external user ids that are used by UniTime.</line>
				<line>Configuration (default SQLs are using the users table):
					<line># Enable custom SQL user id translation</line>
					<line>tmtbl.externalUid.translation=org.unitime.timetable.spring.security.CustomSQLExternalUidTranslation</line>
					<line># SQL query converting user name to external user id</line>
					<line>unitime.custom.sql.uid2ext=select external_uid from %SCHEMA%.users where username = ?</line>
					<line># SQL query converting external user id to user name</line>
					<line>unitime.custom.sql.ext2uid=select username from %SCHEMA%.users where external_uid = ?</line>
				</line>
			</description>
		</item>
		<item>	
			<name>Events: Course Title</name>
			<description>
				<line>Time Grid: Added ability to display course title in the header of an event in the time grid.</line>
				<line>This only happens when the application property unitime.events.grid_display_title is set to true (defaults to false, current behaviour).</line>
				<line>Only applies to class events (course related events and examination events can relate to multiple courses and can have multiple titles with ambiguous choice which one to display).</line>
				<line>When multiple course title exists, only the first one is displayed (e.g., in the case of a cross-list, it should be the title of the controlling course).</line>
				<line>Format: course title (instruction section)</line>
				<line>Example: Fundamentals of Biology II (Laboratory 12038-042)</line>
			</description>
		</item>
		<item>	
			<name>Events: ICS Export</name>
			<description>
				<line>When the grid display title is enabled (see above), course title is used as event name (summary field).</line>
				<line>Added ability to include instructor names in the description of an event.
					<line>Tis only happens when the application property unitime.events.ics_instructors_in_description is set to true (defaults to false, current behaviour).</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>CPSolver updated to version 1.3.52 (was 1.3.47)</title>
		<item>
			<name>Student Sectioning: Minimal Perturbation Problem</name>
			<description>
				<line>Priority and equal weighting: added ability to minimise perturbations.</line>
				<line>Difference of an enrollment (from the initial one) is computed as a number between 0 (completely different) and 1 (the initial enrollment).</line>
				<line>It is computed as average using the following schema (over all sections of the enrollment):
					<line>An initial section counts as 1,</line>
					<line>same choice section counts as 0.9 (parameter StudentWeights.SameChoice),</line>
					<line>same time section counts as 0.7 (parameter StudentWeights.SameTime),</line>
					<line>and different time section counts as 0.</line>
				</line>
				<line>Non-initial enrollment weight is penalized with weight StudentWeights.Perturbation (defaults to 0.100) using the following formula
					<line>weights *= (1 - difference * StudentWeights.Perturbation)</line>
				</line>
				<line>When MPP is enabled, solution info contains the following three new properties:
					<line>Perturbations: same section assigned (% of initial section assigned over all course requests with initial enrollment)</line>
					<line>Perturbations: same choice assigned (% of same choice section assigned over all course requests with initial enrollment)</line>
					<line>Perturbations: same time assigned (% of same time section assigned over all course requests with initial enrollment)</line>
				</line>
				<line>Note: same choice means same time and instructor.</line>
			</description>
		</item>
		<item>
			<name>Student Sectioning: Reservations</name>
			<description>
				<line>If reservations are allowed to assign students over the limit during the batch student sectioning, do not count the enrollments with such reservations towards course, configuration, and section limits.</line>
				<line>This is to avoid issues with the order in which enrollemnts were made.</line>
			</description>
		</item>
		<item>
			<name>Student Sectioning: Parallel Solver</name>
			<description>
				<line>Course, Config, Section, and Reservation contexts now implement the CanInheritContext interface.</line>
				<line>This speeds up the creation of an inherited context.</line>
			</description>
		</item>
		<item>
			<name>Batch Student Sectioning: Request Groups</name>
			<description>
				<line>Added ability to keep students of the same group together.</line>
				<line>Measured as an average probability of two students (of a group) that are requesting the same course being given the same section (of the same subpart).</line>
				<line>There is a new weight (named StudentWeights.SameGroup, defaults to 0.1) expressing how much this criterion affects the student weight (in both priority and equal weighting).</line>
				<line>This means that if a student is being enrolled into a completely different section, weight of such an enrollment is decreased by 10%.
					<line>(the metric reflects how much are the students spread between the sections of the course)</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Added MaxDays Flexible Constraint</name>
			<description>
				<line>The MaxDays constraint limits the number of days of week during which the given set of classes are taught.</line>
				<line>It has one parameters: a maximal number of week days during which the given set of classes can be placed.</line>
				<line>For instance, reference _MaxDays:2_ translates to a maximum number of 2 days a week.</line>
			</description>
		</item>
	</category>	
</release>

<release>
	<version>4.0.2</version>
	<release-date>Fri, 27 Feb 2015</release-date>
	<category>
		<title>Organizational Changes</title>
		<item>
			<name>The Apereo Foundation</name>
			<description>
				<line>This is the first release under the Apereo Foundation.</line>
				<line>License was changed to the Apache Software License (ASL), Version 2.0.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Bug Fixes</title>
		<item>
			<name>Session Roll Forward</name>
			<description>
				<line>Distribution Preferences: fixed rolling forward of distribution preferences when an academic session is rolled forward multiple times.
					<line>There can be multiple distribution preferences with the same value of the uniqueIdRolledForwardFrom attribute, one for each target academic session.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Examination Timetabling</name>
			<description>
				<line>Load Availabilities: ignore class event meetings that are cancelled.</line>
			</description>
		</item>
		<item>
			<name>Event Management</name>
			<description>
				<line>Course Related Events: class selection corrected when trying to select a class that has a parent class.
					<line>Only top level classes showed up in the Class Number drop down.</line>
				</line>
				<line>iCalendar Export: fixed SEQUENCE and DTSTAMP attributes in the iCalendar feed.
					<line>This change fixes the issue of DTSTAMP being blank in certain cases (and violating the RFC 5545).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Online Student Scheduling</name>
			<description>
				<line>Online Scheduling Reports: fixed null exception thrown when there is a student with free time request.</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling</name>
			<description>
				<line>Database Save: Fixed SuspectedException thrown during save of the conflict statistics under certain condition.
					<line>If run in a cluster, the remembered address of the web-server gets invalid when the web-server is restarted.</line>
				</line>
				<line>Group Constraint: Fixed an exception that can be thrown during the purge invalid placement phase because of a hard back-to-back constraint.</line>
			</description>
		</item>
		<item>
			<name>Rooms</name>
			<description>
				<line>Edit Room Groups / Features (accessible from the Room Detail page): fixed the problem of removing the last departmental room feature or group.
					<line>It was not possible to remove the last departmental room feature or room group using this page because the relation between the feature / group
						and the location was not updated on both sides in this particular case.
					</line>
					<line>The other page (Edit Room Feature / Group) did not have the problem.</line>
				</line>
			</description>
		</item>
	</category>
	<category>
		<title>Other Improvements</title>
		<item>
			<name>Suggestions</name>
			<description>
				<line>When a placement that conflicts with itself is selected, display the selected assignments and the conflict table, but no Assign button.
					<line>This is to give the user more information on why the selected assignment cannot be used.</line>
				</line>
			</description>
		</item>
		<item>
			<name>CAS Authentication</name>
			<description>
				<line>Added ability to provide user external id and full name from the CAS response attributes.</line>
			</description>
		</item>
		<item>
			<name>Event Management</name>
			<description>
				<line>Email Confirmation: Added ability to CC event managers in the confirmation email.
					<line>This is only enabled when the unitime.email.event.managers application property is set to true (default is false).</line>
					<line>If set to true, all timetable managers that are associated with the event department of a room in the event and
						which have an event management role (that is a role with Event Lookup Contact permission) with the receive emails toggle checked
						are carbon copied on the event confirmation email.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Data Entry</name>
			<description>
				<line>Classes, Instructional Offerings: Added ability to highlight preferences that are set directly on classes.
					<line>Preferences that are set directly on classes have light yellow background.
						<line>This is only enabled when the unitime.preferences.highlightClassPrefs property is set to true (default is false).</line>
					</line>
					<line>Preference owner (class, scheduling subpart, instructor, etc.) is also mentioned in the preference tooltip (this feature is always on).</line>
					<line>Multiple Class Setup: Added ability to edit class sufixes (labeled as External Ids in the user interface).
						<line>This is only enabled when the tmtbl.class_setup.edit_external_ids property is set to true (default is false).</line>
					</line>
				</line>
			</description>
		</item>
		<item>
			<name>Examination Timetabling</name>
			<description>
				<line>PDF Reports: Added compact mode for the period chart.
					<line>No section information is printed, but the page fits up to 6 columns instead of just 4.</line>
				</line>
			</description>
		</item>
	</category>
</release>

<release>
	<version>3.5.187</version>
	<release-date>Tue, 23 Dec 2014</release-date>
	<category>
		<title>Technology Update</title>
		<item>
			<name>Clustering</name>
			<description>
				<line>Improved ability for UniTime to run in a cluster.
					<line>Remote solver servers connect to each other and the web server(s) using JGroups.</line>
					<line>Hibernate L2 cache is now replicated across the cluster.
						<line>However, L2 cache is disabled when Hibernate is used outside of Tomcat (e.g., on a remote solver server).</line>
					</line>
				</line>
				<line>Clustering can be disabled by setting application properties unitime.hibernate.cluster (Hibernate L2 cache) and unitime.solver.cluster (remove solver servers) to false.</line>
				<line>Online student scheduling server can now run on multiple machines at once, with the data asynchronously replicated (using infinispan) and one machine being the master (responsible for all the updates).
					<line>To enable replication, set unitime.enrollment.server.replicated to true.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Constraint Solver</name>
			<description>
				<line>Using the latest version of CPSolver 1.3</line>
				<line>This update contains a new assignment model and multi-core capabilities.</line>
			</description>
		</item>
		<item>
			<name>Mobile</name>
			<description>
				<line>A few initial steps have been made towards a frendlier version of UniTime pages on mobile (tables or phone) devices.</line>
				<line>Mobile page layout is using less tables, and there is a new menu.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Student Scheduling</title>
		<item>
			<name>Over-Expected Criterion</name>
			<description>
				<line>Added ability to provide a custom criterion that decides whether a class is over-expected or not.</line>
				<line>Default implementation now falls back to section balancing when there are no expectations.
					<line>I.e., students can be only allowed into sections that are (or will become) dis-balanced by more than 10% if there are no other sections meeting their schedule.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Reports</name>
			<description>
				<line>Added an interface that is implemented by all the reports.</line>
				<line>Added time / availability conflicts report: unlike the existing course conflict report, conflicts are counted between individual classes.</line>
				<line>Distance conflict report: changed to compute conflicts between individual classes.</line>
				<line>Unbalanced sections report: list sections that are dis-balanced by more than 10%.</line>
				<line>Time-overlaps report: list time conflicts between classes (that do allow for time overlaps).</line>
				<line>Added a page through which various student sectioning solver reports can be displayed:
					<line>Works for both batch (page  Student Sectioning Solver Reports, menu Students > Solver Reports) and online (page Online Student Scheduling Reports, menu Students > Online Scheduling Reports).</line>
					<line>All the existing current reports are available (time conflicts, availability conflicts, unbalanced classes, distance conflicts, time overlaps).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Dashboard</name>
			<description>
				<line>Display Not-Enrolled student requests instead of just the wait-listed ones.</line>
				<line>Distinguish wait-listed unassigned request with the w) hint.
					<line>This is done in the same way as there is the r) hint for enrollments using reservations or for reserved space.</line>
				</line>
				<line>Filter text field was replaced by the new filter box component (which is used on the events page, e.g., as Event Filter or Room Filter).</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling Assistant</name>
			<description>
				<line>Added ability to wait-list an unassigned course request in the List of Classes table.</line>
				<line>Added ability to automatically add course request and alternate course request lines as they are needed.</line>
				<line>Time Conflicts: display the allowed time conflicts note (Overlaps with x) in red color.
					<line>There is also a warning icon next to each class that has a time conflict.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Custom Student Enrollment Interface</name>
			<description>
				<line>Added an ability to provide a custom class that synchronizes the enrollments with an external system.</line>
				<line>The interface can be used to check student's eligibility (an additional step in the CheckEligibility action).
					<line>The external system can request students to enter a PIN number.</line>
					<line>Discrepancies between the two systems can be detected (e.g., a student may be denied the ability to enroll through UniTime if the two systems are not in sync).</line>
				</line>
				<line>The interface can be used to enroll students into classes (an additional step in the EnrollStudent action).
					<line>The external system may reject enrollment of some classes.</line>
					<line>If this happens, student is not enrolled into the rejected classes in UniTime as well (appropriate error messages are displayed instead).</line>
				</line>
				<line>Automated qait-listing is disabled when such a custom interface is used.</line>
				<line>This change also includes an example implementation using the new Banner XE (RESTful) interface.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Course Timetabling</title>
		<item>
			<name>Instructor Preferences</name>
			<description>
				<line>Added ability to automatically inherit instructor preferences to externally managed classes.</line>
				<line>There is a new toggle (inherit instructor preferences) on a department which controls whether instructor preferences are to be inherited or not.</line>
				<line>Applicable room and building preferences, global room features and groups can now be inherited onto an externally managed class as well.</line>
				<line>If the externally managed department does not allow required time and/or room preferences, the instructor preferences are weakened accordingly.</line>
			</description>
		</item>
		<item>
			<name>Hierarchical Preference Inheritance</name>
			<description>
				<line>If there are two or more scheduling subparts in a parent-child relation with the same instructional type (e.g., Lec - Lec a - Lec b stacked underneath), inherit preferences and the date pattern from the parent subpart whenever possible.</line>
				<line>This behavior can be enabled by setting application property unitime.preferences.hierarchicalInheritance to true.</line>
			</description>
		</item>
		<item>
			<name>Instructor Unavailability</name>
			<description>
				<line>Instructor unavailabilty can include special and course-related events that are approved.
					<line>These are events for which the instructor is the main contact or he/she is present in the additional contacts of the event.</line>
					<line>This feature can be enabled by setting the application property unitime.events.instructorUnavailability to true (default is false).</line>
				</line>
				<line>If enabled, the unavailabilities will also show:
					<line>in the Timetable Grid (in the same way as blocking events are displayed for rooms now)</line>
					<line>on the Instructor Detail page (there is a new section called Instructor Unavailability, only visible when there is at least one such blocking event for the instructor).</line>
				</line>
				<line>The RoomAvailabilityInterface has been extended to provide instructor availability, the default room availability service has been extended to provide instructor availability from the events as described above.</line>
			</description>
		</item>
		<item>
			<name>Course Credit</name>
			<description>
				<line>Course credit moved from instructional offering to course offering.
					<line>That is, each course of a cross-list can have a different credit information.</line>
					<line>This allows for variable credit courses where a student can pick the proper number of credits by selecting the appropriate course offering in the cross-list.</line>
				</line>
				<line>Course credit information is now also visible in the Course Finder dialog of the Student Scheduling Assistant page.</line>
			</description>
		</item>
	</category>
	<category>
		<title>Other Changes</title>
		<item>
			<name>Event Management: No Room Check</name>
			<description>
				<line>Rooms that have the Ignore Room Check toggle enabled can be overbooked.
					<line>To easily identify such a room, there is a No Room Check note in the room's tooltip and the room name is in italic in the Meetings table on the Add / Edit Event pages.</line>
				</line>
				<line>Meetings that are in a room with no room check never show any conflicts and such meetings also never show among conflicting events.</line>
			</description>
		</item>
		<item>
			<name>Rooms</name>
			<description>
				<line>Added ability to provide room pictures.</line>
				<line>Pictures (of a room) can be updated for
					<line>the current academic session only,</line>
					<line>the current academic session and all future academic sessions, or</line>
					<line>all academic sessions.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Application Properties</name>
			<description>
				<line>All (or most of) application properties are now registered and used through the ApplicationProperty enum.
					<line>This allows for an easy place to see all configuration properties, define their default values and short descriptions.</line>
				</line>
				<line>Application Configuration page was modified to include all registered properties, including their defaults and descriptions.</line>
			</description>
		</item>
		<item>
			<name>Data Exchange</name>
			<description>
				<line>Added export of student course requests.</line>
				<line>Student Class Enrollment Import: update student course requests to match student class enrollments.</line>
				<line>Room Sharing: added ability to export and import room sharing.</line>
				<line>Student Import, Student Class Enrollments Import: added incremental mode
					<line>When not in incremental mode, students (student class enrollments) that are not included in the XML are deleted (this is the default).</line>
					<line>When in incremental mode, students that are not included in the file are completely ignored.</line>
				</line>
				<line>Student Course Requests Import
					<line>Added ability to cancel a student through the import (cancelStudent element).</line>
					<line>Added ability to include class enrollments with the course requests.</line>
					<line>Added enrollment mode (attribute enrollment on the root element) with the following values:
						<line>update: enrollments are updated to point to new course requests, orphaned enrollments (enrollments without course requests) are deleted (this is the default)</line>
						<line>nochange: all enrollments are kept (previously, this was achieved by keepEnrollments='true')</line>
						<line>import: import enrollments from the file (default when there are class elements in the file)</line>
						<line>delete: all class enrollments (of the related students) are deleted</line>
					</line>
				</line>
			</description>
		</item>
		<item>
			<name>CAS Authentication</name>
			<description>
				<line>Added provisions for CAS-based authentication.</line>
				<line>To enable CAS, uncomment the CAS Authentication sections in securityContext.xml and web.xml (see the comments there).</line>
			</description>
		</item>
		<item>
			<name>Localization</name>
			<description>
				<line>Added en_UK locale: it is much like the default, except of time (24-hour format) and date (day before moth) formatting.</line>
				<line>Course Timetabling: Added ability to display assigned times in either 12-hour or 24-hour time format (based on the locale).</line>
			</description>
		</item>
	</category>
	<category>
		<title>Constraint Solver</title>
		<item>
			<name>Course Timetabling: Deterministic Student Sectioning Customization</name>
			<description>
				<line>This custom sectioning assign students to groups in a deterministic way.
					<line>Students are ordered by their academic information (curriculum) and unique ids and assigned in this order to the first available group (configuration or lecture).</line>
				</line>
				<line>To enable this customization set the following parameter:
					<line>StudentSectioning.Class=org.cpsolver.coursett.custom.DeterministicStudentSectioning</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Group Constraint</name>
			<description>
				<line>Forward checking extended to all hard group constraints (not only meet-together).</line>
				<line>It is possible to avoid forward check on variables with large domains (parameter ForwardCheck.MaxDomainSize, defaults to 1000) and to limit the depth (parameter ForwardCheck.MaxDepth, defaults to 2).</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: MaxBreaks constraint</name>
			<description>
				<line>MaxBreaks constraint limits the number of blocks of non back-to-back classes of an instructor on a day.</line>
				<line>It has two parameters: a maximal number of breaks and a minimal length of a break between two classes not to be considered in the same block.
					<line>For example, reference _MaxBreaks:1:30_ translates to a maximum number of one break (two blocks) on a day of classes not more than 30 minutes a part.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Class Weights</name>
			<description>
				<line>Added an ability to provide each class with a weight.
					<line>This weight is used in the time and room preferences (the preference is weighted by the "importance" of the class).</line>
				</line>
				<line>For instance, this can be used for classes that are only offered once in a semester to have a lower weight.
					<line>So that there is an incentive to put a class that is taught every week in a preferred time even if it bumps two classes (that only meet once) from their preferred times.</line>
				</line>
				<line>This also allows for things like giving compulsory or elective courses more weight over optional courses in the curriculum timetabling, if ever needed.</line>
				<line>This feature can be enabled by the solver parameter Class Weights, two implementations are now available:
					<line>Default Class Weights (default): all class weights are 1.0 (so, all works as before).</line>
					<line>Average Hours A Week Class Weights: a weight of a class is estimated by the average number of hours it takes during the academic session.</line>
				</line>
			</description>
		</item>
		<item>
			<name>IFS: Neighborhood Search Algorithms</name>
			<description>
				<line>Added a general versions of Hill Climber, Great Deluge, and Simulated Annealing to the solver, with three problem independent neighboorhoods:
					<line>Random move just picks a random unconflicting value to a variable.</line>
					<line>Random swap tries to resolve all possible conflicts (unlike with suggestions there is no limit on depth, however, no new conflict can be created by resolving an existing one).</line>
					<line>Suggestion move: a variable is selected randomly, a limited depth backtracking is used to find a possible change.
						<line>Unlike in NeighbourSelectionWithSuggestions, the very first found suggestion is returned.</line>
					</line>
				</line>
				<line>Added a "simple search" algorithm that combines the ifs, hill climber, and great deluge or simulated annealing in a similar way as the examination solver (or the ITC competition solver) does.</line>
				<line>This algorithm is enabled by setting the Search Algorithm solver parameter to Experimental.</line>
			</description>
		</item>
		<item>
			<name>Student Scheduling: Required Reservation Constraint</name>
			<description>
				<line>This global constraint ensures that reservations that must be used are used.
					<line>That is, an enrollment is conflicting when there is a reservation for the student that must be used, but the given enrollment does not use it.</line>
				</line>
				<line>While the domain of the course request already does not allow for such enrollments, such an enrollment can be loaded in from the database or XML.
					<line>This constraint is to prevent assignment of such invalid enrollments.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Room Ratio</name>
			<description>
				<line>Changed the computation of minimal room size to round(room ratio x class limit), instead of the previous ceil(room ratio x class limit).</line>
				<line>While using ceiling instead of round has some merit, this fixes the ongoing issues with the computation.
					<line>E.g., minimal room size of a class with limit 25 and room ratio 0.6 was 16 (as 0.6f * 25 = 15.000001 in Java) instead of the expected 15.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: MaxWeeks constraint</name>
			<description>
				<line>The MaxWeeks constraint limits the number of weeks during which the given set of classes are taught.</line>
				<line>It has two parameters: a maximal number of weeks during which the given set of classes can be placed and a day code indicating what days of week are considered.</line>
				<line>Reference _MaxWeeks:3:48_ translates to a maximum number of 3 weeks, but only for classes that are placed on Fridays and Saturdays
					<line>(64 for Monday, 32 for Tuesday, 16 for Wednesday, 8 for Thursday, 4 for Friday, 2 for Saturday, and 1 for Sunday)</line>
					<line>If the second parameter is zero, all days of week are considered.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Classes with multiple rooms</name>
			<description>
				<line>For each time, limit the number of room combinations (parameter General.MaxRoomCombinations, defaults to 100).
					<line>Domain is dynamic (not cached) in this case, preferring rooms that are available for the given time (for which the room combinations are generated).</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Max N Hours A Day constraint</name>
			<description>
				<line>Added ability to consider date patterns (individual weeks).
					<line>When solver parameter MaxNHoursADay.ConsiderDatePatterns is set to true (this is also the new default).</line>
					<line>For former behavior, set MaxNHoursADay.ConsiderDatePatterns to false.</line>
				</line>
			</description>
		</item>
		<item>
			<name>Course Timetabling: Distribution Preferences</name>
			<description>
				<line>Added structure One of Each
					<line>The distribution constraint is created for each combination of classes such that one class is taken from each line representing a class or a scheduling subpart</line>
					<line>For instance, if the constraint is put between three scheduling subparts, a constraint will be posted between  each combination of three classes, each from one of the three subparts.</line>
					<line>If a constraint is put between a class and a scheduling subpart, there will be a binary constraint posted between the class and each of the classes of the scheduling subpart.</line>
				</line>
			</description>
		</item>
	</category>
</release>
</release-history>