Skip to content

Commit

Permalink
Merge branch 'main' into dev/videresend-forespoersel-til-opprett-oppgave
Browse files Browse the repository at this point in the history
  • Loading branch information
magnusae committed Oct 30, 2024
2 parents f6dbd75 + fbddbf7 commit 75978a5
Show file tree
Hide file tree
Showing 11 changed files with 313 additions and 189 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ object Metrics {

val aaregRequest = requestMetric("Aareg")

val agNotifikasjonRequest = requestMetric("AG-notifikasjon")

val altinnRequest = requestMetric("Altinn")

val brregRequest = requestMetric("Brreg")
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ utilsVersion=0.9.0
aaregClientVersion=0.7.0
altinnClientVersion=0.4.0
maskinportenClientVersion=0.1.9
arbeidsgiverNotifikasjonKlientVersion=3.0.0
arbeidsgiverNotifikasjonKlientVersion=3.1.0
brregKlientVersion=0.5.0
dokarkivKlientVersion=0.3.1
inntektKlientVersion=0.4.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ class ForespoerselMottattIT : EndToEndTest() {
@Test
fun `Oppretter sak og oppgave ved mottatt forespørsel`() {
coEvery {
arbeidsgiverNotifikasjonKlient.opprettNySak(any(), any(), any(), any(), any(), any(), any(), any())
agNotifikasjonKlient.opprettNySak(any(), any(), any(), any(), any(), any(), any(), any(), any())
} returns Mock.sakId

coEvery {
arbeidsgiverNotifikasjonKlient.opprettNyOppgave(any(), any(), any(), any(), any(), any(), any(), any(), any(), any())
agNotifikasjonKlient.opprettNyOppgave(any(), any(), any(), any(), any(), any(), any(), any(), any(), any())
} returns Mock.oppgaveId

publish(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ class InnsendingIT : EndToEndTest() {

private fun bekreftMarkeringAvForespoerselSomBesvart() {
verify(exactly = 1) {
mockPriProducer.send(
priProducer.send(
Pri.Key.NOTIS to Pri.NotisType.FORESPOERSEL_BESVART_SIMBA.toJson(Pri.NotisType.serializer()),
Pri.Key.FORESPOERSEL_ID to Mock.forespoerselId.toJson(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class LagreSelvbestemtIT : EndToEndTest() {
coEvery { brregClient.hentVirksomheter(any()) } returns listOf(Mock.virksomhet)
coEvery { pdlKlient.personBolk(any()) } returns Mock.personer
coEvery { aaregClient.hentArbeidsforhold(any(), any()) } returns Mock.arbeidsforhold
coEvery { arbeidsgiverNotifikasjonKlient.opprettNySak(any(), any(), any(), any(), any(), any(), any(), any()) } returns Mock.sakId
coEvery { agNotifikasjonKlient.opprettNySak(any(), any(), any(), any(), any(), any(), any(), any(), any()) } returns Mock.sakId
coEvery { dokarkivClient.opprettOgFerdigstillJournalpost(any(), any(), any(), any(), any(), any(), any()) } returns
OpprettOgFerdigstillResponse(
journalpostId = Mock.journalpostId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,27 +194,23 @@ abstract class EndToEndTest : ContainerTest() {
val bakgrunnsjobbRepository by lazy { PostgresBakgrunnsjobbRepository(bakgrunnsjobbDatabase.dataSource) }

val altinnClient = mockk<AltinnClient>()
val arbeidsgiverNotifikasjonKlient = mockk<ArbeidsgiverNotifikasjonKlient>(relaxed = true)
val dokarkivClient = mockk<DokArkivClient>(relaxed = true)
val pdlKlient = mockk<PdlClient>()
val priProducer = mockk<PriProducer>()
val spinnKlient = mockk<SpinnKlient>()
val brregClient = mockk<BrregClient>(relaxed = true)
val mockPriProducer = mockk<PriProducer>()

val aaregClient = mockk<AaregClient>(relaxed = true)
val agNotifikasjonKlient = mockk<ArbeidsgiverNotifikasjonKlient>(relaxed = true)
val brregClient = mockk<BrregClient>(relaxed = true)
val dokarkivClient = mockk<DokArkivClient>(relaxed = true)
val inntektClient = mockk<InntektKlient>(relaxed = true)

val pdlKlient = mockk<PdlClient>()

@BeforeEach
fun beforeEachEndToEnd() {
imTestRapid.reset()
clearAllMocks()

coEvery { pdlKlient.personBolk(any()) } returns
listOf(
bjarneBetjent,
maxMekker,
)
coEvery { brregClient.hentVirksomhetNavn(any()) } returns "Bedrift A/S"
coEvery { pdlKlient.personBolk(any()) } returns listOf(bjarneBetjent, maxMekker)

coEvery { brregClient.hentVirksomheter(any()) } answers {
firstArg<List<String>>().map { orgnr ->
Virksomhet(
Expand All @@ -223,10 +219,8 @@ abstract class EndToEndTest : ContainerTest() {
)
}
}
coEvery { arbeidsgiverNotifikasjonKlient.opprettNyOppgave(any(), any(), any(), any(), any(), any(), any(), any(), any(), any()) } returns "123456"
coEvery { arbeidsgiverNotifikasjonKlient.opprettNySak(any(), any(), any(), any(), any(), any(), any(), any()) } returns "654321"

mockPriProducer.apply {
priProducer.apply {
// Må bare returnere en Result med gyldig JSON
val emptyResult = Result.success(JsonObject(emptyMap()))
every { send(any<JsonElement>()) } returns emptyResult
Expand Down Expand Up @@ -262,16 +256,16 @@ abstract class EndToEndTest : ContainerTest() {
createForespoerselMottattRiver()
createForespoerselForkastetRiver()
createForespoerselKastetTilInfotrygdRiver()
createHelsebroRivers(mockPriProducer)
createHelsebroRivers(priProducer)
createHentEksternImRiver(spinnKlient)
createHentInntektRiver(inntektClient)
createJournalfoerImRiver(dokarkivClient)
createMarkerForespoerselBesvart(mockPriProducer)
createMarkerForespoerselBesvart(priProducer)
createNotifikasjonRivers(
NOTIFIKASJON_LINK,
paaminnelseToggle,
selvbestemtRepo,
arbeidsgiverNotifikasjonKlient,
agNotifikasjonKlient,
)
createPdlRiver(pdlKlient)
createFeilLytter(bakgrunnsjobbRepository)
Expand Down Expand Up @@ -322,7 +316,7 @@ abstract class EndToEndTest : ContainerTest() {
var boomerang: JsonElement? = null

every {
mockPriProducer.send(
priProducer.send(
*varargAll { (key, value) ->
if (key == Pri.Key.BOOMERANG) {
boomerang = value
Expand Down Expand Up @@ -355,7 +349,7 @@ abstract class EndToEndTest : ContainerTest() {
var boomerang: JsonElement? = null

every {
mockPriProducer.send(
priProducer.send(
*varargAll { (key, value) ->
if (key == Pri.Key.BOOMERANG) {
boomerang = value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon
import kotlinx.coroutines.runBlocking
import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.ArbeidsgiverNotifikasjonKlient
import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.Paaminnelse
import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.SakEllerOppgaveDuplikatException
import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.SakEllerOppgaveFinnesIkkeException
import no.nav.helsearbeidsgiver.arbeidsgivernotifkasjon.graphql.generated.enums.SaksStatus
import no.nav.helsearbeidsgiver.felles.domene.Person
import no.nav.helsearbeidsgiver.felles.metrics.Metrics
import no.nav.helsearbeidsgiver.utils.log.logger
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger
import no.nav.helsearbeidsgiver.utils.wrapper.Fnr
import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr
import java.util.UUID
Expand All @@ -16,6 +18,7 @@ import kotlin.time.Duration.Companion.days
val sakLevetid = 390.days

private val logger = "arbeidsgiver-notifikasjon-klient-utils".logger()
private val sikkerLogger = sikkerLogger()

object NotifikasjonTekst {
const val MERKELAPP = "Inntektsmelding sykepenger"
Expand Down Expand Up @@ -84,7 +87,7 @@ fun ArbeidsgiverNotifikasjonKlient.opprettSak(
else -> NotifikasjonTekst.STATUS_TEKST_UNDER_BEHANDLING
}

return Metrics.agNotifikasjonRequest.recordTime(::opprettNySak) {
return try {
runBlocking {
opprettNySak(
virksomhetsnummer = orgnr.verdi,
Expand All @@ -94,17 +97,23 @@ fun ArbeidsgiverNotifikasjonKlient.opprettSak(
tittel = NotifikasjonTekst.sakTittel(sykmeldt),
statusTekst = statusTekst,
initiellStatus = initiellStatus,
harddeleteOm = sakLevetid,
hardDeleteOm = sakLevetid,
)
}
} catch (e: SakEllerOppgaveDuplikatException) {
"Fant duplikat (lik ID, ulikt innhold) under opprettelse av sak.".also {
logger.error(it)
sikkerLogger.error(it, e)
}
e.eksisterendeId
}
}

fun ArbeidsgiverNotifikasjonKlient.ferdigstillSak(
forespoerselId: UUID,
nyLenke: String,
): Result<Unit> =
Metrics.agNotifikasjonRequest.recordTime(::nyStatusSakByGrupperingsid) {
forespoerselId: UUID,
) {
runBlocking {
runCatching {
nyStatusSakByGrupperingsid(
grupperingsid = forespoerselId.toString(),
Expand All @@ -121,14 +130,17 @@ fun ArbeidsgiverNotifikasjonKlient.ferdigstillSak(
statusTekst = NotifikasjonTekst.STATUS_TEKST_FERDIG,
nyLenke = nyLenke,
)
}.onFailure { error ->
loggWarnIkkeFunnetEllerThrow("Fant ikke sak under ferdigstilling.", error)
}
}
}

fun ArbeidsgiverNotifikasjonKlient.avbrytSak(
forespoerselId: UUID,
nyLenke: String,
): Result<Unit> =
Metrics.agNotifikasjonRequest.recordTime(::nyStatusSakByGrupperingsid) {
forespoerselId: UUID,
) {
runBlocking {
runCatching {
nyStatusSakByGrupperingsid(
grupperingsid = forespoerselId.toString(),
Expand All @@ -145,8 +157,11 @@ fun ArbeidsgiverNotifikasjonKlient.avbrytSak(
statusTekst = NotifikasjonTekst.STATUS_TEKST_AVBRUTT,
nyLenke = nyLenke,
)
}.onFailure { error ->
loggWarnIkkeFunnetEllerThrow("Fant ikke sak under avbryting.", error)
}
}
}

fun ArbeidsgiverNotifikasjonKlient.opprettOppgave(
lenke: String,
Expand All @@ -157,29 +172,83 @@ fun ArbeidsgiverNotifikasjonKlient.opprettOppgave(
paaminnelseAktivert: Boolean,
tidMellomOppgaveopprettelseOgPaaminnelse: String,
): String =
try {
runBlocking {
opprettNyOppgave(
virksomhetsnummer = orgnr.verdi,
eksternId = forespoerselId.toString(),
grupperingsid = forespoerselId.toString(),
merkelapp = NotifikasjonTekst.MERKELAPP,
lenke = lenke,
tekst = NotifikasjonTekst.OPPGAVE_TEKST,
varslingTittel = NotifikasjonTekst.STATUS_TEKST_UNDER_BEHANDLING,
varslingInnhold = NotifikasjonTekst.oppgaveInnhold(orgnr, orgNavn),
tidspunkt = null,
paaminnelse =
if (skalHaPaaminnelse && paaminnelseAktivert) {
Paaminnelse(
tittel = "Påminnelse: ${NotifikasjonTekst.STATUS_TEKST_UNDER_BEHANDLING}",
innhold = NotifikasjonTekst.paaminnelseInnhold(orgnr, orgNavn),
tidMellomOppgaveopprettelseOgPaaminnelse = tidMellomOppgaveopprettelseOgPaaminnelse,
).also { logger.info("Satte påminnelse for forespørsel $forespoerselId") }
} else {
null
},
)
}
} catch (e: SakEllerOppgaveDuplikatException) {
"Fant duplikat (lik ID, ulikt innhold) under opprettelse av oppgave.".also {
logger.error(it)
sikkerLogger.error(it, e)
}
e.eksisterendeId
}

fun ArbeidsgiverNotifikasjonKlient.ferdigstillOppgave(
lenke: String,
forespoerselId: UUID,
) {
runBlocking {
runCatching {
oppgaveUtfoertByEksternIdV2(
eksternId = forespoerselId.toString(),
merkelapp = NotifikasjonTekst.MERKELAPP,
nyLenke = lenke,
)
}.recoverCatching {
oppgaveUtfoertByEksternIdV2(
eksternId = forespoerselId.toString(),
merkelapp = NotifikasjonTekst.MERKELAPP_GAMMEL,
nyLenke = lenke,
)
}.onFailure { error ->
loggWarnIkkeFunnetEllerThrow("Fant ikke oppgave under ferdigstilling.", error)
}
}
}

fun ArbeidsgiverNotifikasjonKlient.settOppgaveUtgaatt(
lenke: String,
forespoerselId: UUID,
) {
runBlocking {
opprettNyOppgave(
virksomhetsnummer = orgnr.verdi,
eksternId = forespoerselId.toString(),
grupperingsid = forespoerselId.toString(),
merkelapp = NotifikasjonTekst.MERKELAPP,
lenke = lenke,
tekst = NotifikasjonTekst.OPPGAVE_TEKST,
varslingTittel = NotifikasjonTekst.STATUS_TEKST_UNDER_BEHANDLING,
varslingInnhold = NotifikasjonTekst.oppgaveInnhold(orgnr, orgNavn),
tidspunkt = null,
paaminnelse =
if (skalHaPaaminnelse && paaminnelseAktivert) {
Paaminnelse(
tittel = "Påminnelse: ${NotifikasjonTekst.STATUS_TEKST_UNDER_BEHANDLING}",
innhold = NotifikasjonTekst.paaminnelseInnhold(orgnr, orgNavn),
tidMellomOppgaveopprettelseOgPaaminnelse = tidMellomOppgaveopprettelseOgPaaminnelse,
).also { logger.info("Satte påminnelse for forespørsel $forespoerselId") }
} else {
null
},
)
runCatching {
oppgaveUtgaattByEksternId(
eksternId = forespoerselId.toString(),
merkelapp = NotifikasjonTekst.MERKELAPP,
nyLenke = lenke,
)
}.recoverCatching {
oppgaveUtgaattByEksternId(
eksternId = forespoerselId.toString(),
merkelapp = NotifikasjonTekst.MERKELAPP_GAMMEL,
nyLenke = lenke,
)
}.onFailure { error ->
loggWarnIkkeFunnetEllerThrow("Fant ikke oppgave under endring til utgått.", error)
}
}
}

// Støtter d-nummer
private fun Fnr.lesFoedselsdato(): String {
Expand All @@ -190,3 +259,15 @@ private fun Fnr.lesFoedselsdato(): String {
(foersteSiffer - 4).toString() + verdi.substring(1, 6)
}
}

private fun loggWarnIkkeFunnetEllerThrow(
melding: String,
error: Throwable,
) {
if (error is SakEllerOppgaveFinnesIkkeException) {
logger.warn(melding)
sikkerLogger.warn(melding, error)
} else {
throw error
}
}
Loading

0 comments on commit 75978a5

Please sign in to comment.