Skip to content
This repository has been archived by the owner on Nov 5, 2024. It is now read-only.

Commit

Permalink
r Refactorering av Arbeidssoker - flytter bla tilstandene inn som ind…
Browse files Browse the repository at this point in the history
…re klasser

Dette er gjort for å gi tilgang til `tilstand` som jeg ønsker at overgangene selv skal ha kontroll på, og ikke overlate til hjelpefunksjoner som gjør det litt skjult.

Har også fjernet funksjonalitet for å håndtere `negative perioder` da jeg tror dette blir løst av å sette `tilDato` til dagen før.
  • Loading branch information
tlheen committed Jan 31, 2023
1 parent 38241ae commit b3a0a18
Show file tree
Hide file tree
Showing 8 changed files with 103 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,14 @@ class Arbeidssoker {

internal fun startPeriode(fraDato: LocalDateTime) {
this.arbeidssokerperioder.add(Arbeidssokerperiode(fraDato, null))
this.tilstand = AktivArbeidssokerState
}

internal fun avsluttPeriode(tilDato: LocalDateTime) {
sistePeriode()?.avslutt(tilDato) ?: throw IllegalStateException("Kan ikke avslutte en periode som ikke finnes")
this.tilstand = TidligereArbeidssokerState
}

internal fun droppSistePeriode() {
arbeidssokerperioder.remove(sistePeriode())
}

internal fun harVærtInaktivMerEnn28Dager() = sistePeriode()!!.tilDato!!.isBefore(LocalDateTime.now().minusDays(28))
Expand All @@ -47,107 +49,115 @@ class Arbeidssoker {
return arbeidssokerperioder
}

internal fun droppSistePeriode() {
arbeidssokerperioder.remove(sistePeriode())
private infix fun nyTilstand(tilstand: ArbeidssokerState) {
this.tilstand = tilstand
}
}

private interface ArbeidssokerState {
fun behandle(arbeidssoker: Arbeidssoker, ordinaerBrukerRegistrering: RegistrerArbeidssøker)
fun behandle(arbeidssoker: Arbeidssoker, reaktivering: ReaktiverArbeidssøker)
fun behandle(arbeidssoker: Arbeidssoker, formidlingsgruppeEndretEvent: FormidlingsgruppeEndret)
}

/**
* Ikke arbeidssøker betyr at du aldri har vært arbeidssøker.
*/
private object IkkeArbeidssokerState : ArbeidssokerState {
override fun behandle(arbeidssoker: Arbeidssoker, ordinaerBrukerRegistrering: RegistrerArbeidssøker) {
logger.info("Starter arbeidssøkerperiode som følge av ordinær registrering")
arbeidssoker.startPeriode(ordinaerBrukerRegistrering.opprettetTidspunkt())
}

override fun behandle(arbeidssoker: Arbeidssoker, reaktivering: ReaktiverArbeidssøker) {
logger.warn("Arbeidssøker har ingen tidligere arbeidssøkerperioder - kan derfor ikke reaktiveres")
return
}
/**
* Ikke arbeidssøker betyr at du aldri har vært arbeidssøker.
*/
private object IkkeArbeidssokerState : ArbeidssokerState {
override fun behandle(arbeidssoker: Arbeidssoker, ordinaerBrukerRegistrering: RegistrerArbeidssøker) {
logger.info("Starter arbeidssøkerperiode som følge av ordinær registrering")
arbeidssoker.startPeriode(ordinaerBrukerRegistrering.opprettetTidspunkt())
arbeidssoker nyTilstand AktivArbeidssokerState
}

override fun behandle(arbeidssoker: Arbeidssoker, formidlingsgruppeEndretEvent: FormidlingsgruppeEndret) {
if (!formidlingsgruppeEndretEvent.formidlingsgruppe().erArbeidssoker()) {
logger.warn("Forkaster formidlingsgruppeEndretEvent med " +
"${formidlingsgruppeEndretEvent.formidlingsgruppe()} da Arbeidssøker ikke har noe historikk")
override fun behandle(arbeidssoker: Arbeidssoker, reaktivering: ReaktiverArbeidssøker) {
logger.warn("Arbeidssøker har ingen tidligere arbeidssøkerperioder - kan derfor ikke reaktiveres")
return
}
logger.info("Arbeidssøkerperioden ble initiert av en formidlingsgruppe - ikke en ordinær/reaktivert registrering")
arbeidssoker.startPeriode(formidlingsgruppeEndretEvent.opprettetTidspunkt())
}
}

/**
* Aktiv arbeidssøker betyr at bruker har en åpen periode - at perioden ikke er avsluttet og at tildato er null.
*/
private object AktivArbeidssokerState : ArbeidssokerState {
override fun behandle(arbeidssoker: Arbeidssoker, ordinaerBrukerRegistrering: RegistrerArbeidssøker) {
logger.warn("Avviser OrdinaerBrukerRegistrering - Arbeidssøker er allerede aktiv")
override fun behandle(arbeidssoker: Arbeidssoker, formidlingsgruppeEndretEvent: FormidlingsgruppeEndret) {
if (!formidlingsgruppeEndretEvent.formidlingsgruppe().erArbeidssoker()) {
logger.warn("Forkaster formidlingsgruppeEndretEvent med " +
"${formidlingsgruppeEndretEvent.formidlingsgruppe()} da Arbeidssøker ikke har noe historikk")
return
}
logger.info("Arbeidssøkerperioden ble initiert av en formidlingsgruppe - ikke en ordinær/reaktivert registrering")
arbeidssoker.startPeriode(formidlingsgruppeEndretEvent.opprettetTidspunkt())
arbeidssoker nyTilstand AktivArbeidssokerState
}
}

override fun behandle(arbeidssoker: Arbeidssoker, reaktivering: ReaktiverArbeidssøker) {
logger.warn("Avviser Reaktivering - Arbeidssøker er allerede aktiv")
}
/**
* Aktiv arbeidssøker betyr at bruker har en åpen periode - at perioden ikke er avsluttet og at tildato er null.
*/
private object AktivArbeidssokerState : ArbeidssokerState {
override fun behandle(arbeidssoker: Arbeidssoker, ordinaerBrukerRegistrering: RegistrerArbeidssøker) {
logger.warn("Avviser OrdinaerBrukerRegistrering - Arbeidssøker er allerede aktiv")
}

override fun behandle(arbeidssoker: Arbeidssoker, formidlingsgruppeEndretEvent: FormidlingsgruppeEndret) {
if (formidlingsgruppeEndretEvent.formidlingsgruppe().erArbeidssoker()) {
logger.info("Avslutter arbeidssøkerperiode, og starter samtidig en ny som følge av " +
"${formidlingsgruppeEndretEvent.formidlingsgruppe()} fordi arbeidssøker allerede var aktiv")
arbeidssoker.avsluttGammelOgStartNyPeriode(formidlingsgruppeEndretEvent.opprettetTidspunkt())
override fun behandle(arbeidssoker: Arbeidssoker, reaktivering: ReaktiverArbeidssøker) {
logger.warn("Avviser Reaktivering - Arbeidssøker er allerede aktiv")
}

} else {
if (arbeidssoker.sistePeriode()!!.fraDato.toLocalDate() == formidlingsgruppeEndretEvent.opprettetTidspunkt().toLocalDate()) {
logger.warn("Dropper siste periode som følge av at vi mottar " +
"${formidlingsgruppeEndretEvent.formidlingsgruppe()} samme dag som perioden ble startet.")
arbeidssoker.droppSistePeriode()
override fun behandle(arbeidssoker: Arbeidssoker, formidlingsgruppeEndretEvent: FormidlingsgruppeEndret) {
if (formidlingsgruppeEndretEvent.formidlingsgruppe().erArbeidssoker()) {
logger.info("Avslutter arbeidssøkerperiode, og starter samtidig en ny som følge av " +
"${formidlingsgruppeEndretEvent.formidlingsgruppe()} fordi arbeidssøker allerede var aktiv")
arbeidssoker.avsluttGammelOgStartNyPeriode(formidlingsgruppeEndretEvent.opprettetTidspunkt())
arbeidssoker nyTilstand AktivArbeidssokerState

} else {
logger.info("Avslutter arbeiddssøkerperiode som følge av ${formidlingsgruppeEndretEvent.formidlingsgruppe()}")
arbeidssoker.avsluttPeriode(formidlingsgruppeEndretEvent.opprettetTidspunkt())
if (arbeidssoker.sistePeriode()!!.fraDato.toLocalDate() == formidlingsgruppeEndretEvent.opprettetTidspunkt().toLocalDate()) {
logger.warn("Dropper siste periode som følge av at vi mottar " +
"${formidlingsgruppeEndretEvent.formidlingsgruppe()} samme dag som perioden ble startet.")
arbeidssoker.droppSistePeriode()

} else {
logger.info("Avslutter arbeiddssøkerperiode som følge av ${formidlingsgruppeEndretEvent.formidlingsgruppe()}")
arbeidssoker.avsluttPeriode(formidlingsgruppeEndretEvent.opprettetTidspunkt())
}

if (arbeidssoker.sistePeriode() == null) {
arbeidssoker nyTilstand IkkeArbeidssokerState
} else {
arbeidssoker nyTilstand TidligereArbeidssokerState
}
}
}
}
}

/**
* Tidligere arbeidssøker betyr at du tidligere har vært arbeidssøker, men ikke er det lenger.
*/
private object TidligereArbeidssokerState : ArbeidssokerState {
override fun behandle(arbeidssoker: Arbeidssoker, ordinaerBrukerRegistrering: RegistrerArbeidssøker) {
logger.info("Starter arbeidssøkerperiode som følge av ordinær registrering")
arbeidssoker.startPeriode(ordinaerBrukerRegistrering.opprettetTidspunkt())
}
/**
* Tidligere arbeidssøker betyr at du tidligere har vært arbeidssøker, men ikke er det lenger.
*/
private object TidligereArbeidssokerState : ArbeidssokerState {
override fun behandle(arbeidssoker: Arbeidssoker, ordinaerBrukerRegistrering: RegistrerArbeidssøker) {
logger.info("Starter arbeidssøkerperiode som følge av ordinær registrering")
arbeidssoker.startPeriode(ordinaerBrukerRegistrering.opprettetTidspunkt())
arbeidssoker nyTilstand AktivArbeidssokerState
}

override fun behandle(arbeidssoker: Arbeidssoker, reaktivering: ReaktiverArbeidssøker) {
if (arbeidssoker.ikkeHarTidligerePerioder())
throw IllegalStateException("Tilstanden er feil - TidligereArbeidssokerState skal alltid ha tidligere perioder.")
override fun behandle(arbeidssoker: Arbeidssoker, reaktivering: ReaktiverArbeidssøker) {
if (arbeidssoker.ikkeHarTidligerePerioder())
throw IllegalStateException("Tilstanden er feil - TidligereArbeidssokerState skal alltid ha tidligere perioder.")

if (arbeidssoker.harVærtInaktivMerEnn28Dager()) {
logger.warn("Arbeidssøker har vært inaktiv mer enn 28 dager - kan derfor ikke reaktiveres")
return
if (arbeidssoker.harVærtInaktivMerEnn28Dager()) {
logger.warn("Arbeidssøker har vært inaktiv mer enn 28 dager - kan derfor ikke reaktiveres")
return
}
logger.info("Starter arbeidssøkerperiode som følge av reaktivering")
arbeidssoker.startPeriode(reaktivering.opprettetTidspunkt())
arbeidssoker nyTilstand AktivArbeidssokerState
}
logger.info("Starter arbeidssøkerperiode som følge av reaktivering")
arbeidssoker.startPeriode(reaktivering.opprettetTidspunkt())
}

override fun behandle(arbeidssoker: Arbeidssoker, formidlingsgruppeEndretEvent: FormidlingsgruppeEndret) {
if (!formidlingsgruppeEndretEvent.formidlingsgruppe().erArbeidssoker()) {
logger.info("Avviser FormidlingsgruppeEndretEvent ${formidlingsgruppeEndretEvent.formidlingsgruppe()} - Arbeidssøker er allerede inaktiv")
return
}
override fun behandle(arbeidssoker: Arbeidssoker, formidlingsgruppeEndretEvent: FormidlingsgruppeEndret) {
if (!formidlingsgruppeEndretEvent.formidlingsgruppe().erArbeidssoker()) {
logger.info("Avviser FormidlingsgruppeEndretEvent ${formidlingsgruppeEndretEvent.formidlingsgruppe()} - Arbeidssøker er allerede inaktiv")
return
}

if (arbeidssoker.sistePeriode()!!.tilDato!!.toLocalDate() == formidlingsgruppeEndretEvent.opprettetTidspunkt().toLocalDate()) {
logger.info("Arbeidssøkerperiode ble endret samme dag. Forrige periode blir derfor negativ for at ikke tilDato på forrige periode skal være lik fraDato på neste.")
arbeidssoker.sistePeriode()!!.korrigerForNegativPeriode()
logger.warn("Arbeidssøkerperioden ble initiert av en formidlingsgruppe - ikke en ordinær/reaktivert registrering")
arbeidssoker.startPeriode(formidlingsgruppeEndretEvent.opprettetTidspunkt())
arbeidssoker nyTilstand AktivArbeidssokerState
}
logger.warn("Arbeidssøkerperioden ble initiert av en formidlingsgruppe - ikke en ordinær/reaktivert registrering")
arbeidssoker.startPeriode(formidlingsgruppeEndretEvent.opprettetTidspunkt())
}
}

private interface ArbeidssokerState {
fun behandle(arbeidssoker: Arbeidssoker, ordinaerBrukerRegistrering: RegistrerArbeidssøker)
fun behandle(arbeidssoker: Arbeidssoker, reaktivering: ReaktiverArbeidssøker)
fun behandle(arbeidssoker: Arbeidssoker, formidlingsgruppeEndretEvent: FormidlingsgruppeEndret)
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ import java.time.LocalDateTime

data class Arbeidssokerperiode(var fraDato: LocalDateTime, var tilDato: LocalDateTime?) {

/**
* Setter tilDato = dagen før kl. 23:59:59
*/
fun avslutt(tilDato: LocalDateTime) {
if (this.tilDato != null) throw IllegalStateException("Arbeidssokerperiode har allerede en tilDato - kan ikke avslutte en allerede avsluttet periode")
this.tilDato = atTheEndOfYesterday(tilDato)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.fo.veilarbregistrering.db.arbeidssoker
import no.nav.fo.veilarbregistrering.arbeidssoker.perioder.Arbeidssokerperiode
import no.nav.fo.veilarbregistrering.arbeidssoker.perioder.Arbeidssokerperioder
import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.Formidlingsgruppe
import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.db.Formidlingsgruppeendring
import no.nav.fo.veilarbregistrering.bruker.Periode
import java.time.LocalDate

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package no.nav.fo.veilarbregistrering.db.arbeidssoker
package no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.db

import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.Formidlingsgruppe
import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.FormidlingsgruppeEndretEvent
import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.FormidlingsgruppeRepository
import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.Operation
import no.nav.fo.veilarbregistrering.arbeidssoker.perioder.Arbeidssokerperioder
import no.nav.fo.veilarbregistrering.bruker.Foedselsnummer
import no.nav.fo.veilarbregistrering.db.arbeidssoker.ArbeidssokerperioderMapper
import no.nav.fo.veilarbregistrering.log.logger
import org.springframework.dao.DataIntegrityViolationException
import org.springframework.jdbc.core.RowMapper
Expand Down Expand Up @@ -109,7 +110,7 @@ class FormidlingsgruppeRepositoryImpl(private val db: NamedParameterJdbcTemplate
}

override fun hentFoedselsnummerIBolk(offset: Int, limit: Int): List<Foedselsnummer> {
val sql = "SELECT $FOEDSELSNUMMER FROM $FORMIDLINGSGRUPPE ORDER BY ${FORMIDLINGSGRUPPE_ENDRET} DESC " +
val sql = "SELECT $FOEDSELSNUMMER FROM $FORMIDLINGSGRUPPE ORDER BY $FORMIDLINGSGRUPPE_ENDRET DESC " +
"LIMIT $limit OFFSET $offset"
return db.query(sql) { rs, _ -> Foedselsnummer(rs.getString(FOEDSELSNUMMER)) }
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package no.nav.fo.veilarbregistrering.db.arbeidssoker
package no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.db

import java.sql.Timestamp

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package no.nav.fo.veilarbregistrering.db.arbeidssoker
package no.nav.fo.veilarbregistrering.arbeidssoker.meldekort.db

import no.nav.fo.veilarbregistrering.arbeidssoker.meldekort.MeldekortEvent
import no.nav.fo.veilarbregistrering.arbeidssoker.meldekort.MeldekortPeriode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import no.nav.fo.veilarbregistrering.aktorIdCache.AktorIdCacheRepository
import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.FormidlingsgruppeRepository
import no.nav.fo.veilarbregistrering.arbeidssoker.meldekort.MeldekortRepository
import no.nav.fo.veilarbregistrering.db.aktorIdCache.AktorIdCacheRepositoryImpl
import no.nav.fo.veilarbregistrering.db.arbeidssoker.FormidlingsgruppeRepositoryImpl
import no.nav.fo.veilarbregistrering.db.arbeidssoker.MeldekortRepositoryImpl
import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.db.FormidlingsgruppeRepositoryImpl
import no.nav.fo.veilarbregistrering.arbeidssoker.meldekort.db.MeldekortRepositoryImpl
import no.nav.fo.veilarbregistrering.db.oppgave.OppgaveRepositoryImpl
import no.nav.fo.veilarbregistrering.db.profilering.ProfileringRepositoryImpl
import no.nav.fo.veilarbregistrering.db.registrering.*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.nav.fo.veilarbregistrering.db.arbeidssoker

import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.db.Formidlingsgruppeendring
import no.nav.fo.veilarbregistrering.arbeidssoker.perioder.Arbeidssokerperiode
import no.nav.fo.veilarbregistrering.arbeidssoker.perioder.Arbeidssokerperioder
import no.nav.fo.veilarbregistrering.bruker.Periode
Expand Down

0 comments on commit b3a0a18

Please sign in to comment.