1 /* 2 * Copyright 2010 The Kuali Foundation 3 * 4 * Licensed under the Educational Community License, Version 2.0 (the 5 * "License"); you may not use this file except in compliance with the 6 * License. You may obtain a copy of the License at 7 * 8 * http://www.osedu.org/licenses/ECL-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 13 * implied. See the License for the specific language governing 14 * permissions and limitations under the License. 15 */ 16 17 package org.kuali.student.enrollment.courseoffering.infc; 18 19 import org.kuali.student.r2.common.infc.IdNamelessEntity; 20 import org.kuali.student.r2.common.infc.RichText; 21 22 import java.util.List; 23 24 /** 25 * @author Kamal 26 */ 27 28 public interface CourseOffering 29 extends IdNamelessEntity { 30 31 /** 32 * A unique identifier assigned to all approved courses that exist 33 * in the catalog This is not updatable once initialized. 34 * 35 * @name Course Id 36 * @readOnly 37 * @required 38 * @impl this maps the the version dependent id as the offering 39 * must point to one and only one version of the 40 * course. Maps to cluId in Lui. 41 */ 42 public String getCourseId(); 43 44 /** 45 * Academic term of course offering 46 * 47 * @name Term Id 48 * @readOnly on updates 49 * @required 50 * @impl set during the #createCourseOffering and then maps to 51 * the aptKey on the Lui 52 */ 53 public String getTermId(); 54 55 /** 56 * Custom Description for the course Offering. 57 * 58 * @name Course Offering Description 59 */ 60 public RichText getDescr(); 61 62 /** 63 * Identifies the number of a course as reflected in the course 64 * catalog. This typically must be unique across all courses 65 * offered during that term. If the user wants to create two 66 * separate offerings for the same course they must modify this 67 * code to make it unique. For example: An on-line offering of the 68 * course might have an "O" appended to it to distinguish it from 69 * the face to face offering, i.e. ENG101 and ENG101O Initially 70 * copied from the course catalog but then, depending on the 71 * configuration it may be updatable. Often this field is 72 * configured so that it is not not directly updatable but rather 73 * is calculated from it's two constituent parts, the subject area 74 * and the course number suffix. For example: Subject Area = "ENG" 75 * and Suffix = "101" then code = "ENG101" 76 * 77 * This field is differentiated from the Couurse Offering Code in 78 * that the Course Offering Code can updated while the Course Code 79 * always indicates the official canonical code. 80 * 81 * @name Course Code 82 * @readOnly 83 * @impl this is a read only copy of the official canonical course code 84 */ 85 public String getCourseCode(); 86 87 /** 88 * Identifies the number of a course as reflected in the course 89 * catalog. This typically must be unique across all courses 90 * offered during that term. If the user wants to create two 91 * separate offerings for the same course they must modify this 92 * code to make it unique. For example: An on-line offering of the 93 * course might have an "O" appended to it to distinguish it from 94 * the face to face offering, i.e. ENG101 and ENG101O Initially 95 * copied from the course catalog but then, depending on the 96 * configuration it may be updatable. Often this field is 97 * configured so that it is not not directly updatable but rather 98 * is calculated from it's two constituent parts, the subject area 99 * and the course number suffix. For example: Subject Area = "ENG" 100 * and Suffix = "101" then code = "ENG101" 101 * 102 * @name Course Offering Code 103 * @impl initialially this is copied from the course catalog code but then 104 * is subsequently stored in the lui as lui.officialIdentifier.code 105 */ 106 public String getCourseOfferingCode(); 107 108 /** 109 * Identifies the department and/subject code of the course as 110 * reflected in the course catalog. Initially copied from the 111 * course catalog but then, depending on the configuration it may 112 * be updatable. In most configurations this should not be 113 * updatable. Often used in the calculation of the courseCode 114 * 115 * @name Subject Area 116 * @impl initially copied from the canonical course but then stored in the 117 * Lui as lui.officialIdentifier.division 118 */ 119 public String getSubjectArea(); 120 121 /** 122 * A suffix of the course number as reflected in the college 123 * catalog. This is the "number" portion of the course 124 * code. Initially copied from the course catalog but then, 125 * depending on the configuration it may be updatable. This field 126 * is often configured to be updatable but the updates typically 127 * simply append something like an "O" for on-line to it to 128 * differentiate multiple course offerings for the same 129 * course. Often used in the calculation of the courseCode. 130 * 131 * @name Course Number Suffix 132 * @impl initially copied from the canonical course but then stored in the 133 * Lui as lui.officialIdentifier.suffixCode 134 */ 135 public String getCourseNumberSuffix(); 136 137 /** 138 * Name of the course used in the college catalog. Initially 139 * copied from the course catalog but then, depending on the 140 * configuration it may be updatable. For regular courses this is 141 * not generally allowed to be updated on the offering, but for 142 * special topics courses this is often overridden to capture the 143 * particular topic being taught offered this term. Note: the 144 * configuration of the validation for titles is typically 145 * restricted to exclude line breaks. This may have to be loosened 146 * as some schools may want the particular topic to appear on a 147 * 2nd line. For example: SPECIAL TOPICS: AN EXPLORATION OF DEEP 148 * SPACE ARTIFACTS l 149 * 150 * @name Course Title 151 * @impl initially copied from the canonical course but then stored in the 152 * Lui as lui.officialIdentifier.longName 153 */ 154 public String getCourseOfferingTitle(); 155 156 /** 157 * Indicates that the entire course offering is an Honors Course 158 * ??? Is this an enrollment restriction rule or a flag or both? 159 * 160 * @name Is Honors Offering 161 * @impl store in a generic lui luCodes type of field? 162 */ 163 public Boolean getIsHonorsOffering(); 164 165 /** 166 * Total maximum number of "seats" or enrollment slots that can be 167 * filled for the offering. Calculated based on sum of all the 168 * maximum seats of primary activity type offerings. 169 * 170 * @name Maximum Enrollment 171 * @readOnly 172 * @impl maps to Lui.maximumEnrollment 173 */ 174 public Integer getMaximumEnrollment(); 175 176 /** 177 * Total minimum number of seats that must be filled for the 178 * offering not to be canceled. Calculated based on sum of all the 179 * minimum seats of primary activity type offerings 180 * 181 * @name Minimum Enrollment 182 * @impl maps to Lui.minimumEnrollment 183 */ 184 public Integer getMinimumEnrollment(); 185 186 /** 187 * The cross listings which this CourseOffering can be offered under. 188 */ 189 public List<? extends CourseOfferingCrossListing> getCrossListings(); 190 191 192 /******** Assessment Information ***************/ 193 194 /** 195 * The options/scales that indicate the allowable grades within a 196 * grading scheme that can be awarded. Typically, the values here 197 * are constrained by the values on the canonical course. If the 198 * value is set here then the Clu must have a grading option set 199 * on the canonical activity. For example: an id might point to 200 * Pass/Fail or Letter Graded option. 201 * 202 * @name: Grading Option Id 203 * @impl Lui.resultOptionIds of type ??? 204 */ 205 public String getGradingOptionId(); 206 207 /** 208 * The options/scales that indicate the allowable grades within a 209 * grading scheme in which an eligible student can register. This 210 * list of options includes the Grading Option Id plus any 211 * additional grading schemes, such as P/F or Audit. 212 * 213 * @name: registration Grading Option Ids 214 * @impl Lui.resultOptionIds of type ??? 215 */ 216 public List<String> getStudentRegistrationGradingOptions(); 217 218 /** 219 * The name of the credit option 220 * 221 * @name Credit Option Name 222 * @readOnly 223 * @impl the name of the RVG for the creditOptionId 224 */ 225 public String getCreditOptionName(); 226 227 /** 228 * Type of credit of course offering. This field is initially 229 * copied from the canonical course but then, depending on 230 * configuration, it may be updated. TODO: figure out which of the 231 * credit options will be copied down because the canonical has 232 * more than one! Often it is just a fixed single value but a 233 * ResultValuesGroup could contain a range (with increments) or 234 * even a discrete list of possible credit values. 235 * 236 * @name Credit Option Id 237 * @impl Lui.resultOptionIds returns a list of 238 * resultOptions. Filter option with credit type and that 239 * should give the resultValueGroup. 240 */ 241 public String getCreditOptionId(); 242 243 244 /******** Personnel Information *****************/ 245 246 /** 247 * Instructors for this course offering TODO: find out if the 248 * canonical instructors should be copied down 249 * 250 * @name Instructors 251 * @impl These are derived from Lui Person relations with instructor type 252 */ 253 public List<? extends OfferingInstructor> getInstructors(); 254 255 /********* Organization Information **************/ 256 257 /** 258 * Organization(s) that is responsible for administering the 259 * course delivery - and all associated logistics - of the course 260 * Initially copied from the canonical course then, depending on 261 * the configuration, updated This is typically an academic 262 * department but could be for example the extended studies office 263 * that is responsible for delivering the course even though it's 264 * content is managed by an academic department. 265 * 266 * @name Units Deployment 267 * @impl initalized from canonical course units deployment but then stored 268 * in lui.unitsDeployment 269 */ 270 public List<String> getUnitsDeploymentOrgIds(); 271 272 /** 273 * Organization(s) that is responsible for the academic content of 274 * the course as approved in its canonical form. This is the 275 * organization that has oversight of the curriculum. This is 276 * typically an academic department. 277 * 278 * @name Units Content Owner 279 * @readOnly on updates 280 * @impl this is never updatable so it should just be grabbed from 281 * the canonical course and then stored in 282 * lui.unitsContentOwner 283 */ 284 public List<String> getUnitsContentOwnerOrgIds(); 285 286 287 288 /*********** Waitlist *****************************/ 289 290 /* 291 * TODO: Skip this section for core slice development 292 * If keeping, These should be moved into FormatOffering and 293 * removed from CourseOffering. 294 */ 295 296 /** 297 * Indicates whether a RegistrationGroup has a waitlist TODO: 298 * figure out how to store this TODO: make sure we are consistent 299 * on how we spell Waitlist, should be spelled Waitlist, or Wait 300 * List or Wait-List (as the merriam-webster has it) 301 * 302 * @name Has Waitlist 303 * @impl not sure how to store this, it depends on how we end up 304 * implementing waitlists. 305 * @deprecated Use the CourseWaitList service instead. 306 */ 307 @Deprecated 308 public Boolean getHasWaitlist(); 309 310 /** 311 * Indicates the type of waitlist as it relates to processing 312 * students on and off The three types predefined in kuali are 313 * Automatic, Semi-Automatic and Manual TODO: Right not Waitlist 314 * types are not tied to any Waitlist object so we need to define 315 * an "other key" to get the list of valid values from the type 316 * service. TODO: Decide if we need a separate getHasWaitList, 317 * perhaps no value in this field means no waitlist. TODO: Cross 318 * validate with hasWaitlist 319 * 320 * @name Waitlist Type Key 321 * @impl TODO: decide if this this should be stored on the Lui or on a 322 * waitlist object? 323 * @deprecated Use the CourseWaitList service instead. 324 */ 325 @Deprecated 326 public String getWaitlistTypeKey(); 327 328 /** 329 * Indicates the waitlist level, i.e., CourseOffering or 330 * ActivityOffering. Values are in WaitListLevel enum. 331 * 332 * @name Waitlist Level Type Key 333 * @deprecated Use the CourseWaitList service instead. 334 */ 335 @Deprecated 336 public String getWaitlistLevelTypeKey(); 337 338 /** 339 * Maximum number of students to be allowed on the wait list. 340 * 341 * @name Waitlist Maximum 342 * @impl maps to Lui.waitlistMaximum 343 * @deprecated Use the CourseWaitList service instead. 344 */ 345 @Deprecated 346 public Integer getWaitlistMaximum(); 347 348 349 /************* Finances ***************************/ 350 351 /** 352 * The primary source of funding for the offering. 353 * 354 * @name Funding Source 355 * @impl fyi "funding source" is an enumeration values are state support, 356 * self-support, contract funding 357 */ 358 public String getFundingSource(); 359 360 /** 361 * Flag indicating whether a course is eligible for Financial 362 * Aid. Derived from course catalog (canonical) TODO: find a place 363 * to store this on the canonical course because it does not 364 * currently exist there TODO: Decide if this is really a rule or 365 * a CluSet or what? 366 * 367 * @name Is Financial Aid Eligible 368 * @impl TODO: decide where to store 369 */ 370 public Boolean getIsFinancialAidEligible(); 371 372 /** 373 * Places where this Course offering is offered. 374 * 375 * @name Campus Locations 376 */ 377 public List<String> getCampusLocations(); 378 379 /** 380 * Indicates whether a final exam is to be given for this format 381 * Offering and if its true, the level at which it exists 382 * Indicates the type of final exam ('STANDARD', 'ALTERNATE', 383 * 'NONE') to be given for this format Offering, if any 384 * 385 * @name Final ExamOffering Type 386 */ 387 public String getFinalExamType(); 388 389 /** 390 * Indicates whether the fee is at activity offering level or 391 * course offering level. If true its at Activity Offering level, 392 * if false its at CourseOffering level. 393 * 394 * @name Is Fee at Activity Offering 395 */ 396 public Boolean getIsFeeAtActivityOffering(); 397 398 /** 399 * Indicates whether the course offering has an evaluation. 400 * 401 * @name Is Evaluated 402 */ 403 public Boolean getIsEvaluated(); 404 405 /** 406 * Gets the Course Offering URL. 407 * 408 * @name Course Offering URL 409 */ 410 public String getCourseOfferingURL(); 411 412 /** 413 * Gets the Credit Count 414 * 415 * @name Credit Count 416 * @readOnly 417 * @impl this is the number of credits 418 */ 419 public String getCreditCnt(); 420 421 /** 422 * Gets the Grading Option Name 423 * 424 * @name Grading Option Name 425 * @readOnly 426 * @impl this is the name of the RVG matching the gradingOptionId 427 */ 428 public String getGradingOptionName(); 429 430 /** 431 * A suffix is the system generated code that is hidden from the 432 * user that parallels with courseOfferingNumberSuffix. 433 * 434 * @name Course Number Internal Suffix 435 * @impl initially copied from the canonical course but then 436 * stored in the Lui as lui.officialIdentifier.suffixCode 437 */ 438 public String getCourseNumberInternalSuffix(); 439 }