Package-level declarations

Relasjon mellom Sak og Behandling

Sak (1) ──────────── (n) Behandling
│ │
├── id: SakId ◄─────── sakId
├── saksnummer
├── person
└── rettighetsperiode

En Sak kan ha mange Behandlinger (førstegangsbehandling, revurderinger, klager, aktivitetsplikt, osv.). Behandling peker tilbake på saken via sakId, og på forrige behandling via forrigeBehandlingId – slik utgjør behandlingene en singly-linked list over tid.

Livsløp: oppretting av ny behandling

BehandlingService.finnEllerOpprettBehandling(sakId, vurderingsbehovOgÅrsak)
│
├── Ingen tidligere behandling?
│ └──► opprettFørstegangsbehandling() (forrigeBehandlingId = null, ingen kopiering)
│
├── Forrige behandling er avsluttet?
│ └──► opprettRevurdering() ← kopier() kalles
│
├── Åpen fasttrack-behandling finnes?
│ └──► opprettRevurderingForranÅpenBehandling() ← kopier() kalles
│
└── Åpen ordinær behandling finnes?
└──► oppdaterVurderingsbehovOgÅrsak() (ingen ny behandling, ingen kopiering)

Hva skjer når kopier() kalles?

Etter at en ny Behandling er persistert, kaller BehandlingService GrunnlagKopierer.overfør(fra, til). GrunnlagKopiererImpl itererer over alle registrerte Repository-implementasjoner og kaller kopier(fraBehandlingId, tilBehandlingId) på hver enkelt.

BehandlingService
├── behandlingRepository.opprettBehandling(...) ← ny Behandling lagres
└── grunnlagKopierer.overfør(forrige.id, ny.id)
└── for each Repository:
repository.kopier(fra, til) ← nye DB-rader med tilBehandlingId

Kopiering lager nye rader i databasen knyttet til den nye behandlingen – den gamle behandlingen berøres ikke. Den nye behandlingen starter dermed med et komplett grunnlag fra forrige, og saksbehandler kan overstyre enkeltfelter uten å påvirke historikken.

Følgende kategorier kopieres:

KategoriEksempler
Faktagrunnlag (register)Inntekt, yrkesskade, uføre, barn, institusjonsopphold, tiltakspenger, dagpenger, opphold, medlemskap
Faktagrunnlag (saksbehandler)Sykdom, bistand, meldeplikt, arbeidsgiver, krav
DelvurderingerVilkårsresultat, samordning, stans/opphør, barnetillegg, underveis
BehandlingsdataVedtak, avklaringsbehov, brev, tilkjent ytelse, kontekstlogg
PersondataPersonopplysninger, PIP-data

Spesialtilfelle: revurdering foran åpen behandling

Når en fasttrack-hendelse ankommer mens det allerede finnes en åpen revurdering, settes den nye behandlingen inn mellom den avsluttede forrige og den åpne:

[Avsluttet FGB] ◄── [Åpen Revurdering A]

↓ ny fasttrack-hendelse

[Avsluttet FGB] ◄── [Ny Revurdering B] ◄── [Åpen Revurdering A]
│
└── kopier() fra FGB → B

Den nye behandlingen (B) må avsluttes atomært i samme transaksjon. Revurdering A sin forrigeBehandlingId flyttes til å peke på B.

Oppsummering – når kopieres det?

HendelseforrigeBehandlingIdkopier() kalles?
Ny førstegangsbehandlingnullNei
Ny revurdering (forrige avsluttet)forrige.idJa
Fasttrack foran åpen revurderingavsluttetFGB.idJa
Aktivitetspliktbehandlingforrige.id (hvis finnes)Ja
Klage / Oppfølging / SvarFraAndreinstansnullNei
Oppdatering av eksisterende åpen behandling—Nei

Types

Link copied to clipboard
class Behandling(val id: BehandlingId, forrigeBehandlingId: BehandlingId?, val referanse: BehandlingReferanse = BehandlingReferanse(), val sakId: SakId, val typeBehandling: TypeBehandling, var status: Status = Status.OPPRETTET, val vurderingsbehov: List<VurderingsbehovMedPeriode> = emptyList(), var stegTilstand: StegTilstand? = null, val årsakTilOpprettelse: ÅrsakTilOpprettelse?, val opprettetTidspunkt: LocalDateTime = LocalDateTime.now(), val versjon: Long) : Comparable<Behandling>
Link copied to clipboard
data class BehandlingId(val id: Long)

Representerer databaseId for en behandling - er ikke ment å dele utenfor domenet.

Link copied to clipboard
data class BehandlingMedVedtak(val saksnummer: Saksnummer, val id: BehandlingId, val forrigeBehandlingId: BehandlingId?, val referanse: BehandlingReferanse, val typeBehandling: TypeBehandling, val status: Status, val opprettetTidspunkt: LocalDateTime, val vedtakId: VedtakId, val vedtakstidspunkt: LocalDateTime, val virkningstidspunkt: LocalDate?, val vurderingsbehov: Set<Vurderingsbehov>, val årsakTilOpprettelse: ÅrsakTilOpprettelse?)
Link copied to clipboard
Link copied to clipboard
class BehandlingService(val grunnlagKopierer: GrunnlagKopierer, val sakRepository: SakRepository, val behandlingRepository: BehandlingRepository, val trukketSøknadService: TrukketSøknadService, val underveisService: UnderveisService, val avbrytAktivitetspliktbehandlingService: AvbrytAktivitetspliktbehandlingService, val unleashGateway: UnleashGateway)
Link copied to clipboard
class StegTilstand(val tidspunkt: LocalDateTime = LocalDateTime.now(), val stegStatus: StegStatus, val stegType: StegType) : Comparable<StegTilstand>
Link copied to clipboard
data class VurderingsbehovMedPeriode(val type: Vurderingsbehov, val oppdatertTid: LocalDateTime = LocalDateTime.now())
Link copied to clipboard
data class VurderingsbehovOgÅrsak(val vurderingsbehov: List<VurderingsbehovMedPeriode>, val årsak: ÅrsakTilOpprettelse, val opprettet: LocalDateTime = LocalDateTime.now(), val opprettetAv: Bruker? = null, val beskrivelse: String? = null)