# Arbeidspuls

[Read this README in English](README.en.md)

**Arbeidspuls** er en lett, personvernvennlig webapp for egenrapportering av arbeidsevne, funksjon, energi, symptomer og belastning over tid.

Tjenesten er laget for praktiske situasjoner der en person skal dokumentere faktisk funksjon i en arbeidssituasjon, for eksempel ved arbeidsutprøving, gradvis tilbakeføring, langvarig sykdom, utmattelse eller andre forhold som påvirker kort- og langtidskapasitet.

Arbeidspuls er rask å bruke fra telefonen, men gir samtidig veiledere en ryddig måte å gjennomgå trender, rapportdetaljer, oppfølginger og notater på.

> Arbeidspuls er et verktøy for strukturert egenrapportering og gjennomgang. Det erstatter ikke medisinsk vurdering, arbeidsmedisinsk utredning eller formelle vedtak.

---

## Hvorfor hoste Arbeidspuls?

Arbeidspuls passer for aktører som ønsker en enkel og lavterskel løsning for arbeidsevnerelatert egenrapportering uten å måtte drifte et tungt fagsystem eller en sentral database.

Tjenesten er særlig relevant for:

- arbeidsutprøving
- oppfølging over tid
- gradvis tilbakeføring til arbeid
- dokumentasjon av funksjon, belastning og restitusjon
- veiledere, rådgivere eller fagpersoner som skal gjennomgå rapporter
- miljøer der dataminimering og lokal lagring er viktig

Arbeidspuls er bygget som en webapp/PWA som normalt kan hostes som vanlige statiske filer. Sikker e-postdeling er et valgfritt tillegg som krever en liten FastAPI-backend.

Den grunnleggende local-only-flyten krever normalt ikke:

- serverdatabase
- innlogging
- backend-API
- Node-prosess i produksjon
- sentral lagring av sensitive rapporter

Brukeren eier dataene sine lokalt i nettleseren og deler dem aktivt ved å eksportere en JSON-fil eller opprette en kryptert engangslenke.

---

## Hovedfunksjoner

- rask egenrapportering fra telefon
- 1-5-skalaer for sentrale funksjonsområder
- valgfrie detaljer for arbeidssted, arbeidstid, oppgavetype, begrensninger og tilrettelegging
- oppfølging etter arbeidsøkt for å fange forsinket forverring/restitusjon
- oversikt med tidsbasert trendgraf
- lokal import/eksport av JSON
- veiledervisning for gjennomgang av eksporterte rapporter
- veiledernotater per bruker, rapport og oppfølging
- fullskjerm grafanalyse for veileder
- lokal integritetskontroll av rapporter
- norsk, engelsk og ukrainsk brukergrensesnitt
- kan installeres som PWA/WebApp på telefon og nettbrett

Språkvalget oversetter bare statiske tekster og visningsetiketter. Rapportinnhold, kommentarer, veiledernotater og importert JSON endres ikke.

---

## Skjermbilder

Skjermbildene ligger i [`screenshots/`](screenshots/).

### Registrer rapport

![Registrer rapport](screenshots/User%20-%20Report.png)

Brukeren kan registrere en rapport med få trykk. Hovedfeltene er raske 1-5-valg, mens valgfrie detaljer kan åpnes ved behov.

### Oppfølging

![Oppfølging](screenshots/User%20-%20Follow-up.png)

Oppfølging brukes etter en arbeidsøkt, for eksempel samme dag, dagen etter eller senere. Dette kan være nyttig når symptomer eller utmattelse kommer forsinket.

### Oversikt og trend

![Oversikt og trend](screenshots/User%20-%20Overview.png)

Oversikten viser rapporter, oppfølginger, totalscore, kategoriscore og trend over tid. Grafen bruker faktisk tidsavstand mellom rapporter.

### Rapportdetaljer

![Rapportdetaljer](screenshots/User%20-%20Report%20Review.png)

Brukeren kan åpne en rapport for å se detaljer og eventuelt slette lokale rapporter.

### Personvern og datahåndtering

![Personvern og datahåndtering](screenshots/User%20-%20Privacy%20Information.png)

Personvernsiden forklarer lokal lagring, eksport/import, deling med veileder og sletting av lokale data.

### Veiledergjennomgang

![Veiledergjennomgang](screenshots/Guide%20-%20Main%20View.png)

