# UML Class Diagram: Resources, Preferences, and Constraints

Package: `api.models` and `api.models.relations`.

## Class Responsibilities

| Class | Responsibility |
| --- | --- |
| `TtStaff` | Teaching resource with department/zone, preference presets, suitability, constraint profiles, sharing rules, avoid-concurrency rules, and weekly resource maps. |
| `TtLocation` | Location resource with capacity, zone, preference presets, suitability, constraint profiles, sharing rules, avoid-concurrency rules, and weekly resource maps. |
| `TtAvailability` | Binary availability pattern preset. |
| `TtStartPreference` | Start-time preference pattern preset. |
| `TtUsagePreference` | Usage preference pattern preset. |
| `TtSuitability` | Tag-like suitability group applied to staff and locations, then referenced by templates/activities. |
| `TtConstraintProfile` | Bundle of resource break, free block, maximum hour, maximum workspan, and travel constraints. |
| `TtTimeBlock` | Start/end slot block used by constraint entities. |
| `TtResourceBreak` | Break rule made of time blocks. |
| `TtFreeBlock` | Free block rule made of time blocks. |
| `TtMaximumHour` | Maximum-hour rule made of time blocks. |
| `TtMaximumWorkspan` | Maximum workspan rule made of time blocks. |
| `TtTravelTable` | Travel policy collection. |
| `TtJourney` | Travel duration between locations or zones. |
| `TtActivity` | Consumes staff and locations through assignment or preset/suitability joins. |

```mermaid
classDiagram
direction LR
class TtStaff {
  +code
  +name
  +availability_pattern
  +start_preference_pattern
  +usage_preference_pattern
  +status
}
class TtLocation {
  +code
  +name
  +capacity
  +availability_pattern
  +start_preference_pattern
  +usage_preference_pattern
  +status
}
class TtAvailability {
  +pattern
  +status
}
class TtStartPreference {
  +pattern
  +status
}
class TtUsagePreference {
  +pattern
  +status
}
class TtSuitability {
  +code
  +name
  +status
}
class TtConstraintProfile {
  +code
  +name
  +status
}
class TtTimeBlock {
  +start_slot
  +end_slot
  +status
}
class TtResourceBreak {
  +is_enabled
  +status
}
class TtFreeBlock {
  +is_enabled
  +status
}
class TtMaximumHour {
  +is_enabled
  +maximum_hour
  +status
}
class TtMaximumWorkspan {
  +is_enabled
  +maximum_workspan
  +status
}
class TtTravelTable {
  +code
  +name
  +status
}
class TtJourney {
  +duration
}
class TtActivity
class TtWeek

TtStaff --> TtAvailability
TtStaff --> TtStartPreference
TtStaff --> TtUsagePreference
TtLocation --> TtAvailability
TtLocation --> TtStartPreference
TtLocation --> TtUsagePreference
TtStaff "*" -- "*" TtSuitability : TtStaffSuitability
TtLocation "*" -- "*" TtSuitability : TtLocationSuitability
TtStaff "*" -- "*" TtConstraintProfile : TtStaffConstraintProfile
TtLocation "*" -- "*" TtConstraintProfile : TtLocationConstraintProfile
TtStaff "*" -- "*" TtWeek : TtStaffResourceMap
TtLocation "*" -- "*" TtWeek : TtLocationResourceMap
TtStaff "*" -- "*" TtStaff : avoid concurrency
TtLocation "*" -- "*" TtLocation : avoid concurrency
TtConstraintProfile "*" -- "*" TtResourceBreak : TtConstraintProfileResourceBreak
TtConstraintProfile "*" -- "*" TtFreeBlock : TtConstraintProfileFreeBlock
TtConstraintProfile "*" -- "*" TtMaximumHour : TtConstraintProfileMaximumHour
TtConstraintProfile "*" -- "*" TtMaximumWorkspan : TtConstraintProfileMaximumWorkspan
TtConstraintProfile "*" -- "*" TtTravelTable : TtConstraintProfileTravelTable
TtResourceBreak "*" -- "*" TtTimeBlock : TtResourceBreakTimeBlock
TtFreeBlock "*" -- "*" TtTimeBlock : TtFreeBlockTimeBlock
TtMaximumHour "*" -- "*" TtTimeBlock : TtMaximumHourTimeBlock
TtMaximumWorkspan "*" -- "*" TtTimeBlock : TtMaximumWorkspanTimeBlock
TtTravelTable "1" --> "*" TtJourney
TtJourney --> TtLocation : from/to location
TtActivity "*" -- "*" TtStaff : TtActivityStaff
TtActivity "*" -- "*" TtLocation : TtActivityLocation
TtActivity "*" -- "*" TtSuitability : staff/location suitability
```

