diff --git a/database/src/main/kotlin/no/nav/su/se/bakover/database/EksterneIverksettingsstegMapper.kt b/database/src/main/kotlin/no/nav/su/se/bakover/database/EksterneIverksettingsstegMapper.kt deleted file mode 100644 index 24f2556f09..0000000000 --- a/database/src/main/kotlin/no/nav/su/se/bakover/database/EksterneIverksettingsstegMapper.kt +++ /dev/null @@ -1,65 +0,0 @@ -package no.nav.su.se.bakover.database - -import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag -import no.nav.su.se.bakover.domain.journal.JournalpostId - -internal object EksterneIverksettingsstegEtterUtbetalingMapper { - fun idToObject( - iverksattJournalpostId: JournalpostId?, - iverksattBrevbestillingId: BrevbestillingId? - ) = when { - iverksattJournalpostId == null && iverksattBrevbestillingId == null -> EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering - iverksattJournalpostId != null && iverksattBrevbestillingId != null -> EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( - journalpostId = iverksattJournalpostId, - brevbestillingId = iverksattBrevbestillingId - ) - iverksattJournalpostId != null -> EksterneIverksettingsstegEtterUtbetaling.Journalført( - iverksattJournalpostId - ) - else -> throw IllegalStateException("Kunne ikke bestemme eksterne iverksettingssteg for innvilgelse, iverksattJournalpostId:$iverksattJournalpostId, iverksattBrevbestillingId:$iverksattBrevbestillingId") - } - - fun iverksattJournalpostId(e: EksterneIverksettingsstegEtterUtbetaling): JournalpostId? = - when (e) { - is EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering -> null - is EksterneIverksettingsstegEtterUtbetaling.Journalført -> e.journalpostId - is EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev -> e.journalpostId - } - - fun iverksattBrevbestillingId(e: EksterneIverksettingsstegEtterUtbetaling): BrevbestillingId? = - when (e) { - is EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering, - is EksterneIverksettingsstegEtterUtbetaling.Journalført -> null - is EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev -> e.brevbestillingId - } -} - -internal object EksterneIverksettingsstegForAvslagMapper { - fun idToObject( - iverksattJournalpostId: JournalpostId?, - iverksattBrevbestillingId: BrevbestillingId? - ) = when { - iverksattJournalpostId != null && iverksattBrevbestillingId != null -> EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( - journalpostId = iverksattJournalpostId, - brevbestillingId = iverksattBrevbestillingId - ) - iverksattJournalpostId != null -> EksterneIverksettingsstegForAvslag.Journalført( - iverksattJournalpostId - ) - else -> throw IllegalStateException("Kunne ikke bestemme eksterne iverksettingssteg for avslag, iverksattJournalpostId:$iverksattJournalpostId, iverksattBrevbestillingId:$iverksattBrevbestillingId") - } - - fun iverksattJournalpostId(e: EksterneIverksettingsstegForAvslag): JournalpostId? = - when (e) { - is EksterneIverksettingsstegForAvslag.Journalført -> e.journalpostId - is EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev -> e.journalpostId - } - - fun iverksattBrevbestillingId(e: EksterneIverksettingsstegForAvslag): BrevbestillingId? = - when (e) { - is EksterneIverksettingsstegForAvslag.Journalført -> null - is EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev -> e.brevbestillingId - } -} diff --git a/database/src/main/kotlin/no/nav/su/se/bakover/database/revurdering/RevurderingPostgresRepo.kt b/database/src/main/kotlin/no/nav/su/se/bakover/database/revurdering/RevurderingPostgresRepo.kt index c7c21fa737..b7fb51e4cd 100644 --- a/database/src/main/kotlin/no/nav/su/se/bakover/database/revurdering/RevurderingPostgresRepo.kt +++ b/database/src/main/kotlin/no/nav/su/se/bakover/database/revurdering/RevurderingPostgresRepo.kt @@ -5,7 +5,6 @@ import kotliquery.Row import no.nav.su.se.bakover.common.UUID30 import no.nav.su.se.bakover.common.objectMapper import no.nav.su.se.bakover.common.periode.Periode -import no.nav.su.se.bakover.database.EksterneIverksettingsstegEtterUtbetalingMapper import no.nav.su.se.bakover.database.Session import no.nav.su.se.bakover.database.beregning.PersistertBeregning import no.nav.su.se.bakover.database.hent @@ -20,6 +19,7 @@ import no.nav.su.se.bakover.database.withSession import no.nav.su.se.bakover.domain.NavIdentBruker import no.nav.su.se.bakover.domain.NavIdentBruker.Saksbehandler import no.nav.su.se.bakover.domain.brev.BrevbestillingId +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.oppgave.OppgaveId @@ -131,7 +131,7 @@ internal class RevurderingPostgresRepo( oppgaveId = OppgaveId(oppgaveId!!), attestant = NavIdentBruker.Attestant(attestant!!), utbetalingId = UUID30.fromString(utbetalingId!!), - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetalingMapper.idToObject( + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId, iverksattBrevbestillingId ) @@ -332,10 +332,10 @@ internal class RevurderingPostgresRepo( "revurderingsType" to RevurderingsType.IVERKSATT.toString(), "attestant" to revurdering.attestant.navIdent, "utbetalingId" to revurdering.utbetalingId, - "iverksattjournalpostid" to EksterneIverksettingsstegEtterUtbetalingMapper.iverksattJournalpostId( + "iverksattjournalpostid" to JournalføringOgBrevdistribusjon.iverksattJournalpostId( revurdering.eksterneIverksettingsteg )?.toString(), - "iverksattbrevbestillingid" to EksterneIverksettingsstegEtterUtbetalingMapper.iverksattBrevbestillingId( + "iverksattbrevbestillingid" to JournalføringOgBrevdistribusjon.iverksattBrevbestillingId( revurdering.eksterneIverksettingsteg )?.toString(), ), diff --git "a/database/src/main/kotlin/no/nav/su/se/bakover/database/s\303\270knadsbehandling/S\303\270knadsbehandlingPostgresRepo.kt" "b/database/src/main/kotlin/no/nav/su/se/bakover/database/s\303\270knadsbehandling/S\303\270knadsbehandlingPostgresRepo.kt" index 80e159fcc1..87f16a099a 100644 --- "a/database/src/main/kotlin/no/nav/su/se/bakover/database/s\303\270knadsbehandling/S\303\270knadsbehandlingPostgresRepo.kt" +++ "b/database/src/main/kotlin/no/nav/su/se/bakover/database/s\303\270knadsbehandling/S\303\270knadsbehandlingPostgresRepo.kt" @@ -4,8 +4,6 @@ import com.fasterxml.jackson.module.kotlin.readValue import kotliquery.Row import no.nav.su.se.bakover.common.UUID30 import no.nav.su.se.bakover.common.objectMapper -import no.nav.su.se.bakover.database.EksterneIverksettingsstegEtterUtbetalingMapper -import no.nav.su.se.bakover.database.EksterneIverksettingsstegForAvslagMapper import no.nav.su.se.bakover.database.Session import no.nav.su.se.bakover.database.beregning.PersistertBeregning import no.nav.su.se.bakover.database.beregning.toSnapshot @@ -24,6 +22,7 @@ import no.nav.su.se.bakover.domain.Søknad import no.nav.su.se.bakover.domain.behandling.Attestering import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon import no.nav.su.se.bakover.domain.brev.BrevbestillingId +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.oppgave.OppgaveId @@ -277,7 +276,7 @@ internal class SøknadsbehandlingPostgresRepo( ) } BehandlingsStatus.IVERKSATT_INNVILGET -> { - val eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetalingMapper.idToObject( + val eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId, iverksattBrevbestillingId ) @@ -299,7 +298,7 @@ internal class SøknadsbehandlingPostgresRepo( ) } BehandlingsStatus.IVERKSATT_AVSLAG -> { - val eksterneIverksettingsteg = EksterneIverksettingsstegForAvslagMapper.idToObject( + val eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId, iverksattBrevbestillingId ) @@ -425,8 +424,8 @@ internal class SøknadsbehandlingPostgresRepo( listOf( "attestering" to objectMapper.writeValueAsString(søknadsbehandling.attestering), "utbetalingId" to søknadsbehandling.utbetalingId, - "iverksattBrevbestillingId" to EksterneIverksettingsstegEtterUtbetalingMapper.iverksattBrevbestillingId(søknadsbehandling.eksterneIverksettingsteg)?.toString(), - "iverksattJournalpostId" to EksterneIverksettingsstegEtterUtbetalingMapper.iverksattJournalpostId(søknadsbehandling.eksterneIverksettingsteg)?.toString(), + "iverksattBrevbestillingId" to JournalføringOgBrevdistribusjon.iverksattBrevbestillingId(søknadsbehandling.eksterneIverksettingsteg)?.toString(), + "iverksattJournalpostId" to JournalføringOgBrevdistribusjon.iverksattJournalpostId(søknadsbehandling.eksterneIverksettingsteg)?.toString(), ) ), session = session @@ -443,8 +442,8 @@ internal class SøknadsbehandlingPostgresRepo( params = defaultParams(søknadsbehandling).plus( listOf( "attestering" to objectMapper.writeValueAsString(søknadsbehandling.attestering), - "iverksattBrevbestillingId" to EksterneIverksettingsstegForAvslagMapper.iverksattBrevbestillingId(søknadsbehandling.eksterneIverksettingsteg)?.toString(), - "iverksattJournalpostId" to EksterneIverksettingsstegForAvslagMapper.iverksattJournalpostId(søknadsbehandling.eksterneIverksettingsteg)?.toString(), + "iverksattBrevbestillingId" to JournalføringOgBrevdistribusjon.iverksattBrevbestillingId(søknadsbehandling.eksterneIverksettingsteg)?.toString(), + "iverksattJournalpostId" to JournalføringOgBrevdistribusjon.iverksattJournalpostId(søknadsbehandling.eksterneIverksettingsteg)?.toString(), ) ), session = session diff --git a/database/src/main/kotlin/no/nav/su/se/bakover/database/vedtak/VedtakPosgresRepo.kt b/database/src/main/kotlin/no/nav/su/se/bakover/database/vedtak/VedtakPosgresRepo.kt index b4e86e907c..a0974ff31a 100644 --- a/database/src/main/kotlin/no/nav/su/se/bakover/database/vedtak/VedtakPosgresRepo.kt +++ b/database/src/main/kotlin/no/nav/su/se/bakover/database/vedtak/VedtakPosgresRepo.kt @@ -2,10 +2,9 @@ package no.nav.su.se.bakover.database.vedtak import com.fasterxml.jackson.module.kotlin.readValue import kotliquery.Row +import no.nav.su.se.bakover.common.UUID30 import no.nav.su.se.bakover.common.objectMapper import no.nav.su.se.bakover.common.periode.Periode -import no.nav.su.se.bakover.database.EksterneIverksettingsstegEtterUtbetalingMapper -import no.nav.su.se.bakover.database.EksterneIverksettingsstegForAvslagMapper import no.nav.su.se.bakover.database.Session import no.nav.su.se.bakover.database.beregning.PersistertBeregning import no.nav.su.se.bakover.database.beregning.toSnapshot @@ -22,6 +21,7 @@ import no.nav.su.se.bakover.database.withTransaction import no.nav.su.se.bakover.domain.NavIdentBruker import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon import no.nav.su.se.bakover.domain.brev.BrevbestillingId +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.revurdering.Revurdering @@ -34,10 +34,9 @@ interface VedtakRepo { fun hentForSakId(sakId: UUID, session: Session? = null): List fun hent(id: UUID, session: Session? = null): Vedtak? fun lagre(vedtak: Vedtak) - fun oppdaterJournalpostForSøknadsbehandling(søknadsbehandlingId: UUID, journalpostId: JournalpostId) - fun oppdaterBrevbestillingIdForSøknadsbehandling(søknadsbehandlingId: UUID, brevbestillingId: BrevbestillingId) - fun oppdaterJournalpostForRevurdering(revurderingId: UUID, journalpostId: JournalpostId) - fun oppdaterBrevbestillingIdForRevurdering(revurderingId: UUID, brevbestillingId: BrevbestillingId) + fun hentForUtbetaling(utbetalingId: UUID30): Vedtak.InnvilgetStønad + fun hentUtenJournalpost(): List + fun hentUtenBrevbestilling(): List } internal class VedtakPosgresRepo( @@ -65,82 +64,42 @@ internal class VedtakPosgresRepo( } } - override fun oppdaterJournalpostForSøknadsbehandling(søknadsbehandlingId: UUID, journalpostId: JournalpostId) { - dataSource.withSession { + override fun hentForUtbetaling(utbetalingId: UUID30): Vedtak.InnvilgetStønad { + return dataSource.withSession { session -> """ - UPDATE vedtak - SET iverksattjournalpostid = :iverksattjournalpostid - FROM behandling_vedtak - WHERE behandling_vedtak.vedtakid = vedtak.id - AND behandling_vedtak.søknadsbehandlingid = :soknadsbehandlingid + SELECT * + FROM vedtak + WHERE utbetalingId = :utbetalingId """.trimIndent() - .oppdatering( - mapOf( - "iverksattjournalpostid" to journalpostId, - "soknadsbehandlingid" to søknadsbehandlingId - ), - it - ) + .hent(mapOf("utbetalingId" to utbetalingId), session) { + it.toVedtak(session) + } as Vedtak.InnvilgetStønad } } - override fun oppdaterBrevbestillingIdForSøknadsbehandling( - søknadsbehandlingId: UUID, - brevbestillingId: BrevbestillingId - ) { - dataSource.withSession { + override fun hentUtenJournalpost(): List { + return dataSource.withSession { session -> """ - UPDATE vedtak - SET iverksattbrevbestillingid = :iverksattbrevbestillingid - FROM behandling_vedtak - WHERE behandling_vedtak.vedtakid = vedtak.id - AND behandling_vedtak.søknadsbehandlingid = :soknadsbehandlingid + SELECT * + FROM vedtak + WHERE iverksattJournalpostId is null and iverksattBrevbestillingId is null """.trimIndent() - .oppdatering( - mapOf( - "iverksattbrevbestillingid" to brevbestillingId, - "soknadsbehandlingid" to søknadsbehandlingId - ), - it - ) - } - } - - override fun oppdaterJournalpostForRevurdering(revurderingId: UUID, journalpostId: JournalpostId) { - dataSource.withSession { - """ - UPDATE vedtak - SET iverksattjournalpostid = :iverksattjournalpostid - FROM behandling_vedtak - WHERE behandling_vedtak.vedtakid = vedtak.id - AND behandling_vedtak.revurderingId = :revurderingId - """.trimIndent() - .oppdatering( - mapOf( - "iverksattjournalpostid" to journalpostId, - "revurderingId" to revurderingId - ), - it - ) + .hentListe(emptyMap(), session) { + it.toVedtak(session) + } } } - override fun oppdaterBrevbestillingIdForRevurdering(revurderingId: UUID, brevbestillingId: BrevbestillingId) { - dataSource.withSession { + override fun hentUtenBrevbestilling(): List { + return dataSource.withSession { session -> """ - UPDATE vedtak - SET iverksattbrevbestillingid = :iverksattbrevbestillingid - FROM behandling_vedtak - WHERE behandling_vedtak.vedtakid = vedtak.id - AND behandling_vedtak.revurderingId = :revurderingId + SELECT * + FROM vedtak + WHERE iverksattJournalpostId is not null and iverksattBrevbestillingId is null """.trimIndent() - .oppdatering( - mapOf( - "iverksattbrevbestillingid" to brevbestillingId, - "revurderingId" to revurderingId - ), - it - ) + .hentListe(emptyMap(), session) { + it.toVedtak(session) + } } } @@ -191,7 +150,7 @@ internal class VedtakPosgresRepo( saksbehandler = saksbehandler, attestant = attestant, utbetalingId = utbetalingId, - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetalingMapper.idToObject( + journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId, iverksattBrevbestillingId ) @@ -204,7 +163,7 @@ internal class VedtakPosgresRepo( beregning = beregning, saksbehandler = saksbehandler, attestant = attestant, - eksterneIverksettingsteg = EksterneIverksettingsstegForAvslagMapper.idToObject( + journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId, iverksattBrevbestillingId ) @@ -216,7 +175,7 @@ internal class VedtakPosgresRepo( behandlingsinformasjon = behandlingsinformasjon, saksbehandler = saksbehandler, attestant = attestant, - eksterneIverksettingsteg = EksterneIverksettingsstegForAvslagMapper.idToObject( + journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId, iverksattBrevbestillingId ) @@ -228,7 +187,7 @@ internal class VedtakPosgresRepo( private fun lagre(vedtak: Vedtak.InnvilgetStønad) { dataSource.withTransaction { tx -> """ - insert into vedtak( + INSERT INTO vedtak( id, opprettet, fraOgMed, @@ -241,7 +200,7 @@ internal class VedtakPosgresRepo( beregning, iverksattjournalpostid, iverksattbrevbestillingid - ) values ( + ) VALUES ( :id, :opprettet, :fraOgMed, @@ -254,7 +213,9 @@ internal class VedtakPosgresRepo( to_json(:beregning::json), :iverksattjournalpostId, :iverksattbrevbestillingId - ) + ) ON CONFLICT(id) DO UPDATE SET + iverksattjournalpostid = :iverksattjournalpostId, + iverksattbrevbestillingid = :iverksattbrevbestillingId """.trimIndent() .oppdatering( mapOf( @@ -268,11 +229,11 @@ internal class VedtakPosgresRepo( "simulering" to objectMapper.writeValueAsString(vedtak.simulering), "beregning" to objectMapper.writeValueAsString(vedtak.beregning.toSnapshot()), "behandlingsinformasjon" to objectMapper.writeValueAsString(vedtak.behandlingsinformasjon), - "iverksattjournalpostId" to EksterneIverksettingsstegEtterUtbetalingMapper.iverksattJournalpostId( - vedtak.eksterneIverksettingsteg + "iverksattjournalpostId" to JournalføringOgBrevdistribusjon.iverksattJournalpostId( + vedtak.journalføringOgBrevdistribusjon )?.toString(), - "iverksattbrevbestillingId" to EksterneIverksettingsstegEtterUtbetalingMapper.iverksattBrevbestillingId( - vedtak.eksterneIverksettingsteg + "iverksattbrevbestillingId" to JournalføringOgBrevdistribusjon.iverksattBrevbestillingId( + vedtak.journalføringOgBrevdistribusjon )?.toString(), ), tx @@ -333,7 +294,9 @@ internal class VedtakPosgresRepo( to_json(:beregning::json), :iverksattjournalpostId, :iverksattbrevbestillingId - ) + ) ON CONFLICT(id) DO UPDATE SET + iverksattjournalpostid = :iverksattjournalpostId, + iverksattbrevbestillingid = :iverksattbrevbestillingId """.trimIndent() .oppdatering( mapOf( @@ -345,11 +308,11 @@ internal class VedtakPosgresRepo( "attestant" to vedtak.attestant, "beregning" to beregning?.let { objectMapper.writeValueAsString(it.toSnapshot()) }, "behandlingsinformasjon" to objectMapper.writeValueAsString(vedtak.behandlingsinformasjon), - "iverksattjournalpostId" to EksterneIverksettingsstegForAvslagMapper.iverksattJournalpostId( - vedtak.eksterneIverksettingsteg + "iverksattjournalpostId" to JournalføringOgBrevdistribusjon.iverksattJournalpostId( + vedtak.journalføringOgBrevdistribusjon )?.toString(), - "iverksattbrevbestillingId" to EksterneIverksettingsstegForAvslagMapper.iverksattBrevbestillingId( - vedtak.eksterneIverksettingsteg + "iverksattbrevbestillingId" to JournalføringOgBrevdistribusjon.iverksattBrevbestillingId( + vedtak.journalføringOgBrevdistribusjon )?.toString(), ), tx @@ -403,7 +366,7 @@ internal class VedtakPosgresRepo( :sakId, :soknadsbehandlingId, :revurderingId - ) + ) ON CONFLICT ON CONSTRAINT unique_vedtakid DO NOTHING """.trimIndent() .oppdatering( map, diff --git a/database/src/main/kotlin/no/nav/su/se/bakover/database/vedtak/snapshot/VedtakssnapshotJson.kt b/database/src/main/kotlin/no/nav/su/se/bakover/database/vedtak/snapshot/VedtakssnapshotJson.kt index 2095e686eb..9a5c406330 100644 --- a/database/src/main/kotlin/no/nav/su/se/bakover/database/vedtak/snapshot/VedtakssnapshotJson.kt +++ b/database/src/main/kotlin/no/nav/su/se/bakover/database/vedtak/snapshot/VedtakssnapshotJson.kt @@ -9,8 +9,7 @@ import no.nav.su.se.bakover.database.vedtak.snapshot.VedtakssnapshotJson.Innvilg import no.nav.su.se.bakover.domain.Søknad import no.nav.su.se.bakover.domain.behandling.Attestering import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.oppdrag.Utbetaling import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling @@ -103,7 +102,7 @@ internal sealed class VedtakssnapshotJson { // TODO jah: Denne vil alltid være null for innvilgelse siden vi ikke gjør dette før vi får kvitteringen iverksattJournalpostId = eksterneIverksettingsteg.journalpostId()?.toString(), // TODO jah: Denne vil alltid være null for innvilgelse siden vi ikke gjør dette før vi får kvitteringen - iverksattBrevbestillingId = (eksterneIverksettingsteg as? EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev)?.brevbestillingId?.toString(), + iverksattBrevbestillingId = (eksterneIverksettingsteg as? JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev)?.brevbestillingId?.toString(), beregning = beregning.toSnapshot(), behandlingsinformasjon = behandlingsinformasjon, behandlingsresultat = BehandlingsresultatJson( @@ -126,8 +125,8 @@ internal sealed class VedtakssnapshotJson { saksbehandler = saksbehandler.toString(), attestering = attestering, oppgaveId = oppgaveId.toString(), - iverksattJournalpostId = eksterneIverksettingsteg.journalpostId.toString(), - iverksattBrevbestillingId = (eksterneIverksettingsteg as? EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev)?.brevbestillingId?.toString(), + iverksattJournalpostId = eksterneIverksettingsteg.journalpostId()?.toString(), + iverksattBrevbestillingId = (eksterneIverksettingsteg as? JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev)?.brevbestillingId?.toString(), beregning = if (this is Søknadsbehandling.Iverksatt.Avslag.MedBeregning) beregning.toSnapshot() else null, behandlingsinformasjon = behandlingsinformasjon, behandlingsresultat = BehandlingsresultatJson( diff --git a/database/src/main/resources/db/migration/V65__add_behandling_vedtak_constraint.sql b/database/src/main/resources/db/migration/V65__add_behandling_vedtak_constraint.sql new file mode 100644 index 0000000000..5d9a54f675 --- /dev/null +++ b/database/src/main/resources/db/migration/V65__add_behandling_vedtak_constraint.sql @@ -0,0 +1 @@ +ALTER TABLE behandling_vedtak ADD CONSTRAINT unique_vedtakid UNIQUE (vedtakid); \ No newline at end of file diff --git a/database/src/test/kotlin/no/nav/su/se/bakover/database/EksterneIverksettingsstegMapperTest.kt "b/database/src/test/kotlin/no/nav/su/se/bakover/database/Journalf\303\270ringOgBrevdistribusjonTest.kt" similarity index 50% rename from database/src/test/kotlin/no/nav/su/se/bakover/database/EksterneIverksettingsstegMapperTest.kt rename to "database/src/test/kotlin/no/nav/su/se/bakover/database/Journalf\303\270ringOgBrevdistribusjonTest.kt" index 0e33c45511..c58a6c2863 100644 --- a/database/src/test/kotlin/no/nav/su/se/bakover/database/EksterneIverksettingsstegMapperTest.kt +++ "b/database/src/test/kotlin/no/nav/su/se/bakover/database/Journalf\303\270ringOgBrevdistribusjonTest.kt" @@ -2,56 +2,55 @@ package no.nav.su.se.bakover.database import io.kotest.matchers.shouldBe import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -internal class EksterneIverksettingsstegMapperTest { +internal class JournalføringOgBrevdistribusjonTest { @Nested inner class EtterUtbetaling { @Test fun `manglende journalpostid og brevbestillingsid ger status venterPåKvittering`() { - EksterneIverksettingsstegEtterUtbetalingMapper.idToObject( + JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId = null, iverksattBrevbestillingId = null - ) shouldBe EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering.also { - EksterneIverksettingsstegEtterUtbetalingMapper.iverksattJournalpostId(it) shouldBe null - EksterneIverksettingsstegEtterUtbetalingMapper.iverksattBrevbestillingId(it) shouldBe null + ) shouldBe JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert.also { + JournalføringOgBrevdistribusjon.iverksattJournalpostId(it) shouldBe null + JournalføringOgBrevdistribusjon.iverksattBrevbestillingId(it) shouldBe null } } @Test fun `kun journalpostid ger status journalført`() { - EksterneIverksettingsstegEtterUtbetalingMapper.idToObject( + JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId = JournalpostId("13"), iverksattBrevbestillingId = null - ) shouldBe EksterneIverksettingsstegEtterUtbetaling.Journalført(JournalpostId("13")).also { - EksterneIverksettingsstegEtterUtbetalingMapper.iverksattJournalpostId(it) shouldBe JournalpostId("13") - EksterneIverksettingsstegEtterUtbetalingMapper.iverksattBrevbestillingId(it) shouldBe null + ) shouldBe JournalføringOgBrevdistribusjon.Journalført(JournalpostId("13")).also { + JournalføringOgBrevdistribusjon.iverksattJournalpostId(it) shouldBe JournalpostId("13") + JournalføringOgBrevdistribusjon.iverksattBrevbestillingId(it) shouldBe null } } @Test fun `både journalpostid og brevbestillingsid ger status JournalførtOgDistribuertBrev`() { - EksterneIverksettingsstegEtterUtbetalingMapper.idToObject( + JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId = JournalpostId("13"), iverksattBrevbestillingId = BrevbestillingId("45") - ) shouldBe EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( + ) shouldBe JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( JournalpostId("13"), BrevbestillingId("45") ).also { - EksterneIverksettingsstegEtterUtbetalingMapper.iverksattJournalpostId(it) shouldBe JournalpostId("13") - EksterneIverksettingsstegEtterUtbetalingMapper.iverksattBrevbestillingId(it) shouldBe BrevbestillingId("45") + JournalføringOgBrevdistribusjon.iverksattJournalpostId(it) shouldBe JournalpostId("13") + JournalføringOgBrevdistribusjon.iverksattBrevbestillingId(it) shouldBe BrevbestillingId("45") } } @Test fun `brevbestillingsid uten journalpostid skal kaste exception`() { assertThrows { - EksterneIverksettingsstegEtterUtbetalingMapper.idToObject( + JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId = null, iverksattBrevbestillingId = BrevbestillingId("45") ) @@ -63,33 +62,33 @@ internal class EksterneIverksettingsstegMapperTest { inner class Avslag { @Test fun `kun journalpostid ger status journalført`() { - EksterneIverksettingsstegForAvslagMapper.idToObject( + JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId = JournalpostId("13"), iverksattBrevbestillingId = null - ) shouldBe EksterneIverksettingsstegForAvslag.Journalført(JournalpostId("13")).also { - EksterneIverksettingsstegForAvslagMapper.iverksattJournalpostId(it) shouldBe JournalpostId("13") - EksterneIverksettingsstegForAvslagMapper.iverksattBrevbestillingId(it) shouldBe null + ) shouldBe JournalføringOgBrevdistribusjon.Journalført(JournalpostId("13")).also { + JournalføringOgBrevdistribusjon.iverksattJournalpostId(it) shouldBe JournalpostId("13") + JournalføringOgBrevdistribusjon.iverksattBrevbestillingId(it) shouldBe null } } @Test fun `både journalpostid og brevbestillingsid ger status JournalførtOgDistribuertBrev`() { - EksterneIverksettingsstegForAvslagMapper.idToObject( + JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId = JournalpostId("13"), iverksattBrevbestillingId = BrevbestillingId("45") - ) shouldBe EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( + ) shouldBe JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( JournalpostId("13"), BrevbestillingId("45") ).also { - EksterneIverksettingsstegForAvslagMapper.iverksattJournalpostId(it) shouldBe JournalpostId("13") - EksterneIverksettingsstegForAvslagMapper.iverksattBrevbestillingId(it) shouldBe BrevbestillingId("45") + JournalføringOgBrevdistribusjon.iverksattJournalpostId(it) shouldBe JournalpostId("13") + JournalføringOgBrevdistribusjon.iverksattBrevbestillingId(it) shouldBe BrevbestillingId("45") } } @Test fun `brevbestillingsid uten journalpostid skal kaste exception`() { assertThrows { - EksterneIverksettingsstegForAvslagMapper.idToObject( + JournalføringOgBrevdistribusjon.fromId( iverksattJournalpostId = null, iverksattBrevbestillingId = BrevbestillingId("45") ) diff --git a/database/src/test/kotlin/no/nav/su/se/bakover/database/TestDataHelper.kt b/database/src/test/kotlin/no/nav/su/se/bakover/database/TestDataHelper.kt index 37bdac8228..fa607de329 100644 --- a/database/src/test/kotlin/no/nav/su/se/bakover/database/TestDataHelper.kt +++ b/database/src/test/kotlin/no/nav/su/se/bakover/database/TestDataHelper.kt @@ -29,7 +29,7 @@ import no.nav.su.se.bakover.domain.behandling.withAlleVilkårOppfylt import no.nav.su.se.bakover.domain.behandling.withVilkårAvslått import no.nav.su.se.bakover.domain.beregning.Sats import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.hendelseslogg.Hendelseslogg import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.Kvittering @@ -140,7 +140,7 @@ internal val kvitteringOk = Kvittering( originalKvittering = "hallo", mottattTidspunkt = fixedTidspunkt ) -internal val journalførtIverksettingForAvslag = EksterneIverksettingsstegForAvslag.Journalført( +internal val journalførtIverksettingForAvslag = JournalføringOgBrevdistribusjon.Journalført( journalpostId = iverksattJournalpostId, ) @@ -409,18 +409,18 @@ internal class TestDataHelper( return utbetaling } - internal fun nyIverksattAvslagUtenBeregning(eksterneIverksettingsteg: EksterneIverksettingsstegForAvslag = journalførtIverksettingForAvslag): Søknadsbehandling.Iverksatt.Avslag.UtenBeregning { + internal fun nyIverksattAvslagUtenBeregning(eksterneIverksettingsteg: JournalføringOgBrevdistribusjon = journalførtIverksettingForAvslag): Søknadsbehandling.Iverksatt.Avslag.UtenBeregning { return nyTilAvslåttAttesteringUtenBeregning().tilIverksatt( - iverksattAttestering, eksterneIverksettingsteg - ).also { + iverksattAttestering + ).copy(eksterneIverksettingsteg = eksterneIverksettingsteg).also { søknadsbehandlingRepo.lagre(it) } } - internal fun nyIverksattAvslagMedBeregning(eksterneIverksettingsteg: EksterneIverksettingsstegForAvslag): Søknadsbehandling.Iverksatt.Avslag.MedBeregning { + internal fun nyIverksattAvslagMedBeregning(eksterneIverksettingsteg: JournalføringOgBrevdistribusjon): Søknadsbehandling.Iverksatt.Avslag.MedBeregning { return tilAvslåttAttesteringMedBeregning().tilIverksatt( - iverksattAttestering, eksterneIverksettingsteg - ).also { + iverksattAttestering + ).copy(eksterneIverksettingsteg = eksterneIverksettingsteg).also { søknadsbehandlingRepo.lagre(it) } } diff --git "a/database/src/test/kotlin/no/nav/su/se/bakover/database/s\303\270knadsbehandling/S\303\270knadsbehandlingPostgresRepoTest.kt" "b/database/src/test/kotlin/no/nav/su/se/bakover/database/s\303\270knadsbehandling/S\303\270knadsbehandlingPostgresRepoTest.kt" index 6ddd063135..d9586cc254 100644 --- "a/database/src/test/kotlin/no/nav/su/se/bakover/database/s\303\270knadsbehandling/S\303\270knadsbehandlingPostgresRepoTest.kt" +++ "b/database/src/test/kotlin/no/nav/su/se/bakover/database/s\303\270knadsbehandling/S\303\270knadsbehandlingPostgresRepoTest.kt" @@ -23,8 +23,7 @@ import no.nav.su.se.bakover.database.underkjentAttestering import no.nav.su.se.bakover.database.withMigratedDb import no.nav.su.se.bakover.database.withSession import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppgave.OppgaveId import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling @@ -400,7 +399,7 @@ internal class SøknadsbehandlingPostgresRepoTest { } val journalført = - EksterneIverksettingsstegEtterUtbetaling.Journalført( + JournalføringOgBrevdistribusjon.Journalført( journalpostId = iverksattJournalpostId ) repo.lagre( @@ -414,7 +413,7 @@ internal class SøknadsbehandlingPostgresRepoTest { } val journalførtOgDistribuertBrev = - EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( + JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( journalpostId = iverksattJournalpostId, brevbestillingId = iverksattBrevbestillingId, ) @@ -454,7 +453,7 @@ internal class SøknadsbehandlingPostgresRepoTest { } val journalførtOgDistribuertBrev = - EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( + JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( journalpostId = iverksattJournalpostId, brevbestillingId = iverksattBrevbestillingId, ) @@ -474,7 +473,7 @@ internal class SøknadsbehandlingPostgresRepoTest { fun `iverksatt avslag med beregning`() { withMigratedDb { val eksterneIverksettingsteg = - EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( + JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( journalpostId = iverksattJournalpostId, brevbestillingId = iverksattBrevbestillingId, ) diff --git a/database/src/test/kotlin/no/nav/su/se/bakover/database/vedtak/VedtakPosgresRepoTest.kt b/database/src/test/kotlin/no/nav/su/se/bakover/database/vedtak/VedtakPosgresRepoTest.kt index f40297943f..ed3c463b66 100644 --- a/database/src/test/kotlin/no/nav/su/se/bakover/database/vedtak/VedtakPosgresRepoTest.kt +++ b/database/src/test/kotlin/no/nav/su/se/bakover/database/vedtak/VedtakPosgresRepoTest.kt @@ -7,6 +7,9 @@ import no.nav.su.se.bakover.database.hent import no.nav.su.se.bakover.database.journalførtIverksettingForAvslag import no.nav.su.se.bakover.database.withMigratedDb import no.nav.su.se.bakover.database.withSession +import no.nav.su.se.bakover.domain.brev.BrevbestillingId +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon +import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppgave.OppgaveId import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering import no.nav.su.se.bakover.domain.vedtak.Vedtak @@ -81,7 +84,7 @@ internal class VedtakPosgresRepoTest { oppgaveId = OppgaveId(""), attestant = søknadsbehandlingVedtak.attestant, utbetalingId = søknadsbehandlingVedtak.utbetalingId, - eksterneIverksettingsteg = søknadsbehandlingVedtak.eksterneIverksettingsteg + eksterneIverksettingsteg = søknadsbehandlingVedtak.journalføringOgBrevdistribusjon ) testDataHelper.revurderingRepo.lagre(iverksattRevurdering) @@ -120,4 +123,76 @@ internal class VedtakPosgresRepoTest { } } } + + @Test + fun `oppdaterer vedtak med journalpost og brevbestilling`() { + withMigratedDb { + val søknadsbehandling = testDataHelper.nyIverksattAvslagMedBeregning(JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert) + val vedtak = Vedtak.AvslåttStønad.fromSøknadsbehandlingMedBeregning(søknadsbehandling) + + vedtakRepo.lagre(vedtak) + vedtakRepo.lagre( + vedtak.copy( + journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( + journalpostId = JournalpostId("jp"), + brevbestillingId = BrevbestillingId(("bi")) + ) + ) + ) + vedtakRepo.hent(vedtak.id)!! shouldBe vedtak.copy( + journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( + journalpostId = JournalpostId("jp"), + brevbestillingId = BrevbestillingId(("bi")) + ) + ) + } + + withMigratedDb { + val (søknadsbehandling, _) = testDataHelper.nyIverksattInnvilget() + val vedtak = Vedtak.InnvilgetStønad.fromSøknadsbehandling(søknadsbehandling) + + vedtakRepo.lagre(vedtak) + vedtakRepo.lagre( + vedtak.copy( + journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( + journalpostId = JournalpostId("jp"), + brevbestillingId = BrevbestillingId(("bi")) + ) + ) + ) + vedtakRepo.hent(vedtak.id)!! shouldBe vedtak.copy( + journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( + journalpostId = JournalpostId("jp"), + brevbestillingId = BrevbestillingId(("bi")) + ) + ) + } + } + + @Test + fun `kobler ikke den samme behandlingen og vedtaket flere ganger ved oppdatering av vedtak`() { + withMigratedDb { + val (søknadsbehandling, _) = testDataHelper.nyIverksattInnvilget() + val vedtak = Vedtak.InnvilgetStønad.fromSøknadsbehandling(søknadsbehandling) + + vedtakRepo.lagre(vedtak) + vedtakRepo.lagre( + vedtak.copy( + journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( + journalpostId = JournalpostId("jp"), + brevbestillingId = BrevbestillingId(("bi")) + ) + ) + ) + + datasource.withSession { session -> + """ + SELECT count(*) from behandling_vedtak where vedtakId = :vedtakId + """.trimIndent() + .hent(mapOf("vedtakId" to vedtak.id), session) { + it.int("count") shouldBe 1 + } + } + } + } } diff --git a/database/src/test/kotlin/no/nav/su/se/bakover/database/vedtak/snapshot/VedtakssnapshotJsonTest.kt b/database/src/test/kotlin/no/nav/su/se/bakover/database/vedtak/snapshot/VedtakssnapshotJsonTest.kt index b0e5db97ad..60ce47c31b 100644 --- a/database/src/test/kotlin/no/nav/su/se/bakover/database/vedtak/snapshot/VedtakssnapshotJsonTest.kt +++ b/database/src/test/kotlin/no/nav/su/se/bakover/database/vedtak/snapshot/VedtakssnapshotJsonTest.kt @@ -26,8 +26,7 @@ import no.nav.su.se.bakover.domain.beregning.fradrag.FradragTilhører.BRUKER import no.nav.su.se.bakover.domain.beregning.fradrag.Fradragstype.Arbeidsinntekt import no.nav.su.se.bakover.domain.beregning.fradrag.UtenlandskInntekt import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.simulering.KlasseType.YTEL import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering @@ -76,7 +75,7 @@ internal class VedtakssnapshotJsonTest { saksnummer = Saksnummer(1234), fnr = fnr, oppgaveId = OppgaveId("oppgaveId"), - eksterneIverksettingsteg = EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( journalpostId = JournalpostId("iverksattJournalpostId"), brevbestillingId = BrevbestillingId("iverksattBrevbestillingId"), @@ -429,7 +428,7 @@ internal class VedtakssnapshotJsonTest { ) ) ), - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( journalpostId = JournalpostId("iverksattJournalpostId"), brevbestillingId = BrevbestillingId("iverksattBrevbestillingId"), ), diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/behandling/Behandling.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/behandling/Behandling.kt index e8d0dc2bc2..b5566639df 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/behandling/Behandling.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/behandling/Behandling.kt @@ -1,12 +1,16 @@ package no.nav.su.se.bakover.domain.behandling +import no.nav.su.se.bakover.common.Tidspunkt import no.nav.su.se.bakover.domain.Fnr import no.nav.su.se.bakover.domain.Saksnummer +import no.nav.su.se.bakover.domain.oppgave.OppgaveId import java.util.UUID interface Behandling { val id: UUID + val opprettet: Tidspunkt val sakId: UUID val saksnummer: Saksnummer val fnr: Fnr + val oppgaveId: OppgaveId } diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/brev/LagBrevRequest.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/brev/LagBrevRequest.kt index 41f0ec726e..6435ae829a 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/brev/LagBrevRequest.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/brev/LagBrevRequest.kt @@ -43,7 +43,6 @@ interface LagBrevRequest { private val saksbehandlerNavn: String, private val revurdertBeregning: Beregning, private val fritekst: String?, - private val vedtattBeregning: Beregning, private val harEktefelle: Boolean, ) : Revurdering() { override fun getPerson(): Person = person diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/EksterneIverksettingssteg.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/EksterneIverksettingssteg.kt deleted file mode 100644 index d440195b0d..0000000000 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/EksterneIverksettingssteg.kt +++ /dev/null @@ -1,106 +0,0 @@ -package no.nav.su.se.bakover.domain.eksterneiverksettingssteg - -import arrow.core.Either -import arrow.core.left -import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegForAvslagFeil -import no.nav.su.se.bakover.domain.journal.JournalpostId - -sealed class EksterneIverksettingsstegEtterUtbetaling { - abstract fun journalpostId(): JournalpostId? - fun journalfør(journalfør: () -> Either): Either { - return when (this) { - is VenterPåKvittering -> { - journalfør().map { medJournalpost(it) } - } - is Journalført -> { - EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.AlleredeJournalført(journalpostId) - .left() - } - is JournalførtOgDistribuertBrev -> { - EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.AlleredeJournalført(journalpostId) - .left() - } - } - } - - fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { - return when (this) { - is VenterPåKvittering -> EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.MåJournalføresFørst.left() - is Journalført -> distribuerBrev(journalpostId).map { this.medDistribuertBrev(it) } - is JournalførtOgDistribuertBrev -> EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.AlleredeDistribuertBrev( - journalpostId - ).left() - } - } - - object VenterPåKvittering : EksterneIverksettingsstegEtterUtbetaling() { - fun medJournalpost(journalpostId: JournalpostId): Journalført = Journalført(journalpostId) - - override fun journalpostId(): JournalpostId? = null - } - - data class Journalført(val journalpostId: JournalpostId) : EksterneIverksettingsstegEtterUtbetaling() { - fun medDistribuertBrev(brevbestillingId: BrevbestillingId): JournalførtOgDistribuertBrev = - JournalførtOgDistribuertBrev(journalpostId, brevbestillingId) - - override fun journalpostId() = journalpostId - } - - data class JournalførtOgDistribuertBrev( - val journalpostId: JournalpostId, - val brevbestillingId: BrevbestillingId - ) : EksterneIverksettingsstegEtterUtbetaling() { - override fun journalpostId() = journalpostId - } -} - -sealed class EksterneIverksettingsstegForAvslag { - abstract val journalpostId: JournalpostId - - fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either = - when (this) { - is Journalført -> distribuerBrev(journalpostId).map { this.medDistribuertBrev(it) } - is JournalførtOgDistribuertBrev -> EksterneIverksettingsstegForAvslagFeil.KunneIkkeDistribuereBrev.AlleredeDistribuertBrev( - journalpostId - ).left() - } - - data class Journalført(override val journalpostId: JournalpostId) : EksterneIverksettingsstegForAvslag() { - fun medDistribuertBrev(brevbestillingId: BrevbestillingId): JournalførtOgDistribuertBrev = - JournalførtOgDistribuertBrev(journalpostId, brevbestillingId) - } - - data class JournalførtOgDistribuertBrev( - override val journalpostId: JournalpostId, - val brevbestillingId: BrevbestillingId - ) : EksterneIverksettingsstegForAvslag() -} - -sealed class EksterneIverksettingsstegFeil { - sealed class EksterneIverksettingsstegEtterUtbetalingFeil : EksterneIverksettingsstegFeil() { - sealed class KunneIkkeDistribuereBrev : EksterneIverksettingsstegEtterUtbetalingFeil() { - object MåJournalføresFørst : KunneIkkeDistribuereBrev() - data class AlleredeDistribuertBrev(val journalpostId: JournalpostId) : KunneIkkeDistribuereBrev() - data class FeilVedDistribueringAvBrev(val journalpostId: JournalpostId) : KunneIkkeDistribuereBrev() - } - - sealed class KunneIkkeJournalføre : EksterneIverksettingsstegEtterUtbetalingFeil() { - data class AlleredeJournalført(val journalpostId: JournalpostId) : KunneIkkeJournalføre() - object FeilVedJournalføring : KunneIkkeJournalføre() - } - } - - sealed class EksterneIverksettingsstegForAvslagFeil : EksterneIverksettingsstegFeil() { - sealed class KunneIkkeDistribuereBrev : EksterneIverksettingsstegForAvslagFeil() { - data class AlleredeDistribuertBrev(val journalpostId: JournalpostId) : KunneIkkeDistribuereBrev() - data class FeilVedDistribueringAvBrev(val journalpostId: JournalpostId) : KunneIkkeDistribuereBrev() - } - - sealed class KunneIkkeJournalføre : EksterneIverksettingsstegForAvslagFeil() { - data class AlleredeJournalført(val journalpostId: JournalpostId) : KunneIkkeJournalføre() - object FeilVedJournalføring : KunneIkkeJournalføre() - } - } -} diff --git "a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/Journalf\303\270ringOgBrevdistribusjon.kt" "b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/Journalf\303\270ringOgBrevdistribusjon.kt" new file mode 100644 index 0000000000..2866b3c54a --- /dev/null +++ "b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/Journalf\303\270ringOgBrevdistribusjon.kt" @@ -0,0 +1,105 @@ +package no.nav.su.se.bakover.domain.eksterneiverksettingssteg + +import arrow.core.Either +import arrow.core.left +import no.nav.su.se.bakover.domain.brev.BrevbestillingId +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert.medJournalpost +import no.nav.su.se.bakover.domain.journal.JournalpostId + +sealed class JournalføringOgBrevdistribusjon { + companion object { + fun fromId( + iverksattJournalpostId: JournalpostId?, + iverksattBrevbestillingId: BrevbestillingId? + ): JournalføringOgBrevdistribusjon = when { + iverksattJournalpostId == null && iverksattBrevbestillingId == null -> { + IkkeJournalførtEllerDistribuert + } + iverksattJournalpostId != null && iverksattBrevbestillingId != null -> { + JournalførtOgDistribuertBrev(journalpostId = iverksattJournalpostId, brevbestillingId = iverksattBrevbestillingId) + } + iverksattJournalpostId != null -> { + Journalført(iverksattJournalpostId) + } + else -> { + throw IllegalStateException("Kunne ikke bestemme eksterne iverksettingssteg for innvilgelse, iverksattJournalpostId:$iverksattJournalpostId, iverksattBrevbestillingId:$iverksattBrevbestillingId") + } + } + + fun iverksattJournalpostId(e: JournalføringOgBrevdistribusjon): JournalpostId? = + when (e) { + is IkkeJournalførtEllerDistribuert -> null + is Journalført -> e.journalpostId + is JournalførtOgDistribuertBrev -> e.journalpostId + } + + fun iverksattBrevbestillingId(e: JournalføringOgBrevdistribusjon): BrevbestillingId? = + when (e) { + is IkkeJournalførtEllerDistribuert, + is Journalført -> null + is JournalførtOgDistribuertBrev -> e.brevbestillingId + } + } + + abstract fun journalpostId(): JournalpostId? + fun journalfør(journalfør: () -> Either): Either { + return when (this) { + is IkkeJournalførtEllerDistribuert -> { + journalfør().map { medJournalpost(it) } + } + is Journalført -> { + KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeJournalføre.AlleredeJournalført(journalpostId).left() + } + is JournalførtOgDistribuertBrev -> { + KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeJournalføre.AlleredeJournalført(journalpostId).left() + } + } + } + + fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { + return when (this) { + is IkkeJournalførtEllerDistribuert -> { + KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeDistribuereBrev.MåJournalføresFørst.left() + } + is Journalført -> { + distribuerBrev(journalpostId).map { this.medDistribuertBrev(it) } + } + is JournalførtOgDistribuertBrev -> { + KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeDistribuereBrev.AlleredeDistribuertBrev(journalpostId).left() + } + } + } + + object IkkeJournalførtEllerDistribuert : JournalføringOgBrevdistribusjon() { + fun medJournalpost(journalpostId: JournalpostId): Journalført = Journalført(journalpostId) + + override fun journalpostId(): JournalpostId? = null + } + + data class Journalført(val journalpostId: JournalpostId) : JournalføringOgBrevdistribusjon() { + fun medDistribuertBrev(brevbestillingId: BrevbestillingId): JournalførtOgDistribuertBrev = + JournalførtOgDistribuertBrev(journalpostId, brevbestillingId) + + override fun journalpostId() = journalpostId + } + + data class JournalførtOgDistribuertBrev( + val journalpostId: JournalpostId, + val brevbestillingId: BrevbestillingId + ) : JournalføringOgBrevdistribusjon() { + override fun journalpostId() = journalpostId + } +} + +sealed class KunneIkkeJournalføreOgDistribuereBrev { + sealed class KunneIkkeDistribuereBrev : KunneIkkeJournalføreOgDistribuereBrev() { + object MåJournalføresFørst : KunneIkkeDistribuereBrev() + data class AlleredeDistribuertBrev(val journalpostId: JournalpostId) : KunneIkkeDistribuereBrev() + data class FeilVedDistribueringAvBrev(val journalpostId: JournalpostId) : KunneIkkeDistribuereBrev() + } + + sealed class KunneIkkeJournalføre : KunneIkkeJournalføreOgDistribuereBrev() { + data class AlleredeJournalført(val journalpostId: JournalpostId) : KunneIkkeJournalføre() + object FeilVedJournalføring : KunneIkkeJournalføre() + } +} diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/revurdering/Revurdering.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/revurdering/Revurdering.kt index b17a60e5b1..ba4a208585 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/revurdering/Revurdering.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/revurdering/Revurdering.kt @@ -20,9 +20,8 @@ import no.nav.su.se.bakover.domain.beregning.Månedsberegning import no.nav.su.se.bakover.domain.beregning.RevurdertBeregning import no.nav.su.se.bakover.domain.beregning.fradrag.Fradrag import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.FeilVedJournalføring +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.KunneIkkeJournalføreOgDistribuereBrev import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.oppgave.OppgaveId @@ -32,11 +31,9 @@ import java.util.UUID import kotlin.math.abs sealed class Revurdering : Behandling, Visitable { - abstract val opprettet: Tidspunkt abstract val tilRevurdering: Vedtak.InnvilgetStønad abstract val periode: Periode abstract val saksbehandler: Saksbehandler - abstract val oppgaveId: OppgaveId override val sakId: UUID get() = tilRevurdering.behandling.sakId override val saksnummer: Saksnummer @@ -253,7 +250,7 @@ data class RevurderingTilAttestering( oppgaveId = oppgaveId, attestant = attestant, utbetalingId = it, - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert ) } } @@ -274,17 +271,17 @@ data class IverksattRevurdering( val simulering: Simulering, val attestant: NavIdentBruker.Attestant, val utbetalingId: UUID30, - val eksterneIverksettingsteg: EksterneIverksettingsstegEtterUtbetaling + val eksterneIverksettingsteg: JournalføringOgBrevdistribusjon ) : Revurdering() { override fun accept(visitor: RevurderingVisitor) { visitor.visit(this) } - fun journalfør(journalfør: () -> Either): Either { + fun journalfør(journalfør: () -> Either): Either { return eksterneIverksettingsteg.journalfør(journalfør).map { copy(eksterneIverksettingsteg = it) } } - fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { + fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { return eksterneIverksettingsteg.distribuerBrev(distribuerBrev) .map { copy(eksterneIverksettingsteg = it) } } diff --git "a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/Statusovergang.kt" "b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/Statusovergang.kt" index 3587e97c72..3c37ad36eb 100644 --- "a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/Statusovergang.kt" +++ "b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/Statusovergang.kt" @@ -8,8 +8,6 @@ import no.nav.su.se.bakover.domain.NavIdentBruker import no.nav.su.se.bakover.domain.behandling.Attestering import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon import no.nav.su.se.bakover.domain.beregning.Beregning -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag -import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering abstract class Statusovergang : StatusovergangVisitor { @@ -189,15 +187,12 @@ abstract class Statusovergang : StatusovergangVisitor { class TilIverksatt( private val attestering: Attestering, - private val innvilget: (søknadsbehandling: Søknadsbehandling.TilAttestering.Innvilget) -> Either, - private val avslag: (søknadsbehandling: Søknadsbehandling.TilAttestering.Avslag) -> Either + private val innvilget: (søknadsbehandling: Søknadsbehandling.TilAttestering.Innvilget) -> Either ) : Statusovergang() { override fun visit(søknadsbehandling: Søknadsbehandling.TilAttestering.Avslag.UtenBeregning) { result = if (saksbehandlerOgAttestantErForskjellig(søknadsbehandling, attestering)) { - avslag(søknadsbehandling) - .mapLeft { KunneIkkeIverksetteSøknadsbehandling.KunneIkkeJournalføre } - .map { søknadsbehandling.tilIverksatt(attestering, EksterneIverksettingsstegForAvslag.Journalført(it)) } + søknadsbehandling.tilIverksatt(attestering).right() } else { KunneIkkeIverksetteSøknadsbehandling.SaksbehandlerOgAttestantKanIkkeVæreSammePerson.left() } @@ -205,9 +200,7 @@ abstract class Statusovergang : StatusovergangVisitor { override fun visit(søknadsbehandling: Søknadsbehandling.TilAttestering.Avslag.MedBeregning) { result = if (saksbehandlerOgAttestantErForskjellig(søknadsbehandling, attestering)) { - avslag(søknadsbehandling) - .mapLeft { KunneIkkeIverksetteSøknadsbehandling.KunneIkkeJournalføre } - .map { søknadsbehandling.tilIverksatt(attestering, EksterneIverksettingsstegForAvslag.Journalført(it)) } + søknadsbehandling.tilIverksatt(attestering).right() } else { KunneIkkeIverksetteSøknadsbehandling.SaksbehandlerOgAttestantKanIkkeVæreSammePerson.left() } diff --git "a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/S\303\270knadsbehandling.kt" "b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/S\303\270knadsbehandling.kt" index 4d23a14e02..f1156455dd 100644 --- "a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/S\303\270knadsbehandling.kt" +++ "b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/S\303\270knadsbehandling.kt" @@ -15,10 +15,8 @@ import no.nav.su.se.bakover.domain.behandling.VurderAvslagGrunnetBeregning import no.nav.su.se.bakover.domain.behandling.avslag.Avslagsgrunn import no.nav.su.se.bakover.domain.beregning.Beregning import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegForAvslagFeil -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.KunneIkkeJournalføreOgDistribuereBrev import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.oppgave.OppgaveId @@ -26,9 +24,7 @@ import no.nav.su.se.bakover.domain.visitor.Visitable import java.util.UUID sealed class Søknadsbehandling : Behandling, Visitable { - abstract val opprettet: Tidspunkt abstract val søknad: Søknad.Journalført.MedOppgave - abstract val oppgaveId: OppgaveId abstract val behandlingsinformasjon: Behandlingsinformasjon abstract val status: BehandlingsStatus @@ -497,8 +493,7 @@ sealed class Søknadsbehandling : Behandling, Visitable Either): Either { + fun journalfør(journalfør: () -> Either): Either { return eksterneIverksettingsteg.journalfør(journalfør).map { copy(eksterneIverksettingsteg = it) } } - fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { + fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { return eksterneIverksettingsteg.distribuerBrev(distribuerBrev) .map { copy(eksterneIverksettingsteg = it) } } } sealed class Avslag : Iverksatt(), ErAvslag { - abstract val eksterneIverksettingsteg: EksterneIverksettingsstegForAvslag - abstract fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either + abstract val eksterneIverksettingsteg: JournalføringOgBrevdistribusjon + abstract fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either data class MedBeregning( override val id: UUID, @@ -843,7 +835,7 @@ sealed class Søknadsbehandling : Behandling, Visitable emptyList() } - override fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { + override fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { return eksterneIverksettingsteg.distribuerBrev(distribuerBrev) .map { copy(eksterneIverksettingsteg = it) } } @@ -877,7 +869,7 @@ sealed class Søknadsbehandling : Behandling, Visitable Either): Either { + override fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { return eksterneIverksettingsteg.distribuerBrev(distribuerBrev) .map { copy(eksterneIverksettingsteg = it) } } diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/vedtak/Vedtak.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/vedtak/Vedtak.kt index ec9b558e04..36843aede4 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/vedtak/Vedtak.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/vedtak/Vedtak.kt @@ -1,24 +1,36 @@ package no.nav.su.se.bakover.domain.vedtak +import arrow.core.Either import no.nav.su.se.bakover.common.Tidspunkt import no.nav.su.se.bakover.common.UUID30 import no.nav.su.se.bakover.common.periode.Periode import no.nav.su.se.bakover.domain.NavIdentBruker +import no.nav.su.se.bakover.domain.behandling.AvslagGrunnetBeregning import no.nav.su.se.bakover.domain.behandling.Behandling import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon +import no.nav.su.se.bakover.domain.behandling.VurderAvslagGrunnetBeregning +import no.nav.su.se.bakover.domain.behandling.avslag.Avslagsgrunn import no.nav.su.se.bakover.domain.beregning.Beregning -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag +import no.nav.su.se.bakover.domain.brev.BrevbestillingId +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.KunneIkkeJournalføreOgDistribuereBrev +import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering +import no.nav.su.se.bakover.domain.søknadsbehandling.ErAvslag import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling +import no.nav.su.se.bakover.domain.visitor.Visitable import java.util.UUID -sealed class Vedtak { +sealed class Vedtak : Visitable { abstract val id: UUID abstract val opprettet: Tidspunkt abstract val behandling: Behandling abstract val behandlingsinformasjon: Behandlingsinformasjon + abstract val journalføringOgBrevdistribusjon: JournalføringOgBrevdistribusjon + + abstract fun journalfør(journalfør: () -> Either): Either + abstract fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either data class InnvilgetStønad( override val id: UUID = UUID.randomUUID(), @@ -31,7 +43,7 @@ sealed class Vedtak { val saksbehandler: NavIdentBruker.Saksbehandler, val attestant: NavIdentBruker.Attestant, val utbetalingId: UUID30, - val eksterneIverksettingsteg: EksterneIverksettingsstegEtterUtbetaling, + override val journalføringOgBrevdistribusjon: JournalføringOgBrevdistribusjon, ) : Vedtak() { companion object { fun fromSøknadsbehandling(søknadsbehandling: Søknadsbehandling.Iverksatt.Innvilget) = InnvilgetStønad( @@ -43,7 +55,7 @@ sealed class Vedtak { saksbehandler = søknadsbehandling.saksbehandler, attestant = søknadsbehandling.attestering.attestant, utbetalingId = søknadsbehandling.utbetalingId, - eksterneIverksettingsteg = søknadsbehandling.eksterneIverksettingsteg, + journalføringOgBrevdistribusjon = søknadsbehandling.eksterneIverksettingsteg, ) fun fromRevurdering(revurdering: IverksattRevurdering) = InnvilgetStønad( @@ -55,15 +67,27 @@ sealed class Vedtak { saksbehandler = revurdering.saksbehandler, attestant = revurdering.attestant, utbetalingId = revurdering.utbetalingId, - eksterneIverksettingsteg = revurdering.eksterneIverksettingsteg + journalføringOgBrevdistribusjon = revurdering.eksterneIverksettingsteg ) } + + override fun accept(visitor: VedtakVisitor) { + visitor.visit(this) + } + + override fun journalfør(journalfør: () -> Either): Either { + return journalføringOgBrevdistribusjon.journalfør(journalfør).map { copy(journalføringOgBrevdistribusjon = it) } + } + + override fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { + return journalføringOgBrevdistribusjon.distribuerBrev(distribuerBrev) + .map { copy(journalføringOgBrevdistribusjon = it) } + } } - sealed class AvslåttStønad : Vedtak() { + sealed class AvslåttStønad : Vedtak(), ErAvslag { abstract val saksbehandler: NavIdentBruker.Saksbehandler abstract val attestant: NavIdentBruker.Attestant - abstract val eksterneIverksettingsteg: EksterneIverksettingsstegForAvslag companion object { fun fromSøknadsbehandlingMedBeregning(avslag: Søknadsbehandling.Iverksatt.Avslag.MedBeregning) = @@ -73,7 +97,7 @@ sealed class Vedtak { beregning = avslag.beregning, saksbehandler = avslag.saksbehandler, attestant = avslag.attestering.attestant, - eksterneIverksettingsteg = avslag.eksterneIverksettingsteg, + journalføringOgBrevdistribusjon = avslag.eksterneIverksettingsteg, ) fun fromSøknadsbehandlingUtenBeregning(avslag: Søknadsbehandling.Iverksatt.Avslag.UtenBeregning) = @@ -82,7 +106,7 @@ sealed class Vedtak { behandlingsinformasjon = avslag.behandlingsinformasjon, saksbehandler = avslag.saksbehandler, attestant = avslag.attestering.attestant, - eksterneIverksettingsteg = avslag.eksterneIverksettingsteg, + journalføringOgBrevdistribusjon = avslag.eksterneIverksettingsteg, ) } @@ -93,8 +117,24 @@ sealed class Vedtak { override val behandlingsinformasjon: Behandlingsinformasjon, override val saksbehandler: NavIdentBruker.Saksbehandler, override val attestant: NavIdentBruker.Attestant, - override val eksterneIverksettingsteg: EksterneIverksettingsstegForAvslag, - ) : AvslåttStønad() + override val journalføringOgBrevdistribusjon: JournalføringOgBrevdistribusjon, + ) : AvslåttStønad() { + override fun accept(visitor: VedtakVisitor) { + visitor.visit(this) + } + + // TODO jm: disse bør sannsynligvis peristeres. + override val avslagsgrunner: List = behandlingsinformasjon.utledAvslagsgrunner() + + override fun journalfør(journalfør: () -> Either): Either { + return journalføringOgBrevdistribusjon.journalfør(journalfør).map { copy(journalføringOgBrevdistribusjon = it) } + } + + override fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { + return journalføringOgBrevdistribusjon.distribuerBrev(distribuerBrev) + .map { copy(journalføringOgBrevdistribusjon = it) } + } + } data class MedBeregning( override val id: UUID = UUID.randomUUID(), @@ -104,7 +144,29 @@ sealed class Vedtak { val beregning: Beregning, override val saksbehandler: NavIdentBruker.Saksbehandler, override val attestant: NavIdentBruker.Attestant, - override val eksterneIverksettingsteg: EksterneIverksettingsstegForAvslag, - ) : AvslåttStønad() + override val journalføringOgBrevdistribusjon: JournalføringOgBrevdistribusjon, + ) : AvslåttStønad() { + private val avslagsgrunnForBeregning: List = + when (val vurdering = VurderAvslagGrunnetBeregning.vurderAvslagGrunnetBeregning(beregning)) { + is AvslagGrunnetBeregning.Ja -> listOf(vurdering.avslagsgrunn) + is AvslagGrunnetBeregning.Nei -> emptyList() + } + + override fun accept(visitor: VedtakVisitor) { + visitor.visit(this) + } + + // TODO jm: disse bør sannsynligvis peristeres. + override val avslagsgrunner: List = behandlingsinformasjon.utledAvslagsgrunner() + avslagsgrunnForBeregning + + override fun journalfør(journalfør: () -> Either): Either { + return journalføringOgBrevdistribusjon.journalfør(journalfør).map { copy(journalføringOgBrevdistribusjon = it) } + } + + override fun distribuerBrev(distribuerBrev: (journalpostId: JournalpostId) -> Either): Either { + return journalføringOgBrevdistribusjon.distribuerBrev(distribuerBrev) + .map { copy(journalføringOgBrevdistribusjon = it) } + } + } } } diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/vedtak/VedtakVisitor.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/vedtak/VedtakVisitor.kt new file mode 100644 index 0000000000..05f68b35b3 --- /dev/null +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/vedtak/VedtakVisitor.kt @@ -0,0 +1,9 @@ +package no.nav.su.se.bakover.domain.vedtak + +import no.nav.su.se.bakover.domain.visitor.Visitor + +interface VedtakVisitor : Visitor { + fun visit(vedtak: Vedtak.InnvilgetStønad) + fun visit(vedtak: Vedtak.AvslåttStønad.UtenBeregning) + fun visit(vedtak: Vedtak.AvslåttStønad.MedBeregning) +} diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/visitor/LagBrevRequestVisitor.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/visitor/LagBrevRequestVisitor.kt index 17ebe8910d..ecbc53f0e4 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/visitor/LagBrevRequestVisitor.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/visitor/LagBrevRequestVisitor.kt @@ -23,6 +23,8 @@ import no.nav.su.se.bakover.domain.revurdering.SimulertRevurdering import no.nav.su.se.bakover.domain.søknadsbehandling.FinnSaksbehandlerVisitor import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling import no.nav.su.se.bakover.domain.søknadsbehandling.SøknadsbehandlingVisitor +import no.nav.su.se.bakover.domain.vedtak.Vedtak +import no.nav.su.se.bakover.domain.vedtak.VedtakVisitor import java.time.Clock import kotlin.reflect.KClass @@ -30,7 +32,7 @@ class LagBrevRequestVisitor( private val hentPerson: (fnr: Fnr) -> Either, private val hentNavn: (navIdentBruker: NavIdentBruker) -> Either, private val clock: Clock -) : SøknadsbehandlingVisitor, RevurderingVisitor { +) : SøknadsbehandlingVisitor, RevurderingVisitor, VedtakVisitor { lateinit var brevRequest: Either override fun visit(søknadsbehandling: Søknadsbehandling.Vilkårsvurdert.Uavklart) { @@ -113,6 +115,36 @@ class LagBrevRequestVisitor( brevRequest = innvilgetRevurdering(revurdering, revurdering.beregning) } + override fun visit(vedtak: Vedtak.InnvilgetStønad) { + brevRequest = when (vedtak.behandling) { + is Søknadsbehandling -> { + innvilgetVedtakSøknadsbehandling(vedtak) + } + is Revurdering -> { + innvilgetVedtakRevurdering(vedtak) + } + else -> throw KunneIkkeLageBrevRequest.KanIkkeLageBrevrequestForInstans(vedtak::class) + } + } + + override fun visit(vedtak: Vedtak.AvslåttStønad.MedBeregning) { + brevRequest = when (vedtak.behandling) { + is Søknadsbehandling -> { + avslåttVedtakSøknadsbehandling(vedtak) + } + else -> throw KunneIkkeLageBrevRequest.KanIkkeLageBrevrequestForInstans(vedtak::class) + } + } + + override fun visit(vedtak: Vedtak.AvslåttStønad.UtenBeregning) { + brevRequest = when (vedtak.behandling) { + is Søknadsbehandling -> { + avslåttVedtakSøknadsbehandling(vedtak) + } + else -> throw KunneIkkeLageBrevRequest.KanIkkeLageBrevrequestForInstans(vedtak::class) + } + } + private fun hentPersonOgNavn( fnr: Fnr, saksbehandler: NavIdentBruker.Saksbehandler?, @@ -193,7 +225,6 @@ class LagBrevRequestVisitor( saksbehandlerNavn = it.saksbehandlerNavn, revurdertBeregning = beregning, fritekst = null, // TODO: finn ut hvordan vi vill hantere fritekst - vedtattBeregning = revurdering.tilRevurdering.beregning, harEktefelle = revurdering.tilRevurdering.behandlingsinformasjon.harEktefelle() ) } @@ -242,4 +273,51 @@ class LagBrevRequestVisitor( val msg: String = "Kan ikke lage brevrequest for instans av typen: ${instans.qualifiedName}" ) : RuntimeException(msg) } + + private fun innvilgetVedtakSøknadsbehandling(vedtak: Vedtak.InnvilgetStønad) = + hentPersonOgNavn( + fnr = vedtak.behandling.fnr, + saksbehandler = vedtak.saksbehandler, + attestant = vedtak.attestant + ).map { + requestForInnvilgelse( + personOgNavn = it, + behandlingsinformasjon = vedtak.behandlingsinformasjon, + beregning = vedtak.beregning + ) + } + + private fun innvilgetVedtakRevurdering(vedtak: Vedtak.InnvilgetStønad) = + hentPersonOgNavn( + fnr = vedtak.behandling.fnr, + saksbehandler = vedtak.saksbehandler, + attestant = vedtak.attestant, + ).map { + LagBrevRequest.Revurdering.Inntekt( + person = it.person, + saksbehandlerNavn = it.saksbehandlerNavn, + revurdertBeregning = vedtak.beregning, + fritekst = null, // TODO: finn ut hvordan vi vill hantere fritekst + harEktefelle = vedtak.behandlingsinformasjon.harEktefelle() + ) + } + + private fun avslåttVedtakSøknadsbehandling( + vedtak: Vedtak.AvslåttStønad + ) = + hentPersonOgNavn( + fnr = vedtak.behandling.fnr, + saksbehandler = vedtak.saksbehandler, + attestant = vedtak.attestant + ).map { + requestForAvslag( + personOgNavn = it, + avslagsgrunner = vedtak.avslagsgrunner, + behandlingsinformasjon = vedtak.behandlingsinformasjon, + beregning = when (vedtak) { + is Vedtak.AvslåttStønad.MedBeregning -> vedtak.beregning + is Vedtak.AvslåttStønad.UtenBeregning -> null + }, + ) + } } diff --git a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/EksterneIverksettingsstegForAvslagTest.kt b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/EksterneIverksettingsstegForAvslagTest.kt deleted file mode 100644 index 98fdb01ca0..0000000000 --- a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/EksterneIverksettingsstegForAvslagTest.kt +++ /dev/null @@ -1,49 +0,0 @@ -package no.nav.su.se.bakover.domain.eksterneiverksettingssteg - -import arrow.core.Either -import arrow.core.left -import arrow.core.right -import com.nhaarman.mockitokotlin2.mock -import io.kotest.matchers.shouldBe -import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.journal.JournalpostId -import org.junit.jupiter.api.Test - -class EksterneIverksettingsstegForAvslagTest { - private val journalpostId = JournalpostId("jp") - private val brevbestillingId = BrevbestillingId("bid") - private val skalIkkeBliKaltVedBrevDistribusjon = - mock>() - private fun okBrevDistribusjon(@Suppress("UNUSED_PARAMETER") journalpostId: JournalpostId): Either { - return brevbestillingId.right() - } - - private fun brevDistribusjonsfeil(id: JournalpostId) = - EksterneIverksettingsstegFeil.EksterneIverksettingsstegForAvslagFeil.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev( - id - ).left() - - @Test - fun `distribuerer brev og oppdaterer status for journalført`() { - EksterneIverksettingsstegForAvslag.Journalført(journalpostId).distribuerBrev { id -> okBrevDistribusjon(id) } shouldBe EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( - journalpostId, - brevbestillingId - ).right() - } - - @Test - fun `skal ikke kunne distribuera brev når vi allerede har distribuert`() { - EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev(journalpostId, brevbestillingId) - .distribuerBrev { skalIkkeBliKaltVedBrevDistribusjon } shouldBe EksterneIverksettingsstegFeil.EksterneIverksettingsstegForAvslagFeil.KunneIkkeDistribuereBrev.AlleredeDistribuertBrev( - journalpostId - ).left() - } - - @Test - fun `svarer med feil hvis distribuering feiler`() { - EksterneIverksettingsstegForAvslag.Journalført(journalpostId) - .distribuerBrev { id -> brevDistribusjonsfeil(id) } shouldBe EksterneIverksettingsstegFeil.EksterneIverksettingsstegForAvslagFeil.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev( - journalpostId - ).left() - } -} diff --git a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/EksterneIverksettingsstegEtterUtbetalingTest.kt "b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/Journalf\303\270ringOgBrevdistribusjonTest.kt" similarity index 72% rename from domain/src/test/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/EksterneIverksettingsstegEtterUtbetalingTest.kt rename to "domain/src/test/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/Journalf\303\270ringOgBrevdistribusjonTest.kt" index efbff17ba1..1f0c44d8de 100644 --- a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/EksterneIverksettingsstegEtterUtbetalingTest.kt +++ "b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/eksterneiverksettingssteg/Journalf\303\270ringOgBrevdistribusjonTest.kt" @@ -8,28 +8,28 @@ import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions import com.nhaarman.mockitokotlin2.verifyZeroInteractions import io.kotest.matchers.shouldBe import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling.Journalført -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.AlleredeJournalført -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.FeilVedJournalføring +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon.Journalført +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeDistribuereBrev +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeJournalføre.AlleredeJournalført +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeJournalføre.FeilVedJournalføring import no.nav.su.se.bakover.domain.journal.JournalpostId import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test -internal class EksterneIverksettingsstegEtterUtbetalingTest { +internal class JournalføringOgBrevdistribusjonTest { @Nested inner class Journalføring { private val skalIkkeBliKaltVedJournalføring = mock>() @Test fun `journalfører venter på kvittering og oppdaterer status`() { - VenterPåKvittering.journalfør { okJournalføring() } shouldBe Journalført(journalpostId).right() + IkkeJournalførtEllerDistribuert.journalfør { okJournalføring() } shouldBe Journalført(journalpostId).right() } @Test fun `svarer med feil dersom journalføring feiler`() { - VenterPåKvittering.journalfør { errorJournalføring() } shouldBe FeilVedJournalføring.left() + IkkeJournalførtEllerDistribuert.journalfør { errorJournalføring() } shouldBe FeilVedJournalføring.left() } @Test @@ -57,7 +57,7 @@ internal class EksterneIverksettingsstegEtterUtbetalingTest { @Test fun `skal ikke kunne distribuera brev når vi ikke har journalført`() { - VenterPåKvittering.distribuerBrev { skalIkkeBliKaltVedBrevDistribusjon } shouldBe KunneIkkeDistribuereBrev.MåJournalføresFørst.left() + IkkeJournalførtEllerDistribuert.distribuerBrev { skalIkkeBliKaltVedBrevDistribusjon } shouldBe KunneIkkeDistribuereBrev.MåJournalføresFørst.left() verifyZeroInteractions(skalIkkeBliKaltVedBrevDistribusjon) } diff --git "a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/StatusovergangTest.kt" "b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/StatusovergangTest.kt" index 639ce119ea..686656cf6a 100644 --- "a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/StatusovergangTest.kt" +++ "b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/s\303\270knadsbehandling/StatusovergangTest.kt" @@ -25,7 +25,7 @@ import no.nav.su.se.bakover.domain.beregning.fradrag.FradragStrategy import no.nav.su.se.bakover.domain.beregning.fradrag.FradragTilhører import no.nav.su.se.bakover.domain.beregning.fradrag.Fradragstype import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.oppgave.OppgaveId @@ -104,9 +104,9 @@ internal class StatusovergangTest { private val attestering = Attestering.Iverksatt(NavIdentBruker.Attestant("attestant")) private val utbetalingId = UUID30.randomUUID() private val journalførtIverksettingsteg = - EksterneIverksettingsstegForAvslag.Journalført(JournalpostId("journalpostId")) + JournalføringOgBrevdistribusjon.Journalført(JournalpostId("journalpostId")) private val distribuertIverksettingssteg = - EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( + JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( journalpostId = JournalpostId("journalpostId"), brevbestillingId = BrevbestillingId("brevbesttilingId") ) @@ -139,9 +139,9 @@ internal class StatusovergangTest { tilAttesteringAvslagBeregning.tilUnderkjent(underkjentAttestering) private val iverksattInnvilget = tilAttesteringInnvilget.tilIverksatt(attestering, utbetalingId) private val iverksattAvslagVilkår = - tilAttesteringAvslagVilkår.tilIverksatt(attestering, journalførtIverksettingsteg) + tilAttesteringAvslagVilkår.tilIverksatt(attestering) private val iverksattAvslagBeregning = - tilAttesteringAvslagBeregning.tilIverksatt(attestering, journalførtIverksettingsteg) + tilAttesteringAvslagBeregning.tilIverksatt(attestering) @Nested inner class TilVilkårsvurdert { @@ -712,10 +712,8 @@ internal class StatusovergangTest { forsøkStatusovergang( tilAttesteringAvslagVilkår, Statusovergang.TilIverksatt( - attestering = attestering, - innvilget = { throw IllegalStateException() }, - avslag = { JournalpostId("journalpostId").right() } - ) + attestering = attestering + ) { throw IllegalStateException() } ) shouldBe iverksattAvslagVilkår.right() } @@ -724,10 +722,8 @@ internal class StatusovergangTest { forsøkStatusovergang( tilAttesteringAvslagBeregning, Statusovergang.TilIverksatt( - attestering = attestering, - innvilget = { throw IllegalStateException() }, - avslag = { JournalpostId("journalpostId").right() } - ) + attestering = attestering + ) { throw IllegalStateException() } ) shouldBe iverksattAvslagBeregning.right() } @@ -736,10 +732,8 @@ internal class StatusovergangTest { forsøkStatusovergang( tilAttesteringInnvilget, Statusovergang.TilIverksatt( - attestering = attestering, - innvilget = { utbetalingId.right() }, - avslag = { throw IllegalStateException() } - ) + attestering = attestering + ) { utbetalingId.right() } ) shouldBe iverksattInnvilget.right() } @@ -748,10 +742,8 @@ internal class StatusovergangTest { forsøkStatusovergang( tilAttesteringAvslagVilkår.copy(saksbehandler = NavIdentBruker.Saksbehandler(attestering.attestant.navIdent)), Statusovergang.TilIverksatt( - attestering = attestering, - innvilget = { throw IllegalStateException() }, - avslag = { JournalpostId("journalpostId").right() } - ) + attestering = attestering + ) { throw IllegalStateException() } ) shouldBe Statusovergang.KunneIkkeIverksetteSøknadsbehandling.SaksbehandlerOgAttestantKanIkkeVæreSammePerson.left() } @@ -760,10 +752,8 @@ internal class StatusovergangTest { forsøkStatusovergang( tilAttesteringAvslagBeregning.copy(saksbehandler = NavIdentBruker.Saksbehandler(attestering.attestant.navIdent)), Statusovergang.TilIverksatt( - attestering = attestering, - innvilget = { throw IllegalStateException() }, - avslag = { JournalpostId("journalpostId").right() } - ) + attestering = attestering + ) { throw IllegalStateException() } ) shouldBe Statusovergang.KunneIkkeIverksetteSøknadsbehandling.SaksbehandlerOgAttestantKanIkkeVæreSammePerson.left() } @@ -772,10 +762,8 @@ internal class StatusovergangTest { forsøkStatusovergang( tilAttesteringInnvilget.copy(saksbehandler = NavIdentBruker.Saksbehandler(attestering.attestant.navIdent)), Statusovergang.TilIverksatt( - attestering = attestering, - innvilget = { UUID30.randomUUID().right() }, - avslag = { throw IllegalStateException() } - ) + attestering = attestering + ) { UUID30.randomUUID().right() } ) shouldBe Statusovergang.KunneIkkeIverksetteSøknadsbehandling.SaksbehandlerOgAttestantKanIkkeVæreSammePerson.left() } diff --git a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/visitor/FinnAttestantVisitorTest.kt b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/visitor/FinnAttestantVisitorTest.kt index d65d8821ed..108f4bf326 100644 --- a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/visitor/FinnAttestantVisitorTest.kt +++ b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/visitor/FinnAttestantVisitorTest.kt @@ -179,7 +179,7 @@ internal class FinnAttestantVisitorTest { private val iverksattInnvilgetSøknadsbehandling = tilAttesteringInnvilgetSøknadsbehandlng.tilIverksatt(Attestering.Iverksatt(attestant), UUID30.randomUUID()) private val iverksattAvslagSøknadsbehandling = - tilAttesteringAvslagSøknadsbehandlng.tilIverksatt(Attestering.Iverksatt(attestant), mock()) + tilAttesteringAvslagSøknadsbehandlng.tilIverksatt(Attestering.Iverksatt(attestant)) private val beregningMock = mock { on { getMånedsberegninger() } doReturn listOf( diff --git a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/visitor/LagBrevRequestVisitorTest.kt b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/visitor/LagBrevRequestVisitorTest.kt index 52ae7d8f97..d5023eddaf 100644 --- a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/visitor/LagBrevRequestVisitorTest.kt +++ b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/visitor/LagBrevRequestVisitorTest.kt @@ -32,11 +32,12 @@ import no.nav.su.se.bakover.domain.beregning.fradrag.FradragStrategy import no.nav.su.se.bakover.domain.beregning.fradrag.FradragTilhører import no.nav.su.se.bakover.domain.beregning.fradrag.Fradragstype import no.nav.su.se.bakover.domain.brev.LagBrevRequest -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag -import no.nav.su.se.bakover.domain.journal.JournalpostId +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.oppgave.OppgaveId +import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling +import no.nav.su.se.bakover.domain.vedtak.Vedtak import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import java.time.Clock @@ -382,8 +383,7 @@ internal class LagBrevRequestVisitorTest { ) .tilAttestering(saksbehandler) .tilIverksatt( - Attestering.Iverksatt(attestant), - EksterneIverksettingsstegForAvslag.Journalført(JournalpostId("")) + Attestering.Iverksatt(attestant) ) .let { søknadsbehandling -> LagBrevRequestVisitor( @@ -414,8 +414,7 @@ internal class LagBrevRequestVisitorTest { ) .tilAttestering(saksbehandler) .tilIverksatt( - Attestering.Iverksatt(attestant), - EksterneIverksettingsstegForAvslag.Journalført(JournalpostId("")) + Attestering.Iverksatt(attestant) ) .let { søknadsbehandling -> LagBrevRequestVisitor( @@ -462,6 +461,159 @@ internal class LagBrevRequestVisitorTest { } } + @Test + fun `lager request for vedtak om innvilget stønad`() { + val søknadsbehandling = uavklart.tilVilkårsvurdert(Behandlingsinformasjon.lagTomBehandlingsinformasjon().withAlleVilkårOppfylt()) + .tilBeregnet(innvilgetBeregning) + .tilSimulert(simulering) + .tilAttestering(saksbehandler) + .tilIverksatt(Attestering.Iverksatt(attestant), UUID30.randomUUID()) + + val innvilgetVedtak = Vedtak.InnvilgetStønad.fromSøknadsbehandling(søknadsbehandling) + + val brevSøknadsbehandling = LagBrevRequestVisitor( + hentPerson = { person.right() }, + hentNavn = { hentNavn(it) }, + clock = clock, + ).apply { søknadsbehandling.accept(this) } + + val brevVedtak = LagBrevRequestVisitor( + hentPerson = { person.right() }, + hentNavn = { hentNavn(it) }, + clock = clock, + ).apply { innvilgetVedtak.accept(this) } + + brevSøknadsbehandling.brevRequest shouldBe brevVedtak.brevRequest + + LagBrevRequest.InnvilgetVedtak( + person = person, + beregning = innvilgetBeregning, + behandlingsinformasjon = søknadsbehandling.behandlingsinformasjon, + saksbehandlerNavn = saksbehandlerNavn, + attestantNavn = attestantNavn, + ).right() + } + + @Test + fun `lager request for vedtak om avslått stønad med beregning`() { + val søknadsbehandling = ( + uavklart.tilVilkårsvurdert(Behandlingsinformasjon.lagTomBehandlingsinformasjon().withAlleVilkårOppfylt()) + .tilBeregnet(avslagBeregning) as Søknadsbehandling.Beregnet.Avslag + ) + .tilAttestering(saksbehandler) + .tilIverksatt(Attestering.Iverksatt(attestant)) + + val avslåttVedtak = Vedtak.AvslåttStønad.fromSøknadsbehandlingMedBeregning(søknadsbehandling) + + val brevSøknadsbehandling = LagBrevRequestVisitor( + hentPerson = { person.right() }, + hentNavn = { hentNavn(it) }, + clock = clock, + ).apply { søknadsbehandling.accept(this) } + + val brevVedtak = LagBrevRequestVisitor( + hentPerson = { person.right() }, + hentNavn = { hentNavn(it) }, + clock = clock, + ).apply { avslåttVedtak.accept(this) } + + brevSøknadsbehandling.brevRequest shouldBe brevVedtak.brevRequest + + AvslagBrevRequest( + person = person, + avslag = Avslag( + opprettet = Tidspunkt.now(clock), + avslagsgrunner = listOf(Avslagsgrunn.UFØRHET, Avslagsgrunn.FOR_HØY_INNTEKT), + harEktefelle = false, + beregning = avslagBeregning + ), + saksbehandlerNavn = saksbehandlerNavn, + attestantNavn = attestantNavn + ).right() + } + + @Test + fun `lager request for vedtak om avslått stønad uten beregning`() { + val søknadsbehandling = (uavklart.tilVilkårsvurdert(Behandlingsinformasjon.lagTomBehandlingsinformasjon().withVilkårAvslått()) as Søknadsbehandling.Vilkårsvurdert.Avslag) + .tilAttestering(saksbehandler) + .tilIverksatt(Attestering.Iverksatt(attestant)) + + val avslåttVedtak = Vedtak.AvslåttStønad.fromSøknadsbehandlingUtenBeregning(søknadsbehandling) + + val brevSøknadsbehandling = LagBrevRequestVisitor( + hentPerson = { person.right() }, + hentNavn = { hentNavn(it) }, + clock = clock, + ).apply { søknadsbehandling.accept(this) } + + val brevVedtak = LagBrevRequestVisitor( + hentPerson = { person.right() }, + hentNavn = { hentNavn(it) }, + clock = clock, + ).apply { avslåttVedtak.accept(this) } + + brevSøknadsbehandling.brevRequest shouldBe brevVedtak.brevRequest + + AvslagBrevRequest( + person = person, + avslag = Avslag( + opprettet = Tidspunkt.now(clock), + avslagsgrunner = listOf(Avslagsgrunn.UFØRHET, Avslagsgrunn.FOR_HØY_INNTEKT), + harEktefelle = false, + beregning = null + ), + saksbehandlerNavn = saksbehandlerNavn, + attestantNavn = attestantNavn + ).right() + } + + @Test + fun `lager request for vedtak om revurdering av inntekt`() { + val søknadsbehandling = uavklart.tilVilkårsvurdert(Behandlingsinformasjon.lagTomBehandlingsinformasjon().withAlleVilkårOppfylt()) + .tilBeregnet(innvilgetBeregning) + .tilSimulert(simulering) + .tilAttestering(saksbehandler) + .tilIverksatt(Attestering.Iverksatt(attestant), UUID30.randomUUID()) + + val revurdering = IverksattRevurdering( + id = UUID.randomUUID(), + periode = Periode.create(fraOgMed = 1.januar(2021), tilOgMed = 31.desember(2021)), + opprettet = Tidspunkt.now(clock), + tilRevurdering = Vedtak.InnvilgetStønad.fromSøknadsbehandling(søknadsbehandling), + saksbehandler = saksbehandler, + oppgaveId = OppgaveId("15"), + beregning = innvilgetBeregning, + simulering = simulering, + attestant = attestant, + utbetalingId = UUID30.randomUUID(), + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert + ) + + val avslåttVedtak = Vedtak.InnvilgetStønad.fromRevurdering(revurdering) + + val brevRevurdering = LagBrevRequestVisitor( + hentPerson = { person.right() }, + hentNavn = { hentNavn(it) }, + clock = clock, + ).apply { revurdering.accept(this) } + + val brevVedtak = LagBrevRequestVisitor( + hentPerson = { person.right() }, + hentNavn = { hentNavn(it) }, + clock = clock, + ).apply { avslåttVedtak.accept(this) } + + brevRevurdering.brevRequest shouldBe brevVedtak.brevRequest + + LagBrevRequest.Revurdering.Inntekt( + person = person, + saksbehandlerNavn = saksbehandlerNavn, + revurdertBeregning = revurdering.beregning, + fritekst = null, + harEktefelle = false + ).right() + } + private val clock = Clock.fixed(1.januar(2021).startOfDay(zoneIdOslo).instant, ZoneOffset.UTC) private val person = Person( ident = Ident( diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/AccessCheckProxy.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/AccessCheckProxy.kt index b3586b1b84..1197629d30 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/AccessCheckProxy.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/AccessCheckProxy.kt @@ -32,8 +32,7 @@ import no.nav.su.se.bakover.domain.revurdering.OpprettetRevurdering import no.nav.su.se.bakover.domain.revurdering.Revurdering import no.nav.su.se.bakover.domain.søknad.LukkSøknadRequest import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling -import no.nav.su.se.bakover.domain.visitor.LagBrevRequestVisitor -import no.nav.su.se.bakover.domain.visitor.Visitable +import no.nav.su.se.bakover.domain.vedtak.Vedtak import no.nav.su.se.bakover.service.avstemming.AvstemmingFeilet import no.nav.su.se.bakover.service.avstemming.AvstemmingService import no.nav.su.se.bakover.service.brev.BrevService @@ -58,13 +57,13 @@ import no.nav.su.se.bakover.service.søknad.SøknadService import no.nav.su.se.bakover.service.søknad.lukk.KunneIkkeLukkeSøknad import no.nav.su.se.bakover.service.søknad.lukk.LukkSøknadService import no.nav.su.se.bakover.service.søknad.lukk.LukketSøknad -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService import no.nav.su.se.bakover.service.søknadsbehandling.SøknadsbehandlingService import no.nav.su.se.bakover.service.utbetaling.FantIkkeUtbetaling import no.nav.su.se.bakover.service.utbetaling.KunneIkkeGjenopptaUtbetalinger import no.nav.su.se.bakover.service.utbetaling.KunneIkkeStanseUtbetalinger import no.nav.su.se.bakover.service.utbetaling.KunneIkkeUtbetale import no.nav.su.se.bakover.service.utbetaling.UtbetalingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService import java.time.LocalDate import java.util.UUID @@ -296,15 +295,23 @@ open class AccessCheckProxy( return services.søknadsbehandling.hent(request) } }, - ferdigstillIverksettingService = object : FerdigstillIverksettingService { + ferdigstillVedtak = object : FerdigstillVedtakService { + override fun ferdigstillVedtakEtterUtbetaling(utbetalingId: UUID30): Unit = + kastKanKunKallesFraAnnenService() - override fun opprettManglendeJournalpostOgBrevdistribusjon(): FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat { + override fun opprettManglendeJournalposterOgBrevbestillinger(): FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat { // Dette er et driftsendepunkt og vi vil ikke returnere kode 6/7/person-sensitive data. - return services.ferdigstillIverksettingService.opprettManglendeJournalpostOgBrevdistribusjon() + return services.ferdigstillVedtak.opprettManglendeJournalposterOgBrevbestillinger() } - override fun ferdigstillIverksetting(utbetalingId: UUID30) = kastKanKunKallesFraAnnenService() - override fun lagBrevRequest(visitable: Visitable) = kastKanKunKallesFraAnnenService() - override fun lukkOppgave(oppgaveId: OppgaveId) = kastKanKunKallesFraAnnenService() + + override fun journalførOgLagre(vedtak: Vedtak): Either = + kastKanKunKallesFraAnnenService() + + override fun distribuerOgLagre(vedtak: Vedtak): Either = + kastKanKunKallesFraAnnenService() + + override fun lukkOppgave(vedtak: Vedtak): Either = + kastKanKunKallesFraAnnenService() }, revurdering = object : RevurderingService { override fun opprettRevurdering( diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/ServiceBuilder.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/ServiceBuilder.kt index b73f2f5704..3916843d77 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/ServiceBuilder.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/ServiceBuilder.kt @@ -16,11 +16,10 @@ import no.nav.su.se.bakover.service.sak.SakServiceImpl import no.nav.su.se.bakover.service.statistikk.StatistikkServiceImpl import no.nav.su.se.bakover.service.søknad.SøknadServiceImpl import no.nav.su.se.bakover.service.søknad.lukk.LukkSøknadServiceImpl -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingServiceImpl -import no.nav.su.se.bakover.service.søknadsbehandling.IverksettAvslåttSøknadsbehandlingService import no.nav.su.se.bakover.service.søknadsbehandling.SøknadsbehandlingServiceImpl import no.nav.su.se.bakover.service.toggles.ToggleServiceImpl import no.nav.su.se.bakover.service.utbetaling.UtbetalingServiceImpl +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakServiceImpl import no.nav.su.se.bakover.service.vedtak.snapshot.OpprettVedtakssnapshotService import java.time.Clock @@ -76,28 +75,20 @@ object ServiceBuilder { vedtakRepo = databaseRepos.vedtakRepo ).apply { addObserver(statistikkService) } val opprettVedtakssnapshotService = OpprettVedtakssnapshotService(databaseRepos.vedtakssnapshot) - val ferdigstillIverksettingService = FerdigstillIverksettingServiceImpl( - søknadsbehandlingRepo = databaseRepos.søknadsbehandling, - oppgaveService = oppgaveService, - behandlingMetrics = behandlingMetrics, - microsoftGraphApiClient = clients.microsoftGraphApiClient, - personService = personService, - brevService = brevService, - clock = clock, - revurderingRepo = databaseRepos.revurderingRepo, - vedtakRepo = databaseRepos.vedtakRepo - ).apply { addObserver(statistikkService) } - val toggleService = ToggleServiceImpl(unleash) - val iverksettAvslåttSøknadsbehandlingService = IverksettAvslåttSøknadsbehandlingService( + val ferdigstillVedtakService = FerdigstillVedtakServiceImpl( + brevService = brevService, oppgaveService = oppgaveService, + vedtakRepo = databaseRepos.vedtakRepo, personService = personService, - behandlingMetrics = behandlingMetrics, - microsoftGraphApiClient = clients.microsoftGraphApiClient, + microsoftGraphApiOppslag = clients.microsoftGraphApiClient, clock = clock, - brevService = brevService, + utbetalingRepo = databaseRepos.utbetaling, + behandlingMetrics = behandlingMetrics ) + val toggleService = ToggleServiceImpl(unleash) + return Services( avstemming = AvstemmingServiceImpl( repo = databaseRepos.avstemming, @@ -128,18 +119,18 @@ object ServiceBuilder { utbetalingService = utbetalingService, personService = personService, oppgaveService = oppgaveService, - iverksettAvslåttSøknadsbehandlingService = iverksettAvslåttSøknadsbehandlingService, behandlingMetrics = behandlingMetrics, beregningService = BeregningService(), microsoftGraphApiClient = clients.microsoftGraphApiClient, brevService = brevService, opprettVedtakssnapshotService = opprettVedtakssnapshotService, clock = clock, - vedtakRepo = databaseRepos.vedtakRepo + vedtakRepo = databaseRepos.vedtakRepo, + ferdigstillVedtakService = ferdigstillVedtakService ).apply { addObserver(statistikkService) }, - ferdigstillIverksettingService = ferdigstillIverksettingService, + ferdigstillVedtak = ferdigstillVedtakService, revurdering = revurderingService ) } diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/Services.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/Services.kt index 03705b593a..01c6c99023 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/Services.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/Services.kt @@ -9,10 +9,10 @@ import no.nav.su.se.bakover.service.sak.SakService import no.nav.su.se.bakover.service.statistikk.StatistikkService import no.nav.su.se.bakover.service.søknad.SøknadService import no.nav.su.se.bakover.service.søknad.lukk.LukkSøknadService -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService import no.nav.su.se.bakover.service.søknadsbehandling.SøknadsbehandlingService import no.nav.su.se.bakover.service.toggles.ToggleService import no.nav.su.se.bakover.service.utbetaling.UtbetalingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService data class Services( val avstemming: AvstemmingService, @@ -26,6 +26,6 @@ data class Services( val statistikk: StatistikkService, val toggles: ToggleService, val søknadsbehandling: SøknadsbehandlingService, - val ferdigstillIverksettingService: FerdigstillIverksettingService, + val ferdigstillVedtak: FerdigstillVedtakService, val revurdering: RevurderingService, ) diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/revurdering/FerdigstillRevurderingService.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/revurdering/FerdigstillRevurderingService.kt deleted file mode 100644 index eb8d681b99..0000000000 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/revurdering/FerdigstillRevurderingService.kt +++ /dev/null @@ -1,115 +0,0 @@ -package no.nav.su.se.bakover.service.revurdering - -import arrow.core.Either -import arrow.core.flatMap -import arrow.core.right -import no.nav.su.se.bakover.database.revurdering.RevurderingRepo -import no.nav.su.se.bakover.database.vedtak.VedtakRepo -import no.nav.su.se.bakover.domain.brev.LagBrevRequest -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.AlleredeDistribuertBrev -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.MåJournalføresFørst -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.AlleredeJournalført -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.FeilVedJournalføring -import no.nav.su.se.bakover.domain.oppgave.OppgaveId -import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering -import no.nav.su.se.bakover.domain.revurdering.Revurdering -import no.nav.su.se.bakover.service.brev.BrevService -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService -import org.slf4j.LoggerFactory - -internal class FerdigstillRevurderingService( - private val brevService: BrevService, - private val revurderingRepo: RevurderingRepo, - private val ferdigstillIverksettingService: FerdigstillIverksettingService, - private val vedtakRepo: VedtakRepo -) { - private val log = LoggerFactory.getLogger(this::class.java) - - fun ferdigstill(revurdering: IverksattRevurdering) { - ferdigstillIverksettingService.lagBrevRequest(revurdering) - .mapLeft { throw KunneIkkeLageBrevRequestException(revurdering, it) } - .flatMap { brevRequest -> - journalfør(revurdering, brevRequest) - } - .flatMap { journalførtRevurdering -> - when (val steg = journalførtRevurdering.eksterneIverksettingsteg) { - is EksterneIverksettingsstegEtterUtbetaling.Journalført -> vedtakRepo.oppdaterJournalpostForRevurdering( - revurderingId = journalførtRevurdering.id, - journalpostId = steg.journalpostId - ) - else -> { - } - } - revurderingRepo.lagre(journalførtRevurdering) - distribuerBrev(journalførtRevurdering) - } - .map { journalførtOgDistribuert -> - when (val steg = journalførtOgDistribuert.eksterneIverksettingsteg) { - is EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev -> vedtakRepo.oppdaterBrevbestillingIdForRevurdering( - revurderingId = journalførtOgDistribuert.id, - brevbestillingId = steg.brevbestillingId - ) - else -> { - } - } - revurderingRepo.lagre(journalførtOgDistribuert) - lukkOppgave(journalførtOgDistribuert.oppgaveId) - } - } - - private fun journalfør( - revurdering: IverksattRevurdering, - brevRequest: LagBrevRequest - ): Either { - return revurdering.journalfør { - brevService.journalførBrev(brevRequest, revurdering.saksnummer) - .mapLeft { FeilVedJournalføring } - }.mapLeft { - return when (it) { - is AlleredeJournalført -> revurdering.right() - FeilVedJournalføring -> throw KunneIkkeJournalføreBrevException(revurdering, it) - } - } - } - - private fun distribuerBrev(revurdering: IverksattRevurdering): Either { - return revurdering.distribuerBrev { journalpostId -> - brevService.distribuerBrev(journalpostId) - .mapLeft { FeilVedDistribueringAvBrev(journalpostId) } - }.mapLeft { - return when (it) { - is AlleredeDistribuertBrev -> revurdering.right() - is FeilVedDistribueringAvBrev -> throw KunneIkkeDistribuereBrevException(revurdering, it) - MåJournalføresFørst -> throw KunneIkkeDistribuereBrevException(revurdering, it) - } - } - } - - private fun lukkOppgave(oppgaveId: OppgaveId) = ferdigstillIverksettingService.lukkOppgave(oppgaveId).mapLeft { - log.error("Kunne ikke lukke oppgave $oppgaveId ved innvilgelse av revurdering. Dette må gjøres manuelt.") - }.map { - log.info("Lukket oppgave $oppgaveId ved innvilgelse av revurdering.") - } - - internal data class KunneIkkeLageBrevRequestException( - private val revurdering: Revurdering, - private val error: FerdigstillIverksettingService.KunneIkkeFerdigstilleInnvilgelse, - val msg: String = "Kunne ikke opprette brevrequest for revurdering: ${revurdering.id}. Original feil: ${error::class.qualifiedName}" - ) : RuntimeException(msg) - - internal data class KunneIkkeJournalføreBrevException( - private val revurdering: Revurdering, - private val error: KunneIkkeJournalføre, - val msg: String = "Kunne ikke journalføre brev for revurdering: ${revurdering.id}. Original feil: ${error::class.qualifiedName}" - ) : RuntimeException(msg) - - internal data class KunneIkkeDistribuereBrevException( - private val revurdering: Revurdering, - private val error: KunneIkkeDistribuereBrev, - val msg: String = "Kunne ikke distribuere brev for revurdering: ${revurdering.id}. Original feil: ${error::class.qualifiedName}" - ) : RuntimeException(msg) -} diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillIverksettingService.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillIverksettingService.kt" deleted file mode 100644 index ff112f4f74..0000000000 --- "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillIverksettingService.kt" +++ /dev/null @@ -1,60 +0,0 @@ -package no.nav.su.se.bakover.service.søknadsbehandling - -import arrow.core.Either -import no.nav.su.se.bakover.common.UUID30 -import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.brev.LagBrevRequest -import no.nav.su.se.bakover.domain.journal.JournalpostId -import no.nav.su.se.bakover.domain.oppgave.OppgaveId -import no.nav.su.se.bakover.domain.visitor.LagBrevRequestVisitor -import no.nav.su.se.bakover.domain.visitor.Visitable -import java.util.UUID - -interface FerdigstillIverksettingService { - fun ferdigstillIverksetting(utbetalingId: UUID30) - fun opprettManglendeJournalpostOgBrevdistribusjon(): OpprettManglendeJournalpostOgBrevdistribusjonResultat - fun lagBrevRequest(visitable: Visitable): Either - fun lukkOppgave(oppgaveId: OppgaveId): Either - - sealed class KunneIkkeFerdigstilleInnvilgelse { - object FikkIkkeHentetSaksbehandlerEllerAttestant : KunneIkkeFerdigstilleInnvilgelse() - object KunneIkkeOppretteJournalpost : KunneIkkeFerdigstilleInnvilgelse() - object KunneIkkeDistribuereBrev : KunneIkkeFerdigstilleInnvilgelse() - object KunneIkkeLukkeOppgave : KunneIkkeFerdigstilleInnvilgelse() - object FantIkkePerson : KunneIkkeFerdigstilleInnvilgelse() - } - - data class KunneIkkeOppretteJournalpostForIverksetting( - val sakId: UUID, - val behandlingId: UUID, - val grunn: String, - ) - - data class OpprettetJournalpostForIverksetting( - val sakId: UUID, - val behandlingId: UUID, - val journalpostId: JournalpostId, - ) - - data class BestiltBrev( - val sakId: UUID, - val behandlingId: UUID, - val journalpostId: JournalpostId, - val brevbestillingId: BrevbestillingId, - ) - - data class KunneIkkeBestilleBrev( - val sakId: UUID, - val behandlingId: UUID, - val journalpostId: JournalpostId?, - val grunn: String, - ) - - data class OpprettManglendeJournalpostOgBrevdistribusjonResultat( - val journalpostresultat: List>, - val brevbestillingsresultat: List> - ) { - fun harFeil(): Boolean = journalpostresultat.mapNotNull { it.swap().orNull() }.isNotEmpty() || - brevbestillingsresultat.mapNotNull { it.swap().orNull() }.isNotEmpty() - } -} diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillIverksettingServiceImpl.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillIverksettingServiceImpl.kt" deleted file mode 100644 index 2a3f85933e..0000000000 --- "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillIverksettingServiceImpl.kt" +++ /dev/null @@ -1,122 +0,0 @@ -package no.nav.su.se.bakover.service.søknadsbehandling - -import arrow.core.Either -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslag -import no.nav.su.se.bakover.common.UUID30 -import no.nav.su.se.bakover.database.revurdering.RevurderingRepo -import no.nav.su.se.bakover.database.søknadsbehandling.SøknadsbehandlingRepo -import no.nav.su.se.bakover.database.vedtak.VedtakRepo -import no.nav.su.se.bakover.domain.NavIdentBruker -import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics -import no.nav.su.se.bakover.domain.brev.LagBrevRequest -import no.nav.su.se.bakover.domain.oppgave.OppgaveId -import no.nav.su.se.bakover.domain.visitor.LagBrevRequestVisitor -import no.nav.su.se.bakover.domain.visitor.Visitable -import no.nav.su.se.bakover.service.brev.BrevService -import no.nav.su.se.bakover.service.oppgave.OppgaveService -import no.nav.su.se.bakover.service.person.PersonService -import no.nav.su.se.bakover.service.revurdering.FerdigstillRevurderingService -import no.nav.su.se.bakover.service.statistikk.EventObserver -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService.KunneIkkeFerdigstilleInnvilgelse -import org.slf4j.LoggerFactory -import java.time.Clock - -internal class FerdigstillIverksettingServiceImpl( - private val søknadsbehandlingRepo: SøknadsbehandlingRepo, - private val oppgaveService: OppgaveService, - private val behandlingMetrics: BehandlingMetrics, - private val microsoftGraphApiClient: MicrosoftGraphApiOppslag, - private val personService: PersonService, - private val brevService: BrevService, - private val clock: Clock, - private val revurderingRepo: RevurderingRepo, - private val vedtakRepo: VedtakRepo -) : FerdigstillIverksettingService { - private val log = LoggerFactory.getLogger(this::class.java) - - private val observers: MutableList = mutableListOf() - - private val ferdigstillSøknadsbehandlingService = FerdigstillSøknadsbehandlingService( - søknadsbehandlingRepo = søknadsbehandlingRepo, - behandlingMetrics = behandlingMetrics, - brevService = brevService, - ferdigstillIverksettingService = this, - vedtakRepo = vedtakRepo - ) - private val opprettManglendeJournalpostOgBrevdistribusjonService = OpprettManglendeJournalpostOgBrevdistribusjonService( - søknadsbehandlingRepo = søknadsbehandlingRepo, - brevService = brevService, - ferdigstillSøknadsbehandlingService = ferdigstillSøknadsbehandlingService, - behandlingMetrics = behandlingMetrics, - vedtakRepo = vedtakRepo - ) - private val ferdigstillRevurderingService = FerdigstillRevurderingService( - brevService = brevService, - revurderingRepo = revurderingRepo, - ferdigstillIverksettingService = this, - vedtakRepo = vedtakRepo - ) - - fun addObserver(observer: EventObserver) { - observers.add(observer) - ferdigstillSøknadsbehandlingService.addObserver(observer) - } - - fun getObservers(): List = observers.toList() - - override fun ferdigstillIverksetting(utbetalingId: UUID30) { - val søknadsbehandling = søknadsbehandlingRepo.hentBehandlingForUtbetaling(utbetalingId) - val revurdering = revurderingRepo.hentRevurderingForUtbetaling(utbetalingId) - - check(listOfNotNull(søknadsbehandling, revurdering).count() == 1) { - "Fant ingen eller mange elementer knyttet til utbetaling: $utbetalingId. Kan ikke ferdigstille iverksetting." - } - - søknadsbehandling?.let { ferdigstillSøknadsbehandlingService.ferdigstillSøknadsbehandling(søknadsbehandling) } - revurdering?.let { ferdigstillRevurderingService.ferdigstill(revurdering) } - } - - override fun opprettManglendeJournalpostOgBrevdistribusjon(): FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat { - return opprettManglendeJournalpostOgBrevdistribusjonService.opprettManglendeJournalpostOgBrevdistribusjon() - } - - override fun lagBrevRequest(visitable: Visitable): Either { - return LagBrevRequestVisitor( - hentPerson = { fnr -> - personService.hentPersonMedSystembruker(fnr) - .mapLeft { LagBrevRequestVisitor.KunneIkkeLageBrevRequest.KunneIkkeHentePerson } - }, - hentNavn = { ident -> - hentNavnForNavIdent(ident) - .mapLeft { LagBrevRequestVisitor.KunneIkkeLageBrevRequest.KunneIkkeHenteNavnForSaksbehandlerEllerAttestant } - }, - clock = clock, - ).let { visitor -> - visitable.accept(visitor) - visitor.brevRequest - .mapLeft { - when (it) { - LagBrevRequestVisitor.KunneIkkeLageBrevRequest.KunneIkkeHenteNavnForSaksbehandlerEllerAttestant -> { - KunneIkkeFerdigstilleInnvilgelse.FikkIkkeHentetSaksbehandlerEllerAttestant - } - LagBrevRequestVisitor.KunneIkkeLageBrevRequest.KunneIkkeHentePerson -> { - KunneIkkeFerdigstilleInnvilgelse.FantIkkePerson - } - } - } - } - } - - fun hentNavnForNavIdent(navIdent: NavIdentBruker): Either { - return microsoftGraphApiClient.hentBrukerinformasjonForNavIdent(navIdent) - .mapLeft { KunneIkkeFerdigstilleInnvilgelse.FikkIkkeHentetSaksbehandlerEllerAttestant } - .map { it.displayName } - } - - override fun lukkOppgave( - oppgaveId: OppgaveId - ): Either { - return oppgaveService.lukkOppgaveMedSystembruker(oppgaveId) - .mapLeft { KunneIkkeFerdigstilleInnvilgelse.KunneIkkeLukkeOppgave } - } -} diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillS\303\270knadsbehandlingService.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillS\303\270knadsbehandlingService.kt" deleted file mode 100644 index bb408aeba1..0000000000 --- "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillS\303\270knadsbehandlingService.kt" +++ /dev/null @@ -1,121 +0,0 @@ -package no.nav.su.se.bakover.service.søknadsbehandling - -import arrow.core.Either -import arrow.core.flatMap -import arrow.core.getOrHandle -import arrow.core.left -import arrow.core.right -import no.nav.su.se.bakover.database.søknadsbehandling.SøknadsbehandlingRepo -import no.nav.su.se.bakover.database.vedtak.VedtakRepo -import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil -import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling -import no.nav.su.se.bakover.service.brev.BrevService -import no.nav.su.se.bakover.service.statistikk.Event -import no.nav.su.se.bakover.service.statistikk.EventObserver -import org.slf4j.LoggerFactory - -internal class FerdigstillSøknadsbehandlingService( - private val søknadsbehandlingRepo: SøknadsbehandlingRepo, - private val behandlingMetrics: BehandlingMetrics, - private val brevService: BrevService, - private val ferdigstillIverksettingService: FerdigstillIverksettingServiceImpl, - private val vedtakRepo: VedtakRepo -) { - private val log = LoggerFactory.getLogger(this::class.java) - private val observers: MutableList = mutableListOf() - - fun addObserver(observer: EventObserver) { - observers.add(observer) - } - - fun getObservers(): List = observers.toList() - - fun ferdigstillSøknadsbehandling(søknadsbehandling: Søknadsbehandling.Iverksatt.Innvilget) { - observers.forEach { observer -> - observer.handle(Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt(søknadsbehandling)) - } - opprettJournalpostOgBrevbestillingForInnvilgelse(søknadsbehandling) - - lukkOppgave(søknadsbehandling) - } - - private fun lukkOppgave(søknadsbehandling: Søknadsbehandling): Either { - return ferdigstillIverksettingService.lukkOppgave(søknadsbehandling.oppgaveId) - .mapLeft { - log.error("Kunne ikke lukke oppgave ved innvilgelse for behandling ${søknadsbehandling.id}. Dette må gjøres manuelt.") - return FerdigstillIverksettingService.KunneIkkeFerdigstilleInnvilgelse.KunneIkkeLukkeOppgave.left() - }.map { - log.info("Lukket oppgave ${søknadsbehandling.oppgaveId} ved innvilgelse for behandling ${søknadsbehandling.id}") - // TODO jah: Vurder behandling.oppdaterOppgaveId(null), men den kan ikke være null atm. - behandlingMetrics.incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.LUKKET_OPPGAVE) - } - } - - private fun opprettJournalpostOgBrevbestillingForInnvilgelse( - søknadsbehandling: Søknadsbehandling.Iverksatt.Innvilget - ): Either { - - return opprettJournalpostForInnvilgelse(søknadsbehandling) - .flatMap { s -> - s.distribuerBrev { journalpostId -> - brevService.distribuerBrev(journalpostId).mapLeft { - EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev( - journalpostId - ) - } - }.map { - when (val steg = it.eksterneIverksettingsteg) { - is EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev -> vedtakRepo.oppdaterBrevbestillingIdForSøknadsbehandling( - søknadsbehandlingId = it.id, - brevbestillingId = steg.brevbestillingId - ) - else -> { - } - } - søknadsbehandlingRepo.lagre(it) - behandlingMetrics.incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.DISTRIBUERT_BREV) - } - .mapLeft { FerdigstillIverksettingService.KunneIkkeFerdigstilleInnvilgelse.KunneIkkeDistribuereBrev } - } - } - - fun opprettJournalpostForInnvilgelse( - søknadsbehandling: Søknadsbehandling.Iverksatt.Innvilget, - ): Either { - val brevRequest = ferdigstillIverksettingService.lagBrevRequest(søknadsbehandling).getOrHandle { - return it.left() - } - - return søknadsbehandling.journalfør { - brevService.journalførBrev(brevRequest, søknadsbehandling.saksnummer) - .mapLeft { EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.FeilVedJournalføring } - }.mapLeft { - when (it) { - is EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.AlleredeJournalført -> { - log.info("Behandlingen er allerede journalført med journalpostId ${it.journalpostId}") - return søknadsbehandling.right() - } - is EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeJournalføre.FeilVedJournalføring -> { - log.error("Journalføring av iverksettingsbrev feilet for behandling ${søknadsbehandling.id}.") - FerdigstillIverksettingService.KunneIkkeFerdigstilleInnvilgelse.KunneIkkeOppretteJournalpost - } - } - }.map { - when (val steg = it.eksterneIverksettingsteg) { - is EksterneIverksettingsstegEtterUtbetaling.Journalført -> vedtakRepo.oppdaterJournalpostForSøknadsbehandling( - søknadsbehandlingId = it.id, - journalpostId = steg.journalpostId - ) - else -> { - } - } - - søknadsbehandlingRepo.lagre(it) - log.info("Journalført iverksettingsbrev $it for behandling ${søknadsbehandling.id}") - behandlingMetrics.incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.JOURNALFØRT) - it - } - } -} diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/IverksettAvsl\303\245ttS\303\270knadsbehandlingService.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/IverksettAvsl\303\245ttS\303\270knadsbehandlingService.kt" deleted file mode 100644 index 391d5de0ce..0000000000 --- "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/IverksettAvsl\303\245ttS\303\270knadsbehandlingService.kt" +++ /dev/null @@ -1,104 +0,0 @@ -package no.nav.su.se.bakover.service.søknadsbehandling - -import arrow.core.Either -import arrow.core.getOrElse -import arrow.core.getOrHandle -import arrow.core.left -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslag -import no.nav.su.se.bakover.common.Tidspunkt -import no.nav.su.se.bakover.domain.NavIdentBruker -import no.nav.su.se.bakover.domain.Person -import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics -import no.nav.su.se.bakover.domain.behandling.avslag.Avslag -import no.nav.su.se.bakover.domain.behandling.avslag.AvslagBrevRequest -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil.EksterneIverksettingsstegForAvslagFeil -import no.nav.su.se.bakover.domain.journal.JournalpostId -import no.nav.su.se.bakover.domain.søknadsbehandling.Statusovergang -import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling -import no.nav.su.se.bakover.service.brev.BrevService -import no.nav.su.se.bakover.service.oppgave.OppgaveService -import no.nav.su.se.bakover.service.person.PersonService -import org.slf4j.LoggerFactory -import java.time.Clock - -class IverksettAvslåttSøknadsbehandlingService( - private val oppgaveService: OppgaveService, - private val personService: PersonService, - private val behandlingMetrics: BehandlingMetrics, - private val clock: Clock, - private val microsoftGraphApiClient: MicrosoftGraphApiOppslag, - private val brevService: BrevService, -) { - private val log = LoggerFactory.getLogger(this::class.java) - - internal fun opprettJournalpostForAvslag( - søknadsbehandling: Søknadsbehandling.TilAttestering.Avslag, - attestant: NavIdentBruker.Attestant, - ): Either { - val person: Person = personService.hentPerson(søknadsbehandling.fnr).getOrElse { - log.error("Kunne ikke iverksette behandling; fant ikke person") - return Statusovergang.KunneIkkeIverksetteSøknadsbehandling.FantIkkePerson.left() - } - val saksbehandlerNavn = hentNavnForNavIdent(søknadsbehandling.saksbehandler).getOrHandle { - return Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeJournalføre.left() - } - val attestantNavn = hentNavnForNavIdent(attestant).getOrHandle { - return Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeJournalføre.left() - } - - return brevService.journalførBrev( - request = AvslagBrevRequest( - person = person, - avslag = Avslag( - opprettet = Tidspunkt.now(clock), - avslagsgrunner = søknadsbehandling.avslagsgrunner, - harEktefelle = søknadsbehandling.behandlingsinformasjon.harEktefelle(), - beregning = if (søknadsbehandling is Søknadsbehandling.TilAttestering.Avslag.MedBeregning) søknadsbehandling.beregning else null - ), - saksbehandlerNavn = saksbehandlerNavn, - attestantNavn = attestantNavn - ), - saksnummer = søknadsbehandling.saksnummer, - ).mapLeft { - Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeJournalføre - }.map { - behandlingMetrics.incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.JOURNALFØRT) - it - } - } - - private fun hentNavnForNavIdent(navIdent: NavIdentBruker): Either { - return microsoftGraphApiClient.hentBrukerinformasjonForNavIdent(navIdent) - .mapLeft { SøknadsbehandlingService.KunneIkkeIverksette.FikkIkkeHentetSaksbehandlerEllerAttestant } - .map { it.displayName } - } - - internal fun distribuerBrevOgLukkOppgaveForAvslag( - søknadsbehandlingUtenBrev: Søknadsbehandling.Iverksatt.Avslag, - ): Søknadsbehandling.Iverksatt.Avslag { - - val brevResultat: Either = - søknadsbehandlingUtenBrev.distribuerBrev { journalpostId -> - brevService.distribuerBrev(journalpostId) - .mapLeft { - EksterneIverksettingsstegForAvslagFeil.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev( - journalpostId - ) - }.map { - behandlingMetrics.incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.DISTRIBUERT_BREV) - it - } - } - - oppgaveService.lukkOppgave(søknadsbehandlingUtenBrev.oppgaveId) - .mapLeft { - log.error("Kunne ikke lukke oppgave ved avslag for behandling ${søknadsbehandlingUtenBrev.id}. Dette må gjøres manuelt.") - } - .map { - log.info("Lukket oppgave ${søknadsbehandlingUtenBrev.oppgaveId} ved avslag for behandling ${søknadsbehandlingUtenBrev.id}") - // TODO jah: Vurder behandling.oppdaterOppgaveId(null), men den kan ikke være null atm. - behandlingMetrics.incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.LUKKET_OPPGAVE) - } - return brevResultat.getOrElse { søknadsbehandlingUtenBrev } - } -} diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/OpprettManglendeJournalpostOgBrevdistribusjonService.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/OpprettManglendeJournalpostOgBrevdistribusjonService.kt" deleted file mode 100644 index 8986dbbc46..0000000000 --- "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/OpprettManglendeJournalpostOgBrevdistribusjonService.kt" +++ /dev/null @@ -1,158 +0,0 @@ -package no.nav.su.se.bakover.service.søknadsbehandling - -import arrow.core.Either -import arrow.core.left -import no.nav.su.se.bakover.database.søknadsbehandling.SøknadsbehandlingRepo -import no.nav.su.se.bakover.database.vedtak.VedtakRepo -import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegFeil -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag -import no.nav.su.se.bakover.domain.journal.JournalpostId -import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling -import no.nav.su.se.bakover.service.brev.BrevService -import java.util.UUID - -internal class OpprettManglendeJournalpostOgBrevdistribusjonService( - private val søknadsbehandlingRepo: SøknadsbehandlingRepo, - private val brevService: BrevService, - private val ferdigstillSøknadsbehandlingService: FerdigstillSøknadsbehandlingService, - private val behandlingMetrics: BehandlingMetrics, - private val vedtakRepo: VedtakRepo -) { - fun opprettManglendeJournalpostOgBrevdistribusjon(): FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat { - return FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = opprettManglendeJournalposteringer().map { - it.map { behandling -> - FerdigstillIverksettingService.OpprettetJournalpostForIverksetting( - sakId = behandling.sakId, - behandlingId = behandling.id, - journalpostId = behandling.eksterneIverksettingsteg.journalpostId()!! // Skal egentlig ikke være i tilstanden VenterPåKvittering - ) - } - }, - brevbestillingsresultat = opprettManglendeBrevbestillinger(), - ) - } - - fun opprettManglendeJournalposteringer(): List> { - return søknadsbehandlingRepo.hentIverksatteBehandlingerUtenJournalposteringer().map { søknadsbehandling -> - if (søknadsbehandling.eksterneIverksettingsteg !is EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering) { - return@map FerdigstillIverksettingService.KunneIkkeOppretteJournalpostForIverksetting( - sakId = søknadsbehandling.sakId, - behandlingId = søknadsbehandling.id, - grunn = "Kunne ikke opprette journalpost for iverksetting siden den allerede eksisterer" - ).left() - } - return@map ferdigstillSøknadsbehandlingService.opprettJournalpostForInnvilgelse( - søknadsbehandling = søknadsbehandling, - ).mapLeft { - FerdigstillIverksettingService.KunneIkkeOppretteJournalpostForIverksetting( - sakId = søknadsbehandling.sakId, - behandlingId = søknadsbehandling.id, - grunn = it.javaClass.simpleName - ) - } - } - } - - private fun opprettManglendeBrevbestillinger(): List> { - return søknadsbehandlingRepo.hentIverksatteBehandlingerUtenBrevbestillinger().map { søknadsbehandling -> - when (søknadsbehandling) { - is Søknadsbehandling.Iverksatt.Avslag -> { - søknadsbehandling.distribuerBrev { journalpostId -> - brevService.distribuerBrev(journalpostId).mapLeft { - EksterneIverksettingsstegFeil.EksterneIverksettingsstegForAvslagFeil.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev( - journalpostId - ) - } - }.mapLeft { - when (it) { - is EksterneIverksettingsstegFeil.EksterneIverksettingsstegForAvslagFeil.KunneIkkeDistribuereBrev.AlleredeDistribuertBrev -> { - kunneIkkeBestilleBrev( - søknadsbehandling.sakId, - søknadsbehandling.id, - it.journalpostId, - it - ) - } - is EksterneIverksettingsstegFeil.EksterneIverksettingsstegForAvslagFeil.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev -> { - kunneIkkeBestilleBrev( - søknadsbehandling.sakId, - søknadsbehandling.id, - it.journalpostId, - it - ) - } - } - }.map { avslagMedJorunalpostOgDistribuertBrev -> - søknadsbehandlingRepo.lagre(avslagMedJorunalpostOgDistribuertBrev) - behandlingMetrics.incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.DISTRIBUERT_BREV) - val steg = (avslagMedJorunalpostOgDistribuertBrev.eksterneIverksettingsteg as EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev) - vedtakRepo.oppdaterBrevbestillingIdForSøknadsbehandling(søknadsbehandling.id, steg.brevbestillingId) - FerdigstillIverksettingService.BestiltBrev( - sakId = søknadsbehandling.sakId, - behandlingId = søknadsbehandling.id, - journalpostId = steg.journalpostId, - brevbestillingId = steg.brevbestillingId, - ) - } - } - is Søknadsbehandling.Iverksatt.Innvilget -> { - søknadsbehandling.distribuerBrev { journalpostId -> - brevService.distribuerBrev(journalpostId).mapLeft { - EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev( - journalpostId - ) - } - }.mapLeft { - when (it) { - is EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.AlleredeDistribuertBrev -> { - kunneIkkeBestilleBrev( - søknadsbehandling.sakId, - søknadsbehandling.id, - it.journalpostId, - it - ) - } - is EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev -> { - kunneIkkeBestilleBrev( - søknadsbehandling.sakId, - søknadsbehandling.id, - it.journalpostId, - it - ) - } - EksterneIverksettingsstegFeil.EksterneIverksettingsstegEtterUtbetalingFeil.KunneIkkeDistribuereBrev.MåJournalføresFørst -> { - kunneIkkeBestilleBrev(søknadsbehandling.sakId, søknadsbehandling.id, null, it) - } - } - }.map { innvilgetMedJournalpostOgDistribuertBrev -> - søknadsbehandlingRepo.lagre(innvilgetMedJournalpostOgDistribuertBrev) - behandlingMetrics.incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.DISTRIBUERT_BREV) - val steg = (innvilgetMedJournalpostOgDistribuertBrev.eksterneIverksettingsteg as EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev) - vedtakRepo.oppdaterBrevbestillingIdForSøknadsbehandling(søknadsbehandling.id, steg.brevbestillingId) - FerdigstillIverksettingService.BestiltBrev( - sakId = søknadsbehandling.sakId, - behandlingId = søknadsbehandling.id, - journalpostId = steg.journalpostId, - brevbestillingId = steg.brevbestillingId, - ) - } - } - } - } - } - - private fun kunneIkkeBestilleBrev( - sakId: UUID, - behandlingId: UUID, - journalpostId: JournalpostId?, - error: Any - ) = FerdigstillIverksettingService.KunneIkkeBestilleBrev( - sakId = sakId, - behandlingId = behandlingId, - journalpostId = journalpostId, - grunn = error.javaClass.simpleName - ) -} diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceImpl.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceImpl.kt" index 8792337773..df6d9ba02e 100644 --- "a/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceImpl.kt" +++ "b/service/src/main/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceImpl.kt" @@ -36,6 +36,7 @@ import no.nav.su.se.bakover.service.statistikk.EventObserver import no.nav.su.se.bakover.service.søknad.SøknadService import no.nav.su.se.bakover.service.utbetaling.KunneIkkeUtbetale import no.nav.su.se.bakover.service.utbetaling.UtbetalingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService import no.nav.su.se.bakover.service.vedtak.snapshot.OpprettVedtakssnapshotService import org.slf4j.LoggerFactory import java.time.Clock @@ -48,14 +49,14 @@ internal class SøknadsbehandlingServiceImpl( private val utbetalingService: UtbetalingService, private val personService: PersonService, private val oppgaveService: OppgaveService, - private val iverksettAvslåttSøknadsbehandlingService: IverksettAvslåttSøknadsbehandlingService, private val behandlingMetrics: BehandlingMetrics, private val beregningService: BeregningService, private val microsoftGraphApiClient: MicrosoftGraphApiOppslag, private val brevService: BrevService, private val opprettVedtakssnapshotService: OpprettVedtakssnapshotService, private val clock: Clock, - private val vedtakRepo: VedtakRepo + private val vedtakRepo: VedtakRepo, + private val ferdigstillVedtakService: FerdigstillVedtakService ) : SøknadsbehandlingService { private val log = LoggerFactory.getLogger(this::class.java) @@ -265,7 +266,6 @@ internal class SøknadsbehandlingServiceImpl( ) } } - søknadsbehandlingMedNyOppgaveId } } @@ -278,76 +278,76 @@ internal class SøknadsbehandlingServiceImpl( return forsøkStatusovergang( søknadsbehandling = søknadsbehandling, statusovergang = Statusovergang.TilIverksatt( - attestering = request.attestering, - innvilget = { - utbetalingService.utbetal( - sakId = it.sakId, - attestant = request.attestering.attestant, - beregning = it.beregning, - simulering = it.simulering - ).mapLeft { - log.error("Kunne ikke innvilge behandling ${søknadsbehandling.id} siden utbetaling feilet. Feiltype: $it") - when (it) { - KunneIkkeUtbetale.KunneIkkeSimulere -> Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeUtbetale.KunneIkkeKontrollsimulere - KunneIkkeUtbetale.Protokollfeil -> Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeUtbetale.TekniskFeil - KunneIkkeUtbetale.SimuleringHarBlittEndretSidenSaksbehandlerSimulerte -> Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeUtbetale.SimuleringHarBlittEndretSidenSaksbehandlerSimulerte - } - }.map { - // Dersom vi skal unngå denne hacken må Iverksatt.Innvilget innholde denne istedenfor kun IDen - utbetaling = it - it.id + attestering = request.attestering + ) { + utbetalingService.utbetal( + sakId = it.sakId, + attestant = request.attestering.attestant, + beregning = it.beregning, + simulering = it.simulering + ).mapLeft { + log.error("Kunne ikke innvilge behandling ${søknadsbehandling.id} siden utbetaling feilet. Feiltype: $it") + when (it) { + KunneIkkeUtbetale.KunneIkkeSimulere -> Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeUtbetale.KunneIkkeKontrollsimulere + KunneIkkeUtbetale.Protokollfeil -> Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeUtbetale.TekniskFeil + KunneIkkeUtbetale.SimuleringHarBlittEndretSidenSaksbehandlerSimulerte -> Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeUtbetale.SimuleringHarBlittEndretSidenSaksbehandlerSimulerte } - }, - avslag = { - iverksettAvslåttSøknadsbehandlingService.opprettJournalpostForAvslag( - it, - request.attestering.attestant - ) + }.map { + // Dersom vi skal unngå denne hacken må Iverksatt.Innvilget innholde denne istedenfor kun IDen + utbetaling = it + it.id } - ) + } ).mapLeft { IverksettStatusovergangFeilMapper.map(it) - }.map { - søknadsbehandlingRepo.lagre(it) - when (it) { + }.map { iverksattBehandling -> + when (iverksattBehandling) { is Søknadsbehandling.Iverksatt.Innvilget -> { - log.info("Iverksatt innvilgelse for behandling ${it.id}") + søknadsbehandlingRepo.lagre(iverksattBehandling) + vedtakRepo.lagre(opprettVedtak(iverksattBehandling)) + + log.info("Iverksatt innvilgelse for behandling ${iverksattBehandling.id}") opprettVedtakssnapshotService.opprettVedtak( - vedtakssnapshot = Vedtakssnapshot.Innvilgelse.createFromBehandling(it, utbetaling!!) + vedtakssnapshot = Vedtakssnapshot.Innvilgelse.createFromBehandling(iverksattBehandling, utbetaling!!) ) behandlingMetrics.incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.PERSISTERT) - vedtakRepo.lagre(Vedtak.InnvilgetStønad.fromSøknadsbehandling(it)) - - it + iverksattBehandling.also { + observers.forEach { observer -> + observer.handle(Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt(iverksattBehandling)) + } + } } is Søknadsbehandling.Iverksatt.Avslag -> { - log.info("Iverksatt avslag for behandling ${it.id}") - opprettVedtakssnapshotService.opprettVedtak( - vedtakssnapshot = Vedtakssnapshot.Avslag.createFromBehandling(it, it.avslagsgrunner) - ) - behandlingMetrics.incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.PERSISTERT) - iverksettAvslåttSøknadsbehandlingService.distribuerBrevOgLukkOppgaveForAvslag(it) - .let { medPotensiellBrevbestillingId -> - søknadsbehandlingRepo.lagre(medPotensiellBrevbestillingId) - when (medPotensiellBrevbestillingId) { - is Søknadsbehandling.Iverksatt.Avslag.MedBeregning -> vedtakRepo.lagre( - Vedtak.AvslåttStønad.fromSøknadsbehandlingMedBeregning( - medPotensiellBrevbestillingId - ) - ) - is Søknadsbehandling.Iverksatt.Avslag.UtenBeregning -> vedtakRepo.lagre( - Vedtak.AvslåttStønad.fromSøknadsbehandlingUtenBeregning( - medPotensiellBrevbestillingId + val vedtak = opprettVedtak(iverksattBehandling) + return ferdigstillVedtakService.journalførOgLagre(vedtak) + .mapLeft { + log.error("Journalføring av vedtak for behandling: ${vedtak.behandling.id} feilet.") + SøknadsbehandlingService.KunneIkkeIverksette.KunneIkkeJournalføreBrev + }.map { journalførtVedtak -> + søknadsbehandlingRepo.lagre(iverksattBehandling) + + log.info("Iverksatt avslag for behandling: ${iverksattBehandling.id}, vedtak: ${vedtak.id}") + opprettVedtakssnapshotService.opprettVedtak( + vedtakssnapshot = Vedtakssnapshot.Avslag.createFromBehandling(iverksattBehandling, iverksattBehandling.avslagsgrunner) + ) + + behandlingMetrics.incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.PERSISTERT) + + ferdigstillVedtakService.distribuerOgLagre(journalførtVedtak) + .mapLeft { + log.error("Distribusjon av brev for vedtakId: ${journalførtVedtak.id} feilet. Må ryddes opp manuelt.") + } + ferdigstillVedtakService.lukkOppgave(journalførtVedtak) + .mapLeft { + log.error("Lukking av oppgave for behandlingId: ${journalførtVedtak.behandling.oppgaveId} feilet. Må ryddes opp manuelt.") + } + iverksattBehandling.also { + observers.forEach { observer -> + observer.handle( + Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt(iverksattBehandling) ) - ) - } - medPotensiellBrevbestillingId - }.also { - observers.forEach { observer -> - observer.handle( - Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt(it) - ) + } } } } @@ -355,6 +355,18 @@ internal class SøknadsbehandlingServiceImpl( } } + private fun opprettVedtak(iverksattBehandling: Søknadsbehandling.Iverksatt): Vedtak = when (iverksattBehandling) { + is Søknadsbehandling.Iverksatt.Innvilget -> { + Vedtak.InnvilgetStønad.fromSøknadsbehandling(iverksattBehandling) + } + is Søknadsbehandling.Iverksatt.Avslag.MedBeregning -> { + Vedtak.AvslåttStønad.fromSøknadsbehandlingMedBeregning(iverksattBehandling) + } + is Søknadsbehandling.Iverksatt.Avslag.UtenBeregning -> { + Vedtak.AvslåttStønad.fromSøknadsbehandlingUtenBeregning(iverksattBehandling) + } + } + internal object IverksettStatusovergangFeilMapper { fun map(feil: Statusovergang.KunneIkkeIverksetteSøknadsbehandling) = when (feil) { Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeJournalføre -> SøknadsbehandlingService.KunneIkkeIverksette.KunneIkkeJournalføreBrev diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/vedtak/FerdigstillVedtakService.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/vedtak/FerdigstillVedtakService.kt new file mode 100644 index 0000000000..b41afba736 --- /dev/null +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/vedtak/FerdigstillVedtakService.kt @@ -0,0 +1,353 @@ +package no.nav.su.se.bakover.service.vedtak + +import arrow.core.Either +import arrow.core.getOrHandle +import arrow.core.left +import arrow.core.right +import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslag +import no.nav.su.se.bakover.common.UUID30 +import no.nav.su.se.bakover.database.utbetaling.UtbetalingRepo +import no.nav.su.se.bakover.database.vedtak.VedtakRepo +import no.nav.su.se.bakover.domain.NavIdentBruker +import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics +import no.nav.su.se.bakover.domain.brev.BrevbestillingId +import no.nav.su.se.bakover.domain.brev.LagBrevRequest +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.KunneIkkeJournalføreOgDistribuereBrev +import no.nav.su.se.bakover.domain.journal.JournalpostId +import no.nav.su.se.bakover.domain.oppdrag.Utbetaling +import no.nav.su.se.bakover.domain.vedtak.Vedtak +import no.nav.su.se.bakover.domain.visitor.LagBrevRequestVisitor +import no.nav.su.se.bakover.domain.visitor.Visitable +import no.nav.su.se.bakover.service.brev.BrevService +import no.nav.su.se.bakover.service.oppgave.OppgaveService +import no.nav.su.se.bakover.service.person.PersonService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak +import org.slf4j.LoggerFactory +import java.time.Clock +import java.util.UUID + +interface FerdigstillVedtakService { + fun ferdigstillVedtakEtterUtbetaling(utbetalingId: UUID30) + fun opprettManglendeJournalposterOgBrevbestillinger(): OpprettManglendeJournalpostOgBrevdistribusjonResultat + fun journalførOgLagre(vedtak: Vedtak): Either + fun distribuerOgLagre(vedtak: Vedtak): Either + fun lukkOppgave(vedtak: Vedtak): Either + + sealed class KunneIkkeFerdigstilleVedtak { + + sealed class KunneIkkeJournalføreBrev : KunneIkkeFerdigstilleVedtak() { + object FantIkkeNavnPåSaksbehandlerEllerAttestant : KunneIkkeJournalføreBrev() + object FantIkkePerson : KunneIkkeJournalføreBrev() + object FeilVedJournalføring : KunneIkkeJournalføreBrev() + data class AlleredeJournalført(val journalpostId: JournalpostId) : KunneIkkeJournalføreBrev() + } + + sealed class KunneIkkeDistribuereBrev : KunneIkkeFerdigstilleVedtak() { + object MåJournalføresFørst : KunneIkkeDistribuereBrev() + data class FeilVedDistribusjon(val journalpostId: JournalpostId) : KunneIkkeDistribuereBrev() + data class AlleredeDistribuert(val journalpostId: JournalpostId) : KunneIkkeDistribuereBrev() + } + + object KunneIkkeLukkeOppgave : KunneIkkeFerdigstilleVedtak() + } + + data class KunneIkkeOppretteJournalpostForIverksetting( + val sakId: UUID, + val behandlingId: UUID, + val grunn: String, + ) + + data class OpprettetJournalpostForIverksetting( + val sakId: UUID, + val behandlingId: UUID, + val journalpostId: JournalpostId, + ) + + data class BestiltBrev( + val sakId: UUID, + val behandlingId: UUID, + val journalpostId: JournalpostId, + val brevbestillingId: BrevbestillingId, + ) + + data class KunneIkkeBestilleBrev( + val sakId: UUID, + val behandlingId: UUID, + val journalpostId: JournalpostId?, + val grunn: String, + ) + + data class OpprettManglendeJournalpostOgBrevdistribusjonResultat( + val journalpostresultat: List>, + val brevbestillingsresultat: List> + ) { + fun harFeil(): Boolean = journalpostresultat.mapNotNull { it.swap().orNull() }.isNotEmpty() || + brevbestillingsresultat.mapNotNull { it.swap().orNull() }.isNotEmpty() + } +} + +internal class FerdigstillVedtakServiceImpl( + private val brevService: BrevService, + private val oppgaveService: OppgaveService, + private val vedtakRepo: VedtakRepo, + private val personService: PersonService, + private val microsoftGraphApiOppslag: MicrosoftGraphApiOppslag, + private val clock: Clock, + private val utbetalingRepo: UtbetalingRepo, + private val behandlingMetrics: BehandlingMetrics +) : FerdigstillVedtakService { + private val log = LoggerFactory.getLogger(this::class.java) + + /** + * Entry point for kvittering consumer. + */ + override fun ferdigstillVedtakEtterUtbetaling(utbetalingId: UUID30) { + val vedtak = vedtakRepo.hentForUtbetaling(utbetalingId) + ferdigstillVedtak(vedtak).getOrHandle { + throw KunneIkkeFerdigstilleVedtakException(vedtak, it) + } + } + + /** + * Entry point for drift-operations + */ + override fun opprettManglendeJournalposterOgBrevbestillinger(): FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat { + val alleUtenJournalpost = vedtakRepo.hentUtenJournalpost() + val innvilgetUtenJournalpost = alleUtenJournalpost.filterIsInstance() + /** + * Unngår å journalføre og distribuere brev for innvilgelser hvor vi ikke har mottatt kvittering, + * eller mottatt kvittering ikke er ok. + */ + .filter { innvilgetVedtak -> + utbetalingRepo.hentUtbetaling(innvilgetVedtak.utbetalingId)!!.let { + it is Utbetaling.OversendtUtbetaling.MedKvittering && it.kvittering.erKvittertOk() + } + } + val avslagUtenJournalpost = alleUtenJournalpost.filterIsInstance() + val journalpostResultat = innvilgetUtenJournalpost.plus(avslagUtenJournalpost).map { vedtak -> + journalførOgLagre(vedtak) + .mapLeft { feilVedJournalføring -> + when (feilVedJournalføring) { + is KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.AlleredeJournalført -> { + return@map FerdigstillVedtakService.KunneIkkeOppretteJournalpostForIverksetting( + sakId = vedtak.behandling.sakId, + behandlingId = vedtak.behandling.id, + grunn = "Kunne ikke opprette journalpost for iverksetting siden den allerede eksisterer" + ).left() + } + else -> { + FerdigstillVedtakService.KunneIkkeOppretteJournalpostForIverksetting( + sakId = vedtak.behandling.sakId, + behandlingId = vedtak.behandling.id, + grunn = feilVedJournalføring.javaClass.simpleName + ) + } + } + }.map { journalførtVedtak -> + FerdigstillVedtakService.OpprettetJournalpostForIverksetting( + sakId = journalførtVedtak.behandling.sakId, + behandlingId = journalførtVedtak.behandling.id, + journalpostId = journalførtVedtak.journalføringOgBrevdistribusjon.journalpostId()!! + ) + } + } + + val alleUtenBrevbestilling = vedtakRepo.hentUtenBrevbestilling() + + val innvilgetUtenBrevbestilling = alleUtenBrevbestilling.filterIsInstance() + /** + * Unngår å journalføre og distribuere brev for innvilgelser hvor vi ikke har mottatt kvittering, + * eller mottatt kvittering ikke er ok. + */ + .filter { innvilgetVedtak -> + utbetalingRepo.hentUtbetaling(innvilgetVedtak.utbetalingId)!!.let { + it is Utbetaling.OversendtUtbetaling.MedKvittering && it.kvittering.erKvittertOk() + } + } + + val avslagUtenBrevbestilling = alleUtenBrevbestilling.filterIsInstance() + val brevbestillingResultat = innvilgetUtenBrevbestilling.plus(avslagUtenBrevbestilling).map { vedtak -> + distribuerOgLagre(vedtak) + .mapLeft { + kunneIkkeBestilleBrev(vedtak, it) + } + .map { distribuertVedtak -> + val steg = (distribuertVedtak.journalføringOgBrevdistribusjon as JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev) + FerdigstillVedtakService.BestiltBrev( + sakId = distribuertVedtak.behandling.sakId, + behandlingId = distribuertVedtak.behandling.id, + journalpostId = steg.journalpostId, + brevbestillingId = steg.brevbestillingId, + ) + } + } + + return FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( + journalpostresultat = journalpostResultat, + brevbestillingsresultat = brevbestillingResultat + ) + } + + private fun ferdigstillVedtak(vedtak: Vedtak): Either { + val journalførtVedtak = journalførOgLagre(vedtak).getOrHandle { feilVedJournalføring -> + when (feilVedJournalføring) { + is KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.AlleredeJournalført -> vedtak + else -> return feilVedJournalføring.left() + } + } + + val distribuertVedtak = distribuerOgLagre(journalførtVedtak).getOrHandle { feilVedDistribusjon -> + when (feilVedDistribusjon) { + is KunneIkkeFerdigstilleVedtak.KunneIkkeDistribuereBrev.AlleredeDistribuert -> journalførtVedtak + else -> return feilVedDistribusjon.left() + } + } + + lukkOppgave(distribuertVedtak) + + return distribuertVedtak.right() + } + + override fun journalførOgLagre(vedtak: Vedtak): Either { + val brevRequest = lagBrevRequest(vedtak).getOrHandle { return it.left() } + return vedtak.journalfør { + brevService.journalførBrev(brevRequest, vedtak.behandling.saksnummer) + .mapLeft { KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeJournalføre.FeilVedJournalføring } + }.mapLeft { + when (it) { + is KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeJournalføre.AlleredeJournalført -> { + KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.AlleredeJournalført(it.journalpostId) + } + KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeJournalføre.FeilVedJournalføring -> { + KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.FeilVedJournalføring + } + } + }.map { journalførtVedtak -> + log.info("Journalført brev for vedtak: ${journalførtVedtak.id}") + vedtakRepo.lagre(journalførtVedtak) + incrementJournalført(journalførtVedtak) + journalførtVedtak + } + } + + override fun distribuerOgLagre(vedtak: Vedtak): Either { + return vedtak.distribuerBrev { journalpostId -> + brevService.distribuerBrev(journalpostId) + .mapLeft { KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev(journalpostId) } + }.mapLeft { + when (it) { + is KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeDistribuereBrev.AlleredeDistribuertBrev -> { + KunneIkkeFerdigstilleVedtak.KunneIkkeDistribuereBrev.AlleredeDistribuert(it.journalpostId) + } + is KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeDistribuereBrev.FeilVedDistribueringAvBrev -> { + KunneIkkeFerdigstilleVedtak.KunneIkkeDistribuereBrev.FeilVedDistribusjon(it.journalpostId) + } + KunneIkkeJournalføreOgDistribuereBrev.KunneIkkeDistribuereBrev.MåJournalføresFørst -> { + KunneIkkeFerdigstilleVedtak.KunneIkkeDistribuereBrev.MåJournalføresFørst + } + } + }.map { distribuertVedtak -> + log.info("Bestilt distribusjon av brev for vedtak: ${distribuertVedtak.id}") + vedtakRepo.lagre(distribuertVedtak) + incrementDistribuert(vedtak) + distribuertVedtak + } + } + + private fun lagBrevRequest(visitable: Visitable): Either { + return lagBrevVisitor().let { visitor -> + visitable.accept(visitor) + visitor.brevRequest + .mapLeft { + when (it) { + LagBrevRequestVisitor.KunneIkkeLageBrevRequest.KunneIkkeHenteNavnForSaksbehandlerEllerAttestant -> { + KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.FantIkkeNavnPåSaksbehandlerEllerAttestant + } + LagBrevRequestVisitor.KunneIkkeLageBrevRequest.KunneIkkeHentePerson -> { + KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.FantIkkePerson + } + } + } + } + } + + private fun lagBrevVisitor(): LagBrevRequestVisitor = LagBrevRequestVisitor( + hentPerson = { fnr -> + personService.hentPersonMedSystembruker(fnr) + .mapLeft { LagBrevRequestVisitor.KunneIkkeLageBrevRequest.KunneIkkeHentePerson } + }, + hentNavn = { ident -> + hentNavnForNavIdent(ident) + .mapLeft { LagBrevRequestVisitor.KunneIkkeLageBrevRequest.KunneIkkeHenteNavnForSaksbehandlerEllerAttestant } + }, + clock = clock, + ) + + private fun hentNavnForNavIdent(navIdent: NavIdentBruker): Either { + return microsoftGraphApiOppslag.hentBrukerinformasjonForNavIdent(navIdent) + .mapLeft { KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.FantIkkeNavnPåSaksbehandlerEllerAttestant } + .map { it.displayName } + } + + override fun lukkOppgave(vedtak: Vedtak): Either { + return oppgaveService.lukkOppgave(vedtak.behandling.oppgaveId) + .mapLeft { + log.error("Kunne ikke lukke oppgave: ${vedtak.behandling.oppgaveId} for behandling: ${vedtak.behandling.id}") + KunneIkkeFerdigstilleVedtak.KunneIkkeLukkeOppgave + }.map { + log.info("Lukket oppgave: ${vedtak.behandling.oppgaveId} for behandling: ${vedtak.behandling.id}") + incrementLukketOppgave(vedtak) + vedtak + } + } + + private fun kunneIkkeBestilleBrev( + vedtak: Vedtak, + error: Any + ) = FerdigstillVedtakService.KunneIkkeBestilleBrev( + sakId = vedtak.behandling.sakId, + behandlingId = vedtak.behandling.id, + journalpostId = vedtak.journalføringOgBrevdistribusjon.journalpostId(), + grunn = error.javaClass.simpleName + ) + + private fun incrementJournalført(vedtak: Vedtak) { + when (vedtak) { + is Vedtak.AvslåttStønad -> { + behandlingMetrics.incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.JOURNALFØRT) + } + is Vedtak.InnvilgetStønad -> { + behandlingMetrics.incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.JOURNALFØRT) + } + } + } + + private fun incrementDistribuert(vedtak: Vedtak) { + when (vedtak) { + is Vedtak.AvslåttStønad -> { + behandlingMetrics.incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.DISTRIBUERT_BREV) + } + is Vedtak.InnvilgetStønad -> { + behandlingMetrics.incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.DISTRIBUERT_BREV) + } + } + } + + private fun incrementLukketOppgave(vedtak: Vedtak) { + when (vedtak) { + is Vedtak.AvslåttStønad -> { + behandlingMetrics.incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.LUKKET_OPPGAVE) + } + is Vedtak.InnvilgetStønad -> { + behandlingMetrics.incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.LUKKET_OPPGAVE) + } + } + } + + internal data class KunneIkkeFerdigstilleVedtakException( + private val vedtak: Vedtak, + private val error: KunneIkkeFerdigstilleVedtak, + val msg: String = "Kunne ikke ferdigstille vedtakId: ${vedtak.id}. Original feil: ${error::class.qualifiedName}" + ) : RuntimeException(msg) +} diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/AccessCheckProxyTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/AccessCheckProxyTest.kt index ab60792aab..dc9c1f0223 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/AccessCheckProxyTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/AccessCheckProxyTest.kt @@ -32,7 +32,7 @@ internal class AccessCheckProxyTest { statistikk = mock(), toggles = mock(), søknadsbehandling = mock(), - ferdigstillIverksettingService = mock(), + ferdigstillVedtak = mock(), revurdering = mock(), ) diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/ServiceBuilderTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/ServiceBuilderTest.kt index 590653a971..8985bf6644 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/ServiceBuilderTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/ServiceBuilderTest.kt @@ -6,7 +6,6 @@ import no.nav.su.se.bakover.client.Clients import no.nav.su.se.bakover.database.DatabaseRepos import no.nav.su.se.bakover.service.revurdering.RevurderingServiceImpl import no.nav.su.se.bakover.service.sak.SakServiceImpl -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingServiceImpl import no.nav.su.se.bakover.service.søknadsbehandling.SøknadsbehandlingServiceImpl import org.junit.jupiter.api.Test import java.time.Clock @@ -52,7 +51,8 @@ internal class ServiceBuilderTest { (it.sak as SakServiceImpl).observers shouldContain it.statistikk (it.søknadsbehandling as SøknadsbehandlingServiceImpl).getObservers() shouldContain it.statistikk (it.revurdering as RevurderingServiceImpl).getObservers() shouldContain it.statistikk - (it.ferdigstillIverksettingService as FerdigstillIverksettingServiceImpl).getObservers() shouldContain it.statistikk + // TODO add statistikk +// (it.ferdigstillVedtak as FerdigstillVedtakService).getObservers() shouldContain it.statistikk } } } diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/FerdigstillRevurderingServiceTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/FerdigstillRevurderingServiceTest.kt deleted file mode 100644 index d1ca1b62f5..0000000000 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/FerdigstillRevurderingServiceTest.kt +++ /dev/null @@ -1,528 +0,0 @@ -package no.nav.su.se.bakover.service.revurdering - -import arrow.core.left -import arrow.core.right -import com.nhaarman.mockitokotlin2.any -import com.nhaarman.mockitokotlin2.doReturn -import com.nhaarman.mockitokotlin2.doReturnConsecutively -import com.nhaarman.mockitokotlin2.inOrder -import com.nhaarman.mockitokotlin2.mock -import com.nhaarman.mockitokotlin2.never -import com.nhaarman.mockitokotlin2.times -import io.kotest.matchers.shouldBe -import io.kotest.matchers.types.shouldBeTypeOf -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslag -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslagFeil -import no.nav.su.se.bakover.common.Tidspunkt -import no.nav.su.se.bakover.common.UUID30 -import no.nav.su.se.bakover.common.januar -import no.nav.su.se.bakover.common.mars -import no.nav.su.se.bakover.common.periode.Periode -import no.nav.su.se.bakover.database.revurdering.RevurderingRepo -import no.nav.su.se.bakover.database.søknadsbehandling.SøknadsbehandlingRepo -import no.nav.su.se.bakover.database.vedtak.VedtakRepo -import no.nav.su.se.bakover.domain.AktørId -import no.nav.su.se.bakover.domain.Ident -import no.nav.su.se.bakover.domain.NavIdentBruker -import no.nav.su.se.bakover.domain.Person -import no.nav.su.se.bakover.domain.Saksnummer -import no.nav.su.se.bakover.domain.Søknad -import no.nav.su.se.bakover.domain.SøknadInnholdTestdataBuilder -import no.nav.su.se.bakover.domain.behandling.Attestering -import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics -import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon -import no.nav.su.se.bakover.domain.behandling.withAlleVilkårOppfylt -import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.brev.LagBrevRequest -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.journal.JournalpostId -import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering -import no.nav.su.se.bakover.domain.oppgave.KunneIkkeLukkeOppgave -import no.nav.su.se.bakover.domain.oppgave.OppgaveId -import no.nav.su.se.bakover.domain.person.KunneIkkeHentePerson -import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering -import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling -import no.nav.su.se.bakover.domain.vedtak.Vedtak -import no.nav.su.se.bakover.service.FnrGenerator -import no.nav.su.se.bakover.service.argThat -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils -import no.nav.su.se.bakover.service.beregning.TestBeregning -import no.nav.su.se.bakover.service.brev.BrevService -import no.nav.su.se.bakover.service.brev.KunneIkkeDistribuereBrev -import no.nav.su.se.bakover.service.brev.KunneIkkeJournalføreBrev -import no.nav.su.se.bakover.service.doNothing -import no.nav.su.se.bakover.service.oppgave.OppgaveService -import no.nav.su.se.bakover.service.person.PersonService -import no.nav.su.se.bakover.service.statistikk.EventObserver -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingServiceImpl -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import java.time.Clock -import java.time.LocalDate -import java.util.UUID - -internal class FerdigstillRevurderingServiceTest { - - private val iverksattJournalpostId = JournalpostId("iverksattJournalpostId") - private val iverksattBrevbestillingId = BrevbestillingId("iverattBrevbestillingId") - private val utbetalingId = UUID30.randomUUID() - private val sakId: UUID = UUID.randomUUID() - private val saksnummer = Saksnummer(1) - private val søknadId: UUID = UUID.randomUUID() - private val fnr = FnrGenerator.random() - - private val søknadsbehandlingTilRevurdering = Vedtak.InnvilgetStønad.fromSøknadsbehandling( - Søknadsbehandling.Iverksatt.Innvilget( - id = UUID.randomUUID(), - sakId = sakId, - opprettet = Tidspunkt.EPOCH, - saksbehandler = NavIdentBruker.Saksbehandler("s11"), - attestering = Attestering.Iverksatt(NavIdentBruker.Attestant("a22")), - oppgaveId = OppgaveId("23"), - saksnummer = saksnummer, - søknad = Søknad.Journalført.MedOppgave( - id = søknadId, - opprettet = Tidspunkt.EPOCH, - sakId = sakId, - søknadInnhold = SøknadInnholdTestdataBuilder.build(), - oppgaveId = OppgaveId("56"), - journalpostId = JournalpostId("315") - ), - beregning = TestBeregning, - simulering = Simulering( - gjelderId = fnr, - gjelderNavn = "", - datoBeregnet = LocalDate.EPOCH, - nettoBeløp = 0, - periodeList = listOf() - ), - behandlingsinformasjon = Behandlingsinformasjon.lagTomBehandlingsinformasjon().withAlleVilkårOppfylt(), - fnr = fnr, - utbetalingId = UUID30.randomUUID(), - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( - journalpostId = JournalpostId("515"), - brevbestillingId = BrevbestillingId("551") - ) - ) - ) - - private val revurderingSomSkalFerdigstilles = IverksattRevurdering( - id = UUID.randomUUID(), - periode = Periode.create(1.januar(2021), 31.mars(2021)), - opprettet = Tidspunkt.EPOCH, - tilRevurdering = søknadsbehandlingTilRevurdering, - saksbehandler = NavIdentBruker.Saksbehandler("Z123"), - beregning = TestBeregning, - simulering = Simulering( - gjelderId = fnr, - gjelderNavn = "", - datoBeregnet = LocalDate.EPOCH, - nettoBeløp = 0, - periodeList = listOf() - ), - oppgaveId = OppgaveId(""), - attestant = NavIdentBruker.Attestant(navIdent = "Z321"), - utbetalingId = utbetalingId, - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering - ) - - private val person = Person( - ident = Ident( - fnr = fnr, - aktørId = AktørId(aktørId = "123") - ), - navn = Person.Navn(fornavn = "Tore", mellomnavn = "Johnas", etternavn = "Strømøy") - ) - - @Test - fun `kaster exception hvis vi ikke finner person ved opprettelse av brev`() { - val revurderingRepoMock = mock() { - on { hentRevurderingForUtbetaling(any()) } doReturn revurderingSomSkalFerdigstilles - } - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn KunneIkkeHentePerson.FantIkkePerson.left() - } - assertThrows { - createFerdigstillIverksettingService( - revurderingRepo = revurderingRepoMock, - personService = personServiceMock - ).ferdigstillIverksetting(utbetalingId) - } - - inOrder( - revurderingRepoMock, - personServiceMock - ) { - verify(revurderingRepoMock).hentRevurderingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(revurderingSomSkalFerdigstilles.fnr) - verifyNoMoreInteractions() - } - } - - @Test - fun `kaster exception hvis vi ikke finner navn på saksbehandler ved opprettelse av brev`() { - val revurderingRepoMock = mock() { - on { hentRevurderingForUtbetaling(any()) } doReturn revurderingSomSkalFerdigstilles - } - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - val hentNavnMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn MicrosoftGraphApiOppslagFeil.DeserialiseringAvResponsFeilet.left() - } - - assertThrows { - createFerdigstillIverksettingService( - revurderingRepo = revurderingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = hentNavnMock - ).ferdigstillIverksetting(utbetalingId) - } - - inOrder( - revurderingRepoMock, - personServiceMock, - hentNavnMock - ) { - verify(revurderingRepoMock).hentRevurderingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(revurderingSomSkalFerdigstilles.fnr) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.saksbehandler) - verifyNoMoreInteractions() - } - } - - @Test - fun `kaster exception hvis vi ikke finner navn på attestant ved opprettelse av brev`() { - val revurderingRepoMock = mock() { - on { hentRevurderingForUtbetaling(any()) } doReturn revurderingSomSkalFerdigstilles - } - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - val hentNavnMock = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( - BehandlingTestUtils.microsoftGraphMock.response.right(), - MicrosoftGraphApiOppslagFeil.FantIkkeBrukerForNavIdent.left() - ) - } - - assertThrows { - createFerdigstillIverksettingService( - revurderingRepo = revurderingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = hentNavnMock - ).ferdigstillIverksetting(utbetalingId) - } - - inOrder( - revurderingRepoMock, - personServiceMock, - hentNavnMock - ) { - verify(revurderingRepoMock).hentRevurderingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(revurderingSomSkalFerdigstilles.fnr) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.saksbehandler) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.attestant) - verifyNoMoreInteractions() - } - } - - @Test - fun `kaster exception hvis journalføring feiler av tekniske årsaker`() { - val revurderingRepoMock = mock() { - on { hentRevurderingForUtbetaling(any()) } doReturn revurderingSomSkalFerdigstilles - } - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - val hentNavnMock = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn BehandlingTestUtils.microsoftGraphMock.response.right() - } - val brevServiceMock = mock { - on { journalførBrev(any(), any()) } doReturn KunneIkkeJournalføreBrev.KunneIkkeOppretteJournalpost.left() - } - - assertThrows { - createFerdigstillIverksettingService( - revurderingRepo = revurderingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = hentNavnMock, - brevService = brevServiceMock - ).ferdigstillIverksetting(utbetalingId) - } - - inOrder( - revurderingRepoMock, - personServiceMock, - hentNavnMock, - brevServiceMock - ) { - verify(revurderingRepoMock).hentRevurderingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(revurderingSomSkalFerdigstilles.fnr) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.saksbehandler) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.attestant) - verify(brevServiceMock).journalførBrev( - argThat { it.shouldBeTypeOf() }, - argThat { it shouldBe saksnummer } - ) - verifyNoMoreInteractions() - } - } - - @Test - fun `fortsetter brevbestilling for journalført revurderinger `() { - val revurderingRepoMock = mock() { - on { hentRevurderingForUtbetaling(any()) } doReturn revurderingSomSkalFerdigstilles.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.Journalført(iverksattJournalpostId) - ) - } - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - val hentNavnMock = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn BehandlingTestUtils.microsoftGraphMock.response.right() - } - val brevServiceMock = mock { - on { distribuerBrev(any()) } doReturn iverksattBrevbestillingId.right() - } - val oppgaveServiceMock = mock { - on { lukkOppgaveMedSystembruker(any()) } doReturn Unit.right() - } - - val vedtakRepoMock = mock() - - createFerdigstillIverksettingService( - revurderingRepo = revurderingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = hentNavnMock, - brevService = brevServiceMock, - oppgaveService = oppgaveServiceMock, - vedtakRepo = vedtakRepoMock - ).ferdigstillIverksetting(utbetalingId) - - inOrder( - revurderingRepoMock, - personServiceMock, - hentNavnMock, - brevServiceMock, - oppgaveServiceMock, - vedtakRepoMock - ) { - verify(revurderingRepoMock).hentRevurderingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(revurderingSomSkalFerdigstilles.fnr) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.saksbehandler) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.attestant) - verify(brevServiceMock, never()).journalførBrev(any(), any()) - verify(brevServiceMock).distribuerBrev(iverksattJournalpostId) - verify(vedtakRepoMock).oppdaterBrevbestillingIdForRevurdering(revurderingSomSkalFerdigstilles.id, iverksattBrevbestillingId) - verify(revurderingRepoMock).lagre( - argThat { - it shouldBe revurderingSomSkalFerdigstilles.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( - iverksattJournalpostId, - iverksattBrevbestillingId - ) - ) - } - ) - verify(oppgaveServiceMock).lukkOppgaveMedSystembruker(revurderingSomSkalFerdigstilles.oppgaveId) - verifyNoMoreInteractions() - } - } - - @Test - fun `kaster exception hvis brevdistribusjon feiler av tekniske årsaker`() { - val revurderingRepoMock = mock() { - on { hentRevurderingForUtbetaling(any()) } doReturn revurderingSomSkalFerdigstilles - } - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - val hentNavnMock = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn BehandlingTestUtils.microsoftGraphMock.response.right() - } - val brevServiceMock = mock { - on { journalførBrev(any(), any()) } doReturn iverksattJournalpostId.right() - on { distribuerBrev(any()) } doReturn KunneIkkeDistribuereBrev.left() - } - - assertThrows { - createFerdigstillIverksettingService( - revurderingRepo = revurderingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = hentNavnMock, - brevService = brevServiceMock - ).ferdigstillIverksetting(utbetalingId) - } - - inOrder( - revurderingRepoMock, - personServiceMock, - hentNavnMock, - brevServiceMock - ) { - verify(revurderingRepoMock).hentRevurderingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(revurderingSomSkalFerdigstilles.fnr) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.saksbehandler) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.attestant) - verify(brevServiceMock).journalførBrev( - argThat { it.shouldBeTypeOf() }, - argThat { it shouldBe saksnummer } - ) - verify(revurderingRepoMock).lagre( - revurderingSomSkalFerdigstilles.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.Journalført( - iverksattJournalpostId - ) - ) - ) - verify(brevServiceMock).distribuerBrev(iverksattJournalpostId) - verifyNoMoreInteractions() - } - } - - @Test - fun `ferdistiller journalførte og distribuerte revurderinger`() { - val journalførtOgDistribuertRevurdering = revurderingSomSkalFerdigstilles.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( - iverksattJournalpostId, - iverksattBrevbestillingId - ) - ) - val revurderingRepoMock = mock { - on { hentRevurderingForUtbetaling(any()) } doReturn journalførtOgDistribuertRevurdering - } - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - val hentNavnMock = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn BehandlingTestUtils.microsoftGraphMock.response.right() - } - val brevServiceMock = mock() - val oppgaveServiceMock = mock { - on { lukkOppgaveMedSystembruker(any()) } doReturn Unit.right() - } - - val vedtakRepoMock = mock() - - createFerdigstillIverksettingService( - revurderingRepo = revurderingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = hentNavnMock, - brevService = brevServiceMock, - oppgaveService = oppgaveServiceMock, - vedtakRepo = vedtakRepoMock - ).ferdigstillIverksetting(utbetalingId) - - inOrder( - revurderingRepoMock, - personServiceMock, - hentNavnMock, - brevServiceMock, - oppgaveServiceMock, - vedtakRepoMock - ) { - verify(revurderingRepoMock).hentRevurderingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(revurderingSomSkalFerdigstilles.fnr) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.saksbehandler) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.attestant) - verify(brevServiceMock, never()).journalførBrev(any(), any()) - verify(brevServiceMock, never()).distribuerBrev(any()) - verify(revurderingRepoMock, times(2)).lagre(argThat { it shouldBe journalførtOgDistribuertRevurdering }) - verify(oppgaveServiceMock).lukkOppgaveMedSystembruker(revurderingSomSkalFerdigstilles.oppgaveId) - verifyNoMoreInteractions() - } - } - - @Test - fun `overlever hvis lukking av oppgave feiler`() { - val revurderingRepoMock = mock() { - on { hentRevurderingForUtbetaling(any()) } doReturn revurderingSomSkalFerdigstilles - } - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - val hentNavnMock = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn BehandlingTestUtils.microsoftGraphMock.response.right() - } - val brevServiceMock = mock { - on { journalførBrev(any(), any()) } doReturn iverksattJournalpostId.right() - on { distribuerBrev(any()) } doReturn iverksattBrevbestillingId.right() - } - val oppgaveServiceMock = mock { - on { lukkOppgaveMedSystembruker(any()) } doReturn KunneIkkeLukkeOppgave.left() - } - - val vedtakRepoMock = mock() - - createFerdigstillIverksettingService( - revurderingRepo = revurderingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = hentNavnMock, - brevService = brevServiceMock, - oppgaveService = oppgaveServiceMock, - vedtakRepo = vedtakRepoMock - ).ferdigstillIverksetting(utbetalingId) - - inOrder( - revurderingRepoMock, - personServiceMock, - hentNavnMock, - brevServiceMock, - oppgaveServiceMock, - vedtakRepoMock - ) { - verify(revurderingRepoMock).hentRevurderingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(revurderingSomSkalFerdigstilles.fnr) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.saksbehandler) - verify(hentNavnMock).hentBrukerinformasjonForNavIdent(revurderingSomSkalFerdigstilles.attestant) - verify(brevServiceMock).journalførBrev( - argThat { it.shouldBeTypeOf() }, - argThat { it shouldBe saksnummer } - ) - verify(vedtakRepoMock).oppdaterJournalpostForRevurdering(revurderingSomSkalFerdigstilles.id, iverksattJournalpostId) - verify(revurderingRepoMock).lagre( - revurderingSomSkalFerdigstilles.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.Journalført( - iverksattJournalpostId - ) - ) - ) - verify(brevServiceMock).distribuerBrev(iverksattJournalpostId) - verify(vedtakRepoMock).oppdaterBrevbestillingIdForRevurdering(revurderingSomSkalFerdigstilles.id, iverksattBrevbestillingId) - verify(revurderingRepoMock).lagre( - revurderingSomSkalFerdigstilles.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( - iverksattJournalpostId, - iverksattBrevbestillingId - ) - ) - ) - verify(oppgaveServiceMock).lukkOppgaveMedSystembruker(revurderingSomSkalFerdigstilles.oppgaveId) - verifyNoMoreInteractions() - } - } - - private fun createFerdigstillIverksettingService( - søknadsbehandlingRepo: SøknadsbehandlingRepo = mock(), - oppgaveService: OppgaveService = mock(), - personService: PersonService = mock(), - behandlingMetrics: BehandlingMetrics = mock(), - microsoftGraphApiOppslag: MicrosoftGraphApiOppslag = mock(), - brevService: BrevService = mock(), - eventObserver: EventObserver = mock { on { handle(any()) }.doNothing() }, - clock: Clock = Clock.systemUTC(), - revurderingRepo: RevurderingRepo = mock(), - vedtakRepo: VedtakRepo = mock() - ) = FerdigstillIverksettingServiceImpl( - søknadsbehandlingRepo = søknadsbehandlingRepo, - oppgaveService = oppgaveService, - behandlingMetrics = behandlingMetrics, - microsoftGraphApiClient = microsoftGraphApiOppslag, - personService = personService, - brevService = brevService, - clock = clock, - revurderingRepo, - vedtakRepo = vedtakRepo - ).apply { addObserver(eventObserver) } -} diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/OpprettRevurderingServiceTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/OpprettRevurderingServiceTest.kt index 273ffad1ac..9012ad348d 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/OpprettRevurderingServiceTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/OpprettRevurderingServiceTest.kt @@ -36,7 +36,7 @@ import no.nav.su.se.bakover.domain.beregning.Beregning import no.nav.su.se.bakover.domain.beregning.MånedsberegningFactory import no.nav.su.se.bakover.domain.beregning.Sats import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.Utbetaling import no.nav.su.se.bakover.domain.oppgave.KunneIkkeOppretteOppgave @@ -378,7 +378,7 @@ internal class OpprettRevurderingServiceTest { beregning = opprinneligVedtak.beregning, simulering = opprinneligVedtak.simulering, oppgaveId = OppgaveId("null"), - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev( JournalpostId("ajour"), BrevbestillingId("abrev") ), diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/RevurderingServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/RevurderingServiceImplTest.kt index a9c9578625..21306565e3 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/RevurderingServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/revurdering/RevurderingServiceImplTest.kt @@ -36,7 +36,7 @@ import no.nav.su.se.bakover.domain.beregning.fradrag.FradragFactory import no.nav.su.se.bakover.domain.beregning.fradrag.FradragTilhører import no.nav.su.se.bakover.domain.beregning.fradrag.Fradragstype import no.nav.su.se.bakover.domain.brev.LagBrevRequest -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.oppdrag.Utbetaling import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.oppdrag.simulering.SimuleringFeilet @@ -632,7 +632,7 @@ internal class RevurderingServiceImplTest { oppgaveId = OppgaveId(value = "OppgaveId"), attestant = attestant, utbetalingId = utbetalingId, - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert ) val revurderingTilAttestering = RevurderingTilAttestering( id = revurderingId, @@ -767,7 +767,6 @@ internal class RevurderingServiceImplTest { saksbehandlerNavn = saksbehandler.navIdent, revurdertBeregning = simulertRevurdering.beregning, fritekst = null, - vedtattBeregning = vedtakMock.beregning, harEktefelle = false ) } diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/statistikk/RevurderingStatistikkMapperTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/statistikk/RevurderingStatistikkMapperTest.kt index 521faaa129..929dac8db6 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/statistikk/RevurderingStatistikkMapperTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/statistikk/RevurderingStatistikkMapperTest.kt @@ -12,7 +12,7 @@ import no.nav.su.se.bakover.common.zoneIdOslo import no.nav.su.se.bakover.domain.NavIdentBruker import no.nav.su.se.bakover.domain.Saksnummer import no.nav.su.se.bakover.domain.behandling.Behandling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.oppgave.OppgaveId import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering import no.nav.su.se.bakover.domain.revurdering.OpprettetRevurdering @@ -103,7 +103,7 @@ internal class RevurderingStatistikkMapperTest { oppgaveId = OppgaveId(value = "7"), attestant = NavIdentBruker.Attestant(navIdent = "2"), utbetalingId = UUID30.randomUUID(), - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert ) RevurderingStatistikkMapper(fixedClock).map(iverksattRevurdering) shouldBe Statistikk.Behandling( diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/statistikk/StatistikkServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/statistikk/StatistikkServiceImplTest.kt index 156781b31f..4110ed41a7 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/statistikk/StatistikkServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/statistikk/StatistikkServiceImplTest.kt @@ -28,7 +28,7 @@ import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon import no.nav.su.se.bakover.domain.behandling.avslag.Avslagsgrunn import no.nav.su.se.bakover.domain.behandling.withAlleVilkårOppfylt import no.nav.su.se.bakover.domain.beregning.Beregning -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.oppgave.OppgaveId import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering @@ -526,7 +526,7 @@ internal class StatistikkServiceImplTest { oppgaveId = OppgaveId("55"), attestant = NavIdentBruker.Attestant("attestant"), utbetalingId = UUID30.randomUUID(), - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert ) val expected = Statistikk.Behandling( diff --git "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillIverksettingServiceImplTest.kt" "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillIverksettingServiceImplTest.kt" deleted file mode 100644 index 1ff8d6a551..0000000000 --- "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/FerdigstillIverksettingServiceImplTest.kt" +++ /dev/null @@ -1,616 +0,0 @@ -package no.nav.su.se.bakover.service.søknadsbehandling - -import arrow.core.Either -import arrow.core.left -import arrow.core.right -import com.nhaarman.mockitokotlin2.any -import com.nhaarman.mockitokotlin2.argumentCaptor -import com.nhaarman.mockitokotlin2.doReturn -import com.nhaarman.mockitokotlin2.doReturnConsecutively -import com.nhaarman.mockitokotlin2.inOrder -import com.nhaarman.mockitokotlin2.mock -import com.nhaarman.mockitokotlin2.times -import com.nhaarman.mockitokotlin2.verify -import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions -import io.kotest.matchers.shouldBe -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslag -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslagFeil -import no.nav.su.se.bakover.common.Tidspunkt -import no.nav.su.se.bakover.common.UUID30 -import no.nav.su.se.bakover.common.januar -import no.nav.su.se.bakover.common.mars -import no.nav.su.se.bakover.common.periode.Periode -import no.nav.su.se.bakover.database.revurdering.RevurderingRepo -import no.nav.su.se.bakover.database.søknadsbehandling.SøknadsbehandlingRepo -import no.nav.su.se.bakover.database.vedtak.VedtakRepo -import no.nav.su.se.bakover.domain.NavIdentBruker -import no.nav.su.se.bakover.domain.Søknad -import no.nav.su.se.bakover.domain.SøknadInnholdTestdataBuilder -import no.nav.su.se.bakover.domain.behandling.Attestering -import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics -import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.brev.LagBrevRequest -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.journal.JournalpostId -import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering -import no.nav.su.se.bakover.domain.oppgave.OppgaveId -import no.nav.su.se.bakover.domain.person.KunneIkkeHentePerson -import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering -import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling -import no.nav.su.se.bakover.domain.vedtak.Vedtak -import no.nav.su.se.bakover.service.argThat -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils.attestant -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils.behandlingsinformasjon -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils.fnr -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils.person -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils.saksbehandler -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils.saksnummer -import no.nav.su.se.bakover.service.beregning.TestBeregning -import no.nav.su.se.bakover.service.brev.BrevService -import no.nav.su.se.bakover.service.brev.KunneIkkeDistribuereBrev -import no.nav.su.se.bakover.service.brev.KunneIkkeJournalføreBrev -import no.nav.su.se.bakover.service.doNothing -import no.nav.su.se.bakover.service.oppgave.OppgaveService -import no.nav.su.se.bakover.service.person.PersonService -import no.nav.su.se.bakover.service.statistikk.Event -import no.nav.su.se.bakover.service.statistikk.EventObserver -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import java.time.Clock -import java.time.LocalDate -import java.util.UUID - -internal class FerdigstillIverksettingServiceImplTest { - - private val iverksattOppgaveId = OppgaveId("iverksattOppgaveId") - - private val iverksattJournalpostId = JournalpostId("iverksattJournalpostId") - - private val iverksattBrevbestillingId = BrevbestillingId("iverattBrevbestillingId") - - private val utbetalingId = UUID30.randomUUID() - - private val innvilgetBehandlingUtenJournalpost = Søknadsbehandling.Iverksatt.Innvilget( - id = UUID.randomUUID(), - sakId = UUID.randomUUID(), - opprettet = Tidspunkt.EPOCH, - saksbehandler = saksbehandler, - attestering = Attestering.Iverksatt(attestant), - oppgaveId = iverksattOppgaveId, - saksnummer = saksnummer, - søknad = Søknad.Journalført.MedOppgave( - id = BehandlingTestUtils.søknadId, - opprettet = Tidspunkt.EPOCH, - sakId = BehandlingTestUtils.sakId, - søknadInnhold = SøknadInnholdTestdataBuilder.build(), - oppgaveId = BehandlingTestUtils.søknadOppgaveId, - journalpostId = BehandlingTestUtils.søknadJournalpostId - ), - beregning = TestBeregning, - simulering = Simulering( - gjelderId = fnr, - gjelderNavn = "", - datoBeregnet = LocalDate.EPOCH, - nettoBeløp = 0, - periodeList = listOf() - ), - behandlingsinformasjon = behandlingsinformasjon, - fnr = fnr, - utbetalingId = utbetalingId, - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering - ) - - private val iverksattRevurdering = IverksattRevurdering( - id = UUID.randomUUID(), - periode = Periode.create(1.januar(2021), 31.mars(2021)), - opprettet = Tidspunkt.EPOCH, - tilRevurdering = Vedtak.InnvilgetStønad.fromSøknadsbehandling(innvilgetBehandlingUtenJournalpost), - saksbehandler = NavIdentBruker.Saksbehandler("Z123"), - beregning = TestBeregning, - simulering = Simulering( - gjelderId = innvilgetBehandlingUtenJournalpost.fnr, - gjelderNavn = "", - datoBeregnet = LocalDate.EPOCH, - nettoBeløp = 0, - periodeList = listOf() - ), - oppgaveId = OppgaveId(""), - attestant = NavIdentBruker.Attestant(navIdent = "Z321"), - utbetalingId = UUID30.randomUUID(), - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering - ) - - @Test - fun `kaster exception hvis det ikke finnes noe som kan ferdigstilles for aktuell utbetaling`() { - val søknadsbehandlingRepoMock = mock() { - on { hentBehandlingForUtbetaling(any()) } doReturn null - } - - val revurderingRepoMock = mock() { - on { hentRevurderingForUtbetaling(any()) } doReturn null - } - - assertThrows { - createFerdigstillIverksettingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - revurderingRepo = revurderingRepoMock - ).ferdigstillIverksetting(UUID30.randomUUID()) - } - } - - @Test - fun `kaster exception hvis det finnes mange ting som kan ferdigstilles for aktuell utbetaling`() { - val søknadsbehandlingRepoMock = mock() { - on { hentBehandlingForUtbetaling(any()) } doReturn innvilgetBehandlingUtenJournalpost - } - - val revurderingRepoMock = mock() { - on { hentRevurderingForUtbetaling(any()) } doReturn iverksattRevurdering - } - - assertThrows { - createFerdigstillIverksettingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - revurderingRepo = revurderingRepoMock - ).ferdigstillIverksetting(UUID30.randomUUID()) - } - } - - @Test - fun `Kunne ikke opprette journalpost hvis vi ikke finner saksbehandler`() { - val søknadsbehandlingRepoMock = mock() { - on { hentBehandlingForUtbetaling(any()) } doReturn innvilgetBehandlingUtenJournalpost - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) }.doReturn( - MicrosoftGraphApiOppslagFeil.FantIkkeBrukerForNavIdent.left(), - Either.right(BehandlingTestUtils.microsoftGraphMock.response) - ) - } - - val oppgaveServiceMock = mock { - on { lukkOppgaveMedSystembruker(any()) } doReturn Unit.right() - } - - val statistikkObserver = mock() - - val actual = createFerdigstillIverksettingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - oppgaveService = oppgaveServiceMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - eventObserver = statistikkObserver - ).ferdigstillIverksetting(utbetalingId) - - actual shouldBe Unit - - inOrder( - søknadsbehandlingRepoMock, - personServiceMock, - oppslagMock, - oppgaveServiceMock, - statistikkObserver - ) { - verify(søknadsbehandlingRepoMock).hentBehandlingForUtbetaling(utbetalingId) - verify(statistikkObserver).handle( - argThat { - it shouldBe Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt( - innvilgetBehandlingUtenJournalpost - ) - } - ) - verify(personServiceMock).hentPersonMedSystembruker(fnr) - verify(oppslagMock).hentBrukerinformasjonForNavIdent( - argThat { - it shouldBe saksbehandler - } - ) - verify(oppgaveServiceMock).lukkOppgaveMedSystembruker(argThat { it shouldBe iverksattOppgaveId }) - } - verifyNoMoreInteractions( - søknadsbehandlingRepoMock, - personServiceMock, - oppslagMock, - oppgaveServiceMock - ) - } - - @Test - fun `Kunne ikke opprette journalpost hvis vi ikke finner attestant`() { - val søknadsbehandlingRepoMock = mock() { - on { hentBehandlingForUtbetaling(any()) } doReturn innvilgetBehandlingUtenJournalpost - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( - BehandlingTestUtils.microsoftGraphMock.response.right(), - MicrosoftGraphApiOppslagFeil.FantIkkeBrukerForNavIdent.left() - ) - } - - val oppgaveServiceMock = mock { - on { lukkOppgaveMedSystembruker(any()) } doReturn Unit.right() - } - - val actual = createFerdigstillIverksettingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - oppgaveService = oppgaveServiceMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - ).ferdigstillIverksetting(utbetalingId) - actual shouldBe Unit - - inOrder( - søknadsbehandlingRepoMock, - personServiceMock, - oppslagMock, - oppgaveServiceMock - ) { - verify(søknadsbehandlingRepoMock).hentBehandlingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(fnr) - argumentCaptor().apply { - verify(oppslagMock, times(2)).hentBrukerinformasjonForNavIdent(capture()) - firstValue shouldBe saksbehandler - secondValue shouldBe attestant - } - verify(oppgaveServiceMock).lukkOppgaveMedSystembruker(argThat { it shouldBe iverksattOppgaveId }) - } - verifyNoMoreInteractions( - søknadsbehandlingRepoMock, - personServiceMock, - oppslagMock, - oppgaveServiceMock - ) - } - - @Test - fun `Kunne ikke opprette journalpost hvis vi ikke finner person`() { - val søknadsbehandlingRepoMock = mock() { - on { hentBehandlingForUtbetaling(any()) } doReturn innvilgetBehandlingUtenJournalpost - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn KunneIkkeHentePerson.FantIkkePerson.left() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn BehandlingTestUtils.microsoftGraphMock.response.right() - } - - val brevServiceMock = mock() - - val oppgaveServiceMock = mock { - on { lukkOppgaveMedSystembruker(any()) } doReturn Unit.right() - } - - val actual = createFerdigstillIverksettingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - oppgaveService = oppgaveServiceMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - brevService = brevServiceMock - - ).ferdigstillIverksetting(utbetalingId) - - actual shouldBe Unit - - inOrder( - søknadsbehandlingRepoMock, - personServiceMock, - oppgaveServiceMock, - oppslagMock - ) { - verify(søknadsbehandlingRepoMock).hentBehandlingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe fnr }) - verify(oppgaveServiceMock).lukkOppgaveMedSystembruker(argThat { it shouldBe iverksattOppgaveId }) - } - verifyNoMoreInteractions( - søknadsbehandlingRepoMock, - brevServiceMock, - personServiceMock, - oppslagMock, - oppgaveServiceMock - ) - } - - @Test - fun `Kan ikke journalføre eller distribuere brev hvis journalføring feiler`() { - val søknadsbehandlingRepoMock = mock() { - on { hentBehandlingForUtbetaling(any()) } doReturn innvilgetBehandlingUtenJournalpost - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = saksbehandler.navIdent).right(), - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = attestant.navIdent).right(), - ) - } - val brevServiceMock = mock() { - on { journalførBrev(any(), any()) } doReturn KunneIkkeJournalføreBrev.KunneIkkeOppretteJournalpost.left() - } - val oppgaveServiceMock = mock() { - on { lukkOppgaveMedSystembruker(any()) } doReturn Unit.right() - } - - val statistikkObserver = mock() - - val actual = createFerdigstillIverksettingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - brevService = brevServiceMock, - oppgaveService = oppgaveServiceMock, - eventObserver = statistikkObserver - ).ferdigstillIverksetting(utbetalingId) - - actual shouldBe Unit - - inOrder( - søknadsbehandlingRepoMock, - personServiceMock, - oppslagMock, - brevServiceMock, - oppgaveServiceMock, - statistikkObserver - ) { - verify(søknadsbehandlingRepoMock).hentBehandlingForUtbetaling(utbetalingId) - verify(statistikkObserver).handle( - argThat { - it shouldBe Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt( - innvilgetBehandlingUtenJournalpost - ) - } - ) - verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe fnr }) - argumentCaptor().apply { - verify(oppslagMock, times(2)).hentBrukerinformasjonForNavIdent(capture()) - firstValue shouldBe saksbehandler - secondValue shouldBe attestant - } - verify(brevServiceMock).journalførBrev( - argThat { - it shouldBe LagBrevRequest.InnvilgetVedtak( - person = person, - beregning = innvilgetBehandlingUtenJournalpost.beregning, - behandlingsinformasjon = innvilgetBehandlingUtenJournalpost.behandlingsinformasjon, - saksbehandlerNavn = saksbehandler.navIdent, - attestantNavn = attestant.navIdent, - ) - }, - argThat { it shouldBe saksnummer } - ) - verify(oppgaveServiceMock).lukkOppgaveMedSystembruker(argThat { it shouldBe iverksattOppgaveId }) - } - verifyNoMoreInteractions( - søknadsbehandlingRepoMock, - personServiceMock, - oppslagMock, - oppgaveServiceMock - ) - } - - @Test - fun `Kunne ikke distribuere brev`() { - val søknadsbehandlingRepoMock = mock() { - on { hentBehandlingForUtbetaling(any()) } doReturn innvilgetBehandlingUtenJournalpost - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = saksbehandler.navIdent).right(), - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = attestant.navIdent).right(), - ) - } - - val brevServiceMock = mock { - on { journalførBrev(any(), any()) } doReturn iverksattJournalpostId.right() - on { distribuerBrev(any()) } doReturn KunneIkkeDistribuereBrev.left() - } - - val oppgaveServiceMock = mock { - on { lukkOppgaveMedSystembruker(any()) } doReturn Unit.right() - } - - val actual = createFerdigstillIverksettingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - oppgaveService = oppgaveServiceMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - brevService = brevServiceMock, - ).ferdigstillIverksetting(utbetalingId) - - actual shouldBe Unit - - inOrder( - søknadsbehandlingRepoMock, - personServiceMock, - oppslagMock, - brevServiceMock, - oppgaveServiceMock - ) { - verify(søknadsbehandlingRepoMock).hentBehandlingForUtbetaling(utbetalingId) - verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe fnr }) - argumentCaptor().apply { - verify(oppslagMock, times(2)).hentBrukerinformasjonForNavIdent(capture()) - firstValue shouldBe saksbehandler - secondValue shouldBe attestant - } - verify(brevServiceMock).journalførBrev( - argThat { - it shouldBe LagBrevRequest.InnvilgetVedtak( - person = person, - beregning = innvilgetBehandlingUtenJournalpost.beregning, - behandlingsinformasjon = innvilgetBehandlingUtenJournalpost.behandlingsinformasjon, - saksbehandlerNavn = saksbehandler.navIdent, - attestantNavn = attestant.navIdent, - ) - }, - argThat { it shouldBe saksnummer }, - ) - verify(søknadsbehandlingRepoMock).lagre( - argThat { - it shouldBe innvilgetBehandlingUtenJournalpost.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.Journalført( - iverksattJournalpostId - ) - ) - } - ) - verify(brevServiceMock).distribuerBrev( - argThat { - it shouldBe iverksattJournalpostId - } - ) - verify(oppgaveServiceMock).lukkOppgaveMedSystembruker(argThat { it shouldBe iverksattOppgaveId }) - } - verifyNoMoreInteractions( - søknadsbehandlingRepoMock, - personServiceMock, - oppslagMock, - brevServiceMock, - oppgaveServiceMock - ) - } - - @Test - fun `journalfører og distribuerer brev for iverksatt innvilget`() { - val søknadsbehandlingRepoMock = mock() { - on { hentBehandlingForUtbetaling(any()) } doReturn innvilgetBehandlingUtenJournalpost - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - - val brevServiceMock = mock { - on { journalførBrev(any(), any()) } doReturn iverksattJournalpostId.right() - on { distribuerBrev(any()) } doReturn iverksattBrevbestillingId.right() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = saksbehandler.navIdent).right(), - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = attestant.navIdent).right(), - ) - } - - val oppgaveServiceMock = mock { - on { lukkOppgaveMedSystembruker(any()) } doReturn Unit.right() - } - - val vedtakRepoMock = mock() - - val statistikkObserver = mock() - - val actual = createFerdigstillIverksettingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - oppgaveService = oppgaveServiceMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - brevService = brevServiceMock, - eventObserver = statistikkObserver, - vedtakRepo = vedtakRepoMock - ).ferdigstillIverksetting(utbetalingId) - - actual shouldBe Unit - - verify(søknadsbehandlingRepoMock).hentBehandlingForUtbetaling(utbetalingId) - verify(statistikkObserver).handle( - argThat { - it shouldBe Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt( - innvilgetBehandlingUtenJournalpost - ) - } - ) - verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe fnr }) - argumentCaptor().apply { - verify(oppslagMock, times(2)).hentBrukerinformasjonForNavIdent(capture()) - firstValue shouldBe saksbehandler - secondValue shouldBe attestant - } - verify(brevServiceMock).journalførBrev( - argThat { - it shouldBe LagBrevRequest.InnvilgetVedtak( - person = person, - beregning = innvilgetBehandlingUtenJournalpost.beregning, - behandlingsinformasjon = innvilgetBehandlingUtenJournalpost.behandlingsinformasjon, - saksbehandlerNavn = saksbehandler.navIdent, - attestantNavn = attestant.navIdent, - ) - }, - argThat { it shouldBe saksnummer }, - ) - argumentCaptor().apply { - verify(søknadsbehandlingRepoMock, times(2)).lagre(capture()) - firstValue shouldBe innvilgetBehandlingUtenJournalpost.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.Journalført( - iverksattJournalpostId - ) - ) - secondValue shouldBe innvilgetBehandlingUtenJournalpost.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( - iverksattJournalpostId, - iverksattBrevbestillingId - ) - ) - } - verify(brevServiceMock).distribuerBrev( - argThat { - it shouldBe iverksattJournalpostId - } - ) - verify(oppgaveServiceMock).lukkOppgaveMedSystembruker(argThat { it shouldBe iverksattOppgaveId }) - verify(vedtakRepoMock).oppdaterJournalpostForSøknadsbehandling(innvilgetBehandlingUtenJournalpost.id, iverksattJournalpostId) - verify(vedtakRepoMock).oppdaterBrevbestillingIdForSøknadsbehandling(innvilgetBehandlingUtenJournalpost.id, iverksattBrevbestillingId) - - verifyNoMoreInteractions( - søknadsbehandlingRepoMock, - brevServiceMock, - personServiceMock, - oppslagMock, - oppgaveServiceMock, - vedtakRepoMock - ) - } - - private fun createFerdigstillIverksettingService( - søknadsbehandlingRepo: SøknadsbehandlingRepo = mock(), - oppgaveService: OppgaveService = mock(), - personService: PersonService = mock(), - behandlingMetrics: BehandlingMetrics = mock(), - microsoftGraphApiOppslag: MicrosoftGraphApiOppslag = mock(), - brevService: BrevService = mock(), - eventObserver: EventObserver = mock { on { handle(any()) }.doNothing() }, - clock: Clock = Clock.systemUTC(), - revurderingRepo: RevurderingRepo = mock(), - vedtakRepo: VedtakRepo = mock() - ) = FerdigstillIverksettingServiceImpl( - søknadsbehandlingRepo = søknadsbehandlingRepo, - oppgaveService = oppgaveService, - behandlingMetrics = behandlingMetrics, - microsoftGraphApiClient = microsoftGraphApiOppslag, - personService = personService, - brevService = brevService, - clock = clock, - revurderingRepo = revurderingRepo, - vedtakRepo = vedtakRepo - ).apply { addObserver(eventObserver) } -} diff --git "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/IverksettAvsl\303\245ttS\303\270knadsbehandlingServiceTest.kt" "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/IverksettAvsl\303\245ttS\303\270knadsbehandlingServiceTest.kt" deleted file mode 100644 index f281bc8c18..0000000000 --- "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/IverksettAvsl\303\245ttS\303\270knadsbehandlingServiceTest.kt" +++ /dev/null @@ -1,331 +0,0 @@ -package no.nav.su.se.bakover.service.søknadsbehandling - -import arrow.core.left -import arrow.core.right -import com.nhaarman.mockitokotlin2.any -import com.nhaarman.mockitokotlin2.doReturn -import com.nhaarman.mockitokotlin2.inOrder -import com.nhaarman.mockitokotlin2.mock -import com.nhaarman.mockitokotlin2.times -import com.nhaarman.mockitokotlin2.verifyZeroInteractions -import io.kotest.matchers.shouldBe -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslag -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslagFeil -import no.nav.su.se.bakover.client.person.MicrosoftGraphResponse -import no.nav.su.se.bakover.common.Tidspunkt -import no.nav.su.se.bakover.domain.AktørId -import no.nav.su.se.bakover.domain.Ident -import no.nav.su.se.bakover.domain.NavIdentBruker -import no.nav.su.se.bakover.domain.Person -import no.nav.su.se.bakover.domain.Saksnummer -import no.nav.su.se.bakover.domain.Søknad -import no.nav.su.se.bakover.domain.SøknadInnholdTestdataBuilder -import no.nav.su.se.bakover.domain.behandling.Attestering -import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics -import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon -import no.nav.su.se.bakover.domain.behandling.avslag.Avslag -import no.nav.su.se.bakover.domain.behandling.avslag.AvslagBrevRequest -import no.nav.su.se.bakover.domain.behandling.withAlleVilkårOppfylt -import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag -import no.nav.su.se.bakover.domain.journal.JournalpostId -import no.nav.su.se.bakover.domain.oppgave.KunneIkkeLukkeOppgave -import no.nav.su.se.bakover.domain.oppgave.OppgaveId -import no.nav.su.se.bakover.domain.person.KunneIkkeHentePerson -import no.nav.su.se.bakover.domain.søknadsbehandling.Statusovergang -import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling -import no.nav.su.se.bakover.service.FnrGenerator -import no.nav.su.se.bakover.service.argThat -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils -import no.nav.su.se.bakover.service.beregning.TestBeregning -import no.nav.su.se.bakover.service.brev.BrevService -import no.nav.su.se.bakover.service.brev.KunneIkkeDistribuereBrev -import no.nav.su.se.bakover.service.brev.KunneIkkeJournalføreBrev -import no.nav.su.se.bakover.service.fixedClock -import no.nav.su.se.bakover.service.oppgave.OppgaveService -import no.nav.su.se.bakover.service.person.PersonService -import org.junit.jupiter.api.Test -import java.time.Clock -import java.util.UUID - -internal class IverksettAvslåttSøknadsbehandlingServiceTest { - private val fnr = FnrGenerator.random() - private val sakId: UUID = UUID.fromString("268e62fb-3079-4e8d-ab32-ff9fb9eac2ec") - private val behandlingId: UUID = UUID.fromString("a602aa68-c989-43e3-9fb7-cb488a2a3821") - private val saksnummer = Saksnummer(999999) - private val iverksattJournalpostId = JournalpostId("j") - private val søknadOppgaveId = OppgaveId("søknadOppgaveId") - private val attestant = NavIdentBruker.Attestant("attestant") - private val saksbehandler = NavIdentBruker.Saksbehandler("saksbehandlinger") - private val person = Person( - ident = Ident( - fnr = BehandlingTestUtils.fnr, - aktørId = AktørId(aktørId = "123") - ), - navn = Person.Navn(fornavn = "Tore", mellomnavn = "Johnas", etternavn = "Strømøy") - ) - private val graphApiResponse = MicrosoftGraphResponse( - displayName = "Nav Navesen", - givenName = "", - mail = "", - officeLocation = "", - surname = "", - userPrincipalName = "", - id = "", - jobTitle = "" - ) - private val journalpostId = JournalpostId("jpid") - private val brevbestillingId = BrevbestillingId("bid") - - @Test - fun `svarer med feil hvis man ikke finner person for journalpost ved avslag`() { - val personServiceMock = mock { - on { hentPerson(any()) } doReturn KunneIkkeHentePerson.FantIkkePerson.left() - } - - val response = createService( - personService = personServiceMock, - ).opprettJournalpostForAvslag(avslagTilAttestering(), attestant) - - response shouldBe Statusovergang.KunneIkkeIverksetteSøknadsbehandling.FantIkkePerson.left() - - inOrder(personServiceMock) { - verify(personServiceMock).hentPerson(argThat { it shouldBe fnr }) - } - } - - @Test - fun `svarer med feil hvis man ikke finner navnet på saksbehandler ved avslag`() { - val behandling = avslagTilAttestering() - - val personServiceMock = mock { - on { hentPerson(any()) } doReturn person.right() - } - - val microsoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(behandling.saksbehandler) } doReturn MicrosoftGraphApiOppslagFeil.FantIkkeBrukerForNavIdent.left() - } - - val response = createService( - personService = personServiceMock, - microsoftGraphApiClient = microsoftGraphApiOppslag - ).opprettJournalpostForAvslag(behandling, attestant) - - response shouldBe Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeJournalføre.left() - - inOrder(personServiceMock, microsoftGraphApiOppslag) { - verify(personServiceMock).hentPerson(argThat { it shouldBe fnr }) - verify(microsoftGraphApiOppslag).hentBrukerinformasjonForNavIdent(argThat { it shouldBe behandling.saksbehandler }) - } - } - - @Test - fun `svarer med feil hvis man ikke finner navnet på attestant ved avslag`() { - val behandling = avslagTilAttestering() - - val personServiceMock = mock { - on { hentPerson(any()) } doReturn person.right() - } - - val microsoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn graphApiResponse.right() doReturn MicrosoftGraphApiOppslagFeil.DeserialiseringAvResponsFeilet.left() - } - - val response = createService( - personService = personServiceMock, - microsoftGraphApiClient = microsoftGraphApiOppslag - ).opprettJournalpostForAvslag(behandling, attestant) - - response shouldBe Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeJournalføre.left() - - inOrder(personServiceMock, microsoftGraphApiOppslag) { - verify(personServiceMock).hentPerson(argThat { it shouldBe fnr }) - verify(microsoftGraphApiOppslag, times(2)).hentBrukerinformasjonForNavIdent(any()) - } - } - - @Test - fun `journalfører brev og returnerer journalpost for avlsag`() { - val behandling = avslagTilAttestering() - - val personServiceMock = mock { - on { hentPerson(any()) } doReturn person.right() - } - - val microsoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn graphApiResponse.right() - } - - val brevserviceMock = mock { - on { journalførBrev(any(), any()) } doReturn iverksattJournalpostId.right() - } - - val response = createService( - personService = personServiceMock, - microsoftGraphApiClient = microsoftGraphApiOppslag, - brevService = brevserviceMock - ).opprettJournalpostForAvslag(behandling, attestant) - - response shouldBe iverksattJournalpostId.right() - - inOrder(personServiceMock, microsoftGraphApiOppslag, brevserviceMock) { - verify(personServiceMock).hentPerson(argThat { it shouldBe fnr }) - verify(microsoftGraphApiOppslag, times(2)).hentBrukerinformasjonForNavIdent(any()) - verify(brevserviceMock).journalførBrev( - argThat { - it shouldBe AvslagBrevRequest( - person = person, - avslag = Avslag( - opprettet = Tidspunkt.now(fixedClock), - avslagsgrunner = emptyList(), - harEktefelle = false, - beregning = behandling.beregning - ), - saksbehandlerNavn = graphApiResponse.displayName, - attestantNavn = graphApiResponse.displayName - ) - }, - argThat { it shouldBe behandling.saksnummer } - ) - } - } - - @Test - fun `svarer med feil hvis journalføring feiler ved avslag`() { - val behandling = avslagTilAttestering() - - val personServiceMock = mock { - on { hentPerson(any()) } doReturn person.right() - } - - val microsoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn graphApiResponse.right() - } - - val brevserviceMock = mock { - on { journalførBrev(any(), any()) } doReturn KunneIkkeJournalføreBrev.KunneIkkeGenereBrev.left() - } - - val response = createService( - personService = personServiceMock, - microsoftGraphApiClient = microsoftGraphApiOppslag, - brevService = brevserviceMock - ).opprettJournalpostForAvslag(behandling, attestant) - - response shouldBe Statusovergang.KunneIkkeIverksetteSøknadsbehandling.KunneIkkeJournalføre.left() - - inOrder(personServiceMock, microsoftGraphApiOppslag, brevserviceMock) { - verify(personServiceMock).hentPerson(argThat { it shouldBe fnr }) - verify(microsoftGraphApiOppslag, times(2)).hentBrukerinformasjonForNavIdent(any()) - verify(brevserviceMock).journalførBrev(any(), any()) - } - } - - @Test - fun `forsøker å distribuere brev og lukke oppgave ved avslag og returnerer innsendt søknadsbehandling ved feil`() { - val behandling = iverksattAvslag() - - val brevServiceMock = mock() { - on { distribuerBrev(any()) } doReturn KunneIkkeDistribuereBrev.left() - } - - val oppgaveServiceMock = mock() { - on { lukkOppgave(any()) } doReturn KunneIkkeLukkeOppgave.left() - } - - val behandlingMetricsMock = mock() - - val response = createService( - brevService = brevServiceMock, - oppgaveService = oppgaveServiceMock, - behandlingMetrics = behandlingMetricsMock - ).distribuerBrevOgLukkOppgaveForAvslag(behandling) - - inOrder(brevServiceMock, oppgaveServiceMock) { - verify(brevServiceMock).distribuerBrev(journalpostId) - verify(oppgaveServiceMock).lukkOppgave(søknadOppgaveId) - verifyZeroInteractions(behandlingMetricsMock) - } - - response shouldBe behandling - } - - @Test - fun `returnerer med oppdatert brevbestillingsid dersom brevdistribusjon går bra`() { - val behandling = iverksattAvslag() - - val brevServiceMock = mock() { - on { distribuerBrev(any()) } doReturn brevbestillingId.right() - } - - val oppgaveServiceMock = mock() { - on { lukkOppgave(any()) } doReturn Unit.right() - } - - val behandlingMetricsMock = mock() - - val response = createService( - brevService = brevServiceMock, - oppgaveService = oppgaveServiceMock, - behandlingMetrics = behandlingMetricsMock - ).distribuerBrevOgLukkOppgaveForAvslag(behandling) - - inOrder(brevServiceMock, oppgaveServiceMock, behandlingMetricsMock) { - verify(brevServiceMock).distribuerBrev(journalpostId) - verify(behandlingMetricsMock).incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.DISTRIBUERT_BREV) - verify(oppgaveServiceMock).lukkOppgave(søknadOppgaveId) - verify(behandlingMetricsMock).incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.LUKKET_OPPGAVE) - } - - response shouldBe behandling.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( - journalpostId, brevbestillingId - ) - ) - } - - private fun avslagTilAttestering() = - Søknadsbehandling.TilAttestering.Avslag.MedBeregning( - id = behandlingId, - opprettet = Tidspunkt.now(), - søknad = Søknad.Journalført.MedOppgave( - id = BehandlingTestUtils.søknadId, - opprettet = Tidspunkt.EPOCH, - sakId = sakId, - søknadInnhold = SøknadInnholdTestdataBuilder.build(), - oppgaveId = BehandlingTestUtils.søknadOppgaveId, - journalpostId = BehandlingTestUtils.søknadJournalpostId - ), - behandlingsinformasjon = Behandlingsinformasjon.lagTomBehandlingsinformasjon().withAlleVilkårOppfylt(), - sakId = sakId, - saksnummer = saksnummer, - fnr = fnr, - saksbehandler = saksbehandler, - oppgaveId = søknadOppgaveId, - beregning = beregning, - ) - - private val beregning = TestBeregning - - private fun iverksattAvslag() = avslagTilAttestering() - .tilIverksatt( - Attestering.Iverksatt(attestant), - EksterneIverksettingsstegForAvslag.Journalført(journalpostId) - ) - - private fun createService( - oppgaveService: OppgaveService = mock(), - personService: PersonService = mock(), - behandlingMetrics: BehandlingMetrics = mock(), - clock: Clock = fixedClock, - microsoftGraphApiClient: MicrosoftGraphApiOppslag = mock(), - brevService: BrevService = mock(), - ) = IverksettAvslåttSøknadsbehandlingService( - oppgaveService = oppgaveService, - personService = personService, - behandlingMetrics = behandlingMetrics, - clock = clock, - microsoftGraphApiClient = microsoftGraphApiClient, - brevService = brevService - ) -} diff --git "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/OpprettManglendeJournalpostOgBrevForIverksettingerTest.kt" "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/OpprettManglendeJournalpostOgBrevForIverksettingerTest.kt" deleted file mode 100644 index 50b379e958..0000000000 --- "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/OpprettManglendeJournalpostOgBrevForIverksettingerTest.kt" +++ /dev/null @@ -1,660 +0,0 @@ -package no.nav.su.se.bakover.service.søknadsbehandling - -import arrow.core.left -import arrow.core.right -import com.nhaarman.mockitokotlin2.any -import com.nhaarman.mockitokotlin2.argumentCaptor -import com.nhaarman.mockitokotlin2.doReturn -import com.nhaarman.mockitokotlin2.doReturnConsecutively -import com.nhaarman.mockitokotlin2.inOrder -import com.nhaarman.mockitokotlin2.mock -import com.nhaarman.mockitokotlin2.times -import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions -import io.kotest.matchers.shouldBe -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslag -import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslagFeil.FantIkkeBrukerForNavIdent -import no.nav.su.se.bakover.common.Tidspunkt -import no.nav.su.se.bakover.common.UUID30 -import no.nav.su.se.bakover.database.revurdering.RevurderingRepo -import no.nav.su.se.bakover.database.søknadsbehandling.SøknadsbehandlingRepo -import no.nav.su.se.bakover.database.vedtak.VedtakRepo -import no.nav.su.se.bakover.domain.AktørId -import no.nav.su.se.bakover.domain.Ident -import no.nav.su.se.bakover.domain.NavIdentBruker -import no.nav.su.se.bakover.domain.Person -import no.nav.su.se.bakover.domain.Saksnummer -import no.nav.su.se.bakover.domain.Søknad -import no.nav.su.se.bakover.domain.SøknadInnholdTestdataBuilder -import no.nav.su.se.bakover.domain.behandling.Attestering -import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics -import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon -import no.nav.su.se.bakover.domain.behandling.withVilkårAvslått -import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.brev.LagBrevRequest -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag -import no.nav.su.se.bakover.domain.journal.JournalpostId -import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering -import no.nav.su.se.bakover.domain.oppgave.OppgaveId -import no.nav.su.se.bakover.domain.person.KunneIkkeHentePerson -import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling -import no.nav.su.se.bakover.service.FnrGenerator -import no.nav.su.se.bakover.service.argThat -import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils -import no.nav.su.se.bakover.service.beregning.TestBeregning -import no.nav.su.se.bakover.service.brev.BrevService -import no.nav.su.se.bakover.service.brev.KunneIkkeDistribuereBrev -import no.nav.su.se.bakover.service.brev.KunneIkkeJournalføreBrev -import no.nav.su.se.bakover.service.oppgave.OppgaveService -import no.nav.su.se.bakover.service.person.PersonService -import org.junit.jupiter.api.Test -import java.time.Clock -import java.time.LocalDate -import java.util.UUID - -internal class OpprettManglendeJournalpostOgBrevForIverksettingerTest { - private val fnr = FnrGenerator.random() - private val person = Person( - ident = Ident( - fnr = fnr, - aktørId = AktørId(aktørId = "123") - ), - navn = Person.Navn(fornavn = "Tore", mellomnavn = "Johnas", etternavn = "Strømøy") - ) - private val sakIdJournalpost = UUID.randomUUID() - private val sakIdBestiltBrev = UUID.randomUUID() - - private val behandlingIdJournalpost = UUID.randomUUID() - private val behandlingIdBestiltBrev = UUID.randomUUID() - - private val journalpostId = JournalpostId("1") - private val journalpostIdBestiltBrev = JournalpostId("1") - - private val brevbestillingId = BrevbestillingId("2") - - private val journalpostOgBrevdistribusjonResultat = - FerdigstillIverksettingService.OpprettetJournalpostForIverksetting( - sakIdJournalpost, - behandlingIdJournalpost, - journalpostId - ) - private val bestiltBrev = - FerdigstillIverksettingService.BestiltBrev( - sakIdBestiltBrev, - behandlingIdBestiltBrev, - journalpostIdBestiltBrev, - brevbestillingId - ) - - private val saksbehandler = NavIdentBruker.Saksbehandler("Z123") - private val saksbehandlerNavn = "saksbehandlerNavn" - private val attestant = NavIdentBruker.Attestant("Z321") - private val attestantNavn = "attestantNavn" - - private val innvilgetBehandlingUtenJournalpost = Søknadsbehandling.Iverksatt.Innvilget( - søknad = Søknad.Journalført.MedOppgave( - id = UUID.randomUUID(), - opprettet = Tidspunkt.EPOCH, - sakId = sakIdJournalpost, - søknadInnhold = SøknadInnholdTestdataBuilder.build(), - oppgaveId = OppgaveId("1"), - journalpostId = journalpostId - ), - id = behandlingIdJournalpost, - saksbehandler = saksbehandler, - attestering = Attestering.Iverksatt(attestant), - sakId = sakIdJournalpost, - saksnummer = Saksnummer(1), - fnr = fnr, - oppgaveId = OppgaveId("1"), - opprettet = Tidspunkt.EPOCH, - beregning = TestBeregning, - simulering = Simulering( - gjelderId = BehandlingTestUtils.fnr, - gjelderNavn = "", - datoBeregnet = LocalDate.EPOCH, - nettoBeløp = 0, - periodeList = listOf() - ), - behandlingsinformasjon = BehandlingTestUtils.behandlingsinformasjon, - utbetalingId = UUID30.randomUUID() - ) - - private val avslagUtenBrevbestilling = Søknadsbehandling.Iverksatt.Avslag.UtenBeregning( - søknad = Søknad.Journalført.MedOppgave( - id = UUID.randomUUID(), - opprettet = Tidspunkt.EPOCH, - sakId = sakIdJournalpost, - søknadInnhold = SøknadInnholdTestdataBuilder.build(), - oppgaveId = OppgaveId("1"), - journalpostId = journalpostId - ), - id = behandlingIdJournalpost, - saksbehandler = saksbehandler, - attestering = Attestering.Iverksatt(attestant), - sakId = sakIdJournalpost, - saksnummer = Saksnummer(1), - fnr = fnr, - oppgaveId = OppgaveId("1"), - opprettet = Tidspunkt.EPOCH, - behandlingsinformasjon = Behandlingsinformasjon.lagTomBehandlingsinformasjon().withVilkårAvslått(), - eksterneIverksettingsteg = EksterneIverksettingsstegForAvslag.Journalført(journalpostId), - ) - - @Test - fun `Gjør ingenting hvis det ikke er noe å gjøre`() { - val behandlingRepoMock = mock { - on { hentIverksatteBehandlingerUtenJournalposteringer() } doReturn emptyList() - on { hentIverksatteBehandlingerUtenBrevbestillinger() } doReturn emptyList() - } - - val actual = createService( - søknadsbehandlingRepo = behandlingRepoMock, - ).opprettManglendeJournalpostOgBrevdistribusjon() - - actual shouldBe FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = emptyList(), - brevbestillingsresultat = emptyList() - ) - - inOrder( - behandlingRepoMock - ) { - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenJournalposteringer() - - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenBrevbestillinger() - } - verifyNoMoreInteractions(behandlingRepoMock) - } - - @Test - fun `Kunne ikke opprette journalpost hvis vi ikke finner saksbehandler`() { - val behandlingRepoMock = mock { - on { hentIverksatteBehandlingerUtenJournalposteringer() } doReturn listOf(innvilgetBehandlingUtenJournalpost) - on { hentIverksatteBehandlingerUtenBrevbestillinger() } doReturn emptyList() - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturn FantIkkeBrukerForNavIdent.left() - } - - val actual = createService( - søknadsbehandlingRepo = behandlingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - ).opprettManglendeJournalpostOgBrevdistribusjon() - - actual shouldBe FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = listOf( - FerdigstillIverksettingService.KunneIkkeOppretteJournalpostForIverksetting( - sakId = sakIdJournalpost, - behandlingId = behandlingIdJournalpost, - grunn = "FikkIkkeHentetSaksbehandlerEllerAttestant" - ).left() - ), - brevbestillingsresultat = emptyList() - ) - - inOrder( - behandlingRepoMock, - personServiceMock, - oppslagMock - ) { - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenJournalposteringer() - verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe fnr }) - verify(oppslagMock).hentBrukerinformasjonForNavIdent(argThat { it shouldBe saksbehandler }) - - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenBrevbestillinger() - } - verifyNoMoreInteractions(behandlingRepoMock, personServiceMock, oppslagMock) - } - - @Test - fun `Kunne ikke opprette journalpost hvis vi ikke finner attestant`() { - val behandlingRepoMock = mock { - on { hentIverksatteBehandlingerUtenJournalposteringer() } doReturn listOf(innvilgetBehandlingUtenJournalpost) - on { hentIverksatteBehandlingerUtenBrevbestillinger() } doReturn emptyList() - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) }.doReturn( - BehandlingTestUtils.microsoftGraphMock.response.right(), - FantIkkeBrukerForNavIdent.left() - ) - } - - val actual = createService( - søknadsbehandlingRepo = behandlingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - ).opprettManglendeJournalpostOgBrevdistribusjon() - - actual shouldBe FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = listOf( - FerdigstillIverksettingService.KunneIkkeOppretteJournalpostForIverksetting( - sakId = sakIdJournalpost, - behandlingId = behandlingIdJournalpost, - grunn = "FikkIkkeHentetSaksbehandlerEllerAttestant" - ).left() - ), - brevbestillingsresultat = emptyList() - ) - - inOrder( - behandlingRepoMock, - personServiceMock, - oppslagMock - ) { - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenJournalposteringer() - verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe fnr }) - argumentCaptor().apply { - verify(oppslagMock, times(2)).hentBrukerinformasjonForNavIdent(capture()) - firstValue shouldBe saksbehandler - secondValue shouldBe attestant - } - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenBrevbestillinger() - } - verifyNoMoreInteractions(behandlingRepoMock, personServiceMock, oppslagMock) - } - - @Test - fun `Kunne ikke opprette journalpost hvis vi ikke finner person`() { - val behandlingRepoMock = mock { - on { hentIverksatteBehandlingerUtenJournalposteringer() } doReturn listOf(innvilgetBehandlingUtenJournalpost) - on { hentIverksatteBehandlingerUtenBrevbestillinger() } doReturn emptyList() - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn KunneIkkeHentePerson.FantIkkePerson.left() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = saksbehandlerNavn).right(), - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = attestantNavn).right(), - ) - } - - val actual = createService( - søknadsbehandlingRepo = behandlingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - ).opprettManglendeJournalpostOgBrevdistribusjon() - - actual shouldBe FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = listOf( - FerdigstillIverksettingService.KunneIkkeOppretteJournalpostForIverksetting( - sakId = sakIdJournalpost, - behandlingId = behandlingIdJournalpost, - grunn = "FantIkkePerson" - ).left() - ), - brevbestillingsresultat = emptyList() - ) - - inOrder( - behandlingRepoMock, - personServiceMock, - oppslagMock - ) { - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenJournalposteringer() - verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe fnr }) - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenBrevbestillinger() - } - verifyNoMoreInteractions(behandlingRepoMock, personServiceMock, oppslagMock) - } - - @Test - fun `Kunne ikke journalføre brev når vi ikke klarer å lage det`() { - val behandlingRepoMock = mock { - on { hentIverksatteBehandlingerUtenJournalposteringer() } doReturn listOf(innvilgetBehandlingUtenJournalpost) - on { hentIverksatteBehandlingerUtenBrevbestillinger() } doReturn emptyList() - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - - val brevServiceMock = mock { - on { - journalførBrev(any(), any()) - } doReturn KunneIkkeJournalføreBrev.KunneIkkeOppretteJournalpost.left() - } - - val oppslagMock = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = saksbehandlerNavn).right(), - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = attestantNavn).right(), - ) - } - - val actual = createService( - søknadsbehandlingRepo = behandlingRepoMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - brevService = brevServiceMock, - ).opprettManglendeJournalpostOgBrevdistribusjon() - - actual shouldBe FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = listOf( - FerdigstillIverksettingService.KunneIkkeOppretteJournalpostForIverksetting( - sakId = sakIdJournalpost, - behandlingId = behandlingIdJournalpost, - grunn = "KunneIkkeOppretteJournalpost" - ).left() - ), - brevbestillingsresultat = emptyList() - ) - - inOrder( - behandlingRepoMock, - brevServiceMock, - personServiceMock, - oppslagMock, - ) { - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenJournalposteringer() - verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe fnr }) - argumentCaptor().apply { - verify(oppslagMock, times(2)).hentBrukerinformasjonForNavIdent(capture()) - firstValue shouldBe saksbehandler - secondValue shouldBe attestant - } - verify(brevServiceMock).journalførBrev( - argThat { - it shouldBe LagBrevRequest.InnvilgetVedtak( - person = person, - beregning = innvilgetBehandlingUtenJournalpost.beregning, - behandlingsinformasjon = innvilgetBehandlingUtenJournalpost.behandlingsinformasjon, - saksbehandlerNavn = saksbehandlerNavn, - attestantNavn = attestantNavn, - ) - }, - argThat { it shouldBe innvilgetBehandlingUtenJournalpost.saksnummer } - ) - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenBrevbestillinger() - } - verifyNoMoreInteractions( - behandlingRepoMock, - brevServiceMock, - personServiceMock, - oppslagMock, - ) - } - - @Test - fun `Kan ikke bestille brev hvis iverksattJournalId er null`() { - val behandlingRepoMock = mock { - on { hentIverksatteBehandlingerUtenJournalposteringer() } doReturn emptyList() - on { hentIverksatteBehandlingerUtenBrevbestillinger() } doReturn listOf( - innvilgetBehandlingUtenJournalpost.copy( - id = behandlingIdBestiltBrev, - sakId = sakIdBestiltBrev, - ) - ) - } - - val actual = createService( - søknadsbehandlingRepo = behandlingRepoMock, - ).opprettManglendeJournalpostOgBrevdistribusjon() - - actual shouldBe FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = emptyList(), - brevbestillingsresultat = listOf( - FerdigstillIverksettingService.KunneIkkeBestilleBrev( - sakId = sakIdBestiltBrev, - behandlingId = behandlingIdBestiltBrev, - journalpostId = null, - grunn = "MåJournalføresFørst" - ).left() - ) - ) - - inOrder( - behandlingRepoMock - ) { - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenJournalposteringer() - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenBrevbestillinger() - } - verifyNoMoreInteractions(behandlingRepoMock) - } - - @Test - fun `Kunne ikke distribuere brev`() { - val behandlingRepoMock = mock { - on { hentIverksatteBehandlingerUtenJournalposteringer() } doReturn emptyList() - on { hentIverksatteBehandlingerUtenBrevbestillinger() } doReturn listOf( - innvilgetBehandlingUtenJournalpost.copy( - id = behandlingIdBestiltBrev, - sakId = sakIdBestiltBrev, - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.Journalført( - journalpostId - ) - ) - ) - } - - val brevServiceMock = mock() { - on { distribuerBrev(any()) } doReturn KunneIkkeDistribuereBrev.left() - } - val actual = createService( - søknadsbehandlingRepo = behandlingRepoMock, - brevService = brevServiceMock, - ).opprettManglendeJournalpostOgBrevdistribusjon() - - actual shouldBe FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = emptyList(), - brevbestillingsresultat = listOf( - FerdigstillIverksettingService.KunneIkkeBestilleBrev( - sakId = sakIdBestiltBrev, - behandlingId = behandlingIdBestiltBrev, - journalpostId = journalpostIdBestiltBrev, - grunn = "FeilVedDistribueringAvBrev" - ).left() - ) - ) - - inOrder( - behandlingRepoMock, - brevServiceMock, - ) { - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenJournalposteringer() - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenBrevbestillinger() - verify(brevServiceMock).distribuerBrev( - argThat { - it shouldBe journalpostId - } - ) - } - verifyNoMoreInteractions( - behandlingRepoMock, - brevServiceMock, - ) - } - - @Test - fun `distribuerer brev for iverksatt avslag`() { - val behandlingRepoMock = mock { - on { hentIverksatteBehandlingerUtenBrevbestillinger() } doReturn listOf( - avslagUtenBrevbestilling.copy( - id = behandlingIdBestiltBrev, - sakId = sakIdBestiltBrev - ) - ) - } - - val brevServiceMock = mock { - on { distribuerBrev(any()) } doReturn brevbestillingId.right() - } - - val vedtakRepo = mock() - - val actual = createService( - søknadsbehandlingRepo = behandlingRepoMock, - brevService = brevServiceMock, - vedtakRepo = vedtakRepo - ).opprettManglendeJournalpostOgBrevdistribusjon() - - actual shouldBe FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = emptyList(), - brevbestillingsresultat = listOf(bestiltBrev.right()) - ) - - inOrder( - behandlingRepoMock, - brevServiceMock, - vedtakRepo - ) { - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenJournalposteringer() - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenBrevbestillinger() - verify(brevServiceMock).distribuerBrev(argThat { it shouldBe journalpostId }) - verify(behandlingRepoMock).lagre( - argThat { - it shouldBe avslagUtenBrevbestilling.copy( - id = behandlingIdBestiltBrev, - sakId = sakIdBestiltBrev, - eksterneIverksettingsteg = EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( - avslagUtenBrevbestilling.eksterneIverksettingsteg.journalpostId, - brevbestillingId - ) - ) - } - ) - verify(vedtakRepo).oppdaterBrevbestillingIdForSøknadsbehandling(behandlingIdBestiltBrev, brevbestillingId) - } - verifyNoMoreInteractions(behandlingRepoMock, brevServiceMock) - } - - @Test - fun `journalfører og distribuerer brev for iverksatt innvilget`() { - val behandlingRepoMock = mock { - on { hentIverksatteBehandlingerUtenJournalposteringer() } doReturn listOf(innvilgetBehandlingUtenJournalpost) - on { hentIverksatteBehandlingerUtenBrevbestillinger() } doReturn listOf( - innvilgetBehandlingUtenJournalpost.copy( - id = behandlingIdBestiltBrev, - sakId = sakIdBestiltBrev, - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.Journalført( - journalpostIdBestiltBrev - ) - ), - ) - } - - val personServiceMock = mock { - on { hentPersonMedSystembruker(any()) } doReturn person.right() - } - - val brevServiceMock = mock { - on { journalførBrev(any(), any()) } doReturn journalpostIdBestiltBrev.right() - on { distribuerBrev(any()) } doReturn brevbestillingId.right() - } - - val oppslagMock: MicrosoftGraphApiOppslag = mock { - on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = saksbehandlerNavn).right(), - BehandlingTestUtils.microsoftGraphMock.response.copy(displayName = attestantNavn).right(), - ) - } - - val vedtakRepo = mock() - - val actual = createService( - søknadsbehandlingRepo = behandlingRepoMock, - brevService = brevServiceMock, - personService = personServiceMock, - microsoftGraphApiOppslag = oppslagMock, - vedtakRepo = vedtakRepo - ).opprettManglendeJournalpostOgBrevdistribusjon() - - actual shouldBe FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( - journalpostresultat = listOf(journalpostOgBrevdistribusjonResultat.right()), - brevbestillingsresultat = listOf(bestiltBrev.right()) - ) - - inOrder( - behandlingRepoMock, - personServiceMock, - oppslagMock, - brevServiceMock, - brevServiceMock, - vedtakRepo - ) { - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenJournalposteringer() - verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe fnr }) - argumentCaptor().apply { - verify(oppslagMock, times(2)).hentBrukerinformasjonForNavIdent(capture()) - firstValue shouldBe saksbehandler - secondValue shouldBe attestant - } - val lagreCaptor = argumentCaptor() - verify(brevServiceMock).journalførBrev( - argThat { - it shouldBe LagBrevRequest.InnvilgetVedtak( - person = person, - beregning = innvilgetBehandlingUtenJournalpost.beregning, - behandlingsinformasjon = innvilgetBehandlingUtenJournalpost.behandlingsinformasjon, - saksbehandlerNavn = saksbehandlerNavn, - attestantNavn = attestantNavn, - ) - }, - argThat { it shouldBe innvilgetBehandlingUtenJournalpost.saksnummer }, - ) - verify(vedtakRepo).oppdaterJournalpostForSøknadsbehandling(innvilgetBehandlingUtenJournalpost.id, journalpostIdBestiltBrev) - verify(behandlingRepoMock).lagre(lagreCaptor.capture()).let { - lagreCaptor.firstValue shouldBe innvilgetBehandlingUtenJournalpost.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.Journalført( - journalpostIdBestiltBrev - ) - ) - } - verify(behandlingRepoMock).hentIverksatteBehandlingerUtenBrevbestillinger() - verify(brevServiceMock).distribuerBrev(argThat { it shouldBe journalpostIdBestiltBrev }) - verify(behandlingRepoMock).lagre(lagreCaptor.capture()).let { - lagreCaptor.secondValue shouldBe innvilgetBehandlingUtenJournalpost.copy( - id = behandlingIdBestiltBrev, - sakId = sakIdBestiltBrev, - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.JournalførtOgDistribuertBrev( - journalpostIdBestiltBrev, - brevbestillingId - ) - ) - verify(vedtakRepo).oppdaterBrevbestillingIdForSøknadsbehandling(behandlingIdBestiltBrev, brevbestillingId) - } - } - verifyNoMoreInteractions( - behandlingRepoMock, - brevServiceMock, - personServiceMock, - oppslagMock - ) - } - - private fun createService( - søknadsbehandlingRepo: SøknadsbehandlingRepo = mock(), - oppgaveService: OppgaveService = mock(), - personService: PersonService = mock(), - behandlingMetrics: BehandlingMetrics = mock(), - microsoftGraphApiOppslag: MicrosoftGraphApiOppslag = mock(), - brevService: BrevService = mock(), - clock: Clock = Clock.systemUTC(), - revurderingRepo: RevurderingRepo = mock(), - vedtakRepo: VedtakRepo = mock() - ) = FerdigstillIverksettingServiceImpl( - søknadsbehandlingRepo = søknadsbehandlingRepo, - oppgaveService = oppgaveService, - personService = personService, - behandlingMetrics = behandlingMetrics, - microsoftGraphApiClient = microsoftGraphApiOppslag, - brevService = brevService, - clock = clock, - revurderingRepo = revurderingRepo, - vedtakRepo = vedtakRepo - ) -} diff --git "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceAttesteringTest.kt" "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceAttesteringTest.kt" index a11b77cdae..a0c93ee209 100644 --- "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceAttesteringTest.kt" +++ "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceAttesteringTest.kt" @@ -97,8 +97,8 @@ class SøknadsbehandlingServiceAttesteringTest { val actual = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - personService = personServiceMock, oppgaveService = oppgaveServiceMock, + personService = personServiceMock, observer = eventObserver ).sendTilAttestering(SøknadsbehandlingService.SendTilAttesteringRequest(simulertBehandling.id, saksbehandler)) @@ -148,8 +148,8 @@ class SøknadsbehandlingServiceAttesteringTest { val actual = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - personService = personServiceMock, oppgaveService = oppgaveServiceMock, + personService = personServiceMock, observer = eventObserver ).sendTilAttestering(SøknadsbehandlingService.SendTilAttesteringRequest(simulertBehandling.id, saksbehandler)) @@ -176,8 +176,8 @@ class SøknadsbehandlingServiceAttesteringTest { val actual = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - personService = personServiceMock, oppgaveService = oppgaveServiceMock, + personService = personServiceMock, observer = eventObserver ).sendTilAttestering(SøknadsbehandlingService.SendTilAttesteringRequest(simulertBehandling.id, saksbehandler)) @@ -206,8 +206,8 @@ class SøknadsbehandlingServiceAttesteringTest { val actual = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - personService = personServiceMock, oppgaveService = oppgaveServiceMock, + personService = personServiceMock, observer = eventObserver ).sendTilAttestering(SøknadsbehandlingService.SendTilAttesteringRequest(simulertBehandling.id, saksbehandler)) @@ -249,8 +249,8 @@ class SøknadsbehandlingServiceAttesteringTest { val actual = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - personService = personServiceMock, oppgaveService = oppgaveServiceMock, + personService = personServiceMock, observer = eventObserver ).sendTilAttestering(SøknadsbehandlingService.SendTilAttesteringRequest(simulertBehandling.id, saksbehandler)) diff --git "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceIverksettTest.kt" "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceIverksettTest.kt" index 5ce12f137a..bb549a3702 100644 --- "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceIverksettTest.kt" +++ "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceIverksettTest.kt" @@ -3,10 +3,12 @@ package no.nav.su.se.bakover.service.søknadsbehandling import arrow.core.left import arrow.core.right import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.doAnswer import com.nhaarman.mockitokotlin2.doReturn import com.nhaarman.mockitokotlin2.inOrder import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions +import com.nhaarman.mockitokotlin2.whenever import io.kotest.matchers.shouldBe import no.nav.su.se.bakover.common.Tidspunkt import no.nav.su.se.bakover.common.UUID30 @@ -22,7 +24,7 @@ import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon import no.nav.su.se.bakover.domain.behandling.withAlleVilkårOppfylt import no.nav.su.se.bakover.domain.brev.BrevbestillingId -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegForAvslag +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppdrag.Utbetaling import no.nav.su.se.bakover.domain.oppdrag.Utbetalingsrequest @@ -32,6 +34,7 @@ import no.nav.su.se.bakover.domain.oppgave.OppgaveId import no.nav.su.se.bakover.domain.søknadsbehandling.Statusovergang import no.nav.su.se.bakover.domain.søknadsbehandling.StatusovergangVisitor import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling +import no.nav.su.se.bakover.domain.vedtak.Vedtak import no.nav.su.se.bakover.service.FnrGenerator import no.nav.su.se.bakover.service.argThat import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils @@ -41,6 +44,8 @@ import no.nav.su.se.bakover.service.statistikk.Event import no.nav.su.se.bakover.service.statistikk.EventObserver import no.nav.su.se.bakover.service.utbetaling.KunneIkkeUtbetale import no.nav.su.se.bakover.service.utbetaling.UtbetalingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService +import no.nav.su.se.bakover.service.vedtak.snapshot.OpprettVedtakssnapshotService import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows @@ -87,21 +92,20 @@ internal class SøknadsbehandlingServiceIverksettTest { on { hent(any()) } doReturn null } - val iverksettSaksbehandlingServiceMock = mock() + val ferdigstillVedtakServiceMock = mock() val response = createSøknadsbehandlingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - iverksettAvslåttBehandlingService = iverksettSaksbehandlingServiceMock + søknadsbehandlingRepo = søknadsbehandlingRepoMock ).iverksett(SøknadsbehandlingService.IverksettRequest(behandling.id, Attestering.Iverksatt(attestant))) response shouldBe SøknadsbehandlingService.KunneIkkeIverksette.FantIkkeBehandling.left() - inOrder(søknadsbehandlingRepoMock, iverksettSaksbehandlingServiceMock) { + inOrder(søknadsbehandlingRepoMock, ferdigstillVedtakServiceMock) { verify(søknadsbehandlingRepoMock).hent(behandling.id) } verifyNoMoreInteractions( søknadsbehandlingRepoMock, - iverksettSaksbehandlingServiceMock + ferdigstillVedtakServiceMock ) } @@ -113,7 +117,7 @@ internal class SøknadsbehandlingServiceIverksettTest { on { hent(any()) } doReturn behandling } - val iverksettSaksbehandlingServiceMock = mock() + val ferdigstillVedtakServiceMock = mock() val utbetalingServiceMock = mock { on { utbetal(any(), any(), any(), any()) } doReturn KunneIkkeUtbetale.KunneIkkeSimulere.left() @@ -121,7 +125,6 @@ internal class SøknadsbehandlingServiceIverksettTest { val response = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - iverksettAvslåttBehandlingService = iverksettSaksbehandlingServiceMock, utbetalingService = utbetalingServiceMock, ).iverksett(SøknadsbehandlingService.IverksettRequest(behandling.id, Attestering.Iverksatt(attestant))) @@ -139,7 +142,7 @@ internal class SøknadsbehandlingServiceIverksettTest { verifyNoMoreInteractions( utbetalingServiceMock, søknadsbehandlingRepoMock, - iverksettSaksbehandlingServiceMock + ferdigstillVedtakServiceMock ) } @@ -151,7 +154,7 @@ internal class SøknadsbehandlingServiceIverksettTest { on { hent(any()) } doReturn behandling } - val iverksettSaksbehandlingServiceMock = mock() + val ferdigstillVedtakServiceMock = mock() val utbetalingServiceMock = mock { on { @@ -166,7 +169,6 @@ internal class SøknadsbehandlingServiceIverksettTest { val response = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - iverksettAvslåttBehandlingService = iverksettSaksbehandlingServiceMock, utbetalingService = utbetalingServiceMock, ).iverksett(SøknadsbehandlingService.IverksettRequest(behandling.id, Attestering.Iverksatt(attestant))) @@ -184,7 +186,7 @@ internal class SøknadsbehandlingServiceIverksettTest { verifyNoMoreInteractions( utbetalingServiceMock, søknadsbehandlingRepoMock, - iverksettSaksbehandlingServiceMock + ferdigstillVedtakServiceMock ) } @@ -196,7 +198,7 @@ internal class SøknadsbehandlingServiceIverksettTest { on { hent(any()) } doReturn behandling } - val iverksettSaksbehandlingServiceMock = mock() + val ferdigstillVedtakServiceMock = mock() val utbetalingServiceMock = mock { on { utbetal(any(), any(), any(), any()) } doReturn KunneIkkeUtbetale.Protokollfeil.left() @@ -204,7 +206,6 @@ internal class SøknadsbehandlingServiceIverksettTest { val response = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - iverksettAvslåttBehandlingService = iverksettSaksbehandlingServiceMock, utbetalingService = utbetalingServiceMock, ).iverksett(SøknadsbehandlingService.IverksettRequest(behandling.id, Attestering.Iverksatt(attestant))) @@ -222,7 +223,7 @@ internal class SøknadsbehandlingServiceIverksettTest { verifyNoMoreInteractions( utbetalingServiceMock, søknadsbehandlingRepoMock, - iverksettSaksbehandlingServiceMock + ferdigstillVedtakServiceMock ) } @@ -234,19 +235,20 @@ internal class SøknadsbehandlingServiceIverksettTest { on { hent(any()) } doReturn behandling } - val iverksettSaksbehandlingServiceMock = mock() + val ferdigstillVedtakServiceMock = mock() val utbetalingServiceMock = mock { on { utbetal(any(), any(), any(), any()) } doReturn utbetaling.right() } val behandlingMetricsMock = mock() val vedtakRepoMock = mock() + val statistikkObserver = mock() val response = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - iverksettAvslåttBehandlingService = iverksettSaksbehandlingServiceMock, - behandlingMetrics = behandlingMetricsMock, utbetalingService = utbetalingServiceMock, - vedtakRepo = vedtakRepoMock + behandlingMetrics = behandlingMetricsMock, + vedtakRepo = vedtakRepoMock, + observer = statistikkObserver, ).iverksett(SøknadsbehandlingService.IverksettRequest(behandling.id, Attestering.Iverksatt(attestant))) val expected = Søknadsbehandling.Iverksatt.Innvilget( @@ -271,7 +273,8 @@ internal class SøknadsbehandlingServiceIverksettTest { søknadsbehandlingRepoMock, behandlingMetricsMock, utbetalingServiceMock, - vedtakRepoMock + vedtakRepoMock, + statistikkObserver ) { verify(søknadsbehandlingRepoMock).hent(behandling.id) verify(utbetalingServiceMock).utbetal( @@ -281,12 +284,17 @@ internal class SøknadsbehandlingServiceIverksettTest { simulering = argThat { it shouldBe simulering }, ) verify(søknadsbehandlingRepoMock).lagre(expected) - verify(behandlingMetricsMock).incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.PERSISTERT) verify(vedtakRepoMock).lagre(argThat { it.behandling shouldBe expected }) + verify(behandlingMetricsMock).incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.PERSISTERT) + verify(statistikkObserver).handle( + argThat { + it shouldBe Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt(expected) + } + ) } verifyNoMoreInteractions( søknadsbehandlingRepoMock, - iverksettSaksbehandlingServiceMock, + ferdigstillVedtakServiceMock, utbetalingServiceMock ) } @@ -298,9 +306,23 @@ internal class SøknadsbehandlingServiceIverksettTest { val søknadsbehandlingRepoMock = mock { on { hent(any()) } doReturn behandling } + + val ferdigstillVedtakService = mock() { mock -> + doAnswer { it -> + (it.arguments[0] as Vedtak.AvslåttStønad.MedBeregning).copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.Journalført(iverksattJournalpostId)).right() + }.whenever(mock).journalførOgLagre(any()) + doAnswer { + (it.arguments[0] as Vedtak.AvslåttStønad.MedBeregning).copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev(iverksattJournalpostId, iverksattBrevbestillingId)).right() + }.whenever(mock).distribuerOgLagre(any()) + doAnswer { + (it.arguments[0] as Vedtak.AvslåttStønad.MedBeregning).right() + }.whenever(mock).lukkOppgave(any()) + } + val vedtakRepoMock = mock() + val opprettVedtakssnapshotService = mock() - val expectedJournalført = Søknadsbehandling.Iverksatt.Avslag.MedBeregning( + val expectedAvslag = Søknadsbehandling.Iverksatt.Avslag.MedBeregning( id = behandling.id, opprettet = behandling.opprettet, søknad = behandling.søknad, @@ -312,60 +334,46 @@ internal class SøknadsbehandlingServiceIverksettTest { oppgaveId = behandling.oppgaveId, beregning = behandling.beregning, attestering = Attestering.Iverksatt(attestant), - eksterneIverksettingsteg = EksterneIverksettingsstegForAvslag.Journalført( - iverksattJournalpostId - ) - ) - - val expectedJournalførtOgDistribuert = expectedJournalført.copy( - eksterneIverksettingsteg = EksterneIverksettingsstegForAvslag.JournalførtOgDistribuertBrev( - iverksattJournalpostId, iverksattBrevbestillingId - ) + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert ) - val iverksettSaksbehandlingServiceMock = mock { - on { opprettJournalpostForAvslag(any(), any()) } doReturn iverksattJournalpostId.right() - on { distribuerBrevOgLukkOppgaveForAvslag(any()) } doReturn expectedJournalførtOgDistribuert - } - val behandlingMetricsMock = mock() val statistikkObserver = mock() val response = createSøknadsbehandlingService( søknadsbehandlingRepo = søknadsbehandlingRepoMock, - iverksettAvslåttBehandlingService = iverksettSaksbehandlingServiceMock, behandlingMetrics = behandlingMetricsMock, observer = statistikkObserver, - vedtakRepo = vedtakRepoMock + vedtakRepo = vedtakRepoMock, + ferdigstillVedtakService = ferdigstillVedtakService, + opprettVedtakssnapshotService = opprettVedtakssnapshotService ).iverksett(SøknadsbehandlingService.IverksettRequest(behandling.id, Attestering.Iverksatt(attestant))) - response shouldBe expectedJournalførtOgDistribuert.right() + response shouldBe expectedAvslag.right() inOrder( søknadsbehandlingRepoMock, - iverksettSaksbehandlingServiceMock, behandlingMetricsMock, statistikkObserver, - vedtakRepoMock + vedtakRepoMock, + ferdigstillVedtakService, + opprettVedtakssnapshotService ) { verify(søknadsbehandlingRepoMock).hent(behandling.id) - verify(iverksettSaksbehandlingServiceMock).opprettJournalpostForAvslag(behandling, attestant) - verify(søknadsbehandlingRepoMock).lagre(expectedJournalført) + verify(ferdigstillVedtakService).journalførOgLagre(any()) + verify(søknadsbehandlingRepoMock).lagre(expectedAvslag) + verify(opprettVedtakssnapshotService).opprettVedtak(any()) verify(behandlingMetricsMock).incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.PERSISTERT) - verify(iverksettSaksbehandlingServiceMock).distribuerBrevOgLukkOppgaveForAvslag(expectedJournalført) - verify(søknadsbehandlingRepoMock).lagre(expectedJournalførtOgDistribuert) - verify(vedtakRepoMock).lagre(argThat { it.behandling shouldBe expectedJournalførtOgDistribuert }) + verify(ferdigstillVedtakService).distribuerOgLagre(any()) + verify(ferdigstillVedtakService).lukkOppgave(any()) verify(statistikkObserver).handle( argThat { - it shouldBe Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt( - expectedJournalførtOgDistribuert - ) + it shouldBe Event.Statistikk.SøknadsbehandlingStatistikk.SøknadsbehandlingIverksatt(expectedAvslag) } ) } verifyNoMoreInteractions( søknadsbehandlingRepoMock, - iverksettSaksbehandlingServiceMock, ) } @@ -379,21 +387,20 @@ internal class SøknadsbehandlingServiceIverksettTest { on { hent(any()) } doReturn behandling } - val iverksettSaksbehandlingServiceMock = mock() + val ferdigstillVedtakServiceMock = mock() val response = createSøknadsbehandlingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - iverksettAvslåttBehandlingService = iverksettSaksbehandlingServiceMock + søknadsbehandlingRepo = søknadsbehandlingRepoMock ).iverksett(SøknadsbehandlingService.IverksettRequest(behandling.id, Attestering.Iverksatt(attestant))) response shouldBe SøknadsbehandlingService.KunneIkkeIverksette.AttestantOgSaksbehandlerKanIkkeVæreSammePerson.left() - inOrder(søknadsbehandlingRepoMock, iverksettSaksbehandlingServiceMock) { + inOrder(søknadsbehandlingRepoMock, ferdigstillVedtakServiceMock) { verify(søknadsbehandlingRepoMock).hent(behandling.id) } verifyNoMoreInteractions( søknadsbehandlingRepoMock, - iverksettSaksbehandlingServiceMock, + ferdigstillVedtakServiceMock, ) } @@ -416,20 +423,19 @@ internal class SøknadsbehandlingServiceIverksettTest { on { hent(any()) } doReturn behandling } - val iverksettSaksbehandlingServiceMock = mock() + val ferdigstillVedtakServiceMock = mock() assertThrows { createSøknadsbehandlingService( - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - iverksettAvslåttBehandlingService = iverksettSaksbehandlingServiceMock + søknadsbehandlingRepo = søknadsbehandlingRepoMock ).iverksett(SøknadsbehandlingService.IverksettRequest(behandling.id, Attestering.Iverksatt(attestant))) - inOrder(søknadsbehandlingRepoMock, iverksettSaksbehandlingServiceMock) { + inOrder(søknadsbehandlingRepoMock, ferdigstillVedtakServiceMock) { verify(søknadsbehandlingRepoMock).hent(behandling.id) } verifyNoMoreInteractions( søknadsbehandlingRepoMock, - iverksettSaksbehandlingServiceMock, + ferdigstillVedtakServiceMock, ) } } diff --git "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceOpprettetTest.kt" "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceOpprettetTest.kt" index 7731655ab4..f28bd72845 100644 --- "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceOpprettetTest.kt" +++ "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingServiceOpprettetTest.kt" @@ -41,8 +41,8 @@ internal class SøknadsbehandlingServiceOpprettetTest { val saksbehandlingRepo = mock() val service = createSøknadsbehandlingService( - søknadService = søknadServiceMock, - søknadsbehandlingRepo = saksbehandlingRepo + søknadsbehandlingRepo = saksbehandlingRepo, + søknadService = søknadServiceMock ) val søknadId = UUID.randomUUID() @@ -75,8 +75,8 @@ internal class SøknadsbehandlingServiceOpprettetTest { val saksbehandlingRepo = mock() val service = createSøknadsbehandlingService( - søknadService = søknadServiceMock, - søknadsbehandlingRepo = saksbehandlingRepo + søknadsbehandlingRepo = saksbehandlingRepo, + søknadService = søknadServiceMock ) service.opprett(SøknadsbehandlingService.OpprettRequest((lukketSøknad.id))) shouldBe SøknadsbehandlingService.KunneIkkeOpprette.SøknadErLukket.left() @@ -101,8 +101,8 @@ internal class SøknadsbehandlingServiceOpprettetTest { val saksbehandlingRepo = mock() val service = createSøknadsbehandlingService( - søknadService = søknadServiceMock, - søknadsbehandlingRepo = saksbehandlingRepo + søknadsbehandlingRepo = saksbehandlingRepo, + søknadService = søknadServiceMock ) service.opprett(SøknadsbehandlingService.OpprettRequest((utenJournalpostOgOppgave.id))) shouldBe SøknadsbehandlingService.KunneIkkeOpprette.SøknadManglerOppgave.left() @@ -131,8 +131,8 @@ internal class SøknadsbehandlingServiceOpprettetTest { val saksbehandlingRepo = mock() val service = createSøknadsbehandlingService( - søknadService = søknadServiceMock, søknadsbehandlingRepo = saksbehandlingRepo, + søknadService = søknadServiceMock, søknadRepo = søknadRepoMock ) @@ -177,13 +177,12 @@ internal class SøknadsbehandlingServiceOpprettetTest { on { hent(any()) } doReturn expectedSøknadsbehandling } val behandlingService = createSøknadsbehandlingService( + søknadsbehandlingRepo = søknadsbehandlingRepoMock, utbetalingService = mock(), oppgaveService = mock(), søknadService = søknadService, søknadRepo = søknadRepo, personService = mock(), - søknadsbehandlingRepo = søknadsbehandlingRepoMock, - iverksettAvslåttBehandlingService = mock(), behandlingMetrics = mock(), beregningService = mock(), ) diff --git "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingTestUtils.kt" "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingTestUtils.kt" index 6d86aa4dfa..a98a57b6b2 100644 --- "a/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingTestUtils.kt" +++ "b/service/src/test/kotlin/no/nav/su/se/bakover/service/s\303\270knadsbehandling/S\303\270knadsbehandlingTestUtils.kt" @@ -15,6 +15,7 @@ import no.nav.su.se.bakover.service.person.PersonService import no.nav.su.se.bakover.service.statistikk.EventObserver import no.nav.su.se.bakover.service.søknad.SøknadService import no.nav.su.se.bakover.service.utbetaling.UtbetalingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService import no.nav.su.se.bakover.service.vedtak.snapshot.OpprettVedtakssnapshotService import java.time.Clock @@ -26,14 +27,14 @@ internal fun createSøknadsbehandlingService( søknadRepo: SøknadRepo = mock(), personService: PersonService = mock(), behandlingMetrics: BehandlingMetrics = mock(), - iverksettAvslåttBehandlingService: IverksettAvslåttSøknadsbehandlingService = mock(), observer: EventObserver = mock { on { handle(any()) }.doNothing() }, beregningService: BeregningService = mock(), microsoftGraphApiOppslag: MicrosoftGraphApiOppslag = mock(), brevService: BrevService = mock(), opprettVedtakssnapshotService: OpprettVedtakssnapshotService = mock(), clock: Clock = Clock.systemUTC(), - vedtakRepo: VedtakRepo = mock() + vedtakRepo: VedtakRepo = mock(), + ferdigstillVedtakService: FerdigstillVedtakService = mock() ) = SøknadsbehandlingServiceImpl( søknadService, søknadRepo, @@ -41,12 +42,12 @@ internal fun createSøknadsbehandlingService( utbetalingService, personService, oppgaveService, - iverksettAvslåttBehandlingService, behandlingMetrics, beregningService, microsoftGraphApiOppslag, brevService, opprettVedtakssnapshotService, clock, - vedtakRepo + vedtakRepo, + ferdigstillVedtakService, ).apply { addObserver(observer) } diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/vedtak/FerdigstillVedtakServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/vedtak/FerdigstillVedtakServiceImplTest.kt new file mode 100644 index 0000000000..b0d5b26304 --- /dev/null +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/vedtak/FerdigstillVedtakServiceImplTest.kt @@ -0,0 +1,1038 @@ +package no.nav.su.se.bakover.service.vedtak + +import arrow.core.left +import arrow.core.right +import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.doReturn +import com.nhaarman.mockitokotlin2.doReturnConsecutively +import com.nhaarman.mockitokotlin2.inOrder +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.never +import com.nhaarman.mockitokotlin2.times +import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions +import com.nhaarman.mockitokotlin2.verifyZeroInteractions +import io.kotest.matchers.shouldBe +import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslag +import no.nav.su.se.bakover.client.person.MicrosoftGraphApiOppslagFeil +import no.nav.su.se.bakover.client.person.MicrosoftGraphResponse +import no.nav.su.se.bakover.common.Tidspunkt +import no.nav.su.se.bakover.common.UUID30 +import no.nav.su.se.bakover.database.utbetaling.UtbetalingRepo +import no.nav.su.se.bakover.database.vedtak.VedtakRepo +import no.nav.su.se.bakover.domain.AktørId +import no.nav.su.se.bakover.domain.Ident +import no.nav.su.se.bakover.domain.NavIdentBruker +import no.nav.su.se.bakover.domain.Person +import no.nav.su.se.bakover.domain.Saksnummer +import no.nav.su.se.bakover.domain.Søknad +import no.nav.su.se.bakover.domain.SøknadInnholdTestdataBuilder +import no.nav.su.se.bakover.domain.behandling.Attestering +import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics +import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon +import no.nav.su.se.bakover.domain.behandling.avslag.Avslag +import no.nav.su.se.bakover.domain.behandling.avslag.AvslagBrevRequest +import no.nav.su.se.bakover.domain.behandling.withAlleVilkårOppfylt +import no.nav.su.se.bakover.domain.brev.BrevbestillingId +import no.nav.su.se.bakover.domain.brev.LagBrevRequest +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon +import no.nav.su.se.bakover.domain.journal.JournalpostId +import no.nav.su.se.bakover.domain.oppdrag.Kvittering +import no.nav.su.se.bakover.domain.oppdrag.Utbetaling +import no.nav.su.se.bakover.domain.oppgave.KunneIkkeLukkeOppgave +import no.nav.su.se.bakover.domain.oppgave.OppgaveId +import no.nav.su.se.bakover.domain.person.KunneIkkeHentePerson +import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling +import no.nav.su.se.bakover.domain.vedtak.Vedtak +import no.nav.su.se.bakover.service.FnrGenerator +import no.nav.su.se.bakover.service.argThat +import no.nav.su.se.bakover.service.behandling.BehandlingTestUtils +import no.nav.su.se.bakover.service.beregning.TestBeregning +import no.nav.su.se.bakover.service.brev.BrevService +import no.nav.su.se.bakover.service.brev.KunneIkkeDistribuereBrev +import no.nav.su.se.bakover.service.brev.KunneIkkeJournalføreBrev +import no.nav.su.se.bakover.service.fixedClock +import no.nav.su.se.bakover.service.oppgave.OppgaveService +import no.nav.su.se.bakover.service.person.PersonService +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import java.time.Clock +import java.util.UUID + +internal class FerdigstillVedtakServiceImplTest { + + @Test + fun `svarer med feil hvis man ikke finner person for journalpost`() { + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn KunneIkkeHentePerson.FantIkkePerson.left() + } + + val vedtak = avslagsVedtak() + + val response = createService( + personService = personServiceMock, + ).journalførOgLagre(vedtak) + + response shouldBe FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.FantIkkePerson.left() + + inOrder(personServiceMock) { + verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe vedtak.behandling.fnr }) + } + } + + @Test + fun `ferdigstillelse kaster feil hvis man ikke finner person for journalpost`() { + val vedtak = innvilgetVedtak() + + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn KunneIkkeHentePerson.FantIkkePerson.left() + } + + val vedtakRepoMock = mock() { + on { hentForUtbetaling(any()) } doReturn vedtak + } + + assertThrows { + createService( + vedtakRepo = vedtakRepoMock, + personService = personServiceMock, + ).ferdigstillVedtakEtterUtbetaling(vedtak.utbetalingId) + } + inOrder( + vedtakRepoMock, + personServiceMock, + ) { + verify(vedtakRepoMock).hentForUtbetaling(vedtak.utbetalingId) + verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe vedtak.behandling.fnr }) + } + } + + @Test + fun `svarer med feil hvis man ikke finner saksbehandler for journalpost`() { + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturn MicrosoftGraphApiOppslagFeil.FantIkkeBrukerForNavIdent.left() + } + + val vedtak = avslagsVedtak() + + val response = createService( + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock + ).journalførOgLagre(vedtak) + + response shouldBe FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.FantIkkeNavnPåSaksbehandlerEllerAttestant.left() + + inOrder( + personServiceMock, + microsoftGraphApiOppslagMock + ) { + verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe vedtak.behandling.fnr }) + verify(microsoftGraphApiOppslagMock).hentBrukerinformasjonForNavIdent(argThat { it shouldBe vedtak.saksbehandler }) + } + } + + @Test + fun `svarer med feil hvis man ikke finner attestant for journalpost`() { + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( + graphApiResponse.right(), + MicrosoftGraphApiOppslagFeil.FantIkkeBrukerForNavIdent.left() + ) + } + + val vedtak = avslagsVedtak() + + val response = createService( + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock + ).journalførOgLagre(vedtak) + + response shouldBe FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.FantIkkeNavnPåSaksbehandlerEllerAttestant.left() + + inOrder( + personServiceMock, + microsoftGraphApiOppslagMock + ) { + verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe vedtak.behandling.fnr }) + verify(microsoftGraphApiOppslagMock, times(2)).hentBrukerinformasjonForNavIdent(any()) + } + } + + @Test + fun `svarer med feil dersom journalføring av brev feiler`() { + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturn graphApiResponse.right() + } + + val brevServiceMock = mock { + on { journalførBrev(any(), any()) } doReturn KunneIkkeJournalføreBrev.KunneIkkeOppretteJournalpost.left() + } + + val vedtak = avslagsVedtak() + + val response = createService( + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock, + brevService = brevServiceMock + ).journalførOgLagre(vedtak) + + response shouldBe FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.FeilVedJournalføring.left() + + inOrder( + personServiceMock, + microsoftGraphApiOppslagMock, + brevServiceMock + ) { + verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe vedtak.behandling.fnr }) + verify(microsoftGraphApiOppslagMock, times(2)).hentBrukerinformasjonForNavIdent(any()) + verify(brevServiceMock).journalførBrev(any(), any()) + } + } + + @Test + fun `ferdigstillelse etter utbetaling kaster feil hvis journalføring feiler`() { + val vedtak = innvilgetVedtak() + + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturn graphApiResponse.right() + } + + val brevServiceMock = mock { + on { journalførBrev(any(), any()) } doReturn KunneIkkeJournalføreBrev.KunneIkkeOppretteJournalpost.left() + } + + val vedtakRepoMock = mock() { + on { hentForUtbetaling(any()) } doReturn vedtak + } + + assertThrows { + createService( + vedtakRepo = vedtakRepoMock, + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock, + brevService = brevServiceMock, + ).ferdigstillVedtakEtterUtbetaling(vedtak.utbetalingId) + } + inOrder( + vedtakRepoMock, + personServiceMock, + microsoftGraphApiOppslagMock, + brevServiceMock + ) { + verify(vedtakRepoMock).hentForUtbetaling(vedtak.utbetalingId) + verify(personServiceMock).hentPersonMedSystembruker(vedtak.behandling.fnr) + verify(microsoftGraphApiOppslagMock, times(2)).hentBrukerinformasjonForNavIdent(any()) + verify(brevServiceMock).journalførBrev(any(), any()) + } + } + + @Test + fun `svarer med feil dersom journalføring av brev allerede er utført`() { + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturn graphApiResponse.right() + } + + val vedtakRepoMock = mock() + val brevServiceMock = mock() + + val vedtak = journalførtAvslagsVedtak() + val behandlingMetricsMock = mock() + + val response = createService( + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock, + vedtakRepo = vedtakRepoMock, + brevService = brevServiceMock, + behandlingMetrics = behandlingMetricsMock + ).journalførOgLagre(vedtak) + + response shouldBe FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak.KunneIkkeJournalføreBrev.AlleredeJournalført(iverksattJournalpostId).left() + + inOrder( + personServiceMock, + microsoftGraphApiOppslagMock, + vedtakRepoMock + ) { + verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe vedtak.behandling.fnr }) + verify(microsoftGraphApiOppslagMock, times(2)).hentBrukerinformasjonForNavIdent(any()) + verifyZeroInteractions(vedtakRepoMock, brevServiceMock, behandlingMetricsMock) + } + } + + @Test + fun `ferdigstillelse etter utbetaling hopper over journalføring dersom det allerede er utført`() { + val vedtak = journalførtInnvilgetVedtak() + + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturn graphApiResponse.right() + } + + val brevServiceMock = mock() { + on { distribuerBrev(any()) } doReturn iverksattBrevbestillingId.right() + } + + val vedtakRepoMock = mock() { + on { hentForUtbetaling(any()) } doReturn vedtak + } + + val oppgaveServiceMock = mock() { + on { lukkOppgave(any()) } doReturn Unit.right() + } + + val behandlingMetricsMock = mock() + + createService( + vedtakRepo = vedtakRepoMock, + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock, + brevService = brevServiceMock, + oppgaveService = oppgaveServiceMock, + behandlingMetrics = behandlingMetricsMock + ).ferdigstillVedtakEtterUtbetaling(vedtak.utbetalingId) + + inOrder( + vedtakRepoMock, + personServiceMock, + microsoftGraphApiOppslagMock, + brevServiceMock, + oppgaveServiceMock, + behandlingMetricsMock + ) { + verify(vedtakRepoMock).hentForUtbetaling(vedtak.utbetalingId) + verify(personServiceMock).hentPersonMedSystembruker(vedtak.behandling.fnr) + verify(microsoftGraphApiOppslagMock, times(2)).hentBrukerinformasjonForNavIdent(any()) + verify(brevServiceMock, never()).journalførBrev(any(), any()) + verify(brevServiceMock).distribuerBrev(iverksattJournalpostId) + verify(behandlingMetricsMock).incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.DISTRIBUERT_BREV) + verify(oppgaveServiceMock).lukkOppgave(vedtak.behandling.oppgaveId) + verify(behandlingMetricsMock).incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.LUKKET_OPPGAVE) + } + } + + @Test + fun `ferdigstillelse etter utbetaling hopper over journalføring og distribusjon dersom det allerede er utført`() { + val vedtak = journalførtOgDistribuertInnvilgetVedtak() + + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturn graphApiResponse.right() + } + + val brevServiceMock = mock() + + val vedtakRepoMock = mock() { + on { hentForUtbetaling(any()) } doReturn vedtak + } + + val oppgaveServiceMock = mock() { + on { lukkOppgave(any()) } doReturn Unit.right() + } + + val behandlingMetricsMock = mock() + + createService( + vedtakRepo = vedtakRepoMock, + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock, + brevService = brevServiceMock, + oppgaveService = oppgaveServiceMock, + behandlingMetrics = behandlingMetricsMock + ).ferdigstillVedtakEtterUtbetaling(vedtak.utbetalingId) + + inOrder( + vedtakRepoMock, + personServiceMock, + microsoftGraphApiOppslagMock, + brevServiceMock, + oppgaveServiceMock, + behandlingMetricsMock, + ) { + verify(vedtakRepoMock).hentForUtbetaling(vedtak.utbetalingId) + verify(personServiceMock).hentPersonMedSystembruker(vedtak.behandling.fnr) + verify(microsoftGraphApiOppslagMock, times(2)).hentBrukerinformasjonForNavIdent(any()) + verify(brevServiceMock, never()).journalførBrev(any(), any()) + verify(brevServiceMock, never()).distribuerBrev(any()) + verify(oppgaveServiceMock).lukkOppgave(vedtak.behandling.oppgaveId) + verify(vedtakRepoMock, never()).lagre(any()) + verify(behandlingMetricsMock).incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.LUKKET_OPPGAVE) + verifyNoMoreInteractions(behandlingMetricsMock) + } + } + + @Test + fun `ferdigstillelse etter utbetaling går fint`() { + val vedtak = innvilgetVedtak() + + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( + graphApiResponse.copy(displayName = saksbehandler.navIdent).right(), + graphApiResponse.copy(displayName = attestant.navIdent).right(), + ) + } + + val brevServiceMock = mock() { + on { journalførBrev(any(), any()) } doReturn iverksattJournalpostId.right() + on { distribuerBrev(any()) } doReturn iverksattBrevbestillingId.right() + } + + val vedtakRepoMock = mock() { + on { hentForUtbetaling(any()) } doReturn vedtak + } + + val oppgaveServiceMock = mock() { + on { lukkOppgave(any()) } doReturn Unit.right() + } + + val behandlingMetricsMock = mock() + + createService( + vedtakRepo = vedtakRepoMock, + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock, + brevService = brevServiceMock, + oppgaveService = oppgaveServiceMock, + behandlingMetrics = behandlingMetricsMock + ).ferdigstillVedtakEtterUtbetaling(vedtak.utbetalingId) + + inOrder( + vedtakRepoMock, + personServiceMock, + microsoftGraphApiOppslagMock, + brevServiceMock, + oppgaveServiceMock, + behandlingMetricsMock, + ) { + verify(vedtakRepoMock).hentForUtbetaling(vedtak.utbetalingId) + verify(personServiceMock).hentPersonMedSystembruker(vedtak.behandling.fnr) + verify(microsoftGraphApiOppslagMock, times(2)).hentBrukerinformasjonForNavIdent(any()) + verify(brevServiceMock).journalførBrev( + argThat { + LagBrevRequest.InnvilgetVedtak( + person = person, + beregning = vedtak.beregning, + behandlingsinformasjon = vedtak.behandlingsinformasjon, + saksbehandlerNavn = vedtak.saksbehandler.navIdent, + attestantNavn = vedtak.saksbehandler.navIdent, + ) + }, + argThat { vedtak.behandling.saksnummer } + ) + verify(behandlingMetricsMock).incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.JOURNALFØRT) + verify(brevServiceMock).distribuerBrev(iverksattJournalpostId) + verify(behandlingMetricsMock).incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.DISTRIBUERT_BREV) + verify(oppgaveServiceMock).lukkOppgave(vedtak.behandling.oppgaveId) + verify(behandlingMetricsMock).incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.LUKKET_OPPGAVE) + } + } + + @Test + fun `oppdaterer vedtak og lagrer dersom journalføring går fint`() { + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( + graphApiResponse.copy(displayName = saksbehandler.navIdent).right(), + graphApiResponse.copy(displayName = attestant.navIdent).right(), + ) + } + + val brevServiceMock = mock { + on { journalførBrev(any(), any()) } doReturn iverksattJournalpostId.right() + } + + val vedtakRepoMock = mock() + + val behandlingMetricsMock = mock() + + val vedtak = avslagsVedtak() + + val response = createService( + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock, + brevService = brevServiceMock, + vedtakRepo = vedtakRepoMock, + behandlingMetrics = behandlingMetricsMock + ).journalførOgLagre(vedtak) + + response shouldBe vedtak.copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.Journalført(iverksattJournalpostId)).right() + + inOrder( + personServiceMock, + microsoftGraphApiOppslagMock, + brevServiceMock, + vedtakRepoMock, + behandlingMetricsMock, + ) { + verify(personServiceMock).hentPersonMedSystembruker(argThat { it shouldBe vedtak.behandling.fnr }) + verify(microsoftGraphApiOppslagMock, times(2)).hentBrukerinformasjonForNavIdent(any()) + verify(brevServiceMock).journalførBrev( + argThat { + it shouldBe AvslagBrevRequest( + person = person, + avslag = Avslag(Tidspunkt.now(fixedClock), avslagsgrunner = vedtak.avslagsgrunner, harEktefelle = false, beregning = vedtak.beregning), + saksbehandlerNavn = vedtak.saksbehandler.navIdent, + attestantNavn = vedtak.attestant.navIdent + ) + }, + argThat { it shouldBe vedtak.behandling.saksnummer } + ) + verify(vedtakRepoMock).lagre(vedtak.copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.Journalført(iverksattJournalpostId))) + verify(behandlingMetricsMock).incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.JOURNALFØRT) + } + } + + @Test + fun `svarer med feil dersom brevdistribusjon feiler`() { + val brevServiceMock = mock { + on { distribuerBrev(any()) } doReturn KunneIkkeDistribuereBrev.left() + } + + val vedtak = journalførtAvslagsVedtak() + + val response = createService( + brevService = brevServiceMock, + ).distribuerOgLagre(vedtak) + + response shouldBe FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak.KunneIkkeDistribuereBrev.FeilVedDistribusjon(iverksattJournalpostId).left() + + inOrder(brevServiceMock) { + verify(brevServiceMock).distribuerBrev(iverksattJournalpostId) + } + } + + @Test + fun `svarer med feil dersom distribusjon ikke er journalført først`() { + val vedtakRepoMock = mock() + val brevServiceMock = mock() + + val vedtak = avslagsVedtak() + + val response = createService( + vedtakRepo = vedtakRepoMock, + brevService = brevServiceMock, + ).distribuerOgLagre(vedtak) + + response shouldBe FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak.KunneIkkeDistribuereBrev.MåJournalføresFørst.left() + + inOrder( + vedtakRepoMock, + brevServiceMock + ) { + verifyZeroInteractions(vedtakRepoMock, brevServiceMock) + } + } + + @Test + fun `svarer med feil dersom distribusjon av brev allerede er utført`() { + val vedtakRepoMock = mock() + val brevServiceMock = mock() + + val vedtak = journalførtOgDistribuertAvslagsVedtak() + + val response = createService( + vedtakRepo = vedtakRepoMock, + brevService = brevServiceMock, + ).distribuerOgLagre(vedtak) + + response shouldBe FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak.KunneIkkeDistribuereBrev.AlleredeDistribuert(iverksattJournalpostId).left() + + inOrder( + vedtakRepoMock, + brevServiceMock + ) { + verifyZeroInteractions(vedtakRepoMock, brevServiceMock) + } + } + + @Test + fun `oppdaterer vedtak og lagrer dersom brevdistribusjon går fint`() { + val brevServiceMock = mock { + on { distribuerBrev(any()) } doReturn iverksattBrevbestillingId.right() + } + + val vedtakRepoMock = mock() + + val behandlingMetricsMock = mock() + + val vedtak = journalførtAvslagsVedtak() + + val response = createService( + brevService = brevServiceMock, + vedtakRepo = vedtakRepoMock, + behandlingMetrics = behandlingMetricsMock + ).distribuerOgLagre(vedtak) + + response shouldBe vedtak.copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev(iverksattJournalpostId, iverksattBrevbestillingId)).right() + + inOrder( + brevServiceMock, + vedtakRepoMock, + behandlingMetricsMock, + ) { + verify(brevServiceMock).distribuerBrev(iverksattJournalpostId) + verify(vedtakRepoMock).lagre(vedtak.copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev(iverksattJournalpostId, iverksattBrevbestillingId))) + verify(behandlingMetricsMock).incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.DISTRIBUERT_BREV) + } + } + + @Test + fun `svarer med feil dersom lukking av oppgave feiler`() { + val oppgaveServiceMock = mock { + on { lukkOppgave(any()) } doReturn KunneIkkeLukkeOppgave.left() + } + + val vedtak = journalførtOgDistribuertAvslagsVedtak() + + val behandlingMetricsMock = mock() + + val response = createService( + oppgaveService = oppgaveServiceMock, + behandlingMetrics = behandlingMetricsMock + ).lukkOppgave(vedtak) + + response shouldBe FerdigstillVedtakService.KunneIkkeFerdigstilleVedtak.KunneIkkeLukkeOppgave.left() + + inOrder( + oppgaveServiceMock, + behandlingMetricsMock, + ) { + verify(oppgaveServiceMock).lukkOppgave(oppgaveId) + verifyZeroInteractions(behandlingMetricsMock) + } + } + + @Test + fun `opprettelse av manglende journalpost og brevbestilling gjør ingenting hvis ingenting mangler`() { + val vedtakRepoMock = mock { + on { hentUtenJournalpost() } doReturn emptyList() + on { hentUtenBrevbestilling() } doReturn emptyList() + } + + val behandlingMetricsMock = mock() + + val response = createService( + vedtakRepo = vedtakRepoMock, + behandlingMetrics = behandlingMetricsMock + ).opprettManglendeJournalposterOgBrevbestillinger() + + response shouldBe FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( + journalpostresultat = emptyList(), + brevbestillingsresultat = emptyList() + ) + + inOrder( + vedtakRepoMock + ) { + verify(vedtakRepoMock).hentUtenJournalpost() + verify(vedtakRepoMock).hentUtenBrevbestilling() + } + verifyNoMoreInteractions(vedtakRepoMock, behandlingMetricsMock) + } + + @Test + fun `opprettelse av manglende journalpost feiler teknisk`() { + val vedtak = avslagsVedtak() + + val vedtakRepoMock = mock { + on { hentUtenJournalpost() } doReturn listOf(vedtak) + on { hentUtenBrevbestilling() } doReturn emptyList() + } + + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturnConsecutively listOf( + graphApiResponse.copy(displayName = "saksa").right(), + graphApiResponse.copy(displayName = "atta").right(), + ) + } + + val brevServiceMock = mock { + on { journalførBrev(any(), any()) } doReturn KunneIkkeJournalføreBrev.KunneIkkeOppretteJournalpost.left() + } + + val response = createService( + vedtakRepo = vedtakRepoMock, + brevService = brevServiceMock, + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock, + ).opprettManglendeJournalposterOgBrevbestillinger() + + response shouldBe FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( + journalpostresultat = listOf( + FerdigstillVedtakService.KunneIkkeOppretteJournalpostForIverksetting( + sakId = vedtak.behandling.sakId, + behandlingId = vedtak.behandling.id, + grunn = "FeilVedJournalføring" + ).left() + ), + brevbestillingsresultat = emptyList() + ) + + inOrder( + vedtakRepoMock, + brevServiceMock + ) { + verify(vedtakRepoMock).hentUtenJournalpost() + verify(brevServiceMock).journalførBrev( + argThat { + it shouldBe AvslagBrevRequest( + person = person, + avslag = Avslag(Tidspunkt.now(fixedClock), avslagsgrunner = vedtak.avslagsgrunner, harEktefelle = false, beregning = vedtak.beregning), + saksbehandlerNavn = "saksa", + attestantNavn = "atta" + ) + }, + argThat { it shouldBe vedtak.behandling.saksnummer } + ) + verify(vedtakRepoMock).hentUtenBrevbestilling() + } + verifyNoMoreInteractions(vedtakRepoMock, brevServiceMock) + } + + @Test + fun `oppretter manglende jornalpost for vedtak`() { + val avslagsVedtak = avslagsVedtak() + + val personServiceMock = mock { + on { hentPersonMedSystembruker(any()) } doReturn person.right() + } + + val microsoftGraphApiOppslagMock = mock { + on { hentBrukerinformasjonForNavIdent(any()) } doReturn graphApiResponse.right() + } + + val vedtakRepoMock = mock { + on { hentUtenJournalpost() } doReturn listOf(avslagsVedtak) + on { hentUtenBrevbestilling() } doReturn emptyList() + } + + val brevServiceMock = mock() { + on { journalførBrev(any(), any()) } doReturn iverksattJournalpostId.right() + } + + val behandlingMetricsMock = mock() + + val response = createService( + vedtakRepo = vedtakRepoMock, + brevService = brevServiceMock, + personService = personServiceMock, + microsoftGraphApiClient = microsoftGraphApiOppslagMock, + behandlingMetrics = behandlingMetricsMock, + ).opprettManglendeJournalposterOgBrevbestillinger() + + response shouldBe FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( + journalpostresultat = listOf( + FerdigstillVedtakService.OpprettetJournalpostForIverksetting( + sakId = avslagsVedtak.behandling.sakId, + behandlingId = avslagsVedtak.behandling.id, + journalpostId = iverksattJournalpostId + ).right() + ), + brevbestillingsresultat = emptyList() + ) + + inOrder( + vedtakRepoMock, + brevServiceMock, + behandlingMetricsMock, + ) { + verify(vedtakRepoMock).hentUtenJournalpost() + verify(brevServiceMock).journalførBrev(any(), any()) + verify(vedtakRepoMock).lagre( + argThat { + it shouldBe avslagsVedtak.copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.Journalført(iverksattJournalpostId)) + } + ) + verify(behandlingMetricsMock).incrementAvslåttCounter(BehandlingMetrics.AvslåttHandlinger.JOURNALFØRT) + verify(vedtakRepoMock).hentUtenBrevbestilling() + } + } + + @Test + fun `oppretter manglende brevbestilling for journalført vedtak`() { + val innvilgelseUtenBrevbestilling = journalførtInnvilgetVedtak() + val utbetalingMock = mock { + on { kvittering } doReturn Kvittering(Kvittering.Utbetalingsstatus.OK, "") + } + + val vedtakRepoMock = mock { + on { hentUtenJournalpost() } doReturn emptyList() + on { hentUtenBrevbestilling() } doReturn listOf(innvilgelseUtenBrevbestilling) + } + + val utbetalingRepoMock = mock { + on { hentUtbetaling(innvilgelseUtenBrevbestilling.utbetalingId) } doReturn utbetalingMock + } + + val brevServiceMock = mock() { + on { distribuerBrev(any()) } doReturn iverksattBrevbestillingId.right() + } + + val behandlingMetricsMock = mock() + + val response = createService( + vedtakRepo = vedtakRepoMock, + utbetalingRepo = utbetalingRepoMock, + brevService = brevServiceMock, + behandlingMetrics = behandlingMetricsMock, + ).opprettManglendeJournalposterOgBrevbestillinger() + + response shouldBe FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( + journalpostresultat = emptyList(), + brevbestillingsresultat = listOf( + FerdigstillVedtakService.BestiltBrev( + sakId = innvilgelseUtenBrevbestilling.behandling.sakId, + behandlingId = innvilgelseUtenBrevbestilling.behandling.id, + journalpostId = iverksattJournalpostId, + brevbestillingId = iverksattBrevbestillingId + ).right() + ) + ) + + inOrder( + vedtakRepoMock, + brevServiceMock, + utbetalingRepoMock, + behandlingMetricsMock, + ) { + verify(vedtakRepoMock).hentUtenJournalpost() + verify(vedtakRepoMock).hentUtenBrevbestilling() + verify(utbetalingRepoMock).hentUtbetaling(innvilgelseUtenBrevbestilling.utbetalingId) + verify(brevServiceMock).distribuerBrev(iverksattJournalpostId) + verify(vedtakRepoMock).lagre( + argThat { + it shouldBe innvilgelseUtenBrevbestilling.copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev(iverksattJournalpostId, iverksattBrevbestillingId)) + } + ) + verify(behandlingMetricsMock).incrementInnvilgetCounter(BehandlingMetrics.InnvilgetHandlinger.DISTRIBUERT_BREV) + verifyNoMoreInteractions(vedtakRepoMock, brevServiceMock, utbetalingRepoMock) + } + } + + @Test + fun `kan ikke opprette manglende brevbestilling hvis vedtak ikke er journalført`() { + val innvilgelseUtenBrevbestilling = innvilgetVedtak() + val utbetalingMock = mock { + on { kvittering } doReturn Kvittering(Kvittering.Utbetalingsstatus.OK, "") + } + + val vedtakRepoMock = mock { + on { hentUtenJournalpost() } doReturn emptyList() + on { hentUtenBrevbestilling() } doReturn listOf(innvilgelseUtenBrevbestilling) + } + + val utbetalingRepoMock = mock { + on { hentUtbetaling(innvilgelseUtenBrevbestilling.utbetalingId) } doReturn utbetalingMock + } + + val brevServiceMock = mock() + + val response = createService( + vedtakRepo = vedtakRepoMock, + utbetalingRepo = utbetalingRepoMock + ).opprettManglendeJournalposterOgBrevbestillinger() + + response shouldBe FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( + journalpostresultat = emptyList(), + brevbestillingsresultat = listOf( + FerdigstillVedtakService.KunneIkkeBestilleBrev( + sakId = innvilgelseUtenBrevbestilling.behandling.sakId, + behandlingId = innvilgelseUtenBrevbestilling.behandling.id, + journalpostId = null, + grunn = "MåJournalføresFørst" + ).left() + ) + ) + + inOrder( + vedtakRepoMock, + utbetalingRepoMock, + ) { + verify(vedtakRepoMock).hentUtenJournalpost() + verify(vedtakRepoMock).hentUtenBrevbestilling() + verify(utbetalingRepoMock).hentUtbetaling(innvilgelseUtenBrevbestilling.utbetalingId) + } + verifyNoMoreInteractions(vedtakRepoMock, brevServiceMock) + } + + @Test + fun `oppretter ikke manglende journalpost for vedtak med ukvitterte utbetalinger eller kvitteringer med feil`() { + val innvilgetVedtakUkvittertUtbetaling = innvilgetVedtak() + val ukvittertUtbetaling = mock() + + val innvilgetVedtakKvitteringMedFeil = innvilgetVedtak() + val kvitteringMedFeil = mock() { + on { kvittering } doReturn Kvittering(Kvittering.Utbetalingsstatus.FEIL, "") + } + + val vedtakRepoMock = mock { + on { hentUtenJournalpost() } doReturn emptyList() + on { hentUtenBrevbestilling() } doReturn listOf(innvilgetVedtakUkvittertUtbetaling, innvilgetVedtakKvitteringMedFeil) + } + + val utbetalingRepoMock = mock { + on { hentUtbetaling(innvilgetVedtakUkvittertUtbetaling.utbetalingId) } doReturn ukvittertUtbetaling + on { hentUtbetaling(innvilgetVedtakKvitteringMedFeil.utbetalingId) } doReturn kvitteringMedFeil + } + + val brevServiceMock = mock() + + val response = createService( + vedtakRepo = vedtakRepoMock, + utbetalingRepo = utbetalingRepoMock, + brevService = brevServiceMock, + ).opprettManglendeJournalposterOgBrevbestillinger() + + response shouldBe FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( + journalpostresultat = emptyList(), + brevbestillingsresultat = emptyList() + ) + + inOrder( + vedtakRepoMock, + utbetalingRepoMock, + brevServiceMock + ) { + verify(vedtakRepoMock).hentUtenJournalpost() + verify(vedtakRepoMock).hentUtenBrevbestilling() + verify(utbetalingRepoMock).hentUtbetaling(innvilgetVedtakUkvittertUtbetaling.utbetalingId) + verify(utbetalingRepoMock).hentUtbetaling(innvilgetVedtakKvitteringMedFeil.utbetalingId) + } + verifyNoMoreInteractions(vedtakRepoMock, brevServiceMock) + } + + private fun createService( + oppgaveService: OppgaveService = mock(), + personService: PersonService = mock(), + clock: Clock = fixedClock, + microsoftGraphApiClient: MicrosoftGraphApiOppslag = mock(), + brevService: BrevService = mock(), + vedtakRepo: VedtakRepo = mock(), + utbetalingRepo: UtbetalingRepo = mock(), + behandlingMetrics: BehandlingMetrics = mock(), + ) = FerdigstillVedtakServiceImpl( + oppgaveService = oppgaveService, + personService = personService, + clock = clock, + microsoftGraphApiOppslag = microsoftGraphApiClient, + brevService = brevService, + vedtakRepo = vedtakRepo, + utbetalingRepo = utbetalingRepo, + behandlingMetrics = behandlingMetrics + ) + + private fun avslagsVedtak() = + Vedtak.AvslåttStønad.fromSøknadsbehandlingMedBeregning( + Søknadsbehandling.Iverksatt.Avslag.MedBeregning( + id = UUID.randomUUID(), + opprettet = Tidspunkt.now(), + søknad = Søknad.Journalført.MedOppgave( + id = BehandlingTestUtils.søknadId, + opprettet = Tidspunkt.EPOCH, + sakId = UUID.randomUUID(), + søknadInnhold = SøknadInnholdTestdataBuilder.build(), + oppgaveId = BehandlingTestUtils.søknadOppgaveId, + journalpostId = BehandlingTestUtils.søknadJournalpostId + ), + behandlingsinformasjon = Behandlingsinformasjon.lagTomBehandlingsinformasjon().withAlleVilkårOppfylt(), + sakId = UUID.randomUUID(), + saksnummer = Saksnummer(1), + fnr = FnrGenerator.random(), + saksbehandler = saksbehandler, + oppgaveId = oppgaveId, + beregning = TestBeregning, + attestering = Attestering.Iverksatt(attestant) + ) + ) + + private fun journalførtAvslagsVedtak() = avslagsVedtak().copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.Journalført(iverksattJournalpostId)) + private fun journalførtOgDistribuertAvslagsVedtak() = avslagsVedtak().copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev(iverksattJournalpostId, iverksattBrevbestillingId)) + + private fun innvilgetVedtak() = + Vedtak.InnvilgetStønad.fromSøknadsbehandling( + Søknadsbehandling.Iverksatt.Innvilget( + id = UUID.randomUUID(), + opprettet = Tidspunkt.now(), + søknad = Søknad.Journalført.MedOppgave( + id = BehandlingTestUtils.søknadId, + opprettet = Tidspunkt.EPOCH, + sakId = UUID.randomUUID(), + søknadInnhold = SøknadInnholdTestdataBuilder.build(), + oppgaveId = BehandlingTestUtils.søknadOppgaveId, + journalpostId = BehandlingTestUtils.søknadJournalpostId + ), + behandlingsinformasjon = Behandlingsinformasjon.lagTomBehandlingsinformasjon().withAlleVilkårOppfylt(), + sakId = UUID.randomUUID(), + saksnummer = Saksnummer(1), + fnr = FnrGenerator.random(), + saksbehandler = saksbehandler, + oppgaveId = oppgaveId, + beregning = TestBeregning, + attestering = Attestering.Iverksatt(attestant), + simulering = mock(), + utbetalingId = UUID30.randomUUID() + ) + ) + + private fun journalførtInnvilgetVedtak() = innvilgetVedtak().copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.Journalført(iverksattJournalpostId)) + private fun journalførtOgDistribuertInnvilgetVedtak() = innvilgetVedtak().copy(journalføringOgBrevdistribusjon = JournalføringOgBrevdistribusjon.JournalførtOgDistribuertBrev(iverksattJournalpostId, iverksattBrevbestillingId)) + + private val person = Person( + ident = Ident( + fnr = BehandlingTestUtils.fnr, + aktørId = AktørId(aktørId = "123") + ), + navn = Person.Navn(fornavn = "Tore", mellomnavn = "Johnas", etternavn = "Strømøy") + ) + private val iverksattJournalpostId = JournalpostId("j") + private val iverksattBrevbestillingId = BrevbestillingId("b") + private val oppgaveId = OppgaveId("2") + private val saksbehandler = NavIdentBruker.Saksbehandler("saks") + private val attestant = NavIdentBruker.Attestant("atte") + + private val graphApiResponse = MicrosoftGraphResponse( + displayName = "Nav Navesen", + givenName = "", + mail = "", + officeLocation = "", + surname = "", + userPrincipalName = "", + id = "", + jobTitle = "" + ) +} diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/Application.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/Application.kt index 69f425f69a..70ebcd9d7d 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/Application.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/Application.kt @@ -251,7 +251,7 @@ internal fun Application.susebakover( avstemmingRoutes(accessProtectedServices.avstemming) stansutbetalingRoutes(accessProtectedServices.utbetaling) gjenopptaUtbetalingRoutes(accessProtectedServices.utbetaling) - driftRoutes(accessProtectedServices.søknad, accessProtectedServices.ferdigstillIverksettingService) + driftRoutes(accessProtectedServices.søknad, accessProtectedServices.ferdigstillVedtak) revurderingRoutes(accessProtectedServices.revurdering) } } @@ -259,7 +259,7 @@ internal fun Application.susebakover( } val utbetalingKvitteringConsumer = UtbetalingKvitteringConsumer( utbetalingService = services.utbetaling, - ferdigstillIverksettingService = services.ferdigstillIverksettingService, + ferdigstillVedtakService = services.ferdigstillVedtak, clock = clock, ) if (applicationConfig.runtimeEnvironment == ApplicationConfig.RuntimeEnvironment.Nais) { diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/drift/DriftRoutes.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/drift/DriftRoutes.kt index 20e4887ff4..7219df6762 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/drift/DriftRoutes.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/drift/DriftRoutes.kt @@ -9,7 +9,7 @@ import io.ktor.util.KtorExperimentalAPI import no.nav.su.se.bakover.common.serialize import no.nav.su.se.bakover.domain.Brukerrolle import no.nav.su.se.bakover.service.søknad.SøknadService -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService import no.nav.su.se.bakover.web.features.authorize import no.nav.su.se.bakover.web.routes.drift.FixIverksettingerResponseJson.Companion.toJson import no.nav.su.se.bakover.web.routes.drift.FixSøknaderResponseJson.Companion.toJson @@ -19,7 +19,7 @@ internal const val DRIFT_PATH = "/drift" @KtorExperimentalAPI internal fun Route.driftRoutes( søknadService: SøknadService, - ferdigstillIverksettingService: FerdigstillIverksettingService, + ferdigstillVedtakService: FerdigstillVedtakService, ) { authorize(Brukerrolle.Drift) { patch("$DRIFT_PATH/søknader/fix") { @@ -34,7 +34,7 @@ internal fun Route.driftRoutes( authorize(Brukerrolle.Drift) { patch("$DRIFT_PATH/iverksettinger/fix") { - ferdigstillIverksettingService.opprettManglendeJournalpostOgBrevdistribusjon().let { + ferdigstillVedtakService.opprettManglendeJournalposterOgBrevbestillinger().let { call.respond( if (it.harFeil()) HttpStatusCode.InternalServerError else HttpStatusCode.OK, serialize(it.toJson()) diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/drift/FixIverksettingerResponseJson.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/drift/FixIverksettingerResponseJson.kt index 5649f3cf11..ac1b4f6742 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/drift/FixIverksettingerResponseJson.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/drift/FixIverksettingerResponseJson.kt @@ -1,6 +1,6 @@ package no.nav.su.se.bakover.web.routes.drift -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService data class FixIverksettingerResponseJson( val journalposteringer: Journalposteringer, @@ -35,7 +35,7 @@ data class FixIverksettingerResponseJson( ) companion object { - fun FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat.toJson() = FixIverksettingerResponseJson( + fun FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat.toJson() = FixIverksettingerResponseJson( journalposteringer = Journalposteringer( ok = this.journalpostresultat.mapNotNull { it.orNull() }.map { Journalpost( diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/UtbetalingKvitteringConsumer.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/UtbetalingKvitteringConsumer.kt index 68b6500621..250ba6ef88 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/UtbetalingKvitteringConsumer.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/UtbetalingKvitteringConsumer.kt @@ -10,15 +10,15 @@ import kotlinx.coroutines.runBlocking import no.nav.su.se.bakover.domain.oppdrag.Kvittering import no.nav.su.se.bakover.domain.oppdrag.Utbetaling import no.nav.su.se.bakover.domain.oppdrag.avstemming.Avstemmingsnøkkel -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService import no.nav.su.se.bakover.service.utbetaling.UtbetalingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService import no.nav.su.se.bakover.web.services.utbetaling.kvittering.UtbetalingKvitteringResponse.Companion.toKvitteringResponse import org.slf4j.LoggerFactory import java.time.Clock class UtbetalingKvitteringConsumer( private val utbetalingService: UtbetalingService, - private val ferdigstillIverksettingService: FerdigstillIverksettingService, + private val ferdigstillVedtakService: FerdigstillVedtakService, private val clock: Clock ) { private val log = LoggerFactory.getLogger(this::class.java) @@ -72,6 +72,6 @@ class UtbetalingKvitteringConsumer( log.error("Prøver ikke å ferdigstille innvilgelse siden kvitteringen fra oppdrag ikke var OK.") return } - ferdigstillIverksettingService.ferdigstillIverksetting(utbetaling.id) + ferdigstillVedtakService.ferdigstillVedtakEtterUtbetaling(utbetaling.id) } } diff --git a/web/src/test/kotlin/no/nav/su/se/bakover/web/TestServicesBuilder.kt b/web/src/test/kotlin/no/nav/su/se/bakover/web/TestServicesBuilder.kt index a924d22831..8eb10d269e 100644 --- a/web/src/test/kotlin/no/nav/su/se/bakover/web/TestServicesBuilder.kt +++ b/web/src/test/kotlin/no/nav/su/se/bakover/web/TestServicesBuilder.kt @@ -16,7 +16,7 @@ object TestServicesBuilder { statistikk = mock(), toggles = mock(), søknadsbehandling = mock(), - ferdigstillIverksettingService = mock(), + ferdigstillVedtak = mock(), revurdering = mock() ) } diff --git a/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/drift/FixIverksettingerTest.kt b/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/drift/FixIverksettingerTest.kt index a7f4f51db2..f7f33d211c 100644 --- a/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/drift/FixIverksettingerTest.kt +++ b/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/drift/FixIverksettingerTest.kt @@ -11,7 +11,7 @@ import io.ktor.server.testing.withTestApplication import no.nav.su.se.bakover.domain.Brukerrolle import no.nav.su.se.bakover.domain.brev.BrevbestillingId import no.nav.su.se.bakover.domain.journal.JournalpostId -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService import no.nav.su.se.bakover.web.TestServicesBuilder import no.nav.su.se.bakover.web.defaultRequest import no.nav.su.se.bakover.web.testSusebakover @@ -43,14 +43,14 @@ internal class FixIverksettingerTest { @Test fun `fix-iverksettinger-endepunktet gir tomt resultat`() { - val ferdigstillIverksettingServiceMock = mock { - on { opprettManglendeJournalpostOgBrevdistribusjon() } doReturn FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( + val ferdigstillVedtakServiceMock = mock { + on { opprettManglendeJournalposterOgBrevbestillinger() } doReturn FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( journalpostresultat = emptyList(), brevbestillingsresultat = emptyList() ) } withTestApplication({ - testSusebakover(services = services.copy(ferdigstillIverksettingService = ferdigstillIverksettingServiceMock)) + testSusebakover(services = services.copy(ferdigstillVedtak = ferdigstillVedtakServiceMock)) }) { defaultRequest( HttpMethod.Patch, @@ -82,12 +82,12 @@ internal class FixIverksettingerTest { @Test fun `fix-iverksettinger-endepunktet med journalposteringer og bestilling av brev`() { val sakId = UUID.fromString("e8c3325c-4c4e-436c-90ad-7ac72f963a8c") - val journalført = FerdigstillIverksettingService.OpprettetJournalpostForIverksetting( + val journalført = FerdigstillVedtakService.OpprettetJournalpostForIverksetting( behandlingId = UUID.fromString("51c51049-6c55-40d6-8013-b99505a0ef14"), sakId = sakId, journalpostId = JournalpostId("1"), ) - val bestiltBrev = FerdigstillIverksettingService.BestiltBrev( + val bestiltBrev = FerdigstillVedtakService.BestiltBrev( behandlingId = UUID.fromString("e38df38a-c3fc-48d1-adca-0a9264024a2e"), sakId = sakId, journalpostId = JournalpostId("2"), @@ -96,11 +96,11 @@ internal class FixIverksettingerTest { val søknadIdJournalpost = UUID.fromString("18e19f68-029d-4731-ad4a-48d902fc92a2") val søknadIdOppgave = UUID.fromString("22770c98-31b0-412e-9e63-9a878330386e") - val ferdigstillIverksettingServiceMock = mock { - on { opprettManglendeJournalpostOgBrevdistribusjon() } doReturn FerdigstillIverksettingService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( + val ferdigstillVedtakServiceMock = mock { + on { opprettManglendeJournalposterOgBrevbestillinger() } doReturn FerdigstillVedtakService.OpprettManglendeJournalpostOgBrevdistribusjonResultat( journalpostresultat = listOf( journalført.right(), - FerdigstillIverksettingService.KunneIkkeOppretteJournalpostForIverksetting( + FerdigstillVedtakService.KunneIkkeOppretteJournalpostForIverksetting( sakId, søknadIdJournalpost, "Fant ikke Person" @@ -108,7 +108,7 @@ internal class FixIverksettingerTest { ), brevbestillingsresultat = listOf( bestiltBrev.right(), - FerdigstillIverksettingService.KunneIkkeBestilleBrev( + FerdigstillVedtakService.KunneIkkeBestilleBrev( sakId, søknadIdOppgave, JournalpostId("1"), @@ -118,7 +118,7 @@ internal class FixIverksettingerTest { ) } withTestApplication({ - testSusebakover(services = services.copy(ferdigstillIverksettingService = ferdigstillIverksettingServiceMock)) + testSusebakover(services = services.copy(ferdigstillVedtak = ferdigstillVedtakServiceMock)) }) { defaultRequest( HttpMethod.Patch, diff --git a/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/revurdering/IverksettRevurderingRouteKtTest.kt b/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/revurdering/IverksettRevurderingRouteKtTest.kt index 4e3722b043..3d4544c493 100644 --- a/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/revurdering/IverksettRevurderingRouteKtTest.kt +++ b/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/revurdering/IverksettRevurderingRouteKtTest.kt @@ -15,7 +15,7 @@ import no.nav.su.se.bakover.common.UUID30 import no.nav.su.se.bakover.common.objectMapper import no.nav.su.se.bakover.domain.Brukerrolle import no.nav.su.se.bakover.domain.NavIdentBruker -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.oppgave.OppgaveId import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering @@ -81,7 +81,7 @@ internal class IverksettRevurderingRouteKtTest { oppgaveId = OppgaveId("OppgaveId"), attestant = NavIdentBruker.Attestant("attestant"), utbetalingId = UUID30.randomUUID(), - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert ) val revurderingServiceMock = mock { diff --git a/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/revurdering/RevurderingRoutesTestData.kt b/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/revurdering/RevurderingRoutesTestData.kt index 1b831b72ef..d2ee3c414c 100644 --- a/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/revurdering/RevurderingRoutesTestData.kt +++ b/web/src/test/kotlin/no/nav/su/se/bakover/web/routes/revurdering/RevurderingRoutesTestData.kt @@ -12,7 +12,7 @@ import no.nav.su.se.bakover.domain.Søknad import no.nav.su.se.bakover.domain.SøknadInnholdTestdataBuilder import no.nav.su.se.bakover.domain.behandling.Attestering import no.nav.su.se.bakover.domain.behandling.Behandlingsinformasjon -import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.EksterneIverksettingsstegEtterUtbetaling +import no.nav.su.se.bakover.domain.eksterneiverksettingssteg.JournalføringOgBrevdistribusjon import no.nav.su.se.bakover.domain.journal.JournalpostId import no.nav.su.se.bakover.domain.oppgave.OppgaveId import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling @@ -61,7 +61,7 @@ object RevurderingRoutesTestData { saksbehandler = NavIdentBruker.Saksbehandler("saks"), attestering = Attestering.Iverksatt(NavIdentBruker.Attestant("attestant")), utbetalingId = UUID30.randomUUID(), - eksterneIverksettingsteg = EksterneIverksettingsstegEtterUtbetaling.VenterPåKvittering + eksterneIverksettingsteg = JournalføringOgBrevdistribusjon.IkkeJournalførtEllerDistribuert ) ) } diff --git a/web/src/test/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/LokalKvitteringJobTest.kt b/web/src/test/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/LokalKvitteringJobTest.kt index 8b3b02807a..6e4e6cc6fd 100644 --- a/web/src/test/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/LokalKvitteringJobTest.kt +++ b/web/src/test/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/LokalKvitteringJobTest.kt @@ -21,8 +21,8 @@ import no.nav.su.se.bakover.domain.oppdrag.Utbetalingsrequest import no.nav.su.se.bakover.domain.oppdrag.avstemming.Avstemmingsnøkkel import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService import no.nav.su.se.bakover.service.utbetaling.UtbetalingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService import no.nav.su.se.bakover.web.FnrGenerator import no.nav.su.se.bakover.web.argThat import org.junit.jupiter.api.Test @@ -74,11 +74,11 @@ internal class LokalKvitteringJobTest { ).right() } val innvilgetSøknadsbehandling = mock {} - val ferdigstillIverksettingServiceMock = mock() + val ferdigstillVedtakServiceMock = mock() val utbetalingKvitteringConsumer = UtbetalingKvitteringConsumer( utbetalingService = utbetalingServiceMock, - ferdigstillIverksettingService = ferdigstillIverksettingServiceMock, + ferdigstillVedtakService = ferdigstillVedtakServiceMock, clock = fixedClock ) LokalKvitteringJob(utbetalingRepoMock, utbetalingKvitteringConsumer).schedule() @@ -87,14 +87,14 @@ internal class LokalKvitteringJobTest { avstemmingsnøkkel = argThat { it shouldBe utbetaling.avstemmingsnøkkel }, kvittering = argThat { it shouldBe kvittering.copy(originalKvittering = it.originalKvittering) } ) - verify(ferdigstillIverksettingServiceMock, timeout(1000)).ferdigstillIverksetting( + verify(ferdigstillVedtakServiceMock, timeout(1000)).ferdigstillVedtakEtterUtbetaling( argThat { it shouldBe utbetaling.id } ) verifyNoMoreInteractions( utbetalingRepoMock, utbetalingServiceMock, - ferdigstillIverksettingServiceMock, + ferdigstillVedtakServiceMock, innvilgetSøknadsbehandling ) } diff --git a/web/src/test/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/UtbetalingKvitteringConsumerTest.kt b/web/src/test/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/UtbetalingKvitteringConsumerTest.kt index 39f8c53803..1b0d7f8327 100644 --- a/web/src/test/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/UtbetalingKvitteringConsumerTest.kt +++ b/web/src/test/kotlin/no/nav/su/se/bakover/web/services/utbetaling/kvittering/UtbetalingKvitteringConsumerTest.kt @@ -20,9 +20,9 @@ import no.nav.su.se.bakover.domain.oppdrag.Utbetaling import no.nav.su.se.bakover.domain.oppdrag.Utbetalingsrequest import no.nav.su.se.bakover.domain.oppdrag.avstemming.Avstemmingsnøkkel import no.nav.su.se.bakover.domain.oppdrag.simulering.Simulering -import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingService import no.nav.su.se.bakover.service.utbetaling.FantIkkeUtbetaling import no.nav.su.se.bakover.service.utbetaling.UtbetalingService +import no.nav.su.se.bakover.service.vedtak.FerdigstillVedtakService import no.nav.su.se.bakover.web.FnrGenerator import no.nav.su.se.bakover.web.argThat import no.nav.su.se.bakover.web.fixedClock @@ -91,9 +91,8 @@ internal class UtbetalingKvitteringConsumerTest { on { oppdaterMedKvittering(any(), any()) } doReturn utbetalingMedKvittering.right() } - val ferdigstillIverksettingService = mock() - val consumer = - UtbetalingKvitteringConsumer(utbetalingServiceMock, ferdigstillIverksettingService, clock) + val ferdigstillVedtakServiceMock = mock() + val consumer = UtbetalingKvitteringConsumer(utbetalingServiceMock, ferdigstillVedtakServiceMock, clock) consumer.onMessage(xmlMessage) @@ -101,7 +100,7 @@ internal class UtbetalingKvitteringConsumerTest { avstemmingsnøkkel = argThat { it shouldBe avstemmingsnøkkel }, kvittering = argThat { it shouldBe kvittering } ) - verifyNoMoreInteractions(utbetalingServiceMock, ferdigstillIverksettingService) + verifyNoMoreInteractions(utbetalingServiceMock, ferdigstillVedtakServiceMock) } } @@ -122,7 +121,7 @@ internal class UtbetalingKvitteringConsumerTest { on { oppdaterMedKvittering(any(), any()) } doReturn utbetalingMedKvittering.right() } - val ferdigstillIverksettingServiceMock = mock() + val ferdigstillIverksettingServiceMock = mock() val consumer = UtbetalingKvitteringConsumer(utbetalingServiceMock, ferdigstillIverksettingServiceMock, clock) consumer.onMessage(xmlMessage) @@ -150,8 +149,8 @@ internal class UtbetalingKvitteringConsumerTest { on { oppdaterMedKvittering(any(), any()) } doReturn utbetalingMedKvittering.right() } - val ferdigstillIverksettingServiceMock = mock {} - val consumer = UtbetalingKvitteringConsumer(utbetalingServiceMock, ferdigstillIverksettingServiceMock, clock) + val ferdigstillVedtakServiceMock = mock {} + val consumer = UtbetalingKvitteringConsumer(utbetalingServiceMock, ferdigstillVedtakServiceMock, clock) consumer.onMessage(xmlMessage) @@ -160,10 +159,10 @@ internal class UtbetalingKvitteringConsumerTest { kvittering = argThat { it shouldBe kvittering } ) - verify(ferdigstillIverksettingServiceMock).ferdigstillIverksetting( + verify(ferdigstillVedtakServiceMock).ferdigstillVedtakEtterUtbetaling( argThat { it shouldBe utbetaling.id } ) - verifyNoMoreInteractions(utbetalingServiceMock, ferdigstillIverksettingServiceMock) + verifyNoMoreInteractions(utbetalingServiceMock, ferdigstillVedtakServiceMock) } @Test @@ -182,11 +181,11 @@ internal class UtbetalingKvitteringConsumerTest { on { oppdaterMedKvittering(any(), any()) } doReturn utbetalingMedKvittering.right() } - val ferdigstillIverksettingServiceMock = mock { - on { ferdigstillIverksetting(any()) }.thenThrow(IllegalArgumentException("Kastet fra FerdigstillIverksettingService")) + val ferdigstillVedtakServiceMock = mock { + on { ferdigstillVedtakEtterUtbetaling(any()) }.thenThrow(IllegalArgumentException("Kastet fra FerdigstillIverksettingService")) } - val consumer = UtbetalingKvitteringConsumer(utbetalingServiceMock, ferdigstillIverksettingServiceMock, clock) + val consumer = UtbetalingKvitteringConsumer(utbetalingServiceMock, ferdigstillVedtakServiceMock, clock) assertThrows { consumer.onMessage(xmlMessage) @@ -199,7 +198,7 @@ internal class UtbetalingKvitteringConsumerTest { kvittering = argThat { it shouldBe kvittering } ) - verify(ferdigstillIverksettingServiceMock).ferdigstillIverksetting( + verify(ferdigstillVedtakServiceMock).ferdigstillVedtakEtterUtbetaling( argThat { it shouldBe utbetaling.id } ) }