Veiledervisningen lar en veileder importere JSON-filer fra brukere, se rapporter, lese detaljer, legge inn egne notater og sammenligne utvikling over tid.

### Fullskjerm grafanalyse

![Fullskjerm grafanalyse](screenshots/Guide%20-%20Graph%20Inspection.png)

I veiledervisning kan grafen åpnes i fullskjerm for mer presis gjennomgang, tidsfiltrering og inspeksjon av konkrete datapunkter.

---

## For brukere

### Åpne tjenesten

Gå til:

```text
https://arbeidspuls.rolfsvaag.no
```

Arbeidspuls fungerer på telefon, nettbrett og PC. Den er laget phone-first, slik at rapportering skal være raskt og lite belastende.

### Installer som app på telefon eller nettbrett

Arbeidspuls kan installeres som en PWA/WebApp.

På Android/Chrome:

1. åpne Arbeidspuls i Chrome
2. trykk på menyen
3. velg **Installer app** eller **Legg til på startsiden**

På iPhone/iPad/Safari:

1. åpne Arbeidspuls i Safari
2. trykk på delingsknappen
3. velg **Legg til på Hjem-skjerm**

Etterpå kan Arbeidspuls åpnes som en vanlig app fra startskjermen.

### Lagre en rapport

Velg **Registrer**, fyll ut hovedfeltene og trykk **Lagre rapport**.

Hovedfeltene er:

- arbeidsevne akkurat nå
- energinivå
- mental klarhet / konsentrasjon
- symptombelastning
- anstrengelse / belastning
- om du kan fortsette, trenger pause, trenger enklere oppgave eller ønsker å stoppe

Valgfrie detaljer kan brukes hvis du vil legge til mer kontekst, for eksempel arbeidssted, arbeidstid, fysisk/mental energi, oppgavetype, begrensninger, hva som hjalp og kort kommentar.

### Lagre en oppfølging

Velg **Oppfølging** for å registrere hvordan du har det etter en arbeidsøkt.

Dette kan brukes for å dokumentere:

- om du er verre enn før arbeidsøkten
- forsinkede symptomer
- restitusjon
- kort kommentar

Oppfølging er særlig nyttig dersom reaksjonen kommer senere enn selve arbeidsøkten.

### Se oversikt

Velg **Oversikt** for å se tidligere rapporter, oppfølginger og trendgraf.

Oversikten viser blant annet:

- totalscore
- arbeidsevne
- energi
- mental klarhet
- symptomer
- belastning
- oppfølginger knyttet til rapporter

### Eksporter data til veileder

Hvis en veileder eller annen person skal gjennomgå rapportene dine:

1. gå til **Personvern**
2. velg **Eksporter JSON**
3. send JSON-filen til veilederen, for eksempel via e-post eller annen avtalt kanal

JSON-filen kan inneholde sensitive helse- og funksjonsrelaterte opplysninger. Del den bare med personer som faktisk skal ha tilgang.

### Importer tidligere data

Hvis du har byttet enhet, byttet nettleser eller mistet lokale data, kan du importere en tidligere eksportert JSON-fil via **Personvern**.

---

## For veiledere

Veiledervisningen finnes på:

```text
https://arbeidspuls.rolfsvaag.no/veileder
```

eller:

```text
https://arbeidspuls.rolfsvaag.no/evaluator
```

### Importere rapporter

1. Be brukeren eksportere JSON fra **Personvern**
2. Åpne veiledervisningen
3. Velg JSON-filen
4. Gi brukeren et navn eller en intern identifikator

Dataene lagres lokalt i veilederens nettleser etter import. Hvis brukeren deler via e-postlenke, håndterer serveren bare en midlertidig kryptert kopi som den ikke kan lese.

### Gjennomgå rapporter

Veileder kan:

- se trendgraf for valgt bruker
- filtrere på tidsperiode
- åpne fullskjerm grafanalyse
- lese rapportdetaljer
- lese oppfølginger
- se totalscore og kategoriscore
- skrive generelt notat for bruker
- skrive notat per rapport
- skrive notat per oppfølging
- eksportere/importere veilederbackup

### Score og funksjonsnivå

Arbeidspuls viser totalscore og kategoriscore som interne funksjonsindikatorer.

Score er ment for oversikt og trend, ikke som medisinsk fasit.

I veiledervisning brukes scoreband som:

