Kalender¶
Kalender-fanen vedlikeholder enkeltdager i tabellen wv_Time_Calendar (kalenderdager). Hver rad er en konkret dato med et navn, et flagg for om dagen er helligdag, en valgfri kobling til en lønnsartregel, en vaktfaktor og to flagg for ekstra vakttillegg / timebanktillegg. Helligdagene for et helt år kan importeres fra ekstern API (webapi.no) i én operasjon.
Komponenten er en CRUD-liste — det finnes ingen separat «overstyrings-liste», ingen landsvelger, og ingen innstillinger for fellesferie eller inneklemte dager på denne siden.
Kilder: calendar-admin.component.ts, calendar-admin.component.html, CalendarController.cs, CalendarDay.cs.
Tilgang¶
| Hvem | Hva trengs |
|---|---|
| Rolle | Bruker med tilgang til Innstillinger → Portalinnstillinger (typisk administrator) |
| Modul | Settings — moduleId: 99 (routevakt: ActivateService + ModuleGuard, se setting-routing.module.ts:30) |
| API-endepunkter | [Authorize] på alle metoder i CalendarController |
Selve CalendarAdminComponent er montert som tab-innhold inne i PortalSettingComponent (tab=calendar), så samme moduleId: 99 styrer adgangen.
Sånn ser siden ut¶
Toppen av fanen har:
- Årsfilter (
Calendar.year) — dropdown med tre alternativer som bygges iloadData(): forrige år, inneværende år og neste år. Endring av år henter dagene på nytt viaonYearChange()som kallergetCalendarDays()(calendar-admin.component.ts:209-212). - «Importer helligdager» (
Calendar.importHolidays) — åpner import-modalen (calendar-admin.component.html:16-19). - «Legg til dag» (
Calendar.addNew) — åpner drawer for ny kalenderdag (calendar-admin.component.html:22-25).
Tabellen under er et smart-grid med kolonnene definert i buildColumns() (calendar-admin.component.ts:110-188):
| Kolonne | Felt | Innhold |
|---|---|---|
| Dato | date |
Lagret som YYYYMMDD i basen, vises som DD.MM.YYYY |
| Navn | name |
Fritekst, f.eks. «1. nyttårsdag» |
| Helligdag | isHoliday |
Rød/grå soft-badge for ja/nei |
| Lønnsartregel | wageTypeOptionName |
Navnet på koblet wto-regel, hvis satt |
| Vaktfaktor | dutyFactor |
Tall, standard 1.0 |
| Ekstra vakttillegg | dutyAddExtra |
Grønn/grå badge for ja/nei |
| Ekstra timebanktillegg | dutyTBExtra |
Grønn/grå badge for ja/nei |
| Handlinger | — | Blyant (rediger) og søppelbøtte (slett) i action-capsule btn-group btn-group-sm sg-desktop-only |
Tomt år viser ikonet bi-calendar-x og teksten Calendar.noData («Ingen kalenderdager funnet for valgt år»).
Felter i drawer (ny / rediger kalenderdag)¶
Drawer åpnes fra «Legg til dag» eller blyantknappen i raden. Reactive form calendarForm er bygget i konstruktøren (calendar-admin.component.ts:62-71).
| Felt (i18n-nøkkel) | Type | Standard | Validering | Merknader |
|---|---|---|---|---|
Dato (Calendar.date) |
Tekst DD.MM.YYYY |
I dag (ved ny) | Validators.required — feilmelding General.requiredValidation |
Lagres som YYYYMMDD via parseDate() (calendar-admin.component.ts:232-243) |
Navn (Calendar.name) |
Tekst | Tom | Ingen | Placeholder Calendar.namePlaceholder («F.eks. Første nyttårsdag») |
Er helligdag (Calendar.isHoliday) |
Form-switch | false |
Ingen | Hjelpetekst: «Denne dagen vil ikke telles som arbeidsdag» (Calendar.isHolidayHelp) |
Lønnsartregel (Calendar.wageTypeOption) |
ng-select over wageTypeOptions |
null |
Ingen | Lastes fra SettingService.getCalendarLoadData(); clearable |
Vaktfaktor (Calendar.dutyFactor) |
Number, step 0.1 | 1.0 |
Validators.min(0), Validators.max(10) |
Hjelpetekst: «Faktor for vaktberegning (standard 1.0)» |
Ekstra vakttillegg (Calendar.dutyAddExtra) |
Form-switch | false |
Ingen | — |
Ekstra timebanktillegg (Calendar.dutyTBExtra) |
Form-switch | false |
Ingen | — |
Knapperaden i drawer-bunnen: Avbryt lukker drawer, Lagre er deaktivert så lenge calendarForm.invalid. Lagring bruker SettingService.saveCalendarDay(); suksess viser toast Calendar.created eller Calendar.updated, og griden lastes på nytt (calendar-admin.component.ts:300-333).
Importer helligdager (modal)¶
Knappen «Importer helligdager» åpner en modal som henter offisielle norske helligdager fra et eksternt API for ett valgt år (calendar-admin.component.ts:379-413, CalendarController.cs:217-342).
- Datakilde. URL leses fra
NorwegianHolidaysApi:Urliappsettings.json; default erhttps://webapi.no/api/v1/holidays/{year}(appsettings.json:135-137). Det finnes ingen landsvelger i UI eller backend — kun norske helligdager støttes. - År som kan importeres. Inneværende år + tre fram i tid (
importYearsbygges iloadData()). - Eksisterende dager overskrives ikke. Beskrivelsen i modalen er
Calendar.importDescription: «Importer norske helligdager fra ekstern API. Eksisterende dager vil ikke overskrives. Innstillinger (lønnsart, vaktfaktor osv.) kopieres fra forrige år hvis navnet er likt.» - Resultat. Etter import vises et alert-panel med antall importerte, antall hoppet over, eventuelle kopierte innstillinger fra forrige år (
Calendar.copiedSettings), samt to lister: importerte (Calendar.imported) og hoppet over (Calendar.skipped). HvisimportedCount > 0skifter årsfilteret automatisk til det importerte året.
Slett kalenderdag¶
Søppelbøtte-knappen i radens handlingskolonne åpner en bekreftelsesmodal (deleteConfirmModal) med rød header og navnet / datoen på dagen som skal slettes (calendar-admin.component.html:247-274). Bekreftelse kaller SettingService.deleteCalendarDay(id); suksess viser toast Calendar.deleted og laster griden på nytt.
Slik gjør du¶
Importere helligdager for et nytt år¶
- Åpne Innstillinger → Portalinnstillinger → Kalender.
- Klikk Importer helligdager.
- Velg år i nedtrekken (inneværende år eller opp til tre år fram).
- Klikk Importer.
- Les resultat-panelet — kontroller listen «Importert» mot kjente helligdager, og at «Hoppet over» kun inneholder dager som allerede fantes.
- Hvis du har egne lønnsartregler / vaktfaktorer satt på fjorårets dager, bekrefter teksten «Helligdager fikk innstillinger kopiert fra forrige år» at de er overført.
Legge til en enkeltdag manuelt (f.eks. lokal merkedag eller bedriftsfri dag)¶
- Åpne Innstillinger → Portalinnstillinger → Kalender.
- Klikk Legg til dag.
- Skriv dato i formatet
DD.MM.YYYY. - Gi dagen et navn.
- Slå på Er helligdag hvis dagen skal regnes som helligdag (kommentar i UI: «Denne dagen vil ikke telles som arbeidsdag»).
- Koble eventuelt en lønnsartregel og juster vaktfaktor / ekstra vakttillegg / ekstra timebanktillegg.
- Klikk Lagre.
Endre en eksisterende dag¶
- Velg riktig år i årsfilteret.
- Klikk blyantknappen i raden.
- Endre verdiene i drawer og klikk Lagre.
Slette en dag¶
- Velg år.
- Klikk søppelbøtte-knappen i raden.
- Bekreft i modalen ved å klikke Slett.
Vanlige problemer¶
«Dato er påkrevd»¶
Datofeltet er det eneste med Validators.required. Skriv datoen i formatet DD.MM.YYYY. Andre formater blir lagret som angitt (ingen klientvalidering på selve formatet), men parseDate() konverterer kun gyldige DD.MM.YYYY-verdier til lagringsformatet YYYYMMDD.
«Lagre»-knappen er deaktivert¶
Skjer når calendarForm.invalid. Mest sannsynlig årsak er at dato mangler, eller at vaktfaktor er utenfor [0, 10].
Importen sier «hoppet over» selv om dagen ikke ser ut til å eksistere¶
Backend hopper over dager som allerede har en rad på samme dato i wv_Time_Calendar. Sjekk om dagen ligger i et annet år — eller om en tidligere import allerede har lagt den inn under et litt annet navn.
Importen feiler / tom liste¶
Importen krever utgående kall mot https://webapi.no/api/v1/holidays/{year} (eller den URL-en som er overstyrt i appsettings.json:NorwegianHolidaysApi:Url). Hvis applikasjonens netttilgang er begrenset, vil import returnere feil — bruk «Legg til dag» som manuell fallback.
Lønnstillegg utløses ikke selv om dagen er markert som helligdag¶
isHoliday-flagget setter bare merkingen på dagen i wv_Time_Calendar. Lønnsmessig effekt avhenger av at en lønnsartregel (wageTypeOptionId) er koblet på dagen, og at regelen selv er konfigurert. Sjekk feltet «Lønnsartregel» på den aktuelle dagen.


