@startuml
package "<Aggregate> System User" #aabbcc{
    entity SystemUser <<root>> {}
    class Name <<(V,#B8255F)value object>>
    class Password <<(V,#B8255F)value object>>
    class Email <<(V,#B8255F)value object>>

    SystemUser "1" --> "1" Name : has
    SystemUser "1" --> "1" Password : has
    SystemUser "1" --> "1" Email : has
}

package "<Aggregate> User" #bbddcc{
    entity User <<root>> {}
}

package "<Aggregate> Admin" #bbddff{
    entity Admin <<root>> {}
}

package "<Aggregate> Task Manager" #aacbca {
    entity TaskManager <<root>> {}
}

package "<Aggregate> Fleet Manager" #808080 {
    entity FleetManager <<root>> {}
}

package "<Aggregate> Campus Manager" #ffb380 {
    entity CampusManager <<root>> {}
}

package "<Aggregate> Building" #697774{
    entity Building <<root>> {}
    class BuildingName <<(V,#B8255F)value object>>
    class BuildingCode <<(V,#B8255F)value object>>
    class Description <<(V,#B8255F)value object>>
    class Dimension <<(V,#B8255F)value object>>

    Building "1" --> "1" BuildingName : has
    Building "1" --> "1" Description : has
    Building "1" --> "1" BuildingCode : has
    Building "1" --> "1" Dimension : has
}

package "<Aggregate> Floor" #99b3ff {
    entity Floor <<root>> {}
    entity Room
    entity Map
    class RoomCode <<(V,#B8255F)value object>>
    class Number <<(V,#B8255F)value object>>

    Room "1" --> "1" RoomCode: has
    Floor "1" --> "1" Number : has
}

package "<Aggregate> Passage" #ddbbcc {
    entity Passage <<root>> {}
}

package "<Aggregate> Robot" #eeeaaa {
    entity Robot <<root>> {}
    class State <<(V,#B8255F)value object>> {
        Available
        Busy
        Inhibited
    }
    class SerialNumber <<(V,#B8255F)value object>>
    class Nickname <<(V,#B8255F)value object>>
    class RobotCode <<(V,#B8255F)value object>>
    Robot "1" --> "1" State : has
    Robot "1" --> "1" SerialNumber : has
    Robot "1" --> "1" Nickname : has
    Robot "1" --> "1" RobotCode : has
}

package "<Aggregate> Task" #cccccc {
    entity Task <<root>> {}
    entity Surveillance
    entity ObjectDelivery
    class State <<(V,#B8255F)value object>> {
        Waiting
        InProgress
        Completed
    }
    class Path <<(V,#B8255F)value object>>
    class Contact <<(V,#B8255F)value object>>
    class DeliveryName <<(V,#B8255F)value object>>

    Task --|> Surveillance
    Task --|> ObjectDelivery
    Task "1" --> "1" State : has
    Surveillance "1" --> "1" Path : has
    Surveillance "1" --> "1" Contact : has
    ObjectDelivery "1" --> "1" DeliveryName : has
    ObjectDelivery "1" --> "1" Contact : has
}

package "<Aggregate> Elevator" #eeeeee {
  entity Elevator <<root>> {}

}

package "<Aggregate> RobotType" #ffddeb {
  entity RobotType <<root>> {}
  class Brand <<(V,#B8255F)value object>>
  class Model <<(V,#B8255F)value object>>

  RobotType "1" --> "1" Brand : is of
  RobotType "1" --> "1" Model : has
}

class Location <<(V,#B8255F)value object>> {
  X
  Y
  Direction
}

Passage "1" --> "1" Location : has
Elevator "1" --> "1" Location : has
Room "1" --> "1" Location : has

SystemUser --|> User
SystemUser --|> Admin
SystemUser --|> TaskManager
SystemUser --|> CampusManager
SystemUser --|> FleetManager


Admin "1" --> "*" TaskManager : manages
Admin "1" --> "*" CampusManager : manages
Admin "1" --> "*" FleetManager : manages


Building "1" --> "1..*" Floor : has
Building "1" --> "*" Elevator : has
Building "1" --> "*" Passage : has

Floor "1" --> "1" Map : has


Floor "1" --> "1..*" Room : has

TaskManager "1" --> "*" Task : manages


User "1" --> "*" Task : requests


FleetManager "1" --> "*" RobotType : configure

CampusManager "1" --> "*" Building : manages

ObjectDelivery "1" --> "1..*" RoomCode : has

RobotType --|> Robot

Robot "1" --> "*" Task : executes


@enduml