Skip to content

Commit f8d4e26

Browse files
authored
Feature/soknadsammensloer (#222)
* Legger til løsning for å slå sammen søknadsdata.
1 parent cce1883 commit f8d4e26

File tree

12 files changed

+672
-34
lines changed

12 files changed

+672
-34
lines changed

innsyn/pom.xml

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,41 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<project xmlns="http://maven.apache.org/POM/4.0.0"
3-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5-
<parent>
6-
<artifactId>k9-format</artifactId>
7-
<groupId>no.nav.k9</groupId>
8-
<version>${revision}${sha1}${changelist}</version>
9-
</parent>
10-
<modelVersion>4.0.0</modelVersion>
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>k9-format</artifactId>
7+
<groupId>no.nav.k9</groupId>
8+
<version>${revision}${sha1}${changelist}</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
1111

12-
<artifactId>innsyn</artifactId>
13-
<packaging>jar</packaging>
12+
<artifactId>innsyn</artifactId>
13+
<packaging>jar</packaging>
1414

15-
<dependencies>
16-
<dependency>
17-
<groupId>com.fasterxml.jackson.core</groupId>
18-
<artifactId>jackson-databind</artifactId>
19-
</dependency>
20-
<dependency>
21-
<groupId>com.fasterxml.jackson.datatype</groupId>
22-
<artifactId>jackson-datatype-jsr310</artifactId>
23-
</dependency>
24-
<dependency>
25-
<groupId>com.fasterxml.jackson.datatype</groupId>
26-
<artifactId>jackson-datatype-jdk8</artifactId>
27-
</dependency>
28-
<dependency>
29-
<groupId>org.hibernate.validator</groupId>
30-
<artifactId>hibernate-validator</artifactId>
31-
</dependency>
32-
<dependency>
33-
<groupId>no.nav.k9</groupId>
34-
<artifactId>soknad</artifactId>
35-
</dependency>
36-
</dependencies>
15+
<dependencies>
16+
<dependency>
17+
<groupId>com.fasterxml.jackson.core</groupId>
18+
<artifactId>jackson-databind</artifactId>
19+
</dependency>
20+
<dependency>
21+
<groupId>com.fasterxml.jackson.datatype</groupId>
22+
<artifactId>jackson-datatype-jsr310</artifactId>
23+
</dependency>
24+
<dependency>
25+
<groupId>com.fasterxml.jackson.datatype</groupId>
26+
<artifactId>jackson-datatype-jdk8</artifactId>
27+
</dependency>
28+
<dependency>
29+
<groupId>org.hibernate.validator</groupId>
30+
<artifactId>hibernate-validator</artifactId>
31+
</dependency>
32+
<dependency>
33+
<groupId>no.nav.fpsak.tidsserie</groupId>
34+
<artifactId>fpsak-tidsserie</artifactId>
35+
</dependency>
36+
<dependency>
37+
<groupId>no.nav.k9</groupId>
38+
<artifactId>soknad</artifactId>
39+
</dependency>
40+
</dependencies>
3741
</project>
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package no.nav.k9.innsyn;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.stream.Collectors;
6+
7+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
8+
import no.nav.fpsak.tidsserie.StandardCombinators;
9+
import no.nav.k9.innsyn.søknadsammeslåer.Arbeidstidsammenslåer;
10+
import no.nav.k9.innsyn.søknadsammeslåer.Tilsynsammenslåer;
11+
import no.nav.k9.søknad.Søknad;
12+
import no.nav.k9.søknad.TidsserieUtils;
13+
import no.nav.k9.søknad.felles.type.Periode;
14+
import no.nav.k9.søknad.ytelse.psb.v1.PleiepengerSyktBarn;
15+
import no.nav.k9.søknad.ytelse.psb.v1.tilsyn.TilsynPeriodeInfo;
16+
import no.nav.k9.søknad.ytelse.psb.v1.tilsyn.Tilsynsordning;
17+
18+
public class Søknadsammenslåer {
19+
20+
public static Søknad kunPleietrengendedata(Søknad søknad) {
21+
if (!(søknad.getYtelse() instanceof PleiepengerSyktBarn)) {
22+
throw new IllegalArgumentException("Kun PSB-søknader er støttet.");
23+
}
24+
final PleiepengerSyktBarn ytelse = (PleiepengerSyktBarn) søknad.getYtelse();
25+
26+
final Map<Periode, TilsynPeriodeInfo> periodeMap = hentUtTilsynsperioder(ytelse);
27+
final PleiepengerSyktBarn resultatYtelse = new PleiepengerSyktBarn();
28+
resultatYtelse.medTilsynsordning(new Tilsynsordning().medPerioder(periodeMap));
29+
30+
return new Søknad().medYtelse(resultatYtelse);
31+
}
32+
33+
private static Map<Periode, TilsynPeriodeInfo> hentUtTilsynsperioder(final PleiepengerSyktBarn ytelse) {
34+
/*
35+
* Advarsel: Data som returneres her deles på tvers av søkere. Ikke legg inn
36+
* flere felter i mappingen hvis de ikke skal deles.
37+
*
38+
* Av denne grunn brukes ikke standard copy-contructor for Map/Tilsynordning
39+
*/
40+
return ytelse.getTilsynsordning()
41+
.getPerioder()
42+
.entrySet()
43+
.stream()
44+
.map(e -> Map.entry(
45+
new Periode(e.getKey()),
46+
new TilsynPeriodeInfo().medEtablertTilsynTimerPerDag(e.getValue().getEtablertTilsynTimerPerDag())
47+
))
48+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
49+
}
50+
51+
public static Søknad slåSammen(Søknad tidligereSøknad, Søknad nySøknad) {
52+
if (!(tidligereSøknad.getYtelse() instanceof PleiepengerSyktBarn) || !(nySøknad.getYtelse() instanceof PleiepengerSyktBarn)) {
53+
throw new IllegalArgumentException("Kun PSB-søknader er støttet.");
54+
}
55+
56+
final PleiepengerSyktBarn s1Ytelse = (PleiepengerSyktBarn) tidligereSøknad.getYtelse();
57+
final PleiepengerSyktBarn s2Ytelse = (PleiepengerSyktBarn) nySøknad.getYtelse();
58+
59+
final PleiepengerSyktBarn ytelse = new PleiepengerSyktBarn();
60+
ytelse.medSøknadsperiode(slåSammenSøknadsperioder(s1Ytelse, s2Ytelse));
61+
62+
/* Bruk aktørId fra PsbSøknadsinnhold fremfor:
63+
ytelse.medBarn(new Barn()
64+
.medNorskIdentitetsnummer(NorskIdentitetsnummer.of(s2Ytelse.getBarn().getPersonIdent().getVerdi()))
65+
.medFødselsdato(s2Ytelse.getBarn().getFødselsdato())
66+
);
67+
*/
68+
ytelse.medArbeidstid(Arbeidstidsammenslåer.slåSammenArbeidstid(s1Ytelse, s2Ytelse));
69+
ytelse.medTilsynsordning(Tilsynsammenslåer.slåsammen(s1Ytelse, s2Ytelse));
70+
71+
/* Bruk aktørId fra PsbSøknadsinnhold fremfor:
72+
final Søknad s = new Søknad(
73+
SøknadId.of("generert"),
74+
Versjon.of("1.0.0"),
75+
nySøknad.getMottattDato(),
76+
new Søker(NorskIdentitetsnummer.of(nySøknad.getSøker().getPersonIdent().getVerdi())),
77+
nySøknad.getSpråk(),
78+
ytelse);
79+
*/
80+
final Søknad s = new Søknad()
81+
.medSpråk(nySøknad.getSpråk())
82+
.medYtelse(ytelse);
83+
return s;
84+
}
85+
86+
private static List<Periode> slåSammenSøknadsperioder(final PleiepengerSyktBarn s1Ytelse, final PleiepengerSyktBarn s2Ytelse) {
87+
final LocalDateTimeline<Boolean> t1 = TidsserieUtils.toLocalDateTimeline(s1Ytelse.getSøknadsperiodeList());
88+
final LocalDateTimeline<Boolean> t2 = TidsserieUtils.toLocalDateTimeline(s2Ytelse.getSøknadsperiodeList());
89+
final List<Periode> søknadsperioder = TidsserieUtils.tilPeriodeList(t1
90+
.union(t2, StandardCombinators::coalesceRightHandSide)
91+
.disjoint(TidsserieUtils.toLocalDateTimeline(s2Ytelse.getTrekkKravPerioder()))
92+
.compress());
93+
return søknadsperioder;
94+
}
95+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package no.nav.k9.innsyn.søknadsammeslåer;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashSet;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.Set;
8+
import java.util.stream.Collectors;
9+
10+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
11+
import no.nav.k9.søknad.felles.type.NorskIdentitetsnummer;
12+
import no.nav.k9.søknad.felles.type.Organisasjonsnummer;
13+
import no.nav.k9.søknad.felles.type.Periode;
14+
import no.nav.k9.søknad.ytelse.psb.v1.PleiepengerSyktBarn;
15+
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.Arbeidstaker;
16+
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.Arbeidstid;
17+
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.ArbeidstidInfo;
18+
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.ArbeidstidPeriodeInfo;
19+
20+
public class Arbeidstidsammenslåer {
21+
22+
public static Arbeidstid slåSammenArbeidstid(PleiepengerSyktBarn s1Ytelse, PleiepengerSyktBarn s2Ytelse) {
23+
final Arbeidstid a1 = s1Ytelse.getArbeidstid();
24+
final Arbeidstid a2 = s2Ytelse.getArbeidstid();
25+
final Arbeidstid sammenslåttArbeidstid = new Arbeidstid();
26+
27+
final List<Arbeidstaker> arbeidstakerliste = slåSammenArbeidstakerArbeidstid(s2Ytelse, a1, a2);
28+
sammenslåttArbeidstid.medArbeidstaker(arbeidstakerliste);
29+
30+
final ArbeidstidInfo frilanserArbeidstidInfo = slåSammenFrilanserArbeidstid(s2Ytelse, a1, a2);
31+
sammenslåttArbeidstid.medFrilanserArbeidstid(frilanserArbeidstidInfo);
32+
33+
final ArbeidstidInfo selvstendigNæringsdrivendeArbeidstidInfo = slåSammenSelvstendigNæringsdrivendeArbeidstidInfo(s2Ytelse, a1, a2);
34+
sammenslåttArbeidstid.medSelvstendigNæringsdrivendeArbeidstidInfo(selvstendigNæringsdrivendeArbeidstidInfo);
35+
36+
return sammenslåttArbeidstid;
37+
}
38+
39+
private static ArbeidstidInfo slåSammenSelvstendigNæringsdrivendeArbeidstidInfo(PleiepengerSyktBarn s2Ytelse, Arbeidstid a1, Arbeidstid a2) {
40+
final LocalDateTimeline<ArbeidstidPeriodeInfo> t1 = lagArbeidstidTidslinje(a1.getSelvstendigNæringsdrivendeArbeidstidInfo().orElse(null));
41+
final LocalDateTimeline<ArbeidstidPeriodeInfo> t2 = lagArbeidstidTidslinje(a2.getSelvstendigNæringsdrivendeArbeidstidInfo().orElse(null));
42+
final ArbeidstidInfo selvstendigNæringsdrivendeArbeidstidInfo = slåSammenArbeidstidInfo(s2Ytelse, t1, t2);
43+
return selvstendigNæringsdrivendeArbeidstidInfo;
44+
}
45+
46+
private static ArbeidstidInfo slåSammenFrilanserArbeidstid(PleiepengerSyktBarn s2Ytelse, final Arbeidstid a1, final Arbeidstid a2) {
47+
final LocalDateTimeline<ArbeidstidPeriodeInfo> t1 = lagArbeidstidTidslinje(a1.getFrilanserArbeidstidInfo().orElse(null));
48+
final LocalDateTimeline<ArbeidstidPeriodeInfo> t2 = lagArbeidstidTidslinje(a2.getFrilanserArbeidstidInfo().orElse(null));
49+
final ArbeidstidInfo frilanserArbeidstidInfo = slåSammenArbeidstidInfo(s2Ytelse, t1, t2);
50+
return frilanserArbeidstidInfo;
51+
}
52+
53+
private static List<Arbeidstaker> slåSammenArbeidstakerArbeidstid(PleiepengerSyktBarn s2Ytelse, final Arbeidstid a1, final Arbeidstid a2) {
54+
final List<Arbeidstaker> arbeidstakerliste = new ArrayList<>();
55+
final Map<Object, LocalDateTimeline<ArbeidstidPeriodeInfo>> arbeidstakertid1 = byggTidslinjeMap(a1);
56+
final Map<Object, LocalDateTimeline<ArbeidstidPeriodeInfo>> arbeidstakertid2 = byggTidslinjeMap(a2);
57+
final Set<Object> arbeidstakere = new HashSet<>(arbeidstakertid1.keySet());
58+
arbeidstakere.addAll(arbeidstakertid2.keySet());
59+
for (Object arbeidstakerIdent : arbeidstakere) {
60+
final Arbeidstaker sammenslåttArbeidstaker = new Arbeidstaker();
61+
if (arbeidstakerIdent instanceof Organisasjonsnummer) {
62+
sammenslåttArbeidstaker.medOrganisasjonsnummer((Organisasjonsnummer) arbeidstakerIdent);
63+
} else {
64+
sammenslåttArbeidstaker.medNorskIdentitetsnummer((NorskIdentitetsnummer) arbeidstakerIdent);
65+
}
66+
final LocalDateTimeline<ArbeidstidPeriodeInfo> t1 = hentTidslinje(arbeidstakertid1, arbeidstakerIdent);
67+
final LocalDateTimeline<ArbeidstidPeriodeInfo> t2 = hentTidslinje(arbeidstakertid2, arbeidstakerIdent);
68+
final ArbeidstidInfo arbeidstidInfo = slåSammenArbeidstidInfo(s2Ytelse, t1, t2);
69+
sammenslåttArbeidstaker.medArbeidstidInfo(arbeidstidInfo);
70+
arbeidstakerliste.add(sammenslåttArbeidstaker);
71+
}
72+
return arbeidstakerliste;
73+
}
74+
75+
private static ArbeidstidInfo slåSammenArbeidstidInfo(PleiepengerSyktBarn s2Ytelse, final LocalDateTimeline<ArbeidstidPeriodeInfo> t1, final LocalDateTimeline<ArbeidstidPeriodeInfo> t2) {
76+
final Map<Periode, ArbeidstidPeriodeInfo> periodeMap = SøknadsammenslåerUtils.slåSammenOgHåndterTrukkedeKrav(s2Ytelse, t1, t2);
77+
// Defensiv kopiering av ArbeidstidInfo for å få nye Periode- og ArbeidstidPeriodeInfo-objekter:
78+
return new ArbeidstidInfo(new ArbeidstidInfo().medPerioder(periodeMap));
79+
}
80+
81+
@SuppressWarnings("unchecked")
82+
private static LocalDateTimeline<ArbeidstidPeriodeInfo> hentTidslinje(final Map<Object, LocalDateTimeline<ArbeidstidPeriodeInfo>> arbeidstakertid1, Object arbeidstakerIdent) {
83+
final LocalDateTimeline<ArbeidstidPeriodeInfo> tidslinje = arbeidstakertid1.get(arbeidstakerIdent);
84+
if (tidslinje == null) {
85+
return LocalDateTimeline.EMPTY_TIMELINE;
86+
}
87+
return tidslinje;
88+
}
89+
90+
private static Map<Object, LocalDateTimeline<ArbeidstidPeriodeInfo>> byggTidslinjeMap(Arbeidstid arbeidstid) {
91+
return arbeidstid.getArbeidstakerList().stream()
92+
.map(a -> {
93+
final LocalDateTimeline<ArbeidstidPeriodeInfo> tidslinje = lagArbeidstidTidslinje(a.getArbeidstidInfo());
94+
return Map.entry(hentArbeidsgiverIdent(a),tidslinje);
95+
})
96+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
97+
}
98+
99+
@SuppressWarnings("unchecked")
100+
private static LocalDateTimeline<ArbeidstidPeriodeInfo> lagArbeidstidTidslinje(ArbeidstidInfo arbeidstidInfo) {
101+
if (arbeidstidInfo == null) {
102+
return LocalDateTimeline.EMPTY_TIMELINE;
103+
}
104+
return SøknadsammenslåerUtils.lagTidslinje(arbeidstidInfo.getPerioder());
105+
}
106+
107+
private static Object hentArbeidsgiverIdent(Arbeidstaker a) {
108+
return a.getOrganisasjonsnummer() != null ? a.getOrganisasjonsnummer() : a.getNorskIdentitetsnummer();
109+
}
110+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package no.nav.k9.innsyn.søknadsammeslåer;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.stream.Collectors;
6+
7+
import no.nav.fpsak.tidsserie.LocalDateSegment;
8+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
9+
import no.nav.fpsak.tidsserie.StandardCombinators;
10+
import no.nav.k9.søknad.felles.type.Periode;
11+
import no.nav.k9.søknad.ytelse.psb.v1.PleiepengerSyktBarn;
12+
13+
public final class SøknadsammenslåerUtils {
14+
15+
private SøknadsammenslåerUtils() {
16+
17+
}
18+
19+
20+
static <T> Map<Periode, T> slåSammenOgHåndterTrukkedeKrav(PleiepengerSyktBarn s2Ytelse, final LocalDateTimeline<T> t1, final LocalDateTimeline<T> t2) {
21+
final LocalDateTimeline<T> kombinertInformasjon = t1.union(t2, StandardCombinators::coalesceRightHandSide);
22+
final LocalDateTimeline<T> resultat = kombinertInformasjon.disjoint(trukkedeKravTidslinje(s2Ytelse)).compress();
23+
final Map<Periode, T> periodeMap = resultat.stream().map(p -> {
24+
return Map.entry(new Periode(p.getFom(), p.getTom()), p.getValue());
25+
})
26+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
27+
return periodeMap;
28+
}
29+
30+
@SuppressWarnings("unchecked")
31+
static <T> LocalDateTimeline<T> lagTidslinje(Map<Periode, T> perioder) {
32+
if (perioder == null) {
33+
return LocalDateTimeline.EMPTY_TIMELINE;
34+
}
35+
final List<LocalDateSegment<T>> segments = perioder
36+
.entrySet()
37+
.stream()
38+
.map(e -> {
39+
return new LocalDateSegment<T>(e.getKey().getFraOgMed(), e.getKey().getTilOgMed(), e.getValue());
40+
})
41+
.collect(Collectors.toList());
42+
return new LocalDateTimeline<>(segments);
43+
}
44+
45+
46+
private static LocalDateTimeline<Boolean> trukkedeKravTidslinje(PleiepengerSyktBarn s1Ytelse) {
47+
return new LocalDateTimeline<Boolean>(s1Ytelse.getTrekkKravPerioder().stream().map(p -> new LocalDateSegment<>(p.getFraOgMed(), p.getTilOgMed(), Boolean.TRUE)).collect(Collectors.toList()));
48+
}
49+
50+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package no.nav.k9.innsyn.søknadsammeslåer;
2+
3+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
4+
import no.nav.k9.søknad.ytelse.psb.v1.PleiepengerSyktBarn;
5+
import no.nav.k9.søknad.ytelse.psb.v1.tilsyn.TilsynPeriodeInfo;
6+
import no.nav.k9.søknad.ytelse.psb.v1.tilsyn.Tilsynsordning;
7+
8+
public class Tilsynsammenslåer {
9+
10+
public static Tilsynsordning slåsammen(PleiepengerSyktBarn s1Ytelse, PleiepengerSyktBarn s2Ytelse) {
11+
final Tilsynsordning tilsyn = new Tilsynsordning();
12+
final LocalDateTimeline<TilsynPeriodeInfo> t1 = lagTidslinje(s1Ytelse.getTilsynsordning());
13+
final LocalDateTimeline<TilsynPeriodeInfo> t2 = lagTidslinje(s2Ytelse.getTilsynsordning());
14+
tilsyn.medPerioder(SøknadsammenslåerUtils.slåSammenOgHåndterTrukkedeKrav(s2Ytelse, t1, t2));
15+
16+
// Defensiv kopiering av Tilsynsordning for å få nye Periode- og TilsynPeriodeInfo-objekter:
17+
return new Tilsynsordning(tilsyn);
18+
}
19+
20+
@SuppressWarnings("unchecked")
21+
private static LocalDateTimeline<TilsynPeriodeInfo> lagTidslinje(Tilsynsordning tilsynsordning) {
22+
if (tilsynsordning == null) {
23+
return LocalDateTimeline.EMPTY_TIMELINE;
24+
}
25+
return SøknadsammenslåerUtils.lagTidslinje(tilsynsordning.getPerioder());
26+
}
27+
}

0 commit comments

Comments
 (0)