Exam
  course CourseId
  name ExamName
  gradingRule ExamGradingRule Maybe
  bonusRule ExamBonusRule Maybe
  occurrenceRule ExamOccurrenceRule
  examOccurrenceMapping (ExamOccurrenceMapping ExamOccurrenceName) Maybe
  visibleFrom UTCTime Maybe
  registerFrom UTCTime Maybe
  registerTo UTCTime Maybe
  deregisterUntil UTCTime Maybe
  publishOccurrenceAssignments UTCTime Maybe
  start UTCTime Maybe
  end UTCTime Maybe
  finished UTCTime Maybe -- Grades shown to students, `ExamCorrector`s locked out
  closed UTCTime Maybe -- Prüfungsamt hat Einsicht (notification)
  publicStatistics Bool
  gradingMode ExamGradingMode
  description Html Maybe
  examMode ExamMode
  staff Text Maybe
  UniqueExam course name
ExamPart
  exam ExamId
  number ExamPartNumber
  name ExamPartName Maybe
  maxPoints Points Maybe
  weight Rational
  UniqueExamPartNumber exam number
  UniqueExamPartName exam name !force
ExamOccurrence
  exam ExamId
  name ExamOccurrenceName
  room ExamOccurrenceRoom
  capacity Natural
  start UTCTime
  end UTCTime Maybe
  description Html Maybe
  UniqueExamOccurrence exam name
ExamRegistration
  exam ExamId
  user UserId
  occurrence ExamOccurrenceId Maybe
  time UTCTime default=now()
  UniqueExamRegistration exam user
ExamPartResult
  examPart ExamPartId
  user UserId
  result ExamResultPoints
  lastChanged UTCTime default=now()
  UniqueExamPartResult examPart user
ExamBonus
  exam ExamId
  user UserId
  bonus Points
  lastChanged UTCTime default=now()
  UniqueExamBonus exam user
ExamResult
  exam ExamId
  user UserId
  result ExamResultPassedGrade
  lastChanged UTCTime default=now()
  UniqueExamResult exam user
ExamCorrector
  exam ExamId
  user UserId
  UniqueExamCorrector exam user
ExamPartCorrector
  part ExamPartId
  corrector ExamCorrectorId
  UniqueExamPartCorrector part corrector
ExamOfficeSchool
  school SchoolId
  exam ExamId
  UniqueExamOfficeSchool exam school
