Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 64fca9f

Browse files
committedFeb 7, 2024
Fjern CXF fra TilbakekrevingsClient
1 parent 3b8e795 commit 64fca9f

9 files changed

+262
-238
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
@file:Suppress("HttpUrlsUsage")
2+
3+
package tilbakekreving.infrastructure.client
4+
5+
import no.nav.su.se.bakover.common.ident.NavIdentBruker
6+
import tilbakekreving.domain.vurdering.PeriodevurderingMedKrav
7+
import tilbakekreving.domain.vurdering.VurderingerMedKrav
8+
import tilbakekreving.infrastructure.client.dto.AksjonsKode
9+
import tilbakekreving.infrastructure.client.dto.Skyld
10+
import tilbakekreving.infrastructure.client.dto.TilbakekrevingsHjemmel
11+
import tilbakekreving.infrastructure.client.dto.Tilbakekrevingsresultat
12+
import tilbakekreving.infrastructure.client.dto.TilbakekrevingsÅrsak
13+
import kotlin.math.max
14+
15+
/**
16+
* Se: https://confluence.adeo.no/display/OKSY/Detaljer+om+de+enkelte+ID-koder
17+
* Se: https://github.com/navikt/tjenestespesifikasjoner/blob/master/tilbakekreving-v1-tjenestespesifikasjon/src/main/wsdl/no/nav/tilbakekreving/tilbakekreving-v1-tjenestespesifikasjon.wsdl
18+
*/
19+
internal fun buildTilbakekrevingSoapRequest(
20+
vurderingerMedKrav: VurderingerMedKrav,
21+
attestertAv: NavIdentBruker.Attestant,
22+
): String {
23+
// TODO jah: Vurder om vi skal legge til datoVedtakFagsystem istedenfor å få dagens dato.
24+
return """
25+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
26+
<ns4:tilbakekrevingsvedtakRequest xmlns:ns2="urn:no:nav:tilbakekreving:typer:v1"
27+
xmlns:ns4="http://okonomi.nav.no/tilbakekrevingService/"
28+
xmlns:ns3="urn:no:nav:tilbakekreving:tilbakekrevingsvedtak:vedtak:v1">
29+
<tilbakekrevingsvedtak>
30+
<ns3:kodeAksjon>${AksjonsKode.FATT_VEDTAK.nummer}</ns3:kodeAksjon>
31+
<ns3:vedtakId>${vurderingerMedKrav.eksternVedtakId}</ns3:vedtakId>
32+
<ns3:kodeHjemmel>${TilbakekrevingsHjemmel.T}</ns3:kodeHjemmel>
33+
<ns3:renterBeregnes>N</ns3:renterBeregnes>
34+
<ns3:enhetAnsvarlig>8020</ns3:enhetAnsvarlig>
35+
<ns3:kontrollfelt>${vurderingerMedKrav.eksternKontrollfelt}</ns3:kontrollfelt>
36+
<ns3:saksbehId>${attestertAv}</ns3:saksbehId>
37+
${
38+
vurderingerMedKrav.perioder.joinToString(separator = "\n") { periode ->
39+
"""
40+
<ns3:tilbakekrevingsperiode>
41+
<ns3:periode>
42+
<ns2:fom>${periode.periode.fraOgMed}</ns2:fom>
43+
<ns2:tom>${periode.periode.tilOgMed}</ns2:tom>
44+
</ns3:periode>
45+
<ns3:renterBeregnes>N</ns3:renterBeregnes>
46+
<ns3:belopRenter>0</ns3:belopRenter>
47+
<ns3:tilbakekrevingsbelop>
48+
<ns3:kodeKlasse>SUUFORE</ns3:kodeKlasse>
49+
<ns3:belopOpprUtbet>${periode.bruttoTidligereUtbetalt}</ns3:belopOpprUtbet>
50+
<ns3:belopNy>${periode.bruttoNyUtbetaling}</ns3:belopNy>
51+
<ns3:belopTilbakekreves>${periode.bruttoSkalTilbakekreve}}</ns3:belopTilbakekreves>
52+
<ns3:belopUinnkrevd>${periode.bruttoSkalIkkeTilbakekreve}</ns3:belopUinnkrevd>
53+
<ns3:belopSkatt>${periode.skattSomGårTilReduksjon}</ns3:belopSkatt>
54+
<ns3:kodeResultat>${
55+
when (periode) {
56+
is PeriodevurderingMedKrav.SkalIkkeTilbakekreve -> Tilbakekrevingsresultat.INGEN_TILBAKEKREV.toString()
57+
is PeriodevurderingMedKrav.SkalTilbakekreve -> Tilbakekrevingsresultat.FULL_TILBAKEKREV.toString()
58+
}
59+
}</ns3:kodeResultat>
60+
<ns3:kodeAarsak>${TilbakekrevingsÅrsak.ANNET}</ns3:kodeAarsak>
61+
<ns3:kodeSkyld>${
62+
when (periode) {
63+
is PeriodevurderingMedKrav.SkalIkkeTilbakekreve -> Skyld.IKKE_FORDELT.toString()
64+
is PeriodevurderingMedKrav.SkalTilbakekreve -> Skyld.BRUKER.toString()
65+
}
66+
}</ns3:kodeSkyld>
67+
</ns3:tilbakekrevingsbelop>
68+
<ns3:tilbakekrevingsbelop>
69+
<ns3:kodeKlasse>KL_KODE_FEIL_INNT</ns3:kodeKlasse>
70+
<ns3:belopOpprUtbet>0</ns3:belopOpprUtbet>
71+
<ns3:belopNy>${max(periode.bruttoSkalTilbakekreve, periode.bruttoSkalIkkeTilbakekreve)}</ns3:belopNy>
72+
<ns3:belopTilbakekreves>0</ns3:belopTilbakekreves>
73+
<ns3:belopUinnkrevd>0</ns3:belopUinnkrevd>
74+
</ns3:tilbakekrevingsbelop>
75+
</ns3:tilbakekrevingsperiode>"""
76+
}
77+
}
78+
</tilbakekrevingsvedtak>
79+
</ns4:tilbakekrevingsvedtakRequest>
80+
""".trimIndent()
81+
}