- **Særdeles høyt funksjonsnivå**
- **Forventet funksjonsnivå**
- **Moderat redusert funksjon**
- **Betydelig redusert funksjon**
- **Svært lav funksjon**

75 % tilsvarer omtrent et forventet/godt rapportert funksjonsnivå, mens 100 % tilsvarer særdeles høyt funksjonsnivå.

### Integritetskontroll

Rapporter kan inneholde lokal integritetsmetadata. Dersom en rapport mangler verifisering eller ser ut til å være endret, vises et varsel i veiledervisningen.

Dette er en teknisk kontroll. Det er ikke en juridisk garanti og sier ikke noe om medisinsk sannhet i rapporten.

---

## Personvern og lokal lagring

Arbeidspuls lagrer data lokalt i nettleseren på enheten som brukes som hovedregel. Vanlig JSON-eksport/import er fortsatt local-only.

Hvis brukeren velger **Send via e-post**, krypteres valgt eksport i nettleseren før den lastes opp til Arbeidspuls-serveren som en midlertidig engangsdeling. Serveren får ikke dekrypteringsnøkkelen og kan ikke lese rapportdataene. Nøkkelen ligger bare i URL-fragmentet i delingslenken.

Det betyr:

- rapporter sendes ikke automatisk til en server
- vanlig JSON-eksport/import bruker ingen sentral database
- data blir liggende på brukerens enhet/nettleser
- sletting av nettleserdata kan slette rapportene
- bytte av enhet eller nettleser krever eksport/import
- krypterte e-postdelinger slettes etter første vellykkede import eller automatisk etter 7 dager

Etter sletting beholdes kun minimal metadata for delingen: eksport-id, opprettelsestidspunkt, slettetidspunkt og slettegrunn.

---

## Teknisk oversikt

Arbeidspuls er en React/Vite-app med lokal nettleserlagring og en valgfri FastAPI-backend for krypterte engangsdelinger.

Typisk produksjonsbygg:

```bash
npm ci
npm run build
```

Innholdet i `dist/` hostes deretter som statiske filer.

For en SPA bør webserveren ha fallback til `index.html`, men `/api/share` må rutes til FastAPI før fallback. Apache-eksempel:

```apache
ProxyPreserveHost On
ProxyPass        /api/share/ http://127.0.0.1:8000/api/share/
ProxyPassReverse /api/share/ http://127.0.0.1:8000/api/share/
ProxyPass        /api/share http://127.0.0.1:8000/api/share
ProxyPassReverse /api/share http://127.0.0.1:8000/api/share

<Location "/api/share">
    Require all granted
    LimitRequestBody 3145728
    Header always set Cache-Control "no-store"
    Header always set Pragma "no-cache"
    Header always set Expires "0"
    RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
</Location>
```

Anbefalte sikkerhetsheadere for vhosten:

```apache
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self'; upgrade-insecure-requests"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"
```

### Teknologi

- React
- TypeScript
- Vite
- PWA-manifest
- service worker
- lokal lagring i nettleser
- JSON import/eksport
- lokal veiledervisning
- valgfri FastAPI/SQLite-backend for kryptert engangsdeling
- norsk/engelsk/ukrainsk UI

### Produksjon

Arbeidspuls kan fortsatt kjøres som ren statisk app hvis sikker e-postdeling ikke brukes. Offentlig demo med **Send via e-post** krever FastAPI-backend, HTTPS, SPA fallback for `/s` og reverse proxy fra `/api/share` til backend.

Aktive krypterte delinger i SQLite bør ikke tas med i langvarig backup. Hvis databasen backupes, må retention være kortere enn delingens utløp eller backupen må begrenses til auditmetadata etter sletting.

---

## Utvikling

Installer avhengigheter:

```bash
npm ci
```

Kjør utviklingsserver:

```bash
npm run dev
```

Bygg produksjonsfiler:

```bash
npm run build
```

Kjør tester:

```bash
npm test
```

---

## Viktig presisering

Arbeidspuls er et hjelpemiddel for strukturert egenrapportering og gjennomgang. Tjenesten skal ikke brukes som eneste grunnlag for medisinske, juridiske eller arbeidsrettslige beslutninger.

Totalscore og kategoriscore er interne funksjonsindikatorer for oversikt og trend. De er ikke medisinsk validerte testresultater.

---

## Lisens

Se [`LICENSE`](LICENSE).
