Skip to content

Commit

Permalink
Fjern CXF fra TilbakekrevingsClient
Browse files Browse the repository at this point in the history
  • Loading branch information
hestad committed Mar 15, 2024
1 parent a1a1823 commit ed50776
Show file tree
Hide file tree
Showing 27 changed files with 615 additions and 358 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -38,6 +38,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 {
Expand Down Expand Up @@ -117,11 +118,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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package no.nav.su.se.bakover.common.domain.extensions

fun Int.toStringWithDecimals(decimalPlaces: Int): String {
if (decimalPlaces <= 0) return this.toString()
return "$this.${"0".repeat(decimalPlaces)}"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package no.nav.su.se.bakover.common.domain.extensions

import io.kotest.matchers.shouldBe
import org.junit.jupiter.api.Test

internal class IntExKtTest {
@Test
fun `toStringWithDecimals should return the integer as a string with the specified number of decimal places`() {
42.toStringWithDecimals(2) shouldBe "42.00"
42.toStringWithDecimals(0) shouldBe "42"
42.toStringWithDecimals(5) shouldBe "42.00000"
}
}
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
22 changes: 22 additions & 0 deletions test-common/src/main/kotlin/TilbakekrevingTestData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -497,3 +497,25 @@ fun nyVurderinger(
),
),
): Vurderinger = Vurderinger(perioderVurderinger)

