1+ package no .nav .dolly .bestilling .etterlatte ;
2+
3+ import lombok .RequiredArgsConstructor ;
4+ import lombok .extern .slf4j .Slf4j ;
5+ import ma .glasnost .orika .MapperFacade ;
6+ import no .nav .dolly .bestilling .ClientFuture ;
7+ import no .nav .dolly .bestilling .ClientRegister ;
8+ import no .nav .dolly .bestilling .etterlatte .dto .VedtakRequestDTO ;
9+ import no .nav .dolly .bestilling .etterlatte .dto .VedtakResponseDTO ;
10+ import no .nav .dolly .bestilling .personservice .PersonServiceConsumer ;
11+ import no .nav .dolly .domain .PdlPerson ;
12+ import no .nav .dolly .domain .PdlPersonBolk ;
13+ import no .nav .dolly .domain .jpa .BestillingProgress ;
14+ import no .nav .dolly .domain .resultset .RsDollyUtvidetBestilling ;
15+ import no .nav .dolly .domain .resultset .dolly .DollyPerson ;
16+ import no .nav .dolly .mapper .MappingContextUtils ;
17+ import no .nav .dolly .util .FoedselsdatoUtility ;
18+ import no .nav .dolly .util .TransactionHelperService ;
19+ import org .springframework .stereotype .Service ;
20+ import reactor .core .publisher .Flux ;
21+ import reactor .core .publisher .Mono ;
22+
23+ import java .util .Collection ;
24+ import java .util .HashMap ;
25+ import java .util .List ;
26+ import java .util .Map ;
27+ import java .util .Objects ;
28+ import java .util .function .Function ;
29+ import java .util .stream .Stream ;
30+
31+ import static no .nav .dolly .errorhandling .ErrorStatusDecoder .encodeStatus ;
32+ import static org .apache .commons .lang3 .BooleanUtils .isTrue ;
33+ import static org .apache .poi .util .StringUtil .isBlank ;
34+
35+ @ Slf4j
36+ @ Service
37+ @ RequiredArgsConstructor
38+ public class EtterlatteClient implements ClientRegister {
39+
40+ private static final String OKAY = "OK" ;
41+
42+ private final TransactionHelperService transactionHelperService ;
43+ private final EtterlatteConsumer etterlatteConsumer ;
44+ private final PersonServiceConsumer personServiceConsumer ;
45+ private final MapperFacade mapperFacade ;
46+
47+ @ Override
48+ public Flux <ClientFuture > gjenopprett (RsDollyUtvidetBestilling bestilling , DollyPerson dollyPerson , BestillingProgress progress , boolean isOpprettEndre ) {
49+
50+ if (!bestilling .getEtterlatteYtelser ().isEmpty ()) {
51+
52+ return Flux .from (getPersoner (dollyPerson .getIdent ())
53+ .flatMapMany (vedtakRequestDTO -> Flux .fromIterable (bestilling .getEtterlatteYtelser ())
54+ .flatMap (etterlattYtelse -> {
55+ var context = MappingContextUtils .getMappingContext ();
56+ context .setProperty ("etterlattYtelse" , etterlattYtelse );
57+ var nyVedtakRequest = mapperFacade .map (vedtakRequestDTO , VedtakRequestDTO .class , context );
58+ return etterlatteConsumer .opprettVedtak (nyVedtakRequest )
59+ .map (EtterlatteClient ::decodeResponse );
60+ })
61+ )
62+ .collectList ()
63+ .map (statusList -> statusList .stream ()
64+ .filter (status -> !OKAY .equals (status ))
65+ .findFirst ().orElse (OKAY ))
66+ .map (status -> futurePersist (progress , status )));
67+ }
68+ return Flux .empty ();
69+ }
70+
71+ @ Override
72+ public void release (List <String > identer ) {
73+
74+ // Etterlatte tilbyr pt ikke sletting
75+ }
76+
77+ private ClientFuture futurePersist (BestillingProgress progress , String status ) {
78+
79+ return () -> {
80+ transactionHelperService .persister (progress , BestillingProgress ::setEtterlatteStatus , status );
81+ return progress ;
82+ };
83+ }
84+
85+ private static String decodeResponse (VedtakResponseDTO response ) {
86+
87+ return response .getStatus ().is2xxSuccessful () ? OKAY :
88+ "Feil= %s%s" .formatted (response .getStatus (), getMessage (response ));
89+ }
90+
91+ private static String getMessage (VedtakResponseDTO response ) {
92+
93+ return isBlank (response .getMessage ()) ? "" :
94+ "= %s" .formatted (encodeStatus (response .getMessage ()));
95+ }
96+
97+ private Mono <VedtakRequestDTO > getPersoner (String ident ) {
98+
99+ return personServiceConsumer .getPdlPersoner (List .of (ident ))
100+ .map (PdlPersonBolk ::getData )
101+ .map (PdlPersonBolk .Data ::getHentPersonBolk )
102+ .flatMap (Flux ::fromIterable )
103+ .flatMap (personBolk -> personServiceConsumer .getPdlPersoner (
104+ Stream .of (Stream .of (ident ),
105+ personBolk .getPerson ().getForelderBarnRelasjon ().stream ()
106+ .map (PdlPerson .ForelderBarnRelasjon ::getRelatertPersonsIdent )
107+ .filter (Objects ::nonNull ),
108+ personBolk .getPerson ().getSivilstand ().stream ()
109+ .filter (sivilstand -> sivilstand .isGift () || sivilstand .isGjenlevende ())
110+ .map (PdlPerson .Sivilstand ::getRelatertVedSivilstand )
111+ .filter (Objects ::nonNull )
112+ )
113+ .flatMap (Function .identity ())
114+ .distinct ()
115+ .toList ()))
116+ .map (PdlPersonBolk ::getData )
117+ .map (PdlPersonBolk .Data ::getHentPersonBolk )
118+ .flatMap (Flux ::fromIterable )
119+ .map (personBolk -> Map .of (personBolk .getIdent (), personBolk ))
120+ .reduce (new HashMap <String , PdlPersonBolk .PersonBolk >(), (map , element ) -> {
121+ map .putAll (element );
122+ return map ;
123+ })
124+ .flatMap (personer -> {
125+ if (isTrue (FoedselsdatoUtility .isMyndig (personer .get (ident )))) {
126+ return Mono .just (VedtakRequestDTO .builder ()
127+ .barn (personer .get (ident ).getPerson ().getForelderBarnRelasjon ().stream ()
128+ .filter (PdlPerson .ForelderBarnRelasjon ::isBarn )
129+ .map (PdlPerson .ForelderBarnRelasjon ::getRelatertPersonsIdent )
130+ .distinct ()
131+ .toList ())
132+ .avdoed (getForelderFraForelder (personer , ident , bolk -> !bolk .getPerson ().getDoedsfall ().isEmpty ()))
133+ .gjenlevende (getForelderFraForelder (personer , ident , bolk -> bolk .getPerson ().getDoedsfall ().isEmpty ()))
134+ .build ());
135+ } else {
136+ return Mono .just (VedtakRequestDTO .builder ()
137+ .barn (List .of (personer .get (ident ).getIdent ()))
138+ .gjenlevende (getForlderfraBarn (personer , ident ,
139+ bolk -> bolk .getPerson ().getDoedsfall ().isEmpty ()))
140+ .avdoed (getForlderfraBarn (personer , ident , bolk -> !bolk .getPerson ().getDoedsfall ().isEmpty ()))
141+ .build ());
142+ }
143+ });
144+ }
145+
146+ private static String getForlderfraBarn (HashMap <String , PdlPersonBolk .PersonBolk > personer , String ident , Gjenlevende gjenlevende ) {
147+ return personer .get (ident ).getPerson ().getForelderBarnRelasjon ().stream ()
148+ .filter (PdlPerson .ForelderBarnRelasjon ::isForelder )
149+ .map (PdlPerson .ForelderBarnRelasjon ::getRelatertPersonsIdent )
150+ .map (personer ::get )
151+ .filter (gjenlevende ::apply )
152+ .map (PdlPersonBolk .PersonBolk ::getIdent )
153+ .findFirst ().orElse (null );
154+ }
155+
156+ private static String getForelderFraForelder (HashMap <String , PdlPersonBolk .PersonBolk > personer , String ident , Gjenlevende gjenlevende ) {
157+
158+ return personer .get (ident ).getPerson ().getForelderBarnRelasjon ().stream ()
159+ .filter (PdlPerson .ForelderBarnRelasjon ::isBarn )
160+ .map (PdlPerson .ForelderBarnRelasjon ::getRelatertPersonsIdent )
161+ .map (personer ::get )
162+ .map (PdlPersonBolk .PersonBolk ::getPerson )
163+ .map (PdlPerson .Person ::getForelderBarnRelasjon )
164+ .flatMap (Collection ::stream )
165+ .filter (PdlPerson .ForelderBarnRelasjon ::isForelder )
166+ .map (PdlPerson .ForelderBarnRelasjon ::getRelatertPersonsIdent )
167+ .map (personer ::get )
168+ .filter (gjenlevende ::apply )
169+ .map (PdlPersonBolk .PersonBolk ::getIdent )
170+ .findFirst ().orElse (null );
171+ }
172+ }
0 commit comments