@startuml

package Buildings{
    entity Building <<AggregateRoot>> {}
    class BuildingCode <<ValueObject>><<Identity>> {
        code
    }
    class BuildingName <<ValueObject>> {
        name
    }
    class BuildingSize <<ValueObject>> {
        xSize
        ySize
    }
    class BuildingDescription <<ValueObject>> {
        description
    }
}

package Elevators{
    entity Elevator <<AggregateRoot>> {
        num
    }
    class ElevatorId <<ValueObject>><<Identity>> {
        id
    }
    class ElevatorBrand <<ValueObject>> {
        brand
    }
    class ElevatorModel <<ValueObject>> {
        model
    }
    class ElevatorSerialNumber <<ValueObject>> {
        serialNum
    }
    class ElevatorDescription <<ValueObject>> {
      description
    }
}

package Passages{
    entity Passage <<AggregateRoot>> {}
    class PassageId <<ValueObject>> {
        id
    }
}

package Floors{
    entity Floor <<AggregateRoot>> {}
    class FloorNum <<ValueObject>> {
        num
    }
    class FloorId <<ValueObject>><<Identity>> {
        id
    }
    class FloorDescription <<ValueObject>> {
        description
    }
    class JsonMap <<ValueObject>> {
      json
    }
}

package Rooms{
    entity Room <<AggregateRoot>> {}
    class RoomCode <<ValueObject>><<Identity>> {
        code
    }
    class RoomCategory <<ValueObject>> {
        category
    }
    class RoomDescription <<ValueObject>> {
        description
    }
}

package Tasks {
    entity Task <<AggregateRoot>> {}
    class TaskId <<ValueObject>> {
        id
    }
    class TaskState <<ValueObject>> {
        state
    }
}

package TaskTypes {
    interface TaskType <<AggregateRoot>> {}
    class TaskTypeId <<ValueObject>> {
        id
    }
}
package SurveillanceTasks {
    entity Surveillance <<AggregateRoot>>{}
}

package PickupDelieveryTasks {
    entity PickupDelivery <<AggregateRoot>>{}
    class PickupDeliveryDescription <<ValueObject>> {
        description
    }
    class ConfirmationCode <<ValueObject>> {
        code
    }
}

package Users{
    entity User <<AggregateRoot>> {}
    class Email <<ValueObject>> {
        email
    }
    class UserId <<ValueObject>><<Identity>> {
        id
    }
    class Password <<ValueObject>> {
        password
    }
}

package Roles {
    entity Role <<AggregateRoot>> {
        name
    }
    class RoleId <<ValueObject>><<Identity>> {
        id
    }
}

package Robots{
    entity Robot <<AggregateRoot>> {
      active
    }
    class RobotNickname <<ValueObject>><<Identity>> {
        name
    }
    class RobotSerialNum <<ValueObject>> {
        num
    }
        class RobotDescription <<ValueObject>> {
        description
    }
}

package RobotTypes {
    entity RobotType <<AggregateRoot>> {
    }
    class RobotBrand <<ValueObject>> {
        brand
    }
    class RobotModel <<ValueObject>> {
        model
    }
}

package CommonValueObjects {
    class PhoneNumber <<ValueObject>> {
        num
    }
    class Name <<ValueObject>> {
        name
    }
    class Description <<ValueObject>> {
        description
    }
}

Floor "n" -up-> "1" Building #text:red : belongs to
Floor --> FloorNum
Floor --> FloorId
Floor --> FloorDescription
Floor --> JsonMap
Building -up-> BuildingCode
Building -up-> BuildingName
Building -up-> BuildingDescription
Building -up-> BuildingSize
Elevator --> ElevatorId
Elevator "1" -up-> "1" Building #text:red : belongs to
Elevator "1" --> "n" Floor #text:red : serves
Passage --> PassageId
Passage "1" -up-> "2" Floor #text:red : connects two floors
Room "n" --> "1" Floor #text:red : belong to
Room --> RoomCode
Room --> RoomCategory
Room --> RoomDescription
Robot -up-> RobotNickname
Robot -up-> RobotSerialNum
Robot -up-> RobotDescription
Robot "1" --> "1" RobotType #text:red : of a
RobotType --> Name
RobotType --> RobotBrand
RobotType --> RobotModel
User --> Email
User --> Password
User --> UserId
User "1" ----> "1" Role #text:red : has a
Role --> RoleId
PickupDelivery -up-> ConfirmationCode
PickupDelivery -up-> PickupDeliveryDescription
PickupDelivery ---> PhoneNumber #text:red : pickup number
PickupDelivery ---> Name #text:red : pickup name
PickupDelivery ---> PhoneNumber #text:red : delivery number
PickupDelivery ---> Name #text:red : delivery name
PickupDelivery "1" ---> "1" Room #text:red : pickup room
PickupDelivery "1" ---> "1" Room #text:red : delivery room
Surveillance -up-> PhoneNumber
Surveillance "1" --> "n" Floor #text:red : surveil
note bottom of Description : This class will be used for simple descriptions\nbut to make the diagram easier to understand\nthis will not be connected to the respective classes
ConfirmationCode -[hidden]> Room
Elevator --> ElevatorBrand
Elevator --> ElevatorSerialNumber
Elevator --> ElevatorModel
Elevator --> ElevatorDescription
PickupDelivery .up.|> TaskType #text:red : implements
Surveillance .up.|> TaskType #text:red : implements
TaskType --> TaskTypeId
Task -up-> TaskId
Task -up-> TaskState
Task "1" --> "1" TaskType #text:red : of a
Task "1" --> "1" User #text:red : requested by
Task "1" --> "1" Robot #text:red : executed by
Robot "1" -up-> "n" TaskType #text:red : can execute

@enduml