/**
* @param perioderVurderinger ignoreres dersom [vurderinger] sendes inn.
*/
fun vurderingerMedKrav(
perioderVurderinger: Nel<Vurderinger.Periodevurdering> = nonEmptyListOf(
Vurderinger.Periodevurdering(
periode = januar(2021),
vurdering = Vurdering.SkalTilbakekreve,
),
),
vurderinger: Vurderinger = nyVurderinger(perioderVurderinger = perioderVurderinger),
kravgrunnlag: Kravgrunnlag = kravgrunnlag(
kravgrunnlagPåSakHendelseId = HendelseId.generer(),
behandler = saksbehandler.toString(),
),
): VurderingerMedKrav {
return VurderingerMedKrav.utledFra(
vurderinger = vurderinger,
kravgrunnlag = kravgrunnlag,
).getOrFail()
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -98,6 +99,7 @@ fun Application.runApplicationWithMocks(
brevService = brevService,
tilbakekrevingConfig = tilbakekrevingConfig,
dbMetrics = dbMetrics,
samlTokenProvider = FakeSamlTokenProvider(),
)
},
dokumentkomponenter: Dokumentkomponenter = mock(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package no.nav.su.se.bakover.test.tilbakekreving

/**
* Mottatt i preprod ved å sende en request til tilbakekreving med en ugyldig request (decimal på feil format)
* Status 500.
*/
fun tilbakekrevingSoapResponseConversionError() = """
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Conversion from SOAP failed</faultstring>
<detail>
<CICSFault xmlns="http://www.ibm.com/software/htp/cics/WSFault">DFHPI1009 08/02/2024 10:04:56 CICSQ1OS OSW8 85071 XML to data transformation failed. A conversion error (INVALID_CHARACTER) occurred when converting field belopTilbakekreves for WEBSERVICE tilbakekreving-v1-tjenestespesif.</CICSFault>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
""".trimIndent()

/**
* Mottatt i preprod ved at vi allerede har sendt en request med samme vedtakId som har blitt godtatt.
* Status 200.
*/
fun tilbakekrevingSoapResponseVedtakIdFinnesIkke() = """
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<tilbakekrevingsvedtakResponse xmlns="http://okonomi.nav.no/tilbakekrevingService/">
<mmel xmlns="">
<systemId xmlns="urn:no:nav:tilbakekreving:typer:v1">231-OPPD</systemId>
<kodeMelding xmlns="urn:no:nav:tilbakekreving:typer:v1">B441012F</kodeMelding>
<alvorlighetsgrad xmlns="urn:no:nav:tilbakekreving:typer:v1">08</alvorlighetsgrad>
<beskrMelding xmlns="urn:no:nav:tilbakekreving:typer:v1">Oppgitt vedtak-id finnes ikke/har feil status: 0000625279</beskrMelding>
<sqlKode xmlns="urn:no:nav:tilbakekreving:typer:v1" />
<sqlState xmlns="urn:no:nav:tilbakekreving:typer:v1" />
<sqlMelding xmlns="urn:no:nav:tilbakekreving:typer:v1" />
<mqCompletionKode xmlns="urn:no:nav:tilbakekreving:typer:v1" />
<mqReasonKode xmlns="urn:no:nav:tilbakekreving:typer:v1" />
<programId xmlns="urn:no:nav:tilbakekreving:typer:v1">K231B441</programId>
<sectionNavn xmlns="urn:no:nav:tilbakekreving:typer:v1">CA10-VALIDER-INPUT</sectionNavn>
</mmel>
<tilbakekrevingsvedtak xmlns="">
<kodeAksjon xmlns="urn:no:nav:tilbakekreving:tilbakekrevingsvedtak:vedtak:v1" />
<vedtakId xmlns="urn:no:nav:tilbakekreving:tilbakekrevingsvedtak:vedtak:v1">0</vedtakId>
<kodeHjemmel xmlns="urn:no:nav:tilbakekreving:tilbakekrevingsvedtak:vedtak:v1" />
<enhetAnsvarlig xmlns="urn:no:nav:tilbakekreving:tilbakekrevingsvedtak:vedtak:v1" />
<kontrollfelt xmlns="urn:no:nav:tilbakekreving:tilbakekrevingsvedtak:vedtak:v1" />
<saksbehId xmlns="urn:no:nav:tilbakekreving:tilbakekrevingsvedtak:vedtak:v1" />
</tilbakekrevingsvedtak>
</tilbakekrevingsvedtakResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
""".trimIndent()
4 changes: 2 additions & 2 deletions test-common/src/main/kotlin/xml/AssertXmlEquals.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ fun String.shouldBeSimilarXmlTo(expectedXml: String, strict: Boolean = false) {
* Kan si at builderen med node-matcher vil reagere på hvis dataen er feil - men builderen uten node matcher gir ikke feil om strukturen er feil
*/
private fun String.compareXmlWith(expectedXml: String, strict: Boolean): Pair<Diff, Diff> {
val diffBuilderWithoutNodeMatcher = DiffBuilder.compare(this).withTest(expectedXml)
val diffBuilderWithoutNodeMatcher = DiffBuilder.compare(expectedXml).withTest(this)
.ignoreWhitespace()
.withComparisonController(ComparisonControllers.StopWhenDifferent)

val diffBuilderWithNodeMatcher = DiffBuilder.compare(this).withTest(expectedXml)
val diffBuilderWithNodeMatcher = DiffBuilder.compare(expectedXml).withTest(this)
.ignoreWhitespace()
.withNodeMatcher(DefaultNodeMatcher(ElementSelectors.byNameAndText))
.withComparisonController(ComparisonControllers.StopWhenDifferent)
Expand Down
16 changes: 8 additions & 8 deletions test-common/src/test/kotlin/xml/AssertXmlEqualsKtTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,47 +10,47 @@ class AssertXmlEqualsKtTest {

@Test
fun `gir ut en forståelig feilmelding, dersom daten i XML'en ikke er lik`() {
val xml1 = """
val expected = """
<person>
<navn>Per</navn>
<alder>30</alder>
</person>
""".trimIndent()
val xml2 = """
val actual = """
<person>
<navn>Per</navn>
<alder>31</alder>
</person>
""".trimIndent()

assertThrows(AssertionError::class.java) {
xml2 shouldBeSimilarXmlTo xml1
actual shouldBeSimilarXmlTo expected
}.message shouldBe """
Expected XMLs to be similar, but found differences:
Expected text value '31' but was '30' - comparing <alder ...>31</alder> at /person[1]/alder[1]/text()[1] to <alder ...>30</alder> at /person[1]/alder[1]/text()[1] (DIFFERENT)
Expected text value '30' but was '31' - comparing <alder ...>30</alder> at /person[1]/alder[1]/text()[1] to <alder ...>31</alder> at /person[1]/alder[1]/text()[1] (DIFFERENT)
""".trimIndent()
}

@Test
fun `gir ut en forståelig feilmelding, dersom strukturen i XML'en ikke er lik`() {
val xml1 = """
val expected = """
<person>
<navn>Per</navn>
<alder>30</alder>
</person>
""".trimIndent()
val xml2 = """
val actual = """
<person>
<alder>30</alder>
<navn>Per</navn>
</person>
""".trimIndent()

assertThrows(AssertionError::class.java) {
xml2 shouldBeSimilarXmlTo xml1
actual shouldBeSimilarXmlTo expected
}.message shouldBe """
Expected XMLs to be similar, but found differences:
Expected element tag name 'alder' but was 'navn' - comparing <alder...> at /person[1]/alder[1] to <navn...> at /person[1]/navn[1] (DIFFERENT)
Expected element tag name 'navn' but was 'alder' - comparing <navn...> at /person[1]/navn[1] to <alder...> at /person[1]/alder[1] (DIFFERENT)
""".trimIndent()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import no.nav.su.se.bakover.hendelse.domain.HendelseId
import java.math.BigDecimal

data class Kravgrunnlag(
/** Se [tilbakekreving.domain.kravgrunnlag.KravgrunnlagDetaljerPåSakHendelse]*/
/** Se [tilbakekreving.domain.kravgrunnlag.påsak.KravgrunnlagDetaljerPåSakHendelse]*/
val hendelseId: HendelseId,

val saksnummer: Saksnummer,
Expand Down
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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,
),
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
@file:Suppress("HttpUrlsUsage")

package tilbakekreving.infrastructure.client

import arrow.core.Either
import no.nav.su.se.bakover.common.domain.extensions.toStringWithDecimals
import no.nav.su.se.bakover.common.ident.NavIdentBruker
import no.nav.su.se.bakover.common.sikkerLogg
import org.slf4j.LoggerFactory
import tilbakekreving.domain.vedtak.KunneIkkeSendeTilbakekrevingsvedtak
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

private val log = LoggerFactory.getLogger("tilbakekreving.infrastructure.client.buildTilbakekrevingSoapRequest")

/**
* 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,
): Either<KunneIkkeSendeTilbakekrevingsvedtak, String> {
return Either.catch {
// TODO jah: Vurder om vi skal legge til datoVedtakFagsystem istedenfor å få dagens dato.
"""
<ns4:tilbakekrevingsvedtakRequest xmlns:ns2="urn:no:nav:tilbakekreving:typer:v1"
xmlns:ns4="http://okonomi.nav.no/tilbakekrevingService/"
xmlns:ns3="urn:no:nav:tilbakekreving:tilbakekrevingsvedtak:vedtak:v1">
<tilbakekrevingsvedtak>
<ns3:kodeAksjon>${AksjonsKode.FATT_VEDTAK.nummer}</ns3:kodeAksjon>
<ns3:vedtakId>${vurderingerMedKrav.eksternVedtakId}</ns3:vedtakId>
<ns3:kodeHjemmel>${TilbakekrevingsHjemmel.T}</ns3:kodeHjemmel>
<ns3:renterBeregnes>N</ns3:renterBeregnes>
<ns3:enhetAnsvarlig>8020</ns3:enhetAnsvarlig>
<ns3:kontrollfelt>${vurderingerMedKrav.eksternKontrollfelt}</ns3:kontrollfelt>
<ns3:saksbehId>$attestertAv</ns3:saksbehId>
${
vurderingerMedKrav.perioder.joinToString(separator = "\n") { periode ->
"""
<ns3:tilbakekrevingsperiode>
<ns3:periode>
<ns2:fom>${periode.periode.fraOgMed}</ns2:fom>
<ns2:tom>${periode.periode.tilOgMed}</ns2:tom>
</ns3:periode>
<ns3:renterBeregnes>N</ns3:renterBeregnes>
<ns3:belopRenter>0.00</ns3:belopRenter>
<ns3:tilbakekrevingsbelop>
<ns3:kodeKlasse>SUUFORE</ns3:kodeKlasse>
<ns3:belopOpprUtbet>${periode.bruttoTidligereUtbetalt.toStringWithDecimals(2)}</ns3:belopOpprUtbet>
<ns3:belopNy>${periode.bruttoNyUtbetaling.toStringWithDecimals(2)}</ns3:belopNy>
<ns3:belopTilbakekreves>${periode.bruttoSkalTilbakekreve.toStringWithDecimals(2)}</ns3:belopTilbakekreves>
<ns3:belopUinnkrevd>${periode.bruttoSkalIkkeTilbakekreve.toStringWithDecimals(2)}</ns3:belopUinnkrevd>
<ns3:belopSkatt>${periode.skattSomGårTilReduksjon.toStringWithDecimals(2)}</ns3:belopSkatt>
<ns3:kodeResultat>${
when (periode) {
is PeriodevurderingMedKrav.SkalIkkeTilbakekreve -> Tilbakekrevingsresultat.INGEN_TILBAKEKREV.toString()
is PeriodevurderingMedKrav.SkalTilbakekreve -> Tilbakekrevingsresultat.FULL_TILBAKEKREV.toString()
}
}</ns3:kodeResultat>
<ns3:kodeAarsak>${TilbakekrevingsÅrsak.ANNET}</ns3:kodeAarsak>
<ns3:kodeSkyld>${
when (periode) {
is PeriodevurderingMedKrav.SkalIkkeTilbakekreve -> Skyld.IKKE_FORDELT.toString()
is PeriodevurderingMedKrav.SkalTilbakekreve -> Skyld.BRUKER.toString()
}
}</ns3:kodeSkyld>
</ns3:tilbakekrevingsbelop>
<ns3:tilbakekrevingsbelop>
<ns3:kodeKlasse>KL_KODE_FEIL_INNT</ns3:kodeKlasse>
<ns3:belopOpprUtbet>0.00</ns3:belopOpprUtbet>
<ns3:belopNy>${
max(
periode.bruttoSkalTilbakekreve,
periode.bruttoSkalIkkeTilbakekreve,
).toStringWithDecimals(2)
}</ns3:belopNy>
<ns3:belopTilbakekreves>0.00</ns3:belopTilbakekreves>
<ns3:belopUinnkrevd>0.00</ns3:belopUinnkrevd>
</ns3:tilbakekrevingsbelop>
</ns3:tilbakekrevingsperiode>"""
}
}
</tilbakekrevingsvedtak>
</ns4:tilbakekrevingsvedtakRequest>
""".trimIndent()
}.mapLeft {
log.error(
"Feil ved sending av tilbakekrevingsvedtak: Klarte ikke serialisere requesten som vi skulle sende til Tilbakekrevingsmodulen (OS). Se sikkerlogg for mer kontekst.",
RuntimeException("Trigger stacktrace"),
)
sikkerLogg.error(
"Feil ved sending av tilbakekrevingsvedtak: Klarte ikke serialisere requesten som vi skulle sende til Tilbakekrevingsmodulen (OS). vurderingerMedKrav: $vurderingerMedKrav, attestertAv: $attestertAv",
it,
)
KunneIkkeSendeTilbakekrevingsvedtak
}
}
Loading

0 comments on commit ed50776

Please sign in to comment.