Datamodel & ER-diagram

Kerne-entiteterne i Ressourcify, deres relationer og hvad de hver især repræsenterer.

Datamodellen er bygget op om én rod (Organization) som alt scopes til. Resten falder i fire grupper: mennesker, arbejde, fravær og forecast.

Forenklet ER-diagram

Entiteter

Mennesker

ModelFunktionNøgle-felter
OrganizationTenant-rodid, name
DepartmentOrganisatorisk enhed (1-til-mange med User)organizationId, name
TeamTværgående gruppering (mange-til-mange via UserTeam)organizationId, name
UserMedarbejderemail, employmentPct, defaultWeeklyHours, azureAdOid
UserRoleRolle med scoperole, scopeType (ORG/DEPT), scopeId
UserTeamJoin-tabelisCoordinator

Arbejde

ModelFunktion
ProjectDet arbejde der allokeres til
AssignmentEn allokering: bruger × projekt × periode × procent
BulkAllocationBatchSporing af masseallokerings-wizard'en
TimeEntryFaktisk registreret tid (deprecated — se memory)

Fravær

ModelFunktion
LeaveEn fraværsperiode (ferie, sygdom, kursus, andet)
LeaveTypeKonfigurérbare fraværs-typer per organisation
PublicHolidayHelligdage — trækkes fra arbejdsdage automatisk
WorkingPatternBrugerens normalt-skema (timer per ugedag)

Forecast & kapacitet

ModelFunktion
ForecastPlanAggregeret plan: projekt × år
ForecastPlanAllocationForventet allokering per bruger × måned
ForecastSizeT-shirt-størrelser (S/M/L) til hurtig forecast-indtastning
MonthlyCapacityCachet beregning: brugerens nettotimer per måned
MonthlyUtilizationCachet beregning: udnyttelse per måned
MonthlyForecastCachet aggregering af forecast per måned

Tenant-isolation

Alle queries filtrerer på organizationId. Modeller uden eksplicit organizationId (fx UserRole, UserTeam, Assignment) får isolation via deres parent.

Defense-in-depth: Row-Level Security er aktiveret på alle public-tabeller (migration enable_rls). Læs mere i Row-Level Security som defense-in-depth.

Soft-delete vs hard-delete

TabelStrategiHvorfor
UserSoft (deletedAt)Bevarer audit-trail og historiske allokeringer
ProjectSoftSamme — historik må ikke forsvinde
Assignment, LeaveHardKorte levetider; historik bevares via audit
Department, TeamHard, kun når tomStrukturændringer skal være eksplicitte

Reads på soft-delete-modeller skal altid filtrere deletedAt: null (se CLAUDE.md → Sikkerhedsmatrix).

Hvor er sandheden

Den autoritative kilde er prisma/schema.prisma. Dette diagram er et forenklet udsnit — relationer som Notification, JiraIssue, AuditLog, OrganizationModule m.fl. er udeladt for læsbarheden.

On this page