From c0897245844bd52e016e24584f7e8a16b3111578 Mon Sep 17 00:00:00 2001 From: John Andre Hestad Date: Wed, 7 Feb 2024 15:50:51 +0100 Subject: [PATCH] Fjern CXF fra TilbakekrevingsClient --- .../se/bakover/client/ProdClientsBuilder.kt | 9 +- .../simulering/SimuleringSoapClient.kt | 3 +- .../soap/SoapEnvelopeBuilder.kt | 4 +- .../kotlin/application/HttpServerTestSetup.kt | 2 + .../client/TilbakekrevingClients.kt | 10 +- .../client/TilbakekrevingSoapBodyBuilder.kt | 80 ++++++++ .../client/TilbakekrevingSoapClient.kt | 138 ++++++++------ .../client/TilbakekrevingSoapClientMapper.kt | 56 ------ .../client/TilbakekrevingSoapRequestMapper.kt | 178 ------------------ .../infrastructure/client/dto/AksjonsKode.kt | 5 + .../client/dto/Alvorlighetsgrad.kt | 21 +++ .../infrastructure/client/dto/Skyld.kt | 2 +- .../client/dto/TilbakekrevingSoapResponse.kt | 132 +++++++++++++ .../client/dto/TilbakekrevingsHjemmel.kt | 13 ++ .../client/dto/Tilbakekrevingsresultat.kt | 6 + .../Tilbakekrevingskomponenter.kt | 5 +- .../web/komponenttest/Komponenttest.kt | 2 + .../no/nav/su/se/bakover/web/StartServer.kt | 9 + 18 files changed, 371 insertions(+), 304 deletions(-) rename client/src/main/kotlin/no/nav/su/se/bakover/client/oppdrag/simulering/SimuleringSoapBuilder.kt => common/infrastructure/src/main/kotlin/no/nav/su/se/bakover/common/infrastructure/soap/SoapEnvelopeBuilder.kt (93%) create mode 100644 tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapBodyBuilder.kt delete mode 100644 tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClientMapper.kt delete mode 100644 tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapRequestMapper.kt create mode 100644 tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/AksjonsKode.kt create mode 100644 tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Alvorlighetsgrad.kt create mode 100644 tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/TilbakekrevingSoapResponse.kt create mode 100644 tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/TilbakekrevingsHjemmel.kt create mode 100644 tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Tilbakekrevingsresultat.kt diff --git a/client/src/main/kotlin/no/nav/su/se/bakover/client/ProdClientsBuilder.kt b/client/src/main/kotlin/no/nav/su/se/bakover/client/ProdClientsBuilder.kt index 8a033b2256..a9837c4abd 100644 --- a/client/src/main/kotlin/no/nav/su/se/bakover/client/ProdClientsBuilder.kt +++ b/client/src/main/kotlin/no/nav/su/se/bakover/client/ProdClientsBuilder.kt @@ -23,8 +23,8 @@ import no.nav.su.se.bakover.client.person.PersonClient import no.nav.su.se.bakover.client.person.PersonClientConfig import no.nav.su.se.bakover.client.skjerming.SkjermingClient import no.nav.su.se.bakover.client.sts.StsClient -import no.nav.su.se.bakover.client.sts.StsSamlClient import no.nav.su.se.bakover.common.SU_SE_BAKOVER_CONSUMER_ID +import no.nav.su.se.bakover.common.domain.auth.SamlTokenProvider import no.nav.su.se.bakover.common.infrastructure.config.ApplicationConfig import no.nav.su.se.bakover.common.infrastructure.jms.JmsConfig import no.nav.su.se.bakover.dokument.infrastructure.client.PdfClient @@ -39,6 +39,7 @@ data class ProdClientsBuilder( private val jmsConfig: JmsConfig, private val clock: Clock, private val metrics: ClientMetrics, + private val samlTokenProvider: SamlTokenProvider, ) : ClientsBuilder { override fun build(applicationConfig: ApplicationConfig): Clients { @@ -118,11 +119,7 @@ data class ProdClientsBuilder( kodeverk = kodeverk, simuleringClient = SimuleringSoapClient( baseUrl = applicationConfig.oppdrag.simulering.url, - samlTokenProvider = StsSamlClient( - baseUrl = applicationConfig.clientsConfig.stsSamlUrl, - serviceUser = serviceUser, - clock = clock, - ), + samlTokenProvider = samlTokenProvider, clock = clock, ), utbetalingPublisher = UtbetalingMqPublisher( diff --git a/client/src/main/kotlin/no/nav/su/se/bakover/client/oppdrag/simulering/SimuleringSoapClient.kt b/client/src/main/kotlin/no/nav/su/se/bakover/client/oppdrag/simulering/SimuleringSoapClient.kt index 0514f01620..5c5631bf28 100644 --- a/client/src/main/kotlin/no/nav/su/se/bakover/client/oppdrag/simulering/SimuleringSoapClient.kt +++ b/client/src/main/kotlin/no/nav/su/se/bakover/client/oppdrag/simulering/SimuleringSoapClient.kt @@ -7,6 +7,7 @@ import arrow.core.flatMap import arrow.core.getOrElse import arrow.core.left import no.nav.su.se.bakover.common.domain.auth.SamlTokenProvider +import no.nav.su.se.bakover.common.infrastructure.soap.buildSoapEnvelope import no.nav.su.se.bakover.common.sikkerLogg import org.slf4j.LoggerFactory import økonomi.domain.simulering.Simulering @@ -52,7 +53,7 @@ internal class SimuleringSoapClient( sikkerLogg.error("Feil ved simulering: Kunne ikke hente SAML-token for saksnummer: $saksnummer. soapBody: $soapBody") return SimuleringFeilet.TekniskFeil.left() }.toString() - val soapRequest = buildXmlRequestSoapEnvelope( + val soapRequest = buildSoapEnvelope( action = ACTION, messageId = UUID.randomUUID().toString(), serviceUrl = baseUrl, diff --git a/client/src/main/kotlin/no/nav/su/se/bakover/client/oppdrag/simulering/SimuleringSoapBuilder.kt b/common/infrastructure/src/main/kotlin/no/nav/su/se/bakover/common/infrastructure/soap/SoapEnvelopeBuilder.kt similarity index 93% rename from client/src/main/kotlin/no/nav/su/se/bakover/client/oppdrag/simulering/SimuleringSoapBuilder.kt rename to common/infrastructure/src/main/kotlin/no/nav/su/se/bakover/common/infrastructure/soap/SoapEnvelopeBuilder.kt index 1eba6a6433..316bce3090 100644 --- a/client/src/main/kotlin/no/nav/su/se/bakover/client/oppdrag/simulering/SimuleringSoapBuilder.kt +++ b/common/infrastructure/src/main/kotlin/no/nav/su/se/bakover/common/infrastructure/soap/SoapEnvelopeBuilder.kt @@ -1,8 +1,8 @@ @file:Suppress("HttpUrlsUsage") -package no.nav.su.se.bakover.client.oppdrag.simulering +package no.nav.su.se.bakover.common.infrastructure.soap -internal fun buildXmlRequestSoapEnvelope( +fun buildSoapEnvelope( action: String, messageId: String, serviceUrl: String, diff --git a/test-common/src/main/kotlin/application/HttpServerTestSetup.kt b/test-common/src/main/kotlin/application/HttpServerTestSetup.kt index 8064de5066..feee27c8a0 100644 --- a/test-common/src/main/kotlin/application/HttpServerTestSetup.kt +++ b/test-common/src/main/kotlin/application/HttpServerTestSetup.kt @@ -32,6 +32,7 @@ import no.nav.su.se.bakover.hendelse.domain.HendelsekonsumenterRepo import no.nav.su.se.bakover.oppgave.domain.OppgaveHendelseRepo import no.nav.su.se.bakover.service.tilbakekreving.TilbakekrevingUnderRevurderingService import no.nav.su.se.bakover.test.applicationConfig +import no.nav.su.se.bakover.test.auth.FakeSamlTokenProvider import no.nav.su.se.bakover.test.fixedClock import no.nav.su.se.bakover.test.jwt.asBearerToken import no.nav.su.se.bakover.test.jwt.jwtStub @@ -98,6 +99,7 @@ fun Application.runApplicationWithMocks( brevService = brevService, tilbakekrevingConfig = tilbakekrevingConfig, dbMetrics = dbMetrics, + samlTokenProvider = FakeSamlTokenProvider(), ) }, dokumentkomponenter: Dokumentkomponenter = mock(), diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingClients.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingClients.kt index 8d6c51b6ca..fe1f5c33f7 100644 --- a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingClients.kt +++ b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingClients.kt @@ -1,6 +1,6 @@ package tilbakekreving.infrastructure.client -import no.nav.su.se.bakover.common.domain.config.TilbakekrevingConfig +import no.nav.su.se.bakover.common.domain.auth.SamlTokenProvider import tilbakekreving.domain.vedtak.Tilbakekrevingsklient import java.time.Clock @@ -9,14 +9,14 @@ class TilbakekrevingClients( ) { companion object { fun create( - tilbakekrevingConfig: TilbakekrevingConfig, + baseUrl: String, + samlTokenProvider: SamlTokenProvider, clock: Clock, ): TilbakekrevingClients { return TilbakekrevingClients( tilbakekrevingsklient = TilbakekrevingSoapClient( - tilbakekrevingPortType = TilbakekrevingSoapClientConfig( - tilbakekrevingConfig = tilbakekrevingConfig, - ).tilbakekrevingSoapService(), + baseUrl = baseUrl, + samlTokenProvider = samlTokenProvider, clock = clock, ), ) diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapBodyBuilder.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapBodyBuilder.kt new file mode 100644 index 0000000000..78217f9a40 --- /dev/null +++ b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapBodyBuilder.kt @@ -0,0 +1,80 @@ +@file:Suppress("HttpUrlsUsage") + +package tilbakekreving.infrastructure.client + +import no.nav.su.se.bakover.common.ident.NavIdentBruker +import tilbakekreving.domain.vurdering.PeriodevurderingMedKrav +import tilbakekreving.domain.vurdering.VurderingerMedKrav +import tilbakekreving.infrastructure.client.dto.AksjonsKode +import tilbakekreving.infrastructure.client.dto.Skyld +import tilbakekreving.infrastructure.client.dto.TilbakekrevingsHjemmel +import tilbakekreving.infrastructure.client.dto.Tilbakekrevingsresultat +import tilbakekreving.infrastructure.client.dto.TilbakekrevingsÅrsak +import kotlin.math.max + +/** + * Se: https://confluence.adeo.no/display/OKSY/Detaljer+om+de+enkelte+ID-koder + * Se: https://github.com/navikt/tjenestespesifikasjoner/blob/master/tilbakekreving-v1-tjenestespesifikasjon/src/main/wsdl/no/nav/tilbakekreving/tilbakekreving-v1-tjenestespesifikasjon.wsdl + */ +internal fun buildTilbakekrevingSoapRequest( + vurderingerMedKrav: VurderingerMedKrav, + attestertAv: NavIdentBruker.Attestant, +): String { + // TODO jah: Vurder om vi skal legge til datoVedtakFagsystem istedenfor å få dagens dato. + return """ + + + ${AksjonsKode.FATT_VEDTAK.nummer} + ${vurderingerMedKrav.eksternVedtakId} + ${TilbakekrevingsHjemmel.T} + N + 8020 + ${vurderingerMedKrav.eksternKontrollfelt} + $attestertAv + ${ + vurderingerMedKrav.perioder.joinToString(separator = "\n") { periode -> + """ + + + ${periode.periode.fraOgMed} + ${periode.periode.tilOgMed} + + N + 0 + + SUUFORE + ${periode.bruttoTidligereUtbetalt} + ${periode.bruttoNyUtbetaling} + ${periode.bruttoSkalTilbakekreve}} + ${periode.bruttoSkalIkkeTilbakekreve} + ${periode.skattSomGårTilReduksjon} + ${ + when (periode) { + is PeriodevurderingMedKrav.SkalIkkeTilbakekreve -> Tilbakekrevingsresultat.INGEN_TILBAKEKREV.toString() + is PeriodevurderingMedKrav.SkalTilbakekreve -> Tilbakekrevingsresultat.FULL_TILBAKEKREV.toString() + } + } + ${TilbakekrevingsÅrsak.ANNET} + ${ + when (periode) { + is PeriodevurderingMedKrav.SkalIkkeTilbakekreve -> Skyld.IKKE_FORDELT.toString() + is PeriodevurderingMedKrav.SkalTilbakekreve -> Skyld.BRUKER.toString() + } + } + + + KL_KODE_FEIL_INNT + 0 + ${max(periode.bruttoSkalTilbakekreve, periode.bruttoSkalIkkeTilbakekreve)} + 0 + 0 + + """ + } + } + + + """.trimIndent() +} diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClient.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClient.kt index 0517870e73..377a8a240c 100644 --- a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClient.kt +++ b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClient.kt @@ -1,3 +1,5 @@ +@file:Suppress("HttpUrlsUsage") + package tilbakekreving.infrastructure.client import arrow.core.Either @@ -5,10 +7,10 @@ import arrow.core.flatten import arrow.core.getOrElse import arrow.core.left import arrow.core.right -import no.nav.okonomi.tilbakekrevingservice.TilbakekrevingPortType -import no.nav.okonomi.tilbakekrevingservice.TilbakekrevingsvedtakResponse import no.nav.su.se.bakover.common.domain.Saksnummer +import no.nav.su.se.bakover.common.domain.auth.SamlTokenProvider import no.nav.su.se.bakover.common.ident.NavIdentBruker +import no.nav.su.se.bakover.common.infrastructure.soap.buildSoapEnvelope import no.nav.su.se.bakover.common.sikkerLogg import no.nav.su.se.bakover.common.tid.Tidspunkt import org.slf4j.LoggerFactory @@ -16,15 +18,32 @@ import tilbakekreving.domain.kravgrunnlag.rått.RåTilbakekrevingsvedtakForsende import tilbakekreving.domain.vedtak.KunneIkkeSendeTilbakekrevingsvedtak import tilbakekreving.domain.vedtak.Tilbakekrevingsklient import tilbakekreving.domain.vurdering.VurderingerMedKrav +import tilbakekreving.infrastructure.client.dto.Alvorlighetsgrad +import tilbakekreving.infrastructure.client.dto.deserializeTilbakekrevingsvedtakResponse +import java.net.URI +import java.net.http.HttpClient +import java.net.http.HttpRequest +import java.net.http.HttpResponse import java.time.Clock +import java.time.Duration +import java.util.UUID + +private const val ACTION = + "http://okonomi.nav.no/tilbakekrevingService/TilbakekrevingPortType/tilbakekrevingsvedtakRequest" class TilbakekrevingSoapClient( - private val tilbakekrevingPortType: TilbakekrevingPortType, + private val baseUrl: String, + private val samlTokenProvider: SamlTokenProvider, private val clock: Clock, ) : Tilbakekrevingsklient { private val log = LoggerFactory.getLogger(this::class.java) + private val client: HttpClient = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(5)) + .followRedirects(HttpClient.Redirect.NEVER) + .build() + /** * Sender informasjon til oppdrag hvordan vi vil avgjøre om vi vil kreve tilbake eller ikke. * @@ -36,27 +55,48 @@ class TilbakekrevingSoapClient( ): Either { val saksnummer = vurderingerMedKrav.saksnummer return Either.catch { - val request = mapToTilbakekrevingsvedtakRequest( + val soapBody = buildTilbakekrevingSoapRequest( vurderingerMedKrav = vurderingerMedKrav, attestertAv = attestertAv, ) - val response = tilbakekrevingPortType.tilbakekrevingsvedtak(request) + val assertion = getSamlToken(saksnummer, soapBody).getOrElse { return it.left() } + val soapRequest = buildSoapEnvelope( + action = ACTION, + messageId = UUID.randomUUID().toString(), + serviceUrl = baseUrl, + assertion = assertion, + body = soapBody, + ) + val httpRequest = HttpRequest.newBuilder(URI(baseUrl)) + .header("SOAPAction", ACTION) + .POST(HttpRequest.BodyPublishers.ofString(soapRequest)) + .build() + val (soapResponse: String?, status: Int) = client.send(httpRequest, HttpResponse.BodyHandlers.ofString()) + .let { + it.body() to it.statusCode() + } + if (status != 200) { + log.error( + "Feil ved sending av tilbakekrevingsvedtak: Forventet statusCode 200 for saksnummer: $saksnummer, statusCode: $status. Se sikkerlogg for request.", + RuntimeException("Trigger stacktrace"), + ) + sikkerLogg.error("Feil ved sending av tilbakekrevingsvedtak: Forventet statusCode 200 for saksnummer: $saksnummer, statusCode: $status, Response: $soapResponse Request: $soapRequest") + return KunneIkkeSendeTilbakekrevingsvedtak.left() + } - val requestXmlString = TilbakekrevingSoapClientMapper.toXml(request) - val responseXmlString = mapErrorResponseTilXmlString(response) - kontrollerResponse(response, saksnummer) + kontrollerResponse(soapRequest, soapResponse, saksnummer) .map { log.info( "SOAP kall mot tilbakekrevingskomponenten OK for saksnummer $saksnummer. Se sikkerlogg for detaljer.", ) sikkerLogg.info( - "SOAP kall mot tilbakekrevingskomponenten OK for saksnummer $saksnummer. Request: $requestXmlString. Response: $responseXmlString", + "SOAP kall mot tilbakekrevingskomponenten OK for saksnummer $saksnummer. Response: $soapResponse, Request: $soapRequest. ", ) RåTilbakekrevingsvedtakForsendelse( - requestXml = requestXmlString, + requestXml = soapRequest, tidspunkt = Tidspunkt.now(clock), - responseXml = responseXmlString, + responseXml = soapResponse, ) } }.mapLeft { throwable -> @@ -72,25 +112,49 @@ class TilbakekrevingSoapClient( }.flatten() } + private fun getSamlToken( + saksnummer: Saksnummer, + soapBody: String, + ): Either { + return samlTokenProvider.samlToken().getOrElse { + // SamlTokenProvider logger, men mangler kontekst. + log.error( + "Feil ved sending av tilbakekrevingsvedtak: Kunne ikke hente SAML-token for saksnummer: $saksnummer. Se sikkerlogg for soap body.", + RuntimeException("Trigger stacktrace"), + ) + sikkerLogg.error("Feil ved sending av tilbakekrevingsvedtak: Kunne ikke hente SAML-token for saksnummer: $saksnummer. soapBody: $soapBody") + return KunneIkkeSendeTilbakekrevingsvedtak.left() + }.toString().right() + } + private fun kontrollerResponse( - response: TilbakekrevingsvedtakResponse, + request: String, + response: String, saksnummer: Saksnummer, ): Either { - return response.let { - Alvorlighetsgrad.fromString(it.mmel.alvorlighetsgrad).let { alvorlighetsgrad -> + return response.deserializeTilbakekrevingsvedtakResponse().let { + if (it.mmel.alvorlighetsgrad == null) { + log.error( + "Mottok ikke mmel.alvorlighetsgrad. Antar det var OK. Må følges opp manuelt. Saksnummer $saksnummer. Se sikkerlogg for detaljer.", + RuntimeException("Legger på stacktrace for enklere debug"), + ) + sikkerLogg.error( + "Mottok ikke mmel.alvorlighetsgrad. Antar det var OK. Må følges opp manuelt. Saksnummer $saksnummer. Response $response. Request: $request.", + ) + Unit.right() + } + Alvorlighetsgrad.fromString(it.mmel.alvorlighetsgrad!!).let { alvorlighetsgrad -> when (alvorlighetsgrad) { Alvorlighetsgrad.OK -> Unit.right() Alvorlighetsgrad.OK_MED_VARSEL, -> { log.error( - "Fikk et varsel fra tilbakekrevingskomponenten når vi vedtok en tilbakekreving. For saksnummer $saksnummer. Se sikkerlogg for detaljer.", + "Fikk et varsel fra tilbakekrevingskomponenten når vi vedtok en tilbakekreving. Saksnummer $saksnummer. Se sikkerlogg for detaljer.", RuntimeException("Legger på stacktrace for enklere debug"), ) sikkerLogg.error( - "Fikk et varsel fra tilbakekrevingskomponenten når vi vedtok en tilbakekreving. Den er fremdeles sendt OK. For saksnummer $saksnummer. Response ${ - mapErrorResponseTilXmlString(response) - }", + "Fikk et varsel fra tilbakekrevingskomponenten når vi vedtok en tilbakekreving. Den er fremdeles sendt OK. Saksnummer $saksnummer. Response $response. Request: $request. ", ) Unit.right() } @@ -99,15 +163,11 @@ class TilbakekrevingSoapClient( Alvorlighetsgrad.SQL_FEIL, -> { log.error( - "Fikk $alvorlighetsgrad fra tilbakekrevingskomponenten når vi vedtok en tilbakekreving. For saksnummer $saksnummer. Se sikkerlogg for detaljer.", + "Fikk $alvorlighetsgrad fra tilbakekrevingskomponenten når vi vedtok en tilbakekreving. Saksnummer $saksnummer. Se sikkerlogg for detaljer.", RuntimeException("Legger på stacktrace for enklere debug"), ) sikkerLogg.error( - "Fikk et varsel fra tilbakekrevingskomponenten når vi vedtok en tilbakekreving. For saksnummer $saksnummer. Response ${ - mapErrorResponseTilXmlString( - response, - ) - }", + "Fikk et varsel fra tilbakekrevingskomponenten når vi vedtok en tilbakekreving. Saksnummer $saksnummer. Response $response. Request: $request.", ) KunneIkkeSendeTilbakekrevingsvedtak.left() } @@ -115,34 +175,4 @@ class TilbakekrevingSoapClient( } } } - - private fun mapErrorResponseTilXmlString(response: TilbakekrevingsvedtakResponse): String { - return Either.catch { - TilbakekrevingSoapClientMapper.toXml( - response, - ) - }.getOrElse { - "Kunne ikke serialisere response til xml. Feilmelding: ${it.message}" - } - } - - enum class Alvorlighetsgrad(val value: String) { - OK("00"), - - /** En varselmelding følger med */ - OK_MED_VARSEL("04"), - - /** Alvorlig feil som logges og stopper behandling av aktuelt tilfelle*/ - ALVORLIG_FEIL("08"), - SQL_FEIL("12"), - ; - - override fun toString() = value - - companion object { - fun fromString(string: String): Alvorlighetsgrad { - return entries.first { it.value == string } - } - } - } } diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClientMapper.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClientMapper.kt deleted file mode 100644 index 649b147db3..0000000000 --- a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClientMapper.kt +++ /dev/null @@ -1,56 +0,0 @@ -package tilbakekreving.infrastructure.client - -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.databind.DeserializationFeature -import com.fasterxml.jackson.databind.JsonSerializer -import com.fasterxml.jackson.databind.SerializationFeature -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.module.SimpleModule -import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule -import com.fasterxml.jackson.dataformat.xml.XmlMapper -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule -import com.fasterxml.jackson.module.kotlin.KotlinModule -import com.fasterxml.jackson.module.kotlin.readValue -import no.nav.okonomi.tilbakekrevingservice.TilbakekrevingsvedtakRequest -import no.nav.okonomi.tilbakekrevingservice.TilbakekrevingsvedtakResponse -import javax.xml.datatype.XMLGregorianCalendar - -/** - * Er kun ment brukt for tester/stubs/lokale jobber/serialisere request/response til databasen. - */ -internal data object TilbakekrevingSoapClientMapper { - - private val xmlMapper = XmlMapper(JacksonXmlModule().apply { setDefaultUseWrapper(false) }).apply { - registerModule(KotlinModule.Builder().build()) - registerModule(JavaTimeModule()) - .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .registerModule(CustomXMLGregorianCalendarModule()) - disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) - } - - fun toXml(request: TilbakekrevingsvedtakRequest): String { - return xmlMapper.writeValueAsString(request) - } - - fun toXml(response: TilbakekrevingsvedtakResponse): String { - return xmlMapper.writeValueAsString(response) - } - - fun fromXml(xml: String): TilbakekrevingsvedtakResponse { - return xmlMapper.readValue(xml) - } -} - -private class CustomXMLGregorianCalendarSerializer : JsonSerializer() { - override fun serialize(value: XMLGregorianCalendar?, gen: JsonGenerator, serializers: SerializerProvider) { - if (value != null) { - gen.writeString(value.toGregorianCalendar().toZonedDateTime().toLocalDate().toString()) - } - } -} - -private class CustomXMLGregorianCalendarModule : SimpleModule() { - init { - addSerializer(XMLGregorianCalendar::class.java, CustomXMLGregorianCalendarSerializer()) - } -} diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapRequestMapper.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapRequestMapper.kt deleted file mode 100644 index c2dfd52221..0000000000 --- a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapRequestMapper.kt +++ /dev/null @@ -1,178 +0,0 @@ -package tilbakekreving.infrastructure.client - -import arrow.core.Nel -import no.nav.okonomi.tilbakekrevingservice.TilbakekrevingsvedtakRequest -import no.nav.su.se.bakover.common.ident.NavIdentBruker -import no.nav.tilbakekreving.tilbakekrevingsvedtak.vedtak.v1.TilbakekrevingsbelopDto -import no.nav.tilbakekreving.tilbakekrevingsvedtak.vedtak.v1.TilbakekrevingsperiodeDto -import no.nav.tilbakekreving.tilbakekrevingsvedtak.vedtak.v1.TilbakekrevingsvedtakDto -import no.nav.tilbakekreving.typer.v1.PeriodeDto -import tilbakekreving.domain.vurdering.PeriodevurderingMedKrav -import tilbakekreving.domain.vurdering.VurderingerMedKrav -import java.math.BigDecimal -import java.math.BigInteger -import javax.xml.datatype.DatatypeFactory -import kotlin.math.max - -internal enum class AksjonsKode(val nummer: String) { - FATT_VEDTAK("8"), -} - -/** - * Dersom man bruker hjemmel 'ANNET' sender tilbakekrevingskomponenten posisjon 118 som blank til NAVI/Predator og den vil bli behandlet som foreldet. - * Dersom man bruker hjemmel 'SUL_13' vil tilbakekrevingskomponenten sende T på posisjon 118 istedet og vi vil få forventet oppførsel. - * Vi har også bestilt SUL_13-1, SUL_13-2, SUL_13-3 og SUL_13-4 som vi ikke har tatt i bruk enda. - */ -internal enum class TilbakekrevingsHjemmel(val value: String) { - T("SUL_13"), - ; - - override fun toString() = value -} - -internal enum class Tilbakekrevingsresultat { - FULL_TILBAKEKREV, - INGEN_TILBAKEKREV, -} - -internal enum class TilbakekrevingsÅrsak { - ANNET, -} - -enum class Skyld { - BRUKER, - IKKE_FORDELT, -} - -// Se: https://confluence.adeo.no/display/OKSY/Detaljer+om+de+enkelte+ID-koder -// Kan låne litt herfra: https://github.com/navikt/permittering-refusjon-tilbakekreving/blob/4fdaddaf255d5753ac00fee56c5a9918065fdc8f/src/main/kotlin/no/nav/permittering/refusjon/tilbakekreving/behandling/vedtak/TilbakekrevingVedtakHurtigspor.kt -fun mapToTilbakekrevingsvedtakRequest( - vurderingerMedKrav: VurderingerMedKrav, - attestertAv: NavIdentBruker.Attestant, -): TilbakekrevingsvedtakRequest { - return TilbakekrevingsvedtakRequest().apply { - this.tilbakekrevingsvedtak = TilbakekrevingsvedtakDto().apply { - // 1 - 441 - Kode-aksjon - X(01) - Krav - Aksjonskode: - // 7 - midlertidig lagring - // 8 - fatte vedtak - // Aksjonskode 7 vil ikke kunne benyttes i fase 1. - this.kodeAksjon = AksjonsKode.FATT_VEDTAK.nummer - - // 2 - 441 - Vedtak-id - 9(10) - Krav - Identifikasjon av tilbakekrevingsvedtaket - this.vedtakId = BigInteger(vurderingerMedKrav.eksternVedtakId) - - // 3 - 441 - Dato-vedtak-fagsystem - X(08) - Valgfritt - Vedtaksdato på fagsystems vedtak. Omfeltet ikke er utfylt, legger TIlbakekrevingskomponenten inn dagens dato - this.datoVedtakFagsystem = null - - // 4 - 441 - Kode-hjemmel - X(20) - Krav - Lovhjemmel om tilbakekrevingsvedtaket - // TODO jah (alder): Denne bør mappes fra domenet. Gjenbruk de SU Alder bruker i dag. - this.kodeHjemmel = TilbakekrevingsHjemmel.T.toString() - - // 5 - 441 - Renter-beregnes - X(01) - Betinget krav - 'J' Dersom det skal beregnes renter på kravet - this.renterBeregnes = "N" - - // 6 - 441 - Enhet-ansvarlig - X(13) - Krav - Ansvarlig enhet - this.enhetAnsvarlig = "8020" - - // 7 - 441 - Kontrollfelt - X(26) - Krav - Brukes ved innsending av tilbakekrevingsvedtak for å kontrollere at kravgrunnlaget ikke er blitt endret i mellomtiden - this.kontrollfelt = vurderingerMedKrav.eksternKontrollfelt - - // 8 - 441 - Saksbeh-id - X(08) - Krav - Saksbehandler - this.saksbehId = attestertAv.toString() - - // Liste over 442 - Tilbakekrevingsperiode - this.tilbakekrevingsperiode.addAll(mapTilbakekrevingsperioder(vurderingerMedKrav.perioder)) - } - } -} - -val datatypeFactory: DatatypeFactory = DatatypeFactory.newInstance() - -private fun mapTilbakekrevingsperioder( - perioder: Nel, -): List { - return perioder.map { - TilbakekrevingsperiodeDto().apply { - periode = PeriodeDto().apply { - // Disse mappes om til en xsd:date. Vi bruker verdiene som kommer fra kravgrunnlaget og skal ikke trenge ta høyde for tidssone når vi serialiserer datoen, så lenge vi ikke tar høyde for tidsone når vi deserialiserer datoen. - // TODO: jah test edge-caser med en utc vs cet-klokke - // 1 - Dato-periode-fom - 442 - X(08) - Krav - Tilbakekrevingsperioder delt opp slik at ingen spenner over månedsskifter - fom = datatypeFactory.newXMLGregorianCalendar(it.periode.fraOgMed.toString()) - - // 2 - Dato-periode-tom - 442 - X(08) - Krav - Tilbakekrevingsperioder delt opp slik at ingen spenner over månedsskifter - tom = datatypeFactory.newXMLGregorianCalendar(it.periode.tilOgMed.toString()) - } - // 3 - 442 - Renter-beregnes - X(01) - Valgfritt - 'J' dersom det skal beregnes retner på kravet (nytt felt) - renterBeregnes = "N" - - // 4 - 442 - Belop-renter - Evt. beregnede renter i fagrutinen (nytt felt) - belopRenter = BigDecimal.ZERO - - // Liste over 443 - Tilbakekrevingsbeløp - tilbakekrevingsbelop.addAll( - listOf( - mapYtelse(it), - // TODO jah: Er det behov for å sende denne delen? - mapFeilutbetaling(it), - ), - ) - } - } -} - -private fun mapYtelse( - periode: PeriodevurderingMedKrav, -): TilbakekrevingsbelopDto { - return TilbakekrevingsbelopDto().apply { - // 1 - 443 - Kode-klasse - X(20) - Krav - Klassifisering av stønad, skatt, trekk etc. Det må minimum sendes med klassekoder for feilutbetaling og de ytelsesklassekoder som er feilutbetalt. - this.kodeKlasse = "SUUFORE" - - // 3 - 443 - Belop-oppr-utbet - 9(8)V99 - Krav - Opprinnelig beregnet beløp, dvs. utbetalingen som førte til feilutbetaling. Dersom saksbehandler deler opp i perioder annerledes enn det som er levert på kravgrunnlaget, må beløp-oppr og beløp-ny beregnes på de nye perioder, med beløp fordelt pr. virkedag. - this.belopOpprUtbet = BigDecimal(periode.bruttoTidligereUtbetalt) - - // 5 - 443 - Belop-ny - 9(8)V99 - Krav - Beløpet som ble beregnet ved korrigeringen, evt. fordelt etter ny periodisering. - this.belopNy = BigDecimal(periode.bruttoNyUtbetaling) - - // 7 - 443 - Belop-tilbakekreves - 9(8)V99 - Krav - Beløp som skal tilbakekreves for angitt periode. Ved ingen tilbakekreving skal beløpet settes til 0. - this.belopTilbakekreves = BigDecimal(periode.bruttoSkalTilbakekreve) - - // 9 - 443 - Belop-uinnkrevd - 9(8)V99 - Valgfritt - Beløp som ikke skal tilbakekreves. Ved full tilbakekreving skal beløpet settes til 0. Om feltet ikke er utfylt vil Tilbakekrevingskomponenten sette inn beløp etter en forholdsmessig fordeling. - this.belopUinnkrevd = BigDecimal(periode.bruttoSkalIkkeTilbakekreve) - - // 11 - 443 - Belop-skatt - 9(8)V99 - Valgfritt - Skattebeløp, som skal redusere beløp til innkreving. - this.belopSkatt = BigDecimal(periode.skattSomGårTilReduksjon) - - this.kodeResultat = when (periode) { - is PeriodevurderingMedKrav.SkalIkkeTilbakekreve -> Tilbakekrevingsresultat.INGEN_TILBAKEKREV.toString() - is PeriodevurderingMedKrav.SkalTilbakekreve -> Tilbakekrevingsresultat.FULL_TILBAKEKREV.toString() - } - this.kodeAarsak = TilbakekrevingsÅrsak.ANNET.toString() - this.kodeSkyld = when (periode) { - is PeriodevurderingMedKrav.SkalIkkeTilbakekreve -> Skyld.IKKE_FORDELT.toString() - is PeriodevurderingMedKrav.SkalTilbakekreve -> Skyld.BRUKER.toString() - } - } -} - -private fun mapFeilutbetaling( - periode: PeriodevurderingMedKrav, -): TilbakekrevingsbelopDto { - return TilbakekrevingsbelopDto().apply { - // 1 - 443 - Kode-klasse - X(20) - Krav - Klassifisering av stønad, skatt, trekk etc. Det må minimum sendes med klassekoder for feilutbetaling og de ytelsesklassekoder som er feilutbetalt. - this.kodeKlasse = "KL_KODE_FEIL_INNT" - - // 3 - 443 - Belop-oppr-utbet - 9(8)V99 - Krav - Egen betydning for KL_KODE_FEIL_INNT. Vil alltid være 0. Vi asserter på dette når vi tolker kravgrunnlaget fra oppdrag. - this.belopOpprUtbet = BigDecimal.ZERO - - // TODO jah: Vi tar ikke med det feilutbetalte beløpet fra kravgrunnlaget, men det vil være det høyeste av disse. Bør vi legge det til? - // 5 - 443 - Belop-ny - 9(8)V99 - Krav - Egen betydning for KL_KODE_FEIL_INNT. Vil være det feilutbetalte beløpet for perioden. Vi asserter på dette når vi tolker kravgrunnlaget fra oppdrag. - this.belopNy = BigDecimal(max(periode.bruttoSkalTilbakekreve, periode.bruttoSkalIkkeTilbakekreve)) - - // 7 - 443 - Belop-tilbakekreves - 9(8)V99 - Krav - Krav - Egen betydning for KL_KODE_FEIL_INNT. Vil alltid være 0. Vi asserter på dette når vi tolker kravgrunnlaget fra oppdrag. - this.belopTilbakekreves = BigDecimal.ZERO - - // TODO jah: Verifiser om dette er valgfritt eller krav? - // 9 - 443 - Belop-uinnkrevd - 9(8)V99 - Valgfritt - Krav - Egen betydning for KL_KODE_FEIL_INNT. Vil alltid være 0. Vi asserter på dette når vi tolker kravgrunnlaget fra oppdrag. - this.belopUinnkrevd = BigDecimal.ZERO - } -} diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/AksjonsKode.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/AksjonsKode.kt new file mode 100644 index 0000000000..caf68cfe8a --- /dev/null +++ b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/AksjonsKode.kt @@ -0,0 +1,5 @@ +package tilbakekreving.infrastructure.client.dto + +internal enum class AksjonsKode(val nummer: String) { + FATT_VEDTAK("8"), +} diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Alvorlighetsgrad.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Alvorlighetsgrad.kt new file mode 100644 index 0000000000..265777a11b --- /dev/null +++ b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Alvorlighetsgrad.kt @@ -0,0 +1,21 @@ +package tilbakekreving.infrastructure.client.dto + +enum class Alvorlighetsgrad(val value: String) { + OK("00"), + + /** En varselmelding følger med */ + OK_MED_VARSEL("04"), + + /** Alvorlig feil som logges og stopper behandling av aktuelt tilfelle*/ + ALVORLIG_FEIL("08"), + SQL_FEIL("12"), + ; + + override fun toString() = value + + companion object { + fun fromString(string: String): Alvorlighetsgrad { + return entries.first { it.value == string } + } + } +} diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Skyld.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Skyld.kt index d7452fb48e..d0e15d12fd 100644 --- a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Skyld.kt +++ b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Skyld.kt @@ -1,6 +1,6 @@ package tilbakekreving.infrastructure.client.dto -enum class Skyld { +internal enum class Skyld { BRUKER, IKKE_FORDELT, } diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/TilbakekrevingSoapResponse.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/TilbakekrevingSoapResponse.kt new file mode 100644 index 0000000000..1e0cd6b01b --- /dev/null +++ b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/TilbakekrevingSoapResponse.kt @@ -0,0 +1,132 @@ +package tilbakekreving.infrastructure.client.dto + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement +import com.fasterxml.jackson.module.kotlin.readValue +import no.nav.su.se.bakover.common.infrastructure.xml.xmlMapper + +internal fun String.deserializeTilbakekrevingsvedtakResponse(): Tilbakekrevingsresponse { + return xmlMapper.readValue(this).body.tilbakekrevingsvedtakResponse.response +} + +@JacksonXmlRootElement(localName = "Envelope", namespace = "http://schemas.xmlsoap.org/soap/envelope/") +internal data class Envelope( + @JacksonXmlProperty(localName = "Body") + val body: Body, +) + +internal data class Body( + val tilbakekrevingsvedtakResponse: ResponseWrapper, +) + +internal data class ResponseWrapper( + val response: Tilbakekrevingsresponse, +) + +internal data class Tilbakekrevingsresponse( + val mmel: Mmel, + val tilbakekrevingsvedtak: Tilbakekrevingsvedtak, +) + +internal data class Mmel( + val systemId: String? = null, + val kodeMelding: String? = null, + // 00, 04, 08, 12 + val alvorlighetsgrad: String? = null, + val beskrMelding: String? = null, + val sqlKode: String? = null, + val sqlState: String? = null, + val sqlMelding: String? = null, + val mqCompletionKode: String? = null, + val mqReasonKode: String? = null, + val programId: String? = null, + val sectionNavn: String? = null, +) + +internal data class Tilbakekrevingsvedtak( + /** + * 1 - 441 - Kode-aksjon - X(01) - Krav - Aksjonskode: + * 7 - midlertidig lagring + * 8 - fatte vedtak + * Aksjonskode 7 vil ikke kunne benyttes i fase 1. + */ + val kodeAksjon: String, + /** + * integer + * 2 - 441 - Vedtak-id - 9(10) - Krav - Identifikasjon av tilbakekrevingsvedtaket + * */ + val vedtakId: String, + // 3 - 441 - Dato-vedtak-fagsystem - X(08) - Valgfritt - Vedtaksdato på fagsystems vedtak. Omfeltet ikke er utfylt, legger TIlbakekrevingskomponenten inn dagens dato + val datoVedtakFagsystem: String?, + // 4 - 441 - Kode-hjemmel - X(20) - Krav - Lovhjemmel om tilbakekrevingsvedtaket + val kodeHjemmel: String, + // 5 - 441 - Renter-beregnes - X(01) - Betinget krav - 'J' Dersom det skal beregnes renter på kravet + val renterBeregnes: String?, + // 6 - 441 - Enhet-ansvarlig - X(13) - Krav - Ansvarlig enhet + val enhetAnsvarlig: String, + // 7 - 441 - Kontrollfelt - X(26) - Krav - Brukes ved innsending av tilbakekrevingsvedtak for å kontrollere at kravgrunnlaget ikke er blitt endret i mellomtiden + val kontrollfelt: String, + // 8 - 441 - Saksbeh-id - X(08) - Krav - Saksbehandler + val saksbehId: String, + // Liste over 442 - Tilbakekrevingsperiode + val tilbakekrevingsperiode: List, +) + +internal data class Tilbakekrevingsperiode( + val periode: Periode, + // 3 - 442 - Renter-beregnes - X(01) - Valgfritt - 'J' dersom det skal beregnes retner på kravet (nytt felt) + val renterBeregnes: String?, + /** + * decimal (totalDigits 11, fractionDigits 2) + * 4 - 442 - Belop-renter - Evt. beregnede renter i fagrutinen (nytt felt) + */ + val belopRenter: String?, + // Liste over 443 - Tilbakekrevingsbeløp + val tilbakekrevingsbelop: List, +) + +internal data class Periode( + // 1 - Dato-periode-fom - 442 - X(08) - Krav - Tilbakekrevingsperioder delt opp slik at ingen spenner over månedsskifter + val fom: String, + // 2 - Dato-periode-tom - 442 - X(08) - Krav - Tilbakekrevingsperioder delt opp slik at ingen spenner over månedsskifter + val tom: String, +) + +internal data class Tilbakekrevingsbelop( + /** + * min len 1, max 20 + * 1 - 443 - Kode-klasse - X(20) - Krav - Klassifisering av stønad, skatt, trekk etc. Det må minimum sendes med klassekoder for feilutbetaling og de ytelsesklassekoder som er feilutbetalt. + */ + val kodeKlasse: String, + /** + * decimal (totalDigits 11, fractionDigits 2) + * 3 - 443 - Belop-oppr-utbet - 9(8)V99 - Krav - Egen betydning for KL_KODE_FEIL_INNT. Vil alltid være 0. Vi asserter på dette når vi tolker kravgrunnlaget fra oppdrag. + */ + val belopOpprUtbet: String, + /** + * decimal (totalDigits 11, fractionDigits 2) + * 5 - 443 - Belop-ny - 9(8)V99 - Krav - Egen betydning for KL_KODE_FEIL_INNT. Vil være det feilutbetalte beløpet for perioden. Vi asserter på dette når vi tolker kravgrunnlaget fra oppdrag. + * TODO jah: Vi tar ikke med det feilutbetalte beløpet fra kravgrunnlaget, men det vil være det høyeste av disse. Bør vi legge det til? + */ + val belopNy: String, + /** + * decimal (totalDigits 11, fractionDigits 2) + * 7 - 443 - Belop-tilbakekreves - 9(8)V99 - Krav - Krav - Egen betydning for KL_KODE_FEIL_INNT. Vil alltid være 0. Vi asserter på dette når vi tolker kravgrunnlaget fra oppdrag. + */ + val belopTilbakekreves: String, + + /** + * decimal (totalDigits 11, fractionDigits 2) + * 9 - 443 - Belop-uinnkrevd - 9(8)V99 - Valgfritt - Krav - Egen betydning for KL_KODE_FEIL_INNT. Vil alltid være 0. Vi asserter på dette når vi tolker kravgrunnlaget fra oppdrag. + * TODO jah: Verifiser om dette er valgfritt eller krav? + */ + val belopUinnkrevd: String?, + /** + * decimal (totalDigits 11, fractionDigits 2) + * 11 - 443 - Belop-skatt - 9(8)V99 - Valgfritt - Skattebeløp, som skal redusere beløp til innkreving. + */ + val belopSkatt: String?, + val kodeResultat: String, + val kodeAarsak: String, + val kodeSkyld: String?, +) diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/TilbakekrevingsHjemmel.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/TilbakekrevingsHjemmel.kt new file mode 100644 index 0000000000..7befc43fdf --- /dev/null +++ b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/TilbakekrevingsHjemmel.kt @@ -0,0 +1,13 @@ +package tilbakekreving.infrastructure.client.dto + +/** + * Dersom man bruker hjemmel 'ANNET' sender tilbakekrevingskomponenten posisjon 118 som blank til NAVI/Predator og den vil bli behandlet som foreldet. + * Dersom man bruker hjemmel 'SUL_13' vil tilbakekrevingskomponenten sende T på posisjon 118 istedet og vi vil få forventet oppførsel. + * Vi har også bestilt SUL_13-1, SUL_13-2, SUL_13-3 og SUL_13-4 som vi ikke har tatt i bruk enda. + */ +internal enum class TilbakekrevingsHjemmel(val value: String) { + T("SUL_13"), + ; + + override fun toString() = value +} diff --git a/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Tilbakekrevingsresultat.kt b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Tilbakekrevingsresultat.kt new file mode 100644 index 0000000000..54972c5d9f --- /dev/null +++ b/tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/dto/Tilbakekrevingsresultat.kt @@ -0,0 +1,6 @@ +package tilbakekreving.infrastructure.client.dto + +internal enum class Tilbakekrevingsresultat { + FULL_TILBAKEKREV, + INGEN_TILBAKEKREV, +} diff --git a/tilbakekreving/presentation/src/main/kotlin/tilbakekreving/presentation/Tilbakekrevingskomponenter.kt b/tilbakekreving/presentation/src/main/kotlin/tilbakekreving/presentation/Tilbakekrevingskomponenter.kt index 43fe8fe844..30ef1db8f8 100644 --- a/tilbakekreving/presentation/src/main/kotlin/tilbakekreving/presentation/Tilbakekrevingskomponenter.kt +++ b/tilbakekreving/presentation/src/main/kotlin/tilbakekreving/presentation/Tilbakekrevingskomponenter.kt @@ -2,6 +2,7 @@ package tilbakekreving.presentation import dokument.domain.brev.BrevService import dokument.domain.hendelser.DokumentHendelseRepo +import no.nav.su.se.bakover.common.domain.auth.SamlTokenProvider import no.nav.su.se.bakover.common.domain.config.TilbakekrevingConfig import no.nav.su.se.bakover.common.infrastructure.persistence.DbMetrics import no.nav.su.se.bakover.common.persistence.SessionFactory @@ -42,6 +43,7 @@ class Tilbakekrevingskomponenter( brevService: BrevService, tilbakekrevingConfig: TilbakekrevingConfig, dbMetrics: DbMetrics, + samlTokenProvider: SamlTokenProvider, ): Tilbakekrevingskomponenter { val repos = TilbakekrevingRepos.create( clock = clock, @@ -52,7 +54,8 @@ class Tilbakekrevingskomponenter( dbMetrics = dbMetrics, ) val clients = TilbakekrevingClients.create( - tilbakekrevingConfig = tilbakekrevingConfig, + baseUrl = tilbakekrevingConfig.soap.url, + samlTokenProvider = samlTokenProvider, clock = clock, ) return Tilbakekrevingskomponenter( diff --git a/web-regresjonstest/src/main/kotlin/no/nav/su/se/bakover/web/komponenttest/Komponenttest.kt b/web-regresjonstest/src/main/kotlin/no/nav/su/se/bakover/web/komponenttest/Komponenttest.kt index 43b44fa0d4..8d4ce0264e 100644 --- a/web-regresjonstest/src/main/kotlin/no/nav/su/se/bakover/web/komponenttest/Komponenttest.kt +++ b/web-regresjonstest/src/main/kotlin/no/nav/su/se/bakover/web/komponenttest/Komponenttest.kt @@ -11,6 +11,7 @@ import no.nav.su.se.bakover.dokument.application.consumer.JournalførDokumentHen import no.nav.su.se.bakover.dokument.infrastructure.database.Dokumentkomponenter import no.nav.su.se.bakover.domain.DatabaseRepos import no.nav.su.se.bakover.test.applicationConfig +import no.nav.su.se.bakover.test.auth.FakeSamlTokenProvider import no.nav.su.se.bakover.test.fixedClock import no.nav.su.se.bakover.test.persistence.dbMetricsStub import no.nav.su.se.bakover.test.persistence.withMigratedDb @@ -137,6 +138,7 @@ internal fun withKomptestApplication( brevService = services.brev, tilbakekrevingConfig = applicationConfig.oppdrag.tilbakekreving, dbMetrics = dbMetricsStub, + samlTokenProvider = FakeSamlTokenProvider(), ) }, dokumentKomponenterBuilder: (databaseRepos: DatabaseRepos, services: Services, clients: Clients) -> Dokumentkomponenter = { databaseRepos, services, clients -> diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/StartServer.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/StartServer.kt index a8931127ad..b4a2e9fd84 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/StartServer.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/StartServer.kt @@ -9,6 +9,8 @@ import io.ktor.server.routing.Route import no.nav.su.se.bakover.client.Clients import no.nav.su.se.bakover.client.ProdClientsBuilder import no.nav.su.se.bakover.client.StubClientsBuilder +import no.nav.su.se.bakover.client.sts.StsSamlClient +import no.nav.su.se.bakover.common.domain.auth.SamlTokenProvider import no.nav.su.se.bakover.common.domain.config.TilbakekrevingConfig import no.nav.su.se.bakover.common.infrastructure.config.ApplicationConfig import no.nav.su.se.bakover.common.infrastructure.jms.JmsConfig @@ -91,6 +93,11 @@ fun Application.susebakover( råttKravgrunnlagMapper = mapRåttKravgrunnlag, ), jmsConfig: JmsConfig = JmsConfig(applicationConfig), + samlTokenProvider: SamlTokenProvider = StsSamlClient( + baseUrl = applicationConfig.clientsConfig.stsSamlUrl, + serviceUser = applicationConfig.serviceUser, + clock = clock, + ), clients: Clients = if (applicationConfig.runtimeEnvironment != ApplicationConfig.RuntimeEnvironment.Nais) { StubClientsBuilder( clock = clock, @@ -101,6 +108,7 @@ fun Application.susebakover( jmsConfig, clock = clock, metrics = clientMetrics, + samlTokenProvider = samlTokenProvider, ).build(applicationConfig) }, services: Services = run { @@ -146,6 +154,7 @@ fun Application.susebakover( brevService = brevService, tilbakekrevingConfig = tilbakekrevingConfig, dbMetrics = dbMetrics, + samlTokenProvider = samlTokenProvider, ) }, dokumentkomponenter: Dokumentkomponenter = run {