‎tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClient.kt

+30-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import arrow.core.right
88
import no.nav.okonomi.tilbakekrevingservice.TilbakekrevingPortType
99
import no.nav.okonomi.tilbakekrevingservice.TilbakekrevingsvedtakResponse
1010
import no.nav.su.se.bakover.common.domain.Saksnummer
11+
import no.nav.su.se.bakover.common.domain.auth.SamlTokenProvider
1112
import no.nav.su.se.bakover.common.ident.NavIdentBruker
1213
import no.nav.su.se.bakover.common.sikkerLogg
1314
import no.nav.su.se.bakover.common.tid.Tidspunkt
@@ -16,15 +17,25 @@ import tilbakekreving.domain.kravgrunnlag.rått.RåTilbakekrevingsvedtakForsende
1617
import tilbakekreving.domain.vedtak.KunneIkkeSendeTilbakekrevingsvedtak
1718
import tilbakekreving.domain.vedtak.Tilbakekrevingsklient
1819
import tilbakekreving.domain.vurdering.VurderingerMedKrav
20+
import økonomi.domain.simulering.SimuleringFeilet
21+
import java.net.http.HttpClient
1922
import java.time.Clock
23+
import java.time.Duration
24+
import java.util.UUID
2025

2126
class TilbakekrevingSoapClient(
22-
private val tilbakekrevingPortType: TilbakekrevingPortType,
27+
private val baseUrl: String,
28+
private val samlTokenProvider: SamlTokenProvider,
2329
private val clock: Clock,
2430
) : Tilbakekrevingsklient {
2531

2632
private val log = LoggerFactory.getLogger(this::class.java)
2733

34+
private val client: HttpClient = HttpClient.newBuilder()
35+
.connectTimeout(Duration.ofSeconds(5))
36+
.followRedirects(HttpClient.Redirect.NEVER)
37+
.build()
38+
2839
/**
2940
* Sender informasjon til oppdrag hvordan vi vil avgjøre om vi vil kreve tilbake eller ikke.
3041
*
@@ -36,11 +47,27 @@ class TilbakekrevingSoapClient(
3647
): Either<KunneIkkeSendeTilbakekrevingsvedtak, RåTilbakekrevingsvedtakForsendelse> {
3748
val saksnummer = vurderingerMedKrav.saksnummer
3849
return Either.catch {
39-
val request = mapToTilbakekrevingsvedtakRequest(
50+
val soapBody = buildTilbakekrevingSoapRequest(
4051
vurderingerMedKrav = vurderingerMedKrav,
4152
attestertAv = attestertAv,
4253
)
43-
val response = tilbakekrevingPortType.tilbakekrevingsvedtak(request)
54+
val saksnummer = vurderingerMedKrav.saksnummer
55+
val assertion = samlTokenProvider.samlToken().getOrElse {
56+
// SamlTokenProvider logger, men mangler kontekst.
57+
log.error(
58+
"Feil ved sending av tilbakekrevingsvedtak: Kunne ikke hente SAML-token for saksnummer: $saksnummer. Se sikkerlogg for soap body.",
59+
RuntimeException("Trigger stacktrace"),
60+
)
61+
sikkerLogg.error("Feil ved sending av tilbakekrevingsvedtak: Kunne ikke hente SAML-token for saksnummer: $saksnummer. soapBody: $soapBody")
62+
return SimuleringFeilet.TekniskFeil.left()
63+
}.toString()
64+
val soapRequest = buildXmlRequestSoapEnvelope(
65+
action = ACTION,
66+
messageId = UUID.randomUUID().toString(),
67+
serviceUrl = baseUrl,
68+
assertion = assertion,
69+
body = soapBody,
70+
)
4471

4572
val requestXmlString = TilbakekrevingSoapClientMapper.toXml(request)
4673
val responseXmlString = mapErrorResponseTilXmlString(response)

‎tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapClientMapper.kt

-56
This file was deleted.

‎tilbakekreving/infrastructure/src/main/kotlin/tilbakekreving/infrastructure/client/TilbakekrevingSoapRequestMapper.kt

-178
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package tilbakekreving.infrastructure.client.dto
2+
3+
internal enum class AksjonsKode(val nummer: String) {
4+
FATT_VEDTAK("8"),
5+
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package tilbakekreving.infrastructure.client.dto
22

3-
enum class Skyld {
3+
internal enum class Skyld {
44
BRUKER,
55
IKKE_FORDELT,
66
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package tilbakekreving.infrastructure.client.dto
2+
3+
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
4+
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
5+
6+
@JacksonXmlRootElement(localName = "Envelope", namespace = "http://schemas.xmlsoap.org/soap/envelope/")
7+
internal data class Envelope(
8+
@JacksonXmlProperty(localName = "Body")
9+
val body: Body,
10+
)
11+
12+
internal data class Body(
13+
val tilbakekrevingsvedtakResponse: ResponseWrapper,
14+
)
15+
16+
internal data class ResponseWrapper(
17+
val response: Response,
18+
)
19+
20+
internal data class Response(
21+
val mmel: Mmel,
22+
val tilbakekrevingsvedtak: Tilbakekrevingsvedtak,
23+
)
24+
25+
internal data class Mmel(
26+
val systemId: String? = null,
27+
val kodeMelding: String? = null,
28+
// 00, 04, 08, 12
29+
val alvorlighetsgrad: String? = null,
30+
val beskrMelding: String? = null,
31+
val sqlKode: String? = null,
32+
val sqlState: String? = null,
33+
val sqlMelding: String? = null,
34+
val mqCompletionKode: String? = null,
35+
val mqReasonKode: String? = null,
36+
val programId: String? = null,
37+
val sectionNavn: String? = null,
38+
)
39+
40+
internal data class Tilbakekrevingsvedtak(
41+
/**
42+
* 1 - 441 - Kode-aksjon - X(01) - Krav - Aksjonskode:
43+
* 7 - midlertidig lagring
44+
* 8 - fatte vedtak
45+
* Aksjonskode 7 vil ikke kunne benyttes i fase 1.
46+
*/
47+
val kodeAksjon: String,
48+
/**
49+
* integer
50+
* 2 - 441 - Vedtak-id - 9(10) - Krav - Identifikasjon av tilbakekrevingsvedtaket
51+
* */
52+
val vedtakId: String,
53+
// 3 - 441 - Dato-vedtak-fagsystem - X(08) - Valgfritt - Vedtaksdato på fagsystems vedtak. Omfeltet ikke er utfylt, legger TIlbakekrevingskomponenten inn dagens dato
54+
val datoVedtakFagsystem: String?,
55+
// 4 - 441 - Kode-hjemmel - X(20) - Krav - Lovhjemmel om tilbakekrevingsvedtaket
56+
val kodeHjemmel: String,
57+
// 5 - 441 - Renter-beregnes - X(01) - Betinget krav - 'J' Dersom det skal beregnes renter på kravet
58+
val renterBeregnes: String?,
59+
// 6 - 441 - Enhet-ansvarlig - X(13) - Krav - Ansvarlig enhet
60+
val enhetAnsvarlig: String,
61+
// 7 - 441 - Kontrollfelt - X(26) - Krav - Brukes ved innsending av tilbakekrevingsvedtak for å kontrollere at kravgrunnlaget ikke er blitt endret i mellomtiden
62+
val kontrollfelt: String,
63+
// 8 - 441 - Saksbeh-id - X(08) - Krav - Saksbehandler
64+
val saksbehId: String,
65+
// Liste over 442 - Tilbakekrevingsperiode
66+
val tilbakekrevingsperiode: List<Tilbakekrevingsperiode>,
67+
)
68+
69+
internal data class Tilbakekrevingsperiode(
70+
val periode: Periode,
71+
// 3 - 442 - Renter-beregnes - X(01) - Valgfritt - 'J' dersom det skal beregnes retner på kravet (nytt felt)
72+
val renterBeregnes: String?,
73+
/**
74+
* decimal (totalDigits 11, fractionDigits 2)
75+
* 4 - 442 - Belop-renter - Evt. beregnede renter i fagrutinen (nytt felt)
76+
*/
77+
val belopRenter: String?,
78+
// Liste over 443 - Tilbakekrevingsbeløp
79+
val tilbakekrevingsbelop: List<Tilbakekrevingsbelop>,
80+
)
81+
82+
internal data class Periode(
83+
// 1 - Dato-periode-fom - 442 - X(08) - Krav - Tilbakekrevingsperioder delt opp slik at ingen spenner over månedsskifter
84+
val fom: String,
85+
// 2 - Dato-periode-tom - 442 - X(08) - Krav - Tilbakekrevingsperioder delt opp slik at ingen spenner over månedsskifter
86+
val tom: String,
87+
)
88+
89+
internal data class Tilbakekrevingsbelop(
90+
/**
91+
* min len 1, max 20
92+
* 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.
93+
*/
94+
val kodeKlasse: String,
95+
/**
96+
* decimal (totalDigits 11, fractionDigits 2)
97+
* 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.
98+
*/
99+
val belopOpprUtbet: String,
100+
/**
101+
* decimal (totalDigits 11, fractionDigits 2)
102+
* 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.
103+
* 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?
104+
*/
105+
val belopNy: String,
106+
/**
107+
* decimal (totalDigits 11, fractionDigits 2)
108+
* 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.
109+
*/
110+
val belopTilbakekreves: String,
111+
112+
/**
113+
* decimal (totalDigits 11, fractionDigits 2)
114+
* 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.
115+
* TODO jah: Verifiser om dette er valgfritt eller krav?
116+
*/
117+
val belopUinnkrevd: String?,
118+
/**
119+
* decimal (totalDigits 11, fractionDigits 2)
120+
* 11 - 443 - Belop-skatt - 9(8)V99 - Valgfritt - Skattebeløp, som skal redusere beløp til innkreving.
121+
*/
122+
val belopSkatt: String?,
123+
val kodeResultat: String,
124+
val kodeAarsak: String,
125+
val kodeSkyld: String?,
126+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package tilbakekreving.infrastructure.client.dto
2+
3+
/**
4+
* Dersom man bruker hjemmel 'ANNET' sender tilbakekrevingskomponenten posisjon 118 som blank til NAVI/Predator og den vil bli behandlet som foreldet.
5+
* Dersom man bruker hjemmel 'SUL_13' vil tilbakekrevingskomponenten sende T på posisjon 118 istedet og vi vil få forventet oppførsel.
6+
* 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.
7+
*/
8+
internal enum class TilbakekrevingsHjemmel(val value: String) {
9+
T("SUL_13"),
10+
;
11+
12+
override fun toString() = value
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package tilbakekreving.infrastructure.client.dto
2+
3+
internal enum class Tilbakekrevingsresultat {
4+
FULL_TILBAKEKREV,
5+
INGEN_TILBAKEKREV,
6+
}

0 commit comments

Comments
 (0)
Please sign in to comment.