Skip to content

Commit 665984b

Browse files
committed
1361 Lagrer request og respons dersom utbetaling feiler for enklere debugging
1 parent 6247c51 commit 665984b

File tree

9 files changed

+176
-20
lines changed

9 files changed

+176
-20
lines changed

Diff for: app/src/main/kotlin/no/nav/tiltakspenger/vedtak/clients/utbetaling/UtbetalingHttpClient.kt

+24-9
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,10 @@ class UtbetalingHttpClient(
6464
response = jsonResponse,
6565
token = token,
6666
)
67-
}.mapLeft {
68-
// Either.catch slipper igjennom CancellationException som er ønskelig.
69-
log.error(RuntimeException("Trigger stacktrace for enklere debug.")) { "Ukjent feil ved utsjekk for utbetalingsvedtak ${vedtak.id}. Saksnummer ${vedtak.saksnummer}, sakId: ${vedtak.sakId}" }
70-
sikkerlogg.error(it) { "Ukjent feil ved utsjekk for utbetalingsvedtak ${vedtak.id}. Saksnummer ${vedtak.saksnummer}, sakId: ${vedtak.sakId}" }
71-
KunneIkkeUtbetale
67+
}.mapLeft { e ->
68+
log.error(RuntimeException("Trigger stacktrace for easier debugging.")) { "Unknown error during payment check for payment decision ${vedtak.id}. Case number ${vedtak.saksnummer}, caseId: ${vedtak.sakId}" }
69+
sikkerlogg.error(e) { "Unknown error during payment check for payment decision ${vedtak.id}. Case number ${vedtak.saksnummer}, caseId: ${vedtak.sakId}" }
70+
KunneIkkeUtbetale()
7271
}.flatten()
7372
}
7473

@@ -120,7 +119,11 @@ private fun mapStatus(
120119
sikkerlogg.error(RuntimeException("Trigger stacktrace for enklere debug.")) {
121120
"400 Bad Request fra helved utsjekk, for utbetalingsvedtak ${vedtak.id}. Denne vil bli prøvd på nytt. Response: $response. Request = $request"
122121
}
123-
return KunneIkkeUtbetale.left()
122+
return KunneIkkeUtbetale(
123+
request = request,
124+
response = response,
125+
responseStatus = status,
126+
).left()
124127
}
125128

126129
401, 403 -> {
@@ -131,7 +134,11 @@ private fun mapStatus(
131134
sikkerlogg.error(RuntimeException("Trigger stacktrace for enklere debug.")) {
132135
"$status fra helved utsjekk, for utbetalingsvedtak ${vedtak.id}. Denne vil bli prøvd på nytt. Response: $response. Request = $request"
133136
}
134-
return KunneIkkeUtbetale.left()
137+
return KunneIkkeUtbetale(
138+
request = request,
139+
response = response,
140+
responseStatus = status,
141+
).left()
135142
}
136143

137144
409 -> {
@@ -155,7 +162,11 @@ private fun mapStatus(
155162
sikkerlogg.error(RuntimeException("Trigger stacktrace for enklere debug.")) {
156163
"409 Conflict fra helved utsjekk, for utbetalingsvedtak ${vedtak.id}. Vi forventet responsen 'Iverksettingen er allerede mottatt', men fikk $response. Request = $request"
157164
}
158-
return KunneIkkeUtbetale.left()
165+
return KunneIkkeUtbetale(
166+
request = request,
167+
response = response,
168+
responseStatus = status,
169+
).left()
159170
}
160171
}
161172

@@ -166,7 +177,11 @@ private fun mapStatus(
166177
sikkerlogg.error(RuntimeException("Trigger stacktrace for enklere debug.")) {
167178
"Ukjent feil fra helved utsjekk, for utbetalingsvedtak ${vedtak.id}. Denne vil bli prøvd på nytt. Statuskode: $status, response: $response. Request = $request"
168179
}
169-
return KunneIkkeUtbetale.left()
180+
return KunneIkkeUtbetale(
181+
request = request,
182+
response = response,
183+
responseStatus = status,
184+
).left()
170185
}
171186
}
172187
}

