Skip to content

Commit b64fc46

Browse files
committed
Fix algoritme som finner saker som mangler meldeperioder
1 parent 2861a83 commit b64fc46

File tree

9 files changed

+68
-18
lines changed

9 files changed

+68
-18
lines changed

app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/GenererMeldeperioderService.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ class GenererMeldeperioderService(
2424
val sak = sakRepo.hentForSakId(sakId)!!
2525
val (sakMedNyeMeldeperioder, meldeperioder) = sak.genererMeldeperioder(clock)
2626
sessionFactory.withTransactionContext { tx ->
27-
sakRepo.oppdaterSisteDagSomGirRett(
27+
sakRepo.oppdaterFørsteOgSisteDagSomGirRett(
2828
sakId = sakId,
29+
førsteDagSomGirRett = sakMedNyeMeldeperioder.førsteDagSomGirRett,
2930
sisteDagSomGirRett = sakMedNyeMeldeperioder.sisteDagSomGirRett,
3031
sessionContext = tx,
3132
)

app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/sak/SakPostgresRepo.kt

+22-5
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,9 @@ internal class SakPostgresRepo(
185185
}
186186
}
187187

188-
override fun oppdaterSisteDagSomGirRett(
188+
override fun oppdaterFørsteOgSisteDagSomGirRett(
189189
sakId: SakId,
190+
rsteDagSomGirRett: LocalDate?,
190191
sisteDagSomGirRett: LocalDate?,
191192
sessionContext: SessionContext?,
192193
) {
@@ -195,9 +196,10 @@ internal class SakPostgresRepo(
195196
session.run(
196197
queryOf(
197198
"""
198-
update sak set siste_dag_som_gir_rett = :siste_dag_som_gir_rett where id = :sak_id
199+
update sak set første_dag_som_gir_rett = :forste_dag_som_gir_rett, siste_dag_som_gir_rett = :siste_dag_som_gir_rett where id = :sak_id
199200
""".trimIndent(),
200201
mapOf(
202+
"forste_dag_som_gir_rett" to førsteDagSomGirRett,
201203
"siste_dag_som_gir_rett" to sisteDagSomGirRett,
202204
"sak_id" to sakId.toString(),
203205
),
@@ -214,10 +216,25 @@ internal class SakPostgresRepo(
214216
queryOf(
215217
// language=SQL
216218
"""
217-
with temp as (
218-
select s.id, s.siste_dag_som_gir_rett, max(m.til_og_med) as til_og_med from sak s join meldeperiode m on s.id = m.sak_id group by s.id
219+
select s.id, s.siste_dag_som_gir_rett, max(m.til_og_med) as til_og_med
220+
from sak s
221+
left join meldeperiode m on s.id = m.sak_id
222+
group by s.id
223+
having (
224+
-- Case 1: Has meldeperioder but needs more
225+
(
226+
max(m.til_og_med) is not null
227+
and max(m.til_og_med) < s.siste_dag_som_gir_rett
228+
and max(m.til_og_med) < :ikkeGenererEtter
229+
)
230+
or
231+
-- Case 2: Has no meldeperioder (max will be null)
232+
(
233+
max(m.til_og_med) is null
234+
and s.første_dag_som_gir_rett <= :ikkeGenererEtter
235+
)
219236
)
220-
select * from temp where til_og_med < siste_dag_som_gir_rett and til_og_med < :ikkeGenererEtter limit $limit;
237+
limit $limit;
221238
""".trimIndent(),
222239
mapOf("ikkeGenererEtter" to ikkeGenererEtter),
223240
).map {

app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/saksbehandling/ports/SakRepo.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@ interface SakRepo {
4141
*
4242
* Ment for å optimalisere db-spørringer (generering av meldeperioder)
4343
*/
44-
fun oppdaterSisteDagSomGirRett(
44+
fun oppdaterFørsteOgSisteDagSomGirRett(
4545
sakId: SakId,
46+
rsteDagSomGirRett: LocalDate?,
4647
sisteDagSomGirRett: LocalDate?,
4748
sessionContext: SessionContext? = null,
4849
)

app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/saksbehandling/service/behandling/IverksettBehandlingService.kt

+12-2
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,12 @@ class IverksettBehandlingService(
138138
// Dersom denne endres til søknadsbehandling og vi kan ha mer enn 1 for en sak og den kan overlappe den eksistrende saksperioden, må den legge til nye versjoner av meldeperiodene her.
139139
sessionFactory.withTransactionContext { tx ->
140140
behandlingRepo.lagre(vedtak.behandling, tx)
141-
sakService.oppdaterSisteDagSomGirRett(oppdatertSak.id, oppdatertSak.sisteDagSomGirRett, tx)
141+
sakService.oppdaterSisteDagSomGirRett(
142+
sakId = oppdatertSak.id,
143+
førsteDagSomGirRett = oppdatertSak.førsteDagSomGirRett,
144+
sisteDagSomGirRett = oppdatertSak.sisteDagSomGirRett,
145+
sessionContext = tx,
146+
)
142147
rammevedtakRepo.lagre(vedtak, tx)
143148
statistikkSakRepo.lagre(sakStatistikk, tx)
144149
statistikkStønadRepo.lagre(stønadStatistikk, tx)
@@ -159,7 +164,12 @@ class IverksettBehandlingService(
159164
// journalføring og dokumentdistribusjon skjer i egen jobb
160165
sessionFactory.withTransactionContext { tx ->
161166
behandlingRepo.lagre(vedtak.behandling, tx)
162-
sakService.oppdaterSisteDagSomGirRett(oppdatertSak.id, oppdatertSak.sisteDagSomGirRett, tx)
167+
sakService.oppdaterSisteDagSomGirRett(
168+
sakId = oppdatertSak.id,
169+
førsteDagSomGirRett = oppdatertSak.førsteDagSomGirRett,
170+
sisteDagSomGirRett = oppdatertSak.sisteDagSomGirRett,
171+
sessionContext = tx,
172+
)
163173
rammevedtakRepo.lagre(vedtak, tx)
164174
statistikkSakRepo.lagre(sakStatistikk, tx)
165175
statistikkStønadRepo.lagre(stønadStatistikk, tx)

app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/saksbehandling/service/sak/SakService.kt

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ interface SakService {
6767
*/
6868
fun oppdaterSisteDagSomGirRett(
6969
sakId: SakId,
70+
rsteDagSomGirRett: LocalDate?,
7071
sisteDagSomGirRett: LocalDate?,
7172
sessionContext: SessionContext,
7273
)

app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/saksbehandling/service/sak/SakServiceImpl.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,13 @@ class SakServiceImpl(
204204
*/
205205
override fun oppdaterSisteDagSomGirRett(
206206
sakId: SakId,
207+
rsteDagSomGirRett: LocalDate?,
207208
sisteDagSomGirRett: LocalDate?,
208209
sessionContext: SessionContext,
209210
) {
210-
sakRepo.oppdaterSisteDagSomGirRett(
211+
sakRepo.oppdaterFørsteOgSisteDagSomGirRett(
211212
sakId = sakId,
213+
førsteDagSomGirRett = førsteDagSomGirRett,
212214
sisteDagSomGirRett = sisteDagSomGirRett,
213215
sessionContext = sessionContext,
214216
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
ALTER TABLE sak
2+
ADD COLUMN IF NOT EXISTS første_dag_som_gir_rett DATE;
3+
4+
UPDATE sak s
5+
SET første_dag_som_gir_rett = (SELECT MAX(m.fra_og_med)
6+
FROM meldeperiode m
7+
WHERE m.sak_id = s.id)
8+
WHERE s.første_dag_som_gir_rett IS NULL;

app/src/test/kotlin/no/nav/tiltakspenger/saksbehandling/fakes/repos/SakFakeRepo.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,9 @@ class SakFakeRepo(
8888
return hentSak(sakId)
8989
}
9090

91-
override fun oppdaterSisteDagSomGirRett(
91+
override fun oppdaterFørsteOgSisteDagSomGirRett(
9292
sakId: SakId,
93+
rsteDagSomGirRett: LocalDate?,
9394
sisteDagSomGirRett: LocalDate?,
9495
sessionContext: SessionContext?,
9596
) {

app/src/test/kotlin/no/nav/tiltakspenger/saksbehandling/repository/sak/SakRepoTest.kt

+16-7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import no.nav.tiltakspenger.saksbehandling.db.persisterNySak
99
import no.nav.tiltakspenger.saksbehandling.db.persisterOpprettetFørstegangsbehandling
1010
import no.nav.tiltakspenger.saksbehandling.db.persisterSak
1111
import no.nav.tiltakspenger.saksbehandling.db.withMigratedDb
12+
import no.nav.tiltakspenger.saksbehandling.felles.desember
1213
import no.nav.tiltakspenger.saksbehandling.felles.februar
1314
import no.nav.tiltakspenger.saksbehandling.felles.januar
1415
import no.nav.tiltakspenger.saksbehandling.objectmothers.ObjectMother
@@ -82,7 +83,7 @@ internal class SakRepoTest {
8283
deltakelseFom = 1.februar(2025),
8384
deltakelseTom = 28.februar(2025),
8485
)
85-
sakRepo.oppdaterSisteDagSomGirRett(sak.id, sak.sisteDagSomGirRett)
86+
sakRepo.oppdaterFørsteOgSisteDagSomGirRett(sak.id, sak.førsteDagSomGirRett, sak.sisteDagSomGirRett)
8687
sak.meldeperiodeKjeder.meldeperioder.size shouldBe 3
8788
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(1.februar(2025)) shouldBe emptyList()
8889
}
@@ -101,10 +102,11 @@ internal class SakRepoTest {
101102
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(1.januar(2000)) shouldBe emptyList()
102103
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(1.januar(2025)) shouldBe emptyList()
103104
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(1.januar(2050)) shouldBe emptyList()
104-
// Later som det finnes et vedtak som siste dag gir rett 31.januar(2025)
105-
sakRepo.oppdaterSisteDagSomGirRett(sak.id, 31.januar(2025))
106-
// TODO jah: Virkelig bug som må fikses. Vi må også persistere førsteDagSomGirRett, for å kunne avgjøre om vi skal generere en meldeperiode dersom det ikke finnes meldeperioder fra før.
107-
// meldeperiodeRepo.hentSakerSomMåGenerereMeldeperioderFra(ikkeGenererEtter = 1.januar(2050)) shouldBe listOf(sak)
105+
// Later som det finnes et vedtak med innvilgelsesperiode hele januar 2025
106+
sakRepo.oppdaterFørsteOgSisteDagSomGirRett(sak.id, 1.januar(2025), 31.januar(2025))
107+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(ikkeGenererEtter = 31.desember(2024)) shouldBe emptyList()
108+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(ikkeGenererEtter = 1.januar(2025)) shouldBe listOf(sak.id)
109+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(ikkeGenererEtter = 1.januar(2050)) shouldBe listOf(sak.id)
108110

109111
testDataHelper.sessionFactory.withSessionContext {
110112
meldeperiodeRepo.lagre(
@@ -119,6 +121,7 @@ internal class SakRepoTest {
119121

120122
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(19.januar(2025)) shouldBe emptyList()
121123
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(20.januar(2025)) shouldBe listOf(sak.id)
124+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(20.januar(2050)) shouldBe listOf(sak.id)
122125
testDataHelper.sessionFactory.withSessionContext {
123126
meldeperiodeRepo.lagre(
124127
ObjectMother.meldeperiode(
@@ -129,14 +132,20 @@ internal class SakRepoTest {
129132
it,
130133
)
131134
}
135+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(19.januar(2000)) shouldBe emptyList()
132136
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(19.januar(2025)) shouldBe emptyList()
137+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(19.januar(2050)) shouldBe emptyList()
133138

134-
sakRepo.oppdaterSisteDagSomGirRett(sak.id, 2.februar(2025))
139+
sakRepo.oppdaterFørsteOgSisteDagSomGirRett(sak.id, 1.januar(2025), 2.februar(2025))
140+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(2.februar(2000)) shouldBe emptyList()
135141
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(2.februar(2025)) shouldBe emptyList()
142+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(2.februar(2050)) shouldBe emptyList()
136143

137-
sakRepo.oppdaterSisteDagSomGirRett(sak.id, 3.februar(2025))
144+
sakRepo.oppdaterFørsteOgSisteDagSomGirRett(sak.id, 1.januar(2025), 3.februar(2025))
145+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(2.februar(2000)) shouldBe emptyList()
138146
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(2.februar(2025)) shouldBe emptyList()
139147
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(3.februar(2025)) shouldBe listOf(sak.id)
148+
sakRepo.hentSakerSomMåGenerereMeldeperioderFra(3.februar(2050)) shouldBe listOf(sak.id)
140149
}
141150
}
142151
}

0 commit comments

Comments
 (0)