diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/utils/ArenaStatusUtil.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/utils/ArenaStatusUtil.java index ca822ca3b6e..8ac7f4a1d9c 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/utils/ArenaStatusUtil.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/utils/ArenaStatusUtil.java @@ -79,7 +79,7 @@ public static Mono getAapStatus(AapResponse response, ErrorStatusDecoder public static String fmtResponse(String miljoe, String system, String status) { - return encodeStatus(String.format(MILJOE_FMT, miljoe, system, status)); + return String.format(MILJOE_FMT, miljoe, system, encodeStatus(status)); } public static String getMessage(String jsonFeilmelding) { diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/command/PersonGetCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/command/PersonGetCommand.java index d79bc072565..fe30d60d4e6 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/command/PersonGetCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/command/PersonGetCommand.java @@ -35,6 +35,10 @@ public Flux call() { .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .retrieve() .bodyToFlux(PersonMiljoeDTO.class) + .map(resultat -> { + resultat.setIdent(ident); + return resultat; + }) .onErrorResume(throwable -> Mono.just(PersonMiljoeDTO.builder() .status("FEIL") .melding(WebClientFilter.getStatus(throwable).getReasonPhrase()) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonService.java index efc5f323d1e..c641ace82f9 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonService.java @@ -4,6 +4,9 @@ import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.ClientFuture; import no.nav.dolly.bestilling.tpsmessagingservice.TpsMessagingConsumer; +import no.nav.dolly.consumer.pdlperson.PdlPersonConsumer; +import no.nav.dolly.domain.PdlPerson; +import no.nav.dolly.domain.PdlPersonBolk; import no.nav.dolly.domain.jpa.BestillingProgress; import no.nav.dolly.domain.resultset.RsDollyUtvidetBestilling; import no.nav.dolly.domain.resultset.SystemTyper; @@ -20,6 +23,7 @@ import java.time.Duration; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -41,21 +45,46 @@ public class TpsPersonService { private final TpsMessagingConsumer tpsMessagingConsumer; private final TransactionHelperService transactionHelperService; private final TransaksjonMappingService transaksjonMappingService; + private final PdlPersonConsumer pdlPersonConsumer; public Flux syncPerson(DollyPerson dollyPerson, RsDollyUtvidetBestilling bestilling, BestillingProgress progress, boolean isOpprettEndre) { long startTime = System.currentTimeMillis(); - return Flux.from(Flux.fromIterable(bestilling.getEnvironments()) + return Flux.fromIterable(bestilling.getEnvironments()) .filter(PENSJON_MILJOER::contains) .collectList() .filter(penMiljoer -> !penMiljoer.isEmpty()) .filter(penMiljoer -> isRelevantBestilling(bestilling) && (isOpprettEndre || !isTransaksjonMapping(dollyPerson.getIdent(), bestilling, penMiljoer))) - .flatMap(penMiljoer -> getTpsPerson(startTime, dollyPerson.getIdent(), - penMiljoer, Collections.emptyList(), progress)) - .map(status -> prepareResult(dollyPerson.getIdent(), status, bestilling.getEnvironments(), startTime)) - .map(status -> futurePersist(progress, status))); + .flatMapMany(penMiljoer -> + getRelasjoner(dollyPerson.getIdent()) + .flatMap(relasjon -> Flux.from(getTpsPerson(startTime, dollyPerson.getIdent(), + penMiljoer, Collections.emptyList(), progress) + .map(status -> prepareResult(relasjon, status, bestilling.getEnvironments(), startTime))))) + .collectList() + .flatMapIterable(list -> list) + .map(status -> futurePersist(progress, dollyPerson.getIdent(), status)); + } + + private Flux getRelasjoner(String ident) { + + return pdlPersonConsumer.getPdlPersoner(List.of(ident)) + .filter(pdlPersonBolk -> nonNull(pdlPersonBolk.getData())) + .map(PdlPersonBolk::getData) + .map(PdlPersonBolk.Data::getHentPersonBolk) + .flatMap(Flux::fromIterable) + .filter(personBolk -> nonNull(personBolk.getPerson())) + .flatMap(person -> Flux.fromStream(Stream.of( + Stream.of(ident), + person.getPerson().getSivilstand().stream() + .map(PdlPerson.Sivilstand::getRelatertVedSivilstand) + .filter(Objects::nonNull), + person.getPerson().getForelderBarnRelasjon().stream() + .map(PdlPerson.ForelderBarnRelasjon::getRelatertPersonsIdent) + .filter(Objects::nonNull)) + .flatMap(Function.identity()))) + .distinct(); } private boolean isRelevantBestilling(RsDollyUtvidetBestilling bestilling) { @@ -120,6 +149,7 @@ private List prepareResult(String ident, List miljoer.stream() .filter(miljoe -> status.stream().noneMatch(status1 -> miljoe.equals(status1.getMiljoe()))) .map(miljoe -> PersonMiljoeDTO.builder() + .ident(ident) .miljoe(miljoe) .status("NOK") .utfyllendeMelding(String.format("Feil: Synkronisering mot TPS gitt opp etter %d sekunder.", MAX_MILLIES / 1000)) @@ -128,17 +158,19 @@ private List prepareResult(String ident, List .toList(); } - private ClientFuture futurePersist(BestillingProgress progress, List status) { + private ClientFuture futurePersist(BestillingProgress progress, String ident, List status) { return () -> { progress.setIsTpsSyncEnv(status.stream() + .filter(status1 -> ident.equals(status1.getIdent())) .filter(PersonMiljoeDTO::isOk) .map(PersonMiljoeDTO::getMiljoe) .toList()); transactionHelperService.persister(progress, BestillingProgress::setTpsSyncStatus, status.stream() + .filter(detalj -> ident.equals(detalj.getIdent())) .map(detalj -> String.format("%s:%s", detalj.getMiljoe(), ErrorStatusDecoder.encodeStatus(detalj.isOk() ? detalj.getStatus() : StringUtils.trimToEmpty(String.format("FEIL: %s", detalj.getUtfyllendeMelding()))))) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/errorhandling/ErrorStatusDecoder.java b/apps/dolly-backend/src/main/java/no/nav/dolly/errorhandling/ErrorStatusDecoder.java index 444bd3c4ccb..4ca2995e69f 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/errorhandling/ErrorStatusDecoder.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/errorhandling/ErrorStatusDecoder.java @@ -46,7 +46,8 @@ public static String encodeStatus(String toBeEncoded) { .replace("]", "") .replace(',', ';') .replace(':', '=') - .replace("\"", ""): ""; + .replace("\"", "") + .replace("$", "§") : ""; } public String getErrorText(HttpStatus errorStatus, String errorMsg) { diff --git a/apps/dolly-backend/src/main/resources/db/migration/V1.7.21__AlterTableTransactionId.sql b/apps/dolly-backend/src/main/resources/db/migration/V1.7.21__AlterTableTransactionId.sql new file mode 100644 index 00000000000..06bf4c6b072 --- /dev/null +++ b/apps/dolly-backend/src/main/resources/db/migration/V1.7.21__AlterTableTransactionId.sql @@ -0,0 +1,6 @@ +----------------------------- +-- A L T E R T A B L E S -- +----------------------------- + +alter table transaksjon_mapping +alter column transaksjon_id type varchar(2000); \ No newline at end of file diff --git a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx index d8000437e6a..05313d2fe5e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx @@ -23,6 +23,7 @@ import { SelectOptionsManager as Options } from '@/service/SelectOptions' import _get from 'lodash/get' import _has from 'lodash/has' import { MedlKodeverk } from '@/components/fagsystem/medl/MedlConstants' +import { useNavEnheter } from '@/utils/hooks/useNorg2' // TODO: Flytte til selector? // - Denne kan forminskes ved bruk av hjelpefunksjoner @@ -1850,6 +1851,47 @@ const mapPensjon = (bestillingData, data) => { } data.push(pensjonforvalterAlderspensjon) } + + if (pensjonKriterier.uforetrygd) { + const uforetrygd = pensjonKriterier.uforetrygd + + const { navEnheter } = useNavEnheter() + const navEnhetLabel = navEnheter?.find( + (enhet) => enhet.value === uforetrygd.navEnhetId?.toString(), + )?.label + + const pensjonforvalterUforetrygd = { + header: 'Uføretrygd', + items: [ + obj('Krav fremsatt dato', formatDate(uforetrygd.kravFremsattDato)), + obj('Ønsket virkningsdato', formatDate(uforetrygd.onsketVirkningsDato)), + obj('Uføretidspunkt', formatDate(uforetrygd.uforetidspunkt)), + obj('Inntekt før uførhet', uforetrygd.inntektForUforhet), + obj('Har barnetillegg', oversettBoolean(uforetrygd.barnetilleggDetaljer !== null)), + obj( + 'Type barnetillegg', + showLabel('barnetilleggType', uforetrygd.barnetilleggDetaljer?.barnetilleggType), + ), + obj( + 'Antall forventede inntekter for søker', + uforetrygd.barnetilleggDetaljer?.forventedeInntekterSoker?.length, + ), + obj( + 'Antall forventede inntekter for partner', + uforetrygd.barnetilleggDetaljer?.forventedeInntekterEP?.length, + ), + obj( + 'Sats for minimum IFU', + showLabel('minimumInntektForUforhetType', uforetrygd.minimumInntektForUforhetType), + ), + obj('Uføregrad', uforetrygd.uforegrad ? `${uforetrygd.uforegrad}%` : null), + obj('Saksbehandler', uforetrygd.saksbehandler), + obj('Attesterer', uforetrygd.attesterer), + obj('NAV-enhet', navEnhetLabel || uforetrygd.navEnhetId), + ], + } + data.push(pensjonforvalterUforetrygd) + } } } diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/ArbeidInntekt.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/ArbeidInntekt.tsx index 6f1044d85d7..6181b788690 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/ArbeidInntekt.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/ArbeidInntekt.tsx @@ -6,9 +6,20 @@ import { aaregAttributt } from '@/components/fagsystem/aareg/form/Form' import { sigrunAttributt } from '@/components/fagsystem/sigrunstub/form/Form' import { inntektstubAttributt } from '@/components/fagsystem/inntektstub/form/Form' import { inntektsmeldingAttributt } from '@/components/fagsystem/inntektsmelding/form/Form' +import { useContext } from 'react' +import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' export const ArbeidInntektPanel = ({ stateModifier, formikBag }) => { const sm = stateModifier(ArbeidInntektPanel.initialValues) + const opts = useContext(BestillingsveilederContext) + + const harGyldigInntektsmeldingBestilling = opts?.tidligereBestillinger?.some( + (bestilling) => + bestilling.status?.some( + (status) => + status.id === 'INNTKMELD' && status.statuser?.some((item) => item?.melding === 'OK'), + ), + ) const infoTekst = 'Arbeidsforhold: \nDataene her blir lagt til AAREG. \n\nInntekt: \nSkatte- og inntektsgrunnlag. Inntektene blir lagt i Sigrun-stub.' + @@ -18,7 +29,9 @@ export const ArbeidInntektPanel = ({ stateModifier, formikBag }) => { + sm.batchAdd(harGyldigInntektsmeldingBestilling ? ['inntektsmelding'] : []) + } uncheckAttributeArray={sm.batchRemove} iconType="arbeid" startOpen={harValgtAttributt(formikBag.values, [ @@ -38,7 +51,14 @@ export const ArbeidInntektPanel = ({ stateModifier, formikBag }) => { - + ) diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Pensjon.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Pensjon.tsx index 1bcb7d0c91d..66722981e91 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Pensjon.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Pensjon.tsx @@ -10,15 +10,26 @@ import { harValgtAttributt } from '@/components/ui/form/formUtils' import { pensjonPath } from '@/components/fagsystem/pensjon/form/Form' import { initialAlderspensjon } from '@/components/fagsystem/alderspensjon/form/initialValues' import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' +import { initialUforetrygd } from '@/components/fagsystem/uforetrygd/initialValues' export const PensjonPanel = ({ stateModifier, formikBag }: any) => { const sm = stateModifier(PensjonPanel.initialValues) const opts = useContext(BestillingsveilederContext) - const harGyldigApBestilling = opts?.tidligereBestillinger?.some((bestilling) => - bestilling.status?.some( - (status) => status.id === 'PEN_AP' && status.statuser?.[0]?.melding === 'OK' - ) + const harGyldigApBestilling = opts?.tidligereBestillinger?.some( + (bestilling) => + bestilling.status?.some( + (status) => + status.id === 'PEN_AP' && status.statuser?.some((item) => item?.melding === 'OK'), + ), + ) + + const harGyldigUforetrygdBestilling = opts?.tidligereBestillinger?.some( + (bestilling) => + bestilling.status?.some( + (status) => + status.id === 'PEN_UT' && status.statuser?.some((item) => item.melding === 'OK'), + ), ) const infoTekst = @@ -26,11 +37,24 @@ export const PensjonPanel = ({ stateModifier, formikBag }: any) => { 'Tjenestepensjon: \nTjenestepensjonsforhold lagt til i TP. \n\n' + 'Alderspensjon: \nAlderspensjonssak med vedtak blir lagt til i PEN.' + const getIgnoreKeys = () => { + const ignoreKeys = [] + if (harGyldigApBestilling) { + ignoreKeys.push('alderspensjon') + } + if (harGyldigUforetrygdBestilling) { + ignoreKeys.push('uforetrygd') + } + return ignoreKeys + } + return ( sm.batchAdd(harGyldigApBestilling ? ['alderspensjon'] : [])} + checkAttributeArray={() => { + sm.batchAdd(getIgnoreKeys()) + }} uncheckAttributeArray={sm.batchRemove} iconType="pensjon" startOpen={harValgtAttributt(formikBag.values, [pensjonPath, tpPath])} @@ -41,11 +65,20 @@ export const PensjonPanel = ({ stateModifier, formikBag }: any) => { - {!harGyldigApBestilling && ( - - - - )} + + + + + + ) } @@ -57,6 +90,7 @@ PensjonPanel.initialValues = ({ set, del, has }: any) => { inntekt: 'pensjonforvalter.inntekt', tp: 'pensjonforvalter.tp', alderspensjon: 'pensjonforvalter.alderspensjon', + uforetrygd: 'pensjonforvalter.uforetrygd', } return { inntekt: { @@ -88,5 +122,13 @@ PensjonPanel.initialValues = ({ set, del, has }: any) => { }, remove: () => del(paths.alderspensjon), }, + uforetrygd: { + label: 'Har uføretrygdvedtak', + checked: has(paths.uforetrygd), + add: () => { + set(paths.uforetrygd, initialUforetrygd) + }, + remove: () => del(paths.uforetrygd), + }, } } diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Sykdom.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Sykdom.tsx index f43de338cd6..2af3258d2e4 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Sykdom.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Sykdom.tsx @@ -2,20 +2,36 @@ import Panel from '@/components/ui/panel/Panel' import { Attributt, AttributtKategori } from '../Attributt' import { harValgtAttributt } from '@/components/ui/form/formUtils' import { sykdomAttributt } from '@/components/fagsystem/sykdom/form/Form' +import { useContext } from 'react' +import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' export const SykdomPanel = ({ stateModifier, formikBag }: any) => { const sm = stateModifier(SykdomPanel.initialValues) + const opts = useContext(BestillingsveilederContext) + + const harGyldigSykemeldingBestilling = opts?.tidligereBestillinger?.some( + (bestilling) => + bestilling.status?.some( + (status) => + status.id === 'SYKEMELDING' && status.statuser?.some((item) => item?.melding === 'OK'), + ), + ) + return ( // @ts-ignore sm.batchAdd(harGyldigSykemeldingBestilling ? ['sykemelding'] : [])} uncheckAttributeArray={sm.batchRemove} iconType="sykdom" startOpen={harValgtAttributt(formikBag.values, [sykdomAttributt])} > - + ) diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/Steg2.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/Steg2.tsx index fcf2a7d8acb..f964dbce7fa 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/Steg2.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/Steg2.tsx @@ -25,6 +25,7 @@ import { AlderspensjonForm } from '@/components/fagsystem/alderspensjon/form/For import { SkjermingForm } from '@/components/fagsystem/skjermingsregister/form/SkjermingForm' import { ArbeidsplassenForm } from '@/components/fagsystem/arbeidsplassen/form/Form' import { HistarkForm } from '@/components/fagsystem/histark/form/HistarkForm' +import { UforetrygdForm } from '@/components/fagsystem/uforetrygd/form/Form' const gruppeNavn = (gruppe) => {gruppe.navn} @@ -66,6 +67,7 @@ export const Steg2 = () => { + @@ -106,6 +108,7 @@ Steg2.validation = Yup.object({ ...PensjonForm.validation, ...TjenestepensjonForm.validation, ...AlderspensjonForm.validation, - }) + ...UforetrygdForm.validation, + }), ), }) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/alderspensjon/visning/AlderspensjonVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/alderspensjon/visning/AlderspensjonVisning.tsx index 42b70162587..9ed7ea6c1fc 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/alderspensjon/visning/AlderspensjonVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/alderspensjon/visning/AlderspensjonVisning.tsx @@ -1,7 +1,6 @@ import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import React from 'react' -import { erGyldig } from '@/components/transaksjonid/GyldigeBestillinger' import { formatDate } from '@/utils/DataFormatter' import Loading from '@/components/ui/loading/Loading' import { useBestilteMiljoer } from '@/utils/hooks/useBestilling' @@ -12,6 +11,7 @@ import { MiljoTabs } from '@/components/ui/miljoTabs/MiljoTabs' export const sjekkManglerApData = (apData) => { return apData?.length < 1 || apData?.every((miljoData) => !miljoData.data) } + const DataVisning = ({ data }) => { return ( <> @@ -68,13 +68,3 @@ export const AlderspensjonVisning = ({ data, loading, bestillingIdListe, tilgjen ) } - -AlderspensjonVisning.filterValues = (bestillinger, ident) => { - if (!bestillinger) { - return null - } - return bestillinger.filter( - (bestilling: any) => - bestilling.data.pensjonforvalter?.alderspensjon && erGyldig(bestilling.id, 'PEN_AP', ident), - ) -} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/form/Form.tsx new file mode 100644 index 00000000000..886e2eebeea --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/form/Form.tsx @@ -0,0 +1,95 @@ +import { erForsteEllerTest, panelError } from '@/components/ui/form/formUtils' +import React, { useEffect, useState } from 'react' +import { Vis } from '@/components/bestillingsveileder/VisAttributt' +import Panel from '@/components/ui/panel/Panel' +import { FormikDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' +import { FormikTextInput } from '@/components/ui/form/inputs/textInput/TextInput' +import { SelectOptionsManager as Options } from '@/service/SelectOptions' +import { FormikSelect } from '@/components/ui/form/inputs/select/Select' +import { genererTilfeldigeNavPersonidenter } from '@/utils/GenererTilfeldigeNavPersonidenter' +import * as _ from 'lodash-es' +import { useNavEnheter } from '@/utils/hooks/useNorg2' +import { BarnetilleggForm } from '@/components/fagsystem/uforetrygd/form/partials/BarnetilleggForm' +import { validation } from '@/components/fagsystem/uforetrygd/form/validation' + +const uforetrygdPath = 'pensjonforvalter.uforetrygd' + +export const UforetrygdForm = ({ formikBag }) => { + const saksbehandler = _.get(formikBag.values, `${uforetrygdPath}.saksbehandler`) + const attesterer = _.get(formikBag.values, `${uforetrygdPath}.attesterer`) + + const [randomSaksbehandlere, setRandomSaksbehandlere] = useState([]) + const [randomAttesterere, setRandomAttesterere] = useState([]) + const { navEnheter } = useNavEnheter() + + useEffect(() => { + setRandomSaksbehandlere(genererTilfeldigeNavPersonidenter(saksbehandler)) + setRandomAttesterere(genererTilfeldigeNavPersonidenter(attesterer)) + }, []) + + return ( + + +
+ + + + +
+ +
+ + + + + + +
+
+
+ ) +} + +UforetrygdForm.validation = validation diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/form/partials/BarnetilleggForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/form/partials/BarnetilleggForm.tsx new file mode 100644 index 00000000000..183e435a6df --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/form/partials/BarnetilleggForm.tsx @@ -0,0 +1,88 @@ +import { DollyCheckbox } from '@/components/ui/form/inputs/checbox/Checkbox' +import { SelectOptionsManager as Options } from '@/service/SelectOptions' +import { FormikSelect } from '@/components/ui/form/inputs/select/Select' +import React, { useState } from 'react' +import { FormikDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import * as _ from 'lodash-es' +import { + barnetilleggDetaljer, + forventedeInntekterSokerOgEP, +} from '@/components/fagsystem/uforetrygd/initialValues' +import { FormikDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' +import { FormikTextInput } from '@/components/ui/form/inputs/textInput/TextInput' + +const ForventedeInntekterForm = ({ path, header, initialValues }) => { + return ( + + {(path: any, idx: React.Key) => ( + <> + + + + + + )} + + ) +} + +export const BarnetilleggForm = ({ formikBag }) => { + const barnetilleggPath = 'pensjonforvalter.uforetrygd.barnetilleggDetaljer' + + const [harBarnetillegg, setHarBarnetillegg] = useState( + _.get(formikBag.values, barnetilleggPath) !== null, + ) + + const handleBarnetilleggChange = (value) => { + const checked = value?.target?.checked + setHarBarnetillegg(checked) + if (checked) { + formikBag.setFieldValue(barnetilleggPath, barnetilleggDetaljer) + } else { + formikBag.setFieldValue(barnetilleggPath, null) + } + } + + return ( + <> + handleBarnetilleggChange(v)} + size="small" + /> + {harBarnetillegg && ( +
+ + + +
+ )} + + ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/form/validation.tsx new file mode 100644 index 00000000000..01193534f1f --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/form/validation.tsx @@ -0,0 +1,66 @@ +import * as Yup from 'yup' +import { ifPresent, requiredNumber, requiredString } from '@/utils/YupValidations' +import { isFuture, isPast } from 'date-fns' +import { testDatoFom, testDatoTom } from '@/components/fagsystem/utils' + +const erIkkeLik = () => { + return Yup.string().test( + 'er-ikke-lik', + 'Saksbehandler og attesterer kan ikke være samme person', + function testIdenter() { + const values = this.options.context + const { saksbehandler, attesterer } = values?.pensjonforvalter?.uforetrygd + if (!saksbehandler || !attesterer) { + return true + } + return saksbehandler !== attesterer + }, + ) +} + +const datoErFremtidig = () => { + return Yup.date().test('er-fremtidig', 'Dato må være frem i tid', function validDate(dato) { + if (!dato) { + return true + } + return isFuture(dato) + }) +} + +const forventetInntekt = Yup.object({ + datoFom: testDatoFom(datoErFremtidig().nullable(), 'datoTom', 'Dato må være før dato t.o.m.'), + datoTom: testDatoTom(datoErFremtidig().nullable(), 'datoFom', 'Dato må være etter dato f.o.m.'), + inntektType: Yup.string().nullable(), + belop: Yup.number() + .nullable() + .transform((i, j) => (j === '' ? null : i)), +}).nullable() + +export const validation = { + uforetrygd: ifPresent( + '$pensjonforvalter.uforetrygd', + Yup.object({ + kravFremsattDato: Yup.date().nullable(), + onsketVirkningsDato: datoErFremtidig().nullable(), + uforetidspunkt: Yup.date() + .test('er-historisk', 'Dato må være historisk', function validDate(dato) { + if (!dato) { + return true + } + return isPast(dato) + }) + .nullable(), + inntektForUforhet: requiredNumber.transform((i, j) => (j === '' ? null : i)), + uforegrad: requiredNumber.transform((i, j) => (j === '' ? null : i)), + minimumInntektForUforhetType: Yup.string().nullable(), + saksbehandler: erIkkeLik().nullable(), + attesterer: erIkkeLik().nullable(), + navEnhetId: requiredString, + barnetilleggDetaljer: Yup.object({ + barnetilleggType: requiredString, + forventedeInntekterSoker: Yup.array().of(forventetInntekt), + forventedeInntekterEP: Yup.array().of(forventetInntekt), + }).nullable(), + }), + ), +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/initialValues.tsx new file mode 100644 index 00000000000..b83410b0d1c --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/initialValues.tsx @@ -0,0 +1,29 @@ +import { addMonths, getDaysInMonth, setDate } from 'date-fns' + +const treMaanederFrem = addMonths(new Date(), 3) + +export const initialUforetrygd = { + kravFremsattDato: new Date(), + onsketVirkningsDato: setDate(addMonths(new Date(), 1), 1), + uforetidspunkt: setDate(addMonths(new Date(), -1), 1), + inntektForUforhet: 550000, + uforegrad: 100, + minimumInntektForUforhetType: null, + saksbehandler: null, + attesterer: null, + navEnhetId: '4403', + barnetilleggDetaljer: null, +} + +export const barnetilleggDetaljer = { + barnetilleggType: 'FELLESBARN', + forventedeInntekterSoker: [], + forventedeInntekterEP: [], +} + +export const forventedeInntekterSokerOgEP = { + datoFom: setDate(addMonths(new Date(), 1), 1), + datoTom: setDate(treMaanederFrem, getDaysInMonth(new Date(treMaanederFrem))), + inntektType: 'ARBEIDSINNTEKT', + belop: 0, +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/visning/UforetrygdVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/visning/UforetrygdVisning.tsx new file mode 100644 index 00000000000..bc166246d23 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/uforetrygd/visning/UforetrygdVisning.tsx @@ -0,0 +1,135 @@ +import { useBestilteMiljoer } from '@/utils/hooks/useBestilling' +import Loading from '@/components/ui/loading/Loading' +import React from 'react' +import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' +import { Alert } from '@navikt/ds-react' +import { MiljoTabs } from '@/components/ui/miljoTabs/MiljoTabs' +import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' +import { TitleValue } from '@/components/ui/titleValue/TitleValue' +import { formatDate, showLabel } from '@/utils/DataFormatter' +import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import styled from 'styled-components' +import { useNavEnheter } from '@/utils/hooks/useNorg2' +import { usePensjonVedtak } from '@/utils/hooks/usePensjon' + +const BarnetilleggSamlet = styled.div` + margin: 0 0 15px 0; + width: 100%; +` +export const sjekkManglerUforetrygdData = (uforetrygdData) => { + return ( + uforetrygdData?.length < 1 || + uforetrygdData?.every( + (miljoData) => !miljoData.data || Object.keys(miljoData?.data)?.length < 1, + ) + ) +} + +const BarnetilleggInntektVisning = ({ data, tittel }) => { + if (!data || data.length === 0) { + return null + } + + return ( + <> +

{tittel}

+ + {(inntekt, idx) => ( +
+ + + + +
+ )} +
+ + ) +} + +const DataVisning = ({ data, miljo }) => { + const { navEnheter } = useNavEnheter() + const navEnhetLabel = navEnheter?.find((enhet) => enhet.value === data?.navEnhetId?.toString()) + ?.label + + const { vedtakData } = usePensjonVedtak(data?.fnr, miljo) + + return ( + <> +
+ + + + + + + + + + + + + + + +
+ + ) +} + +export const UforetrygdVisning = ({ data, loading, bestillingIdListe, tilgjengeligMiljoe }) => { + const { bestilteMiljoer } = useBestilteMiljoer(bestillingIdListe, 'PEN_UT') + + if (loading) { + return + } + + if (!data) { + return null + } + + const manglerFagsystemdata = sjekkManglerUforetrygdData(data) + + const miljoerMedData = data?.map((miljoData) => miljoData.data && miljoData.miljo) + const errorMiljoer = bestilteMiljoer?.filter((miljo) => !miljoerMedData?.includes(miljo)) + + const forsteMiljo = data.find((miljoData) => miljoData?.data)?.miljo + + const filteredData = + tilgjengeligMiljoe && data.filter((item) => item.miljo === tilgjengeligMiljoe) + + return ( + + + {manglerFagsystemdata ? ( + + Fant ikke uføretrygd-data på person + + ) : ( + + + + )} + + ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx b/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx index 64dfb0a6451..94ac62fd34c 100644 --- a/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx @@ -79,6 +79,12 @@ export const MiljoeInfo = ({ bestillingsdata, dollyEnvironments }) => { {getMiljoer(pensjonEnvironments, loadingPensjon, errorPensjon)} )} + {pensjonforvalter?.uforetrygd && ( +
  • + Uføretrygd:  + {getMiljoer(pensjonEnvironments, loadingPensjon, errorPensjon)} +
  • + )} {sykemelding &&
  • Sykemelding: Q1 må velges
  • } diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/apiFeilmelding/ApiFeilmelding.less b/apps/dolly-frontend/src/main/js/src/components/ui/apiFeilmelding/ApiFeilmelding.less index e31df75967a..dc3a9ec2705 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/apiFeilmelding/ApiFeilmelding.less +++ b/apps/dolly-frontend/src/main/js/src/components/ui/apiFeilmelding/ApiFeilmelding.less @@ -2,6 +2,8 @@ pre.api-feilmelding { white-space: pre-wrap; margin: 3px 0; font-size: 0.8rem; + hyphens: auto; + word-break: break-word; &-container { background-color: #f2f2f2; diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx index 701e8de1259..06b8a9b6359 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx @@ -70,6 +70,7 @@ const getValgteAttributter = (values) => { 'pensjonforvalter.inntekt', 'pensjonforvalter.tp', 'pensjonforvalter.alderspensjon', + 'pensjonforvalter.uforetrygd', 'arenaforvalter', 'sykemelding', 'brregstub', diff --git a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx index 66df46bcef5..52de956d34d 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx @@ -39,7 +39,6 @@ import { sjekkManglerPensjonData } from '@/components/fagsystem/pensjon/visning/ import { sjekkManglerAaregData } from '@/components/fagsystem/aareg/visning/Visning' import { useAmeldinger, useArbeidsforhold } from '@/utils/hooks/useOrganisasjoner' import { - useApData, useArbeidsplassencvData, useArenaData, useDokarkivData, @@ -47,6 +46,7 @@ import { useInstData, usePoppData, useTpData, + useTransaksjonIdData, } from '@/utils/hooks/useFagsystemer' import { sjekkManglerTpData } from '@/components/fagsystem/tjenestepensjon/visning/TpVisning' import { sjekkManglerInstData } from '@/components/fagsystem/inst/visning/InstVisning' @@ -61,6 +61,7 @@ import { harMedlBestilling, harPoppBestilling, harTpBestilling, + harUforetrygdBestilling, } from '@/utils/SjekkBestillingFagsystem' import { AlderspensjonVisning, @@ -72,6 +73,11 @@ import _has from 'lodash/has' import { MedlVisning } from '@/components/fagsystem/medl/visning' import { useMedlPerson } from '@/utils/hooks/useMedl' import StyledAlert from '@/components/ui/alert/StyledAlert' +import { + sjekkManglerUforetrygdData, + UforetrygdVisning, +} from '@/components/fagsystem/uforetrygd/visning/UforetrygdVisning' +import { usePensjonEnvironments } from '@/utils/hooks/useEnvironments' const getIdenttype = (ident) => { if (parseInt(ident.charAt(0)) > 3) { @@ -171,9 +177,20 @@ export default ({ harArenaBestilling(bestillingerFagsystemer), ) - const { loading: loadingApData, apData } = useApData( + const { pensjonEnvironments } = usePensjonEnvironments() + + const { loading: loadingApData, data: apData } = useTransaksjonIdData( ident.ident, + 'PEN_AP', harApBestilling(bestillingerFagsystemer), + pensjonEnvironments, + ) + + const { loading: loadingUforetrygdData, data: uforetrygdData } = useTransaksjonIdData( + ident.ident, + 'PEN_UT', + harUforetrygdBestilling(bestillingerFagsystemer), + pensjonEnvironments, ) const getGruppeIdenter = () => { @@ -210,6 +227,9 @@ export default ({ if (apData && sjekkManglerApData(apData)) { return true } + if (uforetrygdData && sjekkManglerUforetrygdData(uforetrygdData)) { + return true + } if (brregstub && sjekkManglerBrregData(brregstub)) { return true } @@ -399,6 +419,12 @@ export default ({ bestillingIdListe={bestillingIdListe} tilgjengeligMiljoe={tilgjengeligMiljoe} /> + { return `Z${Math.floor(Math.random() * 899999) + 100000}` } -export const genererTilfeldigeNavPersonidenter = () => { +export const genererTilfeldigeNavPersonidenter = (valgtIdent = null) => { const personidenter = [] let numIterations = 0 while (personidenter.length < 10 && numIterations < 100) { @@ -10,5 +10,8 @@ export const genererTilfeldigeNavPersonidenter = () => { personidenter.push({ value: personident, label: personident }) numIterations++ } + if (valgtIdent) { + personidenter.unshift({ value: valgtIdent, label: valgtIdent }) + } return personidenter } diff --git a/apps/dolly-frontend/src/main/js/src/utils/SjekkBestillingFagsystem.tsx b/apps/dolly-frontend/src/main/js/src/utils/SjekkBestillingFagsystem.tsx index 0296ebaeacf..dd772454d8a 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/SjekkBestillingFagsystem.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/SjekkBestillingFagsystem.tsx @@ -48,6 +48,16 @@ export const harApBestilling = (bestillingerFagsystemer) => { return alderspensjon } +export const harUforetrygdBestilling = (bestillingerFagsystemer) => { + let uforetrygd = false + bestillingerFagsystemer?.forEach((i) => { + if (i.pensjonforvalter?.uforetrygd) { + uforetrygd = true + } + }) + return uforetrygd +} + export const harInstBestilling = (bestillingerFagsystemer) => { let inst = false bestillingerFagsystemer?.forEach((i) => { diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useFagsystemer.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useFagsystemer.tsx index a2fbe61830d..7ec19fc9802 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/hooks/useFagsystemer.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useFagsystemer.tsx @@ -94,18 +94,33 @@ export const useTpData = (ident, harTpBestilling) => { } } -export const useApData = (ident, harApBestilling) => { +export const useTransaksjonIdData = (ident, system, harBestilling, fagsystemMiljoer = null) => { const { data, isLoading, error } = useSWR( - harApBestilling ? `/dolly-backend/api/v1/transaksjonid?ident=${ident}&system=PEN_AP` : null, + harBestilling ? `/dolly-backend/api/v1/transaksjonid?ident=${ident}&system=${system}` : null, fetcher, ) - const miljoData = data?.map((m) => { - return { data: m.transaksjonId, miljo: m.miljoe } - }) + const getMiljoData = () => { + if (!harBestilling || !data) { + return null + } + const miljoData = [] + if (fagsystemMiljoer && fagsystemMiljoer.length > 0) { + fagsystemMiljoer.map((miljo) => { + const fagsystemData = data?.find((d) => d?.miljoe === miljo)?.transaksjonId + miljoData.push({ data: fagsystemData, miljo: miljo }) + }) + } else { + data?.map((m) => { + miljoData.push({ data: m.transaksjonId, miljo: m.miljoe }) + }) + } + return miljoData + } + const miljoData = getMiljoData() return { - apData: miljoData?.sort((a, b) => a.miljo?.localeCompare(b.miljo)), + data: miljoData?.sort((a, b) => a.miljo?.localeCompare(b.miljo)), loading: isLoading, error: error, } diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/usePensjon.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/usePensjon.tsx new file mode 100644 index 00000000000..05366d66db7 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/usePensjon.tsx @@ -0,0 +1,17 @@ +import useSWR from 'swr' +import { fetcher } from '@/api' + +const getPensjonVedtakUrl = '/testnav-pensjon-testdata-facade-proxy/api/vedtak' + +export const usePensjonVedtak = (ident, miljo) => { + const { data, isLoading, error } = useSWR( + [`${getPensjonVedtakUrl}?miljo=${miljo}`, { fnr: ident }], + ([url, headers]) => fetcher(url, headers), + ) + + return { + vedtakData: data, + loading: isLoading, + error: error, + } +} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/tpsmessagingservice/v1/PersonMiljoeDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/tpsmessagingservice/v1/PersonMiljoeDTO.java index 67afdb29b16..bd94df76d02 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/tpsmessagingservice/v1/PersonMiljoeDTO.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/tpsmessagingservice/v1/PersonMiljoeDTO.java @@ -15,6 +15,7 @@ public class PersonMiljoeDTO { private String miljoe; + private String ident; private PersonDTO person;