Diff for: app/src/main/kotlin/no/nav/tiltakspenger/vedtak/repository/utbetaling/UtbetalingResponseEx.kt

+24-3
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,35 @@ package no.nav.tiltakspenger.vedtak.repository.utbetaling
22

33
import com.fasterxml.jackson.databind.node.TextNode
44
import no.nav.tiltakspenger.libs.json.objectMapper
5+
import no.nav.tiltakspenger.saksbehandling.ports.KunneIkkeUtbetale
56
import no.nav.tiltakspenger.saksbehandling.ports.SendtUtbetaling
67

78
fun SendtUtbetaling.toJson(): String {
9+
return serialiserRequestResponse(
10+
request = this.request,
11+
response = this.response,
12+
responseStatus = this.responseStatus,
13+
)
14+
}
15+
16+
fun KunneIkkeUtbetale.toJson(): String {
17+
return serialiserRequestResponse(
18+
request = this.request,
19+
response = this.response,
20+
responseStatus = this.responseStatus,
21+
)
22+
}
23+
24+
private fun serialiserRequestResponse(
25+
request: String?,
26+
response: String?,
27+
responseStatus: Int?,
28+
): String {
829
return """
930
{
10-
"request": ${this.request.toValidJson()},
11-
"response": ${this.response.toValidJson()},
12-
"responseStatus": ${this.responseStatus}
31+
"request": ${request?.toValidJson()},
32+
"response": ${response?.toValidJson()},
33+
"responseStatus": $responseStatus
1334
}
1435
""".trimIndent()
1536
}

Diff for: app/src/main/kotlin/no/nav/tiltakspenger/vedtak/repository/utbetaling/UtbetalingsvedtakPostgresRepo.kt

+23
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import no.nav.tiltakspenger.libs.persistering.domene.TransactionContext
1212
import no.nav.tiltakspenger.libs.persistering.infrastruktur.PostgresSessionFactory
1313
import no.nav.tiltakspenger.meldekort.domene.MeldekortBehandling.MeldekortBehandlet
1414
import no.nav.tiltakspenger.saksbehandling.domene.sak.Saksnummer
15+
import no.nav.tiltakspenger.saksbehandling.ports.KunneIkkeUtbetale
1516
import no.nav.tiltakspenger.saksbehandling.ports.SendtUtbetaling
1617
import no.nav.tiltakspenger.utbetaling.domene.Utbetalinger
1718
import no.nav.tiltakspenger.utbetaling.domene.Utbetalingsvedtak
@@ -79,6 +80,28 @@ internal class UtbetalingsvedtakPostgresRepo(
7980
}
8081
}
8182

