Skip to content
This repository has been archived by the owner on Mar 28, 2023. It is now read-only.

Commit

Permalink
Merge pull request #102 from navikt/aareg_arbeidsforhold_fix
Browse files Browse the repository at this point in the history
Forsøker ny metode for å slå sammen overlappende perioder i flere arb…
  • Loading branch information
maccyber authored May 11, 2022
2 parents 7967793 + 6c9a0d6 commit c3c5a31
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import org.valiktor.Validator

class ArbeidsforholdConstraint : CustomConstraint

val MAKS_DAGER_OPPHOLD = 3L
const val MAKS_DAGER_OPPHOLD = 3L

fun <E> Validator<E>.Property<Iterable<Arbeidsgiverperiode>?>.måHaAktivtArbeidsforhold(
refusjonskrav: RefusjonskravDto,
Expand All @@ -20,49 +20,47 @@ fun <E> Validator<E>.Property<Iterable<Arbeidsgiverperiode>?>.måHaAktivtArbeids

val sammenhengedePerioder = slåSammenPerioder(ansattPerioder)

return@validate refusjonskrav.perioder.all { kravPeriode ->
refusjonskrav.perioder.all { kravPeriode ->
sammenhengedePerioder.any { ansattPeriode ->
(ansattPeriode.tom == null || kravPeriode.tom.isBefore(ansattPeriode.tom) || kravPeriode.tom == ansattPeriode.tom) &&
ansattPeriode.fom!!.isBefore(kravPeriode.fom)
} || ansattPerioder.any { ansattPeriode ->
(ansattPeriode.tom == null || kravPeriode.tom.isBefore(ansattPeriode.tom) || kravPeriode.tom == ansattPeriode.tom) &&
ansattPeriode.fom!!.isBefore(kravPeriode.fom)
}
}
}

fun slåSammenPerioder(list: List<Periode>): List<Periode> {
if (list.size < 2) return list
fun slåSammenPerioder(arbeidsforholdPerioder: List<Periode>): List<Periode> {
if (arbeidsforholdPerioder.size < 2) return arbeidsforholdPerioder

val remainingPeriods = list
.sortedBy { it.fom }
val perioder = arbeidsforholdPerioder
.sortedWith(compareBy(Periode::fom, Periode::tom))
.toMutableList()

val merged = ArrayList<Periode>()

do {
var currentPeriod = remainingPeriods[0]
remainingPeriods.removeAt(0)
// Legg til første periode
val sammenhengedePerioder = mutableListOf(perioder.removeFirst())

do {
val connectedPeriod = remainingPeriods
.find { !oppholdMellomPerioderOverstigerDager(currentPeriod, it, MAKS_DAGER_OPPHOLD) }
if (connectedPeriod != null) {
currentPeriod = Periode(currentPeriod.fom, connectedPeriod.tom)
remainingPeriods.remove(connectedPeriod)
perioder.forEach { gjeldendePeriode ->
val forrigePeriode = sammenhengedePerioder.last()
// Hvis periode gjeldendePeriode og forrigePeriode overlapper
if (overlapperPeriode(gjeldendePeriode, forrigePeriode)) {
// Hvis gjeldendePeriode.tom er null eller før forrigePeriode.tom oppdater forrigePeriode
if (gjeldendePeriode.tom == null || gjeldendePeriode.tom!! > forrigePeriode.tom) {
sammenhengedePerioder[sammenhengedePerioder.lastIndex] = Periode(forrigePeriode.fom, gjeldendePeriode.tom)
}
} while (connectedPeriod != null)
return@forEach
}

merged.add(currentPeriod)
} while (remainingPeriods.isNotEmpty())
sammenhengedePerioder.add(gjeldendePeriode)
}

return merged
return sammenhengedePerioder
}

fun oppholdMellomPerioderOverstigerDager(
a1: Periode,
a2: Periode,
dager: Long
fun overlapperPeriode(
gjeldendePeriode: Periode,
forrigePeriode: Periode
): Boolean {
return a1.tom?.plusDays(dager)?.isBefore(a2.fom) ?: true
if (forrigePeriode.tom == null) return true
val gjeldendePeriodeFom = gjeldendePeriode.fom!!.minusDays(MAKS_DAGER_OPPHOLD)
// Hvis gjeldende periode (fra og med) er før eller lik som forrige periode (til og med)
return gjeldendePeriodeFom <= forrigePeriode.tom
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ internal class AaregConstraintsTest {

// Endre til perioden kravet gjelder
val arbeidsgiverPeriode = Arbeidsgiverperiode(
LocalDate.of(2021, 1, 15),
LocalDate.of(2021, 1, 20),
of(2021, 1, 15),
of(2021, 1, 20),
4,
beloep = 2.0
)
Expand Down Expand Up @@ -180,43 +180,55 @@ internal class AaregConstraintsTest {
refusjonskravDto.validate(arbeidsForhold)
}
}
}

@Test
fun `merge fragmented periods`() {
assertThat(
slåSammenPerioder(
listOf(
// skal ble merget til 1 periode fra 1.1.21 til 28.2.21
Periode(LocalDate.of(2021, 1, 1), LocalDate.of(2021, 1, 29)),
Periode(LocalDate.of(2021, 2, 1), LocalDate.of(2021, 2, 13)),
Periode(LocalDate.of(2021, 2, 15), LocalDate.of(2021, 2, 28)),

// skal bli merget til 1
Periode(LocalDate.of(2021, 3, 20), LocalDate.of(2021, 3, 31)),
Periode(LocalDate.of(2021, 4, 2), LocalDate.of(2021, 4, 30)),

// skal bli merget til 1
Periode(LocalDate.of(2021, 7, 1), LocalDate.of(2021, 8, 30)),
Periode(LocalDate.of(2021, 9, 1), null),
@Test
fun `merge fragmented periods`() {
assertThat(
slåSammenPerioder(
listOf(
// skal ble merget til 1 periode fra 1.1.21 til 28.2.21
Periode(of(2021, 1, 1), of(2021, 1, 29)),
Periode(of(2021, 2, 1), of(2021, 2, 13)),
Periode(of(2021, 2, 15), of(2021, 2, 28)),

// skal bli merget til 1
Periode(of(2021, 3, 20), of(2021, 3, 31)),
Periode(of(2021, 4, 2), of(2021, 4, 30)),

// skal bli merget til 1
Periode(of(2021, 7, 1), of(2021, 8, 30)),
Periode(of(2021, 9, 1), null),
)
)
)
).hasSize(3)
).hasSize(3)

assertThat(
slåSammenPerioder(
listOf(
Periode(LocalDate.of(2021, 1, 1), LocalDate.of(2021, 1, 29)),
Periode(LocalDate.of(2021, 9, 1), null),
assertThat(
slåSammenPerioder(
listOf(
Periode(of(2021, 1, 1), of(2021, 1, 29)),
Periode(of(2021, 9, 1), null),
)
)
)
).hasSize(2)
).hasSize(2)

assertThat(
slåSammenPerioder(
listOf(
Periode(LocalDate.of(2021, 9, 1), null),
assertThat(
slåSammenPerioder(
listOf(
Periode(of(2021, 9, 1), null),
)
)
)
).hasSize(1)
).hasSize(1)

assertThat(
slåSammenPerioder(
listOf(
Periode(of(2022, 2, 1), null),
Periode(of(2005, 12, 1), of(2014, 12, 31)),
Periode(of(1984, 10, 20), of(2000, 10, 25)),
Periode(of(1984, 10, 20), of(1993, 10, 24)),
Periode(of(1984, 10, 20), of(2022, 1, 31)),
)
)
).hasSize(1)
}
}

0 comments on commit c3c5a31

Please sign in to comment.