@startuml BookMeIn2

/'
Glossary

Event: The event that is happening, e.g. App Development in a mobile world.
Delegates: People attending the event, sometimes on behalf of a company.
Exhibitor: A person attending the event on behalf of their company. Each Exhibitor works at one stand.
Moderator: Works in the background during a session filtering the questions sent in by delegates, for the purpose of avoiding anything unsuitable being sent to the speaker, and amalgamating similar questions into one so as to avoid repeating the same question
Session: A talk or presentation happening at the event. Several of these can happen at the same time at larger events and delegates would have to choose which ones they want to attend.  Sometimes these can require a pre-registration of interest to allow entry.
Speaker: An individual presenting the session. These can be the same as exhibitors, or they may be completely independent.
Stand: One per company at the event. These companies are ones that have paid to have a stand at the event.  Often these will be sponsors of the event looking to sell some sort of software or service to the delegates.   Multiple Exhibitors may work on one stand though.
'/

' Entities

class "Event" as event {
    - id: string
    + name: string
    + description: string
    + startdate: date
    + enddate: date
    + location: string
    + maxdelegates: int
}

class "Person" as person {
    - id: string
    + name: string
    + email: string
}

class "Delegate" as delegate {
    - id: string
    + name: string
    + email: string
    + company: string
    + jobtitle: string
}

class "Exhibitor" as exhibitor {
    - id: string
    + name: string
    + email: string
    + company: string
}

class "Moderator" as moderator {
    - id: string
    + name: string
    + email: string
}

class "Session" as session {
    - id: string
    + name: string
    + description: string
    + startdate: date
    + enddate: date
    + maxdelegates: int
    + location: string
}

class "Speaker" as speaker {
    - id: string
    + name: string
}

class "Stand" as stand {
    - id: string
    + name: string
    + description: string
    + location: string
}

class "Company" as company {
    - id: string
    + name: string
    + description: string
    + website: string
}

class "SessionRegistration" as sessionregistration {
    - id: string
    - sessionid: string
    - delegateid: string
}

class "StandInteraction" as standinteraction {
    - id: string
    - standid: string
    - delegateid: string
    + notes: string
}

class "SessionInteraction" as sessioninteraction {
    - id: string
    - sessionid: string
    - delegateid: string
    + question: string
}

class "ModerationResult" as moderationresult {
    - id: string
    - moderatorid: string
    - sessioninteractionid: string
    + action: string
    + comment: string
}

' Relationships

event "1" -- "many" delegate
event "1" -- "many" moderator
event "1" -- "many" company

delegate "1" -- "many" standinteraction : interacts with
delegate "1" -- "many" sessioninteraction : asks
delegate "1" -- "many" sessionregistration : registers

exhibitor "1" -- "1" stand : works

company "1" -- "many" exhibitor : employs

moderator "1" -- "many" moderationresult 


' Inheritance

person <|-- delegate : inherits from
person <|-- exhibitor : inherits from
person <|-- moderator : inherits from
person <|-- speaker : inherits from

' Composition

event "1" *-- "many" session
event "1" *-- "many" stand

' Aggregation

session "1" *-- "many" sessioninteraction
session "1" *-- "many" sessionregistration
stand "1" *-- "many" standinteraction
sessioninteraction "1" *-- "1" moderationresult

' Notes

note left of moderationresult : A moderation result is the outcome of a moderator\n reviewing a session interaction.  It has an action\n (approve, reject, edit), and a comment.
note left of standinteraction : A stand interaction is a record of a delegate\n visiting a stand and making notes about it.
note right of sessioninteraction : A session interaction is a record of a delegate\n asking a question during a session.

@enduml