Timeplanlegger (automatisk timeregistrering)¶
Timeplanleggeren oppretter timeregistreringer automatisk for ansatte basert på en valgt skiftplan. Du definerer én eller flere planleggere som kjører daglig eller ukentlig på et angitt tidspunkt og genererer timeregistreringer for de neste N dagene.
Brukes typisk når ansatte har faste vakter eller skift som ikke endrer seg fra uke til uke — i stedet for at hver ansatt selv registrerer timer manuelt, lager portalen utkastet for dem.
Forvirring om navnet: Menyen heter "Timeplanlegger". Komponentens egen overskrift er "Automatisk Timeregistrering". Det er ikke et vakt-/turnusplanleggings-system og ikke et bytte-vakt-system — det er en jobb-planlegger som auto-genererer timeregistreringer ut fra en skiftplan.
Tilgang¶
| Hvem | Hva trengs |
|---|---|
| Rolle | Administrator — ruten er merket adminPage: true |
| Modul | Innstillinger (moduleId: 99) |
Verifisert i setting-routing.module.ts:33 — data: { moduleId: 99, adminPage: true } på system-setting-ruten.
Siden ligger under Innstillinger → Systeminnstillinger → Timeplanlegger. I venstre navigasjon er den gruppert under "Tidsregistrering", men selve verts-komponenten er SystemSettingComponent (ikke Portalinnstillinger). Se settings-navigation.config.ts:135-141.
Sånn ser siden ut¶
Øverst en mørk knapp «+ Opprett planlegger» (btn-action-dark btn-sm), deretter et smart-grid med globalt søk og paginering (25 / 10 / 50 / 100 rader pr. side).
Kolonner i listen:
| Kolonne | Type / filter | Kilde |
|---|---|---|
| Navn | Tekst, sorterbar/filtrerbar | name |
| Skiftplan | Tekst, sorterbar/filtrerbar | shiftPlanName |
| Type | Nedtrekks-filter (Daglig / Ukentlig) | scheduleType |
| Kjøretid | Tekst (HH:mm) | time (vises kun de første 5 tegn) |
| Dager frem | Tall, filtrerbar | generateDaysAhead |
| Aktiv | Ja/Nei-filter, vist som badge-soft-success / badge-soft-secondary |
isActive |
| Opprettet | Dato-filter (dd.MM.yyyy HH:mm) |
createdDate |
Verifisert i time-scheduler.component.ts:154-241 og time-scheduler.component.html:36-56.
Handlinger per planlegger¶
Hver rad har en handlings-kapsel (action-capsule btn-group btn-group-sm sg-desktop-only) med fire knapper:
| Handling | Ikon | Beskrivelse |
|---|---|---|
| Rediger | bi-pencil |
Åpner samme drawer som ved opprettelse, ferdig utfylt. |
| Kjør nå | bi-play-fill |
Manuell kjøring — krever bekreftelse i et NgbModal (#executeModal). Genererer timeregistreringer umiddelbart i stedet for å vente på neste planlagte tidspunkt. |
| Vis logger | bi-clock-history |
Åpner en drawer med kjøringslogger (dato, status, suksess/hoppet over/feilet, trigger-type). |
| Slett | bi-trash3 |
Krever bekreftelse i et NgbModal (#deleteModal). |
Verifisert i time-scheduler.component.html:58-97 og handlings-metodene deleteSchedule / executeSchedule / viewExecutionLogs.
Drawer for opprett/rediger¶
Drawer åpnes mot høyre (position: 'end', backdrop: 'static', panelklasse custom-offcanvas-width). Skjemaet er definert i time-scheduler.component.ts:80-92.
| Felt | Kontroll | Påkrevd | Standardverdi | Validering |
|---|---|---|---|---|
| Navn | Tekst | Ja | tom | Validators.required |
| Beskrivelse | Tekst | Nei | tom | — |
| Skiftplan | Nedtrekk (<select>) |
Ja | null |
Validators.required. Listen lastes fra settingService.getActiveShiftPlans(). |
| Aktiv | Bryter (form-switch) | — | true |
— |
| Type | Nedtrekk (<select>) |
Ja | Weekly |
Daily eller Weekly |
| Ukedag | Radioknapper (Mandag–Søndag, lagt opp i d-flex flex-wrap gap-2) |
Ja når Type = Weekly |
1 (Mandag) ved opprettelse |
Validators.required settes dynamisk i onScheduleTypeChange() når Type = Weekly |
| Kjøretid | <input type="time"> |
Ja | 06:00 |
Validators.required |
| Dager frem | <input type="number" min="1" max="365"> |
Ja | 7 |
Validators.required, Validators.min(1), Validators.max(365) |
| Inkluder helligdager | Bryter (form-switch) | — | false |
Hvis på, opprettes også timeregistreringer på helligdager |
| Varslingsmottakere | ng-select multi-select av brukere |
Nei | tom liste | Filtreres på userFullname; viser ansattnr, mobil og e-post i nedtrekket |
Nederst i drawer vises en forhåndsvisning (alert alert-info) som oppsummerer planen i klartekst — f.eks. "Hver mandag kl 06:00, 7 dager frem, inkluderer helligdager". Logikken ligger i getSchedulePreview() (time-scheduler.component.ts:532-561).
Knapper i bunnen:
- Avbryt (
btn btn-secondary) - Lagre (
btn btn-primary) — disablet så lenge skjemaet er ugyldig eller en kall er underveis
Varslingsmottakere — hvor kommer brukerne fra?¶
Listen lastes via NotificationSchedulerService.getUsers() som kaller GET /User/GetSysUserList?orderBy=userFullname&... (notification-scheduler.service.ts:276-277).
Backend leverer dette fra klient-databasen via UserRepository.GetSysUserList (en BaseRepository) som kaller SP [dbo].[wv_User_get_V2] (UserRepository.cs:393-416). Kilden er altså wv_User i klient-DB — ikke wv_UserAccount i system-DB.
I praksis er det samme brukerliste som vises i Brukerhåndtering. Hver rad i ng-select-nedtrekket viser navn, ansattnummer og — hvis utfylt — mobil og e-post.
Lagring konverterer valgte brukere til en kommaseparert streng av userEmployeeNo før den sendes til backend som NotificationRecipients (time-scheduler.component.ts:326-331).
Kjøre planleggeren manuelt ("Kjør nå")¶
- Klikk play-ikonet på raden.
- Bekreft i dialogen ("Bekreft kjøring").
- Et toast vises etter kjøring med tall for vellykket / hoppet over / feilet (
successved 0 feil,warninghvis noen feilet). Inntil 10 feildetaljer vises i toast, deretter "... og N flere feil". - Kjøringsloggene oppdateres for valgt plan.
Verifisert i confirmExecute() (time-scheduler.component.ts:403-445).
Kjøringslogger og detaljer¶
«Vis logger»-ikonet (klokkesymbolet) åpner en drawer med tabell:
| Kolonne | Innhold |
|---|---|
| Tid | dd.MM.yyyy HH:mm:ss |
| Status | Badge — Success (grønn), PartialSuccess (gul), Failed (rød). Ved feil vises også de første 50 tegn av feilmeldingen, med kopier-til-utklippstavle-knapp. |
| Suksess / Hoppet over / Feilet | Antall |
| Trigger-type | Hva som utløste kjøringen (manuell eller cron) |
| Handlinger | Øye-ikon → leveringsdetaljer; klokke-ikon → genererte timeregistreringer |
De to siste handlingene åpner egne drawers (#deliveryLogsDrawer, #timeRegistrationsDrawer).
Slik oppretter du en planlegger¶
- Åpne Innstillinger → Systeminnstillinger → Timeplanlegger.
- Klikk «+ Opprett planlegger» øverst til venstre.
- Fyll inn Navn (f.eks. "Auto-timer vakthold uke 1") og evt. Beskrivelse.
- Velg Skiftplan — uten en skiftplan kan planleggeren ikke vite hvilke timer som skal opprettes.
- Velg Type:
- Daglig kjører hver dag kl. Kjøretid og oppretter timeregistreringer for de neste Dager frem dagene.
- Ukentlig kjører kun på valgt Ukedag kl. Kjøretid.
- Hvis Type = Ukentlig: velg Ukedag i radio-raden (Mandag–Søndag).
- Sett Kjøretid (standard
06:00). - Sett Dager frem (standard
7, gyldig område 1–365). - Velg om helligdager skal inkluderes (standard av).
- Legg evt. til Varslingsmottakere — typisk lønnsansvarlige som vil ha sammendrag pr. kjøring.
- La Aktiv stå på (standard).
- Sjekk forhåndsvisnings-alerten nederst, og klikk Lagre.
Planleggeren begynner å kjøre automatisk fra og med neste Kjøretid som passer Type/Ukedag.
Vanlige problemer¶
"Ukedag er påkrevd"¶
Du har Type = Ukentlig men ikke valgt ukedag. Velg en ukedag, eller bytt til Daglig. Toast-meldingen kommer fra valideringen i saveTimeSchedule() (time-scheduler.component.ts:320-323).
"Dager frem" tar ikke verdien jeg setter¶
Tillatt område er 1–365 (Validators.min(1), Validators.max(365)). Lagre-knappen forblir disablet til feltet er gyldig.
Ingen timeregistreringer ble opprettet¶
Sjekk i denne rekkefølgen:
- Er planleggeren Aktiv? Slått av → ingen kjøring.
- Har valgt Skiftplan noen aktive skift?
- Er Kjøretid allerede passert i dag? Hvis du opprettet planleggeren etter dagens Kjøretid, starter første kjøring først neste planlagte tidspunkt.
- Åpne Vis logger — der ser du faktisk status (Success / PartialSuccess / Failed) med feilmelding pr. kjøring og kopier-knapp.
Varslingsmottakere får ingen melding¶
Sjekk at brukerne har gyldig e-post-adresse på sin profil (samme brukere som vises i Brukerhåndtering — kilden er wv_User via SP wv_User_get_V2).
Lagre-knappen er disablet¶
Skjemaet er ugyldig. Vanlige årsaker: tomt Navn, ingen Skiftplan valgt, ingen Ukedag når Type = Ukentlig, eller Dager frem utenfor 1–365.
Relaterte sider¶
- Skiftplan — definerer skiftene som planleggeren genererer timer for
- Arbeidstidsreguleringer — maks-grenser og hviletid
- Time-modulen
- Innstillinger — oversikt


