From 2b0603df55fab76616c33ac5f3ce6798e8c163a1 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Mon, 7 Oct 2024 10:48:51 +0200 Subject: [PATCH 01/30] Yrkesskade i sykdom-panel --- .../stegVelger/steg/steg1/paneler/Sykdom.tsx | 25 +++++++++++++------ .../fagsystem/yrkesskader/initialValues.tsx | 18 +++++++++++++ .../src/main/js/src/service/SelectOptions.tsx | 3 +++ 3 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx 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 3575e039409..d43584c21cb 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 @@ -4,17 +4,17 @@ 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' +import { initialYrkesskade } from '@/components/fagsystem/yrkesskader/initialValues' export const SykdomPanel = ({ stateModifier, formValues }: 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'), - ), + const harGyldigSykemeldingBestilling = opts?.tidligereBestillinger?.some((bestilling) => + bestilling.status?.some( + (status) => + status.id === 'SYKEMELDING' && status.statuser?.some((item) => item?.melding === 'OK'), + ), ) return ( @@ -32,12 +32,13 @@ export const SykdomPanel = ({ stateModifier, formValues }: any) => { disabled={harGyldigSykemeldingBestilling} title={harGyldigSykemeldingBestilling ? 'Personen har allerede sykemelding' : null} /> + ) } -SykdomPanel.heading = 'Sykdom' +SykdomPanel.heading = 'Sykdom og skade' SykdomPanel.initialValues = ({ set, del, has }: any) => ({ sykemelding: { @@ -56,4 +57,14 @@ SykdomPanel.initialValues = ({ set, del, has }: any) => ({ del('sykemelding') }, }, + yrkesskader: { + label: 'Har yrkesskade', + checked: has('yrkesskader'), + add() { + set('yrkesskader', [initialYrkesskade]) + }, + remove() { + del('yrkesskader') + }, + }, }) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx new file mode 100644 index 00000000000..7f28522d5a5 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx @@ -0,0 +1,18 @@ +export const initialYrkesskadePeriode = { + fra: null, + til: null, +} + +export const initialYrkesskade = { + skadelidtIdentifikator: '', + rolletype: '', + innmelderIdentifikator: '', + innmelderrolle: '', + klassifisering: '', + paaVegneAv: '', + tidstype: '', + skadetidspunkt: null, + perioder: [initialYrkesskadePeriode], + referanse: '', + ferdigstillSak: '', +} diff --git a/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx b/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx index 4e1c20b7de5..180c135fad3 100644 --- a/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx +++ b/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx @@ -844,6 +844,9 @@ const selectOptions = { { value: 'BANKKONTO', label: 'Bankkonto' }, { value: 'BANKKONTO_NORGE', label: 'Norsk bankkonto' }, { value: 'BANKKONTO_UTLAND', label: 'Utenlandsk bankkonto' }, + // TODO: Legg inn skattekort + // TODO: Legg inn yrkesskade + // TODO: Legg inn flere register??? ], } From f25c1facaea97c871903ea04867ddf81fdfc9b27 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 8 Oct 2024 10:40:50 +0200 Subject: [PATCH 02/30] Yrkesskade form foerste utkast --- .../stegVelger/steg/steg1/paneler/Sykdom.tsx | 5 +- .../stegVelger/steg/steg2/Steg2.tsx | 2 + .../components/bestillingsveileder/utils.tsx | 1 + .../fagsystem/yrkesskader/form/Form.tsx | 177 ++++++++++++++++++ .../fagsystem/yrkesskader/initialValues.tsx | 4 +- .../js/src/components/ui/form/formUtils.tsx | 1 + .../src/main/js/src/service/SelectOptions.tsx | 19 ++ 7 files changed, 205 insertions(+), 4 deletions(-) create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx 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 d43584c21cb..7ce326579ab 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 @@ -5,6 +5,7 @@ import { sykdomAttributt } from '@/components/fagsystem/sykdom/form/Form' import { useContext } from 'react' import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' import { initialYrkesskade } from '@/components/fagsystem/yrkesskader/initialValues' +import { yrkesskaderAttributt } from '@/components/fagsystem/yrkesskader/form/Form' export const SykdomPanel = ({ stateModifier, formValues }: any) => { const sm = stateModifier(SykdomPanel.initialValues) @@ -24,7 +25,7 @@ export const SykdomPanel = ({ stateModifier, formValues }: any) => { checkAttributeArray={() => sm.batchAdd(harGyldigSykemeldingBestilling ? ['sykemelding'] : [])} uncheckAttributeArray={sm.batchRemove} iconType="sykdom" - startOpen={harValgtAttributt(formValues, [sykdomAttributt])} + startOpen={harValgtAttributt(formValues, [sykdomAttributt, yrkesskaderAttributt])} > ({ }, }, yrkesskader: { - label: 'Har yrkesskade', + label: 'Har yrkesskader', checked: has('yrkesskader'), add() { set('yrkesskader', [initialYrkesskade]) 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 b742fc3c344..7576fcea519 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 @@ -27,6 +27,7 @@ import { useFormContext } from 'react-hook-form' import { SkattekortForm } from '@/components/fagsystem/skattekort/form/Form' import { PensjonsavtaleForm } from '@/components/fagsystem/pensjonsavtale/form/Form' import { AfpOffentligForm } from '@/components/fagsystem/afpOffentlig/form/Form' +import { YrkesskaderForm } from '@/components/fagsystem/yrkesskader/form/Form' const gruppeNavn = (gruppe) => {gruppe.navn} @@ -81,6 +82,7 @@ export const Steg2 = () => { + diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/utils.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/utils.tsx index 7cab3240fab..cc018c30744 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/utils.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/utils.tsx @@ -73,6 +73,7 @@ export const rootPaths = [ 'dokarkiv', 'medl', 'sykemelding', + 'yrkesskader', 'organisasjon', 'skattekort', ] diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx new file mode 100644 index 00000000000..65eb2e91a33 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -0,0 +1,177 @@ +import { useFormContext } from 'react-hook-form' +import React from 'react' +import { Vis } from '@/components/bestillingsveileder/VisAttributt' +import Panel from '@/components/ui/panel/Panel' +import { erForsteEllerTest, panelError } from '@/components/ui/form/formUtils' +import { + initialYrkesskade, + initialYrkesskadePeriode, +} from '@/components/fagsystem/yrkesskader/initialValues' +import { FormSelect } from '@/components/ui/form/inputs/select/Select' +import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import { PdlEksisterendePerson } from '@/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson' +import { SelectOptionsManager as Options } from '@/service/SelectOptions' +import { FormDateTimepicker } from '@/components/ui/form/inputs/timepicker/Timepicker' +import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' +import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' +import { OrganisasjonMedArbeidsforholdSelect } from '@/components/organisasjonSelect' + +export const yrkesskaderAttributt = 'yrkesskader' + +export const YrkesskaderForm = () => { + const formMethods = useFormContext() + + // TODO: Krav om arbeidsgiver dersom innmelderrolle === virksomhetsrepresentant + + return ( + + + + {(path: string, idx: number) => { + return ( + + {/*skadelidtIdentifikator: '', //TODO: Blir satt av BE?*/} + + {/*rolletype: '',*/} + + + {/*innmelderIdentifikator: '',*/} + {formMethods.watch(`${path}.innmelderrolle`) === 'vergeOgForesatt' && ( + + )} + + {/*innmelderrolle: '',*/} + + + {/*klassifisering: '',*/} + + + {/*paaVegneAv: '', //TODO: Lag denne*/} + {formMethods.watch(`${path}.innmelderrolle`) === 'virksomhetsrepresentant' && ( + + )} + + {/*tidstype: '',*/} + + + {/*skadetidspunkt: null,*/} + {formMethods.watch(`${path}.tidstype`) === 'tidspunkt' && ( + + )} + + {/*perioder: [initialYrkesskadePeriode],*/} + {formMethods.watch(`${path}.tidstype`) === 'periode' && ( + + {(periodePath: string, periodeIdx: number) => { + return ( + + + + + ) + }} + + )} + + {/*referanse: '',*/} + + + {/*ferdigstillSak: '',*/} + + + ) + }} + + + + ) +} + +YrkesskaderForm.validation = {} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx index 7f28522d5a5..9a8643de6e1 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx @@ -7,8 +7,8 @@ export const initialYrkesskade = { skadelidtIdentifikator: '', rolletype: '', innmelderIdentifikator: '', - innmelderrolle: '', - klassifisering: '', + innmelderrolle: 'virksomhetsrepresentant', + klassifisering: 'MANUELL', paaVegneAv: '', tidstype: '', skadetidspunkt: null, 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 f8b1a54667c..432e6e6c9d3 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 @@ -78,6 +78,7 @@ const getValgteAttributter = (values) => { 'pensjonforvalter.afpOffentlig', 'arenaforvalter', 'sykemelding', + 'yrkesskader', 'brregstub', 'instdata', 'krrstub', diff --git a/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx b/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx index 180c135fad3..31c34d01879 100644 --- a/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx +++ b/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx @@ -818,6 +818,25 @@ const selectOptions = { { value: 'Tysk', label: 'Tysk' }, ], + // Yrkesskader: + klassifisering: [ + { value: 'BAGATELLMESSIGE_SKADER', label: 'Bagatellmessige skader' }, + { value: 'MANUELL', label: 'Manuell' }, + { value: 'IMPORT', label: 'Import' }, + ], + + tidstype: [ + { value: 'tidspunkt', label: 'Tidspunkt (skade)' }, + { value: 'periode', label: 'Periode (sykdom)' }, + { value: 'ukjent', label: 'Ukjent' }, + ], + + ferdigstillSak: [ + { value: 'GODKJENT', label: 'Godkjent' }, + { value: 'AVSLAG', label: 'Avslag' }, + ], + + // Dolly-soek: registerTyper: [ { value: 'AAREG', label: 'Arbeidsforhold (Aareg)' }, { value: 'SIGRUN_LIGNET', label: 'Sigrun lignet inntekt' }, From bb6ba091ca9de9929a9ecca57e0a7f786db8d2ce Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 8 Oct 2024 12:44:54 +0200 Subject: [PATCH 03/30] Bestillingsvisning --- .../kriterier/BestillingKriterieMapper.tsx | 31 ++++++++++++++++++- .../fagsystem/yrkesskader/initialValues.tsx | 2 +- 2 files changed, 31 insertions(+), 2 deletions(-) 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 64bde954c53..71d28bd3c5f 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 @@ -4,6 +4,7 @@ import { arrayToString, codeToNorskLabel, formatDate, + formatDateTime, formatDateTimeWithSeconds, formatDateToYear, omraaderArrayToString, @@ -1270,7 +1271,7 @@ const mapInntektStub = (bestillingData, data) => { inntektStub.itemRows.push([ { numberHeader: `Inntektsinformasjon ${i + 1}` }, obj('År/måned', inntektsinfo.sisteAarMaaned), - obj('Rapporteringstidspunkt', inntektsinfo.rapporteringsdato), + obj('Rapporteringstidspunkt', formatDateTime(inntektsinfo.rapporteringsdato)), obj('Generer antall måneder', inntektsinfo.antallMaaneder), obj('Virksomhet (orgnr/id)', inntektsinfo.virksomhet), obj('Opplysningspliktig (orgnr/id)', inntektsinfo.opplysningspliktig), @@ -1572,6 +1573,33 @@ const mapSykemelding = (bestillingData, data) => { } } +const mapYrkesskader = (bestillingData, data) => { + const yrkesskadeKriterier = bestillingData.yrkesskader + + const mapYrkesskadeKriterier = () => ({ + header: 'Yrkesskader', + itemRows: yrkesskadeKriterier.map((yrkesskade, i) => [ + { + numberHeader: `Yrkesskade ${i + 1}`, + }, + // obj('Skadelidt identifikator', yrkesskade.skadelidtIdentifikator), + obj('Rolletype', yrkesskade.rolletype), //TODO: kodeverk + obj('Innmelder', yrkesskade.innmelderIdentifikator), + obj('Innmelder rolle', yrkesskade.innmelderrolle), //TODO: kodeverk + obj('Klassifisering', showLabel('klassifisering', yrkesskade.klassifisering)), + obj('På vegne av', yrkesskade.paaVegneAv), + obj('Tidstype', showLabel('tidstype', yrkesskade.tidstype)), + obj('Skadetidspunkt', formatDateTime(yrkesskade.skadetidspunkt)), + obj('Antall perioder', yrkesskade.perioder?.length), + obj('Referanse', yrkesskade.referanse), + obj('Ferdigstill sak', showLabel('ferdigstillSak', yrkesskade.ferdigstillSak)), + // TODO: Fix rekkefølge + ]), + }) + + data.push(mapYrkesskadeKriterier()) +} + const mapBrregstub = (bestillingData, data) => { const brregstubKriterier = bestillingData.brregstub @@ -2431,6 +2459,7 @@ export function mapBestillingData(bestillingData, bestillingsinformasjon, firstI mapPensjon(bestillingData, data, navEnheter) mapArena(bestillingData, data) mapSykemelding(bestillingData, data) + mapYrkesskader(bestillingData, data) mapBrregstub(bestillingData, data) mapInst(bestillingData, data) mapKrr(bestillingData, data) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx index 9a8643de6e1..50ac42b62ee 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx @@ -4,7 +4,7 @@ export const initialYrkesskadePeriode = { } export const initialYrkesskade = { - skadelidtIdentifikator: '', + // skadelidtIdentifikator: '', rolletype: '', innmelderIdentifikator: '', innmelderrolle: 'virksomhetsrepresentant', From 3664619fbf91fec53032b058d8d6b7ca4efd82f4 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 8 Oct 2024 13:41:25 +0200 Subject: [PATCH 04/30] Org-toggle paa vegne av --- .../form/partials/orgnrToogle.tsx | 13 ++-- .../fagsystem/yrkesskader/form/Form.tsx | 60 +++++++++---------- .../fagsystem/yrkesskader/initialValues.tsx | 2 +- 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/form/partials/orgnrToogle.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/form/partials/orgnrToogle.tsx index d4ec46351d6..83590fb941f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/form/partials/orgnrToogle.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/form/partials/orgnrToogle.tsx @@ -12,9 +12,14 @@ import { ORGANISASJONSTYPE_TOGGLE } from '@/components/fagsystem/inntektstub/for interface OrgnrToggleProps { path: string formMethods: UseFormReturn + label?: string } -export const OrgnrToggle = ({ path, formMethods }: OrgnrToggleProps) => { +export const OrgnrToggle = ({ + path, + formMethods, + label = 'Arbeidsgiver (orgnr)', +}: OrgnrToggleProps) => { const [inputType, setInputType] = useState( sessionStorage.getItem(ORGANISASJONSTYPE_TOGGLE) || inputValg.fraFellesListe, ) @@ -40,7 +45,7 @@ export const OrgnrToggle = ({ path, formMethods }: OrgnrToggleProps) => { {inputType === inputValg.fraFellesListe && ( @@ -48,7 +53,7 @@ export const OrgnrToggle = ({ path, formMethods }: OrgnrToggleProps) => { {inputType === inputValg.fraEgenListe && ( { /> )} {inputType === inputValg.skrivSelv && ( - + )} ) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index 65eb2e91a33..36f99a61546 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -14,7 +14,7 @@ import { SelectOptionsManager as Options } from '@/service/SelectOptions' import { FormDateTimepicker } from '@/components/ui/form/inputs/timepicker/Timepicker' import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' -import { OrganisasjonMedArbeidsforholdSelect } from '@/components/organisasjonSelect' +import { OrgnrToggle } from '@/components/fagsystem/inntektsmelding/form/partials/orgnrToogle' export const yrkesskaderAttributt = 'yrkesskader' @@ -40,7 +40,7 @@ export const YrkesskaderForm = () => { {(path: string, idx: number) => { return ( - {/*skadelidtIdentifikator: '', //TODO: Blir satt av BE?*/} + {/*skadelidtIdentifikator: '', //TODO: Blir satt av BE*/} {/*rolletype: '',*/} { size="xlarge" /> - {/*innmelderIdentifikator: '',*/} - {formMethods.watch(`${path}.innmelderrolle`) === 'vergeOgForesatt' && ( - - )} - {/*innmelderrolle: '',*/} { size="large" /> + {/*innmelderIdentifikator: '',*/} + {formMethods.watch(`${path}.innmelderrolle`) === 'vergeOgForesatt' && ( + + )} + + {/*paaVegneAv: '',*/} + {formMethods.watch(`${path}.innmelderrolle`) === 'virksomhetsrepresentant' && ( + + )} + {/*klassifisering: '',*/} { size="large" /> - {/*paaVegneAv: '', //TODO: Lag denne*/} - {formMethods.watch(`${path}.innmelderrolle`) === 'virksomhetsrepresentant' && ( - - )} + {/*referanse: '',*/} + + + {/*ferdigstillSak: '',*/} + {/*tidstype: '',*/} { }} )} - - {/*referanse: '',*/} - - - {/*ferdigstillSak: '',*/} - ) }} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx index 50ac42b62ee..29c3f0dd42b 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx @@ -5,7 +5,7 @@ export const initialYrkesskadePeriode = { export const initialYrkesskade = { // skadelidtIdentifikator: '', - rolletype: '', + rolletype: 'arbeidstaker', innmelderIdentifikator: '', innmelderrolle: 'virksomhetsrepresentant', klassifisering: 'MANUELL', From ae078264298f6c7b86e4a54b3a5a74ed9b8d0c28 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 8 Oct 2024 14:27:26 +0200 Subject: [PATCH 05/30] Changehandling --- .../fagsystem/yrkesskader/form/Form.tsx | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index 36f99a61546..402b8a917bf 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -21,7 +21,21 @@ export const yrkesskaderAttributt = 'yrkesskader' export const YrkesskaderForm = () => { const formMethods = useFormContext() - // TODO: Krav om arbeidsgiver dersom innmelderrolle === virksomhetsrepresentant + const handleChangeInnmelderrolle = (value, path) => { + formMethods.setValue(`${path}.innmelderrolle`, value?.value) + formMethods.setValue(`${path}.innmelderIdentifikator`, '') + formMethods.setValue(`${path}.paaVegneAv`, '') + formMethods.trigger(path) + } + + const handleChangeTidstype = (value, path) => { + formMethods.setValue(`${path}.tidstype`, value?.value) + formMethods.setValue(`${path}.skadetidspunkt`, null) + formMethods.setValue(`${path}.perioder`, [initialYrkesskadePeriode]) + formMethods.trigger(path) + } + + // TODO: Krav om arbeidsgiver dersom innmelderrolle === virksomhetsrepresentant??? return ( @@ -40,7 +54,7 @@ export const YrkesskaderForm = () => { {(path: string, idx: number) => { return ( - {/*skadelidtIdentifikator: '', //TODO: Blir satt av BE*/} + {/*skadelidtIdentifikator: '', // Blir satt av BE*/} {/*rolletype: '',*/} { ]} //TODO: Bruk kodeverk innmelderrolle // kodeverk={null} - //TODO: onChange for å nullstille innmelderIdentifikator og paavegneAv - // onChange={} + onChange={(value) => handleChangeInnmelderrolle(value, path)} size="large" /> @@ -121,8 +134,7 @@ export const YrkesskaderForm = () => { label="Tidstype" options={Options('tidstype')} size="medium" - //TODO: onChange for å nullstille skadetidspunkt og perioder - // onChange={} + onChange={(value) => handleChangeTidstype(value, path)} /> {/*skadetidspunkt: null,*/} From 3a2c72b9397f21badb667deded52f22a756f5d18 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 8 Oct 2024 14:36:44 +0200 Subject: [PATCH 06/30] Fix rekkefolge bestilling --- .../sammendrag/kriterier/BestillingKriterieMapper.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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 71d28bd3c5f..076a40e5ad5 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 @@ -1584,16 +1584,15 @@ const mapYrkesskader = (bestillingData, data) => { }, // obj('Skadelidt identifikator', yrkesskade.skadelidtIdentifikator), obj('Rolletype', yrkesskade.rolletype), //TODO: kodeverk + obj('Innmelderrolle', yrkesskade.innmelderrolle), //TODO: kodeverk obj('Innmelder', yrkesskade.innmelderIdentifikator), - obj('Innmelder rolle', yrkesskade.innmelderrolle), //TODO: kodeverk - obj('Klassifisering', showLabel('klassifisering', yrkesskade.klassifisering)), obj('På vegne av', yrkesskade.paaVegneAv), + obj('Klassifisering', showLabel('klassifisering', yrkesskade.klassifisering)), + obj('Referanse', yrkesskade.referanse), + obj('Ferdigstill sak', showLabel('ferdigstillSak', yrkesskade.ferdigstillSak)), obj('Tidstype', showLabel('tidstype', yrkesskade.tidstype)), obj('Skadetidspunkt', formatDateTime(yrkesskade.skadetidspunkt)), obj('Antall perioder', yrkesskade.perioder?.length), - obj('Referanse', yrkesskade.referanse), - obj('Ferdigstill sak', showLabel('ferdigstillSak', yrkesskade.ferdigstillSak)), - // TODO: Fix rekkefølge ]), }) From 8ed513909c69fd3ba525ca08f752a70417db71c6 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Thu, 10 Oct 2024 10:19:19 +0200 Subject: [PATCH 07/30] Smaafix --- .../src/main/js/package-lock.json | 33 ------------------- .../fagsystem/yrkesskader/form/Form.tsx | 4 +-- .../fagsystem/yrkesskader/initialValues.tsx | 10 +++--- 3 files changed, 7 insertions(+), 40 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/package-lock.json b/apps/dolly-frontend/src/main/js/package-lock.json index 2c755c1db70..82a2894dee4 100644 --- a/apps/dolly-frontend/src/main/js/package-lock.json +++ b/apps/dolly-frontend/src/main/js/package-lock.json @@ -53,7 +53,6 @@ "@navikt/ds-css": "^7.1.0", "@navikt/ds-icons": "^3.4.3", "@navikt/ds-react": "^7.1.0", - "@playwright/experimental-ct-react": "^1.47.2", "@playwright/test": "^1.44.1", "@redux-devtools/extension": "^3.3.0", "@reduxjs/toolkit": "^2.2.1", @@ -1992,38 +1991,6 @@ "node": ">=14" } }, - "node_modules/@playwright/experimental-ct-core": { - "version": "1.47.2", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.47.2.tgz", - "integrity": "sha512-aTR254jpS7mpuX8Od6vt9zOOmeuZ1PPI8aaT3vxb8lOtRWoq/XsCsnlxu3eWInbDsiYyAEcxPsiGLU9PXgC4LQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.47.2", - "playwright-core": "1.47.2", - "vite": "^5.2.8" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@playwright/experimental-ct-react": { - "version": "1.47.2", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.47.2.tgz", - "integrity": "sha512-taWSdPhbdXl6dsC2RmlfGoOy9moeBxMdV7j4n/IEXfzMWu7GshUR9kAESg3QsV03i1vU8kTX5Ko28Yt3ISnk4w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@playwright/experimental-ct-core": "1.47.2", - "@vitejs/plugin-react": "^4.2.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@playwright/test": { "version": "1.47.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.47.2.tgz", diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index 402b8a917bf..2469d07237a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -23,8 +23,8 @@ export const YrkesskaderForm = () => { const handleChangeInnmelderrolle = (value, path) => { formMethods.setValue(`${path}.innmelderrolle`, value?.value) - formMethods.setValue(`${path}.innmelderIdentifikator`, '') - formMethods.setValue(`${path}.paaVegneAv`, '') + formMethods.setValue(`${path}.innmelderIdentifikator`, null) + formMethods.setValue(`${path}.paaVegneAv`, null) formMethods.trigger(path) } diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx index 29c3f0dd42b..2a5ec89801e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx @@ -6,13 +6,13 @@ export const initialYrkesskadePeriode = { export const initialYrkesskade = { // skadelidtIdentifikator: '', rolletype: 'arbeidstaker', - innmelderIdentifikator: '', + innmelderIdentifikator: null, innmelderrolle: 'virksomhetsrepresentant', klassifisering: 'MANUELL', - paaVegneAv: '', - tidstype: '', + paaVegneAv: null, + tidstype: null, skadetidspunkt: null, perioder: [initialYrkesskadePeriode], - referanse: '', - ferdigstillSak: '', + referanse: null, + ferdigstillSak: null, } From f8a7e121adc497e0c69d0dd57fd9586da21451d8 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Fri, 11 Oct 2024 11:28:24 +0200 Subject: [PATCH 08/30] Infotekster og tilpasninger av form --- .../fagsystem/yrkesskader/form/Form.tsx | 326 ++++++++++-------- .../fagsystem/yrkesskader/initialValues.tsx | 4 +- 2 files changed, 188 insertions(+), 142 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index 2469d07237a..7ab97945b64 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -15,18 +15,19 @@ import { FormDateTimepicker } from '@/components/ui/form/inputs/timepicker/Timep import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' import { OrgnrToggle } from '@/components/fagsystem/inntektsmelding/form/partials/orgnrToogle' +import StyledAlert from '@/components/ui/alert/StyledAlert' export const yrkesskaderAttributt = 'yrkesskader' export const YrkesskaderForm = () => { const formMethods = useFormContext() - const handleChangeInnmelderrolle = (value, path) => { - formMethods.setValue(`${path}.innmelderrolle`, value?.value) - formMethods.setValue(`${path}.innmelderIdentifikator`, null) - formMethods.setValue(`${path}.paaVegneAv`, null) - formMethods.trigger(path) - } + // const handleChangeInnmelderrolle = (value, path) => { + // formMethods.setValue(`${path}.innmelderrolle`, value?.value) + // formMethods.setValue(`${path}.innmelderIdentifikator`, null) + // formMethods.setValue(`${path}.paaVegneAv`, null) + // formMethods.trigger(path) + // } const handleChangeTidstype = (value, path) => { formMethods.setValue(`${path}.tidstype`, value?.value) @@ -35,7 +36,43 @@ export const YrkesskaderForm = () => { formMethods.trigger(path) } - // TODO: Krav om arbeidsgiver dersom innmelderrolle === virksomhetsrepresentant??? + const manglerVergeEllerForelder = () => { + // TODO: Sjekk personFoerLeggTil og importPersoner (og ander??) + const vergemaal = formMethods.watch('pdldata.person.vergemaal') + const forelder = formMethods + .watch('pdldata.person.forelderBarnRelasjon') + ?.filter((relasjon) => relasjon?.relatertPersonsRolle === 'FORELDER') + const harInnmelderrolleVergeOgForesatt = formMethods + .watch('yrkesskader') + ?.some((yrkesskade) => yrkesskade?.innmelderrolle === 'vergeOgForesatt') + return ( + harInnmelderrolleVergeOgForesatt && + (!vergemaal || vergemaal?.length < 1) && + (!forelder || forelder?.length < 1) + ) + } + + const hjelpetekst = ( + <> +

+ Det er kun rolletyper som blir rutet til KOMPYS som vil få opprettet en synlig sak. Saker + som går til GOSYS må manuelt behandles før de kan dukke opp i Infotrygd og deretter dukke + opp i saksliste. +

+

Foreløpige kriterier for ruting til Kompys er:

+
    +
  • Det må være bagatellmessige skader.
  • +
  • Bruker kan ikke ha en eksisterende sak.
  • +
  • + Bruker kan ikke ha en potensiell innkommende sak/oppgave/behandling (sjekkes i Joark). +
  • +
  • + Rolletype er elevEllerStudent, vernepliktigIFoerstegangstjenesten eller + vernepliktigIRepetisjonstjeneste (utvides stadig støtte for flere rolletyper). +
  • +
+ + ) return ( @@ -44,143 +81,152 @@ export const YrkesskaderForm = () => { hasErrors={panelError(yrkesskaderAttributt)} iconType="sykdom" startOpen={erForsteEllerTest(formMethods.getValues(), [yrkesskaderAttributt])} + informasjonstekst={hjelpetekst} > - - {(path: string, idx: number) => { - return ( - - {/*skadelidtIdentifikator: '', // Blir satt av BE*/} - - {/*rolletype: '',*/} - - - {/*innmelderrolle: '',*/} - handleChangeInnmelderrolle(value, path)} - size="large" - /> - - {/*innmelderIdentifikator: '',*/} - {formMethods.watch(`${path}.innmelderrolle`) === 'vergeOgForesatt' && ( - + {manglerVergeEllerForelder() && ( + + Person må ha verge, eller forelder dersom alder er 5-17 år. Dette kan legges til ved å + huke av for "Vergemål" eller "Har barn/foreldre" på forrige side. + + )} + + {(path: string, idx: number) => { + return ( + + {/*skadelidtIdentifikator: '', // Blir satt av BE*/} + + {/*rolletype: '',*/} + - )} - - {/*paaVegneAv: '',*/} - {formMethods.watch(`${path}.innmelderrolle`) === 'virksomhetsrepresentant' && ( - handleChangeInnmelderrolle(value, path)} + size="large" /> - )} - - {/*klassifisering: '',*/} - - - {/*referanse: '',*/} - - - {/*ferdigstillSak: '',*/} - - - {/*tidstype: '',*/} - handleChangeTidstype(value, path)} - /> - - {/*skadetidspunkt: null,*/} - {formMethods.watch(`${path}.tidstype`) === 'tidspunkt' && ( - */} + {/*)}*/} + + {/*paaVegneAv: '',*/} + {/*{formMethods.watch(`${path}.innmelderrolle`) === 'virksomhetsrepresentant' && (*/} + {/* */} + {/*)}*/} + + {/*klassifisering: '',*/} + - )} - - {/*perioder: [initialYrkesskadePeriode],*/} - {formMethods.watch(`${path}.tidstype`) === 'periode' && ( - - {(periodePath: string, periodeIdx: number) => { - return ( - - - - - ) - }} - - )} - - ) - }} - + + {/*referanse: '',*/} + + + {/*ferdigstillSak: '',*/} + + + {/*tidstype: '',*/} + handleChangeTidstype(value, path)} + /> + + {/*skadetidspunkt: null,*/} + {formMethods.watch(`${path}.tidstype`) === 'tidspunkt' && ( + + )} + + {/*perioder: [initialYrkesskadePeriode],*/} + {formMethods.watch(`${path}.tidstype`) === 'periode' && ( + + {(periodePath: string, periodeIdx: number) => { + return ( + + + + + ) + }} + + )} + + ) + }} + + ) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx index 2a5ec89801e..39fe650d58e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx @@ -6,10 +6,10 @@ export const initialYrkesskadePeriode = { export const initialYrkesskade = { // skadelidtIdentifikator: '', rolletype: 'arbeidstaker', - innmelderIdentifikator: null, + // innmelderIdentifikator: null, innmelderrolle: 'virksomhetsrepresentant', klassifisering: 'MANUELL', - paaVegneAv: null, + // paaVegneAv: null, tidstype: null, skadetidspunkt: null, perioder: [initialYrkesskadePeriode], From 36b4297c14b2ed62f0ecb3ebe96c4c4df2f4d933 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Fri, 11 Oct 2024 19:20:44 +0200 Subject: [PATCH 09/30] Visning av yrkesskade-data paa person --- .../kriterier/BestillingKriterieMapper.tsx | 4 +- .../fagsystem/yrkesskader/form/Form.tsx | 2 + .../fagsystem/yrkesskader/initialValues.tsx | 2 +- .../visning/YrkesskaderVisning.tsx | 79 +++++++++++++++++++ .../gruppe/PersonVisning/PersonVisning.tsx | 15 ++++ .../js/src/utils/SjekkBestillingFagsystem.tsx | 10 +++ 6 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx 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 076a40e5ad5..4b2b8fe5016 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 @@ -1585,8 +1585,8 @@ const mapYrkesskader = (bestillingData, data) => { // obj('Skadelidt identifikator', yrkesskade.skadelidtIdentifikator), obj('Rolletype', yrkesskade.rolletype), //TODO: kodeverk obj('Innmelderrolle', yrkesskade.innmelderrolle), //TODO: kodeverk - obj('Innmelder', yrkesskade.innmelderIdentifikator), - obj('På vegne av', yrkesskade.paaVegneAv), + // obj('Innmelder', yrkesskade.innmelderIdentifikator), + // obj('På vegne av', yrkesskade.paaVegneAv), obj('Klassifisering', showLabel('klassifisering', yrkesskade.klassifisering)), obj('Referanse', yrkesskade.referanse), obj('Ferdigstill sak', showLabel('ferdigstillSak', yrkesskade.ferdigstillSak)), diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index 7ab97945b64..d5e2fd5976e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -95,6 +95,8 @@ export const YrkesskaderForm = () => { header={'Yrkesskade'} newEntry={initialYrkesskade} canBeEmpty={false} + // maxEntries={1} + //TODO: Bare 1 yrkesskade per person??? > {(path: string, idx: number) => { return ( diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx index 39fe650d58e..f4f818ef2b4 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx @@ -12,7 +12,7 @@ export const initialYrkesskade = { // paaVegneAv: null, tidstype: null, skadetidspunkt: null, - perioder: [initialYrkesskadePeriode], + perioder: null, referanse: null, ferdigstillSak: null, } diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx new file mode 100644 index 00000000000..01c4315ea7d --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx @@ -0,0 +1,79 @@ +import React from 'react' +import { Alert } from '@navikt/ds-react' +import Loading from '@/components/ui/loading/Loading' +import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' +import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import { TitleValue } from '@/components/ui/titleValue/TitleValue' +import { formatDateTime, showLabel, formatDate } from '@/utils/DataFormatter' + +export const sjekkManglerYrkesskadeData = (yrkesskadeData) => { + return !yrkesskadeData || yrkesskadeData?.length < 1 +} + +export const YrkesskaderVisning = ({ data, loading }) => { + if (loading) { + return + } + + if (!data) { + return null + } + + const manglerFagsystemData = sjekkManglerYrkesskadeData(data) + + return ( +
+ + {manglerFagsystemData ? ( + + Fant ikke yrkesskade-data på person + + ) : ( +
+ + {(yrkesskade, idx) => { + return ( + + + {/*//TODO: kodeverk*/} + + {/*//TODO: kodeverk*/} + + + + + + + + + {(periode, periodeIdx) => ( + + + + + )} + + + ) + }} + +
+ )} +
+ ) +} 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 f7ab1421258..107ede10771 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 @@ -67,6 +67,7 @@ import { harTpBestilling, harUdistubBestilling, harUforetrygdBestilling, + harYrkesskaderBestilling, } from '@/utils/SjekkBestillingFagsystem' import { AlderspensjonVisning, @@ -99,6 +100,10 @@ import { SkattekortVisning } from '@/components/fagsystem/skattekort/visning/Vis import { PensjonsavtaleVisning } from '@/components/fagsystem/pensjonsavtale/visning/PensjonsavtaleVisning' import { useMockOppsett } from '@/utils/hooks/usePensjon' import { AfpOffentligVisning } from '@/components/fagsystem/afpOffentlig/visning/AfpOffentligVisning' +import { + sjekkManglerYrkesskadeData, + YrkesskaderVisning, +} from '@/components/fagsystem/yrkesskader/visning/YrkesskaderVisning' const getIdenttype = (ident) => { if (parseInt(ident.charAt(0)) > 3) { @@ -246,6 +251,12 @@ export default ({ const sykemeldingBestilling = SykemeldingVisning.filterValues(bestillingListe, ident.ident) + const { loading: loadingYrkesskadeData, data: yrkesskadeData } = useTransaksjonIdData( + ident.ident, + 'YRKESSKADE', + harYrkesskaderBestilling(bestillingerFagsystemer), + ) + const { loading: loadingInntektsmeldingData, data: inntektsmeldingData } = useTransaksjonIdData( ident.ident, 'INNTKMELD', @@ -312,6 +323,9 @@ export default ({ ) { return true } + if (yrkesskadeData && sjekkManglerYrkesskadeData(yrkesskadeData)) { + return true + } return false } @@ -539,6 +553,7 @@ export default ({ harSykemeldingBestilling(bestillingerFagsystemer) ? sykemeldingBestilling : null } /> + { return sykemelding } +export const harYrkesskaderBestilling = (bestillingerFagsystemer) => { + let yrkesskader = false + bestillingerFagsystemer?.forEach((i) => { + if (i?.yrkesskader) { + yrkesskader = true + } + }) + return yrkesskader +} + export const harInntektsmeldingBestilling = (bestillingerFagsystemer) => { let inntektsmelding = false bestillingerFagsystemer?.forEach((i) => { From a475bd6ca2006db436c34f79ad518ab5746629c3 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Mon, 14 Oct 2024 13:39:47 +0200 Subject: [PATCH 10/30] Forsoek paa aa hente kodeverk --- apps/dolly-frontend/config.idporten.yml | 1 + apps/dolly-frontend/config.test.yml | 1 + apps/dolly-frontend/config.unstable.yml | 1 + apps/dolly-frontend/config.yml | 1 + .../src/main/js/proxy-routes.json | 5 +++++ .../visning/YrkesskaderVisning.tsx | 4 ++++ .../main/js/src/utils/hooks/useYrkesskade.tsx | 21 +++++++++++++++++++ .../src/main/resources/application.yml | 5 +++++ 8 files changed, 39 insertions(+) create mode 100644 apps/dolly-frontend/src/main/js/src/utils/hooks/useYrkesskade.tsx diff --git a/apps/dolly-frontend/config.idporten.yml b/apps/dolly-frontend/config.idporten.yml index fac21c7597c..26a1b76de43 100644 --- a/apps/dolly-frontend/config.idporten.yml +++ b/apps/dolly-frontend/config.idporten.yml @@ -56,6 +56,7 @@ spec: - application: testnav-varslinger-service - application: testnorge-profil-api - application: testnorge-tilbakemelding-api + - application: testnav-yrkesskade-proxy external: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/config.test.yml b/apps/dolly-frontend/config.test.yml index 1844b03a0b1..ab094b75d80 100644 --- a/apps/dolly-frontend/config.test.yml +++ b/apps/dolly-frontend/config.test.yml @@ -62,6 +62,7 @@ spec: - application: testnav-levende-arbeidsforhold-ansettelse - application: testnav-levende-arbeidsforhold-scheduler - application: testnav-skattekort-service + - application: testnav-yrkesskade-proxy external: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/config.unstable.yml b/apps/dolly-frontend/config.unstable.yml index 5a24b4f9360..ce2e6f9d8a8 100644 --- a/apps/dolly-frontend/config.unstable.yml +++ b/apps/dolly-frontend/config.unstable.yml @@ -55,6 +55,7 @@ spec: - application: testnorge-profil-api-dev - application: testnorge-tilbakemelding-api - application: testnav-skattekort-service + - application: testnav-yrkesskade-proxy external: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/config.yml b/apps/dolly-frontend/config.yml index 5f7d016f3a5..9dafd8ea194 100644 --- a/apps/dolly-frontend/config.yml +++ b/apps/dolly-frontend/config.yml @@ -66,6 +66,7 @@ spec: - application: testnorge-tilbakemelding-api - application: testnav-levende-arbeidsforhold-ansettelse - application: testnav-levende-arbeidsforhold-scheduler + - application: testnav-yrkesskade-proxy external: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/src/main/js/proxy-routes.json b/apps/dolly-frontend/src/main/js/proxy-routes.json index 859caa2d6c0..ac756604110 100644 --- a/apps/dolly-frontend/src/main/js/proxy-routes.json +++ b/apps/dolly-frontend/src/main/js/proxy-routes.json @@ -243,5 +243,10 @@ "target": "http://localhost:8020", "changeOrigin": true, "secure": false + }, + "/testnav-yrkesskade-proxy": { + "target": "http://localhost:8020", + "changeOrigin": true, + "secure": false } } \ No newline at end of file diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx index 01c4315ea7d..60443bd9ebd 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx @@ -5,6 +5,7 @@ import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { formatDateTime, showLabel, formatDate } from '@/utils/DataFormatter' +import { useYrkesskadeKodeverk } from '@/utils/hooks/useYrkesskade' export const sjekkManglerYrkesskadeData = (yrkesskadeData) => { return !yrkesskadeData || yrkesskadeData?.length < 1 @@ -21,6 +22,9 @@ export const YrkesskaderVisning = ({ data, loading }) => { const manglerFagsystemData = sjekkManglerYrkesskadeData(data) + const { kodeverkData, loading: yrkesskadeLoading, error } = useYrkesskadeKodeverk('ROLLETYPE') + console.log('kodeverkData: ', kodeverkData) //TODO - SLETT MEG + return (
diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useYrkesskade.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useYrkesskade.tsx new file mode 100644 index 00000000000..0ce42cd0db1 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useYrkesskade.tsx @@ -0,0 +1,21 @@ +import useSWR from 'swr' +import { fetcher } from '@/api' + +const baseUrl = '/testnav-yrkesskade-proxy' +const getKodeverkUrl = (kodeverktype) => `${baseUrl}/api/v1/kodeverk/${kodeverktype}` + +export const useYrkesskadeKodeverk = (kodeverktype) => { + const { data, isLoading, error } = useSWR( + getKodeverkUrl(kodeverktype), + fetcher, + // [getKodeverkUrl(kodeverktype)], + // (url) => fetcher(url), + ) + console.log('data: ', data) //TODO - SLETT MEG + + return { + kodeverkData: data, + loading: isLoading, + error: error, + } +} diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index 9a9fd54cbd5..842a8da0a4c 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -233,6 +233,11 @@ consumers: namespace: dolly name: testnav-levende-arbeidsforhold-scheduler url: http://testnav-levende-arbeidsforhold-scheduler.dolly.svc.cluster.local + testnav-yrkesskade-proxy: + cluster: dev-gcp + namespace: dolly + name: testnav-yrkesskade-proxy + url: https://testnav-yrkesskade-proxy.dolly.svc.cluster.local management: endpoints: From efbf2d101fb321e8a08bf9d1961d8f2485ea7a6d Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 15 Oct 2024 10:45:14 +0200 Subject: [PATCH 11/30] Validering og div fix --- .../kriterier/BestillingKriterieMapper.tsx | 43 ++++++++++--------- .../stegVelger/steg/steg2/DollyValidation.tsx | 2 + .../fagsystem/yrkesskader/form/Form.tsx | 4 +- .../fagsystem/yrkesskader/form/validation.tsx | 20 +++++++++ .../visning/YrkesskaderVisning.tsx | 18 ++++---- .../main/js/src/utils/hooks/useYrkesskade.tsx | 7 +-- 6 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/validation.tsx 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 4b2b8fe5016..87fe834f1d0 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 @@ -1576,27 +1576,28 @@ const mapSykemelding = (bestillingData, data) => { const mapYrkesskader = (bestillingData, data) => { const yrkesskadeKriterier = bestillingData.yrkesskader - const mapYrkesskadeKriterier = () => ({ - header: 'Yrkesskader', - itemRows: yrkesskadeKriterier.map((yrkesskade, i) => [ - { - numberHeader: `Yrkesskade ${i + 1}`, - }, - // obj('Skadelidt identifikator', yrkesskade.skadelidtIdentifikator), - obj('Rolletype', yrkesskade.rolletype), //TODO: kodeverk - obj('Innmelderrolle', yrkesskade.innmelderrolle), //TODO: kodeverk - // obj('Innmelder', yrkesskade.innmelderIdentifikator), - // obj('På vegne av', yrkesskade.paaVegneAv), - obj('Klassifisering', showLabel('klassifisering', yrkesskade.klassifisering)), - obj('Referanse', yrkesskade.referanse), - obj('Ferdigstill sak', showLabel('ferdigstillSak', yrkesskade.ferdigstillSak)), - obj('Tidstype', showLabel('tidstype', yrkesskade.tidstype)), - obj('Skadetidspunkt', formatDateTime(yrkesskade.skadetidspunkt)), - obj('Antall perioder', yrkesskade.perioder?.length), - ]), - }) - - data.push(mapYrkesskadeKriterier()) + if (yrkesskadeKriterier) { + const mapYrkesskadeKriterier = () => ({ + header: 'Yrkesskader', + itemRows: yrkesskadeKriterier.map((yrkesskade, i) => [ + { + numberHeader: `Yrkesskade ${i + 1}`, + }, + // obj('Skadelidt identifikator', yrkesskade.skadelidtIdentifikator), + obj('Rolletype', yrkesskade.rolletype), //TODO: kodeverk + obj('Innmelderrolle', yrkesskade.innmelderrolle), //TODO: kodeverk + // obj('Innmelder', yrkesskade.innmelderIdentifikator), + // obj('På vegne av', yrkesskade.paaVegneAv), + obj('Klassifisering', showLabel('klassifisering', yrkesskade.klassifisering)), + obj('Referanse', yrkesskade.referanse), + obj('Ferdigstill sak', showLabel('ferdigstillSak', yrkesskade.ferdigstillSak)), + obj('Tidstype', showLabel('tidstype', yrkesskade.tidstype)), + obj('Skadetidspunkt', formatDateTime(yrkesskade.skadetidspunkt)), + obj('Antall perioder', yrkesskade.perioder?.length), + ]), + }) + data.push(mapYrkesskadeKriterier()) + } } const mapBrregstub = (bestillingData, data) => { diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/DollyValidation.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/DollyValidation.tsx index 9fad3f3d878..e719937fb4b 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/DollyValidation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/DollyValidation.tsx @@ -22,6 +22,7 @@ import { MiljoVelger } from '@/components/miljoVelger/MiljoVelger' import { MalForm } from '@/components/bestillingsveileder/stegVelger/steg/steg3/MalForm' import { VelgGruppe } from '@/components/bestillingsveileder/stegVelger/steg/steg3/VelgGruppe' import { SkattekortForm } from '@/components/fagsystem/skattekort/form/Form' +import { YrkesskaderForm } from '@/components/fagsystem/yrkesskader/form/Form' export const DollyValidation = Yup.object({ ...PdlfForm.validation, @@ -33,6 +34,7 @@ export const DollyValidation = Yup.object({ ...InntektsmeldingForm.validation, ...SkattekortForm.validation, ...SykdomForm.validation, + ...YrkesskaderForm.validation, ...BrregstubForm.validation, ...InstForm.validation, ...KrrstubForm.validation, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index d5e2fd5976e..7d65bf05d50 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -16,6 +16,7 @@ import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicke import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' import { OrgnrToggle } from '@/components/fagsystem/inntektsmelding/form/partials/orgnrToogle' import StyledAlert from '@/components/ui/alert/StyledAlert' +import { validation } from '@/components/fagsystem/yrkesskader/form/validation' export const yrkesskaderAttributt = 'yrkesskader' @@ -136,6 +137,7 @@ export const YrkesskaderForm = () => { // kodeverk={null} // onChange={(value) => handleChangeInnmelderrolle(value, path)} size="large" + isClearable={false} /> {/*innmelderIdentifikator: '',*/} @@ -234,4 +236,4 @@ export const YrkesskaderForm = () => { ) } -YrkesskaderForm.validation = {} +YrkesskaderForm.validation = validation diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/validation.tsx new file mode 100644 index 00000000000..d2a0f005a52 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/validation.tsx @@ -0,0 +1,20 @@ +import { ifPresent, requiredString } from '@/utils/YupValidations' +import * as Yup from 'yup' + +export const validation = { + yrkesskader: ifPresent( + '$yrkesskader', + Yup.array().of( + Yup.object({ + rolletype: Yup.string().nullable(), + innmelderrolle: requiredString, + klassifisering: Yup.string().nullable(), + referanse: Yup.string().nullable(), + ferdigstillSak: Yup.string().nullable(), + tidstype: Yup.string().nullable(), + // skadetidspunkt: null, + // perioder: null, + }), + ), + ), +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx index 60443bd9ebd..e0977ffe363 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx @@ -64,14 +64,16 @@ export const YrkesskaderVisning = ({ data, loading }) => { title="Skadetidspunkt" value={formatDateTime(yrkesskade?.data?.skadetidspunkt)} /> - - {(periode, periodeIdx) => ( - - - - - )} - + {yrkesskade?.data?.perioder?.length > 0 && ( + + {(periode, periodeIdx) => ( + + + + + )} + + )} ) }} diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useYrkesskade.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useYrkesskade.tsx index 0ce42cd0db1..117c1094d92 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/hooks/useYrkesskade.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useYrkesskade.tsx @@ -5,12 +5,7 @@ const baseUrl = '/testnav-yrkesskade-proxy' const getKodeverkUrl = (kodeverktype) => `${baseUrl}/api/v1/kodeverk/${kodeverktype}` export const useYrkesskadeKodeverk = (kodeverktype) => { - const { data, isLoading, error } = useSWR( - getKodeverkUrl(kodeverktype), - fetcher, - // [getKodeverkUrl(kodeverktype)], - // (url) => fetcher(url), - ) + const { data, isLoading, error } = useSWR(getKodeverkUrl(kodeverktype), fetcher) console.log('data: ', data) //TODO - SLETT MEG return { From 24d3b4bdc21089b0adf94ed6b217875992c193c8 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 15 Oct 2024 15:54:21 +0200 Subject: [PATCH 12/30] Fix hent kodeverk + vis kodeverkdata --- .../web/DollyFrontendApplicationStarter.java | 1 + .../no/nav/dolly/web/config/Consumers.java | 1 + .../kriterier/BestillingKriterieMapper.tsx | 7 +- .../fagsystem/yrkesskader/form/Form.tsx | 88 +++++-------------- .../visning/YrkesskaderVisning.tsx | 30 +++++-- .../main/js/src/utils/hooks/useYrkesskade.tsx | 3 +- .../src/main/resources/application-local.yml | 4 +- 7 files changed, 52 insertions(+), 82 deletions(-) diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java index 0a48ab5f5eb..82c5cb21190 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java @@ -85,6 +85,7 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { .route(createRoute(consumers.getTestnavSkattekortService())) .route(createRoute(consumers.getTestnavLevendeArbeidsforholdAnsettelse(), "testnav-levende-arbeidsforhold-ansettelse")) .route(createRoute(consumers.getTestnavLevendeArbeidsforholdScheduler(), "testnav-levende-arbeidsforhold-scheduler")) + .route(createRoute(consumers.getTestnavYrkesskadeProxy())) .build(); } diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java index 8a8efa1a7f4..bdd38964ada 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java @@ -65,5 +65,6 @@ public class Consumers { private ServerProperties testnavSkattekortService; private ServerProperties testnavLevendeArbeidsforholdAnsettelse; private ServerProperties testnavLevendeArbeidsforholdScheduler; + private ServerProperties testnavYrkesskadeProxy; } 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 87fe834f1d0..97fb34a7bf1 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 @@ -1583,11 +1583,8 @@ const mapYrkesskader = (bestillingData, data) => { { numberHeader: `Yrkesskade ${i + 1}`, }, - // obj('Skadelidt identifikator', yrkesskade.skadelidtIdentifikator), - obj('Rolletype', yrkesskade.rolletype), //TODO: kodeverk - obj('Innmelderrolle', yrkesskade.innmelderrolle), //TODO: kodeverk - // obj('Innmelder', yrkesskade.innmelderIdentifikator), - // obj('På vegne av', yrkesskade.paaVegneAv), + obj('Rolletype', codeToNorskLabel(yrkesskade.rolletype)), + obj('Innmelderrolle', codeToNorskLabel(yrkesskade.innmelderrolle)), obj('Klassifisering', showLabel('klassifisering', yrkesskade.klassifisering)), obj('Referanse', yrkesskade.referanse), obj('Ferdigstill sak', showLabel('ferdigstillSak', yrkesskade.ferdigstillSak)), diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index 7d65bf05d50..581cc8c2d95 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -9,27 +9,19 @@ import { } from '@/components/fagsystem/yrkesskader/initialValues' import { FormSelect } from '@/components/ui/form/inputs/select/Select' import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' -import { PdlEksisterendePerson } from '@/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson' import { SelectOptionsManager as Options } from '@/service/SelectOptions' import { FormDateTimepicker } from '@/components/ui/form/inputs/timepicker/Timepicker' import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' -import { OrgnrToggle } from '@/components/fagsystem/inntektsmelding/form/partials/orgnrToogle' import StyledAlert from '@/components/ui/alert/StyledAlert' import { validation } from '@/components/fagsystem/yrkesskader/form/validation' +import { useYrkesskadeKodeverk } from '@/utils/hooks/useYrkesskade' export const yrkesskaderAttributt = 'yrkesskader' export const YrkesskaderForm = () => { const formMethods = useFormContext() - // const handleChangeInnmelderrolle = (value, path) => { - // formMethods.setValue(`${path}.innmelderrolle`, value?.value) - // formMethods.setValue(`${path}.innmelderIdentifikator`, null) - // formMethods.setValue(`${path}.paaVegneAv`, null) - // formMethods.trigger(path) - // } - const handleChangeTidstype = (value, path) => { formMethods.setValue(`${path}.tidstype`, value?.value) formMethods.setValue(`${path}.skadetidspunkt`, null) @@ -53,6 +45,23 @@ export const YrkesskaderForm = () => { ) } + const { kodeverkData: kodeverkRolletype } = useYrkesskadeKodeverk('ROLLETYPE') + const { kodeverkData: kodeverkInnmelderrolletype } = useYrkesskadeKodeverk('INNMELDERROLLETYPE') + + const rolletypeOptions = + kodeverkRolletype && + Object.values(kodeverkRolletype)?.map((option) => ({ + value: option?.kode, + label: option?.verdi, + })) + + const innmelderrolletypeOptions = + kodeverkInnmelderrolletype && + Object.values(kodeverkInnmelderrolletype)?.map((option) => ({ + value: option?.kode, + label: option?.verdi, + })) + const hjelpetekst = ( <>

@@ -96,88 +105,35 @@ export const YrkesskaderForm = () => { header={'Yrkesskade'} newEntry={initialYrkesskade} canBeEmpty={false} - // maxEntries={1} - //TODO: Bare 1 yrkesskade per person??? > {(path: string, idx: number) => { return ( - {/*skadelidtIdentifikator: '', // Blir satt av BE*/} - - {/*rolletype: '',*/} - - {/*innmelderrolle: '',*/} handleChangeInnmelderrolle(value, path)} + options={innmelderrolletypeOptions} size="large" isClearable={false} /> - - {/*innmelderIdentifikator: '',*/} - {/*{formMethods.watch(`${path}.innmelderrolle`) === 'vergeOgForesatt' && (*/} - {/* */} - {/*)}*/} - - {/*paaVegneAv: '',*/} - {/*{formMethods.watch(`${path}.innmelderrolle`) === 'virksomhetsrepresentant' && (*/} - {/* */} - {/*)}*/} - - {/*klassifisering: '',*/} - - {/*referanse: '',*/} - - {/*ferdigstillSak: '',*/} - - {/*tidstype: '',*/} { size="medium" onChange={(value) => handleChangeTidstype(value, path)} /> - - {/*skadetidspunkt: null,*/} {formMethods.watch(`${path}.tidstype`) === 'tidspunkt' && ( { // onChange={} /> )} - - {/*perioder: [initialYrkesskadePeriode],*/} {formMethods.watch(`${path}.tidstype`) === 'periode' && ( { return !yrkesskadeData || yrkesskadeData?.length < 1 } +const showKodeverkLabel = (kodeverkData, value) => { + if (!kodeverkData) { + return value + } + if (!value) { + return null + } + return kodeverkData[value]?.verdi +} + export const YrkesskaderVisning = ({ data, loading }) => { if (loading) { return @@ -22,8 +32,9 @@ export const YrkesskaderVisning = ({ data, loading }) => { const manglerFagsystemData = sjekkManglerYrkesskadeData(data) - const { kodeverkData, loading: yrkesskadeLoading, error } = useYrkesskadeKodeverk('ROLLETYPE') - console.log('kodeverkData: ', kodeverkData) //TODO - SLETT MEG + const { kodeverkData: kodeverkDataRolletype } = useYrkesskadeKodeverk('ROLLETYPE') + const { kodeverkData: kodeverkDataInnmelderrolletype } = + useYrkesskadeKodeverk('INNMELDERROLLETYPE') return (

@@ -38,10 +49,17 @@ export const YrkesskaderVisning = ({ data, loading }) => { {(yrkesskade, idx) => { return ( - - {/*//TODO: kodeverk*/} - - {/*//TODO: kodeverk*/} + + `${baseUrl}/api/v1/kodeverk/${kodeverkt export const useYrkesskadeKodeverk = (kodeverktype) => { const { data, isLoading, error } = useSWR(getKodeverkUrl(kodeverktype), fetcher) - console.log('data: ', data) //TODO - SLETT MEG return { - kodeverkData: data, + kodeverkData: data?.kodeverk, loading: isLoading, error: error, } diff --git a/apps/dolly-frontend/src/main/resources/application-local.yml b/apps/dolly-frontend/src/main/resources/application-local.yml index f60d5b79093..2ce7060a052 100644 --- a/apps/dolly-frontend/src/main/resources/application-local.yml +++ b/apps/dolly-frontend/src/main/resources/application-local.yml @@ -81,4 +81,6 @@ consumers: testnav-levende-arbeidsforhold-ansettelse: url: https://testnav-levende-arbeidsforhold-ansettelse.intern.dev.nav.no testnav-levende-arbeidsforhold-scheduler: - url: https://testnav-levende-arbeidsforhold-scheduler.intern.dev.nav.no \ No newline at end of file + url: https://testnav-levende-arbeidsforhold-scheduler.intern.dev.nav.no + testnav-yrkesskade-proxy: + url: https://testnav-yrkesskade-proxy.intern.dev.nav.no \ No newline at end of file From ad2702b1bef1b5a8ffe22a2217b08342a1735fdf Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 15 Oct 2024 17:32:52 +0200 Subject: [PATCH 13/30] Validation ferdig + fix changehandling --- .../fagsystem/yrkesskader/form/Form.tsx | 8 ++++++-- .../fagsystem/yrkesskader/form/validation.tsx | 15 +++++++++++++-- .../fagsystem/yrkesskader/initialValues.tsx | 3 --- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index 581cc8c2d95..d684505a673 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -23,9 +23,13 @@ export const YrkesskaderForm = () => { const formMethods = useFormContext() const handleChangeTidstype = (value, path) => { - formMethods.setValue(`${path}.tidstype`, value?.value) + formMethods.setValue(`${path}.tidstype`, value?.value || null) formMethods.setValue(`${path}.skadetidspunkt`, null) - formMethods.setValue(`${path}.perioder`, [initialYrkesskadePeriode]) + if (value?.value === 'periode') { + formMethods.setValue(`${path}.perioder`, [initialYrkesskadePeriode]) + } else { + formMethods.setValue(`${path}.perioder`, null) + } formMethods.trigger(path) } diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/validation.tsx index d2a0f005a52..346f9196c40 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/validation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/validation.tsx @@ -12,8 +12,19 @@ export const validation = { referanse: Yup.string().nullable(), ferdigstillSak: Yup.string().nullable(), tidstype: Yup.string().nullable(), - // skadetidspunkt: null, - // perioder: null, + skadetidspunkt: Yup.mixed().when('tidstype', { + is: (tidstype: string) => tidstype === 'tidspunkt', + then: () => requiredString, + otherwise: () => Yup.mixed().notRequired(), + }), + perioder: Yup.array() + .of( + Yup.object({ + fra: ifPresent('$fra', requiredString), + til: ifPresent('$til', requiredString), + }), + ) + .nullable(), }), ), ), diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx index f4f818ef2b4..78bb217364c 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/initialValues.tsx @@ -4,12 +4,9 @@ export const initialYrkesskadePeriode = { } export const initialYrkesskade = { - // skadelidtIdentifikator: '', rolletype: 'arbeidstaker', - // innmelderIdentifikator: null, innmelderrolle: 'virksomhetsrepresentant', klassifisering: 'MANUELL', - // paaVegneAv: null, tidstype: null, skadetidspunkt: null, perioder: null, From 49f61618be1eb58f28aeb91f6ff03bc7ec40c893 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Wed, 16 Oct 2024 12:09:49 +0200 Subject: [PATCH 14/30] Sjekk vergemaal og forelder paa eksisterende person --- .../fagsystem/yrkesskader/form/Form.tsx | 51 ++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index d684505a673..f161fc2e45f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -1,5 +1,5 @@ import { useFormContext } from 'react-hook-form' -import React from 'react' +import React, { useContext } from 'react' import { Vis } from '@/components/bestillingsveileder/VisAttributt' import Panel from '@/components/ui/panel/Panel' import { erForsteEllerTest, panelError } from '@/components/ui/form/formUtils' @@ -16,11 +16,13 @@ import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' import StyledAlert from '@/components/ui/alert/StyledAlert' import { validation } from '@/components/fagsystem/yrkesskader/form/validation' import { useYrkesskadeKodeverk } from '@/utils/hooks/useYrkesskade' +import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' export const yrkesskaderAttributt = 'yrkesskader' export const YrkesskaderForm = () => { const formMethods = useFormContext() + const opts = useContext(BestillingsveilederContext) const handleChangeTidstype = (value, path) => { formMethods.setValue(`${path}.tidstype`, value?.value || null) @@ -33,15 +35,40 @@ export const YrkesskaderForm = () => { formMethods.trigger(path) } - const manglerVergeEllerForelder = () => { - // TODO: Sjekk personFoerLeggTil og importPersoner (og ander??) - const vergemaal = formMethods.watch('pdldata.person.vergemaal') - const forelder = formMethods + const getVergemaal = () => { + const vergemaalForm = formMethods.watch('pdldata.person.vergemaal') + const vergemaalImport = opts?.importPersoner?.flatMap( + (person) => person?.data?.hentPerson?.vergemaalEllerFremtidsfullmakt, + ) + const vergemaalLeggTil = + opts?.personFoerLeggTil?.pdl?.hentPerson?.vergemaalEllerFremtidsfullmakt || + opts?.personFoerLeggTil?.pdlforvalter?.person?.vergemaal + + return vergemaalForm || vergemaalImport || vergemaalLeggTil + } + + const getForelder = () => { + const forelderForm = formMethods .watch('pdldata.person.forelderBarnRelasjon') ?.filter((relasjon) => relasjon?.relatertPersonsRolle === 'FORELDER') + const forelderImport = opts?.importPersoner + ?.flatMap((person) => person?.data?.hentPerson?.forelderBarnRelasjon) + ?.filter((relasjon) => relasjon?.minRolleForPerson === 'BARN') + const forelderLeggTil = ( + opts?.personFoerLeggTil?.pdl?.hentPerson?.forelderBarnRelasjon || + opts?.personFoerLeggTil?.pdlforvalter?.person?.forelderBarnRelasjon + )?.filter((relasjon) => relasjon?.minRolleForPerson === 'BARN') + + return forelderForm || forelderImport || forelderLeggTil + } + + const manglerVergeEllerForelder = () => { + const vergemaal = getVergemaal() + const forelder = getForelder() const harInnmelderrolleVergeOgForesatt = formMethods .watch('yrkesskader') ?.some((yrkesskade) => yrkesskade?.innmelderrolle === 'vergeOgForesatt') + return ( harInnmelderrolleVergeOgForesatt && (!vergemaal || vergemaal?.length < 1) && @@ -165,18 +192,8 @@ export const YrkesskaderForm = () => { {(periodePath: string, periodeIdx: number) => { return ( - - + + ) }} From dd3be6463ea88c09da5ba60b869c47497bb52323 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Wed, 16 Oct 2024 14:29:37 +0200 Subject: [PATCH 15/30] Lagt til nye soekekriterier --- .../src/main/js/src/service/SelectOptions.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx b/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx index 31c34d01879..4c03d911f02 100644 --- a/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx +++ b/apps/dolly-frontend/src/main/js/src/service/SelectOptions.tsx @@ -843,15 +843,19 @@ const selectOptions = { { value: 'SIGRUN_PENSJONSGIVENDE', label: 'Sigrun pensjonsgivende inntekt' }, { value: 'INNTK', label: 'A-ordningen (Inntektstub)' }, { value: 'INNTKMELD', label: 'Inntektsmelding (fra Altinn)' }, + { value: 'SKATTEKORT', label: 'Skattekort (SOKOS)' }, { value: 'ARBEIDSPLASSENCV', label: 'Arbeidsplassen (CV)' }, { value: 'PEN_INNTEKT', label: 'Pensjonsgivende inntekt (POPP)' }, { value: 'PEN_TP', label: 'Tjenestepensjon (TP)' }, { value: 'PEN_AP', label: 'Alderspensjon' }, { value: 'PEN_UT', label: 'Uføretrygd' }, + { value: 'PEN_AFP_OFFENTLIG', label: 'AFP offentlig' }, + { value: 'PEN_PENSJONSAVTALE', label: 'Pensjonsavtale' }, { value: 'ARENA_AAP', label: 'Arena AAP-vedtak' }, { value: 'ARENA_AAP115', label: 'Arena 11.5-vedtak' }, { value: 'ARENA_DAGP', label: 'Arena dagpengevedtak' }, { value: 'SYKEMELDING', label: 'Sykemelding' }, + { value: 'YRKESSKADE', label: 'Yrkesskade' }, { value: 'BRREGSTUB', label: 'Brønnøysundregistrene' }, { value: 'INST', label: 'Institusjonsopphold' }, { value: 'KRRSTUB', label: 'Kontakt- og reservasjonsregisteret' }, @@ -863,9 +867,6 @@ const selectOptions = { { value: 'BANKKONTO', label: 'Bankkonto' }, { value: 'BANKKONTO_NORGE', label: 'Norsk bankkonto' }, { value: 'BANKKONTO_UTLAND', label: 'Utenlandsk bankkonto' }, - // TODO: Legg inn skattekort - // TODO: Legg inn yrkesskade - // TODO: Legg inn flere register??? ], } From 38cb1fd20571960fbfbda14d5cbd7e4fdb03b416 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Wed, 16 Oct 2024 19:25:42 +0200 Subject: [PATCH 16/30] Opprydning + types --- .../yrkesskader/YrkesskaderTypes.tsx | 21 +++++++++++++++ .../fagsystem/yrkesskader/form/Form.tsx | 27 ++++++++++--------- .../visning/YrkesskaderVisning.tsx | 20 ++++++++++---- 3 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/YrkesskaderTypes.tsx diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/YrkesskaderTypes.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/YrkesskaderTypes.tsx new file mode 100644 index 00000000000..cf12854661a --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/YrkesskaderTypes.tsx @@ -0,0 +1,21 @@ +export type YrkesskadePeriodeTypes = { + fra: string + til: string +} + +export type YrkesskadeTypes = { + rolletype: string + innmelderrolle: string + innmelderIdentifikator: string + paaVegneAv: string + klassifisering?: string + tidstype?: string + skadetidspunkt?: string + perioder: Array + referanse?: string + ferdigstillSak?: string +} + +export type YrkesskaderTypes = { + yrkesskader: Array +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx index f161fc2e45f..9bf93216568 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/form/Form.tsx @@ -17,14 +17,15 @@ import StyledAlert from '@/components/ui/alert/StyledAlert' import { validation } from '@/components/fagsystem/yrkesskader/form/validation' import { useYrkesskadeKodeverk } from '@/utils/hooks/useYrkesskade' import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' +import { YrkesskadeTypes } from '@/components/fagsystem/yrkesskader/YrkesskaderTypes' export const yrkesskaderAttributt = 'yrkesskader' export const YrkesskaderForm = () => { const formMethods = useFormContext() - const opts = useContext(BestillingsveilederContext) + const opts: any = useContext(BestillingsveilederContext) - const handleChangeTidstype = (value, path) => { + const handleChangeTidstype = (value: any, path: string) => { formMethods.setValue(`${path}.tidstype`, value?.value || null) formMethods.setValue(`${path}.skadetidspunkt`, null) if (value?.value === 'periode') { @@ -38,7 +39,7 @@ export const YrkesskaderForm = () => { const getVergemaal = () => { const vergemaalForm = formMethods.watch('pdldata.person.vergemaal') const vergemaalImport = opts?.importPersoner?.flatMap( - (person) => person?.data?.hentPerson?.vergemaalEllerFremtidsfullmakt, + (person: any) => person?.data?.hentPerson?.vergemaalEllerFremtidsfullmakt, ) const vergemaalLeggTil = opts?.personFoerLeggTil?.pdl?.hentPerson?.vergemaalEllerFremtidsfullmakt || @@ -50,14 +51,14 @@ export const YrkesskaderForm = () => { const getForelder = () => { const forelderForm = formMethods .watch('pdldata.person.forelderBarnRelasjon') - ?.filter((relasjon) => relasjon?.relatertPersonsRolle === 'FORELDER') + ?.filter((relasjon: any) => relasjon?.relatertPersonsRolle === 'FORELDER') const forelderImport = opts?.importPersoner - ?.flatMap((person) => person?.data?.hentPerson?.forelderBarnRelasjon) - ?.filter((relasjon) => relasjon?.minRolleForPerson === 'BARN') + ?.flatMap((person: any) => person?.data?.hentPerson?.forelderBarnRelasjon) + ?.filter((relasjon: any) => relasjon?.minRolleForPerson === 'BARN') const forelderLeggTil = ( opts?.personFoerLeggTil?.pdl?.hentPerson?.forelderBarnRelasjon || opts?.personFoerLeggTil?.pdlforvalter?.person?.forelderBarnRelasjon - )?.filter((relasjon) => relasjon?.minRolleForPerson === 'BARN') + )?.filter((relasjon: any) => relasjon?.minRolleForPerson === 'BARN') return forelderForm || forelderImport || forelderLeggTil } @@ -67,7 +68,7 @@ export const YrkesskaderForm = () => { const forelder = getForelder() const harInnmelderrolleVergeOgForesatt = formMethods .watch('yrkesskader') - ?.some((yrkesskade) => yrkesskade?.innmelderrolle === 'vergeOgForesatt') + ?.some((yrkesskade: YrkesskadeTypes) => yrkesskade?.innmelderrolle === 'vergeOgForesatt') return ( harInnmelderrolleVergeOgForesatt && @@ -81,14 +82,14 @@ export const YrkesskaderForm = () => { const rolletypeOptions = kodeverkRolletype && - Object.values(kodeverkRolletype)?.map((option) => ({ + Object.values(kodeverkRolletype)?.map((option: any) => ({ value: option?.kode, label: option?.verdi, })) const innmelderrolletypeOptions = kodeverkInnmelderrolletype && - Object.values(kodeverkInnmelderrolletype)?.map((option) => ({ + Object.values(kodeverkInnmelderrolletype)?.map((option: any) => ({ value: option?.kode, label: option?.verdi, })) @@ -120,8 +121,10 @@ export const YrkesskaderForm = () => { <> @@ -170,15 +173,13 @@ export const YrkesskaderForm = () => { label="Tidstype" options={Options('tidstype')} size="medium" - onChange={(value) => handleChangeTidstype(value, path)} + onChange={(value: any) => handleChangeTidstype(value, path)} /> {formMethods.watch(`${path}.tidstype`) === 'tidspunkt' && ( )} {formMethods.watch(`${path}.tidstype`) === 'periode' && ( diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx index c7d26986bea..c127eccdf20 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/yrkesskader/visning/YrkesskaderVisning.tsx @@ -6,12 +6,22 @@ import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { formatDateTime, showLabel, formatDate } from '@/utils/DataFormatter' import { useYrkesskadeKodeverk } from '@/utils/hooks/useYrkesskade' +import { + YrkesskadePeriodeTypes, + YrkesskaderTypes, + YrkesskadeTypes, +} from '@/components/fagsystem/yrkesskader/YrkesskaderTypes' -export const sjekkManglerYrkesskadeData = (yrkesskadeData) => { +type YrkesskaderVisningProps = { + data: YrkesskaderTypes + loading: boolean +} + +export const sjekkManglerYrkesskadeData = (yrkesskadeData: any) => { return !yrkesskadeData || yrkesskadeData?.length < 1 } -const showKodeverkLabel = (kodeverkData, value) => { +const showKodeverkLabel = (kodeverkData: any, value: string) => { if (!kodeverkData) { return value } @@ -21,7 +31,7 @@ const showKodeverkLabel = (kodeverkData, value) => { return kodeverkData[value]?.verdi } -export const YrkesskaderVisning = ({ data, loading }) => { +export const YrkesskaderVisning = ({ data, loading }: YrkesskaderVisningProps) => { if (loading) { return } @@ -46,7 +56,7 @@ export const YrkesskaderVisning = ({ data, loading }) => { ) : (
- {(yrkesskade, idx) => { + {(yrkesskade: { data: YrkesskadeTypes }, idx: number) => { return ( { /> {yrkesskade?.data?.perioder?.length > 0 && ( - {(periode, periodeIdx) => ( + {(periode: YrkesskadePeriodeTypes, periodeIdx: number) => ( From 3ccb1e4025ed2781aeb0275c52245005cda89cd2 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Fri, 18 Oct 2024 16:32:12 +0200 Subject: [PATCH 17/30] Fix yrkesskade-url --- apps/dolly-frontend/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index 842a8da0a4c..569b30df58e 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -237,7 +237,7 @@ consumers: cluster: dev-gcp namespace: dolly name: testnav-yrkesskade-proxy - url: https://testnav-yrkesskade-proxy.dolly.svc.cluster.local + url: http://testnav-yrkesskade-proxy.dolly.svc.cluster.local management: endpoints: From 3ee18c2327e17057d437112de5f62bb7cd73c0a0 Mon Sep 17 00:00:00 2001 From: "Kristen.Herum" Date: Tue, 22 Oct 2024 08:44:40 +0200 Subject: [PATCH 18/30] Remove ConfiguratedEnvironmentLogger and fix typo Deleted the ConfiguratedEnvironmentLogger class as it was unnecessary. Also corrected the field name from "yrkesskade" to "yrkesskader" in the OpenSearchQueryBuilder. --- .../service/OpenSearchQueryBuilder.java | 2 +- .../ConfiguratedEnvironmentLogger.java | 31 ------------------- docs/docker | 0 3 files changed, 1 insertion(+), 32 deletions(-) delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/ConfiguratedEnvironmentLogger.java create mode 100644 docs/docker diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchQueryBuilder.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchQueryBuilder.java index 19af194e985..4b7b3fe88ca 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchQueryBuilder.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchQueryBuilder.java @@ -139,7 +139,7 @@ private QueryBuilder getFagsystemQuery(ElasticTyper type) { case BANKKONTO_UTLAND -> QueryBuilders.existsQuery("bankkonto.utenlandskBankkonto"); case ARBEIDSPLASSENCV -> QueryBuilders.existsQuery("arbeidsplassenCV"); case SKATTEKORT -> QueryBuilders.existsQuery("skattekort"); - case YRKESSKADE -> QueryBuilders.existsQuery("yrkesskade"); + case YRKESSKADE -> QueryBuilders.existsQuery("yrkesskader"); }; } diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/ConfiguratedEnvironmentLogger.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/ConfiguratedEnvironmentLogger.java deleted file mode 100644 index 0cf28be06f5..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/ConfiguratedEnvironmentLogger.java +++ /dev/null @@ -1,31 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.context.event.EventListener; -import org.springframework.core.env.AbstractEnvironment; -import org.springframework.core.env.EnumerablePropertySource; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.stream.StreamSupport; - -@Component -@Slf4j -public class ConfiguratedEnvironmentLogger { - - @EventListener - public void handleContextRefreshedEvent(ContextRefreshedEvent event) { - var env = (AbstractEnvironment) event.getApplicationContext().getEnvironment(); - var propertySources = env.getPropertySources(); - StreamSupport.stream(propertySources.spliterator(), false) - .filter(EnumerablePropertySource.class::isInstance) - .map(ps -> ((EnumerablePropertySource) ps).getPropertyNames()) - .flatMap(Arrays::stream) - .distinct() - .sorted() - .forEach(prop -> log.info("{}", prop)); - - } - -} \ No newline at end of file diff --git a/docs/docker b/docs/docker new file mode 100644 index 00000000000..e69de29bb2d From f5f1bd39a3a2b68b7a805655637a84f0b055ff19 Mon Sep 17 00:00:00 2001 From: stigus Date: Tue, 22 Oct 2024 09:00:03 +0200 Subject: [PATCH 19/30] =?UTF-8?q?*=20=C3=98kt=20max=20akseptert=20st=C3=B8?= =?UTF-8?q?rrelse=20p=C3=A5=20request=20header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/dolly-backend/src/main/resources/application.yaml | 2 +- apps/dolly-frontend/src/main/resources/application.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/resources/application.yaml b/apps/dolly-backend/src/main/resources/application.yaml index 1bfe69daf7e..9ba0b54737b 100644 --- a/apps/dolly-backend/src/main/resources/application.yaml +++ b/apps/dolly-backend/src/main/resources/application.yaml @@ -18,7 +18,7 @@ server: charset: UTF-8 error: include-message: always - max-http-request-header-size: 100KB + max-http-request-header-size: 128KB spring: cloud: diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index 569b30df58e..85fb442a7a5 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -260,6 +260,7 @@ server: charset: UTF-8 error: include-message: always + max-http-request-header-size: 128KB logging: pattern: From c096e5d9b1278ba0b1807c29bdf16b7aaf46603e Mon Sep 17 00:00:00 2001 From: Stian Gustavsson Date: Tue, 22 Oct 2024 11:10:29 +0200 Subject: [PATCH 20/30] Feature/ny fullmakt integrasjon (#3625) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Lagt til proxy med trygdeetaten tenant mot pdl-fullmakt * Nytt fullmakt grensesnitt - frontend * Lagt til mer i backend oppsett for ny fullmakt * Fjernet ubrukt mapper backend * Fikset DollyFieldArray som ikke hadde samme values som formet * Fjernet mye av utdatert fullmakt implementasjon i pdl-forvalter * Fullmakt lagt på fullmektigsNavn og skrevet om test * Refaktor av fullmakt for gamle bestillinger og ferdigstilt oppsett for nye fullmakt frontend * Statusmapper Fullmakt backend * Fullmakt søk i dollySoek - Opensearch * Fullmakt mapping opprettMalFraPerson --- .github/workflows/proxy.fullmakt-proxy.yml | 24 + apps/dolly-backend/build.gradle | 1 + .../bestilling/fullmakt/FullmaktClient.java | 101 +++++ .../bestilling/fullmakt/FullmaktConsumer.java | 87 ++++ .../command/DeleteFullmaktDataCommand.java | 52 +++ .../command/GetFullmaktDataCommand.java | 50 +++ .../command/PostFullmaktDataCommand.java | 73 +++ .../fullmakt/dto/FullmaktResponse.java | 75 ++++ .../PensjonforvalterClient.java | 12 +- .../java/no/nav/dolly/config/Consumers.java | 1 + .../java/no/nav/dolly/config/LocalConfig.java | 2 + .../dolly/domain/jpa/BestillingProgress.java | 6 + .../domain/resultset/BestilteKriterier.java | 2 + .../domain/resultset/RsDollyBestilling.java | 9 + .../dolly/domain/resultset/SystemTyper.java | 1 + .../domain/resultset/fullmakt/RsFullmakt.java | 54 +++ .../nav/dolly/elastic/ElasticBestilling.java | 21 +- .../no/nav/dolly/elastic/ElasticTyper.java | 1 + .../nav/dolly/elastic/dto/PersonRequest.java | 1 - .../service/OpenSearchQueryBuilder.java | 6 +- .../utils/OpenSearchPersonQueryUtils.java | 7 - .../BestillingFullmaktStatusMapper.java | 48 ++ .../BestillingStatusMappingStrategy.java | 2 + ...yRequest2MalBestillingMappingStrategy.java | 2 +- .../nav/dolly/service/BestillingService.java | 1 + .../src/main/resources/application.yaml | 5 + .../fullmakt/FullmaktClientTest.java | 109 +++++ apps/dolly-frontend/config.idporten.yml | 1 + apps/dolly-frontend/config.test.yml | 1 + apps/dolly-frontend/config.unstable.yml | 1 + apps/dolly-frontend/config.yml | 1 + .../web/DollyFrontendApplicationStarter.java | 3 +- .../no/nav/dolly/web/config/Consumers.java | 1 + .../src/main/js/package-lock.json | 419 +++++++++--------- apps/dolly-frontend/src/main/js/package.json | 2 +- .../src/main/js/proxy-routes.json | 5 + .../src/main/js/src/api/index.ts | 20 +- .../kriterier/BestillingKriterieMapper.tsx | 11 +- .../startModal/NyIdent/NyIdent.tsx | 11 + .../steg/steg1/paneler/Personinformasjon.tsx | 54 +-- .../stegVelger/steg/steg2/DollyValidation.tsx | 2 + .../stegVelger/steg/steg2/Steg2.tsx | 2 + .../components/bestillingsveileder/utils.tsx | 1 + .../fagsystem/fullmakt/FullmaktType.tsx | 17 + .../fagsystem/fullmakt/form/FullmaktForm.tsx | 221 +++++++++ .../fagsystem/fullmakt/form/validation.tsx | 42 ++ .../fagsystem/fullmakt/visning/Fullmakt.tsx | 60 +++ .../fullmakt/visning/FullmaktVisning.tsx | 44 ++ .../js/src/components/fagsystem/index.tsx | 2 + .../fagsystem/pdl/visning/PdlVisning.tsx | 10 +- .../pdl/visning/partials/PdlFullmakt.tsx | 57 --- .../fagsystem/pdlf/form/initialValues.tsx | 9 +- .../pdlf/form/partials/fullmakt/Fullmakt.tsx | 72 --- .../pdlPerson/PdlEksisterendePerson.tsx | 12 +- .../partials/pdlPerson/PdlPersonExpander.tsx | 3 + .../form/partials/pdlPerson/PdlPersonForm.tsx | 7 +- .../personinformasjon/Personinformasjon.tsx | 5 +- .../form/validation/partials/fullmakt.tsx | 16 - .../pdlf/form/validation/partials/index.tsx | 2 - .../pdlf/form/validation/validation.tsx | 2 - .../fagsystem/pdlf/visning/PdlfVisning.tsx | 10 +- .../pdlf/visning/partials/Fullmakt.tsx | 186 -------- .../pdlf/visning/partials/Persondetaljer.tsx | 2 +- .../visningRedigerbar/VisningRedigerbar.tsx | 10 - .../VisningRedigerbarValidation.tsx | 3 - .../skjermingsregister/form/validation.tsx | 4 +- .../fagsystem/tpsf/visning/Visning.tsx | 2 - .../fagsystem/tpsf/visning/partials/index.tsx | 2 - .../ui/form/fieldArray/DollyFieldArray.tsx | 2 +- .../ui/form/fieldArray/ExpandableBlokk.tsx | 1 + .../js/src/components/ui/form/formUtils.tsx | 1 + .../ui/form/inputs/datepicker/Datepicker.tsx | 9 +- .../ui/form/inputs/select/Select.tsx | 9 + .../main/js/src/components/ui/icon/Icon.tsx | 3 +- .../main/js/src/components/ui/panel/Panel.tsx | 2 +- .../src/main/js/src/flowers.scss | 75 ++-- .../main/js/src/pages/dollySoek/SoekForm.tsx | 7 - apps/dolly-frontend/src/main/js/src/rain.scss | 11 +- .../src/main/js/src/service/SelectOptions.tsx | 8 + apps/dolly-frontend/src/main/js/src/snow.scss | 13 +- .../src/main/js/src/utils/DataFormatter.tsx | 5 +- .../main/js/src/utils/hooks/useFullmakt.tsx | 73 +++ .../dolly-frontend/src/main/js/vite.config.js | 7 + .../src/main/resources/application.yml | 5 + .../controller/PersonController.java | 34 +- .../service/ArtifactDeleteService.java | 23 - .../service/ArtifactUpdateService.java | 39 -- .../forvalter/service/FullmaktService.java | 35 +- .../forvalter/service/PdlOrdreService.java | 124 +++--- .../service/ValidateArtifactsService.java | 2 - .../forvalter/service/VergemaalService.java | 28 +- .../pdl/forvalter/utils/PdlTestDataUrls.java | 3 - .../service/FullmaktServiceTest.java | 119 ----- .../tokenx/OnBehalfOfExchangeCommand.java | 3 +- proxies/fullmakt-proxy/Dockerfile | 8 + proxies/fullmakt-proxy/build.gradle | 18 + proxies/fullmakt-proxy/config.yml | 60 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + proxies/fullmakt-proxy/gradlew | 234 ++++++++++ proxies/fullmakt-proxy/gradlew.bat | 89 ++++ proxies/fullmakt-proxy/gradlewUpdate.sh | 3 + proxies/fullmakt-proxy/settings.gradle | 20 + .../FullmaktProxyApplicationStarter.java | 58 +++ .../fullmaktproxy/config/Consumers.java | 29 ++ .../fullmaktproxy/config/LocalConfig.java | 13 + .../consumer/FakedingsConsumer.java | 25 ++ .../consumer/command/FakedingsGetCommand.java | 31 ++ ...enticationRequestGatewayFilterFactory.java | 31 ++ .../src/main/resources/application.yml | 37 ++ .../src/main/resources/logback-spring.xml | 40 ++ .../fullmaktproxy/ApplicationContextTest.java | 20 + .../src/test/resources/application-test.yml | 1 + 113 files changed, 2402 insertions(+), 1049 deletions(-) create mode 100644 .github/workflows/proxy.fullmakt-proxy.yml create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktClient.java create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktConsumer.java create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/DeleteFullmaktDataCommand.java create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/GetFullmaktDataCommand.java create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/PostFullmaktDataCommand.java create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/dto/FullmaktResponse.java create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/fullmakt/RsFullmakt.java create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingFullmaktStatusMapper.java create mode 100644 apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/fullmakt/FullmaktClientTest.java create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/FullmaktType.tsx create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/FullmaktForm.tsx create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/validation.tsx create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/Fullmakt.tsx create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/FullmaktVisning.tsx delete mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/PdlFullmakt.tsx delete mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/fullmakt/Fullmakt.tsx delete mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/fullmakt.tsx delete mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Fullmakt.tsx create mode 100644 apps/dolly-frontend/src/main/js/src/utils/hooks/useFullmakt.tsx delete mode 100644 apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/FullmaktServiceTest.java create mode 100644 proxies/fullmakt-proxy/Dockerfile create mode 100644 proxies/fullmakt-proxy/build.gradle create mode 100644 proxies/fullmakt-proxy/config.yml create mode 100644 proxies/fullmakt-proxy/gradle/wrapper/gradle-wrapper.jar create mode 100644 proxies/fullmakt-proxy/gradle/wrapper/gradle-wrapper.properties create mode 100755 proxies/fullmakt-proxy/gradlew create mode 100644 proxies/fullmakt-proxy/gradlew.bat create mode 100755 proxies/fullmakt-proxy/gradlewUpdate.sh create mode 100644 proxies/fullmakt-proxy/settings.gradle create mode 100644 proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/FullmaktProxyApplicationStarter.java create mode 100644 proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/config/Consumers.java create mode 100644 proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/config/LocalConfig.java create mode 100644 proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/consumer/FakedingsConsumer.java create mode 100644 proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/consumer/command/FakedingsGetCommand.java create mode 100644 proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/filter/AddAuthenticationRequestGatewayFilterFactory.java create mode 100644 proxies/fullmakt-proxy/src/main/resources/application.yml create mode 100644 proxies/fullmakt-proxy/src/main/resources/logback-spring.xml create mode 100644 proxies/fullmakt-proxy/src/test/java/no/nav/testnav/proxies/fullmaktproxy/ApplicationContextTest.java create mode 100644 proxies/fullmakt-proxy/src/test/resources/application-test.yml diff --git a/.github/workflows/proxy.fullmakt-proxy.yml b/.github/workflows/proxy.fullmakt-proxy.yml new file mode 100644 index 00000000000..61fcec6e944 --- /dev/null +++ b/.github/workflows/proxy.fullmakt-proxy.yml @@ -0,0 +1,24 @@ +name: fullmakt-proxy + +on: + push: + paths: + - "plugins/**" + - "libs/reactive-core/**" + - "libs/reactive-proxy/**" + - "libs/reactive-security/**" + - "libs/security-core/**" + - "proxies/fullmakt-proxy/**" + - ".github/workflows/proxy.fullmakt-proxy.yml" + +jobs: + workflow: + uses: ./.github/workflows/common.workflow.backend.yml + with: + cluster: "dev-fss" + working-directory: "proxies/fullmakt-proxy" + deploy-tag: "#deploy-proxy-fullmakt" + permissions: + contents: read + id-token: write + secrets: inherit diff --git a/apps/dolly-backend/build.gradle b/apps/dolly-backend/build.gradle index dd6d924a330..e54384a2308 100644 --- a/apps/dolly-backend/build.gradle +++ b/apps/dolly-backend/build.gradle @@ -21,6 +21,7 @@ dependencies { implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'no.nav.testnav.libs:data-transfer-search-objects' implementation 'no.nav.testnav.libs:reactive-core' + implementation 'no.nav.testnav.libs:vault' implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:$versions.springdoc" implementation "io.swagger.core.v3:swagger-annotations-jakarta:$versions.swagger" diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktClient.java new file mode 100644 index 00000000000..5b48dade5c8 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktClient.java @@ -0,0 +1,101 @@ +package no.nav.dolly.bestilling.fullmakt; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.ClientFuture; +import no.nav.dolly.bestilling.ClientRegister; +import no.nav.dolly.bestilling.fullmakt.dto.FullmaktResponse; +import no.nav.dolly.bestilling.pdldata.PdlDataConsumer; +import no.nav.dolly.domain.jpa.BestillingProgress; +import no.nav.dolly.domain.resultset.RsDollyUtvidetBestilling; +import no.nav.dolly.domain.resultset.dolly.DollyPerson; +import no.nav.dolly.errorhandling.ErrorStatusDecoder; +import no.nav.dolly.util.TransactionHelperService; +import no.nav.testnav.libs.data.pdlforvalter.v1.PersonDTO; +import no.nav.testnav.libs.data.pdlforvalter.v1.RelasjonType; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; + +import static java.util.Objects.isNull; +import static no.nav.dolly.errorhandling.ErrorStatusDecoder.getInfoVenter; +import static org.apache.http.util.TextUtils.isBlank; + +@Slf4j +@Service +@RequiredArgsConstructor +public class FullmaktClient implements ClientRegister { + + private static final String FULLMAKT_REPRESENTASJON = "FULLMAKT_REPR#"; + + private final ErrorStatusDecoder errorStatusDecoder; + private final TransactionHelperService transactionHelperService; + private final FullmaktConsumer fullmaktConsumer; + private final PdlDataConsumer pdlDataConsumer; + + @Override + public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, DollyPerson dollyPerson, BestillingProgress progress, boolean isOpprettEndre) { + + if (!bestilling.getFullmakt().isEmpty()) { + + return Flux.fromIterable(bestilling.getFullmakt()) + .doOnNext(ordre -> + transactionHelperService.persister(progress, BestillingProgress::setFullmaktStatus, + getInfoVenter("Fullmakt (Representasjon)"))) + .flatMap(fullmakt -> { + fullmakt.setFullmaktsgiver(dollyPerson.getIdent()); + if (isBlank(fullmakt.getFullmektig())) { + return pdlDataConsumer.getPersoner(List.of(dollyPerson.getIdent())) + .flatMap(person -> Flux.fromIterable(person.getRelasjoner()) + .filter(relasjon -> relasjon.getRelasjonType().equals(RelasjonType.FULLMEKTIG))) + .next() + .map(relasjon -> { + fullmakt.setFullmektigsNavn(getFullName(relasjon.getRelatertPerson())); + fullmakt.setFullmektig(relasjon.getRelatertPerson().getIdent()); + return fullmakt; + }); + } else { + return Mono.just(fullmakt); + } + }) + .collectList() + .flatMapMany(fullmakter -> fullmaktConsumer.createFullmaktData(fullmakter, dollyPerson.getIdent())) + .map(this::getStatus) + .map(status -> futurePersist(progress, status)); + } + + return Flux.empty(); + } + + @Override + public void release(List identer) { + + identer.forEach(ident -> fullmaktConsumer.getFullmaktData(List.of(ident)).subscribe( + fullmakter -> fullmakter.getFullmakt() + .forEach(fullmakt -> fullmaktConsumer + .deleteFullmaktData(ident, fullmakt.getFullmaktId()).subscribe()))); + } + + private ClientFuture futurePersist(BestillingProgress progress, String status) { + + return () -> { + transactionHelperService.persister(progress, BestillingProgress::setFullmaktStatus, status); + return progress; + }; + } + + private String getStatus(FullmaktResponse response) { + + return isNull(response.getStatus()) ? "OK" : + errorStatusDecoder.getErrorText(response.getStatus(), response.getMelding()); + } + + private String getFullName(PersonDTO person) { + var navn = person.getNavn().getFirst(); + return (isBlank(navn.getMellomnavn())) + ? "%s %s".formatted(navn.getFornavn(), navn.getEtternavn()) + : "%s %s %s".formatted(navn.getFornavn(), navn.getMellomnavn(), navn.getEtternavn()); + } +} \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktConsumer.java new file mode 100644 index 00000000000..e70a37d621b --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktConsumer.java @@ -0,0 +1,87 @@ +package no.nav.dolly.bestilling.fullmakt; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.ConsumerStatus; +import no.nav.dolly.bestilling.fullmakt.command.DeleteFullmaktDataCommand; +import no.nav.dolly.bestilling.fullmakt.command.GetFullmaktDataCommand; +import no.nav.dolly.bestilling.fullmakt.command.PostFullmaktDataCommand; +import no.nav.dolly.bestilling.fullmakt.dto.FullmaktResponse; +import no.nav.dolly.config.Consumers; +import no.nav.dolly.domain.resultset.fullmakt.RsFullmakt; +import no.nav.dolly.metrics.Timed; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import no.nav.testnav.libs.standalone.servletsecurity.exchange.TokenExchange; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.time.Duration; +import java.util.List; + +import static no.nav.dolly.util.JacksonExchangeStrategyUtil.getJacksonStrategy; + +@Slf4j +@Service +public class FullmaktConsumer implements ConsumerStatus { + + private final WebClient webClient; + private final TokenExchange tokenService; + private final ServerProperties serverProperties; + + public FullmaktConsumer( + TokenExchange tokenService, + Consumers consumers, + ObjectMapper objectMapper, + WebClient.Builder webClientBuilder + ) { + this.tokenService = tokenService; + serverProperties = consumers.getTestnavFullmaktProxy(); + this.webClient = webClientBuilder + .baseUrl(serverProperties.getUrl()) + .exchangeStrategies(getJacksonStrategy(objectMapper)) + .build(); + } + + @Timed(name = "providers", tags = { "operation", "fullmakt_createData" }) + public Flux createFullmaktData(List fullmakter, String ident) { + + log.info("Fullmakt opprett {}", fullmakter); + return tokenService.exchange(serverProperties) + .flatMapMany(token -> + Flux.range(0, fullmakter.size()) + .delayElements(Duration.ofMillis(100)) + .flatMap(idx -> new PostFullmaktDataCommand(webClient, token.getTokenValue(), ident, fullmakter.get(idx)).call())); + } + + @Timed(name = "providers", tags = { "operation", "fullmakt_getData" }) + public Flux getFullmaktData(List identer) { + + return tokenService.exchange(serverProperties) + .flatMapMany(token -> Flux.range(0, identer.size()) + .delayElements(Duration.ofMillis(50)) + .flatMap(idx -> new GetFullmaktDataCommand(webClient, identer.get(idx), + token.getTokenValue()).call())); + } + + @Timed(name = "providers", tags = { "operation", "fullmakt_getData" }) + public Mono> deleteFullmaktData(String ident, Integer fullmaktId) { + + return tokenService.exchange(serverProperties) + .flatMap(token -> new DeleteFullmaktDataCommand(webClient, ident, fullmaktId, + token.getTokenValue()).call()); + } + + @Override + public String serviceUrl() { + return serverProperties.getUrl(); + } + + @Override + public String consumerName() { + return "testnav-fullmakt-proxy"; + } + +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/DeleteFullmaktDataCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/DeleteFullmaktDataCommand.java new file mode 100644 index 00000000000..12af028bd13 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/DeleteFullmaktDataCommand.java @@ -0,0 +1,52 @@ +package no.nav.dolly.bestilling.fullmakt.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.util.RequestHeaderUtil; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import no.nav.testnav.libs.securitycore.config.UserConstant; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import reactor.util.retry.Retry; + +import java.time.Duration; +import java.util.concurrent.Callable; + +import static no.nav.dolly.domain.CommonKeysAndUtils.CONSUMER; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CALL_ID; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CONSUMER_ID; +import static no.nav.dolly.util.TokenXUtil.getUserJwt; + +@Slf4j +@RequiredArgsConstructor +public class DeleteFullmaktDataCommand implements Callable>> { + + private static final String DELETE_FULLMAKT_URL = "/api/fullmakt/{fullmaktId}"; + + private final WebClient webClient; + private final String ident; + private final Integer fullmaktId; + private final String token; + + public Mono> call() { + + return webClient.get() + .uri(uriBuilder -> uriBuilder + .path(DELETE_FULLMAKT_URL) + .build(fullmaktId)) + .header(HEADER_NAV_CALL_ID, RequestHeaderUtil.getNavCallId()) + .header(HEADER_NAV_CONSUMER_ID, CONSUMER) + .header("fnr", ident) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(UserConstant.USER_HEADER_JWT, getUserJwt()) + .retrieve() + .toBodilessEntity() + .doOnError(WebClientFilter::logErrorMessage) + .doOnSuccess(response -> log.info("Fullmakt with id {} deleted for person with ident {}", fullmaktId, ident)) + .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) + .filter(WebClientFilter::is5xxException)) + .doOnError(WebClientFilter::logErrorMessage); + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/GetFullmaktDataCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/GetFullmaktDataCommand.java new file mode 100644 index 00000000000..9281463a988 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/GetFullmaktDataCommand.java @@ -0,0 +1,50 @@ +package no.nav.dolly.bestilling.fullmakt.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.fullmakt.dto.FullmaktResponse; +import no.nav.dolly.util.RequestHeaderUtil; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import no.nav.testnav.libs.securitycore.config.UserConstant; +import org.springframework.http.HttpHeaders; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; +import reactor.util.retry.Retry; + +import java.time.Duration; +import java.util.concurrent.Callable; + +import static no.nav.dolly.domain.CommonKeysAndUtils.CONSUMER; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CALL_ID; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CONSUMER_ID; +import static no.nav.dolly.util.TokenXUtil.getUserJwt; + +@Slf4j +@RequiredArgsConstructor +public class GetFullmaktDataCommand implements Callable> { + + private static final String HENT_FULLMAKT_URL = "/api/fullmektig"; + + private final WebClient webClient; + private final String ident; + private final String token; + + public Flux call() { + + return webClient.get() + .uri(uriBuilder -> uriBuilder + .path(HENT_FULLMAKT_URL) + .build()) + .header(HEADER_NAV_CALL_ID, RequestHeaderUtil.getNavCallId()) + .header(HEADER_NAV_CONSUMER_ID, CONSUMER) + .header("fnr", ident) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(UserConstant.USER_HEADER_JWT, getUserJwt()) + .retrieve() + .bodyToFlux(FullmaktResponse.class) + .doOnError(WebClientFilter::logErrorMessage) + .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) + .filter(WebClientFilter::is5xxException)) + .doOnError(WebClientFilter::logErrorMessage); + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/PostFullmaktDataCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/PostFullmaktDataCommand.java new file mode 100644 index 00000000000..b5f9c68bf3a --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/command/PostFullmaktDataCommand.java @@ -0,0 +1,73 @@ +package no.nav.dolly.bestilling.fullmakt.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.fullmakt.dto.FullmaktResponse; +import no.nav.dolly.domain.resultset.fullmakt.RsFullmakt; +import no.nav.dolly.util.RequestHeaderUtil; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import no.nav.testnav.libs.securitycore.config.UserConstant; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import reactor.core.publisher.Mono; +import reactor.util.retry.Retry; + +import java.time.Duration; +import java.util.concurrent.Callable; + +import static no.nav.dolly.domain.CommonKeysAndUtils.CONSUMER; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CALL_ID; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CONSUMER_ID; +import static no.nav.dolly.util.TokenXUtil.getUserJwt; +import static org.apache.http.util.TextUtils.isBlank; + +@Slf4j +@RequiredArgsConstructor +public class PostFullmaktDataCommand implements Callable> { + + private static final String POST_FULLMAKT_URL = "/api/fullmakt"; + + private final WebClient webClient; + private final String token; + private final String ident; + private final RsFullmakt request; + + public Mono call() { + + if (isBlank(request.getFullmektig())) { + log.error("Klarte ikke å hente fullmektig relasjon for ident: {} fra PDL forvalter ", ident); + return Mono.just(FullmaktResponse.builder() + .status(HttpStatus.BAD_REQUEST) + .melding("Fullmakt mangler fullmektig for ident: " + ident) + .build()); + } + + return webClient.post() + .uri(uriBuilder -> uriBuilder + .path(POST_FULLMAKT_URL) + .build()) + .body(BodyInserters.fromValue(request)) + .header(HEADER_NAV_CALL_ID, RequestHeaderUtil.getNavCallId()) + .header(HEADER_NAV_CONSUMER_ID, CONSUMER) + .header("fnr", ident) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(UserConstant.USER_HEADER_JWT, getUserJwt()) + .retrieve() + .bodyToMono(FullmaktResponse.class) + .doOnError(WebClientFilter::logErrorMessage) + .doOnError(throwable -> { + if (throwable instanceof WebClientResponseException ex) { + if (ex.getStatusCode() == HttpStatus.BAD_REQUEST) { + log.error("Bad request mot pdl-fullmakt, response: {}", ex.getResponseBodyAsString()); + } + } + }) + .doOnSuccess(response -> log.info("Fullmakt opprettet for person {}, response: {}", ident, response)) + .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) + .filter(WebClientFilter::is5xxException)) + .doOnError(WebClientFilter::logErrorMessage); + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/dto/FullmaktResponse.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/dto/FullmaktResponse.java new file mode 100644 index 00000000000..24f9df82217 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/dto/FullmaktResponse.java @@ -0,0 +1,75 @@ +package no.nav.dolly.bestilling.fullmakt.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static java.util.Objects.isNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FullmaktResponse { + + private HttpStatus status; + private String melding; + private List fullmakt; + + public List getFullmakt() { + if (isNull(fullmakt)) { + fullmakt = new ArrayList<>(); + } + return fullmakt; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class Fullmakt { + + private Integer fullmaktId; + private LocalDateTime registrert; + private String registrertAv; + private LocalDateTime endret; + private String endretAv; + private Boolean opphoert; + private String fullmaktsgiver; + private String fullmektig; + private List omraade; + private LocalDate gyldigFraOgMed; + private LocalDate gyldigTilOgMed; + private String fullmaktUuid; + private String opplysningsId; + private Integer endringsId; + private String status; + private String kilde; + private String fullmaktsgiverNavn; + private String fullmektigsNavn; + + + public List getOmraade() { + if (isNull(omraade)) { + omraade = new ArrayList<>(); + } + return omraade; + } + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class Omraade { + private String tema; + private List handling; + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java index 96127319d0d..6798822210d 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java @@ -410,12 +410,6 @@ private Flux lagreAlderspensjon(PensjonData pensjonDat .flatMap(Flux::from); } - private static boolean hasVedtak(List pensjonsvedtak, SakType type) { - - return pensjonsvedtak.stream().anyMatch(entry -> entry.getSakType() == type && - entry.getSisteOppdatering().contains("opprettet")); - } - private Flux lagreUforetrygd(PensjonData pensjondata, String navEnhetNr, String ident, Set miljoer, Long bestillingId) { @@ -584,6 +578,12 @@ private String toJson(Object object) { return null; } + private static boolean hasVedtak(List pensjonsvedtak, SakType type) { + + return pensjonsvedtak.stream().anyMatch(entry -> entry.getSakType() == type && + entry.getSisteOppdatering().contains("opprettet")); + } + private static Mono> getPdlPerson(Flux persondata) { return persondata diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/config/Consumers.java b/apps/dolly-backend/src/main/java/no/nav/dolly/config/Consumers.java index 552dd1854e0..48751cb8787 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/config/Consumers.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/config/Consumers.java @@ -28,6 +28,7 @@ public class Consumers { private ServerProperties testnavInstProxy; private ServerProperties testnavKodeverkService; private ServerProperties testnavKontoregisterPersonProxy; + private ServerProperties testnavFullmaktProxy; private ServerProperties testnavKrrstubProxy; private ServerProperties testnavMedlProxy; private ServerProperties testnavMiljoerService; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/config/LocalConfig.java b/apps/dolly-backend/src/main/java/no/nav/dolly/config/LocalConfig.java index 2a2cedf8ceb..00c3ffa14e7 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/config/LocalConfig.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/config/LocalConfig.java @@ -1,10 +1,12 @@ package no.nav.dolly.config; + import no.nav.testnav.libs.database.config.FlywayConfiguration; import no.nav.testnav.libs.database.config.VaultHikariConfiguration; import no.nav.testnav.libs.vault.AbstractLocalVaultConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Profile; + @Configuration @Profile("local") @Import({ diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingProgress.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingProgress.java index b7d5586db10..cf897a72623 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingProgress.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingProgress.java @@ -58,6 +58,9 @@ public class BestillingProgress implements Serializable { @Column(name = "KRRSTUB_STATUS") private String krrstubStatus; + @Column(name = "FULLMAKT_STATUS") + private String fullmaktStatus; + @Column(name = "MEDL_STATUS") private String medlStatus; @@ -173,6 +176,7 @@ public boolean equals(Object o) { .append(getBestilling(), that.getBestilling()) .append(getIdent(), that.getIdent()) .append(getSigrunstubStatus(), that.getSigrunstubStatus()) + .append(getFullmaktStatus(), that.getFullmaktStatus()) .append(getKrrstubStatus(), that.getKrrstubStatus()) .append(getMedlStatus(), that.getMedlStatus()) .append(getUdistubStatus(), that.getUdistubStatus()) @@ -208,6 +212,7 @@ public int hashCode() { .append(getIdent()) .append(getSigrunstubStatus()) .append(getKrrstubStatus()) + .append(getFullmaktStatus()) .append(getMedlStatus()) .append(getUdistubStatus()) .append(getAaregStatus()) @@ -242,6 +247,7 @@ public String toString() { ", ident='" + ident + '\'' + ", sigrunstubStatus='" + sigrunstubStatus + '\'' + ", krrstubStatus='" + krrstubStatus + '\'' + + ", fullmaktStatus='" + fullmaktStatus + '\'' + ", medlStatus='" + medlStatus + '\'' + ", udistubStatus='" + udistubStatus + '\'' + ", aaregStatus='" + aaregStatus + '\'' + diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/BestilteKriterier.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/BestilteKriterier.java index fe57c6e9900..be5175bd55d 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/BestilteKriterier.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/BestilteKriterier.java @@ -10,6 +10,7 @@ import no.nav.dolly.domain.resultset.arenaforvalter.Arenadata; import no.nav.dolly.domain.resultset.breg.RsBregdata; import no.nav.dolly.domain.resultset.dokarkiv.RsDokarkiv; +import no.nav.dolly.domain.resultset.fullmakt.RsFullmakt; import no.nav.dolly.domain.resultset.histark.RsHistark; import no.nav.dolly.domain.resultset.inntektsmeldingstub.RsInntektsmelding; import no.nav.dolly.domain.resultset.inntektstub.InntektMultiplierWrapper; @@ -54,6 +55,7 @@ public class BestilteKriterier { private RsInntektsmelding inntektsmelding; private RsBregdata brregstub; private RsDokarkiv dokarkiv; + private List fullmakt; private RsMedl medl; private RsHistark histark; private RsTpsMessaging tpsMessaging; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/RsDollyBestilling.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/RsDollyBestilling.java index 048cde79b94..a59a8123373 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/RsDollyBestilling.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/RsDollyBestilling.java @@ -11,6 +11,7 @@ import no.nav.dolly.domain.resultset.arenaforvalter.Arenadata; import no.nav.dolly.domain.resultset.breg.RsBregdata; import no.nav.dolly.domain.resultset.dokarkiv.RsDokarkiv; +import no.nav.dolly.domain.resultset.fullmakt.RsFullmakt; import no.nav.dolly.domain.resultset.histark.RsHistark; import no.nav.dolly.domain.resultset.inntektsmeldingstub.RsInntektsmelding; import no.nav.dolly.domain.resultset.inntektstub.InntektMultiplierWrapper; @@ -59,6 +60,7 @@ public class RsDollyBestilling { private String malBestillingNavn; private PdlPersondata pdldata; private RsDigitalKontaktdata krrstub; + private List fullmakt; private RsMedl medl; private List instdata; private List aareg; @@ -115,6 +117,13 @@ public List getInstdata() { return instdata; } + public List getFullmakt() { + if (isNull(fullmakt)) { + fullmakt = new ArrayList<>(); + } + return fullmakt; + } + public List getYrkesskader() { if (isNull(yrkesskader)) { yrkesskader = new ArrayList<>(); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java index 016e3966b17..2d6f4a2d8c4 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java @@ -23,6 +23,7 @@ public enum SystemTyper { INST2("Institusjonsopphold (INST2)"), KONTOREGISTER("Bankkontoregister"), KRRSTUB("Digital kontaktinformasjon (DKIF)"), + FULLMAKT("Fullmakt (Representasjon)"), MEDL("Medlemskap (MEDL)"), ORGANISASJON_FORVALTER("Enhetsregisteret (EREG)"), PDLIMPORT("Import av personer (TESTNORGE)"), diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/fullmakt/RsFullmakt.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/fullmakt/RsFullmakt.java new file mode 100644 index 00000000000..e33601537c2 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/fullmakt/RsFullmakt.java @@ -0,0 +1,54 @@ +package no.nav.dolly.domain.resultset.fullmakt; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static java.util.Objects.isNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RsFullmakt { + + @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second, pattern = "uuuu-MM-dd'T'HH:mm:ss") + private LocalDateTime gyldigFraOgMed; + @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second, pattern = "uuuu-MM-dd'T'HH:mm:ss") + private LocalDateTime gyldigTilOgMed; + private String fullmektig; + private String fullmektigsNavn; + private String fullmaktsgiver; + private List omraade; + + public List getOmraade() { + if (isNull(omraade)) { + omraade = new ArrayList<>(); + } + return omraade; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class Omraade { + private String tema; + private List handling; + + public List getHandling() { + if (isNull(handling)) { + handling = new ArrayList<>(); + } + return handling; + } + } +} \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticBestilling.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticBestilling.java index 15a18aaeaab..3215136f78e 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticBestilling.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticBestilling.java @@ -10,6 +10,7 @@ import no.nav.dolly.domain.resultset.arenaforvalter.Arenadata; import no.nav.dolly.domain.resultset.breg.RsBregdata; import no.nav.dolly.domain.resultset.dokarkiv.RsDokarkiv; +import no.nav.dolly.domain.resultset.fullmakt.RsFullmakt; import no.nav.dolly.domain.resultset.histark.RsHistark; import no.nav.dolly.domain.resultset.inntektsmeldingstub.RsInntektsmelding; import no.nav.dolly.domain.resultset.inntektstub.InntektMultiplierWrapper; @@ -48,20 +49,13 @@ public class ElasticBestilling implements Persistable { @Id private Long id; - - @Override - @JsonIgnore - @Transient - public boolean isNew() { - - return false; - } - @Field private PdlPersondata pdldata; @Field private RsDigitalKontaktdata krrstub; @Field + private List fullmakt; + @Field private RsMedl medl; @Field private List instdata; @@ -101,11 +95,18 @@ public boolean isNew() { private List yrkesskader; @Field private List identer; - @Transient @JsonIgnore private boolean ignore; + @Override + @JsonIgnore + @Transient + public boolean isNew() { + + return false; + } + public List getIdenter() { if (isNull(identer)) { identer = new ArrayList<>(); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticTyper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticTyper.java index 958aea25af3..d479002a26b 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticTyper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticTyper.java @@ -21,6 +21,7 @@ public enum ElasticTyper { INNTKMELD("Inntektsmelding (ALTINN/JOARK)"), BRREGSTUB("Brønnøysundregistrene (BRREGSTUB)"), DOKARKIV("Dokumentarkiv (JOARK)"), + FULLMAKT("Fullmakt (Representasjon)"), MEDL("Medlemskap (MEDL)"), HISTARK("Saksmappearkiv (HISTARK)"), SYKEMELDING("NAV sykemelding"), diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/dto/PersonRequest.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/dto/PersonRequest.java index 33aaec8a904..bae94357878 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/dto/PersonRequest.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/dto/PersonRequest.java @@ -26,7 +26,6 @@ public class PersonRequest { private Boolean harDoedfoedtBarn; private Boolean harForeldreAnsvar; private Boolean harVerge; - private Boolean harFullmakt; private Boolean harDoedsfall; private Boolean harInnflytting; private Boolean harUtflytting; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchQueryBuilder.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchQueryBuilder.java index 4b7b3fe88ca..11d58149360 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchQueryBuilder.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchQueryBuilder.java @@ -24,7 +24,6 @@ import static no.nav.dolly.elastic.utils.OpenSearchPersonQueryUtils.addBostedUtlandQuery; import static no.nav.dolly.elastic.utils.OpenSearchPersonQueryUtils.addDoedsfallQuery; import static no.nav.dolly.elastic.utils.OpenSearchPersonQueryUtils.addForeldreQuery; -import static no.nav.dolly.elastic.utils.OpenSearchPersonQueryUtils.addFullmaktQuery; import static no.nav.dolly.elastic.utils.OpenSearchPersonQueryUtils.addHarBostedBydelsnrQuery; import static no.nav.dolly.elastic.utils.OpenSearchPersonQueryUtils.addHarDeltBostedQuery; import static no.nav.dolly.elastic.utils.OpenSearchPersonQueryUtils.addHarDoedfoedtbarnQuery; @@ -54,7 +53,7 @@ public class OpenSearchQueryBuilder { public static BoolQueryBuilder buildSearchQuery(SearchRequest request) { var queryBuilder = buildTyperQuery(request.getTyper().toArray(ElasticTyper[]::new)); - setPersonQuery(queryBuilder, request); + setPersonQuery(queryBuilder, request); return queryBuilder; } @@ -81,7 +80,6 @@ private void setPersonQuery(BoolQueryBuilder queryBuilder, SearchRequest request addHarDoedfoedtbarnQuery(queryBuilder, request); addHarForeldreansvarQuery(queryBuilder, request); addVergemaalQuery(queryBuilder, request); - addFullmaktQuery(queryBuilder, request); addDoedsfallQuery(queryBuilder, request); addHarInnflyttingQuery(queryBuilder, request); addHarUtflyttingQuery(queryBuilder, request); @@ -108,6 +106,7 @@ private void setPersonQuery(BoolQueryBuilder queryBuilder, SearchRequest request addIdenttypeQuery(queryBuilder, request); }); } + private QueryBuilder getFagsystemQuery(ElasticTyper type) { return switch (type) { @@ -130,6 +129,7 @@ private QueryBuilder getFagsystemQuery(ElasticTyper type) { case INNTKMELD -> QueryBuilders.existsQuery("inntektsmelding"); case BRREGSTUB -> QueryBuilders.existsQuery("brregstub"); case DOKARKIV -> QueryBuilders.existsQuery("dokarkiv"); + case FULLMAKT -> QueryBuilders.existsQuery("fullmakt"); case MEDL -> QueryBuilders.existsQuery("medl"); case HISTARK -> QueryBuilders.existsQuery("histark"); case SYKEMELDING -> QueryBuilders.existsQuery("sykemelding"); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/utils/OpenSearchPersonQueryUtils.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/utils/OpenSearchPersonQueryUtils.java index ddebb9927cf..1009c204cde 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/utils/OpenSearchPersonQueryUtils.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/utils/OpenSearchPersonQueryUtils.java @@ -65,13 +65,6 @@ public static void addDoedsfallQuery(BoolQueryBuilder queryBuilder, SearchReques } } - public static void addFullmaktQuery(BoolQueryBuilder queryBuilder, SearchRequest request) { - - if (isTrue(request.getPersonRequest().getHarFullmakt())) { - queryBuilder.must(existQuery("pdldata.person.fullmakt")); - } - } - public static void addHarInnflyttingQuery(BoolQueryBuilder queryBuilder, SearchRequest request) { if (isTrue(request.getPersonRequest().getHarInnflytting())) { diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingFullmaktStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingFullmaktStatusMapper.java new file mode 100644 index 00000000000..e67577ce6db --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingFullmaktStatusMapper.java @@ -0,0 +1,48 @@ +package no.nav.dolly.mapper; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import no.nav.dolly.domain.jpa.BestillingProgress; +import no.nav.dolly.domain.resultset.RsStatusRapport; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static no.nav.dolly.domain.resultset.SystemTyper.FULLMAKT; +import static no.nav.dolly.mapper.AbstractRsStatusMiljoeIdentForhold.decodeMsg; +import static no.nav.dolly.util.ListUtil.listOf; +import static org.apache.commons.lang3.StringUtils.isNotBlank; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class BestillingFullmaktStatusMapper { + + private static final String OK_STATUS = "Synkronisering mot fullmakt (Representasjon) tok"; + + public static List buildFullmaktStatusMap(List progressList) { + + Map> statusMap = new HashMap<>(); + + progressList.forEach(progress -> { + if (isNotBlank(progress.getFullmaktStatus())) { + var status = progress.getFullmaktStatus().contains(OK_STATUS) ? "OK" : progress.getFullmaktStatus(); + if (statusMap.containsKey(status)) { + statusMap.get(progress.getFullmaktStatus()).add(progress.getIdent()); + } else { + statusMap.put(progress.getFullmaktStatus(), listOf(progress.getIdent())); + } + } + }); + + return statusMap.isEmpty() ? emptyList() : + singletonList(RsStatusRapport.builder().id(FULLMAKT).navn(FULLMAKT.getBeskrivelse()) + .statuser(statusMap.entrySet().stream().map(entry -> RsStatusRapport.Status.builder() + .melding(decodeMsg(entry.getKey())) + .identer(entry.getValue()) + .build()) + .toList()) + .build()); + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/strategy/BestillingStatusMappingStrategy.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/strategy/BestillingStatusMappingStrategy.java index bf6bc1c59b9..8002bb88eac 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/strategy/BestillingStatusMappingStrategy.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/strategy/BestillingStatusMappingStrategy.java @@ -25,6 +25,7 @@ import static no.nav.dolly.mapper.BestillingArenaforvalterStatusMapper.buildArenaStatusMap; import static no.nav.dolly.mapper.BestillingBrregStubStatusMapper.buildBrregStubStatusMap; import static no.nav.dolly.mapper.BestillingDokarkivStatusMapper.buildDokarkivStatusMap; +import static no.nav.dolly.mapper.BestillingFullmaktStatusMapper.buildFullmaktStatusMap; import static no.nav.dolly.mapper.BestillingHistarkStatusMapper.buildHistarkStatusMap; import static no.nav.dolly.mapper.BestillingImportFraPdlStatusMapper.buildImportFraPdlStatusMap; import static no.nav.dolly.mapper.BestillingInntektsmeldingStatusMapper.buildInntektsmeldingStatusMap; @@ -93,6 +94,7 @@ public void mapAtoB(Bestilling bestilling, RsBestillingStatus bestillingStatus, bestillingStatus.getStatus().addAll(buildAaregStatusMap(progresser)); bestillingStatus.getStatus().addAll(buildInntektstubStatusMap(progresser)); bestillingStatus.getStatus().addAll(buildKrrStubStatusMap(progresser)); + bestillingStatus.getStatus().addAll(buildFullmaktStatusMap(progresser)); bestillingStatus.getStatus().addAll(buildMedlStatusMap(progresser)); bestillingStatus.getStatus().addAll(buildSigrunStubStatusMap(progresser)); bestillingStatus.getStatus().addAll(buildArenaStatusMap(progresser)); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/strategy/DollyRequest2MalBestillingMappingStrategy.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/strategy/DollyRequest2MalBestillingMappingStrategy.java index f487e792178..d8f71bece20 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/strategy/DollyRequest2MalBestillingMappingStrategy.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/strategy/DollyRequest2MalBestillingMappingStrategy.java @@ -17,7 +17,6 @@ import no.nav.testnav.libs.dto.skattekortservice.v1.SkattekortRequestDTO; import org.springframework.stereotype.Component; -import static java.util.Objects.isNull; import static java.util.Objects.nonNull; @Component @@ -32,6 +31,7 @@ public void register(MapperFactory factory) { .field("bankkonto", "bankkonto") .field("brregstub", "brregstub") .field("dokarkiv", "dokarkiv") + .field("fullmakt", "fullmakt") .field("environments", "environments") .field("histark", "histark") .field("inntektsmelding", "inntektsmelding") diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/service/BestillingService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/service/BestillingService.java index af84fb9129a..9ff4f121a0f 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/service/BestillingService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/service/BestillingService.java @@ -395,6 +395,7 @@ public String getBestKriterier(RsDollyBestilling request) { .sigrunstubPensjonsgivende(request.getSigrunstubPensjonsgivende()) .arenaforvalter(request.getArenaforvalter()) .pdldata(request.getPdldata()) + .fullmakt(request.getFullmakt()) .instdata(request.getInstdata()) .inntektstub(request.getInntektstub()) .pensjonforvalter(request.getPensjonforvalter()) diff --git a/apps/dolly-backend/src/main/resources/application.yaml b/apps/dolly-backend/src/main/resources/application.yaml index 9ba0b54737b..091b6e41c99 100644 --- a/apps/dolly-backend/src/main/resources/application.yaml +++ b/apps/dolly-backend/src/main/resources/application.yaml @@ -144,6 +144,11 @@ consumers: namespace: dolly url: https://testnav-aareg-proxy.dev-fss-pub.nais.io cluster: dev-fss + testnav-fullmakt-proxy: + name: testnav-fullmakt-proxy + namespace: dolly + url: https://testnav-fullmakt-proxy.dev-fss-pub.nais.io + cluster: dev-fss testnav-krrstub-proxy: name: testnav-krrstub-proxy namespace: dolly diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/fullmakt/FullmaktClientTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/fullmakt/FullmaktClientTest.java new file mode 100644 index 00000000000..c62397384c8 --- /dev/null +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/fullmakt/FullmaktClientTest.java @@ -0,0 +1,109 @@ +package no.nav.dolly.bestilling.fullmakt; + +import no.nav.dolly.bestilling.fullmakt.dto.FullmaktResponse; +import no.nav.dolly.bestilling.pdldata.PdlDataConsumer; +import no.nav.dolly.domain.jpa.BestillingProgress; +import no.nav.dolly.domain.resultset.RsDollyUtvidetBestilling; +import no.nav.dolly.domain.resultset.dolly.DollyPerson; +import no.nav.dolly.domain.resultset.fullmakt.RsFullmakt; +import no.nav.dolly.errorhandling.ErrorStatusDecoder; +import no.nav.dolly.util.TransactionHelperService; +import no.nav.testnav.libs.data.pdlforvalter.v1.FullPersonDTO; +import no.nav.testnav.libs.data.pdlforvalter.v1.NavnDTO; +import no.nav.testnav.libs.data.pdlforvalter.v1.PersonDTO; +import no.nav.testnav.libs.data.pdlforvalter.v1.RelasjonType; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import reactor.core.publisher.Flux; + +import java.time.LocalDateTime; +import java.util.List; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class FullmaktClientTest { + + private static final String NAVN = "Fornavn Etternavn"; + private static final String IDENT = "12345611111"; + private static final String RELASJON_IDENT = "12345622222"; + + @Mock + private ErrorStatusDecoder errorStatusDecoder; + + @Mock + private TransactionHelperService transactionHelperService; + + @Mock + private FullmaktConsumer fullmaktConsumer; + + @Mock + private PdlDataConsumer pdlDataConsumer; + + @InjectMocks + private FullmaktClient fullmaktClient; + + @BeforeEach + public void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + public void shouldSetMissingFullmektigFromPdlRelasjon() { + var bestilling = new RsDollyUtvidetBestilling(); + + bestilling.setFullmakt(List.of(RsFullmakt.builder() + .omraade(singletonList(RsFullmakt.Omraade.builder() + .tema("AAP") + .handling(singletonList("LES")) + .build())) + .fullmektigsNavn(NAVN) + .gyldigFraOgMed(LocalDateTime.of(2021, 1, 1, 0, 0)) + .gyldigTilOgMed(LocalDateTime.of(2022, 1, 1, 0, 0)) + .build())); + + var dollyPerson = DollyPerson.builder().ident(IDENT).build(); + var progress = new BestillingProgress(); + + var fullPersonDTO = FullPersonDTO.builder() + .person(PersonDTO.builder().ident(IDENT) + .build()) + .relasjoner(List.of( + FullPersonDTO.RelasjonDTO.builder() + .relasjonType(RelasjonType.FULLMEKTIG) + .relatertPerson(PersonDTO.builder() + .navn(singletonList(NavnDTO.builder() + .fornavn("Fornavn") + .etternavn("Etternavn") + .build())) + .ident(RELASJON_IDENT).build()) + .build() + )) + .build(); + + when(pdlDataConsumer.getPersoner(any())).thenReturn(Flux.just(fullPersonDTO)); + + var fullmaktResponse = FullmaktResponse.builder().fullmakt(emptyList()).build(); + when(fullmaktConsumer.createFullmaktData(any(), any())).thenReturn(Flux.just(fullmaktResponse)); + + var result = fullmaktClient.gjenopprett(bestilling, dollyPerson, progress, true); + + var clientFutures = result.collectList().block(); + assertEquals(1, clientFutures.size()); + + var fullmaktCaptor = ArgumentCaptor.forClass(List.class); + verify(fullmaktConsumer).createFullmaktData(fullmaktCaptor.capture(), any()); + + List capturedFullmaktList = fullmaktCaptor.getValue(); + assertEquals(RELASJON_IDENT, capturedFullmaktList.getFirst().getFullmektig()); + assertEquals(NAVN, capturedFullmaktList.getFirst().getFullmektigsNavn()); + } +} \ No newline at end of file diff --git a/apps/dolly-frontend/config.idporten.yml b/apps/dolly-frontend/config.idporten.yml index 26a1b76de43..4d9bce7df8e 100644 --- a/apps/dolly-frontend/config.idporten.yml +++ b/apps/dolly-frontend/config.idporten.yml @@ -61,6 +61,7 @@ spec: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io - host: testnav-krrstub-proxy.dev-fss-pub.nais.io + - host: testnav-fullmakt-proxy.dev-fss-pub.nais.io - host: testnav-udistub-proxy.dev-fss-pub.nais.io - host: testnav-inst-proxy.dev-fss-pub.nais.io - host: testnav-aareg-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/config.test.yml b/apps/dolly-frontend/config.test.yml index ab094b75d80..45bf1b3dbd2 100644 --- a/apps/dolly-frontend/config.test.yml +++ b/apps/dolly-frontend/config.test.yml @@ -67,6 +67,7 @@ spec: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io - host: testnav-krrstub-proxy.dev-fss-pub.nais.io + - host: testnav-fullmakt-proxy.dev-fss-pub.nais.io - host: testnav-udistub-proxy.dev-fss-pub.nais.io - host: testnav-inst-proxy.dev-fss-pub.nais.io - host: testnav-histark-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/config.unstable.yml b/apps/dolly-frontend/config.unstable.yml index ce2e6f9d8a8..62416c37c82 100644 --- a/apps/dolly-frontend/config.unstable.yml +++ b/apps/dolly-frontend/config.unstable.yml @@ -60,6 +60,7 @@ spec: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io - host: testnav-krrstub-proxy.dev-fss-pub.nais.io + - host: testnav-fullmakt-proxy.dev-fss-pub.nais.io - host: testnav-udistub-proxy.dev-fss-pub.nais.io - host: testnav-inst-proxy.dev-fss-pub.nais.io - host: testnav-aareg-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/config.yml b/apps/dolly-frontend/config.yml index 9dafd8ea194..851b7e85ed9 100644 --- a/apps/dolly-frontend/config.yml +++ b/apps/dolly-frontend/config.yml @@ -72,6 +72,7 @@ spec: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io - host: testnav-krrstub-proxy.dev-fss-pub.nais.io + - host: testnav-fullmakt-proxy.dev-fss-pub.nais.io - host: testnav-udistub-proxy.dev-fss-pub.nais.io - host: testnav-inst-proxy.dev-fss-pub.nais.io - host: testnav-aareg-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java index 82c5cb21190..e92a64f3000 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java @@ -65,6 +65,7 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { .route(createRoute(consumers.getTestnavUdistubProxy(), "testnav-udistub-proxy")) .route(createRoute(consumers.getTestnavArenaForvalterenProxy())) .route(createRoute(consumers.getTestnavKrrstubProxy(), "testnav-krrstub-proxy")) + .route(createRoute(consumers.getTestnavFullmaktProxy(), "testnav-fullmakt-proxy")) .route(createRoute(consumers.getTestnavMedlProxy(), "testnav-medl-proxy")) .route(createRoute(consumers.getTestnavNorg2Proxy(), "testnav-norg2-proxy")) .route(createRoute(consumers.getTestnavInstProxy(), "testnav-inst-proxy")) @@ -134,4 +135,4 @@ private Function> createRoute(String segment, St .filters(filter, addUserJwtHeaderFilter()) ).uri(host); } -} +} \ No newline at end of file diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java index bdd38964ada..0217856ea1d 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java @@ -42,6 +42,7 @@ public class Consumers { private ServerProperties testnavKodeverkService; private ServerProperties testnavKontoregisterPersonProxy; private ServerProperties testnavKrrstubProxy; + private ServerProperties testnavFullmaktProxy; private ServerProperties testnavMedlProxy; private ServerProperties testnavMiljoerService; private ServerProperties testnavNorg2Proxy; diff --git a/apps/dolly-frontend/src/main/js/package-lock.json b/apps/dolly-frontend/src/main/js/package-lock.json index 3bf37338005..d97c61c27e9 100644 --- a/apps/dolly-frontend/src/main/js/package-lock.json +++ b/apps/dolly-frontend/src/main/js/package-lock.json @@ -1,12 +1,12 @@ { "name": "dolly", - "version": "3.0.37", + "version": "3.0.40", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dolly", - "version": "3.0.37", + "version": "3.0.40", "license": "ISC", "dependencies": { "@grafana/faro-react": "^1.1.2", @@ -1219,9 +1219,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1290,9 +1290,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", - "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", "dev": true, "license": "MIT", "engines": { @@ -1310,9 +1310,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", + "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1390,9 +1390,9 @@ "license": "MIT" }, "node_modules/@grafana/faro-core": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@grafana/faro-core/-/faro-core-1.10.2.tgz", - "integrity": "sha512-FWLd9cS70CdPHOri53r3CSy/mDFq6oMbYxcZLQoZj7cPZVymoWhNRuXsXQlKdCX+YNWrvk2BmQJeEyMhwsC/8w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@grafana/faro-core/-/faro-core-1.11.0.tgz", + "integrity": "sha512-IxkH5Ss6mnspF9vzvJ0fVMNQ5uaLjGQ1Sxu7VFaPfDwzYG5Hlre9hPnvtZfQLzOSWZXEWrrV3TIj9CpbsG4z8g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "^1.9.0", @@ -1400,13 +1400,13 @@ } }, "node_modules/@grafana/faro-react": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@grafana/faro-react/-/faro-react-1.10.2.tgz", - "integrity": "sha512-8JPC587eCf0JzShvymvcJVz/Kx6nqnp4nN1xhlOCkMKgLHjuUGPnfKPFJN1A5vlSdpTNGvq5b+imNidVGe0b3g==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@grafana/faro-react/-/faro-react-1.11.0.tgz", + "integrity": "sha512-nXK4UPBKGzzWA69pY49lMx/hzIvAikTcOJAi2hxtiiLjNkd0TDF15/eR8X74crDO33BIGFONBnDtHNfZ/+DORA==", "license": "Apache-2.0", "dependencies": { - "@grafana/faro-web-sdk": "^1.10.2", - "@grafana/faro-web-tracing": "^1.10.2", + "@grafana/faro-web-sdk": "^1.11.0", + "@grafana/faro-web-tracing": "^1.11.0", "hoist-non-react-statics": "^3.3.2" }, "peerDependencies": { @@ -1424,23 +1424,23 @@ } }, "node_modules/@grafana/faro-web-sdk": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@grafana/faro-web-sdk/-/faro-web-sdk-1.10.2.tgz", - "integrity": "sha512-8gsFAT1l7oGtuX1NlB3lk8P0GeJYwzURpLwGnWuK1H+rdRIDwCVc+USGtiOaPlG8bvaH6cVWdNioEWOM0T5CMA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@grafana/faro-web-sdk/-/faro-web-sdk-1.11.0.tgz", + "integrity": "sha512-L468hk2YF4MS9lJbUjMXKZvTmFzamXPFZZWWoN97ufXw1hKObylqaH3Mb+QsMIBYsEs2g6DyHUWL8j0hDXpyqw==", "license": "Apache-2.0", "dependencies": { - "@grafana/faro-core": "^1.10.2", + "@grafana/faro-core": "^1.11.0", "ua-parser-js": "^1.0.32", "web-vitals": "^4.0.1" } }, "node_modules/@grafana/faro-web-tracing": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@grafana/faro-web-tracing/-/faro-web-tracing-1.10.2.tgz", - "integrity": "sha512-j69pV9aUd4hqVZsg94x1kilVHpc/6OxigaZghAZZffFUZg5BqCwbtvB3SWsDExIRBh4t7vhCzwEEbPtj75Z4JQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@grafana/faro-web-tracing/-/faro-web-tracing-1.11.0.tgz", + "integrity": "sha512-ICyBpSxrEpdD9VvEdw5PEbzPoabFmomiM/inCZtTxRN8Ep7v7axm3pMiyuHXcnoqjir5jbB3/lfT/f1LYdOBVw==", "license": "Apache-2.0", "dependencies": { - "@grafana/faro-web-sdk": "^1.10.2", + "@grafana/faro-web-sdk": "^1.11.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-zone": "1.26.0", "@opentelemetry/core": "^1.26.0", @@ -1747,16 +1747,16 @@ } }, "node_modules/@navikt/aksel-icons": { - "version": "7.2.1", - "resolved": "https://npm.pkg.github.com/download/@navikt/aksel-icons/7.2.1/8cc80c4d03f7d22428f72fd4cb6a93946b087db1", - "integrity": "sha512-AQNR2ld5Kjx1A8LA7TnRxztbNf27UFMFt9vitSIlHGVHvWppSzIrxRhBESsldUDRxMQUjJrFY72o53whF0lhxQ==", + "version": "7.3.0", + "resolved": "https://npm.pkg.github.com/download/@navikt/aksel-icons/7.3.0/50af8f46f221d92be1475249e8930c00b5417a72", + "integrity": "sha512-wQWdKZwY13hAVvurdwheFMOAc0Evl/RJde0KdIM49ZrKA3mpdKh2EQC4MbxkxIZPz071KC8fFdAuDKmKQ+hxvw==", "dev": true, "license": "MIT" }, "node_modules/@navikt/ds-css": { - "version": "7.2.1", - "resolved": "https://npm.pkg.github.com/download/@navikt/ds-css/7.2.1/4201a8c184239da9b0c546a94a25ee985c89fc3c", - "integrity": "sha512-0SRFwm2Iyuz4noxL98h5LObklJ9oaxiLsCSECOY2LohMy+XcfOoQQ/6eeGhTURqmLSnJYsdTFs2peV0ZX+Ukig==", + "version": "7.3.0", + "resolved": "https://npm.pkg.github.com/download/@navikt/ds-css/7.3.0/149d6e5c64ae6a19a56e070d63bc97522fe54f3a", + "integrity": "sha512-kLuq7lJFYuvmQzd9IjkthUFTzQN7hYwSX+oXuQjN4KoBJNqMTwJVnwJUdVY+2xwUirmwXrt2ZRAe0dp7e8+NrQ==", "dev": true, "license": "MIT" }, @@ -1778,16 +1778,16 @@ } }, "node_modules/@navikt/ds-react": { - "version": "7.2.1", - "resolved": "https://npm.pkg.github.com/download/@navikt/ds-react/7.2.1/d8283fca0fea8efb9281f54dc08e424d4f4e0078", - "integrity": "sha512-zVewWWjBCiHd1TchuzBlQVYBYjBJ0v5vbnvXvDaP0I4zbG4b+Fb71F+Oxn7HyaboXEkXk0TlZjerylEdtc28zg==", + "version": "7.3.0", + "resolved": "https://npm.pkg.github.com/download/@navikt/ds-react/7.3.0/f78f7e92e1a244843746d6f746ddc970b5c47106", + "integrity": "sha512-3jZPqOopOCTxl07IRGsnbOae2GZvUsUPYXg0X1A0RGRATZDEPseUd76miI06H2HLH8iqKGr8/I1lACJP70yY6A==", "dev": true, "license": "MIT", "dependencies": { "@floating-ui/react": "0.25.4", "@floating-ui/react-dom": "^2.0.9", - "@navikt/aksel-icons": "^7.2.1", - "@navikt/ds-tokens": "^7.2.1", + "@navikt/aksel-icons": "^7.3.0", + "@navikt/ds-tokens": "^7.3.0", "clsx": "^2.1.0", "date-fns": "^3.0.0", "react-day-picker": "8.10.0" @@ -1937,9 +1937,9 @@ } }, "node_modules/@navikt/ds-tokens": { - "version": "7.2.1", - "resolved": "https://npm.pkg.github.com/download/@navikt/ds-tokens/7.2.1/0df577b32219208add6ca8646449fb558faad282", - "integrity": "sha512-u2Aog1I10uWKJra4aFwXiMvgo/f23E7No9l0RhzCRIatQ9qFjaaV1koEtftGBS0VbkVmRgjSeSkGb4SzgiUSbw==", + "version": "7.3.0", + "resolved": "https://npm.pkg.github.com/download/@navikt/ds-tokens/7.3.0/7b08f7cb6ecc23773ded1d655d8e75af80316c3a", + "integrity": "sha512-2VeG4C6D6yF4BGKlL9RuSi2scbFVZjXnEOjUYiFeePywS4c56xVvoFTFSWDxn5bHSg59QAuHdnxp7MUwsucYJQ==", "dev": true, "license": "MIT" }, @@ -2572,13 +2572,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.0.tgz", - "integrity": "sha512-W5lhqPUVPqhtc/ySvZI5Q8X2ztBOUgZ8LbAFy0JQgrXZs2xaILrUcNO3rQjwbLPfGK13+rZsDa1FpG+tqYkT5w==", + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.1.tgz", + "integrity": "sha512-s9RtWoxkOLmRJdw3oFvhFbs9OJS0BzrLUc8Hf6l2UdCNd1rqeEyD4BhCJkvzeEoD1FsK4mirsWwGerhVmYKtZg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.48.0" + "playwright": "1.48.1" }, "bin": { "playwright": "cli.js" @@ -2955,9 +2955,9 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.8.tgz", - "integrity": "sha512-eK/ieXftPRQfaBSmzsamXEyDwkntMTY0e9SG5ETsEOv5JIPKhu3mj992t6B8FJjlnSrZBAAqdT8oMkPe4j+P9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.3.0.tgz", + "integrity": "sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA==", "dev": true, "license": "MIT", "dependencies": { @@ -3397,9 +3397,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==", + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.12.tgz", + "integrity": "sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==", "dev": true, "license": "MIT" }, @@ -3414,9 +3414,9 @@ } }, "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "version": "22.7.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.7.tgz", + "integrity": "sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==", "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -3639,17 +3639,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz", - "integrity": "sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.10.0.tgz", + "integrity": "sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.8.1", - "@typescript-eslint/type-utils": "8.8.1", - "@typescript-eslint/utils": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1", + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/type-utils": "8.10.0", + "@typescript-eslint/utils": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3673,16 +3673,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz", - "integrity": "sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.10.0.tgz", + "integrity": "sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.8.1", - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/typescript-estree": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1", + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/typescript-estree": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", "debug": "^4.3.4" }, "engines": { @@ -3702,14 +3702,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.1.tgz", - "integrity": "sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz", + "integrity": "sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1" + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3720,14 +3720,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz", - "integrity": "sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.10.0.tgz", + "integrity": "sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.8.1", - "@typescript-eslint/utils": "8.8.1", + "@typescript-eslint/typescript-estree": "8.10.0", + "@typescript-eslint/utils": "8.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3745,9 +3745,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.1.tgz", - "integrity": "sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz", + "integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==", "dev": true, "license": "MIT", "engines": { @@ -3759,14 +3759,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.1.tgz", - "integrity": "sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz", + "integrity": "sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3788,16 +3788,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz", - "integrity": "sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.8.1", - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/typescript-estree": "8.8.1" + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/typescript-estree": "8.10.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3811,13 +3811,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.1.tgz", - "integrity": "sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz", + "integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/types": "8.10.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -3829,9 +3829,9 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", - "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz", + "integrity": "sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==", "dev": true, "license": "MIT", "dependencies": { @@ -3849,14 +3849,14 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.2.tgz", - "integrity": "sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz", + "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.2", - "@vitest/utils": "2.1.2", + "@vitest/spy": "2.1.3", + "@vitest/utils": "2.1.3", "chai": "^5.1.1", "tinyrainbow": "^1.2.0" }, @@ -3865,13 +3865,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.2.tgz", - "integrity": "sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz", + "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "^2.1.0-beta.1", + "@vitest/spy": "2.1.3", "estree-walker": "^3.0.3", "magic-string": "^0.30.11" }, @@ -3879,7 +3879,7 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/spy": "2.1.2", + "@vitest/spy": "2.1.3", "msw": "^2.3.5", "vite": "^5.0.0" }, @@ -3893,9 +3893,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.2.tgz", - "integrity": "sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", + "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3906,13 +3906,13 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.2.tgz", - "integrity": "sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz", + "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.2", + "@vitest/utils": "2.1.3", "pathe": "^1.1.2" }, "funding": { @@ -3920,13 +3920,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.2.tgz", - "integrity": "sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz", + "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.2", + "@vitest/pretty-format": "2.1.3", "magic-string": "^0.30.11", "pathe": "^1.1.2" }, @@ -3935,9 +3935,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.2.tgz", - "integrity": "sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", + "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3948,13 +3948,13 @@ } }, "node_modules/@vitest/ui": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.2.tgz", - "integrity": "sha512-92gcNzkDnmxOxyHzQrQYRsoV9Q0Aay0r4QMLnV+B+lbqlUWa8nDg9ivyLV5mMVTtGirHsYUGGh/zbIA55gBZqA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.3.tgz", + "integrity": "sha512-2XwTrHVJw3t9NYES26LQUYy51ZB8W4bRPgqUH2Eyda3kIuOlYw1ZdPNU22qcVlUVx4WKgECFQOSXuopsczuVjQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.2", + "@vitest/utils": "2.1.3", "fflate": "^0.8.2", "flatted": "^3.3.1", "pathe": "^1.1.2", @@ -3966,17 +3966,17 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.1.2" + "vitest": "2.1.3" } }, "node_modules/@vitest/utils": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.2.tgz", - "integrity": "sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz", + "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.2", + "@vitest/pretty-format": "2.1.3", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" }, @@ -3999,9 +3999,9 @@ "optional": true }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4539,9 +4539,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001668", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", - "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", "dev": true, "funding": [ { @@ -5255,9 +5255,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.36", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", - "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==", + "version": "1.5.41", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", + "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", "dev": true, "license": "ISC" }, @@ -5541,18 +5541,18 @@ } }, "node_modules/eslint": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", - "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", + "@eslint/core": "^0.7.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.12.0", + "@eslint/js": "9.13.0", "@eslint/plugin-kit": "^0.2.0", "@humanfs/node": "^0.16.5", "@humanwhocodes/module-importer": "^1.0.1", @@ -6537,6 +6537,12 @@ "node": "*" } }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, "node_modules/history": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", @@ -8518,9 +8524,9 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { @@ -8548,13 +8554,13 @@ } }, "node_modules/playwright": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.0.tgz", - "integrity": "sha512-qPqFaMEHuY/ug8o0uteYJSRfMGFikhUysk8ZvAtfKmUK3kc/6oNl/y3EczF8OFGYIi/Ex2HspMfzYArk6+XQSA==", + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.1.tgz", + "integrity": "sha512-j8CiHW/V6HxmbntOfyB4+T/uk08tBy6ph0MpBXwuoofkSnLmlfdYNNkFTYD6ofzzlSqLA1fwH4vwvVFvJgLN0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.48.0" + "playwright-core": "1.48.1" }, "bin": { "playwright": "cli.js" @@ -8567,9 +8573,9 @@ } }, "node_modules/playwright-core": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0.tgz", - "integrity": "sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==", + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.1.tgz", + "integrity": "sha512-Yw/t4VAFX/bBr1OzwCuOMZkY1Cnb4z/doAFSwf4huqAGWmf9eMNjmK7NiOljCdLmxeRYcGPPmcDgU0zOlzP0YA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8917,9 +8923,9 @@ } }, "node_modules/react-datepicker": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.4.0.tgz", - "integrity": "sha512-vSSok4DTZ9/Os8O4HjZLxh4SZVFU6dQvoCX6mfbNdBqMsBBdzftrvMz0Nb4UUVVbgj9o8PfX84K3/31oPrTqmg==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.5.0.tgz", + "integrity": "sha512-6MzeamV8cWSOcduwePHfGqY40acuGlS1cG//ePHT6bVbLxWyqngaStenfH03n1wbzOibFggF66kWaBTb1SbTtQ==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.26.23", @@ -8983,9 +8989,9 @@ } }, "node_modules/react-dropzone": { - "version": "14.2.9", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.9.tgz", - "integrity": "sha512-jRZsMC7h48WONsOLHcmhyn3cRWJoIPQjPApvt/sJVfnYaB3Qltn025AoRTTJaj4WdmmgmLl6tUQg1s0wOhpodQ==", + "version": "14.2.10", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.10.tgz", + "integrity": "sha512-Y98LOCYxGO2jOFWREeKJlL7gbrHcOlTBp+9DCM1dh9XQ8+P/8ThhZT7kFb05C+bPcTXq/rixpU+5+LzwYrFLUw==", "dev": true, "license": "MIT", "dependencies": { @@ -9024,9 +9030,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.53.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz", - "integrity": "sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==", + "version": "7.53.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.1.tgz", + "integrity": "sha512-6aiQeBda4zjcuaugWvim9WsGqisoUk+etmFEsSUMm451/Ic8L/UAb7sRtMj3V+Hdzm6mMjU1VhiSzYUZeBm0Vg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -9240,13 +9246,14 @@ "license": "MIT" }, "node_modules/react-syntax-highlighter": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", - "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", + "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.27.0", "refractor": "^3.6.0" @@ -9746,9 +9753,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.79.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz", - "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==", + "version": "1.80.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.3.tgz", + "integrity": "sha512-ptDWyVmDMVielpz/oWy3YP3nfs7LpJTHIJZboMVs8GEC9eUmtZTZhMHlTW98wY4aEorDfjN38+Wr/XjskFWcfA==", "dev": true, "license": "MIT", "dependencies": { @@ -10461,9 +10468,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", - "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", "dev": true, "license": "MIT" }, @@ -10482,9 +10489,9 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", - "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10540,22 +10547,22 @@ } }, "node_modules/tldts": { - "version": "6.1.51", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.51.tgz", - "integrity": "sha512-33lfQoL0JsDogIbZ8fgRyvv77GnRtwkNE/MOKocwUgPO1WrSfsq7+vQRKxRQZai5zd+zg97Iv9fpFQSzHyWdLA==", + "version": "6.1.52", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.52.tgz", + "integrity": "sha512-fgrDJXDjbAverY6XnIt0lNfv8A0cf7maTEaZxNykLGsLG7XP+5xhjBTrt/ieAsFjAlZ+G5nmXomLcZDkxXnDzw==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.51" + "tldts-core": "^6.1.52" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.51", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.51.tgz", - "integrity": "sha512-bu9oCYYWC1iRjx+3UnAjqCsfrWNZV1ghNQf49b3w5xE8J/tNShHTzp5syWJfwGH+pxUgTTLUnzHnfuydW7wmbg==", + "version": "6.1.52", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.52.tgz", + "integrity": "sha512-j4OxQI5rc1Ve/4m/9o2WhWSC4jGc4uVbCINdOEJRAraCi0YqTqgMcxUx7DbmuP0G3PCixoof/RZB0Q5Kh9tagw==", "dev": true, "license": "MIT" }, @@ -10714,9 +10721,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", "license": "0BSD" }, "node_modules/type-check": { @@ -11009,9 +11016,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "dev": true, "license": "MIT", "dependencies": { @@ -11069,9 +11076,9 @@ } }, "node_modules/vite-node": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.2.tgz", - "integrity": "sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz", + "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==", "dev": true, "license": "MIT", "dependencies": { @@ -11165,19 +11172,19 @@ } }, "node_modules/vitest": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.2.tgz", - "integrity": "sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz", + "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "2.1.2", - "@vitest/mocker": "2.1.2", - "@vitest/pretty-format": "^2.1.2", - "@vitest/runner": "2.1.2", - "@vitest/snapshot": "2.1.2", - "@vitest/spy": "2.1.2", - "@vitest/utils": "2.1.2", + "@vitest/expect": "2.1.3", + "@vitest/mocker": "2.1.3", + "@vitest/pretty-format": "^2.1.3", + "@vitest/runner": "2.1.3", + "@vitest/snapshot": "2.1.3", + "@vitest/spy": "2.1.3", + "@vitest/utils": "2.1.3", "chai": "^5.1.1", "debug": "^4.3.6", "magic-string": "^0.30.11", @@ -11188,7 +11195,7 @@ "tinypool": "^1.0.0", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.2", + "vite-node": "2.1.3", "why-is-node-running": "^2.3.0" }, "bin": { @@ -11203,8 +11210,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.2", - "@vitest/ui": "2.1.2", + "@vitest/browser": "2.1.3", + "@vitest/ui": "2.1.3", "happy-dom": "*", "jsdom": "*" }, diff --git a/apps/dolly-frontend/src/main/js/package.json b/apps/dolly-frontend/src/main/js/package.json index c3d85bdb3a9..b704e6ebfb3 100644 --- a/apps/dolly-frontend/src/main/js/package.json +++ b/apps/dolly-frontend/src/main/js/package.json @@ -1,6 +1,6 @@ { "name": "dolly", - "version": "3.0.37", + "version": "3.0.40", "type": "module", "description": "", "main": "index.js", diff --git a/apps/dolly-frontend/src/main/js/proxy-routes.json b/apps/dolly-frontend/src/main/js/proxy-routes.json index ac756604110..843d1003414 100644 --- a/apps/dolly-frontend/src/main/js/proxy-routes.json +++ b/apps/dolly-frontend/src/main/js/proxy-routes.json @@ -99,6 +99,11 @@ "changeOrigin": true, "secure": false }, + "/testnav-fullmakt-proxy/api": { + "target": "http://localhost:8020", + "changeOrigin": true, + "secure": false + }, "/testnav-inst-proxy/api": { "target": "http://localhost:8020", "changeOrigin": true, diff --git a/apps/dolly-frontend/src/main/js/src/api/index.ts b/apps/dolly-frontend/src/main/js/src/api/index.ts index bd84164b6f8..571a68c5396 100644 --- a/apps/dolly-frontend/src/main/js/src/api/index.ts +++ b/apps/dolly-frontend/src/main/js/src/api/index.ts @@ -9,6 +9,8 @@ import { Logger } from '@/logger/Logger' const fetchRetry = fetch_retry(originalFetch) +const allowForbidden = ['testnav-arbeidsplassencv', 'testnav-fullmakt', 'infostripe', 'norg2'] + export const multiFetcherAll = (urlListe, headers = null) => { return Promise.all( urlListe.map((url) => @@ -137,9 +139,7 @@ export const fetcher = (url, headers) => .catch((reason) => { if ( (reason?.response?.status === 401 || reason?.response?.status === 403) && - !url.includes('testnav-arbeidsplassencv') && - !url.includes('infostripe') && - !url.includes('norg2') + !allowForbidden.some((value) => url.includes(value)) ) { console.error('Auth feilet, navigerer til login') navigateToLogin() @@ -170,12 +170,7 @@ const _fetch = (url: string, config: Config, body?: object): Promise = fetchRetry(url, { retryOn: (attempt, error, response) => { if (!response.ok && !runningE2ETest()) { - if ( - response?.status === 401 && - !url.includes('testnav-arbeidsplassencv') && - !url.includes('infostripe') && - !url.includes('norg2') - ) { + if (response?.status === 401 && !allowForbidden.some((value) => url.includes(value))) { console.error('Auth feilet, navigerer til login') navigateToLogin() } @@ -205,12 +200,7 @@ const _fetch = (url: string, config: Config, body?: object): Promise = window.location.href = response.url } if (!response.ok && !runningE2ETest()) { - if ( - response?.status === 401 && - !url.includes('testnav-arbeidsplassencv') && - !url.includes('infostripe') && - !url.includes('norg2') - ) { + if (response?.status === 401 && !allowForbidden.some((value) => url.includes(value))) { console.error('Auth feilet, navigerer til login') navigateToLogin() } 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 97fb34a7bf1..fe3c913554d 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 @@ -326,14 +326,14 @@ const mapVergemaal = (vergemaal, data) => { } } -const mapFullmakt = (fullmakt, data) => { - if (fullmakt) { +const mapFullmakt = (bestillingData, data) => { + if (bestillingData?.fullmakt) { const fullmaktData = { header: 'Fullmakt', - itemRows: fullmakt.map((item, idx) => { + itemRows: bestillingData.fullmakt.map((item, idx) => { return [ { numberHeader: `Fullmakt ${idx + 1}` }, - obj('Områder', omraaderArrayToString(item.omraader)), + obj('Områder', omraaderArrayToString(item.omraade)), obj('Gyldig fra og med', formatDate(item.gyldigFraOgMed)), obj('Gyldig til og med', formatDate(item.gyldigTilOgMed)), obj('Fullmektig', item.motpartsPersonident), @@ -2395,7 +2395,6 @@ export function mapBestillingData(bestillingData, bestillingsinformasjon, firstI kjoenn, navn, telefonnummer, - fullmakt, bostedsadresse, oppholdsadresse, kontaktadresse, @@ -2426,7 +2425,6 @@ export function mapBestillingData(bestillingData, bestillingsinformasjon, firstI mapNavn(navn, data) mapTelefonnummer(telefonnummer, data) mapVergemaal(vergemaal, data) - mapFullmakt(fullmakt, data) mapTilrettelagtKommunikasjon(tilrettelagtKommunikasjon, data) mapStatsborgerskap(statsborgerskap, data) mapDoedsfall(doedsfall, data) @@ -2445,6 +2443,7 @@ export function mapBestillingData(bestillingData, bestillingsinformasjon, firstI mapKontaktinformasjonForDoedsbo(kontaktinformasjonForDoedsbo, data) } + mapFullmakt(bestillingData, data) mapTpsMessaging(bestillingData, data) mapAareg(bestillingData, data) mapSigrunStub(bestillingData, data) diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/startModal/NyIdent/NyIdent.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/startModal/NyIdent/NyIdent.tsx index fe161c36d94..1eee5d9fab0 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/startModal/NyIdent/NyIdent.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/startModal/NyIdent/NyIdent.tsx @@ -77,6 +77,10 @@ export const NyIdent = ({ brukernavn, onAvbryt, onSubmit }: NyBestillingProps) = const valgtMal = malOptions.find((mal) => mal.value === formMethods.watch('mal')) const valgtMalTpsfValues = _.get(valgtMal, 'data.bestilling.tpsf') const erTpsfMal = tpsfAttributter.some((a) => _.has(valgtMalTpsfValues, a)) + const erGammelFullmaktMal = _.has( + valgtMal, + 'data.bestilling.pdldata.person.fullmakt.[0].omraader.[0]', + ) return ( @@ -128,6 +132,13 @@ export const NyIdent = ({ brukernavn, onAvbryt, onSubmit }: NyBestillingProps) = isDisabled={!malAktiv} /> + {erGammelFullmaktMal && ( + + Denne malen er utdatert, og vil muligens ikke fungere som den skal. Dette fordi + master for fullmakt er endret til Representasjon. Vi anbefaler at du oppretter en ny + mal og sletter denne malen. + + )} {erTpsfMal && ( Denne malen er utdatert, og vil dessverre ikke fungere som den skal. Dette fordi diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Personinformasjon.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Personinformasjon.tsx index b65065f73c7..f5d0c7d107e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Personinformasjon.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Personinformasjon.tsx @@ -11,6 +11,7 @@ import { getInitialNavn, getInitialStatsborgerskap, initialFullmakt, + initialPdlPerson, initialSikkerhetstiltak, initialTilrettelagtKommunikasjon, initialVergemaal, @@ -29,8 +30,8 @@ const utvandret = 'utvandretTilLand' // @ts-ignore export const PersoninformasjonPanel = ({ stateModifier, testnorgeIdent }) => { - const sm = stateModifier(PersoninformasjonPanel.initialValues) - const opts = useContext(BestillingsveilederContext) + const sm: any = stateModifier(PersoninformasjonPanel.initialValues) + const opts: any = useContext(BestillingsveilederContext) const gruppeId = opts?.gruppeId || opts?.gruppe?.id const { identer, loading: gruppeLoading, error: gruppeError } = useGruppeIdenter(gruppeId) @@ -39,15 +40,12 @@ export const PersoninformasjonPanel = ({ stateModifier, testnorgeIdent }) => { const opprettFraEksisterende = opts.is.opprettFraIdenter const leggTil = opts.is.leggTil || opts.is.leggTilPaaGruppe - const testNorgePerson = opts?.identMaster === 'PDL' const npidPerson = opts?.identtype === 'NPID' const ukjentGruppe = !gruppeId - const tekstUkjentGruppe = 'Funksjonen er deaktivert da personer for relasjon er ukjent' - const testNorgeFlere = testNorgePerson && opts?.antall > 1 - const tekstFlerePersoner = 'Funksjonen er kun tilgjengelig per individ, ikke for gruppe' const leggTilPaaGruppe = !!opts?.leggTilPaaGruppe const tekstLeggTilPaaGruppe = 'Støttes ikke for "legg til på alle" i grupper som inneholder personer fra Test-Norge' + const tekstUkjentGruppe = 'Funksjonen er deaktivert da personer for relasjon er ukjent' const harFnr = opts.identtype === 'FNR' // Noen egenskaper kan ikke endres når personen opprettes fra eksisterende eller videreføres med legg til @@ -58,7 +56,7 @@ export const PersoninformasjonPanel = ({ stateModifier, testnorgeIdent }) => { (testnorgeIdent && (ukjentGruppe || opts?.antall > 1)) || (harTestnorgeIdenter && leggTilPaaGruppe) ) { - ignoreKeys.push('fullmakt', 'vergemaal', 'innvandretFraLand', 'utvandretTilLand') + ignoreKeys.push('vergemaal', 'innvandretFraLand', 'utvandretTilLand') } if (sm.attrs.utenlandskBankkonto.checked) { ignoreKeys.push('norskBankkonto') @@ -106,15 +104,13 @@ export const PersoninformasjonPanel = ({ stateModifier, testnorgeIdent }) => { disabled={sm.attrs.norskBankkonto.checked} /> + + - - ) @@ -176,15 +172,7 @@ export const PersoninformasjonPanel = ({ stateModifier, testnorgeIdent }) => { '' } /> - + @@ -235,8 +223,9 @@ PersoninformasjonPanel.initialValues = ({ set, opts, setMulti, del, has }) => { pdl: 'pdldata.person.telefonnummer', tpsM: 'tpsMessaging.telefonnummer', }, + fullmakt: 'fullmakt', + fullmaktPDL: 'pdldata.person.fullmakt', vergemaal: 'pdldata.person.vergemaal', - fullmakt: 'pdldata.person.fullmakt', sikkerhetstiltak: 'pdldata.person.sikkerhetstiltak', tilrettelagtKommunikasjon: 'pdldata.person.tilrettelagtKommunikasjon', } @@ -409,10 +398,21 @@ PersoninformasjonPanel.initialValues = ({ set, opts, setMulti, del, has }) => { remove: () => del(paths.vergemaal), }, fullmakt: { - label: 'Fullmakt', - checked: has(paths.fullmakt), - add: () => set(paths.fullmakt, [initialFullmakt]), - remove: () => del(paths.fullmakt), + label: 'Har fullmektig', + checked: has(paths.fullmakt) || has(paths.fullmaktPDL), + add: () => { + set('fullmakt', [ + { + ...initialFullmakt, + master: identMaster === 'PDL' || identtype === 'NPID' ? 'PDL' : 'FREG', + }, + ]) + set('pdldata.person.fullmakt', [{ nyfullMektig: initialPdlPerson }]) + }, + remove: () => { + del('fullmakt') + del('pdldata.person.fullmakt') + }, }, sikkerhetstiltak: { label: 'Sikkerhetstiltak', diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/DollyValidation.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/DollyValidation.tsx index e719937fb4b..b16c33845fb 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/DollyValidation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/DollyValidation.tsx @@ -22,6 +22,7 @@ import { MiljoVelger } from '@/components/miljoVelger/MiljoVelger' import { MalForm } from '@/components/bestillingsveileder/stegVelger/steg/steg3/MalForm' import { VelgGruppe } from '@/components/bestillingsveileder/stegVelger/steg/steg3/VelgGruppe' import { SkattekortForm } from '@/components/fagsystem/skattekort/form/Form' +import { FullmaktForm } from '@/components/fagsystem/fullmakt/form/FullmaktForm' import { YrkesskaderForm } from '@/components/fagsystem/yrkesskader/form/Form' export const DollyValidation = Yup.object({ @@ -42,6 +43,7 @@ export const DollyValidation = Yup.object({ ...ArenaForm.validation, ...UdistubForm.validation, ...SkjermingForm.validation, + ...FullmaktForm.validation, ...DokarkivForm.validation, ...HistarkForm.validation, ...OrganisasjonForm.validation, 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 7576fcea519..f0a7475a5b4 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 @@ -26,6 +26,7 @@ import { KrrstubForm } from '@/components/fagsystem/krrstub/form/KrrForm' import { useFormContext } from 'react-hook-form' import { SkattekortForm } from '@/components/fagsystem/skattekort/form/Form' import { PensjonsavtaleForm } from '@/components/fagsystem/pensjonsavtale/form/Form' +import { FullmaktForm } from '@/components/fagsystem/fullmakt/form/FullmaktForm' import { AfpOffentligForm } from '@/components/fagsystem/afpOffentlig/form/Form' import { YrkesskaderForm } from '@/components/fagsystem/yrkesskader/form/Form' @@ -67,6 +68,7 @@ export const Steg2 = () => { return (
+ diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/utils.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/utils.tsx index cc018c30744..9ff64d4609f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/utils.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/utils.tsx @@ -57,6 +57,7 @@ export const rootPaths = [ 'pdldata.opprettNyPerson.foedtFoer', 'pdlforvalter', 'aareg', + 'fullmakt', 'arbeidsplassenCV', 'skjerming', 'sigrunstub', diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/FullmaktType.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/FullmaktType.tsx new file mode 100644 index 00000000000..3ec3ea676cb --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/FullmaktType.tsx @@ -0,0 +1,17 @@ +export type FullmaktType = { + gyldigFraOgMed: string + gyldigTilOgMed?: string + fullmaktsgiver: string + fullmaktsgiverNavn: string + fullmektig: string + fullmektigsNavn: string + registrert: string + opphoert?: boolean + kilde: string + omraade: Omraade[] +} + +export type Omraade = { + tema: string + handling: string[] +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/FullmaktForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/FullmaktForm.tsx new file mode 100644 index 00000000000..c707975c021 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/FullmaktForm.tsx @@ -0,0 +1,221 @@ +import * as React from 'react' +import { useContext, useEffect } from 'react' +import { FormSelect } from '@/components/ui/form/inputs/select/Select' +import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' +import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import { PdlPersonExpander } from '@/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonExpander' +import { initialFullmakt, initialPdlPerson } from '@/components/fagsystem/pdlf/form/initialValues' +import { UseFormReturn } from 'react-hook-form/dist/types' +import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' +import { SelectOptionsManager as Options } from '@/service/SelectOptions' +import { Vis } from '@/components/bestillingsveileder/VisAttributt' +import Panel from '@/components/ui/panel/Panel' +import { erForsteEllerTest, panelError } from '@/components/ui/form/formUtils' +import { useFormContext } from 'react-hook-form' +import { useFullmaktOmraader } from '@/utils/hooks/useFullmakt' +import { Omraade } from '@/components/fagsystem/fullmakt/FullmaktType' +import { Option } from '@/service/SelectOptionsOppslag' +import Loading from '@/components/ui/loading/Loading' +import { ErrorMessage } from '@hookform/error-message' +import { validation } from '@/components/fagsystem/fullmakt/form/validation' + +interface FullmaktProps { + formMethods: UseFormReturn + path?: string + opts?: any + eksisterendeNyPerson?: any +} + +const alleHandlinger = ['LES', 'SKRIV', 'KOMMUNISER'] + +const mapLegacyFullmaktTilNyFullmakt = ( + legacyFullmakt: any, + formMethods: UseFormReturn, + omraadeKodeverk: Option[], +) => { + if (!legacyFullmakt || legacyFullmakt.length === 0) { + return null + } + const nyeFullmakter = legacyFullmakt + .filter((gammelFullmakt) => gammelFullmakt.omraader) + .map((gammelFullmakt) => ({ + omraader: undefined, //Navn på feltet er endret i ny ekstern fullmakt + gyldigFraOgMed: gammelFullmakt.gyldigFraOgMed, + gyldigTilOgMed: gammelFullmakt.gyldigTilOgMed, + fullmektig: gammelFullmakt.motpartsPersonident, + omraade: gammelFullmakt.omraader.map((legacyOmraade, index) => { + if (legacyOmraade === '*') { + //TODO: Handle "alle" value dersom forespurt av brukere i ny fullmakt + return { tema: 'AAP', handling: alleHandlinger } + } + if (omraadeKodeverk.filter((option) => option.value === legacyOmraade)?.length === 0) { + console.warn( + 'Fant ikke gammel kodeverk-verdi fra denne malen i nytt kodeverk. Velger annen verdi', + ) + return { + tema: omraadeKodeverk[omraadeKodeverk.length - index]?.value, + handling: alleHandlinger, + } + } + return { + tema: legacyOmraade, + handling: alleHandlinger, + } + }), + })) + formMethods.setValue('fullmakt', nyeFullmakter) + formMethods.setValue('pdldata.person.fullmakt', [{ nyfullMektig: initialPdlPerson }]) +} + +export const fullmaktAttributter = ['fullmakt', 'pdldata.person.fullmakt'] + +const hasUserInput = (formMethods: UseFormReturn) => { + const fullmaktArray = formMethods.watch('fullmakt') + if (!fullmaktArray || fullmaktArray.length === 0) { + return false + } + if (fullmaktArray.length > 1) { + return true + } + const fullmaktValues = fullmaktArray[0] + return ( + fullmaktValues.gyldigFraOgMed || + fullmaktValues.gyldigTilOgMed || + fullmaktValues.omraade?.[0]?.tema !== '' + ) +} + +const getFullmaktTemaLabel = (temaValue: string, omraadeKodeverk: Option[]) => { + if (!temaValue || !omraadeKodeverk || omraadeKodeverk.length === 0) { + return null + } + const valgtOption = omraadeKodeverk.filter((option) => option.value === temaValue)?.[0] + return valgtOption ? `${valgtOption.label}` : temaValue +} + +export const Fullmakt = ({ + formMethods, + path, + opts, + eksisterendeNyPerson = null, +}: FullmaktProps) => { + const legacyFullmakt = formMethods.watch('pdldata.person.fullmakt') + const { omraadeKodeverk, loading } = useFullmaktOmraader() + + useEffect(() => { + if (!hasUserInput(formMethods)) { + mapLegacyFullmaktTilNyFullmakt(legacyFullmakt, formMethods, omraadeKodeverk) + } + }, []) + + if (loading) { + return + } + + const isTestnorgeIdent = opts?.identMaster === 'PDL' + const chosenTemaValues = + (path && formMethods.watch(path)?.omraade?.map((omraade: Omraade) => omraade.tema)) || [] + + return ( +
+ + {(path: string) => ( + <> + !chosenTemaValues.includes(option.value), + )} + size="grow" + isClearable={false} + normalFontPlaceholder={true} + /> + { + formMethods.setValue( + `${path}.handling`, + val?.some((opt) => opt.value?.includes('*')) + ? alleHandlinger + : val.map((opt) => opt.value), + ) + formMethods.trigger(path) + }} + isClearable={true} + isMulti={true} + /> + + )} + + + + + {formMethods.formState.errors && ( + ( +

{message}

+ )} + /> + )} +
+ ) +} + +export const FullmaktForm = () => { + const formMethods = useFormContext() + const fullmaktValues = formMethods.watch('fullmakt') + const opts: any = useContext(BestillingsveilederContext) + const val = formMethods.watch(fullmaktAttributter) + + if ((!fullmaktValues || fullmaktValues?.length === 0) && val.some((v) => v)) { + formMethods.setValue('fullmakt', [initialFullmakt]) + } + + return ( + + + + {(path: string) => } + + + + ) +} + +FullmaktForm.validation = validation diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/validation.tsx new file mode 100644 index 00000000000..89e12a22faa --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/validation.tsx @@ -0,0 +1,42 @@ +import * as Yup from 'yup' +import { ifPresent, requiredDate, requiredString } from '@/utils/YupValidations' +import { testDatoTom } from '@/components/fagsystem/utils' +import _ from 'lodash' +import { isBefore, subDays } from 'date-fns' + +export const validation = { + fullmakt: ifPresent( + '$fullmakt', + Yup.array() + .min(1, 'Må inneholde minst en fullmakt') + .of( + Yup.object({ + omraade: Yup.array() + .min(1, 'Må inneholde minst ett område') + .of( + Yup.object({ + tema: requiredString, + handling: Yup.array().min(1, 'Må inneholde minst en handling').of(requiredString), + }), + ), + gyldigFraOgMed: requiredDate.test( + 'reqDate', + 'Dato kan ikke være tilbake i tid', + (value) => { + const chosenDate = _.isString(value) ? new Date(value) : value + const currentDate = subDays(new Date(), 1) + return isBefore(currentDate, chosenDate) + }, + ), + gyldigTilOgMed: ifPresent( + '$fullmakt.gyldigTilOgMed', + testDatoTom( + Yup.date().nullable(), + 'gyldigFraOgMed', + 'Sluttdato må være etter startdato', + ), + ), + }), + ), + ), +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/Fullmakt.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/Fullmakt.tsx new file mode 100644 index 00000000000..7f41978c23c --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/Fullmakt.tsx @@ -0,0 +1,60 @@ +import { TitleValue } from '@/components/ui/titleValue/TitleValue' +import { formatDate, oversettBoolean, toTitleCase } from '@/utils/DataFormatter' +import { FullmaktType, Omraade } from '@/components/fagsystem/fullmakt/FullmaktType' +import React, { Fragment, useState } from 'react' +import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import { useFullmaktOmraader } from '@/utils/hooks/useFullmakt' +import Button from '@/components/ui/button/Button' + +type FullmaktProps = { + idx: number + fullmakt: FullmaktType +} + +export const Fullmakt = ({ fullmakt, idx }: FullmaktProps) => { + const { omraadeKodeverk = [] } = useFullmaktOmraader() + const [visOmraader, setVisOmraader] = useState(false) + + return ( + + + + + + + + + {fullmakt?.omraade?.length > 2 && ( + + )} + {(visOmraader || fullmakt?.omraade?.length <= 2) && ( + + {(omraade: Omraade, idx: number) => { + return ( + +
+ + option.value === omraade.tema)?.label} + /> +
+
+ ) + }} +
+ )} +
+ ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/FullmaktVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/FullmaktVisning.tsx new file mode 100644 index 00000000000..176369c4c03 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/FullmaktVisning.tsx @@ -0,0 +1,44 @@ +import { FullmaktType } from '@/components/fagsystem/fullmakt/FullmaktType' +import { useFullmektig } from '@/utils/hooks/useFullmakt' +import React, { useEffect, useState } from 'react' +import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import { Fullmakt } from '@/components/fagsystem/fullmakt/visning/Fullmakt' +import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' +import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' + +type FullmaktProps = { + ident: string +} + +export const FullmaktVisning = ({ ident }: FullmaktProps) => { + const { fullmektig } = useFullmektig(ident) + const [fullmaktData, setFullmaktData] = useState([]) + + useEffect(() => { + if (fullmektig?.length > 0) { + setFullmaktData(fullmektig) + } + }, [fullmektig]) + + if (!fullmektig || fullmektig.length === 0) { + return null + } + + return ( + +
+ +
+ + `Fullmektig: ${fullmakt?.fullmektigsNavn} (${fullmakt?.fullmektig})` + } + > + {(item: FullmaktType, idx: number) => } + +
+
+
+ ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/index.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/index.tsx index adfb50e4c6f..6d88115b7bb 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/index.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/index.tsx @@ -14,11 +14,13 @@ import { TpsfVisning } from '@/components/fagsystem/tpsf/visning/Visning' import { DokarkivVisning } from '@/components/fagsystem/dokarkiv/visning' import { HistarkVisning } from '@/components/fagsystem/histark/visning' import { SykemeldingVisning } from '@/components/fagsystem/sykdom/visning/Visning' +import { FullmaktVisning } from './fullmakt/visning/FullmaktVisning' export { TpsfVisning, KrrVisning, PdlfVisning, + FullmaktVisning, ArenaVisning, AaregVisning, UdiVisning, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/PdlVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/PdlVisning.tsx index 4282b2eb4c5..57e446e4ade 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/PdlVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/PdlVisning.tsx @@ -5,7 +5,6 @@ import { PdlPersonInfo } from '@/components/fagsystem/pdl/visning/partials/PdlPe import { IdentInfo } from '@/components/fagsystem/pdlf/visning/partials/Identinfo' import { GeografiskTilknytning } from '@/components/fagsystem/pdlf/visning/partials/GeografiskTilknytning' import { PdlNasjonalitet } from '@/components/fagsystem/pdl/visning/partials/nasjonalitet/PdlNasjonalitet' -import { PdlFullmakt } from '@/components/fagsystem/pdl/visning/partials/PdlFullmakt' import { PdlSikkerhetstiltak } from '@/components/fagsystem/pdl/visning/partials/PdlSikkerhetstiltak' import { PdlData } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataTyper' import { TilrettelagtKommunikasjon } from '@/components/fagsystem/pdlf/visning/partials/TilrettelagtKommunikasjon' @@ -24,6 +23,8 @@ import { PdlDeltBosted } from '@/components/fagsystem/pdl/visning/partials/adres import { Doedsfall } from '@/components/fagsystem/pdlf/visning/partials/Doedsfall' import { PdlVergemaal } from '@/components/fagsystem/pdl/visning/partials/vergemaal/PdlVergemaal' import { getBankkontoData } from '@/components/fagsystem/pdlf/visning/PdlfVisning' +import { FullmaktVisning } from '@/components/fagsystem' +import React from 'react' type PdlVisningProps = { pdlData: PdlData @@ -58,7 +59,6 @@ export const PdlVisning = ({ opphold, kontaktadresse, adressebeskyttelse, - fullmakt, utenlandskIdentifikasjonsnummer, falskIdentitet, sikkerhetstiltak, @@ -72,6 +72,10 @@ export const PdlVisning = ({ const identtype = pdlfPerson?.identtype const tmpPdlforvalter = tmpPersoner?.pdlforvalter + const gjeldendeIdent = hentIdenter?.identer?.find( + (id) => !id.historisk && id.gruppe === 'FOLKEREGISTERIDENT', + ) + return (
@@ -87,7 +91,6 @@ export const PdlVisning = ({ - + -} - -const Omraader = styled(TitleValue)` - && { - margin-bottom: 20px; - } -` - -export const Visning = ({ data }: Data) => { - const omraader = data.omraader - ?.map((omraade) => showKodeverkLabel(FullmaktKodeverk.Tema, omraade)) - ?.join(', ') - - return ( - <> -
- - - - - - - -
- - ) -} - -export const PdlFullmakt = ({ data }: DataListe) => { - if (!data || data.length === 0) { - return null - } - return ( -
- - {/* @ts-ignore */} - - {(fullmakt: FullmaktData) => } - -
- ) -} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/initialValues.tsx index d0bb443b547..3d41db54faf 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/initialValues.tsx @@ -352,13 +352,10 @@ export const getInitialNyIdent = (master = 'FREG') => ({ }) export const initialFullmakt = { - omraader: [] as any, - gyldigFraOgMed: null as unknown as string, + omraade: [{ tema: '', handling: [] }] as any, + gyldigFraOgMed: new Date(), gyldigTilOgMed: null as unknown as string, - motpartsPersonident: null as unknown as string, - nyFullmektig: initialPdlPerson, - kilde: 'Dolly', - master: 'PDL', + fullmektig: null as unknown as string, } export const initialOpphold = { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/fullmakt/Fullmakt.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/fullmakt/Fullmakt.tsx deleted file mode 100644 index 4b7ba8d71b4..00000000000 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/fullmakt/Fullmakt.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import * as React from 'react' -import { useContext } from 'react' -import { FormSelect } from '@/components/ui/form/inputs/select/Select' -import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' -import { SelectOptionsOppslag } from '@/service/SelectOptionsOppslag' -import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' -import { AvansertForm } from '@/components/fagsystem/pdlf/form/partials/avansert/AvansertForm' -import { PdlPersonExpander } from '@/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonExpander' -import { initialFullmakt } from '@/components/fagsystem/pdlf/form/initialValues' -import { isEmpty } from '@/components/fagsystem/pdlf/form/partials/utils' -import { SelectOptionsFormat } from '@/service/SelectOptionsFormat' -import { UseFormReturn } from 'react-hook-form/dist/types' -import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' - -interface FullmaktProps { - formMethods: UseFormReturn - path?: string - eksisterendeNyPerson?: any -} - -export const FullmaktForm = ({ formMethods, path, eksisterendeNyPerson = null }: FullmaktProps) => { - const fullmaktOmraader = SelectOptionsOppslag.hentFullmaktOmraader() - const fullmaktOptions = SelectOptionsFormat.formatOptions('fullmaktOmraader', fullmaktOmraader) - const opts: any = useContext(BestillingsveilederContext) - - const isTestnorgeIdent = opts?.identMaster === 'PDL' - - return ( -
-
- -
- - - - -
- ) -} - -export const Fullmakt = ({ formMethods }: FullmaktProps) => { - return ( - - {(path: string) => } - - ) -} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson.tsx index 10ee5c4e453..89c68f9dbf1 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson.tsx @@ -13,6 +13,7 @@ import { usePdlOptions } from '@/utils/hooks/useSelectOptions' interface PdlEksisterendePersonValues { nyPersonPath?: string eksisterendePersonPath: string + fullmektigsNavnPath?: string label: string formMethods: UseFormReturn idx: number @@ -29,11 +30,12 @@ export const PdlEksisterendePerson = ({ formMethods, idx, disabled = false, - nyIdentValg = null, - eksisterendeNyPerson = null, + nyIdentValg = null as unknown as NyIdent, + eksisterendeNyPerson = null as unknown as Option, + fullmektigsNavnPath = null as unknown as string, ident, }: PdlEksisterendePersonValues) => { - const opts = useContext(BestillingsveilederContext) + const opts: any = useContext(BestillingsveilederContext) const antall = opts?.antall || 1 const gruppeId = opts?.gruppeId || opts?.gruppe?.id || window.location.pathname.split('/')?.[2] @@ -169,7 +171,11 @@ export const PdlEksisterendePerson = ({ { + const navn = person?.label?.match(/-\s(.*?)\s\(/) formMethods.setValue(eksisterendePersonPath, person?.value || null) + if (fullmektigsNavnPath) { + formMethods.setValue(fullmektigsNavnPath, navn?.[1] || person?.label || null) + } formMethods.trigger('pdldata.person') }} label={label} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonExpander.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonExpander.tsx index 533ccfeb7fa..e54ce2f853a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonExpander.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonExpander.tsx @@ -10,6 +10,7 @@ interface PdlPersonValues { path: string nyPersonPath: string eksisterendePersonPath: string + fullmektigsNavnPath?: string eksisterendeNyPerson?: Option label: string formMethods: UseFormReturn @@ -22,6 +23,7 @@ export const PdlPersonExpander = ({ path, nyPersonPath, eksisterendePersonPath, + fullmektigsNavnPath, eksisterendeNyPerson = null, label, formMethods, @@ -55,6 +57,7 @@ export const PdlPersonExpander = ({ path={path} nyPersonPath={nyPersonPath} eksisterendePersonPath={eksisterendePersonPath} + fullmektigsNavnPath={fullmektigsNavnPath} label={label} formMethods={formMethods} nyIdentValg={nyIdentValg} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonForm.tsx index c38ebf1dbe5..4152e35ef2d 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonForm.tsx @@ -17,6 +17,7 @@ interface PdlPersonValues { path: string nyPersonPath: string eksisterendePersonPath: string + fullmektigsNavnPath?: string label: string formMethods: UseFormReturn nyIdentValg?: NyIdent @@ -46,6 +47,7 @@ export const PdlPersonForm = ({ path, nyPersonPath, eksisterendePersonPath, + fullmektigsNavnPath, label, formMethods, nyIdentValg = null, @@ -73,7 +75,9 @@ export const PdlPersonForm = ({ eksisterendePersonPath, type === PersonType.EKSISTERENDE_PERSON ? eksisterendeNyPerson?.value : undefined, ) - formMethods.setValue(`${path}.eksisterendePerson`, type === PersonType.EKSISTERENDE_PERSON) + if (path) { + formMethods.setValue(`${path}.eksisterendePerson`, type === PersonType.EKSISTERENDE_PERSON) + } formMethods.trigger() }, [type]) @@ -129,6 +133,7 @@ export const PdlPersonForm = ({ formMethods={formMethods} nyIdentValg={nyIdentValg} eksisterendeNyPerson={eksisterendeNyPerson} + fullmektigsNavnPath={fullmektigsNavnPath} disabled={opts?.antall > 1} /> )} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/personinformasjon/Personinformasjon.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/personinformasjon/Personinformasjon.tsx index c8b87460133..f7cc83f3219 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/personinformasjon/Personinformasjon.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/personinformasjon/Personinformasjon.tsx @@ -3,7 +3,6 @@ import Panel from '@/components/ui/panel/Panel' import { Vis } from '@/components/bestillingsveileder/VisAttributt' import { erForsteEllerTest, panelError } from '@/components/ui/form/formUtils' import { Kategori } from '@/components/ui/form/kategori/Kategori' -import { Fullmakt } from '../fullmakt/Fullmakt' import { Sikkerhetstiltak } from '@/components/fagsystem/pdlf/form/partials/sikkerhetstiltak/Sikkerhetstiltak' import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' import { TpsMessagingDiverse } from '@/components/fagsystem/tpsmessaging/form/TpsMessagingDiverse' @@ -21,6 +20,7 @@ import { NorskBankkonto, UtenlandskBankkonto } from '@/components/fagsystem/bank import { SkjermingForm } from '@/components/fagsystem/skjermingsregister/form/SkjermingForm' import { Foedested } from '@/components/fagsystem/pdlf/form/partials/foedsel/Foedested' import { Foedselsdato } from '@/components/fagsystem/pdlf/form/partials/foedsel/Foedselsdato' +import { Fullmakt } from '@/components/fagsystem/fullmakt/form/FullmaktForm' const foedselPaths = ['pdldata.person.foedested', 'pdldata.person.foedselsdato'] @@ -55,8 +55,8 @@ const foedestedPath = ['pdldata.person.foedested'] const foedselsdatoPath = ['pdldata.person.foedselsdato'] const doedsfallPath = ['pdldata.person.doedsfall'] const vergemaalPath = ['pdldata.person.vergemaal'] -const fullmaktPath = ['pdldata.person.fullmakt'] const sikkerhetstiltakPath = ['pdldata.person.sikkerhetstiltak'] +const fullmaktPath = ['pdldata.person.fullmakt', 'fullmakt'] const panelPaths = [ alderPaths, @@ -71,7 +71,6 @@ const panelPaths = [ foedselPaths, doedsfallPath, vergemaalPath, - fullmaktPath, sikkerhetstiltakPath, statsborgerskapPath, utenlandskBankkontoPath, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/fullmakt.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/fullmakt.tsx deleted file mode 100644 index a89c3e435b6..00000000000 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/fullmakt.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import * as Yup from 'yup' -import { testDatoFom, testDatoTom } from '@/components/fagsystem/utils' -import { requiredDate } from '@/utils/YupValidations' -import { nyPerson } from '@/components/fagsystem/pdlf/form/validation/partials/familierelasjoner' - -export const fullmakt = Yup.object({ - omraader: Yup.array().min(1, 'Velg minst ett område'), - gyldigFraOgMed: testDatoFom(requiredDate.nullable(), 'gyldigTilOgMed'), - gyldigTilOgMed: testDatoTom(requiredDate.nullable(), 'gyldigFraOgMed'), - motpartsPersonident: Yup.string() - .test('feltet-mangler', 'Fullmektig er påkrevd', (value, testcontext) => { - return value || testcontext.options.context?.identMaster !== 'PDL' - }) - .nullable(), - nyFullmektig: nyPerson, -}) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/index.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/index.tsx index c6374541562..4ae6a1ec78f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/index.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/index.tsx @@ -19,7 +19,6 @@ import { sikkerhetstiltak } from './sikkerhetstiltak' import { telefonnummer } from './telefonnummer' import { utenlandskId, falskIdentitet } from './identifikasjon' import { utflytting } from './utflytting' -import { fullmakt } from './fullmakt' import { statsborgerskap } from './statborgerskap' import { vergemaal } from './vergemaal' import { tilrettelagtKommunikasjon } from './tilrettelagtKommunikasjon' @@ -43,7 +42,6 @@ export { utenlandskId, falskIdentitet, utflytting, - fullmakt, statsborgerskap, vergemaal, tilrettelagtKommunikasjon, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/validation.tsx index 46fd39035f5..ad5627d5085 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/validation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/validation.tsx @@ -7,7 +7,6 @@ import { falskIdentitet, forelderBarnRelasjon, foreldreansvar, - fullmakt, innflytting, kontaktadresse, kontaktDoedsbo, @@ -127,7 +126,6 @@ export const validation = { '$pdldata.person.adressebeskyttelse', Yup.array().of(adressebeskyttelse), ), - fullmakt: ifPresent('$pdldata.person.fullmakt', Yup.array().of(fullmakt)), sikkerhetstiltak: ifPresent('$pdldata.person.sikkerhetstiltak', sikkerhetstiltak), tilrettelagtKommunikasjon: ifPresent( '$pdldata.person.tilrettelagtKommunikasjon', diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisning.tsx index bcd19fe9285..71d21367c8f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisning.tsx @@ -3,7 +3,6 @@ import { FalskIdentitet } from '@/components/fagsystem/pdlf/visning/partials/Fal import { KontaktinformasjonForDoedsbo } from '@/components/fagsystem/pdlf/visning/partials/KontaktinformasjonForDoedsbo' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import Loading from '@/components/ui/loading/Loading' -import { Fullmakt } from '@/components/fagsystem/pdlf/visning/partials/Fullmakt' import { Telefonnummer } from '@/components/fagsystem/pdlf/visning/partials/Telefonnummer' import { TilrettelagtKommunikasjon } from '@/components/fagsystem/pdlf/visning/partials/TilrettelagtKommunikasjon' import { Boadresse } from '@/components/fagsystem/pdlf/visning/partials/Boadresse' @@ -23,6 +22,7 @@ import { Persondetaljer } from '@/components/fagsystem/pdlf/visning/partials/Per import { PdlSikkerhetstiltak } from '@/components/fagsystem/pdl/visning/partials/PdlSikkerhetstiltak' import { TpsMBankkonto } from '@/components/fagsystem/pdl/visning/partials/tpsMessaging/TpsMBankkonto' import { ForeldreansvarVisning } from '@/components/fagsystem/pdlf/visning/partials/Foreldreansvar' +import { FullmaktVisning } from '@/components/fagsystem' export const getBankkontoData = (data) => { if (data?.kontoregister) { @@ -121,13 +121,6 @@ export const PdlfVisning = ({ fagsystemData, loading, tmpPersoner, erRedigerbar relasjoner={data?.relasjoner} erRedigerbar={erRedigerbar} /> - + - tmpPersoner?: Array - ident?: string - relasjoner: Array -} - -type DataListe = { - data: Array - tmpPersoner?: Array - ident?: string - relasjoner: Array - erRedigerbar?: boolean -} - -const Omraader = styled(TitleValue)` - && { - margin-bottom: 20px; - } -` - -const FullmaktLes = ({ fullmaktData, relasjoner, redigertRelatertePersoner = null, idx }) => { - if (!fullmaktData) { - return null - } - - const fullmektigIdent = fullmaktData.motpartsPersonident - const fullmektig = relasjoner?.find( - (relasjon) => relasjon.relatertPerson?.ident === fullmektigIdent, - ) - const fullmektigRedigert = redigertRelatertePersoner?.find( - (item) => item.relatertPerson?.ident === fullmektigIdent, - ) - - const omraader = fullmaktData.omraader - ?.map((omraade) => showKodeverkLabel(FullmaktKodeverk.Tema, omraade)) - ?.join(', ') - - return ( - <> -
- -
- - - {!fullmektig && !fullmektigRedigert && ( - - )} -
-
- {(fullmektig || fullmektigRedigert) && ( - - )} - - ) -} - -export const FullmaktVisning = ({ - fullmaktData, - idx, - data, - tmpPersoner, - ident, - relasjoner, -}: Data) => { - const initFullmakt = Object.assign(_.cloneDeep(initialFullmakt), data[idx]) - let initialValues = { fullmakt: initFullmakt } - - const redigertFullmaktPdlf = _.get(tmpPersoner, `${ident}.person.fullmakt`)?.find( - (a: FullmaktValues) => a.id === fullmaktData.id, - ) - const redigertRelatertePersoner = _.get(tmpPersoner, `${ident}.relasjoner`) - - const slettetFullmaktPdlf = tmpPersoner?.hasOwnProperty(ident) && !redigertFullmaktPdlf - if (slettetFullmaktPdlf) { - return - } - - const fullmaktValues = redigertFullmaktPdlf ? redigertFullmaktPdlf : fullmaktData - let redigertFullmaktValues = redigertFullmaktPdlf - ? { - fullmakt: Object.assign(_.cloneDeep(initialFullmakt), redigertFullmaktPdlf), - } - : null - - const eksisterendeNyPerson = redigertRelatertePersoner - ? getEksisterendeNyPerson(redigertRelatertePersoner, fullmaktValues?.motpartsPersonident, [ - 'FULLMEKTIG', - ]) - : getEksisterendeNyPerson(relasjoner, fullmaktValues?.motpartsPersonident, ['FULLMEKTIG']) - - if (eksisterendeNyPerson && initialValues?.fullmakt?.nyFullmektig) { - initialValues.fullmakt.nyFullmektig = initialPdlPerson - } - - if (eksisterendeNyPerson && redigertFullmaktValues?.fullmakt?.nyFullmektig) { - redigertFullmaktValues.fullmakt.nyFullmektig = initialPdlPerson - } - - return ( - - } - initialValues={initialValues} - eksisterendeNyPerson={eksisterendeNyPerson} - redigertAttributt={redigertFullmaktValues} - path="fullmakt" - ident={ident} - /> - ) -} - -export const Fullmakt = ({ - data, - tmpPersoner, - ident, - relasjoner, - erRedigerbar = true, -}: DataListe) => { - if (!data || data.length < 1) { - return null - } - const fullmaktRelasjoner = relasjoner?.filter( - (relasjon) => relasjon.relasjonType === 'FULLMEKTIG', - ) - - return ( -
- -
- - - {(fullmakt: FullmaktData, idx: number) => - erRedigerbar ? ( - - ) : ( - - ) - } - - -
-
- ) -} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Persondetaljer.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Persondetaljer.tsx index 751daf5471d..0485962c0ed 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Persondetaljer.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Persondetaljer.tsx @@ -23,7 +23,7 @@ type PersondetaljerTypes = { data: any tmpPersoner: any ident: string - erPdlVisning: boolean + erPdlVisning?: boolean tpsMessaging: any tpsMessagingLoading?: boolean skjermingData: Skjerming diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbar.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbar.tsx index d955d7805ed..3e27fc771cc 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbar.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbar.tsx @@ -16,7 +16,6 @@ import { BostedsadresseForm } from '@/components/fagsystem/pdlf/form/partials/ad import { OppholdsadresseForm } from '@/components/fagsystem/pdlf/form/partials/adresser/oppholdsadresse/Oppholdsadresse' import { KontaktadresseForm } from '@/components/fagsystem/pdlf/form/partials/adresser/kontaktadresse/Kontaktadresse' import { VergemaalForm } from '@/components/fagsystem/pdlf/form/partials/vergemaal/Vergemaal' -import { FullmaktForm } from '@/components/fagsystem/pdlf/form/partials/fullmakt/Fullmakt' import { SivilstandForm } from '@/components/fagsystem/pdlf/form/partials/familierelasjoner/sivilstand/Sivilstand' import { AdressebeskyttelseForm, @@ -75,7 +74,6 @@ enum Attributt { Innvandring = 'innflytting', Utvandring = 'utflytting', Vergemaal = 'vergemaal', - Fullmakt = 'fullmakt', Boadresse = 'bostedsadresse', Oppholdsadresse = 'oppholdsadresse', Kontaktadresse = 'kontaktadresse', @@ -264,14 +262,6 @@ export const VisningRedigerbar = ({ eksisterendeNyPerson={eksisterendeNyPerson} /> ) - case Attributt.Fullmakt: - return ( - - ) case Attributt.Boadresse: return ( { - diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/index.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/index.tsx index a65724a2ed2..196fd8afda5 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/index.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/index.tsx @@ -1,4 +1,3 @@ -import { Fullmakt } from '@/components/fagsystem/pdlf/visning/partials/Fullmakt' import { TpsfPersoninfo } from '@/components/fagsystem/tpsf/visning/partials/Personinfo' import { TpsfNasjonalitet } from '@/components/fagsystem/tpsf/visning/partials/Nasjonalitet' import { TpsfBoadresse } from '@/components/fagsystem/tpsf/visning/partials/Boadresse' @@ -17,5 +16,4 @@ export { TpsfIdenthistorikk, Relasjoner, TpsfVergemaal, - Fullmakt, } diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/DollyFieldArray.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/DollyFieldArray.tsx index 869b9a7c182..a88d7156d62 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/DollyFieldArray.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/DollyFieldArray.tsx @@ -156,7 +156,7 @@ export const DollyFieldArray = ({ nested = false, children, expandable = false, - getHeader = null, + getHeader = null as unknown as Function, whiteBackground = false, }) => { if (ignoreOnSingleElement && data.length === 1) { diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/ExpandableBlokk.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/ExpandableBlokk.tsx index 954bdc10221..648a6aaf781 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/ExpandableBlokk.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/ExpandableBlokk.tsx @@ -13,6 +13,7 @@ interface ExpandableBlokkProps { children: React.ReactNode data: T getHeader: (data: T) => string + whiteBackground?: boolean } const Numbering = ({ idx }: NumberingProps) => {idx + 1} 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 432e6e6c9d3..2b06c5bfa3e 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 @@ -64,6 +64,7 @@ const getValgteAttributter = (values) => { 'pdldata.person.nyident', 'pdldata.person.kontaktinformasjonForDoedsbo', 'aareg', + 'fullmakt', 'sigrunstub', 'sigrunstubPensjonsgivende', 'inntektstub', diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx index a843c464ae5..03a76d496ef 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx @@ -61,7 +61,9 @@ export const Datepicker = ({ inputProps.value && inputProps.value !== '' && inputProps.value?.split('.') const inputDate = (year && new Date(year, month - 1, day)) || undefined if (selectedDate && !_.isEqual(inputDate?.toDateString(), selectedDate?.toDateString())) { - setTimeout(() => setSelected(selectedDate), 200) + setTimeout(() => { + setSelected(selectedDate) + }, 200) } }, [inputProps.value, selectedDate]) @@ -73,6 +75,7 @@ export const Datepicker = ({ onChange={(e) => { setSelected(undefined) inputProps.onChange(e) + formMethods.trigger(name) }} size={'small'} disabled={disabled} @@ -100,12 +103,12 @@ const P_FormDatepicker = ({ ...props }) => { } let val = fixTimezone(date)?.toISOString().substring(0, 19) || null formMethods.setValue(props.name, val, { shouldTouch: true }) - formMethods.trigger() + formMethods.trigger(props.name) } const handleBlur = () => { props?.onBlur?.(SyntEvent(props.name, value)) formMethods.setValue(props.name, value, { shouldTouch: true }) - formMethods.trigger() + formMethods.trigger(props.name) } return } diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/select/Select.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/select/Select.tsx index 4b0b59d77f9..0a68d98fdea 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/select/Select.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/select/Select.tsx @@ -40,6 +40,7 @@ type SelectProps = { feil?: any size?: string info?: any + normalFontPlaceholder?: boolean visHvisAvhuket?: any afterChange?: any isInDialog?: boolean @@ -61,6 +62,7 @@ export const Select = ({ styles, onChange, isInDialog = false, + normalFontPlaceholder = false, ...rest }: SelectProps) => { const formMethods = useFormContext() @@ -104,6 +106,13 @@ export const Select = ({ isLoading={isLoading} isClearable={isClearable} isMulti={isMulti} + theme={(theme) => ({ + ...theme, + colors: { + ...theme.colors, + neutral50: normalFontPlaceholder ? 'unset' : '', + }, + })} onChange={onChange} styles={styles ? styles : { menuPortal: (base) => ({ ...base, zIndex: 99999 }) }} // Naar vi bruker modal fra Aksel maa vi referere til modalens className for at dropdowns ikke skal forsvinne bak modalen diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/icon/Icon.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/icon/Icon.tsx index 06ebfcf265a..1323ff82796 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/icon/Icon.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/icon/Icon.tsx @@ -42,6 +42,7 @@ import { MagnifyingGlassIcon, MinusCircleIcon, PadlockLockedIcon, + PassportIcon, PencilIcon, PersonCircleIcon, PersonFillIcon, @@ -138,7 +139,7 @@ export const icons = { nasjonalitet: EarthIcon, relasjoner: PersonTallShortIcon, identhistorikk: BagdeIcon, - identifikasjon: PersonGroupIcon, + identifikasjon: PassportIcon, adresse: HouseIcon, postadresse: InboxDownIcon, 'midlertidig-adresse': HourglassIcon, diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/panel/Panel.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/panel/Panel.tsx index 129f2b79137..23a7b095163 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/panel/Panel.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/panel/Panel.tsx @@ -21,7 +21,7 @@ export default function Panel({ checkAttributeArray = null, uncheckAttributeArray = null, informasjonstekst = null, - iconType = null, + iconType = null as unknown as string, forceOpen = false, setPanelOpen = null, }) { diff --git a/apps/dolly-frontend/src/main/js/src/flowers.scss b/apps/dolly-frontend/src/main/js/src/flowers.scss index c91744926e8..05cd9d35558 100644 --- a/apps/dolly-frontend/src/main/js/src/flowers.scss +++ b/apps/dolly-frontend/src/main/js/src/flowers.scss @@ -1,51 +1,52 @@ +@use 'sass:math'; + .flower { - width: 3vw; - height: 1vw; - background: #FFACD9; - border-radius: 50%; - position: absolute; - top: -5vh; + width: 3vw; + height: 1vw; + background: #ffacd9; + border-radius: 50%; + position: absolute; + top: -5vh; } .flower::before { - content: ""; - display: block; - width: inherit; - height: inherit; - background: #FFACD9; - border-radius: 50%; - transform: rotate(60deg); - position: absolute; + content: ''; + display: block; + width: inherit; + height: inherit; + background: #ffacd9; + border-radius: 50%; + transform: rotate(60deg); + position: absolute; } .flower::after { - content: ""; - display: block; - width: inherit; - height: inherit; - background: #FFACD9; - border-radius: 50%; - transform: rotate(-60deg); + content: ''; + display: block; + width: inherit; + height: inherit; + background: #ffacd9; + border-radius: 50%; + transform: rotate(-60deg); } - @keyframes flowerfall { - 0% { - transform: translate3d(var(--left-ini), 5vh, 0); - } - 100% { - transform: translate3d(var(--left-end), 100vh, 0); - } + 0% { + transform: translate3d(var(--left-ini), 5vh, 0); + } + 100% { + transform: translate3d(var(--left-end), 100vh, 0); + } } @for $i from 1 through 30 { - .flower:nth-child(#{$i}) { - width: #{random(2)}vw; - height: #{random(2) * 0.33}vw; - --left-ini: #{random(20) - 10}vw; - --left-end: #{random(20) - 10}vw; - left: #{random(93)}vw; - animation: flowerfall #{5 + random(10)}s linear infinite; - animation-delay: -#{random(10)}s; - } + .flower:nth-child(#{$i}) { + width: #{math.random(2)}vw; + height: #{math.random(2) * 0.33}vw; + --left-ini: #{math.random(20) - 10}vw; + --left-end: #{math.random(20) - 10}vw; + left: #{math.random(93)}vw; + animation: flowerfall #{5 + math.random(10)}s linear infinite; + animation-delay: -#{math.random(10)}s; + } } diff --git a/apps/dolly-frontend/src/main/js/src/pages/dollySoek/SoekForm.tsx b/apps/dolly-frontend/src/main/js/src/pages/dollySoek/SoekForm.tsx index 1839b2c371a..e8092568847 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/dollySoek/SoekForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/dollySoek/SoekForm.tsx @@ -187,13 +187,6 @@ export const SoekForm = () => { handleChange(val.target.checked, `${personPath}.harVerge`) } /> - - handleChange(val.target.checked, `${personPath}.harFullmakt`) - } - /> { return null } - return arrayToString(array).replace('*', '* (Alle)') + return arrayToString(array.map((item) => item.tema)).replace('*', '* (Alle)') } export const uppercaseAndUnderscoreToCapitalized = (value) => { @@ -151,6 +151,9 @@ export const allCapsToCapitalized = (value) => { } export const toTitleCase = (value) => { + if (!value) { + return '' + } return value .split(' ') .map(_.capitalize) diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useFullmakt.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useFullmakt.tsx new file mode 100644 index 00000000000..6430642ca19 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useFullmakt.tsx @@ -0,0 +1,73 @@ +import useSWR from 'swr' +import { fetcher } from '@/api' +import { Option } from '@/service/SelectOptionsOppslag' + +type NodeType = { + kode: string + hjelpetekst?: { nb: string } | null + termer: any + undernoder?: Record | null +} + +type FullmaktKodeverkType = { + noder: Record +} + +export const useFullmektig = (ident: string) => { + const { data, isLoading, error } = useSWR( + [ + ident && '/testnav-fullmakt-proxy/api/fullmaktsgiver', + { accept: 'application/json', 'Content-Type': 'application/json', fnr: ident }, + ], + ([url, headers]) => fetcher(url, headers), + ) + + return { + fullmektig: data, + loading: isLoading, + error: error, + } +} + +export const useFullmaktOmraader = () => { + const { data, isLoading, error } = useSWR( + [ + '/testnav-fullmakt-proxy/api/omraade', + { accept: 'application/json', 'Content-Type': 'application/json', fnr: '12808012345' }, + ], + ([url, headers]) => fetcher(url, headers), + ) + + const omraadeKodeverk = data?.noder + + return { + omraadeKodeverk: mapOmraadeKodeverkToOptions(omraadeKodeverk), + loading: isLoading, + error: error, + } +} +const mapOmraadeKodeverkToOptions = ( + omraadeKodeverk: Record | undefined, +): Option[] => { + if (!omraadeKodeverk) { + return [] + } + const options: Option[] = [] + + const traverseNodes = (nodes: Record) => { + for (const key in nodes) { + const node = nodes[key] + if (node.undernoder) { + traverseNodes(node.undernoder) + } else { + options.push({ + value: node.kode, + label: `${node.termer.nb} - ${node.kode}`, + }) + } + } + } + + traverseNodes(omraadeKodeverk) + return options +} diff --git a/apps/dolly-frontend/src/main/js/vite.config.js b/apps/dolly-frontend/src/main/js/vite.config.js index 8ac6bceb9be..7cf62651bfb 100644 --- a/apps/dolly-frontend/src/main/js/vite.config.js +++ b/apps/dolly-frontend/src/main/js/vite.config.js @@ -51,6 +51,13 @@ export default defineConfig(({ mode }) => ({ external: ['./nais.js'], }, }, + css: { + preprocessorOptions: { + scss: { + api: 'modern-compiler', + }, + }, + }, optimizeDeps: { exclude: ['node_modules/.cache'] }, resolve: { alias: { diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index 85fb442a7a5..50bc1e8ca28 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -88,6 +88,11 @@ consumers: namespace: dolly name: testnav-krrstub-proxy url: https://testnav-krrstub-proxy.dev-fss-pub.nais.io + testnav-fullmakt-proxy: + cluster: dev-fss + namespace: dolly + name: testnav-fullmakt-proxy + url: https://testnav-fullmakt-proxy.dev-fss-pub.nais.io testnav-sigrunstub-proxy: cluster: dev-fss namespace: dolly diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/controller/PersonController.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/controller/PersonController.java index a0e39ab45ba..0174785101a 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/controller/PersonController.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/controller/PersonController.java @@ -24,7 +24,6 @@ import no.nav.testnav.libs.data.pdlforvalter.v1.ForelderBarnRelasjonDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.ForeldreansvarDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.FullPersonDTO; -import no.nav.testnav.libs.data.pdlforvalter.v1.FullmaktDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.InnflyttingDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.KjoennDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.KontaktadresseDTO; @@ -160,9 +159,9 @@ public void deleteFoedsel(@Parameter(description = "Ident for testperson") @DeleteMapping(value = "/{ident}/foedested/{id}") @Operation(description = "Slett angitt foedested for person") public void deleteFoedested(@Parameter(description = "Ident for testperson") - @PathVariable String ident, - @Parameter(description = "id som identifiserer foedested") - @PathVariable Integer id) { + @PathVariable String ident, + @Parameter(description = "id som identifiserer foedested") + @PathVariable Integer id) { artifactDeleteService.deleteFoedested(ident, id); } @@ -170,9 +169,9 @@ public void deleteFoedested(@Parameter(description = "Ident for testperson") @DeleteMapping(value = "/{ident}/foedselsdato/{id}") @Operation(description = "Slett angitt foedselsdato for person") public void deleteFoedselsdato(@Parameter(description = "Ident for testperson") - @PathVariable String ident, - @Parameter(description = "id som identifiserer foedselsdato") - @PathVariable Integer id) { + @PathVariable String ident, + @Parameter(description = "id som identifiserer foedselsdato") + @PathVariable Integer id) { artifactDeleteService.deleteFoedselsdato(ident, id); } @@ -650,27 +649,6 @@ public void updateTelefonnumre(@Parameter(description = "Ident for testperson") artifactUpdateService.updateTelefonnummer(ident, telefonnumre); } - @DeleteMapping(value = "/{ident}/fullmakt/{id}") - @Operation(description = "Slett angitt fullmakt for person") - public void deleteFullmakt(@Parameter(description = "Ident for testperson") - @PathVariable String ident, - @Parameter(description = "id som identifiserer fullmakt") - @PathVariable Integer id) { - - artifactDeleteService.deleteFullmakt(ident, id); - } - - @PutMapping(value = "/{ident}/fullmakt/{id}") - @Operation(description = "Oppdater angitt fullmakt for person") - public void updateFullmakt(@Parameter(description = "Ident for testperson") - @PathVariable String ident, - @Parameter(description = "id som identifiserer fullmakt") - @PathVariable Integer id, - @RequestBody FullmaktDTO fullmakt) { - - artifactUpdateService.updateFullmakt(ident, id, fullmakt); - } - @DeleteMapping(value = "/{ident}/vergemaal/{id}") @Operation(description = "Slett angitt vergemaal for person") public void deleteVergemaal(@Parameter(description = "Ident for testperson") diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ArtifactDeleteService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ArtifactDeleteService.java index 2040b57a2ce..8baf87cb39f 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ArtifactDeleteService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ArtifactDeleteService.java @@ -26,7 +26,6 @@ import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FOLKEREGISTER_PERSONSTATUS; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FORELDREANSVAR; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FORELDRE_BARN_RELASJON; -import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FULLMAKT; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_INNFLYTTING; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_KJOENN; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_KONTAKTADRESSE; @@ -439,28 +438,6 @@ public void deleteTelefonnummer(String ident, Integer id) { .toList()); } - public void deleteFullmakt(String ident, Integer id) { - - var hovedPerson = getPerson(ident); - - checkExists(hovedPerson.getPerson().getFullmakt(), id, PDL_FULLMAKT.getDescription()); - hendelseIdService.deletePdlHendelse(ident, PDL_FULLMAKT.getDescription(), id); - - hovedPerson.getPerson().getFullmakt().stream() - .filter(type -> id.equals(type.getId())) - .forEach(fullmakt -> { - var slettePerson = getPerson(fullmakt.getMotpartsPersonident()); - - DeleteRelasjonerUtility.deleteRelasjoner(slettePerson, RelasjonType.FULLMEKTIG); - - deletePerson(slettePerson, fullmakt.isEksisterendePerson()); - }); - - hovedPerson.getPerson().setFullmakt(hovedPerson.getPerson().getFullmakt().stream() - .filter(type -> !id.equals(type.getId())) - .toList()); - } - public void deleteVergemaal(String ident, Integer id) { var hovedPerson = getPerson(ident); diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ArtifactUpdateService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ArtifactUpdateService.java index 12655496b07..0df11a725ed 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ArtifactUpdateService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ArtifactUpdateService.java @@ -19,7 +19,6 @@ import no.nav.testnav.libs.data.pdlforvalter.v1.ForelderBarnRelasjonDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.ForeldreansvarDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.ForeldreansvarDTO.Ansvar; -import no.nav.testnav.libs.data.pdlforvalter.v1.FullmaktDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.InnflyttingDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.KjoennDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.KontaktadresseDTO; @@ -48,7 +47,6 @@ import static no.nav.testnav.libs.data.pdlforvalter.v1.RelasjonType.FALSK_IDENTITET; import static no.nav.testnav.libs.data.pdlforvalter.v1.RelasjonType.FAMILIERELASJON_BARN; import static no.nav.testnav.libs.data.pdlforvalter.v1.RelasjonType.FORELDREANSVAR_FORELDER; -import static no.nav.testnav.libs.data.pdlforvalter.v1.RelasjonType.FULLMEKTIG; import static no.nav.testnav.libs.data.pdlforvalter.v1.RelasjonType.KONTAKT_FOR_DOEDSBO; import static no.nav.testnav.libs.data.pdlforvalter.v1.RelasjonType.VERGE; import static org.apache.commons.lang3.StringUtils.isNotBlank; @@ -73,7 +71,6 @@ public class ArtifactUpdateService { private final FolkeregisterPersonstatusService folkeregisterPersonstatusService; private final ForelderBarnRelasjonService forelderBarnRelasjonService; private final ForeldreansvarService foreldreansvarService; - private final FullmaktService fullmaktService; private final InnflyttingService innflyttingService; private final KjoennService kjoennService; private final KontaktAdresseService kontaktAdresseService; @@ -520,42 +517,6 @@ public void updateTelefonnummer(String ident, List oppdaterteT telefonnummerService.convert(person.getPerson().getTelefonnummer()); } - public void updateFullmakt(String ident, Integer id, FullmaktDTO oppdatertFullmakt) { - - var person = getPerson(ident); - fullmaktService.validate(oppdatertFullmakt, person.getPerson()); - - var fullmaktRelasjon = person.getPerson().getFullmakt().stream() - .filter(fullmakt -> fullmakt.getId().equals(id)) - .findFirst(); - - fullmaktRelasjon.ifPresent(fullmakt -> { - - var endretRelasjon = isNotBlank(fullmakt.getMotpartsPersonident()) && - !fullmakt.getMotpartsPersonident().equals(oppdatertFullmakt.getMotpartsPersonident()); - - if (endretRelasjon) { - - var slettePerson = getPerson(fullmakt.getMotpartsPersonident()); - - DeleteRelasjonerUtility.deleteRelasjoner(slettePerson, FULLMEKTIG); - deletePerson(slettePerson, fullmakt.isEksisterendePerson()); - - oppdatertFullmakt.setId(id); - person.getPerson().getFullmakt().add(oppdatertFullmakt); - person.getPerson().getFullmakt().sort(Comparator.comparing(FullmaktDTO::getId).reversed()); - } - }); - - person.getPerson().setFullmakt( - updateArtifact(person.getPerson().getFullmakt(), oppdatertFullmakt, id, "Fullmakt")); - - if (id == 0 || fullmaktRelasjon.isPresent()) { - - fullmaktService.convert(person.getPerson()); - } - } - public void updateVergemaal(String ident, Integer id, VergemaalDTO oppdatertVergemaal) { vergemaalService.validate(oppdatertVergemaal); diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/FullmaktService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/FullmaktService.java index 51b497eca54..14e1c610a30 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/FullmaktService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/FullmaktService.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import no.nav.pdl.forvalter.database.model.DbPerson; import no.nav.pdl.forvalter.database.repository.PersonRepository; -import no.nav.pdl.forvalter.exception.InvalidRequestException; import no.nav.pdl.forvalter.utils.SyntetiskFraIdentUtility; import no.nav.testnav.libs.data.pdlforvalter.v1.DbVersjonDTO.Master; import no.nav.testnav.libs.data.pdlforvalter.v1.FullmaktDTO; @@ -16,11 +15,9 @@ import java.util.List; import java.util.concurrent.atomic.AtomicReference; -import static java.lang.String.format; import static java.util.Objects.isNull; import static no.nav.pdl.forvalter.utils.ArtifactUtils.getKilde; import static no.nav.pdl.forvalter.utils.ArtifactUtils.getMaster; -import static no.nav.pdl.forvalter.utils.TestnorgeIdentUtility.isTestnorgeIdent; import static org.apache.commons.lang3.BooleanUtils.isTrue; import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; @@ -29,12 +26,6 @@ @RequiredArgsConstructor public class FullmaktService implements BiValidation { - private static final String VALIDATION_GYLDIG_FOM_ERROR = "Fullmakt med gyldigFom må angis"; - private static final String VALIDATION_GYLDIG_TOM_ERROR = "Fullmakt med gyldigTom må angis"; - private static final String VALIDATION_UGYLDIG_INTERVAL_ERROR = "Ugyldig datointervall: gyldigFom må være før gyldigTom"; - private static final String VALIDATION_OMRAADER_ERROR = "Områder for fullmakt må angis"; - private static final String VALIDATION_FULLMEKTIG_ERROR = "Fullmektig: person %s ikke funnet i database"; - private final PersonRepository personRepository; private final CreatePersonService createPersonService; private final RelasjonService relasjonService; @@ -56,24 +47,6 @@ public List convert(PersonDTO person) { @Override public void validate(FullmaktDTO fullmakt, PersonDTO person) { - if (isNull(fullmakt.getOmraader())) { - throw new InvalidRequestException(VALIDATION_OMRAADER_ERROR); - } - - if (isNull(fullmakt.getGyldigFraOgMed())) { - throw new InvalidRequestException(VALIDATION_GYLDIG_FOM_ERROR); - - } else if (isNull(fullmakt.getGyldigTilOgMed())) { - throw new InvalidRequestException(VALIDATION_GYLDIG_TOM_ERROR); - - } else if (!fullmakt.getGyldigFraOgMed().isBefore(fullmakt.getGyldigTilOgMed())) { - throw new InvalidRequestException(VALIDATION_UGYLDIG_INTERVAL_ERROR); - } - - if (!isTestnorgeIdent(person.getIdent()) && isNotBlank(fullmakt.getMotpartsPersonident()) && - !personRepository.existsByIdent(fullmakt.getMotpartsPersonident())) { - throw new InvalidRequestException(format(VALIDATION_FULLMEKTIG_ERROR, fullmakt.getMotpartsPersonident())); - } } private void handle(FullmaktDTO fullmakt, String ident) { @@ -106,11 +79,11 @@ private void handle(FullmaktDTO fullmakt, String ident) { personRepository.findByIdent(fullmakt.getMotpartsPersonident()) .ifPresentOrElse(motpartPerson::set, () -> motpartPerson.set(personRepository.save(DbPerson.builder() + .ident(fullmakt.getMotpartsPersonident()) + .person(PersonDTO.builder() .ident(fullmakt.getMotpartsPersonident()) - .person(PersonDTO.builder() - .ident(fullmakt.getMotpartsPersonident()) - .build()) - .sistOppdatert(LocalDateTime.now()) + .build()) + .sistOppdatert(LocalDateTime.now()) .build()))); } diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/PdlOrdreService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/PdlOrdreService.java index 0bc873f7c99..58bea0d8aa4 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/PdlOrdreService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/PdlOrdreService.java @@ -66,7 +66,6 @@ import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FOLKEREGISTER_PERSONSTATUS; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FORELDREANSVAR; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FORELDRE_BARN_RELASJON; -import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FULLMAKT; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_INNFLYTTING; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_KJOENN; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_KONTAKTADRESSE; @@ -103,56 +102,6 @@ public class PdlOrdreService { private final MapperFacade mapperFacade; private final HendelseIdService hendelseIdService; - private Set getEksternePersoner(DbPerson dbPerson) { - - return Stream.of( - dbPerson.getPerson().getSivilstand().stream() - .filter(SivilstandDTO::isEksisterendePerson) - .map(SivilstandDTO::getRelatertVedSivilstand), - dbPerson.getPerson().getForelderBarnRelasjon().stream() - .filter(ForelderBarnRelasjonDTO::isEksisterendePerson) - .map(ForelderBarnRelasjonDTO::getRelatertPerson), - dbPerson.getPerson().getForeldreansvar().stream() - .filter(ForeldreansvarDTO::isEksisterendePerson) - .map(ForeldreansvarDTO::getAnsvarlig), - dbPerson.getPerson().getVergemaal().stream() - .filter(VergemaalDTO::isEksisterendePerson) - .map(VergemaalDTO::getVergeIdent), - dbPerson.getPerson().getFullmakt().stream() - .filter(FullmaktDTO::isEksisterendePerson) - .map(FullmaktDTO::getMotpartsPersonident), - dbPerson.getPerson().getKontaktinformasjonForDoedsbo().stream() - .map(KontaktinformasjonForDoedsboDTO::getPersonSomKontakt) - .filter(Objects::nonNull) - .filter(KontaktinformasjonForDoedsboDTO.KontaktpersonDTO::isEksisterendePerson) - .map(KontaktinformasjonForDoedsboDTO.KontaktpersonDTO::getIdentifikasjonsnummer), - dbPerson.getPerson().getForelderBarnRelasjon().stream() - .filter(ForelderBarnRelasjonDTO::hasBarn) - .map(ForelderBarnRelasjonDTO::getRelatertPerson) - .map(personRepository::findByIdent) - .flatMap(Optional::stream) - .map(DbPerson::getPerson) - .map(PersonDTO::getForeldreansvar) - .flatMap(Collection::stream) - .filter(ForeldreansvarDTO::isEksisterendePerson) - .map(ForeldreansvarDTO::getAnsvarlig)) - .flatMap(Function.identity()) - .collect(Collectors.toSet()); - } - - private static List getPersonHendelser(String ident, List hendelser) { - - return nonNull(hendelser) ? - hendelser.stream() - .filter(hendelse -> ident.equals(hendelse.getIdent())) - .map(hendelse -> OrdreResponseDTO.PdlStatusDTO.builder() - .infoElement(hendelse.getInfoElement()) - .hendelser(hendelse.getHendelser()) - .build()) - .toList() : - emptyList(); - } - public OrdreResponseDTO send(String ident, Boolean ekskluderEksterenePersoner) { var timestamp = System.currentTimeMillis(); @@ -226,6 +175,43 @@ public OrdreResponseDTO send(String ident, Boolean ekskluderEksterenePersoner) { return response; } + private Set getEksternePersoner(DbPerson dbPerson) { + + return Stream.of( + dbPerson.getPerson().getSivilstand().stream() + .filter(SivilstandDTO::isEksisterendePerson) + .map(SivilstandDTO::getRelatertVedSivilstand), + dbPerson.getPerson().getForelderBarnRelasjon().stream() + .filter(ForelderBarnRelasjonDTO::isEksisterendePerson) + .map(ForelderBarnRelasjonDTO::getRelatertPerson), + dbPerson.getPerson().getForeldreansvar().stream() + .filter(ForeldreansvarDTO::isEksisterendePerson) + .map(ForeldreansvarDTO::getAnsvarlig), + dbPerson.getPerson().getVergemaal().stream() + .filter(VergemaalDTO::isEksisterendePerson) + .map(VergemaalDTO::getVergeIdent), + dbPerson.getPerson().getFullmakt().stream() + .filter(FullmaktDTO::isEksisterendePerson) + .map(FullmaktDTO::getMotpartsPersonident), + dbPerson.getPerson().getKontaktinformasjonForDoedsbo().stream() + .map(KontaktinformasjonForDoedsboDTO::getPersonSomKontakt) + .filter(Objects::nonNull) + .filter(KontaktinformasjonForDoedsboDTO.KontaktpersonDTO::isEksisterendePerson) + .map(KontaktinformasjonForDoedsboDTO.KontaktpersonDTO::getIdentifikasjonsnummer), + dbPerson.getPerson().getForelderBarnRelasjon().stream() + .filter(ForelderBarnRelasjonDTO::hasBarn) + .map(ForelderBarnRelasjonDTO::getRelatertPerson) + .map(personRepository::findByIdent) + .flatMap(Optional::stream) + .map(DbPerson::getPerson) + .map(PersonDTO::getForeldreansvar) + .flatMap(Collection::stream) + .filter(ForeldreansvarDTO::isEksisterendePerson) + .map(ForeldreansvarDTO::getAnsvarlig)) + .flatMap(Function.identity()) + .collect(Collectors.toSet()); + } + private void checkAlias(String ident) { var alias = aliasRepository.findByTidligereIdent(ident); @@ -317,17 +303,6 @@ private List npidMerge(OpprettRequest oppretting) { } } - private static void checkAndUpdate(Stack stack, String oppretting) { - - if (!stack.isEmpty()) { - var eksisterende = stack.pop(); - if (isBlank(eksisterende.getIdent())) { - eksisterende.setIdent(oppretting); - } - stack.push(eksisterende); - } - } - private List getOrdrer(OpprettRequest oppretting) { return Stream.of( deployService.createOrdre(PDL_FOLKEREGISTER_PERSONSTATUS, oppretting.getPerson().getIdent(), mapperFacade.mapAsList(oppretting.getPerson().getPerson().getFolkeregisterPersonstatus(), FolkeregisterPersonstatus.class)), @@ -354,7 +329,6 @@ private List getOrdrer(OpprettRequest oppretting) { .filter(SivilstandDTO::isNotSamboer) .toList()), deployService.createOrdre(PDL_VERGEMAAL, oppretting.getPerson().getIdent(), mapperFacade.mapAsList(oppretting.getPerson().getPerson().getVergemaal(), PdlVergemaal.class)), - deployService.createOrdre(PDL_FULLMAKT, oppretting.getPerson().getIdent(), oppretting.getPerson().getPerson().getFullmakt()), deployService.createOrdre(PDL_TELEFONUMMER, oppretting.getPerson().getIdent(), oppretting.getPerson().getPerson().getTelefonnummer()), deployService.createOrdre(PDL_OPPHOLD, oppretting.getPerson().getIdent(), oppretting.getPerson().getPerson().getOpphold()), deployService.createOrdre(PDL_KONTAKTINFORMASJON_FOR_DODESDBO, oppretting.getPerson().getIdent(), oppretting.getPerson().getPerson().getKontaktinformasjonForDoedsbo()), @@ -399,4 +373,28 @@ private List getFoedselsdato(PersonDTO person) { person.getFoedselsdato() : mapperFacade.mapAsList(person.getFoedsel(), FoedselDTO.class); } + + private static List getPersonHendelser(String ident, List hendelser) { + + return nonNull(hendelser) ? + hendelser.stream() + .filter(hendelse -> ident.equals(hendelse.getIdent())) + .map(hendelse -> OrdreResponseDTO.PdlStatusDTO.builder() + .infoElement(hendelse.getInfoElement()) + .hendelser(hendelse.getHendelser()) + .build()) + .toList() : + emptyList(); + } + + private static void checkAndUpdate(Stack stack, String oppretting) { + + if (!stack.isEmpty()) { + var eksisterende = stack.pop(); + if (isBlank(eksisterende.getIdent())) { + eksisterende.setIdent(oppretting); + } + stack.push(eksisterende); + } + } } \ No newline at end of file diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ValidateArtifactsService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ValidateArtifactsService.java index 1034824e252..cd250989e18 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ValidateArtifactsService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/ValidateArtifactsService.java @@ -25,7 +25,6 @@ public class ValidateArtifactsService { private final FolkeregisterPersonstatusService folkeregisterPersonstatusService; private final ForelderBarnRelasjonService forelderBarnRelasjonService; private final ForeldreansvarService foreldreansvarService; - private final FullmaktService fullmaktService; private final KjoennService kjoennService; private final KontaktAdresseService kontaktAdresseService; private final KontaktinformasjonForDoedsboService kontaktinformasjonForDoedsboService; @@ -61,7 +60,6 @@ public void validate(PersonDTO person) { validate(tilrettelagtKommunikasjonService, person.getTilrettelagtKommunikasjon()), validate(doedsfallService, person.getDoedsfall()), validate(folkeregisterPersonstatusService, person.getFolkeregisterPersonstatus(), person), - validate(fullmaktService, person.getFullmakt(), person), validate(kontaktAdresseService, person.getKontaktadresse(), person), validate(utenlandsidentifikasjonsnummerService, person.getUtenlandskIdentifikasjonsnummer()), validate(vergemaalService, person.getVergemaal()), diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/VergemaalService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/VergemaalService.java index 4a50474a916..e57a538a89a 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/VergemaalService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/VergemaalService.java @@ -70,32 +70,32 @@ public void validate(VergemaalDTO vergemaal) { } } - private void handle(VergemaalDTO fullmakt, String ident) { + private void handle(VergemaalDTO vergemaal, String ident) { - fullmakt.setEksisterendePerson(isNotBlank(fullmakt.getVergeIdent())); + vergemaal.setEksisterendePerson(isNotBlank(vergemaal.getVergeIdent())); - if (isBlank(fullmakt.getVergeIdent())) { + if (isBlank(vergemaal.getVergeIdent())) { - if (isNull(fullmakt.getNyVergeIdent())) { - fullmakt.setNyVergeIdent(new PersonRequestDTO()); + if (isNull(vergemaal.getNyVergeIdent())) { + vergemaal.setNyVergeIdent(new PersonRequestDTO()); } - if (isNull(fullmakt.getNyVergeIdent().getAlder()) && - isNull(fullmakt.getNyVergeIdent().getFoedtEtter()) && - isNull(fullmakt.getNyVergeIdent().getFoedtFoer())) { + if (isNull(vergemaal.getNyVergeIdent().getAlder()) && + isNull(vergemaal.getNyVergeIdent().getFoedtEtter()) && + isNull(vergemaal.getNyVergeIdent().getFoedtFoer())) { - fullmakt.getNyVergeIdent().setFoedtFoer(LocalDateTime.now().minusYears(18)); - fullmakt.getNyVergeIdent().setFoedtEtter(LocalDateTime.now().minusYears(75)); + vergemaal.getNyVergeIdent().setFoedtFoer(LocalDateTime.now().minusYears(18)); + vergemaal.getNyVergeIdent().setFoedtEtter(LocalDateTime.now().minusYears(75)); } - if (isNull(fullmakt.getNyVergeIdent().getSyntetisk())) { - fullmakt.getNyVergeIdent().setSyntetisk(SyntetiskFraIdentUtility.isSyntetisk(ident)); + if (isNull(vergemaal.getNyVergeIdent().getSyntetisk())) { + vergemaal.getNyVergeIdent().setSyntetisk(SyntetiskFraIdentUtility.isSyntetisk(ident)); } - fullmakt.setVergeIdent(createPersonService.execute(fullmakt.getNyVergeIdent()).getIdent()); + vergemaal.setVergeIdent(createPersonService.execute(vergemaal.getNyVergeIdent()).getIdent()); } relasjonService.setRelasjoner(ident, RelasjonType.VERGE_MOTTAKER, - fullmakt.getVergeIdent(), RelasjonType.VERGE); + vergemaal.getVergeIdent(), RelasjonType.VERGE); } } \ No newline at end of file diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/utils/PdlTestDataUrls.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/utils/PdlTestDataUrls.java index 48d60205506..f0a91c9affa 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/utils/PdlTestDataUrls.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/utils/PdlTestDataUrls.java @@ -17,7 +17,6 @@ import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FOLKEREGISTER_PERSONSTATUS; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FORELDREANSVAR; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FORELDRE_BARN_RELASJON; -import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_FULLMAKT; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_INNFLYTTING; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_KJOENN; import static no.nav.testnav.libs.data.pdlforvalter.v1.PdlArtifact.PDL_KONTAKTADRESSE; @@ -60,7 +59,6 @@ public class PdlTestDataUrls { private static final String PDL_BESTILLING_FOLKEREGISTER_PERSONSTATUS_URL = PDL_BESTILLING_URL + "/folkeregisterpersonstatus"; private static final String PDL_BESTILLING_FORELDREANSVAR_URL = PDL_BESTILLING_URL + "/foreldreansvar"; private static final String PDL_BESTILLING_FORELDRE_BARN_RELASJON_URL = PDL_BESTILLING_URL + "/forelderbarnrelasjon"; - private static final String PDL_BESTILLING_FULLMAKT_URL = PDL_BESTILLING_URL + "/fullmakt"; private static final String PDL_BESTILLING_INNFLYTTING_URL = PDL_BESTILLING_URL + "/innflytting"; private static final String PDL_BESTILLING_KJOENN_URL = PDL_BESTILLING_URL + "/kjoenn"; private static final String PDL_BESTILLING_KONTAKTADRESSE_URL = PDL_BESTILLING_URL + "/kontaktadresse"; @@ -92,7 +90,6 @@ public class PdlTestDataUrls { bestillingUrl.put(PDL_FOLKEREGISTER_PERSONSTATUS, PDL_BESTILLING_FOLKEREGISTER_PERSONSTATUS_URL); bestillingUrl.put(PDL_FORELDREANSVAR, PDL_BESTILLING_FORELDREANSVAR_URL); bestillingUrl.put(PDL_FORELDRE_BARN_RELASJON, PDL_BESTILLING_FORELDRE_BARN_RELASJON_URL); - bestillingUrl.put(PDL_FULLMAKT, PDL_BESTILLING_FULLMAKT_URL); bestillingUrl.put(PDL_INNFLYTTING, PDL_BESTILLING_INNFLYTTING_URL); bestillingUrl.put(PDL_KJOENN, PDL_BESTILLING_KJOENN_URL); bestillingUrl.put(PDL_KONTAKTADRESSE, PDL_BESTILLING_KONTAKTADRESSE_URL); diff --git a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/FullmaktServiceTest.java b/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/FullmaktServiceTest.java deleted file mode 100644 index 2de6e965831..00000000000 --- a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/FullmaktServiceTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package no.nav.pdl.forvalter.service; - -import no.nav.pdl.forvalter.database.repository.PersonRepository; -import no.nav.testnav.libs.data.pdlforvalter.v1.FullmaktDTO; -import no.nav.testnav.libs.data.pdlforvalter.v1.PersonDTO; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.web.client.HttpClientErrorException; - -import java.time.LocalDate; -import java.util.List; - -import static java.lang.String.format; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -class FullmaktServiceTest { - - private static final String IDENT = "12345678901"; - - @Mock - private PersonRepository personRepository; - - @InjectMocks - private FullmaktService fullmaktService; - - @Test - void whenOmraaderIsMissing_thenThrowExecption() { - - var request = FullmaktDTO.builder() - .isNew(true) - .build(); - - var exception = assertThrows(HttpClientErrorException.class, () -> - fullmaktService.validate(request, PersonDTO.builder() - .ident(IDENT) - .build())); - - assertThat(exception.getMessage(), containsString("Områder for fullmakt må angis")); - } - - @Test - void whenGyldigFomIsMissing_thenThrowExecption() { - - var request = FullmaktDTO.builder() - .omraader(List.of("OMRAADE")) - .isNew(true) - .build(); - - var exception = assertThrows(HttpClientErrorException.class, () -> - fullmaktService.validate(request, PersonDTO.builder() - .ident(IDENT) - .build())); - - assertThat(exception.getMessage(), containsString("Fullmakt med gyldigFom må angis")); - } - - @Test - void whenGyldigTomIsMissing_thenThrowExecption() { - - var request = FullmaktDTO.builder() - .omraader(List.of("OMRAADE")) - .gyldigFraOgMed(LocalDate.of(2012, 4, 5).atStartOfDay()) - .isNew(true) - .build(); - - var exception = assertThrows(HttpClientErrorException.class, () -> - fullmaktService.validate(request, PersonDTO.builder() - .ident(IDENT) - .build())); - - assertThat(exception.getMessage(), containsString("Fullmakt med gyldigTom må angis")); - } - - @Test - void whenUgyldigDatoInterval_thenThrowExecption() { - - var request = FullmaktDTO.builder() - .omraader(List.of("OMRAADE")) - .gyldigFraOgMed(LocalDate.of(2012, 4, 5).atStartOfDay()) - .gyldigTilOgMed(LocalDate.of(2012, 4, 4).atStartOfDay()) - .isNew(true) - .build(); - - var exception = assertThrows(HttpClientErrorException.class, () -> - fullmaktService.validate(request, PersonDTO.builder() - .ident(IDENT) - .build())); - - assertThat(exception.getMessage(), containsString("Ugyldig datointervall: gyldigFom må være før gyldigTom")); - } - - @Test - void whenStatedPersonDoesNotExist_thenThrowExecption() { - - when(personRepository.existsByIdent(IDENT)).thenReturn(false); - - var request = FullmaktDTO.builder() - .omraader(List.of("OMRAADE")) - .gyldigFraOgMed(LocalDate.of(2012, 4, 5).atStartOfDay()) - .gyldigTilOgMed(LocalDate.of(2012, 4, 6).atStartOfDay()) - .motpartsPersonident(IDENT) - .isNew(true) - .build(); - - var exception = assertThrows(HttpClientErrorException.class, () -> - fullmaktService.validate(request, PersonDTO.builder() - .ident(IDENT) - .build())); - - assertThat(exception.getMessage(), containsString(format("Fullmektig: person %s ikke funnet i database", IDENT))); - } -} \ No newline at end of file diff --git a/libs/security-core/src/main/java/no/nav/testnav/libs/securitycore/command/tokenx/OnBehalfOfExchangeCommand.java b/libs/security-core/src/main/java/no/nav/testnav/libs/securitycore/command/tokenx/OnBehalfOfExchangeCommand.java index 98cbd2600dd..036b1bdf314 100644 --- a/libs/security-core/src/main/java/no/nav/testnav/libs/securitycore/command/tokenx/OnBehalfOfExchangeCommand.java +++ b/libs/security-core/src/main/java/no/nav/testnav/libs/securitycore/command/tokenx/OnBehalfOfExchangeCommand.java @@ -8,7 +8,6 @@ import lombok.extern.slf4j.Slf4j; import no.nav.testnav.libs.securitycore.command.ExchangeCommand; import no.nav.testnav.libs.securitycore.domain.AccessToken; -import no.nav.testnav.libs.securitycore.domain.Token; import no.nav.testnav.libs.securitycore.domain.tokenx.TokenXProperties; import no.nav.testnav.libs.securitycore.domain.tokenx.WellKnown; import org.springframework.web.reactive.function.BodyInserters; @@ -31,7 +30,6 @@ public class OnBehalfOfExchangeCommand implements ExchangeCommand { @Override public Mono call() { - log.info("Access token opprettet for OAuth 2.0 On-Behalf-Of Flow. Scope: {}.", scope); return webClient .get() .uri(tokenX.getWellKnownUrl()) @@ -60,6 +58,7 @@ public Mono call() { throwable -> !(throwable instanceof WebClientResponseException), throwable -> log.error("Feil ved henting av access token.", throwable) ) + .doOnSuccess(accessToken -> log.info("Access token opprettet for OAuth 2.0 On-Behalf-Of Flow. Scope: {}.", scope)) ); } diff --git a/proxies/fullmakt-proxy/Dockerfile b/proxies/fullmakt-proxy/Dockerfile new file mode 100644 index 00000000000..4a36f93546f --- /dev/null +++ b/proxies/fullmakt-proxy/Dockerfile @@ -0,0 +1,8 @@ +FROM ghcr.io/navikt/baseimages/temurin:21 +LABEL maintainer="Team Dolly" + +ENV JAVA_OPTS="-Dspring.profiles.active=prod" + +ADD /build/libs/app.jar /app/app.jar + +EXPOSE 8080 diff --git a/proxies/fullmakt-proxy/build.gradle b/proxies/fullmakt-proxy/build.gradle new file mode 100644 index 00000000000..1ec03267946 --- /dev/null +++ b/proxies/fullmakt-proxy/build.gradle @@ -0,0 +1,18 @@ +plugins { + id "dolly-proxies" +} + +sonarqube { + properties { + property "sonar.projectKey", "testnav-fullmakt-proxy" + property "sonar.projectName", "testnav-fullmakt-proxy" + } +} + +dependencies { + implementation "no.nav.testnav.libs:reactive-security" + implementation "no.nav.testnav.libs:security-core" + implementation "no.nav.testnav.libs:vault" + implementation "org.springframework.boot:spring-boot-starter-webflux" + implementation "org.springframework.cloud:spring-cloud-starter-vault-config" +} diff --git a/proxies/fullmakt-proxy/config.yml b/proxies/fullmakt-proxy/config.yml new file mode 100644 index 00000000000..dd6615500a6 --- /dev/null +++ b/proxies/fullmakt-proxy/config.yml @@ -0,0 +1,60 @@ +apiVersion: "nais.io/v1alpha1" +kind: "Application" +metadata: + name: testnav-fullmakt-proxy + namespace: dolly + labels: + team: dolly +spec: + image: "{{image}}" + port: 8080 + webproxy: true + tokenx: + enabled: true + azure: + application: + allowAllUsers: true + enabled: true + tenant: nav.no + accessPolicy: + inbound: + rules: + - application: team-dolly-lokal-app + cluster: dev-gcp + - application: dolly-frontend + cluster: dev-gcp + - application: dolly-idporten + cluster: dev-gcp + - application: dolly-frontend-dev + cluster: dev-gcp + - application: testnav-oversikt-frontend + cluster: dev-gcp + - application: dolly-backend + cluster: dev-gcp + - application: dolly-backend-dev + cluster: dev-gcp + outbound: + rules: + - application: pdl-fullmakt + namespace: pdl + liveness: + path: /internal/isAlive + initialDelay: 4 + periodSeconds: 5 + failureThreshold: 500 + readiness: + path: /internal/isReady + initialDelay: 4 + periodSeconds: 5 + failureThreshold: 500 + replicas: + min: 1 + max: 1 + resources: + requests: + cpu: 200m + memory: 1024Mi + limits: + memory: 2048Mi + ingresses: + - "https://testnav-fullmakt-proxy.dev-fss-pub.nais.io" \ No newline at end of file diff --git a/proxies/fullmakt-proxy/gradle/wrapper/gradle-wrapper.jar b/proxies/fullmakt-proxy/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/proxies/fullmakt-proxy/gradle/wrapper/gradle-wrapper.properties b/proxies/fullmakt-proxy/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..48c0a02ca41 --- /dev/null +++ b/proxies/fullmakt-proxy/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/proxies/fullmakt-proxy/gradlew b/proxies/fullmakt-proxy/gradlew new file mode 100755 index 00000000000..3da45c161b0 --- /dev/null +++ b/proxies/fullmakt-proxy/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright ? 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, +# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; +# * compound commands having a testable exit status, especially ?case?; +# * various built-in commands including ?command?, ?set?, and ?ulimit?. +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/proxies/fullmakt-proxy/gradlew.bat b/proxies/fullmakt-proxy/gradlew.bat new file mode 100644 index 00000000000..107acd32c4e --- /dev/null +++ b/proxies/fullmakt-proxy/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/proxies/fullmakt-proxy/gradlewUpdate.sh b/proxies/fullmakt-proxy/gradlewUpdate.sh new file mode 100755 index 00000000000..e5ee6361152 --- /dev/null +++ b/proxies/fullmakt-proxy/gradlewUpdate.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +gradle wrapper \ No newline at end of file diff --git a/proxies/fullmakt-proxy/settings.gradle b/proxies/fullmakt-proxy/settings.gradle new file mode 100644 index 00000000000..01a78cae60e --- /dev/null +++ b/proxies/fullmakt-proxy/settings.gradle @@ -0,0 +1,20 @@ +plugins { + id "com.gradle.develocity" version "3.17.4" +} + +rootProject.name = 'fullmakt-proxy' + +includeBuild "../../plugins/java" + +includeBuild '../../libs/reactive-core' +includeBuild '../../libs/reactive-proxy' +includeBuild '../../libs/reactive-security' +includeBuild '../../libs/security-core' +includeBuild '../../libs/vault' + +develocity { + buildScan { + termsOfUseUrl = "https://gradle.com/terms-of-service" + termsOfUseAgree = "yes" + } +} \ No newline at end of file diff --git a/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/FullmaktProxyApplicationStarter.java b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/FullmaktProxyApplicationStarter.java new file mode 100644 index 00000000000..f5d07bba999 --- /dev/null +++ b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/FullmaktProxyApplicationStarter.java @@ -0,0 +1,58 @@ +package no.nav.testnav.proxies.fullmaktproxy; + +import no.nav.testnav.libs.reactivecore.config.CoreConfig; +import no.nav.testnav.libs.reactiveproxy.config.SecurityConfig; +import no.nav.testnav.libs.reactivesecurity.exchange.tokenx.TokenXService; +import no.nav.testnav.proxies.fullmaktproxy.config.Consumers; +import no.nav.testnav.proxies.fullmaktproxy.consumer.FakedingsConsumer; +import no.nav.testnav.proxies.fullmaktproxy.filter.AddAuthenticationRequestGatewayFilterFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.route.Route; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.route.builder.Buildable; +import org.springframework.cloud.gateway.route.builder.PredicateSpec; +import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +import java.util.function.Function; + +@Import({ + CoreConfig.class, + SecurityConfig.class, +}) +@SpringBootApplication +public class FullmaktProxyApplicationStarter { + @Bean + public RouteLocator customRouteLocator(RouteLocatorBuilder builder, + Consumers consumers, + FakedingsConsumer fakedingsConsumer, + TokenXService tokenXService) { + return builder + .routes() + .route(createRoute( + consumers + .getFullmakt() + .getUrl(), + AddAuthenticationRequestGatewayFilterFactory + .bearerIdportenHeaderFilter(fakedingsConsumer, tokenXService, consumers.getFullmakt()))) + .build(); + } + + public static void main(String[] args) { + SpringApplication.run(FullmaktProxyApplicationStarter.class, args); + } + + private Function> createRoute(String url, GatewayFilter filter) { + return spec -> spec + .path("/**") + .filters( + filterSpec -> filterSpec + .rewritePath("/(?.*)", "/${segment}") + .setResponseHeader("Content-Type", "application/json; charset=UTF-8") + .filter(filter)) + .uri(url); + } +} \ No newline at end of file diff --git a/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/config/Consumers.java b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/config/Consumers.java new file mode 100644 index 00000000000..eb1688a293e --- /dev/null +++ b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/config/Consumers.java @@ -0,0 +1,29 @@ +package no.nav.testnav.proxies.fullmaktproxy.config; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import static lombok.AccessLevel.PACKAGE; + +/** + * Samler alle placeholders for ulike {@code consumers.*}-konfigurasjon her, dvs. subklasser av {@code ServerProperties}. + *

+ * Husk at Spring Boot bruker
relaxed binding + * mellom configuration properties og field names. + * + * @see ServerProperties + */ +@Configuration +@ConfigurationProperties(prefix = "consumers") +@NoArgsConstructor(access = PACKAGE) +@Getter +@Setter(PACKAGE) +public class Consumers { + + private ServerProperties fullmakt; + +} diff --git a/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/config/LocalConfig.java b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/config/LocalConfig.java new file mode 100644 index 00000000000..748f7f16be0 --- /dev/null +++ b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/config/LocalConfig.java @@ -0,0 +1,13 @@ +package no.nav.testnav.proxies.fullmaktproxy.config; + +import no.nav.testnav.libs.vault.AbstractLocalVaultConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("local") +@Import({ +}) +public class LocalConfig extends AbstractLocalVaultConfiguration { +} \ No newline at end of file diff --git a/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/consumer/FakedingsConsumer.java b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/consumer/FakedingsConsumer.java new file mode 100644 index 00000000000..280d0540c9d --- /dev/null +++ b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/consumer/FakedingsConsumer.java @@ -0,0 +1,25 @@ +package no.nav.testnav.proxies.fullmaktproxy.consumer; + +import no.nav.testnav.proxies.fullmaktproxy.consumer.command.FakedingsGetCommand; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +@Service +public class FakedingsConsumer { + + private static final String FAKE_TOKENDINGS_URL = "https://fakedings.intern.dev.nav.no"; + private final WebClient webClient; + + public FakedingsConsumer() { + + this.webClient = WebClient.builder() + .baseUrl(FAKE_TOKENDINGS_URL) + .build(); + } + + public Mono getFakeToken(String ident) { + + return new FakedingsGetCommand(webClient, ident).call(); + } +} diff --git a/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/consumer/command/FakedingsGetCommand.java b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/consumer/command/FakedingsGetCommand.java new file mode 100644 index 00000000000..90811eb1f3d --- /dev/null +++ b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/consumer/command/FakedingsGetCommand.java @@ -0,0 +1,31 @@ +package no.nav.testnav.proxies.fullmaktproxy.consumer.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; + +@RequiredArgsConstructor +@Slf4j +public class FakedingsGetCommand implements Callable> { + + private static final String FAKEDINGS_URL = "/fake/tokenx"; + private final WebClient webClient; + private final String ident; + + @Override + public Mono call() { + + return webClient.get() + .uri(uriBuilder -> uriBuilder + .path(FAKEDINGS_URL) + .queryParam("pid", ident) + .queryParam("acr", "Level4") + .build()) + .retrieve() + .bodyToMono(String.class) + .doOnError(throwable -> log.error("Feil ved henting av fakedings token i fullmakt-proxy", throwable)); + } +} \ No newline at end of file diff --git a/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/filter/AddAuthenticationRequestGatewayFilterFactory.java b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/filter/AddAuthenticationRequestGatewayFilterFactory.java new file mode 100644 index 00000000000..a3d5bcf30dc --- /dev/null +++ b/proxies/fullmakt-proxy/src/main/java/no/nav/testnav/proxies/fullmaktproxy/filter/AddAuthenticationRequestGatewayFilterFactory.java @@ -0,0 +1,31 @@ +package no.nav.testnav.proxies.fullmaktproxy.filter; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.libs.reactivesecurity.exchange.tokenx.TokenXService; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import no.nav.testnav.proxies.fullmaktproxy.consumer.FakedingsConsumer; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.http.HttpHeaders; + +@Slf4j +@UtilityClass +public class AddAuthenticationRequestGatewayFilterFactory { + public static GatewayFilter bearerIdportenHeaderFilter(FakedingsConsumer fakedingsConsumer, + TokenXService tokenXService, + ServerProperties serverProperties) { + + return (exchange, chain) -> { + var httpRequest = exchange.getRequest(); + var ident = httpRequest.getHeaders().getFirst("fnr"); + return fakedingsConsumer.getFakeToken(ident) + .flatMap(faketoken -> tokenXService.exchange(serverProperties, faketoken) + .flatMap(tokenX -> { + exchange.mutate() + .request(builder -> builder.header(HttpHeaders.AUTHORIZATION, + "Bearer " + tokenX.getTokenValue()).build()); + return chain.filter(exchange); + })); + }; + } +} \ No newline at end of file diff --git a/proxies/fullmakt-proxy/src/main/resources/application.yml b/proxies/fullmakt-proxy/src/main/resources/application.yml new file mode 100644 index 00000000000..f49211ee1da --- /dev/null +++ b/proxies/fullmakt-proxy/src/main/resources/application.yml @@ -0,0 +1,37 @@ +AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b + +spring: + application: + name: testnav-fullmakt-proxy + description: Proxy for pdl-fullmakt som legger på sikkerhet og benytter trygdeetaten tenant. + security: + oauth2: + resourceserver: + aad: + issuer-uri: ${AAD_ISSUER_URI}/v2.0 + jwk-set-uri: ${AAD_ISSUER_URI}/discovery/v2.0/keys + accepted-audience: ${azure.app.client.id}, api://${azure.app.client.id} + tokenx: + issuer-uri: ${TOKEN_X_ISSUER} + jwk-set-uri: ${TOKEN_X_JWKS_URI} + accepted-audience: ${TOKEN_X_CLIENT_ID} + cloud: + gateway: + httpclient: + response-timeout: 600s + vault: + enabled: false + +server: + servlet: + encoding: + charset: UTF-8 + error: + include-message: always + +consumers: + fullmakt: + name: pdl-fullmakt + namespace: pdl + url: http://pdl-fullmakt.pdl.svc.nais.local + cluster: dev-fss \ No newline at end of file diff --git a/proxies/fullmakt-proxy/src/main/resources/logback-spring.xml b/proxies/fullmakt-proxy/src/main/resources/logback-spring.xml new file mode 100644 index 00000000000..3b591204bab --- /dev/null +++ b/proxies/fullmakt-proxy/src/main/resources/logback-spring.xml @@ -0,0 +1,40 @@ + + + + + + + true + 256 + 10280 + 20 + ^sun\.reflect\..*\.invoke + ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke + java\.util\.concurrent\..* + org\.apache\.catalina\..* + org\.apache\.coyote\..* + org\.apache\.tomcat\..* + + + + + + + + + + + + + %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n + + utf8 + + + + + + + + + \ No newline at end of file diff --git a/proxies/fullmakt-proxy/src/test/java/no/nav/testnav/proxies/fullmaktproxy/ApplicationContextTest.java b/proxies/fullmakt-proxy/src/test/java/no/nav/testnav/proxies/fullmaktproxy/ApplicationContextTest.java new file mode 100644 index 00000000000..2cfbe3605db --- /dev/null +++ b/proxies/fullmakt-proxy/src/test/java/no/nav/testnav/proxies/fullmaktproxy/ApplicationContextTest.java @@ -0,0 +1,20 @@ +package no.nav.testnav.proxies.fullmaktproxy; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest +@ActiveProfiles("test") +class ApplicationContextTest { + + @MockBean + public ReactiveJwtDecoder reactiveJwtDecoder; + + @Test + @SuppressWarnings("java:S2699") + void load_app_context() { + } +} diff --git a/proxies/fullmakt-proxy/src/test/resources/application-test.yml b/proxies/fullmakt-proxy/src/test/resources/application-test.yml new file mode 100644 index 00000000000..f05debbd219 --- /dev/null +++ b/proxies/fullmakt-proxy/src/test/resources/application-test.yml @@ -0,0 +1 @@ +TOKEN_X_ISSUER: dummy \ No newline at end of file From f6959f1d8f800b3ec18cbabbec8d079ca50468c9 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 22 Oct 2024 14:15:54 +0200 Subject: [PATCH 21/30] Fix alltid disabled eksisterende ident-valg paa ny ident --- .../partials/pdlPerson/PdlEksisterendePerson.tsx | 13 ++----------- .../pdlf/form/partials/pdlPerson/PdlPersonForm.tsx | 2 -- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson.tsx index 89c68f9dbf1..17227163e5e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson.tsx @@ -1,7 +1,6 @@ import React, { useContext } from 'react' import { FormSelect } from '@/components/ui/form/inputs/select/Select' import Loading from '@/components/ui/loading/Loading' -import { isEmpty } from '@/components/fagsystem/pdlf/form/partials/utils' import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' import { Option } from '@/service/SelectOptionsOppslag' import { ForeldreBarnRelasjon, NyIdent } from '@/components/fagsystem/pdlf/PdlTypes' @@ -11,26 +10,22 @@ import { UseFormReturn } from 'react-hook-form/dist/types' import { usePdlOptions } from '@/utils/hooks/useSelectOptions' interface PdlEksisterendePersonValues { - nyPersonPath?: string eksisterendePersonPath: string fullmektigsNavnPath?: string label: string formMethods: UseFormReturn - idx: number + idx?: number disabled?: boolean - nyIdentValg?: NyIdent eksisterendeNyPerson?: Option ident?: string } export const PdlEksisterendePerson = ({ - nyPersonPath, eksisterendePersonPath, label, formMethods, idx, disabled = false, - nyIdentValg = null as unknown as NyIdent, eksisterendeNyPerson = null as unknown as Option, fullmektigsNavnPath = null as unknown as string, ident, @@ -156,10 +151,6 @@ export const PdlEksisterendePerson = ({ return tmpOptions } - const hasNyPersonValues = nyIdentValg - ? !isEmpty(nyIdentValg, ['syntetisk']) - : nyPersonPath && !isEmpty(formMethods.watch(nyPersonPath), ['syntetisk']) - const bestillingFlerePersoner = parseInt(antall) > 1 && (harSivilstand || harNyIdent) const filteredOptions = getFilteredOptionList() @@ -181,7 +172,7 @@ export const PdlEksisterendePerson = ({ label={label} options={filteredOptions} size={'xxlarge'} - isDisabled={hasNyPersonValues || bestillingFlerePersoner || disabled} + isDisabled={bestillingFlerePersoner || disabled} /> ) : pdlError || gruppeError ? ( diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonForm.tsx index 4152e35ef2d..d737fc856e2 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/pdlPerson/PdlPersonForm.tsx @@ -127,11 +127,9 @@ export const PdlPersonForm = ({ > {(type === PersonType.EKSISTERENDE_PERSON || isTestnorgeIdent) && ( 1} From 7d9a495937bcfd882bce3a3851482b7f21994438 Mon Sep 17 00:00:00 2001 From: Cato Olsen Date: Wed, 23 Oct 2024 09:02:49 +0200 Subject: [PATCH 22/30] =?UTF-8?q?Tester=20Cloud=20Profiler=20p=C3=A5=20en?= =?UTF-8?q?=20ikke-kritisk=20app.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/budpro-service/Dockerfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/budpro-service/Dockerfile b/apps/budpro-service/Dockerfile index c120cde561e..b2cb1b3d765 100644 --- a/apps/budpro-service/Dockerfile +++ b/apps/budpro-service/Dockerfile @@ -1,8 +1,11 @@ FROM ghcr.io/navikt/baseimages/temurin:21 LABEL maintainer="Team Dolly" -ADD build/libs/app.jar /app/app.jar +COPY build/libs/app.jar /app/app.jar -ENV JAVA_OPTS="-Dspring.profiles.active=prod" +RUN wget -q https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz -P /app/agent && \ + tar xzf /app/agent/profiler_java_agent.tar.gz -C /app/agent + +ENV JAVA_OPTS="-Dspring.profiles.active=prod --agentpath:/app/agent/profiler_java_agent.so=-cprof_project_id=dolly-dev-ff83,-cprof_service=testnav-budpro-service,-cprof_enable_heap_sampling=true,-logtostderr,-minloglevel=0" EXPOSE 8080 \ No newline at end of file From f58b77159137ddf8e587afe961f21fc05b053d4b Mon Sep 17 00:00:00 2001 From: Cato Olsen Date: Wed, 23 Oct 2024 09:12:18 +0200 Subject: [PATCH 23/30] =?UTF-8?q?Revert=20"Tester=20Cloud=20Profiler=20p?= =?UTF-8?q?=C3=A5=20en=20ikke-kritisk=20app."?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7d9a495937bcfd882bce3a3851482b7f21994438. --- apps/budpro-service/Dockerfile | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/budpro-service/Dockerfile b/apps/budpro-service/Dockerfile index b2cb1b3d765..c120cde561e 100644 --- a/apps/budpro-service/Dockerfile +++ b/apps/budpro-service/Dockerfile @@ -1,11 +1,8 @@ FROM ghcr.io/navikt/baseimages/temurin:21 LABEL maintainer="Team Dolly" -COPY build/libs/app.jar /app/app.jar +ADD build/libs/app.jar /app/app.jar -RUN wget -q https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz -P /app/agent && \ - tar xzf /app/agent/profiler_java_agent.tar.gz -C /app/agent - -ENV JAVA_OPTS="-Dspring.profiles.active=prod --agentpath:/app/agent/profiler_java_agent.so=-cprof_project_id=dolly-dev-ff83,-cprof_service=testnav-budpro-service,-cprof_enable_heap_sampling=true,-logtostderr,-minloglevel=0" +ENV JAVA_OPTS="-Dspring.profiles.active=prod" EXPOSE 8080 \ No newline at end of file From fa96e21c3813d1a714939f4c3c57b3880a09ed7b Mon Sep 17 00:00:00 2001 From: Cato Olsen Date: Wed, 23 Oct 2024 13:24:20 +0200 Subject: [PATCH 24/30] test/cloud-profiler-agent (#3658) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slår på Google Cloud Profiler Agent for budpro-service. --- apps/budpro-service/Dockerfile | 6 ++++-- apps/budpro-service/config.yml | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/budpro-service/Dockerfile b/apps/budpro-service/Dockerfile index c120cde561e..ee674571057 100644 --- a/apps/budpro-service/Dockerfile +++ b/apps/budpro-service/Dockerfile @@ -1,8 +1,10 @@ FROM ghcr.io/navikt/baseimages/temurin:21 LABEL maintainer="Team Dolly" -ADD build/libs/app.jar /app/app.jar +COPY build/libs/app.jar /app/app.jar -ENV JAVA_OPTS="-Dspring.profiles.active=prod" +RUN wget -q https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz -P /app/agent && tar xzf /app/agent/profiler_java_agent.tar.gz -C /app/agent && rm /app/agent/profiler_java_agent.tar.gz + +ENV JAVA_OPTS="-Dspring.profiles.active=prod -agentpath:/app/agent/profiler_java_agent.so=-cprof_project_id=dolly-dev-ff83,-cprof_service=testnav-budpro-service,-cprof_enable_heap_sampling=true,-logtostderr,-minloglevel=1" EXPOSE 8080 \ No newline at end of file diff --git a/apps/budpro-service/config.yml b/apps/budpro-service/config.yml index d950398921c..78ea66f500d 100644 --- a/apps/budpro-service/config.yml +++ b/apps/budpro-service/config.yml @@ -40,4 +40,10 @@ spec: path: "/internal/health/readiness" replicas: min: 1 - max: 1 \ No newline at end of file + max: 1 + gcp: + permissions: + - resource: + apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1 + kind: Project + role: roles/cloudprofiler.agent \ No newline at end of file From 4192f17ee755cd390f200c9b29dc975452dfdffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Thu, 24 Oct 2024 10:52:08 +0200 Subject: [PATCH 25/30] Add getter for 'relasjoner' and refactor error collection (#3660) * Add getter for 'relasjoner' and refactor error collection Introduced a getter method for the 'relasjoner' field in OrdreResponseDTO to ensure it is never null. Refactored the error collection logic in BestillingPdlOrdreStatusMapper to use streams for better performance and readability. * Check for missing ident before logging errors #deploy-test-dolly-backend #deploy-dolly-backend Updated the error handling logic to check if ident values are missing from the PDL order status response before logging errors. This change ensures accurate identification and error logging by including ident in the error list and handling scenarios where no errors are found but ident is missing. * Refactor error handling for PDLO ordre response #deploy-test-dolly-backend #deploy-dolly-backend Revised the error collection logic to include identification marking for related personnel and simplified the handling of orders without errors. Introduced a new method to appropriately format identifiers when adding elements to the reporting map. Enhanced the internal status collection by correctly mapping the identification for error instances. --- .../BestillingPdlOrdreStatusMapper.java | 60 +++++++++++++------ .../pdlforvalter/v1/OrdreResponseDTO.java | 9 +++ 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPdlOrdreStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPdlOrdreStatusMapper.java index 78c77a4474e..1ac90d2a835 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPdlOrdreStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPdlOrdreStatusMapper.java @@ -17,6 +17,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Stream; import static java.lang.String.format; import static java.util.Collections.emptyList; @@ -57,22 +58,42 @@ private static void extractStatus(Map> meldingIdents, Besti var response = objectMapper.readValue(progress.getPdlOrdreStatus(), OrdreResponseDTO.class); var errors = collectErrors(response); - if (errors.isEmpty()) { - addElement(meldingIdents, "OK", progress.getIdent()); + if (errors.isEmpty() || response.getHovedperson().getOrdrer().stream() + .noneMatch(ordre -> ordre.getHendelser().stream() + .anyMatch(hendelse -> PdlStatus.FEIL == hendelse.getStatus()))) { - } else { - errors.forEach(error -> - addElement(meldingIdents, format(ELEMENT_ERROR_FMT, - error.getArtifact(), error.getId(), error.getError()), progress.getIdent()) - ); + addElement(meldingIdents, "OK", progress.getIdent()); } + errors.forEach(error -> + addElement(meldingIdents, format(ELEMENT_ERROR_FMT, + error.getArtifact(), error.getId(), error.getError()), + markRelation(error.getIdent(), progress.getIdent())) + ); + } catch (JsonProcessingException e) { addElement(meldingIdents, JSON_PARSE_ERROR, progress.getIdent()); log.error("Json parsing feilet: {}", e.getMessage(), e); } } + private static String markRelation(String ident, String hovedperson) { + + var person = new StringBuilder(); + + if (!hovedperson.equals(ident)) { + person.append('('); + } + + person.append(ident); + + if (!hovedperson.equals(ident)) { + person.append(')'); + } + + return person.toString(); + } + private static void addElement(Map> rapport, String melding, String ident) { if (rapport.containsKey(melding)) { @@ -85,16 +106,20 @@ private static void addElement(Map> rapport, String melding private static List collectErrors(OrdreResponseDTO response) { - return response.getHovedperson().getOrdrer().stream() - .filter(ordre -> !PdlArtifact.PDL_SLETTING.equals(ordre.getInfoElement())) - .filter(ordre -> ordre.getHendelser().stream().anyMatch(hendelse -> PdlStatus.FEIL == hendelse.getStatus())) - .map(ordre -> ordre.getHendelser().stream() - .filter(hendelse -> PdlStatus.FEIL == hendelse.getStatus()) - .map(hendelse -> PdlInternalStatus.builder() - .artifact(ordre.getInfoElement()) - .id(hendelse.getId()) - .error(hendelse.getError()) - .build()) + return Stream.of(List.of(response.getHovedperson()), + response.getRelasjoner()) + .flatMap(Collection::stream) + .map(personHendelse -> personHendelse.getOrdrer().stream() + .map(ordre -> ordre.getHendelser().stream() + .filter(hendelse -> PdlStatus.FEIL == hendelse.getStatus()) + .map(hendelse -> PdlInternalStatus.builder() + .artifact(ordre.getInfoElement()) + .ident(personHendelse.getIdent()) + .id(hendelse.getId()) + .error(hendelse.getError()) + .build()) + .toList()) + .flatMap(Collection::stream) .toList()) .flatMap(Collection::stream) .toList(); @@ -121,5 +146,6 @@ private static class PdlInternalStatus { private PdlArtifact artifact; private Integer id; private String error; + private String ident; } } diff --git a/libs/data-transfer-search-objects/src/main/java/no/nav/testnav/libs/data/pdlforvalter/v1/OrdreResponseDTO.java b/libs/data-transfer-search-objects/src/main/java/no/nav/testnav/libs/data/pdlforvalter/v1/OrdreResponseDTO.java index cc747bd31c6..76d1ea631d5 100644 --- a/libs/data-transfer-search-objects/src/main/java/no/nav/testnav/libs/data/pdlforvalter/v1/OrdreResponseDTO.java +++ b/libs/data-transfer-search-objects/src/main/java/no/nav/testnav/libs/data/pdlforvalter/v1/OrdreResponseDTO.java @@ -22,6 +22,15 @@ public class OrdreResponseDTO { private PersonHendelserDTO hovedperson; private List relasjoner; + public List getRelasjoner() { + + if (isNull(relasjoner)) { + relasjoner = new ArrayList<>(); + } + return relasjoner; + } + + @Data @Builder @NoArgsConstructor From ec6478b761d77cdefb1cb407fdb7b94df5fe245f Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Thu, 24 Oct 2024 11:07:33 +0200 Subject: [PATCH 26/30] Fjern parenteser fra navigerings-url --- .../miljoeStatus/fagsystemStatus/IdentList.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/miljoeStatus/fagsystemStatus/IdentList.tsx b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/miljoeStatus/fagsystemStatus/IdentList.tsx index 482030ee316..8a350acbc8c 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/miljoeStatus/fagsystemStatus/IdentList.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/miljoeStatus/fagsystemStatus/IdentList.tsx @@ -22,23 +22,25 @@ const NavigerTilIdentButton = styled(Button)` function IdentList({ identer }: { identer: string[] }) { const dispatch = useDispatch() const [loading, setLoading] = useState(false) + return (
    - {identer.map((ident, idx) => - loading ? ( + {identer.map((ident, idx) => { + const cleanIdent = ident?.replace(/[()]/g, '') + return loading ? ( ) : ( { setLoading(true) - return dispatch(navigerTilPerson(ident)) + return dispatch(navigerTilPerson(cleanIdent)) }} key={idx} > {ident} - ), - )} + ) + })}
) } From b13a30faaedae259b4630305a544d30d7920e02f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Fri, 25 Oct 2024 07:37:34 +0200 Subject: [PATCH 27/30] Refactor ElasticTyper descriptions and add Type endpoint (#3659) * Refactor ElasticTyper descriptions and add Type endpoint #deploy-test-dolly-backend Updated `ElasticTyper` with more intuitive descriptions and alphabetical order. Added a new `Type` class and corresponding `/typer` endpoint for fetching all searchable types. Improved indexing and mapping strategies in `ElasticBestillingStrategyMapping` and adjusted `PensjonforvalterConsumer` methods to pass `ident` parameter directly. * Refactor sorting key in OpenSearchService #deploy-test-dolly-backend Changed the sorting criterion from type to description for better readability in OpenSearch results. Also removed outdated comments in ElasticTyper to clean up the codebase. * Rename Type class to Kategori Renamed the `Type` class to `Kategori` across relevant files to better reflect its purpose. Updated all references to maintain consistency and ensure the codebase remains functional. --- apps/dolly-backend/README.md | 2 +- .../PensjonforvalterClient.java | 2 +- .../PensjonforvalterConsumer.java | 4 +- .../command/LagreAfpOffentligCommand.java | 6 +-- .../no/nav/dolly/elastic/ElasticTyper.java | 45 ++++++++++--------- .../no/nav/dolly/elastic/dto/Kategori.java | 16 +++++++ .../ElasticBestillingStrategyMapping.java | 24 ++++++++++ .../elastic/service/OpenSearchService.java | 15 ++++++- .../provider/api/OpensearchController.java | 8 ++++ 9 files changed, 91 insertions(+), 31 deletions(-) create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/elastic/dto/Kategori.java diff --git a/apps/dolly-backend/README.md b/apps/dolly-backend/README.md index 8dc51e7463d..060a153a43d 100644 --- a/apps/dolly-backend/README.md +++ b/apps/dolly-backend/README.md @@ -24,7 +24,7 @@ https://dolly-backend.intern.dev.nav.no/swagger-ui.html ## Kjør lokalt * Se [generell informasjon](../../docs/local_general.md). * Applikasjonen er avhengig av en database i GCP, se [egen dokumentasjon](../../docs/gcp_db.md). -* Applikasjonen er avhengig av Elasticsearch: +* Applikasjonen er avhengig av OpenSearch: ```aiexclude > docker run -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" -e "plugins.security.disabled=true" -e "OPENSEARCH_INITIAL_ADMIN_PASSWORD=YLAgOm}rz#o6#Aq" --name opensearch -d opensearchproject/opensearch:latest ``` diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java index 6798822210d..44a268944c0 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java @@ -553,7 +553,7 @@ private Flux lagreAfpOffentlig(PensjonData pensjonData var context = MappingContextUtils.getMappingContext(); context.setProperty(IDENT, ident); var request = mapperFacade.map(pensjon, AfpOffentligRequest.class, context); - return pensjonforvalterConsumer.lagreAfpOffentlig(request, miljoe); + return pensjonforvalterConsumer.lagreAfpOffentlig(request, ident, miljoe); })); } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java index b7e83723674..af14b85f811 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java @@ -193,10 +193,10 @@ public Flux hentVedtak(String ident, String miljoe) { } @Timed(name = "providers", tags = {"operation", "pen_lagreAfpOffentlig"}) - public Flux lagreAfpOffentlig(AfpOffentligRequest afpOffentligRequest, String miljoe) { + public Flux lagreAfpOffentlig(AfpOffentligRequest afpOffentligRequest, String ident, String miljoe) { return tokenService.exchange(serverProperties) - .flatMapMany(token -> new LagreAfpOffentligCommand(webClient, afpOffentligRequest, miljoe, token.getTokenValue()).call()); + .flatMapMany(token -> new LagreAfpOffentligCommand(webClient, afpOffentligRequest, ident, miljoe, token.getTokenValue()).call()); } @Timed(name = "providers", tags = {"operation", "pen_sletteAfpOffentlig"}) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagreAfpOffentligCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagreAfpOffentligCommand.java index 8bcbe60a52b..5fa541bc19b 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagreAfpOffentligCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagreAfpOffentligCommand.java @@ -25,16 +25,12 @@ public class LagreAfpOffentligCommand implements Callable call() { - var ident = afpOffentligRequest - .getMocksvar().stream() - .map(AfpOffentligRequest.AfpOffentligStub::getFnr) - .findFirst().orElse(null); - var callId = generateCallId(); log.info("Pensjon afp-offentlig {} {}, callId: {}", miljoe, afpOffentligRequest, callId); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticTyper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticTyper.java index d479002a26b..3aec2c68ca8 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticTyper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/ElasticTyper.java @@ -1,36 +1,39 @@ package no.nav.dolly.elastic; +import lombok.Getter; + +@Getter public enum ElasticTyper { - AAREG("Arbeidsregister (AAREG)"), - INST("Institusjonsopphold (INST2)"), - KRRSTUB("Digital kontaktinformasjon (DKIF)"), - SIGRUN_LIGNET("Lignet skatteinntekt (Sigrunstub)"), - SIGRUN_PENSJONSGIVENDE("Pensjonsgivende inntekt (Sigrunstub)"), + AAREG("Arbeidsgiver/arbeidstaker-register (AAREG)"), + ARBEIDSPLASSENCV("Arbeidsplassen CV"), ARENA_AAP("Arena AAP ytelse"), ARENA_AAP115("Arena AAP115 rettighet"), ARENA_DAGP("Arena dagpenger"), - UDISTUB("Utlendingsdirektoratet (UDI)"), - INNTK("Inntektskomponenten (INNTK)"), - PEN_INNTEKT("Pensjonsopptjening (POPP)"), - PEN_TP("Tjenestepensjon (TP)"), - PEN_AP("Alderspensjon (AP)"), - PEN_UT("Uføretrygd (UT)"), - PEN_AFP_OFFENTLIG("AFP offentlig (PEN"), - PEN_PENSJONSAVTALE("Pensjonsavtaler (PEN)"), - INNTKMELD("Inntektsmelding (ALTINN/JOARK)"), + BANKKONTO("Bankkontoregister"), + BANKKONTO_NORGE("Bankkonto i Norge"), + BANKKONTO_UTLAND("Bankkonto i utlandet"), BRREGSTUB("Brønnøysundregistrene (BRREGSTUB)"), DOKARKIV("Dokumentarkiv (JOARK)"), FULLMAKT("Fullmakt (Representasjon)"), + HISTARK("Historisk arkiv (HISTARK)"), + INNTK("Inntektskomponenten/stub (INNTK)"), + INNTKMELD("Inntektsmelding (ALTINN/JOARK)"), + INST("Institusjonsopphold (INST2)"), + KRRSTUB("Kontakt- og reservasjonsregister-stub"), MEDL("Medlemskap (MEDL)"), - HISTARK("Saksmappearkiv (HISTARK)"), - SYKEMELDING("NAV sykemelding"), + PEN_AFP_OFFENTLIG("Pensjon - AFP offentlig"), + PEN_AP("Pensjon - Alderspensjon (AP)"), + PEN_INNTEKT("Pensjon - Pensjonsinntekt/opptjening"), + PEN_PENSJONSAVTALE("Pensjon - Pensjonsavtaler"), + PEN_TP("Pensjon - Tjenestepensjon (TP)"), + PEN_UT("Pensjon - Uføretrygd (UT)"), + SIGRUN_LIGNET("Sigrunstub - Lignet skatteinntekt"), + SIGRUN_PENSJONSGIVENDE("Sigrunstub - Pensjonsgivende inntekt"), + SKATTEKORT("Skattekort (SOKOS)"), SKJERMING("Skjermingsregisteret"), - BANKKONTO("Bankkontoregister"), - BANKKONTO_NORGE("Norsk bankkonto"), - BANKKONTO_UTLAND("Utenlandsk bankkonto"), - ARBEIDSPLASSENCV("Arbeidsplassen CV"), - SKATTEKORT("SOKOS"), + SYKEMELDING("Sykemelding"), + UDISTUB("Udistub - Utlendingsdirektoratet"), YRKESSKADE("Yrkesskade"); private final String beskrivelse; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/dto/Kategori.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/dto/Kategori.java new file mode 100644 index 00000000000..dc24cf3e4ac --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/dto/Kategori.java @@ -0,0 +1,16 @@ +package no.nav.dolly.elastic.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Kategori { + + private String type; + private String beskrivelse; +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/mapper/ElasticBestillingStrategyMapping.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/mapper/ElasticBestillingStrategyMapping.java index cf5c281b160..1eb230775fa 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/mapper/ElasticBestillingStrategyMapping.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/mapper/ElasticBestillingStrategyMapping.java @@ -14,6 +14,7 @@ import no.nav.dolly.mapper.MappingStrategy; import org.springframework.stereotype.Component; +import static java.util.Objects.nonNull; import static org.apache.logging.log4j.util.Strings.isBlank; @Slf4j @@ -26,6 +27,7 @@ public class ElasticBestillingStrategyMapping implements MappingStrategy { @Override public void register(MapperFactory factory) { + // Denne brukes ved initiell indexering av eksisterende bestillinger factory.classMap(Bestilling.class, ElasticBestilling.class) .customize(new CustomMapper<>() { @Override @@ -60,5 +62,27 @@ public void mapAtoB(Bestilling bestilling, ElasticBestilling elasticBestilling, } ) .register(); + + // Denne brukes ved fortløpende nyoppretting av bestillinger + factory.classMap(RsDollyBestilling.class, ElasticBestilling.class) + .customize(new CustomMapper<>() { + @Override + public void mapAtoB(RsDollyBestilling bestilling, ElasticBestilling elasticBestilling, MappingContext context) { + + if (nonNull(elasticBestilling.getDokarkiv())) { + elasticBestilling.getDokarkiv().getDokumenter() + .forEach(dokument -> dokument.getDokumentvarianter() + .forEach(dokumentVariant -> dokumentVariant.setFysiskDokument(null))); + } + + if (nonNull(elasticBestilling.getHistark())) { + elasticBestilling.getHistark().getDokumenter() + .forEach(dokument -> dokument.setFysiskDokument(null)); + } + } + } + ) + .byDefault() + .register(); } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchService.java index 9fb08af57f1..1ee57bdc8e1 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/service/OpenSearchService.java @@ -9,6 +9,7 @@ import no.nav.dolly.elastic.consumer.ElasticParamsConsumer; import no.nav.dolly.elastic.dto.SearchRequest; import no.nav.dolly.elastic.dto.SearchResponse; +import no.nav.dolly.elastic.dto.Kategori; import org.opensearch.client.RequestOptions; import org.opensearch.client.RestHighLevelClient; import org.opensearch.index.query.BoolQueryBuilder; @@ -22,8 +23,9 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; +import java.util.Comparator; import java.util.List; +import java.util.stream.Stream; import static java.util.Objects.nonNull; @@ -61,6 +63,17 @@ public Mono deleteIndex() { return elasticParamsConsumer.deleteIndex(); } + public List getTyper() { + + return Stream.of(ElasticTyper.values()) + .map(entry -> Kategori.builder() + .type(entry.name()) + .beskrivelse(entry.getBeskrivelse()) + .build()) + .sorted(Comparator.comparing(Kategori::getBeskrivelse)) + .toList(); + } + private SearchResponse execQuery(BoolQueryBuilder query) { var searchRequest = new org.opensearch.action.search.SearchRequest(index); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/OpensearchController.java b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/OpensearchController.java index 033f71e37b1..3ff4f4e7a40 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/OpensearchController.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/OpensearchController.java @@ -8,6 +8,7 @@ import no.nav.dolly.elastic.ElasticTyper; import no.nav.dolly.elastic.dto.SearchRequest; import no.nav.dolly.elastic.dto.SearchResponse; +import no.nav.dolly.elastic.dto.Kategori; import no.nav.dolly.elastic.service.OpenSearchService; import no.nav.dolly.exceptions.NotFoundException; import org.springframework.web.bind.annotation.DeleteMapping; @@ -39,6 +40,13 @@ public List getAll(@PathVariable String ident) { return openSearchService.search(ident); } + @GetMapping("/typer") + @Operation(description = "Henter alle typer som kan søkes på") + public List getKategorier() { + + return openSearchService.getTyper(); + } + @GetMapping("/identer") @Operation(description = "Henter identer som matcher søk i request, registre kun") public SearchResponse getIdenterMed(@RequestParam ElasticTyper... typer) { From 25ed672ccc59838279aa8f7d0b86a1fa6de27ed0 Mon Sep 17 00:00:00 2001 From: "Kristen.Herum" Date: Fri, 25 Oct 2024 13:29:31 +0200 Subject: [PATCH 28/30] Add FolkeregisterPersonstatusService dependency Added FolkeregisterPersonstatusService to the CreatePersonService and included its conversion in the data stream processing. This update ensures that person status information from the Folkeregister is correctly integrated into the person creation flow. --- .../no/nav/pdl/forvalter/service/CreatePersonService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/CreatePersonService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/CreatePersonService.java index 124a03e4b92..612eff4b2b7 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/CreatePersonService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/CreatePersonService.java @@ -39,6 +39,7 @@ public class CreatePersonService { private final NavnService navnService; private final AdressebeskyttelseService adressebeskyttelseService; private final NavPersonIdentifikatorService navsPersonIdentifikatorService; + private final FolkeregisterPersonstatusService folkeregisterPersonstatusService; private static PersonDTO buildPerson(PersonRequestDTO request) { @@ -96,7 +97,8 @@ public PersonDTO execute(PersonRequestDTO request) { Flux.just(kjoennService.convert(mergedPerson)), Flux.just(statsborgerskapService.convert(mergedPerson)), Flux.just(adressebeskyttelseService.convert(mergedPerson)), - Flux.just(navsPersonIdentifikatorService.convert(mergedPerson)) + Flux.just(navsPersonIdentifikatorService.convert(mergedPerson)), + Flux.just(folkeregisterPersonstatusService.convert(mergedPerson)) ) .reduce(Flux.empty(), Flux::merge) .collectList() From 94aa505bae50e28ba959d104d889d44f62249d5f Mon Sep 17 00:00:00 2001 From: "Kristen.Herum" Date: Fri, 25 Oct 2024 14:48:29 +0200 Subject: [PATCH 29/30] Fix arbeidsgiver comparison logic Ensure correct alignment by comparing arbeidsforholdId instead of type. This change rectifies the logic to accurately check the existence of an arbeidsforhold in the request against the response. --- .../java/no/nav/dolly/bestilling/aareg/util/AaregUtility.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/aareg/util/AaregUtility.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/aareg/util/AaregUtility.java index b57ac8a83df..b2bd7c67339 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/aareg/util/AaregUtility.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/aareg/util/AaregUtility.java @@ -24,7 +24,7 @@ public static boolean isEqualArbeidsforhold(Arbeidsforhold response, Arbeidsforh return (isArbeidsgiverOrganisasjonAlike(response, request) || isArbeidsgiverPersonAlike(response, request)) && - response.getType().equals(request.getType()); + response.getArbeidsforholdId().equals(request.getArbeidsforholdId()); } public static ArbeidsforholdEksistens doEksistenssjekk(ArbeidsforholdRespons response, From 2bc771197e8d90ef9fc31bb1460eef5c183a3015 Mon Sep 17 00:00:00 2001 From: "Kristen.Herum" Date: Fri, 25 Oct 2024 15:47:59 +0200 Subject: [PATCH 30/30] Refactor test assertions for better readability Replaced indexing with `getFirst()` method to improve readability and avoid potential IndexOutOfBoundsExceptions. Fixed an incorrect test case in `AaaregUtilityTest` by correcting the expected result in the CSV source. --- .../bestilling/aareg/AaregConsumerTest.java | 16 ++++------------ .../bestilling/aareg/util/AaaregUtilityTest.java | 2 +- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregConsumerTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregConsumerTest.java index 42ee11142ff..2a3a2c43845 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregConsumerTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregConsumerTest.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import no.nav.dolly.bestilling.aareg.domain.ArbeidsforholdRespons; -import no.nav.dolly.elastic.BestillingElasticRepository; import no.nav.testnav.libs.dto.aareg.v1.Arbeidsforhold; import no.nav.testnav.libs.dto.aareg.v1.OrdinaerArbeidsavtale; import no.nav.testnav.libs.dto.aareg.v1.Organisasjon; @@ -17,7 +16,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -59,12 +57,6 @@ class AaregConsumerTest { @MockBean private TokenExchange tokenService; - @MockBean - private BestillingElasticRepository bestillingElasticRepository; - - @MockBean - private ElasticsearchOperations elasticsearchOperations; - private Arbeidsforhold opprettRequest; private ArbeidsforholdRespons arbeidsforholdRespons; @@ -106,8 +98,8 @@ void opprettArbeidsforhold() throws JsonProcessingException { .collectList() .block(); - assertThat(response.get(0).getArbeidsforholdId(), is(equalTo("1"))); - assertThat(response.get(0).getMiljo(), is(equalTo(MILJOE))); + assertThat(response.getFirst().getArbeidsforholdId(), is(equalTo("1"))); + assertThat(response.getFirst().getMiljo(), is(equalTo(MILJOE))); } @Test @@ -119,8 +111,8 @@ void oppdaterArbeidsforhold() throws JsonProcessingException { .collectList() .block(); - assertThat(response.get(0).getArbeidsforholdId(), is(equalTo("1"))); - assertThat(response.get(0).getMiljo(), is(equalTo(MILJOE))); + assertThat(response.getFirst().getArbeidsforholdId(), is(equalTo("1"))); + assertThat(response.getFirst().getMiljo(), is(equalTo(MILJOE))); } @Test diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/util/AaaregUtilityTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/util/AaaregUtilityTest.java index c0b80334a9f..a50552267f3 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/util/AaaregUtilityTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/util/AaaregUtilityTest.java @@ -39,7 +39,7 @@ private static Arbeidsforhold getArbeidsforhold(String arbeidsforholdId, Boolean @CsvSource({ "1, false, 1, 0, 1", "1, true, 1, 1, 0", "2, false, 1, 0, 1", - "2, true, 1, 1, 0" }) + "2, true, 1, 0, 1" }) void arbeidsforholdEksistens_eksisterIkke(String reqArbForholdId, Boolean isOppdatering, String respArbForholdId, int antallEksisterende, int antallNye) {