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
| Felt | Forklaring |
|---|---|
workdays | Antal arbejdsdage i måneden — ekskl. weekender og helligdage |
baseHours | Forventede timer i måneden ud fra brugerens WorkingPattern |
leaveHours | Sum af fraværstimer i måneden |
netHours | baseHours − leaveHours |
Formlerne
Alle resultater afrundes til én decimal for at undgå float-støj.
Udnyttelse
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)
| Trin | Tal |
|---|---|
| Dage i maj | 31 |
| − weekender | −10 |
| − helligdage | −1 |
workdays | 20 |
baseHours (20 × 7,4) | 148,0 |
| Feriedage (11.-15. maj, alle hverdage) | 5 |
leaveHours (5 × 7,4) | 37,0 |
netHours | 111,0 |
Hvis Alice er allokeret 80 timer i maj:
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.
| Eksempel | Mandag | Tirsdag | Onsdag | Torsdag | Fredag | Lør | Søn |
|---|---|---|---|---|---|---|---|
| Fuldtid | 7,4 | 7,4 | 7,4 | 7,4 | 7,4 | 0 | 0 |
| Halvtid | 3,7 | 3,7 | 3,7 | 3,7 | 3,7 | 0 | 0 |
| 4-dages uge | 9,25 | 9,25 | 9,25 | 9,25 | 0 | 0 | 0 |
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:
hoursPerDay | Tolkning |
|---|---|
null (default) | Hele dagen — bruger arbejdsmønsterets timer for ugedagen |
4.0 | Halv 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:
| Team | isMember | isCoordinator | Effekt |
|---|---|---|---|
| Eget team | true | true | Tæller som ressource + koordinerer |
| Andet team | false | true | Koordinerer 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.