Gå till innehållet

Domänmodell

Salieri hanterar bokningar av rum och nödvändig tillhörande information. Några av de centrala begreppen och sakerna är exempelvis rum, bokning, användare, kontakt och facilitet. Följande bilder listar begrepp och dess relationer.

erDiagram
  BOOKING {
    int Id PK
    string Title
    string Contact
    DocumentLink[] DocumentLinks
  }
  DOCUMENTLINK {
    string Name
    string Url
  }
  BOOKINGSTATUS {
    int Id PK
    string Name
  }
  TIMEINFO {
    DateOnly StartDate
    DateOnly EndDate
    TimeOnly StartTime
    TimeOnly EndTime
    bool AllDay
  }
  RECURRINGINFO {
    int Interval
    Period Period
  }
  RECURRINGWEEKDAY {
    int Id PK
    int BookingId FK
    Weekday Weekday
  }
  ROOM {
    int Id PK
    string Identifier
    string Name
  }
  FACILITY {
    int Id PK
    string Name
  }
  ROOMTYPE {
    int Id PK
    string Name
  }
  CAPACITY {
    int MaxPersons
    double Area
  }
  FLOOR {
    int Id PK
    string Name
    int FloorNumber
  }
  BUILDING {
    int Id PK
    string Name
    string Address
    string Contact
  }
  LOCATION {
    int Id PK
    string Name
    string City
    string Region
  }
  APPUSER {
    string Id PK
    string Email
    string Name
    bool IsApproved
  }
  USERROLE {
    int Id PK
    string Name
    SystemRoleType[] SystemRoles
  }
  PERIOD {
    int Year
    int Month
    int Week
    int Day
  }
  WEEKDAY {
    int Monday
    int Tuesday
    int Wednesday
    int Thursday
    int Friday
    int Saturday
    int Sunday
  }
  SYSTEMROLETYPE {
    int User
    int UserManager
    int DataManager
    int SystemManager
    int ServiceUser
  }

  %% TimeInfo/RecurringInfo är ägda typer (kolumner i Bookings, inga egna nycklar).
  %% DocumentLinks lagras som JSON i Bookings.
  BOOKINGSTATUS ||--o{ BOOKING : "har"
  BOOKING ||--|| TIMEINFO : "har"
  TIMEINFO ||--o| RECURRINGINFO : "kan_ha"
  BOOKING ||--o{ RECURRINGWEEKDAY : "veckodagar"

  %% Many-to-many
  BOOKING }|--|{ ROOM : "bokar"
  ROOM }|--|{ ROOMTYPE : "typer"
  ROOM }|--|{ FACILITY : "faciliteter"
  ROOM }|--|{ USERROLE : "kan_bokas_av"
  BOOKING }|--|{ FACILITY : "oenskar"
  APPUSER }|--|{ USERROLE : "har"

  %% Hierarki (Location → Building → Floor → Room, Capacity 1:1 med Room)
  LOCATION ||--o{ BUILDING : "byggnader"
  BUILDING ||--o{ FLOOR : "vaaningar"
  FLOOR ||--o{ ROOM : "rum"
  ROOM ||--o| CAPACITY : "kapacitet"
classDiagram

    namespace Grunddata {
        class Building ["Byggnad"] {
            Namn
            Adress
            Kontakt
        }

        class Floor ["Våningsplan"] {
            Namn
            Våning
        }

        class Room ["Rum"] {
            Identitet
            Namn
        }

        class Capacity ["Kapacitet"] {
            Max antal personer
            Yta
        }

        class Location ["Plats"] {
            Ort
            Område
            Namn
        }

        class RoomType ["Rumstyp"] {
            <<konfigurerbar>>
            Namn
        }

        class Facility ["Facilitet"] {
            <<konfigurerbar>>
            Namn
        }

        class BookingStatus ["Bokningsstatus"] {
            <<konfigurerbar>>
            Namn
        }
    }

    namespace Bokningar {
        class Booking ["Rumsbokning"] {
            Titel
            Kontakt
            Dokument
        }

        class TimeInfo ["Tidsinformation"] {
            Startdatum
            Slutdatum
            Starttid
            Sluttid
            Hela dagen
        }

        class RecurringInfo ["Återkommande"] {
            Intervall
        }

        class Period ["Period"] {
            <<enumeration>> 
            År
            Månad
            Vecka
            Dag
        }

        class Weekday ["Veckodag"] {
            <<enumeration>>
            Måndag
            Tisdag
            Onsdag
            Torsdag
            Fredag
            Lördag
            Söndag
        }
    }

    namespace Roller {
        class UserRole ["Användarroll"] {
            Namn
            Systemroller
        }

        class SystemRole ["Systemroll"] {
            <<enumeration>>
            Användare
            Användarhanterare
            Datahanterare
            Systemhanterare
            Tjänsteanvändare
            Bokningsansvarig
        }
    }

    Location "1" *--> "0..n" Building
    Building "1" *--> "0..n" Floor
    Floor "1" *--> "0..n" Room
    Room "1" *--> "0..1" Capacity
    Room "1" *--> "0..n" RoomType
    Room "1" *--> "0..n" Facility
    Room "1" *--> "1..n" UserRole : kan bokas av
    Booking "1" *--> "1..n" Room
    Booking "1" *--> "1" BookingStatus
    Booking "1" *--> "0..n" Facility : önskar
    Booking "1" *--> "1" TimeInfo
    TimeInfo "1" *--> "0..1" RecurringInfo
    RecurringInfo "1" *--> "1" Period
    RecurringInfo "1" *--> "0..n" Weekday
    UserRole "1..n" ..> "1..n" SystemRole : tillhör

Bokningar

Under kategorin bokningar samlas information som berör själva bokningen. Dels det sammanhållande rumsbokningen och dels associerad information som exempelvis tid.

  • Bokning — huvudentiteten som kopplar samman rum, tid och önskade faciliteter
  • Bokningsstatus — konfigurerbar lista för bokningens tillstånd (t.ex. Preliminär, Väntande, Klar)
  • TidsInformation — innesluter start-/slutdatum och start-/sluttid, samt markering för heldagsbokning
  • Återkommande — valfri uppsättning för återkommande bokningar med intervall och period
  • Veckodag — vilka veckodagar en återkommande bokning gäller för
  • Dokumentlänk — namn och URL till associerade dokument (JSON-fält)

Byggnader och rum

Denna kategori av domänmodellen utgör grunddata för Salieri. Här defineras rum, byggnader med våningsplan, platser och diverse listor som faciliteter, bokningsstatus osv.

  • Plats — övergripande geografisk plats (t.ex. ort och område)
  • Byggnad — en byggnad kopplad till en plats, med namn, adress och kontakt
  • Våningsplan — en våning inom en byggnad, med namn och nummer
  • Rum — ett rum på ett våningsplan, med identitet och namn
  • Kapacitet — rummets maxantal personer och yta (valfri, 1:1 med rum)
  • Listor — konfigurerbara listor utan fasta värden (hanteras i drift, ingen seed-data):
    • Rumstyp (t.ex. Orkestersal, Konsertsal, Ensemblerum, Övningsrum)
    • Facilitet (t.ex. Flygel/Piano, Projektor, Talarstol, Hörslinga, Ljudsystem)
    • Bokningsstatus (t.ex. Preliminär, Väntande, Klar)
    • Användarroll — kopplar inloggningar till en eller flera systemroller och till rum som får bokas

Roller

Här återfinns begreppen användar- och systemroll. Mer information om roller finns att läsa här.

System Typ Användning
ASP.NET Identity + JWT Policies ManageUsers / ManageData / ManageSystem Attributbaserad auktorisering ([Authorize(Policy = "ManageData")]); roll-claims (User, UserManager, DataManager, SystemManager, ServiceUser, BookingManager) läggs in i JWT vid inloggning
Application UserRole SystemRoleType[] (kan innehålla flera av: User, UserManager, DataManager, SystemManager, ServiceUser, BookingManager) Domänroller — kopplar inloggningar till systemroller och rum (BookableByRoleIds)

Lagring: TimeInfo, RecurringInfo och RecurringWeekday är ägda typer utan egna Id:n i koden — de lagras som kolumner i Bookings respektive tabellen BookingRecurringWeekdays. DocumentLinks lagras som JSON i Bookings via värdkonverterare. Det finns ingen seed-data; alla listor (rumstyper, faciliteter, statusar, roller) hanteras i drift via import eller admin-sidorna.