@startuml
skinparam packageStyle file
skinparam linetype ortho

package Person {

abstract Person {
  +name
}

abstract Employee extends Person {
  +ssn
  +email
}

class Tap extends Employee

class Vip extends Employee

class Dean extends Vip

class ResearchAssociate extends Vip {
  +field
}

class Supervisor extends ResearchAssociate

class Lecturer extends ResearchAssociate

class Student extends Person

}

package Org {

abstract Org {
  +name
}

interface Place {
  +address
}

class University implements Place
class University extends Org

class Faculty extends Org
Faculty --* University
Faculty "1" *- Person.Dean

class Institute implements Place
class Institute extends Org
Institute --* Faculty
Institute *- Person.ResearchAssociate

}

package Activity {

abstract Activity {
  +name
}

abstract Project extends Activity {
+ dateBegin
+ dateEnd
+ hours[]
}
Project *- Person.ResearchAssociate
(Project, Person.ResearchAssociate) .. Hours

class Hours {
+ person
+ hours
}

class Course extends Project {
+ id
+ lecturer
+ ects
}
Course *-- Person.Lecturer

class StudentProject extends Project {
+ supervisor
+ ects
}
StudentProject *-- Person.Supervisor

class Programme {
+ student
+ activity[]
+ addActivity()
+ valid()
}
Programme *- Course
Programme *- StudentProject
Programme "1" *-- Person.Student

}

package Bachelorizer {

class Bachelorizer {
+ programme[]
+ addProgramme(student,activity...)
}

Activity.Programme --* Bachelorizer

}

@enduml