83+
override fun lagreFeilResponsFraUtbetaling(
84+
vedtakId: VedtakId,
85+
utbetalingsrespons: KunneIkkeUtbetale,
86+
) {
87+
sessionFactory.withSession { session ->
88+
session.run(
89+
queryOf(
90+
//language=SQL
91+
"""
92+
update utbetalingsvedtak
93+
set utbetaling_metadata = to_jsonb(:metadata::jsonb)
94+
where id = :id
95+
""".trimIndent(),
96+
mapOf(
97+
"id" to vedtakId.toString(),
98+
"metadata" to utbetalingsrespons.toJson(),
99+
),
100+
).asUpdate,
101+
)
102+
}
103+
}
104+
82105
override fun markerJournalført(
83106
vedtakId: VedtakId,
84107
journalpostId: JournalpostId,

Diff for: app/src/test/kotlin/no/nav/tiltakspenger/vedtak/repository/utbetaling/UtbetalingsvedtakRepoImplTest.kt

+26-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import no.nav.tiltakspenger.felles.april
77
import no.nav.tiltakspenger.felles.januar
88
import no.nav.tiltakspenger.felles.journalføring.JournalpostId
99
import no.nav.tiltakspenger.felles.nå
10+
import no.nav.tiltakspenger.saksbehandling.ports.KunneIkkeUtbetale
1011
import no.nav.tiltakspenger.saksbehandling.ports.SendtUtbetaling
1112
import no.nav.tiltakspenger.utbetaling.domene.opprettUtbetalingsvedtak
1213
import org.junit.jupiter.api.Test
@@ -17,24 +18,24 @@ class UtbetalingsvedtakRepoImplTest {
1718
fun `kan lagre og hente`() {
1819
val tidspunkt = nå()
1920
withMigratedDb(runIsolated = true) { testDataHelper ->
20-
2121
val (sak, meldekort) = testDataHelper.persisterRammevedtakMedBehandletMeldekort(
2222
deltakelseFom = 2.januar(2023),
2323
deltakelseTom = 2.april(2023),
2424
)
2525
val utbetalingsvedtakRepo = testDataHelper.utbetalingsvedtakRepo as UtbetalingsvedtakPostgresRepo
2626
val utbetalingsvedtak = meldekort.opprettUtbetalingsvedtak(sak.saksnummer, sak.fnr, null)
27+
// Utbetaling
2728
utbetalingsvedtakRepo.lagre(utbetalingsvedtak)
2829
utbetalingsvedtakRepo.hentUtbetalingsvedtakForUtsjekk() shouldBe listOf(utbetalingsvedtak)
29-
utbetalingsvedtakRepo.hentUtbetalingsvedtakForUtsjekk() shouldBe listOf(utbetalingsvedtak)
3030
utbetalingsvedtakRepo.markerSendtTilUtbetaling(
3131
vedtakId = utbetalingsvedtak.id,
3232
tidspunkt = tidspunkt,
3333
utbetalingsrespons = SendtUtbetaling("myReq", "myRes", 202),
3434
)
3535
utbetalingsvedtakRepo.hentUtbetalingJsonForVedtakId(utbetalingsvedtak.id) shouldBe "myReq"
36-
3736
utbetalingsvedtakRepo.hentUtbetalingsvedtakForUtsjekk() shouldBe emptyList()
37+
38+
// Journalføring
3839
val oppdatertMedUtbetalingsdata = testDataHelper.sessionFactory.withSession { session ->
3940
UtbetalingsvedtakPostgresRepo.hentForSakId(sak.id, session)
4041
}
@@ -47,4 +48,26 @@ class UtbetalingsvedtakRepoImplTest {
4748
utbetalingsvedtakRepo.hentDeSomSkalJournalføres() shouldBe emptyList()
4849
}
4950
}
51+
52+
@Test
53+
fun `kan lagre feil ved utbetaling`() {
54+
withMigratedDb(runIsolated = true) { testDataHelper ->
55+
val (sak, meldekort) = testDataHelper.persisterRammevedtakMedBehandletMeldekort(
56+
deltakelseFom = 2.januar(2023),
57+
deltakelseTom = 2.april(2023),
58+
)
59+
val utbetalingsvedtakRepo = testDataHelper.utbetalingsvedtakRepo as UtbetalingsvedtakPostgresRepo
60+
// Utbetaling
61+
val utbetalingsvedtak = meldekort.opprettUtbetalingsvedtak(sak.saksnummer, sak.fnr, null)
62+
utbetalingsvedtakRepo.lagre(utbetalingsvedtak)
63+
64+
utbetalingsvedtakRepo.hentUtbetalingsvedtakForUtsjekk() shouldBe listOf(utbetalingsvedtak)
65+
utbetalingsvedtakRepo.lagreFeilResponsFraUtbetaling(
66+
vedtakId = utbetalingsvedtak.id,
67+
utbetalingsrespons = KunneIkkeUtbetale("myFailedReq", "myFailedRes", 409),
68+
)
69+
utbetalingsvedtakRepo.hentUtbetalingJsonForVedtakId(utbetalingsvedtak.id) shouldBe "myFailedReq"
70+
utbetalingsvedtakRepo.hentUtbetalingsvedtakForUtsjekk() shouldBe listOf(utbetalingsvedtak)
71+
}
72+
}
5073
}

Diff for: domene/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/ports/UtbetalingGateway.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ interface UtbetalingGateway {
1212
): Either<KunneIkkeUtbetale, SendtUtbetaling>
1313
}
1414

15-
object KunneIkkeUtbetale
15+
class KunneIkkeUtbetale(
16+
val request: String? = null,
17+
val response: String? = null,
18+
val responseStatus: Int? = null,
19+
)
1620

1721
data class SendtUtbetaling(
1822
val request: String,

Diff for: domene/src/main/kotlin/no/nav/tiltakspenger/utbetaling/ports/UtbetalingsvedtakRepo.kt

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package no.nav.tiltakspenger.utbetaling.ports
33
import no.nav.tiltakspenger.felles.journalføring.JournalpostId
44
import no.nav.tiltakspenger.libs.common.VedtakId
55
import no.nav.tiltakspenger.libs.persistering.domene.TransactionContext
6+
import no.nav.tiltakspenger.saksbehandling.ports.KunneIkkeUtbetale
67
import no.nav.tiltakspenger.saksbehandling.ports.SendtUtbetaling
78
import no.nav.tiltakspenger.utbetaling.domene.Utbetalingsvedtak
89
import java.time.LocalDateTime
@@ -16,6 +17,11 @@ interface UtbetalingsvedtakRepo {
1617
utbetalingsrespons: SendtUtbetaling,
1718
)
1819

20+
fun lagreFeilResponsFraUtbetaling(
21+
vedtakId: VedtakId,
22+
utbetalingsrespons: KunneIkkeUtbetale,
23+
)
24+
1925
fun markerJournalført(
2026
vedtakId: VedtakId,
2127
journalpostId: JournalpostId,

Diff for: domene/src/main/kotlin/no/nav/tiltakspenger/utbetaling/service/SendUtbetalingerService.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,16 @@ class SendUtbetalingerService(
2222
val correlationId = CorrelationId.generate()
2323
Either.catch {
2424
val forrigeUtbetalingJson =
25-
utbetalingsvedtak.forrigeUtbetalingsvedtakId?.let {
26-
utbetalingsvedtakRepo.hentUtbetalingJsonForVedtakId(
27-
it,
28-
)
25+
utbetalingsvedtak.forrigeUtbetalingsvedtakId?.let { forrigeUtbetalingsvedtakId ->
26+
utbetalingsvedtakRepo.hentUtbetalingJsonForVedtakId(forrigeUtbetalingsvedtakId)
2927
}
3028
utbetalingsklient.iverksett(utbetalingsvedtak, forrigeUtbetalingJson, correlationId).onRight {
3129
logger.info { "Utbetaling iverksatt for vedtak ${utbetalingsvedtak.id}" }
3230
utbetalingsvedtakRepo.markerSendtTilUtbetaling(utbetalingsvedtak.id, nå(), it)
3331
logger.info { "Utbetaling markert som utbetalt for vedtak ${utbetalingsvedtak.id}" }
3432
}.onLeft {
3533
logger.error { "Utbetaling kunne ikke iverksettes. Saksnummer: ${utbetalingsvedtak.saksnummer}, sakId: ${utbetalingsvedtak.sakId}, utbetalingsvedtakId: ${utbetalingsvedtak.id}" }
34+
utbetalingsvedtakRepo.lagreFeilResponsFraUtbetaling(utbetalingsvedtak.id, it)
3635
}
3736
}.onLeft {
3837
logger.error(it) { "Ukjent feil skjedde under iverksetting av utbetaling. Saksnummer: ${utbetalingsvedtak.saksnummer}, sakId: ${utbetalingsvedtak.sakId}, utbetalingsvedtakId: ${utbetalingsvedtak.id}" }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package no.nav.tiltakspenger.utbetaling.service
2+
3+
import arrow.core.Either
4+
import io.mockk.coEvery
5+
import io.mockk.every
6+
import io.mockk.justRun
7+
import io.mockk.mockk
8+
import io.mockk.verify
9+
import kotlinx.coroutines.test.runTest
10+
import no.nav.tiltakspenger.objectmothers.ObjectMother
11+
import no.nav.tiltakspenger.saksbehandling.ports.KunneIkkeUtbetale
12+
import no.nav.tiltakspenger.saksbehandling.ports.SendtUtbetaling
13+
import no.nav.tiltakspenger.saksbehandling.ports.UtbetalingGateway
14+
import no.nav.tiltakspenger.utbetaling.ports.UtbetalingsvedtakRepo
15+
import kotlin.test.Test
16+
17+
internal class SendUtbetalingerServiceTest {
18+
private val utbetalingsvedtakRepo = mockk<UtbetalingsvedtakRepo>()
19+
private val utbetalingsklient = mockk<UtbetalingGateway>()
20+
private val sendUtbetalingerService = SendUtbetalingerService(utbetalingsvedtakRepo, utbetalingsklient)
21+
22+
@Test
23+
fun `utbetaling blir iverksatt og markert som sendt til utbetaling`() = runTest {
24+
val utbetalingsvedtak = ObjectMother.utbetalingsvedtak()
25+
26+
every { utbetalingsvedtakRepo.hentUtbetalingsvedtakForUtsjekk() } returns listOf(utbetalingsvedtak)
27+
val sendtUtbetaling = SendtUtbetaling("req", "res", 202)
28+
coEvery { utbetalingsklient.iverksett(any(), any(), any()) } returns Either.Right(sendtUtbetaling)
29+
justRun { utbetalingsvedtakRepo.markerSendtTilUtbetaling(utbetalingsvedtak.id, any(), sendtUtbetaling) }
30+
31+
sendUtbetalingerService.send()
32+
33+
verify(exactly = 1) {
34+
utbetalingsvedtakRepo.markerSendtTilUtbetaling(
35+
utbetalingsvedtak.id,
36+
any(),
37+
sendtUtbetaling,
38+
)
39+
}
40+
}
41+
42+
@Test
43+
fun `feilrespons fra utbetaling lagres`() = runTest {
44+
val utbetalingsvedtak = ObjectMother.utbetalingsvedtak()
45+
46+
every { utbetalingsvedtakRepo.hentUtbetalingsvedtakForUtsjekk() } returns listOf(utbetalingsvedtak)
47+
val kunneIkkeUtbetale = KunneIkkeUtbetale("req", "res", 409)
48+
coEvery { utbetalingsklient.iverksett(any(), any(), any()) } returns Either.Left(kunneIkkeUtbetale)
49+
justRun { utbetalingsvedtakRepo.lagreFeilResponsFraUtbetaling(utbetalingsvedtak.id, kunneIkkeUtbetale) }
50+
51+
sendUtbetalingerService.send()
52+
53+
verify(exactly = 1) {
54+
utbetalingsvedtakRepo.lagreFeilResponsFraUtbetaling(
55+
utbetalingsvedtak.id,
56+
kunneIkkeUtbetale,
57+
)
58+
}
59+
}
60+
}

Diff for: test-common/src/main/kotlin/no/nav/tiltakspenger/fakes/repos/UtbetalingsvedtakFakeRepo.kt

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import no.nav.tiltakspenger.felles.journalføring.JournalpostId
55
import no.nav.tiltakspenger.libs.common.SakId
66
import no.nav.tiltakspenger.libs.common.VedtakId
77
import no.nav.tiltakspenger.libs.persistering.domene.TransactionContext
8+
import no.nav.tiltakspenger.saksbehandling.ports.KunneIkkeUtbetale
89
import no.nav.tiltakspenger.saksbehandling.ports.SendtUtbetaling
910
import no.nav.tiltakspenger.utbetaling.domene.Utbetalinger
1011
import no.nav.tiltakspenger.utbetaling.domene.Utbetalingsvedtak
@@ -26,6 +27,10 @@ class UtbetalingsvedtakFakeRepo : UtbetalingsvedtakRepo {
2627
data.get()[vedtakId] = data.get()[vedtakId]!!.copy(sendtTilUtbetaling = tidspunkt)
2728
}
2829

30+
override fun lagreFeilResponsFraUtbetaling(vedtakId: VedtakId, utbetalingsrespons: KunneIkkeUtbetale) {
31+
data.get()[vedtakId] = data.get()[vedtakId]!!.copy(sendtTilUtbetaling = null)
32+
}
33+
2934
override fun markerJournalført(
3035
vedtakId: VedtakId,
3136
journalpostId: JournalpostId,

0 commit comments

Comments
 (0)