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,RecurringInfoochRecurringWeekdayär ägda typer utan egna Id:n i koden — de lagras som kolumner iBookingsrespektive tabellenBookingRecurringWeekdays.DocumentLinkslagras som JSON iBookingsvia värdkonverterare. Det finns ingen seed-data; alla listor (rumstyper, faciliteter, statusar, roller) hanteras i drift via import eller admin-sidorna.