Kapacitetsberegning

Sådan beregner Ressourcify arbejdsdage, nettotimer og udnyttelse — med konkrete eksempler.

Alle kapacitetstal i Ressourcify er bygget af fire grundlæggende felter. Her kommer formlerne, et regneeksempel og de vigtigste fælder.

De fire grundfelter

FeltForklaring
workdaysAntal arbejdsdage i måneden — ekskl. weekender og helligdage
baseHoursForventede timer i måneden ud fra brugerens WorkingPattern
leaveHoursSum af fraværstimer i måneden
netHoursbaseHours − leaveHours

Formlerne

baseHours  = Σ (defaultHours[weekday(day)])  for hver workday
leaveHours = Σ (leave.hoursPerDay eller defaultHours)  for hver workday med fravær
netHours   = baseHours − leaveHours

Alle resultater afrundes til én decimal for at undgå float-støj.

Udnyttelse

utilizationPlanned = plannedHours / netHours × 100%
utilizationActual  = actualHours  / netHours × 100%

Hvis netHours = 0 (ren fraværsmåned) returneres 0% — ikke NaN.

Du kan vælge useNetCapacity = false for at regne mod brutto i stedet — relevant for "potentiel udnyttelse"-rapporter.

Regneeksempel: Alice, maj 2026

Forudsætninger:

  • Arbejdsmønster: dansk standard (37 t/uge fordelt 7,4 t × 5 dage)
  • employmentPct = 1.00
  • 1.-2. maj er weekend; 8. maj er helligdag (Store Bededag flyttet — fiktivt eksempel)
  • Alice har ferie 11.-15. maj (hele dage)
TrinTal
Dage i maj31
− weekender−10
− helligdage−1
workdays20
baseHours (20 × 7,4)148,0
Feriedage (11.-15. maj, alle hverdage)5
leaveHours (5 × 7,4)37,0
netHours111,0

Hvis Alice er allokeret 80 timer i maj:

utilizationPlanned = 80 / 111 × 100 = 72%

Arbejdsmønster (WorkingPattern)

Hver bruger har et mønster med en time-værdi per ugedag (ISO 1=mandag … 7=søndag). Standard er 7,4 t mandag–fredag og 0 t weekend.

EksempelMandagTirsdagOnsdagTorsdagFredagLørSøn
Fuldtid7,47,47,47,47,400
Halvtid3,73,73,73,73,700
4-dages uge9,259,259,259,25000

Mønsteret kan ændres over tid — hver pattern-række har en validFrom-dato.

Fravær: hele eller delvise dage

Et Leave har en valgfri hoursPerDay:

hoursPerDayTolkning
null (default)Hele dagen — bruger arbejdsmønsterets timer for ugedagen
4.0Halv dag — uanset mønster

Fravær på en weekend eller helligdag bidrager ikke til leaveHours, fordi det ikke er en arbejdsdag. Brugeren behøver ikke registrere det.

Hvem tæller med i kapaciteten

Ikke alle i organisationen skal indgå i kapacitets- og belastningsregnestykket. To uafhængige knapper styrer det — én global per person, én per team.

Global: hold en chef helt ude (includeInCapacity)

Sætter en admin includeInCapacity = false på en bruger (under Brugere → rediger → "Tæl med i kapacitet"), forsvinder personen fra alt kapacitets- relateret:

  • Belastning, Teamview, Indsigter og forecast-belastning
  • Projekt-totaler — personens allokeringer tælles ikke med
  • Masseallokering (ikke et standard-mål), kapacitetsalarmer og -mails
  • Kalender-grid'et

Personens eget dashboard, login og allokeringer er uændret, og de beholder enhver koordinator-rolle (de modtager fx stadig koordinator-alarmer). Typisk brug: chefer der ikke selv er planlagte ressourcer.

includeInCapacity er bevidst adskilt fra isManager (som kun giver adgang til Indsigter). En leder kan sagtens være en planlagt ressource — derfor vælges fravalget per person, ikke automatisk ud fra leder-flaget.

Per team: koordinator uden at være ressource (isMember)

På en team-tilknytning (UserTeam) styrer isMember, om personen vises som ressource i netop det team. En koordinator kan stå med isCoordinator = true, isMember = false — så administrerer de teamet uden at fremgå i dets belastning eller tælle i dets kapacitet.

Fordi flaget sidder per team, kan samme person være ressource på sit eget team og koordinator-only på et andet samtidig:

TeamisMemberisCoordinatorEffekt
Eget teamtruetrueTæller som ressource + koordinerer
Andet teamfalsetrueKoordinerer kun — ikke ressource her

Sættes via Teams → rediger → markér som koordinator → slå "Ressource" fra.

Det globale includeInCapacity = false vinder altid: er en person fravalgt globalt, vises de ikke nogen steder uanset deres isMember-flag på et team.

Bruger-start og -slut

Hvis User.startDate er midt i måneden, tæller kun dage fra og med start. Tilsvarende for User.endDate. Det forhindrer urealistisk høj kapacitet for ny-startede eller fratrådte.

Hvor logikken bor

Al beregning ligger i lib/calc/capacity.ts som rene funktioner — uden DB-kald. Det gør den nem at unit-teste og forhindrer at logikken spreder sig ud i routes og komponenter.

Resultatet caches i tabellerne MonthlyCapacity og MonthlyUtilization, så lister og rapporter kan læse dem hurtigt uden at genberegne.

Genberegning

Cachen invalideres når:

  • En allokering oprettes, ændres eller slettes
  • Et fravær oprettes, ændres eller slettes
  • Brugerens WorkingPattern ændres
  • En helligdag tilføjes eller fjernes
  • En manuel Genberegn-knap aktiveres af en admin

Genberegningen kører månedvis og er idempotent.