SKILL.md
Event Sourcing & Datamodell
Oversikt
Systemet bruker Event Sourcing Light - alle endringer lagres som immutable events som kan prosesseres uavhengig på tre parallelle spor.
Kjerneprinsipp
Events (immutable) → Projeksjon → SakState (computed view)
- Events lagres i Supabase event store
- SakState beregnes fra event-loggen ved hver request
- Ingen direkte state-mutasjon - kun nye events
Event-Typer
Grunnlag (TE sender, BH responderer)
| Event |
Aktør |
Beskrivelse |
grunnlag_opprettet |
TE |
Oppretter varsel om endring |
grunnlag_oppdatert |
TE |
Oppdaterer eksisterende varsel |
grunnlag_trukket |
TE |
Trekker tilbake varselet |
respons_grunnlag |
BH |
BH responderer (godkjent/avslått/delvis) |
responsgrunnlagoppdatert |
BH |
BH endrer standpunkt ("snuoperasjon") |
Vederlag (TE sender krav, BH responderer)
| Event |
Aktør |
Beskrivelse |
vederlagkravsendt |
TE |
Sender vederlagskrav |
vederlagkravoppdatert |
TE |
Oppdaterer krav |
vederlagkravtrukket |
TE |
Trekker krav |
respons_vederlag |
BH |
BH responderer på vederlag |
responsvederlagoppdatert |
BH |
BH endrer standpunkt |
Frist (TE sender krav, BH responderer)
| Event |
Aktør |
Beskrivelse |
fristkravsendt |
TE |
Sender fristkrav (nøytralt/spesifisert) |
fristkravoppdatert |
TE |
Oppdaterer krav |
fristkravspesifisert |
TE |
Spesifiserer dager for nøytralt varsel |
fristkravtrukket |
TE |
Trekker krav |
respons_frist |
BH |
BH responderer på frist |
responsfristoppdatert |
BH |
BH endrer standpunkt |
Forsering (§33.8)
| Event |
Aktør |
Beskrivelse |
forsering_varsel |
TE |
Varsler om forsering |
forsering_respons |
BH |
BH aksepterer/avslår forsering |
forsering_stoppet |
TE |
Stopper pågående forsering |
forseringkostnaderoppdatert |
TE |
Oppdaterer påløpte kostnader |
forseringkoelagt_til |
TE |
Legger til KOE i forseringssak |
forseringkoefjernet |
TE |
Fjerner KOE fra forseringssak |
Endringsordre (§31.3)
| Event |
Aktør |
Beskrivelse |
eo_opprettet |
BH |
Oppretter EO-sak |
eokoelagt_til |
BH |
Legger KOE til i EO |
eokoefjernet |
BH |
Fjerner KOE fra EO |
eo_utstedt |
BH |
Utsteder EO formelt |
eo_akseptert |
TE |
TE aksepterer EO |
eo_bestridt |
TE |
TE bestrider EO |
eo_revidert |
BH |
BH reviderer EO |
System-Events
| Event |
Aktør |
Beskrivelse |
sak_opprettet |
System |
Oppretter ny sak i systemet |
Spor-Status
Hvert spor har en status som endres basert på events:
IKKE_RELEVANT → UTKAST → SENDT → UNDER_BEHANDLING → GODKJENT/AVSLÅTT/DELVIS_GODKJENT
↓ ↓
UNDER_FORHANDLING TRUKKET
↓
LAAST
Statuser:
UNDER_FORHANDLING - BH har avslått/delvis godkjent, forhandling pågår
LAAST - Grunnlag låst etter godkjenning
Data-Strukturer
SakEvent (Base)
class SakEvent:
event_id: str # Unik ID
sak_id: str # Hvilken sak
event_type: EventType # Type hendelse
tidsstempel: datetime # Når (UTC)
aktor: str # Hvem
aktor_rolle: "TE" | "BH"
kommentar: Optional[str]
refererer_til_event_id: Optional[str] # For responser
SakState (Projeksjon)
class SakState:
sak_id: str
sakstittel: str
sakstype: SaksType # standard/forsering/endringsordre
grunnlag: GrunnlagTilstand
vederlag: VederlagTilstand
frist: FristTilstand
relaterte_saker: List[SakRelasjon]
forsering_data: Optional[ForseringData] # Kun for sakstype=forsering
endringsordre_data: Optional[EndringsordreData] # Kun for sakstype=endringsordre
opprettet: Optional[datetime]
siste_aktivitet: Optional[datetime]
Frontend/Backend Synkronisering
KRITISK: Typer må matche mellom frontend og backend!
| Frontend |
Backend |
Formål |
src/types/timeline.ts |
backend/models/events.py |
Event-typer |
src/types/timeline.ts |
backend/models/sak_state.py |
State-modell |
src/constants/categories.ts |
backend/constants/grunnlag_categories.py |
Kategorier |
Bruk python scripts/check_drift.py for å verifisere synkronisering.
API Flyt
Sende event
POST /api/events
{
"sak_id": "SAK-001",
"event_type": "grunnlag_opprettet",
"aktor": "Ola Nordmann",
"aktor_rolle": "TE",
"data": { ... }
}
Hente state
GET /api/cases/{sak_id}/state
→ Returns: SakState (projisert fra alle events)
Regler og Validering
Rekkefølge-regler
- Kan ikke sende
responsgrunnlag før grunnlagopprettet finnes
- Kan ikke sende
vederlagkravsendt på trukket grunnlag
- BH kan bare respondere på events fra TE og vice versa
Forretningsregler
Se backend/services/business_rules.py for komplett liste.
Vanlige oppgaver
Legge til ny event-type
- Legg til i
EventType enum i backend/models/events.py
- Opprett data-klasse hvis nødvendig
- Legg til i
AnyEvent union type
- Oppdater
src/types/timeline.ts (frontend)
- Oppdater state-projeksjon i
timeline_service.py
- Kjør
python scripts/check_drift.py for å verifisere
Endre state-modell
- Oppdater Pydantic-modell i
backend/models/sak_state.py
- Oppdater TypeScript interface i
src/types/timeline.ts
- Oppdater projeksjon i
backend/services/timeline_service.py
- Kjør
python scripts/state_drift.py for å verifisere