diff --git a/__tests__/components/Aarsaksvelger.test.tsx b/__tests__/components/Aarsaksvelger.test.tsx index 529ac718..3701f237 100644 --- a/__tests__/components/Aarsaksvelger.test.tsx +++ b/__tests__/components/Aarsaksvelger.test.tsx @@ -195,7 +195,7 @@ describe('Aarsaksvelger', () => { visFeilmeldingsTekst={visFeilmeldingsTekst} setPerioder={setPerioder} nyInnsending={false} - defaultEndringAarsak={{ aarsak: 'Ferie', perioder: perioder }} + defaultEndringAarsak={{ aarsak: 'Ferie', ferier: perioder }} /> ); @@ -264,7 +264,7 @@ describe('Aarsaksvelger', () => { visFeilmeldingsTekst={visFeilmeldingsTekst} setPerioder={setPerioderMock} nyInnsending={false} - defaultEndringAarsak={{ aarsak: 'Permisjon', perioder: perioder }} + defaultEndringAarsak={{ aarsak: 'Permisjon', permisjoner: perioder }} /> ); @@ -294,7 +294,7 @@ describe('Aarsaksvelger', () => { visFeilmeldingsTekst={visFeilmeldingsTekst} setPerioder={setPerioder} nyInnsending={false} - defaultEndringAarsak={{ aarsak: 'Permittering', perioder: perioder }} + defaultEndringAarsak={{ aarsak: 'Permittering', permitteringer: perioder }} /> ); @@ -382,7 +382,7 @@ describe('Aarsaksvelger', () => { visFeilmeldingsTekst={visFeilmeldingsTekst} setPerioder={setPerioder} nyInnsending={false} - defaultEndringAarsak={{ aarsak: 'Sykefravaer', perioder: perioder }} + defaultEndringAarsak={{ aarsak: 'Sykefravaer', sykefravaer: perioder }} /> ); diff --git a/__tests__/components/EndringAarsakVisning.test.tsx b/__tests__/components/EndringAarsakVisning.test.tsx index 0f752b16..0625b319 100644 --- a/__tests__/components/EndringAarsakVisning.test.tsx +++ b/__tests__/components/EndringAarsakVisning.test.tsx @@ -2,12 +2,16 @@ import { render, screen } from '@testing-library/react'; import { axe } from 'jest-axe'; import { expect } from 'vitest'; import EndringAarsakVisning from '../../components/EndringAarsakVisning/EndringAarsakVisning'; +import parseIsoDate from '../../utils/parseIsoDate'; describe('EndringAarsakVisning', () => { it('should show tariffendringsdata.', async () => { - const { container } = render( - - ); + const endrinAarsak = { + aarsak: 'Tariffendring', + gjelderFra: parseIsoDate('2022-11-10'), + bleKjent: parseIsoDate('2022-11-15') + }; + const { container } = render(); const results = await axe(container); expect(results).toHaveNoViolations(); @@ -23,7 +27,9 @@ describe('EndringAarsakVisning', () => { { fom: '2022-11-10', tom: '2022-11-15' }, { fom: '2022-12-10', tom: '2022-12-15' } ]; - const { container } = render(); + const endrinAarsak = { aarsak: 'Ferie', ferier: perioder }; + + const { container } = render(); const results = await axe(container); expect(results).toHaveNoViolations(); @@ -37,7 +43,8 @@ describe('EndringAarsakVisning', () => { }); it('should show VarigLonnsendring data.', async () => { - const { container } = render(); + const endrinAarsak = { aarsak: 'VarigLoennsendring', gjelderFra: parseIsoDate('2022-12-15') }; + const { container } = render(); const results = await axe(container); expect(results).toHaveNoViolations(); @@ -51,7 +58,8 @@ describe('EndringAarsakVisning', () => { { fom: '2022-11-10', tom: '2022-11-15' }, { fom: '2022-12-10', tom: '2022-12-15' } ]; - const { container } = render(); + const endrinAarsak = { aarsak: 'Permisjon', permisjoner: perioder }; + const { container } = render(); const results = await axe(container); expect(results).toHaveNoViolations(); @@ -69,7 +77,9 @@ describe('EndringAarsakVisning', () => { { fom: '2022-11-10', tom: '2022-11-15' }, { fom: '2022-12-10', tom: '2022-12-15' } ]; - const { container } = render(); + const endrinAarsak = { aarsak: 'Permittering', permitteringer: perioder }; + const { container } = render(); + const results = await axe(container); expect(results).toHaveNoViolations(); @@ -83,7 +93,9 @@ describe('EndringAarsakVisning', () => { }); it('should show NyStilling.', async () => { - const { container } = render(); + const endrinAarsak = { aarsak: 'NyStilling', gjelderFra: parseIsoDate('2022-11-10') }; + const { container } = render(); + const results = await axe(container); expect(results).toHaveNoViolations(); @@ -93,7 +105,9 @@ describe('EndringAarsakVisning', () => { }); it('should show NyStillingsprosent.', async () => { - const { container } = render(); + const endrinAarsak = { aarsak: 'NyStillingsprosent', gjelderFra: parseIsoDate('2022-11-10') }; + const { container } = render(); + const results = await axe(container); expect(results).toHaveNoViolations(); @@ -107,7 +121,9 @@ describe('EndringAarsakVisning', () => { { fom: '2022-11-10', tom: '2022-11-15' }, { fom: '2022-12-10', tom: '2022-12-15' } ]; - const { container } = render(); + const endrinAarsak = { aarsak: 'Sykefravaer', sykefravaer: perioder }; + const { container } = render(); + const results = await axe(container); expect(results).toHaveNoViolations(); @@ -121,7 +137,9 @@ describe('EndringAarsakVisning', () => { }); it('should show Feilregistrert data.', async () => { - const { container } = render(); + const endrinAarsak = { aarsak: 'Feilregistrert' }; + const { container } = render(); + const results = await axe(container); expect(results).toHaveNoViolations(); @@ -130,7 +148,9 @@ describe('EndringAarsakVisning', () => { }); it('should show Bonus data.', async () => { - const { container } = render(); + const endrinAarsak = { aarsak: 'Bonus' }; + const { container } = render(); + const results = await axe(container); expect(results).toHaveNoViolations(); @@ -139,7 +159,9 @@ describe('EndringAarsakVisning', () => { }); it('should show Nyansatt data.', async () => { - const { container } = render(); + const endrinAarsak = { aarsak: 'Nyansatt' }; + const { container } = render(); + const results = await axe(container); expect(results).toHaveNoViolations(); @@ -148,7 +170,9 @@ describe('EndringAarsakVisning', () => { }); it('should show default data.', async () => { - const { container } = render(); + const endrinAarsak = { aarsak: 'Ukjent' }; + const { container } = render(); + const results = await axe(container); expect(results).toHaveNoViolations(); @@ -157,7 +181,9 @@ describe('EndringAarsakVisning', () => { }); it('should show Ferietrekk data.', async () => { - const { container } = render(); + const endrinAarsak = { aarsak: 'Nyansatt' }; + const { container } = render(); + const results = await axe(container); expect(results).toHaveNoViolations(); diff --git a/__tests__/state/useBruttoinntektStore.test.ts b/__tests__/state/useBruttoinntektStore.test.ts index 6f834c2f..88527929 100644 --- a/__tests__/state/useBruttoinntektStore.test.ts +++ b/__tests__/state/useBruttoinntektStore.test.ts @@ -158,7 +158,7 @@ describe('useBoundStore', () => { result.current.setEndringsaarsak(''); }); - expect(result.current.bruttoinntekt?.endringAarsak?.aarsak).toBe(''); + expect(result.current.bruttoinntekt?.endringAarsak?.aarsak).toBeUndefined(); expect(result.current.feilmeldinger).toEqual([ { felt: 'bruttoinntekt-endringsaarsak', @@ -183,7 +183,7 @@ describe('useBoundStore', () => { result.current.tilbakestillMaanedsinntekt(); }); - expect(result.current.bruttoinntekt?.endringAarsak?.aarsak).toBe(''); + expect(result.current.bruttoinntekt?.endringAarsak?.aarsak).toBeUndefined(); expect(result.current.bruttoinntekt?.manueltKorrigert).toBeFalsy(); expect(result.current.bruttoinntekt?.bruttoInntekt).toBe(40000); }); @@ -281,11 +281,15 @@ describe('useBoundStore', () => { result.current.initBruttoinntekt(inputInntekt, tidligereInntekt, new Date(2002, 10, 11)); }); + act(() => { + result.current.setEndringsaarsak('Ferie'); + }); + act(() => { result.current.setPerioder([{ fom: new Date(2002, 10, 11), tom: new Date(2002, 10, 11), id: '1' }]); }); - expect(result.current.bruttoinntekt.endringAarsak.perioder).toEqual([ + expect(result.current.bruttoinntekt.endringAarsak.ferier).toEqual([ { fom: parseIsoDate('2002-11-11'), tom: parseIsoDate('2002-11-11') } ]); }); @@ -297,11 +301,15 @@ describe('useBoundStore', () => { result.current.initBruttoinntekt(inputInntekt, tidligereInntekt, new Date(2002, 10, 11)); }); + act(() => { + result.current.setEndringsaarsak('Ferie'); + }); + act(() => { result.current.setPerioder([{ fom: new Date(2002, 10, 11), tom: new Date(2002, 10, 11), id: '1' }]); }); - expect(result.current.bruttoinntekt.endringAarsak.perioder).toEqual([ + expect(result.current.bruttoinntekt.endringAarsak.ferier).toEqual([ { fom: parseIsoDate('2002-11-11'), tom: parseIsoDate('2002-11-11') } ]); }); @@ -383,11 +391,15 @@ describe('useBoundStore', () => { result.current.initBruttoinntekt(inputInntekt, tidligereInntekt, new Date(2002, 10, 11)); }); + act(() => { + result.current.setEndringsaarsak('Ferie'); + }); + act(() => { result.current.setPerioder([{ fom: new Date(2002, 10, 11), tom: new Date(2002, 10, 11), id: '1' }]); }); - expect(result.current.bruttoinntekt.endringAarsak.perioder).toEqual([ + expect(result.current.bruttoinntekt.endringAarsak.ferier).toEqual([ { fom: parseIsoDate('2002-11-11'), tom: parseIsoDate('2002-11-11') } ]); }); diff --git a/__tests__/state/useFyllInnsending.test.ts b/__tests__/state/useFyllInnsending.test.ts index cbbd819f..936ceaeb 100644 --- a/__tests__/state/useFyllInnsending.test.ts +++ b/__tests__/state/useFyllInnsending.test.ts @@ -60,19 +60,19 @@ describe('useFyllInnsending', () => { }); if (innsending) { - expect(innsending.identitetsnummer).toEqual(mottattKvittering.identitetsnummer); - expect(innsending.orgnrUnderenhet).toEqual(mottattKvittering.orgnrUnderenhet); + // expect(innsending.identitetsnummer).toEqual(mottattKvittering.identitetsnummer); + // expect(innsending.orgnrUnderenhet).toEqual(mottattKvittering.orgnrUnderenhet); - expect(innsending.egenmeldingsperioder).toEqual([ + expect(innsending.agp.egenmeldinger).toEqual([ { fom: mottattKvittering.egenmeldingsperioder[0].fom, tom: mottattKvittering.egenmeldingsperioder[0].tom } ]); - expect(innsending.refusjon.utbetalerHeleEllerDeler).toBeTruthy(); - expect(innsending.refusjon.refusjonPrMnd).toBe(80666.66666666667); - expect(innsending.inntekt.beregnetInntekt).toBe(80666.66666666667); - expect(innsending.inntekt.bekreftet).toBeTruthy(); + // expect(innsending.refusjon.utbetalerHeleEllerDeler).toBeTruthy(); + expect(innsending.refusjon.beloepPerMaaned).toBe(80666.66666666667); + expect(innsending.inntekt.beloep).toBe(80666.66666666667); + // expect(innsending.inntekt.bekreftet).toBeTruthy(); } }); @@ -94,28 +94,29 @@ describe('useFyllInnsending', () => { let innsending: InnsendingSkjema = {} as InnsendingSkjema; act(() => { - innsending = fyllInnsending(false); + innsending = fyllInnsending(false, '8d50ef20-37b5-4829-ad83-56219e70b375'); }); if (innsending) { - expect(innsending.identitetsnummer).toEqual(mottattKvittering.identitetsnummer); - expect(innsending.orgnrUnderenhet).toEqual(mottattKvittering.orgnrUnderenhet); + console.log(innsending); + // expect(innsending.identitetsnummer).toEqual(mottattKvittering.identitetsnummer); + // expect(innsending.orgnrUnderenhet).toEqual(mottattKvittering.orgnrUnderenhet); - expect(innsending.egenmeldingsperioder).toEqual([ + expect(innsending.agp.egenmeldinger).toEqual([ { fom: mottattKvittering.egenmeldingsperioder[0].fom, tom: mottattKvittering.egenmeldingsperioder[0].tom } ]); - expect(innsending.refusjon.utbetalerHeleEllerDeler).toBeTruthy(); - expect(innsending.refusjon.refusjonPrMnd).toBe(80666.66666666667); - expect(innsending.refusjon.refusjonOpphører).toBe('2023-04-19'); - expect(innsending.refusjon.refusjonEndringer).toEqual([ - { beløp: 1234, dato: '2023-04-13' }, - { beløp: 12345, dato: '2023-04-20' } + // expect(innsending.refusjon.utbetalerHeleEllerDeler).toBeTruthy(); + expect(innsending.refusjon.beloepPerMaaned).toBe(80666.66666666667); + expect(innsending.refusjon.sluttdato).toBe('2023-04-19'); + expect(innsending.refusjon.endringer).toEqual([ + { beloep: 1234, startdato: '2023-04-13' }, + { beloep: 12345, startdato: '2023-04-20' } ]); - expect(innsending.inntekt.beregnetInntekt).toBe(80666.66666666667); - expect(innsending.inntekt.bekreftet).toBeTruthy(); + expect(innsending.inntekt.beloep).toBe(80666.66666666667); + // expect(innsending.inntekt.bekreftet).toBeTruthy(); } else { expect(innsending).toBeTruthy(); } diff --git a/__tests__/state/useKvitteringInit.test.ts b/__tests__/state/useKvitteringInit.test.ts index 7bd5b4ac..f1eb714b 100644 --- a/__tests__/state/useKvitteringInit.test.ts +++ b/__tests__/state/useKvitteringInit.test.ts @@ -117,7 +117,7 @@ describe('useKvitteringInit', () => { expect(result.current.bruttoinntekt.manueltKorrigert).toBeTruthy(); expect(result.current.harRefusjonEndringer).toBe('Ja'); - expect(result.current.bruttoinntekt.endringAarsak?.perioder).toEqual([ + expect(result.current.bruttoinntekt.endringAarsak?.ferier).toEqual([ { fom: parseIsoDate('2023-02-24'), tom: parseIsoDate('2023-03-31') @@ -158,7 +158,7 @@ describe('useKvitteringInit', () => { expect(result.current.bruttoinntekt.manueltKorrigert).toBeTruthy(); expect(result.current.harRefusjonEndringer).toBe('Ja'); - expect(result.current.bruttoinntekt.endringAarsak?.perioder).toEqual([ + expect(result.current.bruttoinntekt.endringAarsak?.permisjoner).toEqual([ { fom: parseIsoDate('2023-02-24'), tom: parseIsoDate('2023-03-31') @@ -181,7 +181,7 @@ describe('useKvitteringInit', () => { expect(result.current.bruttoinntekt.manueltKorrigert).toBeTruthy(); expect(result.current.harRefusjonEndringer).toBe('Ja'); - expect(result.current.bruttoinntekt.endringAarsak?.perioder).toEqual([ + expect(result.current.bruttoinntekt.endringAarsak?.permitteringer).toEqual([ { fom: parseIsoDate('2023-02-24'), tom: parseIsoDate('2023-03-31') @@ -240,7 +240,7 @@ describe('useKvitteringInit', () => { expect(result.current.bruttoinntekt.manueltKorrigert).toBeTruthy(); expect(result.current.harRefusjonEndringer).toBe('Ja'); - expect(result.current.bruttoinntekt.endringAarsak?.perioder).toEqual([ + expect(result.current.bruttoinntekt.endringAarsak?.sykefravaer).toEqual([ { fom: parseIsoDate('2023-02-06'), tom: parseIsoDate('2023-02-10') diff --git a/__tests__/state/useRefusjonArbeidsgiverStore.test.ts b/__tests__/state/useRefusjonArbeidsgiverStore.test.ts index 28d3b00f..d5af18ff 100644 --- a/__tests__/state/useRefusjonArbeidsgiverStore.test.ts +++ b/__tests__/state/useRefusjonArbeidsgiverStore.test.ts @@ -122,7 +122,7 @@ describe('useBoundStore', () => { }); expect(result.current.lonnISykefravaeret?.beloep).toBeUndefined(); - expect(result.current.feilmeldinger[0].felt).toBe('lus-input'); + expect(result.current.feilmeldinger[0].felt).toBe('refusjon.beloepPerMaaned'); }); it('should change the beloep on lonnISykefravaeret', () => { diff --git a/__tests__/validators/validerAapenInnsending.test.ts b/__tests__/validators/validerAapenInnsending.test.ts index 18f215e6..b3d2af4a 100644 --- a/__tests__/validators/validerAapenInnsending.test.ts +++ b/__tests__/validators/validerAapenInnsending.test.ts @@ -1,4 +1,4 @@ -import validerAapenInnsending, { PersonnummerSchema } from '../../validators/validerAapenInnsending'; +import validerAapenInnsending, { AapenInnsending, PersonnummerSchema } from '../../validators/validerAapenInnsending'; describe('validerAapenInnsending', () => { it('should validate PersonnummerSchema', () => { @@ -14,15 +14,15 @@ describe('validerAapenInnsending', () => { }); it('should validate aapenInnsending', () => { - const data = { + const data: AapenInnsending = { sykmeldtFnr: '10107400090', avsender: { orgnr: '810007842', tlf: '12345678' }, - sykmeldingsperioder: [{ fom: new Date(), tom: new Date() }], + sykmeldingsperioder: [{ fom: '2002-02-02', tom: '2002-02-02' }], agp: { - perioder: [{ fom: new Date(), tom: new Date() }], + perioder: [{ fom: '2002-02-02', tom: '2002-02-02' }], egenmeldinger: [], redusertLoennIAgp: { beloep: 1000, @@ -38,7 +38,7 @@ describe('validerAapenInnsending', () => { refusjon: { beloepPerMaaned: 1000, endringer: [], - sluttdato: new Date() + sluttdato: '2002-02-02' }, aarsakInnsending: 'Endring' }; diff --git a/__tests__/validators/validerBruttoinntekt.test.ts b/__tests__/validators/validerBruttoinntekt.test.ts index 42289e43..580d8ab1 100644 --- a/__tests__/validators/validerBruttoinntekt.test.ts +++ b/__tests__/validators/validerBruttoinntekt.test.ts @@ -138,7 +138,7 @@ describe.concurrent('validerBruttoinntekt', () => { manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Ferie, - perioder: [{}] + ferier: [{}] } } }; @@ -163,7 +163,7 @@ describe.concurrent('validerBruttoinntekt', () => { manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Ferie, - perioder: [{ fom: parseIsoDate('2022-01-01') }] + ferier: [{ fom: parseIsoDate('2022-01-01') }] } } }; @@ -185,7 +185,7 @@ describe.concurrent('validerBruttoinntekt', () => { manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Ferie, - perioder: [{ tom: parseIsoDate('2022-01-01') }] + ferier: [{ tom: parseIsoDate('2022-01-01') }] } } }; @@ -284,7 +284,7 @@ describe.concurrent('validerBruttoinntekt', () => { bruttoinntekt: { bruttoInntekt: 123, manueltKorrigert: true, - endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Permisjon, perioder: [{}] } + endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Permisjon, permisjoner: [{}] } } }; @@ -308,7 +308,7 @@ describe.concurrent('validerBruttoinntekt', () => { manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Permisjon, - perioder: [{ fom: parseIsoDate('2022-02-02') }] + permisjoner: [{ fom: parseIsoDate('2022-02-02') }] } } }; @@ -330,7 +330,7 @@ describe.concurrent('validerBruttoinntekt', () => { manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Permisjon, - perioder: [{ tom: parseIsoDate('2022-02-02') }] + permisjoner: [{ tom: parseIsoDate('2022-02-02') }] } } }; @@ -369,7 +369,7 @@ describe.concurrent('validerBruttoinntekt', () => { bruttoinntekt: { bruttoInntekt: 123, manueltKorrigert: true, - endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Permittering, perioder: [{}] } + endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Permittering, permitteringer: [{}] } } }; @@ -393,7 +393,7 @@ describe.concurrent('validerBruttoinntekt', () => { manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Permittering, - perioder: [{ fom: parseIsoDate('2022-02-02') }] + permitteringer: [{ fom: parseIsoDate('2022-02-02') }] } } }; @@ -415,7 +415,7 @@ describe.concurrent('validerBruttoinntekt', () => { manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Permittering, - perioder: [{ tom: parseIsoDate('2022-02-02') }] + permitteringer: [{ tom: '2022-02-02' }] } } }; @@ -579,7 +579,7 @@ it('should return an error when sykefravær fom & tom is missing', () => { manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Sykefravaer, - perioder: [{}] + sykefravaer: [{}] } } }; @@ -604,7 +604,7 @@ it('should return an error when Sykefravaer fom is missing', () => { manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Sykefravaer, - perioder: [{ tom: parseIsoDate('2022-01-02') }] + sykefravaer: [{ tom: '2022-01-02' }] } } }; @@ -626,7 +626,7 @@ it('should return an error when permittering tom is missing, sykefravær', () => manueltKorrigert: true, endringAarsak: { aarsak: begrunnelseEndringBruttoinntekt.Sykefravaer, - perioder: [{ fom: parseIsoDate('2022-01-02') }] + sykefravaer: [{ fom: '2022-01-02' }] } } }; diff --git a/__tests__/validators/validerLonnUnderSykefravaeret.test.ts b/__tests__/validators/validerLonnUnderSykefravaeret.test.ts index 8beed723..9c101261 100644 --- a/__tests__/validators/validerLonnUnderSykefravaeret.test.ts +++ b/__tests__/validators/validerLonnUnderSykefravaeret.test.ts @@ -101,7 +101,7 @@ describe.concurrent('validerLonnUnderSykefravaeret', () => { const expected = [ { code: 'LONN_UNDER_SYKEFRAVAERET_BELOP', - felt: 'lus-input' + felt: 'refusjon.beloepPerMaaned' } ]; @@ -117,7 +117,7 @@ describe.concurrent('validerLonnUnderSykefravaeret', () => { const expected = [ { code: 'BELOP_OVERSTIGER_BRUTTOINNTEKT', - felt: 'lus-input' + felt: 'refusjon.beloepPerMaaned' } ]; diff --git a/components/Bruttoinntekt/Aarsaksvelger.tsx b/components/Bruttoinntekt/Aarsaksvelger.tsx index 0da2d728..d1e838d9 100644 --- a/components/Bruttoinntekt/Aarsaksvelger.tsx +++ b/components/Bruttoinntekt/Aarsaksvelger.tsx @@ -90,8 +90,8 @@ export default function Aarsaksvelger({ { const fomId = periode.fom ? isoDate(periode.fom) : 'undefined'; const tomId = periode.tom ? isoDate(periode.tom) : 'undefined'; return { - fom: periode.fom, - tom: periode.tom, + fom: typeof periode.fom === 'string' ? parseIsoDate(periode.fom) : periode.fom, + tom: typeof periode.tom === 'string' ? parseIsoDate(periode.tom) : periode.tom, id: fomId + '-' + tomId }; }); } function isoDate(date: Date | string): string { - if (typeof date === 'string') { - return date; + if (typeof date !== 'string') { + return formatIsoDate(date); } - return formatIsoDate(date); + return date; } diff --git a/components/Bruttoinntekt/Bruttoinntekt.tsx b/components/Bruttoinntekt/Bruttoinntekt.tsx index 4f4d514b..611c9c54 100644 --- a/components/Bruttoinntekt/Bruttoinntekt.tsx +++ b/components/Bruttoinntekt/Bruttoinntekt.tsx @@ -47,7 +47,7 @@ export default function Bruttoinntekt({ const skjemastatus = useBoundStore((state) => state.skjemastatus); const henterData = useBoundStore((state) => state.henterData); const feilHentingAvInntektsdata = useBoundStore((state) => state.feilHentingAvInntektsdata); - const endringAarsak: EndringAarsak = useBoundStore((state) => state.bruttoinntekt.endringAarsak); + const endringAarsak: EndringAarsak | undefined = useBoundStore((state) => state.bruttoinntekt.endringAarsak); const amplitudeComponent = 'BeregnetMånedslønn'; const clickTilbakestillMaanedsinntekt = (event: React.MouseEvent) => { @@ -110,7 +110,7 @@ export default function Bruttoinntekt({ const [readMoreOpen, setReadMoreOpen] = useState(false); const gjennomsnittligInntekt = erSelvbestemt - ? sbBruttoinntekt ?? bruttoinntekt?.bruttoInntekt + ? (sbBruttoinntekt ?? bruttoinntekt?.bruttoInntekt) : bruttoinntekt?.bruttoInntekt; const sisteTreMndTidligereinntekt = erSelvbestemt ? sbTidligereinntekt : tidligereinntekt; @@ -201,7 +201,7 @@ export default function Bruttoinntekt({ bruttoinntekt={bruttoinntekt} changeMaanedsintektHandler={addIsDirtyForm(changeMaanedsintektHandler)} changeBegrunnelseHandler={addIsDirtyForm(changeBegrunnelseHandler)} - defaultEndringAarsak={endringAarsak} + defaultEndringAarsak={endringAarsak!} setEndringAarsakGjelderFra={addIsDirtyForm(setEndringAarsakGjelderFra)} setEndringAarsakBleKjent={addIsDirtyForm(setEndringAarsakBleKjent)} setPerioder={addIsDirtyForm(setPerioder)} diff --git a/components/Bruttoinntekt/PeriodeListevelger.tsx b/components/Bruttoinntekt/PeriodeListevelger.tsx index c3e02dcc..fad6f7da 100644 --- a/components/Bruttoinntekt/PeriodeListevelger.tsx +++ b/components/Bruttoinntekt/PeriodeListevelger.tsx @@ -27,7 +27,7 @@ export default function PeriodeListevelger({ defaultMonth, toDate, visFeilmeldingsTekst -}: PeriodeListevelgerProps) { +}: Readonly) { const onRangeChange = (datoer: PeriodeParam | undefined, index: string) => { const uppdatedRange = defaultRange?.map((periode) => { if (periode.id === index) { @@ -60,28 +60,26 @@ export default function PeriodeListevelger({ onRangeListChange([{ id: nanoid() }]); } }); - return ( <> - {defaultRange && - defaultRange.map((range, index) => ( - onRangeChange(oppdatertRange, range.id)} - defaultRange={range} - fomTekst={fomTekst} - fomID={`${fomIdBase}-${range.id}`} - tomTekst={tomTekst} - tomID={`${tomIdBase}-${range.id}`} - kanSlettes={index !== 0} - periodeId={range.id} - onSlettRad={slettRad} - fomError={visFeilmeldingsTekst ? visFeilmeldingsTekst(`${fomIdBase}-${range.id}`) : undefined} - tomError={visFeilmeldingsTekst ? visFeilmeldingsTekst(`${tomIdBase}-${range.id}`) : undefined} - defaultMonth={defaultMonth} - toDate={toDate} - /> - ))} + {defaultRange?.map((range, index) => ( + onRangeChange(oppdatertRange, range.id)} + defaultRange={range} + fomTekst={fomTekst} + fomID={`${fomIdBase}-${range.id}`} + tomTekst={tomTekst} + tomID={`${tomIdBase}-${range.id}`} + kanSlettes={index !== 0} + periodeId={range.id} + onSlettRad={slettRad} + fomError={visFeilmeldingsTekst ? visFeilmeldingsTekst(`${fomIdBase}-${range.id}`) : undefined} + tomError={visFeilmeldingsTekst ? visFeilmeldingsTekst(`${tomIdBase}-${range.id}`) : undefined} + defaultMonth={defaultMonth} + toDate={toDate} + /> + ))} diff --git a/components/Datovelger.tsx b/components/Datovelger.tsx index ca2d9e50..740c06f7 100644 --- a/components/Datovelger.tsx +++ b/components/Datovelger.tsx @@ -39,11 +39,11 @@ export default function Datovelger({ defaultMonth: defaultMonth }); - useEffect(() => { - if (typeof defaultSelected === 'undefined') { - reset(); - } - }, [defaultSelected]); // eslint-disable-line + // useEffect(() => { + // if (typeof defaultSelected === 'undefined') { + // reset(); + // } + // }, [defaultSelected]); // eslint-disable-line return ( diff --git a/components/EndringAarsakVisning/EndringAarsakVisning.tsx b/components/EndringAarsakVisning/EndringAarsakVisning.tsx index a97f8c60..06863b90 100644 --- a/components/EndringAarsakVisning/EndringAarsakVisning.tsx +++ b/components/EndringAarsakVisning/EndringAarsakVisning.tsx @@ -5,7 +5,15 @@ import begrunnelseEndringBruttoinntekt from '../Bruttoinntekt/begrunnelseEndring import PeriodeFraTil from '../PeriodeFraTil/PeriodeFraTil'; import lokalStyle from './EndringAarsakVisning.module.css'; -export default function EndringAarsakVisning(props: EndringAarsak) { +interface EndringAarsakVisningProps { + endringAarsak: EndringAarsak; +} + +export default function EndringAarsakVisning({ endringAarsak }: EndringAarsakVisningProps) { + const props = endringAarsak; + if (!props) { + return null; + } switch (props.aarsak) { case begrunnelseEndringBruttoinntekt.Tariffendring: { return ( @@ -15,13 +23,49 @@ export default function EndringAarsakVisning(props: EndringAarsak) { ); } - case begrunnelseEndringBruttoinntekt.Sykefravaer: - case begrunnelseEndringBruttoinntekt.Permittering: - case begrunnelseEndringBruttoinntekt.Permisjon: + case begrunnelseEndringBruttoinntekt.Sykefravaer: { + return props.sykefravaer ? ( +
+ {props.sykefravaer.map((periode, index) => ( + + ))}{' '} +
+ ) : null; + } + case begrunnelseEndringBruttoinntekt.Permittering: { + return props.permitteringer ? ( +
+ {props.permitteringer.map((periode, index) => ( + + ))}{' '} +
+ ) : null; + } + case begrunnelseEndringBruttoinntekt.Permisjon: { + return props.permisjoner ? ( +
+ {props.permisjoner.map((periode, index) => ( + + ))}{' '} +
+ ) : null; + } case begrunnelseEndringBruttoinntekt.Ferie: { - return props.perioder ? ( + return props.ferier ? (
- {props.perioder.map((periode, index) => ( + {props.ferier.map((periode, index) => ( void; +} + +export default function Naturalytelser({ setIsDirtyForm }: Readonly) { const naturalytelser = useBoundStore((state) => state.naturalytelser); const leggTilNaturalytelse = useBoundStore((state) => state.leggTilNaturalytelse); const setNaturalytelseType = useBoundStore((state) => state.setNaturalytelseType); @@ -21,14 +25,17 @@ export default function Naturalytelser() { const visNaturalytelser = (event: React.MouseEvent) => { if (event.currentTarget.checked === true) { + setIsDirtyForm(true); leggTilNaturalytelse(); } else { + setIsDirtyForm(true); slettAlleNaturalytelser(); } }; const leggTilNaturalytelseHandler = (event: React.MouseEvent) => { event.preventDefault(); + setIsDirtyForm(true); leggTilNaturalytelse(); }; diff --git a/components/RefusjonArbeidsgiver/RefusjonArbeidsgiverBelop.tsx b/components/RefusjonArbeidsgiver/RefusjonArbeidsgiverBelop.tsx index 08c3485e..0cc8cdb6 100644 --- a/components/RefusjonArbeidsgiver/RefusjonArbeidsgiverBelop.tsx +++ b/components/RefusjonArbeidsgiver/RefusjonArbeidsgiverBelop.tsx @@ -54,8 +54,8 @@ export default function RefusjonArbeidsgiverBelop({ label='Oppgi refusjonsbeløpet per måned' value={bruttoinntekt} onChange={(event) => onOppdaterBelop(event.target.value)} - id={'lus-input'} - error={visFeilmeldingsTekst('lus-input')} + id={'refusjon.beloepPerMaaned'} + error={visFeilmeldingsTekst('refusjon.beloepPerMaaned')} data-cy='refusjon-arbeidsgiver-beloep-input' /> diff --git a/components/VelgAarsak/VelgAarsak.tsx b/components/VelgAarsak/VelgAarsak.tsx index e572b1e5..8514dd4c 100644 --- a/components/VelgAarsak/VelgAarsak.tsx +++ b/components/VelgAarsak/VelgAarsak.tsx @@ -94,15 +94,15 @@ export default function VelgAarsak({
)} @@ -120,11 +120,11 @@ export default function VelgAarsak({ {endringAarsak === begrunnelseEndringBruttoinntekt.Permisjon && (
@@ -180,15 +180,15 @@ export default function VelgAarsak({
)} diff --git a/cypress/e2e/delvis-inngang-fra-kvittering.cy.js b/cypress/e2e/delvis-inngang-fra-kvittering.cy.js index d3a8e08b..af3ec297 100644 --- a/cypress/e2e/delvis-inngang-fra-kvittering.cy.js +++ b/cypress/e2e/delvis-inngang-fra-kvittering.cy.js @@ -110,39 +110,20 @@ describe('Delvis skjema - Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '810007842', - identitetsnummer: '10486535275', - egenmeldingsperioder: [], - fraværsperioder: [ - { - fom: '2023-01-02', - tom: '2023-01-29' - }, - { - fom: '2023-01-31', - tom: '2023-02-08' - } - ], - arbeidsgiverperioder: [], + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: null, inntekt: { - bekreftet: true, - beregnetInntekt: 50000, - manueltKorrigert: true, - endringÅrsak: { - typpe: 'Bonus' - } + beloep: 50000, + inntektsdato: '2023-01-02', + naturalytelser: [], + endringAarsak: { aarsak: 'Bonus' } }, - bestemmendeFraværsdag: '2023-01-02', refusjon: { - utbetalerHeleEllerDeler: true, - refusjonPrMnd: 50000, - refusjonOpphører: '2023-09-30' + beloepPerMaaned: 50000, + sluttdato: '2023-09-30', + endringer: [] }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Endring', - telefonnummer: '12345678', - forespurtData: ['inntekt', 'refusjon'] + avsenderTlf: '12345678' }); // cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); diff --git a/cypress/e2e/delvis-refusjon-skjaeringstidspunkt.cy.js b/cypress/e2e/delvis-refusjon-skjaeringstidspunkt.cy.js index 04b8707b..a80ef60e 100644 --- a/cypress/e2e/delvis-refusjon-skjaeringstidspunkt.cy.js +++ b/cypress/e2e/delvis-refusjon-skjaeringstidspunkt.cy.js @@ -57,31 +57,16 @@ describe('Delvis skjema - Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '810007842', - identitetsnummer: '19496806711', - egenmeldingsperioder: [], - fraværsperioder: [ - { - fom: '2024-01-07', - tom: '2024-02-02' - } - ], - arbeidsgiverperioder: [], + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: null, inntekt: { - bekreftet: true, - beregnetInntekt: 55000, - manueltKorrigert: false + beloep: 55000, + inntektsdato: '2024-01-07', + naturalytelser: [], + endringAarsak: null }, - bestemmendeFraværsdag: '2024-01-07', - refusjon: { - utbetalerHeleEllerDeler: true, - refusjonPrMnd: 55000 - }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['inntekt', 'refusjon'] + refusjon: { beloepPerMaaned: 55000, sluttdato: null, endringer: [] }, + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); @@ -149,34 +134,16 @@ describe('Delvis skjema - Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '810007842', - identitetsnummer: '19496806711', - egenmeldingsperioder: [], - fraværsperioder: [ - { - fom: '2024-01-07', - tom: '2024-02-02' - } - ], - arbeidsgiverperioder: [], + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: null, inntekt: { - bekreftet: true, - beregnetInntekt: 60000, - manueltKorrigert: true, - endringÅrsak: { - typpe: 'Bonus' - } - }, - bestemmendeFraværsdag: '2024-01-07', - refusjon: { - utbetalerHeleEllerDeler: true, - refusjonPrMnd: 55000 + beloep: 60000, + inntektsdato: '2024-01-07', + naturalytelser: [], + endringAarsak: { aarsak: 'Bonus' } }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['inntekt', 'refusjon'] + refusjon: { beloepPerMaaned: 55000, sluttdato: null, endringer: [] }, + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); diff --git a/cypress/e2e/delvis-refusjon.cy.js b/cypress/e2e/delvis-refusjon.cy.js index 6ddcee59..28ae7263 100644 --- a/cypress/e2e/delvis-refusjon.cy.js +++ b/cypress/e2e/delvis-refusjon.cy.js @@ -57,31 +57,16 @@ describe('Delvis skjema - Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '810007982', - identitetsnummer: '18468037250', - egenmeldingsperioder: [], - fraværsperioder: [ - { - fom: '2023-08-08', - tom: '2023-08-31' - } - ], - arbeidsgiverperioder: [], + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: null, inntekt: { - bekreftet: true, - beregnetInntekt: 26000, - manueltKorrigert: false + beloep: 26000, + inntektsdato: '2023-08-08', + naturalytelser: [], + endringAarsak: null }, - bestemmendeFraværsdag: '2023-08-08', - refusjon: { - utbetalerHeleEllerDeler: true, - refusjonPrMnd: 10000 - }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['inntekt', 'refusjon'] + refusjon: { beloepPerMaaned: 10000, sluttdato: null, endringer: [] }, + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); @@ -149,34 +134,16 @@ describe('Delvis skjema - Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '810007982', - identitetsnummer: '18468037250', - egenmeldingsperioder: [], - fraværsperioder: [ - { - fom: '2023-08-08', - tom: '2023-08-31' - } - ], - arbeidsgiverperioder: [], + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: null, inntekt: { - bekreftet: true, - beregnetInntekt: 50000, - manueltKorrigert: true, - endringÅrsak: { - typpe: 'Bonus' - } - }, - bestemmendeFraværsdag: '2023-08-08', - refusjon: { - utbetalerHeleEllerDeler: true, - refusjonPrMnd: 10000 + beloep: 50000, + inntektsdato: '2023-08-08', + naturalytelser: [], + endringAarsak: { aarsak: 'Bonus' } }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['inntekt', 'refusjon'] + refusjon: { beloepPerMaaned: 10000, sluttdato: null, endringer: [] }, + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); diff --git a/cypress/e2e/delvis.cy.js b/cypress/e2e/delvis.cy.js index c910b737..81a7408d 100644 --- a/cypress/e2e/delvis.cy.js +++ b/cypress/e2e/delvis.cy.js @@ -54,31 +54,25 @@ describe('Delvis skjema - Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '810007842', - identitetsnummer: '10486535275', - egenmeldingsperioder: [], - fraværsperioder: [ - { fom: '2023-02-02', tom: '2023-02-20' }, - { fom: '2023-02-24', tom: '2023-02-28' } - ], - arbeidsgiverperioder: [], - inntekt: { bekreftet: true, beregnetInntekt: 46000, manueltKorrigert: false }, - bestemmendeFraværsdag: '2023-02-25', + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: null, + inntekt: { + beloep: 46000, + inntektsdato: '2023-02-25', + naturalytelser: [], + endringAarsak: null + }, refusjon: { - utbetalerHeleEllerDeler: true, - refusjonPrMnd: 46000, - refusjonEndringer: [ + beloepPerMaaned: 46000, + sluttdato: null, + endringer: [ { - beløp: 0, - dato: '2023-09-30' + beloep: 0, + startdato: '2023-09-30' } ] }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['inntekt', 'refusjon'] + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); @@ -146,31 +140,25 @@ describe('Delvis skjema - Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '810007842', - identitetsnummer: '10486535275', - egenmeldingsperioder: [], - fraværsperioder: [ - { fom: '2023-02-02', tom: '2023-02-20' }, - { fom: '2023-02-24', tom: '2023-02-28' } - ], - arbeidsgiverperioder: [], - inntekt: { bekreftet: true, beregnetInntekt: 50000, manueltKorrigert: true, endringÅrsak: { typpe: 'Bonus' } }, - bestemmendeFraværsdag: '2023-02-25', + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: null, + inntekt: { + beloep: 50000, + inntektsdato: '2023-02-25', + naturalytelser: [], + endringAarsak: { aarsak: 'Bonus' } + }, refusjon: { - utbetalerHeleEllerDeler: true, - refusjonPrMnd: 46000, - refusjonEndringer: [ + beloepPerMaaned: 46000, + sluttdato: null, + endringer: [ { - beløp: 0, - dato: '2023-09-30' + beloep: 0, + startdato: '2023-09-30' } ] }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['inntekt', 'refusjon'] + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); diff --git a/cypress/e2e/endrelonnogrefusjon.cy.js b/cypress/e2e/endrelonnogrefusjon.cy.js index 94a5bdd1..dbaca845 100644 --- a/cypress/e2e/endrelonnogrefusjon.cy.js +++ b/cypress/e2e/endrelonnogrefusjon.cy.js @@ -96,53 +96,34 @@ describe('Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '911206722', - identitetsnummer: '10486535275', - egenmeldingsperioder: [ - { - fom: '2023-02-02', - tom: '2023-02-02' - }, - { - fom: '2023-01-30', - tom: '2023-02-01' - } - ], - fraværsperioder: [ - { - fom: '2023-02-03', - tom: '2023-02-24' - } - ], - arbeidsgiverperioder: [ - { - fom: '2023-01-30', - tom: '2023-02-14' - } - ], - inntekt: { - bekreftet: true, - beregnetInntekt: 75000, - manueltKorrigert: true, - endringÅrsak: { - typpe: 'Bonus' - } - }, - bestemmendeFraværsdag: '2023-01-30', - fullLønnIArbeidsgiverPerioden: { - utbetalerFullLønn: true, - begrunnelse: null, - utbetalt: null + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: { + perioder: [ + { + fom: '2023-01-30', + tom: '2023-02-14' + } + ], + egenmeldinger: [ + { + fom: '2023-02-02', + tom: '2023-02-02' + }, + { + fom: '2023-01-30', + tom: '2023-02-01' + } + ], + redusertLoennIAgp: null }, - refusjon: { - utbetalerHeleEllerDeler: true, - refusjonPrMnd: 75000 + inntekt: { + beloep: 75000, + inntektsdato: '2023-01-30', + naturalytelser: [], + endringAarsak: { aarsak: 'Bonus' } }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['arbeidsgiverperiode', 'inntekt', 'refusjon'] + refusjon: { beloepPerMaaned: 75000, sluttdato: null, endringer: [] }, + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); diff --git a/cypress/e2e/kort-agp.cy.js b/cypress/e2e/kort-agp.cy.js index 4ae52ece..8be094b5 100644 --- a/cypress/e2e/kort-agp.cy.js +++ b/cypress/e2e/kort-agp.cy.js @@ -47,7 +47,7 @@ describe('Utfylling og innsending av skjema', () => { cy.findAllByRole('button', { name: /Endre/ }).first().click(); - cy.findAllByLabelText('Til').last().clear().type('116.03.23'); + cy.findAllByLabelText('Til').last().clear().type('16.03.23'); cy.realPress('Escape'); cy.findByLabelText('Utbetalt under arbeidsgiverperiode').clear().type('50000'); @@ -64,48 +64,29 @@ describe('Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '911206722', - identitetsnummer: '25087327879', - egenmeldingsperioder: [], - fraværsperioder: [ - { - fom: '2023-02-20', - tom: '2023-03-04' - }, - { - fom: '2023-03-15', - tom: '2023-03-17' - } - ], - arbeidsgiverperioder: [ - { - fom: '2023-02-20', - tom: '2023-03-04' - }, - { - fom: '2023-03-15', - tom: '2023-03-16' - } - ], - inntekt: { - bekreftet: true, - beregnetInntekt: 77000, - manueltKorrigert: false - }, - bestemmendeFraværsdag: '2023-03-15', - fullLønnIArbeidsgiverPerioden: { - utbetalerFullLønn: false, - begrunnelse: 'ArbeidOpphoert', - utbetalt: 50000 + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: { + perioder: [ + { + fom: '2023-02-20', + tom: '2023-03-04' + }, + { + fom: '2023-03-15', + tom: '2023-03-16' + } + ], + egenmeldinger: [], + redusertLoennIAgp: { beloep: 50000, begrunnelse: 'ArbeidOpphoert' } }, - refusjon: { - utbetalerHeleEllerDeler: false + inntekt: { + beloep: 77000, + inntektsdato: '2023-03-15', + naturalytelser: [], + endringAarsak: null }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['arbeidsgiverperiode', 'inntekt', 'refusjon'] + refusjon: null, + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); diff --git a/cypress/e2e/refusjon.cy.js b/cypress/e2e/refusjon.cy.js index 37b76d7d..5051bed9 100644 --- a/cypress/e2e/refusjon.cy.js +++ b/cypress/e2e/refusjon.cy.js @@ -62,23 +62,21 @@ describe('Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '911206722', - identitetsnummer: '25087327879', - egenmeldingsperioder: [{ fom: '2023-02-17', tom: '2023-02-19' }], - fraværsperioder: [ - { fom: '2023-02-20', tom: '2023-03-04' }, - { fom: '2023-03-15', tom: '2023-03-16' } - ], - arbeidsgiverperioder: [{ fom: '2023-02-17', tom: '2023-03-04' }], - inntekt: { bekreftet: true, beregnetInntekt: 77000, manueltKorrigert: false }, - bestemmendeFraværsdag: '2023-03-15', - fullLønnIArbeidsgiverPerioden: { utbetalerFullLønn: true, begrunnelse: null, utbetalt: null }, - refusjon: { utbetalerHeleEllerDeler: true, refusjonPrMnd: 77000 }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['arbeidsgiverperiode', 'inntekt', 'refusjon'] + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: { + perioder: [{ fom: '2023-02-17', tom: '2023-03-04' }], + egenmeldinger: [{ fom: '2023-02-17', tom: '2023-02-19' }], + redusertLoennIAgp: null + }, + + inntekt: { + beloep: 77000, + inntektsdato: '2023-03-15', + naturalytelser: [], + endringAarsak: null + }, + refusjon: { beloepPerMaaned: 77000, sluttdato: null, endringer: [] }, + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); cy.findAllByText('Kvittering - innsendt inntektsmelding').should('be.visible'); diff --git a/cypress/e2e/to-arbeidsforhold.cy.js b/cypress/e2e/to-arbeidsforhold.cy.js index e230b65e..9512d196 100644 --- a/cypress/e2e/to-arbeidsforhold.cy.js +++ b/cypress/e2e/to-arbeidsforhold.cy.js @@ -37,23 +37,21 @@ describe('Utfylling og innsending av skjema', () => { cy.wait('@innsendingInntektsmelding') .its('request.body') .should('deep.equal', { - orgnrUnderenhet: '810007842', - identitetsnummer: '10486535275', - egenmeldingsperioder: [], - fraværsperioder: [ - { fom: '2023-09-04', tom: '2023-09-10' }, - { fom: '2023-09-11', tom: '2023-09-24' } - ], - arbeidsgiverperioder: [{ fom: '2023-09-04', tom: '2023-09-19' }], - inntekt: { bekreftet: true, beregnetInntekt: 45000, manueltKorrigert: false }, - bestemmendeFraværsdag: '2023-08-23', - fullLønnIArbeidsgiverPerioden: { utbetalerFullLønn: true, begrunnelse: null, utbetalt: null }, - refusjon: { utbetalerHeleEllerDeler: false }, - bekreftOpplysninger: true, - behandlingsdager: [], - årsakInnsending: 'Ny', - telefonnummer: '12345678', - forespurtData: ['arbeidsgiverperiode', 'inntekt', 'refusjon'] + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: { + perioder: [{ fom: '2023-09-04', tom: '2023-09-19' }], + egenmeldinger: [], + redusertLoennIAgp: null + }, + + inntekt: { + beloep: 45000, + inntektsdato: '2023-08-23', + naturalytelser: [], + endringAarsak: null + }, + refusjon: null, + avsenderTlf: '12345678' }); cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); cy.findAllByText('Kvittering - innsendt inntektsmelding').should('be.visible'); diff --git a/package.json b/package.json index c0ba9d9f..396f2c22 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "lint-staged": "15.2.7", "msw": "^2.3.1", "next-router-mock": "0.9.13", - "pino-pretty": "11.2.2", + "pino-pretty": "^11.2.2", "prettier": "^3.3.3", "timezone-mock": "^1.3.6", "typescript": "5.5.2", diff --git a/pages/[slug].tsx b/pages/[slug].tsx index 8e5b70cf..05b75722 100644 --- a/pages/[slug].tsx +++ b/pages/[slug].tsx @@ -248,7 +248,7 @@ const Home: NextPage> = ( - + > ] ); - const endringAarsak: EndringAarsak = useBoundStore((state) => state.bruttoinntekt.endringAarsak); + const endringAarsak: EndringAarsak | undefined = useBoundStore((state) => state.bruttoinntekt.endringAarsak); const [senderInn, setSenderInn] = useState(false); const [ingenTilgangOpen, setIngenTilgangOpen] = useState(false); @@ -129,11 +129,11 @@ const Endring: NextPage> : refusjonEndringer; const refusjonPrMnd = !nyInnsending - ? lonnISykefravaeret!.beloep ?? bruttoinntekt?.bruttoInntekt + ? (lonnISykefravaeret!.beloep ?? bruttoinntekt?.bruttoInntekt) : refusjonEndringer ?.filter((endring) => { if (!endring.dato) return false; - return !isAfter(endring.dato, foersteDatoForRefusjon); + return !isAfter(endring.dato, foersteDatoForRefusjon!); }) .map((endring) => { return { @@ -145,11 +145,15 @@ const Endring: NextPage> return a.dato && b.dato ? (a.dato < b.dato ? 1 : -1) : 0; })[0]?.beloep; - const aktiveRefusjonEndringer = nyInnsending - ? refusjonEndringerUtenSkjaeringstidspunkt && refusjonEndringerUtenSkjaeringstidspunkt.length > 0 - ? refusjonEndringerUtenSkjaeringstidspunkt - : [{ beloep: undefined, dato: undefined }] - : refusjonEndringer; + let aktiveRefusjonEndringer; + if (nyInnsending) { + aktiveRefusjonEndringer = + refusjonEndringerUtenSkjaeringstidspunkt && refusjonEndringerUtenSkjaeringstidspunkt.length > 0 + ? refusjonEndringerUtenSkjaeringstidspunkt + : [{ beloep: undefined, dato: undefined }]; + } else { + aktiveRefusjonEndringer = refusjonEndringer; + } const opprinneligRefusjonskravetOpphoererStatus = opprinneligRefusjonskravetOpphoerer?.status; const opprinneligRefusjonskravetOpphoererDato = opprinneligRefusjonskravetOpphoerer?.opphoersdato; @@ -347,7 +351,7 @@ const Endring: NextPage> unregister('inntekt.endringAarsak'); setValue('inntekt.beloep', bruttoinntekt.bruttoInntekt); } - }, [harEndringBruttoloenn, unregister, register, setValue, bruttoinntekt.bruttoInntekt]); + }, [harEndringBruttoloenn, unregister, setValue, bruttoinntekt.bruttoInntekt]); return (
@@ -556,14 +560,6 @@ const Endring: NextPage> export default Endring; -function mapEndringsAarsakPeriodeTilPeriode(skjemaData: z.infer): Periode[] { - return skjemaData.inntekt.endringAarsak.perioder.map((periode) => ({ - fom: parseIsoDate(periode.fom), - tom: parseIsoDate(periode.tom), - id: periode.fom + '-' + periode.tom - })); -} - export function finnFoersteFravaersdag( foreslaattBestemmendeFravaersdag: Date, mottattBestemmendeFravaersdag?: TDateISODate, diff --git a/pages/initiering2/index.tsx b/pages/initiering2/index.tsx index ad34011b..e9f38e6f 100644 --- a/pages/initiering2/index.tsx +++ b/pages/initiering2/index.tsx @@ -12,7 +12,7 @@ import lokalStyles from './initiering.module.css'; import TextLabel from '../../components/TextLabel'; import BannerUtenVelger from '../../components/BannerUtenVelger/BannerUtenVelger'; -import { useRef } from 'react'; +import { useRef, useState } from 'react'; import SelectArbeidsgiver, { ArbeidsgiverSelect } from '../../components/SelectArbeidsgiver/SelectArbeidsgiver'; import FeilListe, { Feilmelding } from '../../components/Feilsammendrag/FeilListe'; import useBoundStore from '../../state/useBoundStore'; @@ -25,9 +25,7 @@ import { SkjemaStatus } from '../../state/useSkjemadataStore'; import { PersonnummerSchema } from '../../validators/validerAapenInnsending'; import formatRHFFeilmeldinger from '../../utils/formatRHFFeilmeldinger'; import PeriodeVelger from '../../components/PeriodeVelger/PeriodeVelger'; -import { PeriodeSchema } from '../../validators/validerFulltSkjema'; import { MottattPeriode } from '../../state/MottattData'; -import parseIsoDate from '../../utils/parseIsoDate'; import { differenceInDays } from 'date-fns'; import isMod11Number from '../../utils/isMod10Number'; import numberOfDaysInRanges from '../../utils/numberOfDaysInRanges'; @@ -42,6 +40,7 @@ const Initiering2: NextPage = () => { const initFravaersperiode = useBoundStore((state) => state.initFravaersperiode); const tilbakestillArbeidsgiverperiode = useBoundStore((state) => state.tilbakestillArbeidsgiverperiode); const router = useRouter(); + const [isLoading, setIsLoading] = useState(false); let arbeidsforhold: ArbeidsgiverSelect[] = []; let perioder: { fom: Date; tom: Date; id: string }[] = []; @@ -49,6 +48,19 @@ const Initiering2: NextPage = () => { let fulltNavn = ''; const backendFeil = useRef([] as Feilmelding[]); + const PeriodeSchema = z + .object({ + fom: z.date({ + required_error: 'Vennligst fyll inn fra dato', + invalid_type_error: 'Dette er ikke en dato' + }), + tom: z.date({ + required_error: 'Vennligst fyll inn til dato', + invalid_type_error: 'Dette er ikke en dato' + }) + }) + .refine((val) => val.fom <= val.tom, { message: 'Fra dato må være før til dato', path: ['fom'] }); + const skjemaSchema = z .object({ organisasjonsnummer: z @@ -98,10 +110,7 @@ const Initiering2: NextPage = () => { } for (let i = 0; i < sortedPerioder.length - 1; i++) { - if ( - Math.abs(differenceInDays(parseIsoDate(sortedPerioder[i].tom), parseIsoDate(sortedPerioder[i + 1].fom))) > - 16 - ) { + if (Math.abs(differenceInDays(sortedPerioder[i].tom, sortedPerioder[i + 1].fom)) > 16) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Det kan ikke være mer enn 16 dager mellom periodene', @@ -137,24 +146,27 @@ const Initiering2: NextPage = () => { organisasjonsnummer: formData.organisasjonsnummer, fulltNavn: mottatteData.data.fulltNavn, personnummer: identitetsnummer, - perioder: formData.perioder.map((periode) => { - return { - fom: parseIsoDate(periode.fom), - tom: parseIsoDate(periode.tom) - }; - }) + perioder: formData.perioder + ? formData.perioder.map((periode) => { + return { + fom: periode.fom, + tom: periode.tom + }; + }) + : [] }; const validationResult = skjema.safeParse(skjemaData); if (validationResult.success) { - const validert = validationResult.data; + setIsLoading(true); + const validerteData = validationResult.data; const orgNavn = arbeidsforhold.find( - (arbeidsgiver) => arbeidsgiver.orgnrUnderenhet === validert.organisasjonsnummer + (arbeidsgiver) => arbeidsgiver.orgnrUnderenhet === validerteData.organisasjonsnummer )?.virksomhetsnavn!; - initPerson(validert.fulltNavn, validert.personnummer, validert.organisasjonsnummer, orgNavn); + initPerson(validerteData.fulltNavn, validerteData.personnummer, validerteData.organisasjonsnummer, orgNavn); setSkjemaStatus(SkjemaStatus.SELVBESTEMT); - initFravaersperiode(validert.perioder as MottattPeriode[]); + initFravaersperiode(validerteData.perioder as MottattPeriode[]); tilbakestillArbeidsgiverperiode(); router.push('/arbeidsgiverInitiertInnsending'); } @@ -274,7 +286,12 @@ const Initiering2: NextPage = () => { -
diff --git a/pages/kvittering/[kvittid].tsx b/pages/kvittering/[kvittid].tsx index 3580e146..b88983c3 100644 --- a/pages/kvittering/[kvittid].tsx +++ b/pages/kvittering/[kvittid].tsx @@ -147,11 +147,11 @@ const Kvittering: NextPage @@ -226,12 +226,7 @@ const Kvittering: NextPageEndret med årsak
{formatBegrunnelseEndringBruttoinntekt(bruttoinntekt.endringAarsak.aarsak as string)} - + )} diff --git a/schema/aapenInnsendingSchema.ts b/schema/aapenInnsendingSchema.ts new file mode 100644 index 00000000..01e781b4 --- /dev/null +++ b/schema/aapenInnsendingSchema.ts @@ -0,0 +1,87 @@ +import { z } from 'zod'; +import { isTlfNumber } from '../utils/isTlfNumber'; +import feiltekster from '../utils/feiltekster'; + +import { + EndringAarsakSchema, + OrganisasjonsnummerSchema, + PersonnummerSchema, + NaturalytelseEnum, + BegrunnelseRedusertLoennIAgp, + PeriodeSchema, + RefusjonEndringSchema +} from '../validators/validerAapenInnsending'; + +const PeriodeListeSchema = z.array(PeriodeSchema).transform((val, ctx) => { + for (let i = 0; i < val.length - 1; i++) { + const tom = new Date(val[i].tom); + const fom = new Date(val[i + 1].fom); + const forskjellMs = Number(tom) - Number(fom); + const forskjellDager = Math.abs(Math.floor(forskjellMs / 1000 / 60 / 60 / 24)); + if (forskjellDager > 16) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: feiltekster.FOR_MANGE_DAGER_MELLOM + }); + } + } + return val; +}); + +const aapenInnsendingSchema = z.object({ + sykmeldtFnr: PersonnummerSchema, + avsender: z.object({ + orgnr: OrganisasjonsnummerSchema, + tlf: z + .string({ + required_error: 'Vennligst fyll inn telefonnummer', + invalid_type_error: 'Dette er ikke et telefonnummer' + }) + .min(8, { message: 'Telefonnummeret er for kort, det må være 8 siffer' }) + .refine((val) => isTlfNumber(val), { message: 'Telefonnummeret er ikke gyldig' }) + }), + sykmeldingsperioder: PeriodeListeSchema, + agp: z.object({ + perioder: z.array(PeriodeSchema), + egenmeldinger: z.union([z.array(PeriodeSchema), z.tuple([])]), + redusertLoennIAgp: z.optional( + z.object({ + beloep: z.number().min(0), + begrunnelse: z.enum(BegrunnelseRedusertLoennIAgp, { + required_error: 'Vennligst velg en årsak til redusert lønn i arbeidsgiverperioden.' + }) + }) + ) + }), + inntekt: z.optional( + z.object({ + beloep: z + .number({ required_error: 'Vennligst angi månedsinntekt' }) + .min(0, 'Månedsinntekt må være større enn eller lik 0'), + inntektsdato: z.string({ required_error: 'Bestemmende fraværsdag mangler' }), + naturalytelser: z.union([ + z.array( + z.object({ + naturalytelse: NaturalytelseEnum, + verdiBeloep: z.number().min(0), + sluttdato: z.date() + }) + ), + z.tuple([]) + ]), + endringAarsak: z.optional(EndringAarsakSchema) + }) + ), + refusjon: z.optional( + z.object({ + beloepPerMaaned: z + .number({ required_error: 'Vennligst angi hvor mye dere refundere per måned' }) + .min(0, 'Refusjonsbeløpet må være større enn eller lik 0'), + endringer: z.union([z.array(RefusjonEndringSchema), z.tuple([])]), + sluttdato: z.date().nullable() + }) + ), + aarsakInnsending: z.enum(['Endring', 'Ny']) +}); + +export default aapenInnsendingSchema; diff --git a/schema/endringAarsakSchema.ts b/schema/endringAarsakSchema.ts new file mode 100644 index 00000000..c28c49fd --- /dev/null +++ b/schema/endringAarsakSchema.ts @@ -0,0 +1,85 @@ +import { z } from 'zod'; +import { PeriodeSchema } from './aapenInnsendingSchema'; + +const EndringAarsakBonusSchema = z.object({ + aarsak: z.literal('Bonus') +}); + +const EndringAarsakFeilregistrertSchema = z.object({ + aarsak: z.literal('Feilregistrert') +}); + +const EndringAarsakFerieSchema = z.object({ + aarsak: z.literal('Ferie'), + ferier: z.array(PeriodeSchema) +}); + +const EndringAarsakFerietrekkSchema = z.object({ + aarsak: z.literal('Ferietrekk') +}); + +const EndringAarsakSammeSomSistSchema = z.object({ + aarsak: z.literal('SammeSomSist') +}); + +const EndringAarsakNyansattSchema = z.object({ + aarsak: z.literal('Nyansatt') +}); + +const EndringAarsakNyStillingSchema = z.object({ + aarsak: z.literal('NyStilling'), + gjelderFra: z.string().date() +}); + +const EndringAarsakNyStillingsprosentSchema = z.object({ + aarsak: z.literal('NyStillingsprosent'), + gjelderFra: z.string().date() +}); + +const EndringAarsakPermisjonSchema = z.object({ + aarsak: z.literal('Permisjon'), + permisjoner: z.array(PeriodeSchema) +}); + +const EndringAarsakPermitteringSchema = z.object({ + aarsak: z.literal('Permittering'), + permitteringer: z.array(PeriodeSchema) +}); + +const EndringAarsakSykefravaerSchema = z.object({ + aarsak: z.literal('Sykefravaer'), + sykefravaer: z.array(PeriodeSchema) +}); + +const EndringAarsakTariffendringSchema = z.object({ + aarsak: z.literal('Tariffendring'), + gjelderFra: z.string().date(), + bleKjent: z.string().date() +}); + +const EndringAarsakVarigLoennsendringSchema = z.object({ + aarsak: z.literal('VarigLoennsendring'), + gjelderFra: z.string().date() +}); + +export const EndringAarsakSchema = z.discriminatedUnion( + 'aarsak', + [ + EndringAarsakBonusSchema, + EndringAarsakFeilregistrertSchema, + EndringAarsakFerieSchema, + EndringAarsakFerietrekkSchema, + EndringAarsakNyansattSchema, + EndringAarsakNyStillingSchema, + EndringAarsakNyStillingsprosentSchema, + EndringAarsakPermisjonSchema, + EndringAarsakPermitteringSchema, + EndringAarsakSykefravaerSchema, + EndringAarsakTariffendringSchema, + EndringAarsakVarigLoennsendringSchema, + EndringAarsakSammeSomSistSchema + ], + { + errorMap: (issue, ctx) => ({ message: 'Vennligst angi årsak for endringen.' }) + } +); diff --git a/schema/fullInnsendingSchema.ts b/schema/fullInnsendingSchema.ts new file mode 100644 index 00000000..716993fb --- /dev/null +++ b/schema/fullInnsendingSchema.ts @@ -0,0 +1,90 @@ +import { z } from 'zod'; +import { isTlfNumber } from '../utils/isTlfNumber'; + +import { NaturalytelseEnum, BegrunnelseRedusertLoennIAgp } from '../validators/validerAapenInnsending'; +import { EndringAarsakSchema } from './endringAarsakSchema'; + +const RefusjonEndringSchema = z.object({ + startdato: z.string({ required_error: 'Vennligst fyll inn dato for endring i refusjon' }).date(), + beloep: z + .number({ required_error: 'Vennligst fyll inn beløpet for endret refusjon.' }) + .min(0, { message: 'Beløpet må være større enn eller lik 0' }) +}); + +const PeriodeSchema = z + .object({ + fom: z + .string({ + required_error: 'Vennligst fyll inn fra dato', + invalid_type_error: 'Dette er ikke en dato' + }) + .date(), + tom: z + .string({ + required_error: 'Vennligst fyll inn til dato', + invalid_type_error: 'Dette er ikke en dato' + }) + .date() + }) + .refine((val) => val.fom <= val.tom, { message: 'Fra dato må være før til dato', path: ['fom'] }); + +const fullInnsendingSchema = z.object({ + forespoerselId: z.string().uuid(), + avsenderTlf: z + .string({ + required_error: 'Vennligst fyll inn telefonnummer', + invalid_type_error: 'Dette er ikke et telefonnummer' + }) + .min(8, { message: 'Telefonnummeret er for kort, det må være 8 siffer' }) + .refine((val) => isTlfNumber(val), { message: 'Telefonnummeret er ikke gyldig' }), + agp: z + .object({ + perioder: z.array(PeriodeSchema), + egenmeldinger: z.union([z.array(PeriodeSchema), z.tuple([])]), + redusertLoennIAgp: z.nullable( + z.object({ + beloep: z.number().min(0), + begrunnelse: z.enum(BegrunnelseRedusertLoennIAgp, { + required_error: 'Vennligst velg en årsak til redusert lønn i arbeidsgiverperioden.' + }) + }) + ) + }) + .nullable(), + inntekt: z.optional( + z.object({ + beloep: z + .number({ required_error: 'Vennligst angi månedsinntekt' }) + .min(0, 'Månedsinntekt må være større enn eller lik 0'), + inntektsdato: z.string({ required_error: 'Bestemmende fraværsdag mangler' }), + naturalytelser: z.union([ + z.array( + z.object({ + naturalytelse: NaturalytelseEnum, + verdiBeloep: z.number().min(0), + sluttdato: z.string().date() + }) + ), + z.tuple([]) + ]), + endringAarsak: z.nullable(EndringAarsakSchema) + }) + ), + refusjon: z.nullable( + z.object({ + beloepPerMaaned: z + .number({ required_error: 'Vennligst angi hvor mye dere refundere per måned' }) + .min(0, 'Refusjonsbeløpet må være større enn eller lik 0'), + endringer: z.union([z.array(RefusjonEndringSchema), z.tuple([])]), + sluttdato: z + .string({ + required_error: 'Vennligst fyll inn til dato', + invalid_type_error: 'Dette er ikke en dato' + }) + .date() + .nullable() + }) + ) +}); + +export default fullInnsendingSchema; diff --git a/schema/initieringSchema.ts b/schema/initieringSchema.ts index 2643d492..2a4d6615 100644 --- a/schema/initieringSchema.ts +++ b/schema/initieringSchema.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import { OrganisasjonsnummerSchema, PersonnummerSchema } from '../validators/validerAapenInnsending'; -import { PeriodeSchema } from '../validators/validerFulltSkjema'; +import { PeriodeSchema } from './aapenInnsendingSchema'; export default z.object({ organisasjonsnummer: OrganisasjonsnummerSchema.refine((val) => val.length < 19, { diff --git a/schema/periodeSchema.ts b/schema/periodeSchema.ts new file mode 100644 index 00000000..5fdfb413 --- /dev/null +++ b/schema/periodeSchema.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; + +export const PeriodeSchema = z.object({ + fom: z + .string({ + required_error: 'Vennligst fyll inn fra dato', + invalid_type_error: 'Dette er ikke en dato' + }) + .date(), + tom: z + .string({ + required_error: 'Vennligst fyll inn til dato', + invalid_type_error: 'Dette er ikke en dato' + }) + .date() +}); diff --git a/state/state.ts b/state/state.ts index 18b87427..59d7f7d5 100644 --- a/state/state.ts +++ b/state/state.ts @@ -1,5 +1,6 @@ +import { z } from 'zod'; import begrunnelseEndringBruttoinntekt from '../components/Bruttoinntekt/begrunnelseEndringBruttoinntekt'; -import { EndringAarsak } from '../validators/validerAapenInnsending'; +import { BegrunnelseRedusertLoennIAgp, EndringAarsak } from '../validators/validerAapenInnsending'; export interface Periode { fom?: Date; @@ -25,9 +26,12 @@ export interface LonnISykefravaeret { beloep?: number; } +const begrunnelseRedusertLoennIAgp = z.enum(BegrunnelseRedusertLoennIAgp); +export type Begrunnelse = z.infer; + export interface LonnIArbeidsgiverperioden { status?: YesNo; - begrunnelse?: string; + begrunnelse?: Begrunnelse; utbetalt?: number | null; } diff --git a/state/useBruttoinntektStore.ts b/state/useBruttoinntektStore.ts index 2c5d96f0..e93260c9 100644 --- a/state/useBruttoinntektStore.ts +++ b/state/useBruttoinntektStore.ts @@ -85,9 +85,9 @@ const useBruttoinntektStore: StateCreator + setEndringsaarsak: (aarsak: string | undefined) => set( produce((state) => { + if (aarsak === '') { + aarsak = undefined; + } if (!state.bruttoinntekt.endringAarsak?.aarsak || state.bruttoinntekt.endringAarsak?.aarsak !== aarsak) { state.bruttoinntekt.endringAarsak = { aarsak: aarsak }; } else { state.bruttoinntekt.endringAarsak.aarsak = aarsak; } - if (aarsak && aarsak !== '') { + if (aarsak && aarsak !== undefined) { state.bruttoinntekt.manueltKorrigert = true; } else { state.bruttoinntekt.manueltKorrigert = false; } - if (aarsak && aarsak !== '') { + if (aarsak && aarsak !== undefined) { state = slettFeilmeldingFraState(state, 'bruttoinntekt-endringsaarsak'); } else { state = leggTilFeilmelding(state, 'bruttoinntekt-endringsaarsak', feiltekster.ENDRINGSAARSAK_MANGLER); @@ -132,10 +135,28 @@ const useBruttoinntektStore: StateCreator + setPerioder: (periode) => { + const aarsak = get().bruttoinntekt.endringAarsak?.aarsak.toLowerCase(); + set( produce((state) => { - state.bruttoinntekt.endringAarsak.perioder = + let aarsakIndex = ''; + switch (aarsak) { + case 'ferie': + aarsakIndex = 'ferier'; + break; + case 'permisjon': + aarsakIndex = 'permisjoner'; + break; + case 'permittering': + aarsakIndex = 'permitteringer'; + break; + default: + aarsakIndex = aarsak!; + break; + } + + state.bruttoinntekt.endringAarsak[aarsakIndex] = periode?.map((periode) => ({ fom: periode.fom, tom: periode.tom @@ -143,7 +164,8 @@ const useBruttoinntektStore: StateCreator set( produce((state) => { @@ -212,17 +234,17 @@ const useBruttoinntektStore: StateCreator state.fravaersperioder); @@ -53,24 +53,18 @@ export default function useFyllAapenInnsending() { }, sykmeldingsperioder: fravaersperioder! .filter((periode) => periode.fom && periode.tom) - .map((periode) => ({ fom: periode!.fom!, tom: periode!.tom! })), + .map((periode) => ({ fom: formatDateForSubmit(periode!.fom!), tom: formatDateForSubmit(periode!.tom!) })), agp: { perioder: arbeidsgiverperioder!.map((periode) => ({ - fom: periode!.fom!, - tom: periode!.tom! + fom: formatDateForSubmit(periode!.fom!), + tom: formatDateForSubmit(periode!.tom!) })), egenmeldinger: egenmeldingsperioder ? egenmeldingsperioder .filter((periode) => periode.fom && periode.tom) - .map((periode) => ({ fom: periode!.fom!, tom: periode!.tom! })) + .map((periode) => ({ fom: formatDateForSubmit(periode!.fom!), tom: formatDateForSubmit(periode!.tom!) })) : [], - redusertLoennIAgp: - fullLonnIArbeidsgiverPerioden?.status === 'Nei' - ? { - beloep: fullLonnIArbeidsgiverPerioden?.utbetalt, - begrunnelse: fullLonnIArbeidsgiverPerioden?.begrunnelse - } - : null + redusertLoennIAgp: formaterRedusertLoennIAgp(fullLonnIArbeidsgiverPerioden) }, inntekt: { beloep: bruttoinntekt.bruttoInntekt!, @@ -79,7 +73,7 @@ export default function useFyllAapenInnsending() { ? naturalytelser?.map((ytelse) => ({ naturalytelse: ytelse.type, verdiBeloep: ytelse.verdi, - sluttdato: ytelse.bortfallsdato + sluttdato: formatDateForSubmit(ytelse.bortfallsdato) })) : [], endringAarsak: endringAarsak ?? null @@ -88,7 +82,9 @@ export default function useFyllAapenInnsending() { lonnISykefravaeret?.status === 'Ja' ? { beloepPerMaaned: lonnISykefravaeret.beloep!, - sluttdato: refusjonskravetOpphoerer?.opphoersdato ?? null, + sluttdato: refusjonskravetOpphoerer?.opphoersdato + ? formatDateForSubmit(refusjonskravetOpphoerer?.opphoersdato) + : null, endringer: konverterRefusjonEndringer(harRefusjonEndringer, refusjonEndringer) } : null, @@ -134,15 +130,15 @@ function finnInnsendbareArbeidsgiverperioder( : []; } -function konverterRefusjonEndringer( +export function konverterRefusjonEndringer( harRefusjonEndringer: YesNo | undefined, refusjonEndringer: Array | undefined ): RefusjonEndring[] | undefined { - const refusjoner = + const refusjoner: RefusjonEndring[] | undefined = harRefusjonEndringer === 'Ja' && refusjonEndringer ? refusjonEndringer.map((endring) => ({ beloep: endring.beloep!, - startdato: endring.dato! + startdato: formatDateForSubmit(endring.dato!) })) : undefined; @@ -152,3 +148,18 @@ function konverterRefusjonEndringer( return []; } } + +export function skalSendeArbeidsgiverperiode(begrunnelse?: Begrunnelse, perioder?: Periode[]): boolean { + if (begrunnelse && (!perioder || perioder.filter((periode) => periode.fom && periode.tom).length === 0)) { + return false; + } + return true; +} + +function formatDateForSubmit(date?: Date | string): string { + if (date instanceof Date) { + return formatIsoDate(date); + } + + return date ?? ''; +} diff --git a/state/useFyllDelvisInnsending.ts b/state/useFyllDelvisInnsending.ts index 7a350907..c62bfe9b 100644 --- a/state/useFyllDelvisInnsending.ts +++ b/state/useFyllDelvisInnsending.ts @@ -1,106 +1,46 @@ -import { isAfter, isValid, parseISO } from 'date-fns'; +import { isAfter, isValid } from 'date-fns'; -import { EndringsBeloep } from '../components/RefusjonArbeidsgiver/RefusjonUtbetalingEndring'; import finnBestemmendeFravaersdag from '../utils/finnBestemmendeFravaersdag'; import formatIsoDate from '../utils/formatIsoDate'; import { Periode, YesNo } from './state'; import useBoundStore from './useBoundStore'; import skjemaVariant from '../config/skjemavariant'; -import { Opplysningstype } from './useForespurtDataStore'; + import { TDateISODate } from './MottattData'; import delvisInnsendingSchema from '../schema/delvisInnsendingSchema'; import { z } from 'zod'; -import { hentBestemmendeFraværsdag } from './useFyllInnsending'; + import parseIsoDate from '../utils/parseIsoDate'; import { finnFoersteFravaersdag } from '../pages/endring/[slug]'; +import fullInnsendingSchema from '../schema/fullInnsendingSchema'; +import { EndringAarsak, RefusjonEndring } from '../validators/validerAapenInnsending'; +import { + formaterOpphørsdato, + konverterPerioderFraMottattTilInterntFormat, + konverterRefusjonEndringer, + verdiEllerBlank, + verdiEllerNull, + formaterRedusertLoennIAgp +} from './useFyllInnsending'; export interface SendtPeriode { fom: TDateISODate; tom: TDateISODate; } -interface FullLonnIArbeidsgiverPerioden { - utbetalerFullLønn: boolean; - begrunnelse?: string | null; - utbetalt?: number | null; -} - -export interface RefusjonEndring { - dato: string; - beløp: number; -} - -interface Refusjon { - utbetalerHeleEllerDeler: boolean; - refusjonPrMnd?: number; - refusjonOpphører?: TDateISODate; - refusjonEndringer?: Array; -} - -interface SendtNaturalytelse { - naturalytelse: string; - dato: string; - beløp: number; -} - -export interface AArsakType { - typpe: string; -} - -export interface Tariffendring extends AArsakType { - gjelderFra: string; - bleKjent: string; -} - -export interface PeriodeListe extends AArsakType { - liste: Array; -} - -export interface StillingsEndring extends AArsakType { - gjelderFra: string; -} - -interface Bruttoinntekt { - bekreftet: boolean; - beregnetInntekt: number; - endringÅrsak?: AArsakType | Tariffendring | PeriodeListe | StillingsEndring; - manueltKorrigert: boolean; -} - -export interface InnsendingSkjema { - identitetsnummer: string; - orgnrUnderenhet: string; - egenmeldingsperioder?: Array; - arbeidsgiverperioder: Array | undefined; - bestemmendeFraværsdag: string; - fraværsperioder: Array; - inntekt: Bruttoinntekt; - fullLønnIArbeidsgiverPerioden?: FullLonnIArbeidsgiverPerioden; - refusjon: Refusjon; - naturalytelser?: Array; - bekreftOpplysninger: boolean; - behandlingsdager?: Array; - årsakInnsending: string; - forespurtData: Array; - telefonnummer: string; -} - export default function useFyllDelvisInnsending() { const fravaersperioder = useBoundStore((state) => state.fravaersperioder); const egenmeldingsperioder = useBoundStore((state) => state.egenmeldingsperioder); - const [identitetsnummer, orgnrUnderenhet] = useBoundStore((state) => [state.identitetsnummer, state.orgnrUnderenhet]); const [fullLonnIArbeidsgiverPerioden] = useBoundStore((state) => [state.fullLonnIArbeidsgiverPerioden]); const naturalytelser = useBoundStore((state) => state.naturalytelser); const arbeidsgiverperioder = useBoundStore((state) => state.arbeidsgiverperioder); const harRefusjonEndringer = useBoundStore((state) => state.harRefusjonEndringer); const refusjonEndringer = useBoundStore((state) => state.refusjonEndringer); - const nyInnsending = useBoundStore((state) => state.nyInnsending); const hentPaakrevdOpplysningstyper = useBoundStore((state) => state.hentPaakrevdOpplysningstyper); const skjaeringstidspunkt = useBoundStore((state) => state.skjaeringstidspunkt); const setSkalViseFeilmeldinger = useBoundStore((state) => state.setSkalViseFeilmeldinger); - const inngangFraKvittering = useBoundStore((state) => state.inngangFraKvittering); const arbeidsgiverKanFlytteSkjæringstidspunkt = useBoundStore( (state) => state.arbeidsgiverKanFlytteSkjæringstidspunkt ); @@ -120,8 +60,9 @@ export default function useFyllDelvisInnsending() { ); type SkjemaData = z.infer; + type FullInnsending = z.infer; - return (skjema: SkjemaData): InnsendingSkjema => { + return (skjema: SkjemaData, forespoerselId: string): FullInnsending => { const harEgenmeldingsdager = sjekkOmViHarEgenmeldingsdager(egenmeldingsperioder); const RefusjonUtbetalingEndringUtenGammelBFD = skjema.refusjon.refusjonEndringer @@ -141,7 +82,7 @@ export default function useFyllDelvisInnsending() { ? harRefusjonEndringer === 'Ja' : skjema.refusjon.erDetEndringRefusjon === 'Ja'; - const innsendingRefusjonEndringer: Array | undefined = konverterRefusjonsendringer( + const innsendingRefusjonEndringer: Array | undefined = konverterRefusjonEndringer( harRefusjonEndringerTilInnsending ? 'Ja' : 'Nei', RefusjonUtbetalingEndringUtenGammelBFD ); @@ -151,7 +92,7 @@ export default function useFyllDelvisInnsending() { const forespurtData = hentPaakrevdOpplysningstyper(); const skalSendeArbeidsgiverperiode = forespurtData.includes(skjemaVariant.arbeidsgiverperiode); - const skalSendeNaturalytelser = forespurtData.includes(skjemaVariant.arbeidsgiverperiode); + // const skalSendeNaturalytelser = forespurtData.includes(skjemaVariant.arbeidsgiverperiode); const perioder = concatPerioder(fravaersperioder, egenmeldingsperioder); @@ -184,100 +125,56 @@ export default function useFyllDelvisInnsending() { setForeslaattBestemmendeFravaersdag(bestemmendeFraværsdagTilInnsending); - const aarsakInnsending = nyEllerEndring(nyInnsending); // Kan være Ny eller Endring - - const endringAarsak = + const endringAarsak: EndringAarsak | null = skjema.inntekt.endringAarsak?.aarsak && skjema.inntekt.endringAarsak?.aarsak !== 'SammeSomSist' + ? skjema.inntekt.endringAarsak + : null; + + const skjemaData: FullInnsending = { + forespoerselId, + agp: skalSendeArbeidsgiverperiode ? { - ...skjema.inntekt.endringAarsak, - liste: skjema.inntekt.endringAarsak?.perioder ?? undefined, - typpe: - skjema.inntekt.endringAarsak?.aarsak === 'VarigLoennsendring' - ? 'VarigLonnsendring' - : skjema.inntekt.endringAarsak?.aarsak, - aarsak: undefined, - perioder: undefined + perioder: innsendbarArbeidsgiverperioder, + egenmeldinger: harEgenmeldingsdager + ? egenmeldingsperioder!.map((periode) => ({ + fom: formatIsoDate(periode.fom) as TDateISODate, + tom: formatIsoDate(periode.tom) as TDateISODate + })) + : [], + redusertLoennIAgp: formaterRedusertLoennIAgp(fullLonnIArbeidsgiverPerioden) } - : undefined; - - const manueltKorrigertInntekt = - !!skjema.inntekt.endringAarsak?.aarsak && skjema.inntekt.endringAarsak?.aarsak !== 'SammeSomSist'; - - const skjemaData: InnsendingSkjema = { - orgnrUnderenhet: orgnrUnderenhet!, - identitetsnummer: identitetsnummer!, - egenmeldingsperioder: harEgenmeldingsdager - ? egenmeldingsperioder!.map((periode) => ({ - fom: formatIsoDate(periode.fom) as TDateISODate, - tom: formatIsoDate(periode.tom) as TDateISODate - })) - : [], - fraværsperioder: fravaersperioder!.map((periode) => ({ - fom: formatIsoDate(periode.fom) as TDateISODate, - tom: formatIsoDate(periode.tom) as TDateISODate - })), - arbeidsgiverperioder: innsendbarArbeidsgiverperioder, + : null, inntekt: { - bekreftet: true, - beregnetInntekt: skjema.inntekt.beloep!, - manueltKorrigert: manueltKorrigertInntekt, - endringÅrsak: endringAarsak - }, - bestemmendeFraværsdag: bestemmendeFraværsdag!, - fullLønnIArbeidsgiverPerioden: { - utbetalerFullLønn: fullLonnIArbeidsgiverPerioden?.status === 'Ja', - begrunnelse: fullLonnIArbeidsgiverPerioden?.status === 'Ja' ? null : fullLonnIArbeidsgiverPerioden?.begrunnelse, - utbetalt: fullLonnIArbeidsgiverPerioden?.status === 'Ja' ? null : fullLonnIArbeidsgiverPerioden?.utbetalt - }, - refusjon: { - utbetalerHeleEllerDeler: skjema.refusjon.kreverRefusjon === 'Ja', - refusjonPrMnd: skjema.refusjon.refusjonPrMnd ?? 0, - refusjonOpphører: formaterOpphørsdato( - skjema.refusjon.kravetOpphoerer as YesNo, - skjema.refusjon.refusjonOpphoerer! - ), - - refusjonEndringer: harRefusjonEndringerTilInnsending ? innsendingRefusjonEndringer : undefined + beloep: skjema.inntekt.beloep!, + inntektsdato: bestemmendeFraværsdag!, + naturalytelser: naturalytelser + ? naturalytelser?.map((ytelse) => ({ + naturalytelse: verdiEllerBlank(ytelse.type), + sluttdato: formatIsoDate(ytelse.bortfallsdato) as string, + verdiBeloep: verdiEllerNull(ytelse.verdi) + })) + : [], + endringAarsak: endringAarsak }, - naturalytelser: naturalytelser?.map((ytelse) => ({ - naturalytelse: verdiEllerBlank(ytelse.type), - dato: formatIsoDate(ytelse.bortfallsdato), - beløp: verdiEllerNull(ytelse.verdi) - })), - bekreftOpplysninger: skjema.opplysningerBekreftet, - behandlingsdager: [], - årsakInnsending: aarsakInnsending, // Kan også være Ny eller Endring - telefonnummer: skjema.telefon || '', - forespurtData: forespurtData + refusjon: + skjema.refusjon.kreverRefusjon === 'Ja' + ? { + beloepPerMaaned: skjema.refusjon.refusjonPrMnd ?? 0, + sluttdato: formaterOpphørsdato( + skjema.refusjon.kravetOpphoerer as YesNo, + skjema.refusjon.refusjonOpphoerer! + ), + + endringer: harRefusjonEndringerTilInnsending ? innsendingRefusjonEndringer : [] + } + : null, + avsenderTlf: skjema.telefon || '' }; - const paakrevdeData = forespurtData; - - if (!paakrevdeData.includes(skjemaVariant.arbeidsgiverperiode)) { - delete skjemaData.fullLønnIArbeidsgiverPerioden; - } - - if (!skalSendeNaturalytelser) { - delete skjemaData.naturalytelser; - } - return skjemaData; }; } -function formaterOpphørsdato(kravetOpphoerer: YesNo, refusjonskravetOpphoerer: Date): TDateISODate | undefined { - const formatertDato = - kravetOpphoerer === 'Ja' && refusjonskravetOpphoerer ? formatIsoDate(refusjonskravetOpphoerer) : undefined; - if (formatertDato) { - return formatertDato; - } - return undefined; -} - -function nyEllerEndring(nyInnsending: boolean) { - return nyInnsending ? 'Ny' : 'Endring'; -} - function concatPerioder(fravaersperioder: Periode[] | undefined, egenmeldingsperioder: Periode[] | undefined) { let perioder; if (fravaersperioder) { @@ -288,20 +185,6 @@ function concatPerioder(fravaersperioder: Periode[] | undefined, egenmeldingsper return perioder; } -function konverterPerioderFraMottattTilInterntFormat(innsendbarArbeidsgiverperioder: SendtPeriode[] | undefined) { - return innsendbarArbeidsgiverperioder - ? innsendbarArbeidsgiverperioder?.map((periode) => ({ - fom: parseISO(periode.fom), - tom: parseISO(periode.tom), - id: 'id' - })) - : undefined; -} - -function jaEllerNei(velger: YesNo | undefined, returverdi: any): any | undefined { - return velger === 'Ja' ? returverdi : undefined; -} - function finnInnsendbareArbeidsgiverperioder( arbeidsgiverperioder: Periode[] | undefined, skalSendeArbeidsgiverperiode: boolean @@ -317,35 +200,6 @@ function finnInnsendbareArbeidsgiverperioder( : []; } -function verdiEllerBlank(verdi: string | undefined): string { - return verdi ?? ''; -} - -function verdiEllerNull(verdi: number | undefined): number { - return verdi ?? 0; -} - -function konverterRefusjonsendringer( - harRefusjonEndringer: YesNo | undefined, - refusjonEndringer: Array | undefined -): RefusjonEndring[] | undefined { - const refusjoner = - harRefusjonEndringer === 'Ja' && refusjonEndringer - ? refusjonEndringer - .filter((endring) => endring.dato) - .map((endring) => ({ - beløp: endring.beloep!, - dato: formatIsoDate(endring.dato)! - })) - : undefined; - - if (refusjoner && refusjoner.length > 0) { - return refusjoner; - } else { - return undefined; - } -} - function sjekkOmViHarEgenmeldingsdager(egenmeldingsperioder: Array | undefined) { return ( egenmeldingsperioder && diff --git a/state/useFyllInnsending.ts b/state/useFyllInnsending.ts index ff2cba93..75a63447 100644 --- a/state/useFyllInnsending.ts +++ b/state/useFyllInnsending.ts @@ -1,14 +1,22 @@ -import { isAfter, isValid, parseISO } from 'date-fns'; -import begrunnelseEndringBruttoinntekt from '../components/Bruttoinntekt/begrunnelseEndringBruttoinntekt'; +import { isValid, parseISO } from 'date-fns'; import { EndringsBeloep } from '../components/RefusjonArbeidsgiver/RefusjonUtbetalingEndring'; import finnBestemmendeFravaersdag from '../utils/finnBestemmendeFravaersdag'; import formatIsoDate from '../utils/formatIsoDate'; -import { Periode, RefusjonskravetOpphoerer, YesNo } from './state'; +import { LonnIArbeidsgiverperioden, Periode, YesNo } from './state'; import useBoundStore from './useBoundStore'; import skjemaVariant from '../config/skjemavariant'; import { Opplysningstype } from './useForespurtDataStore'; import { TDateISODate } from './MottattData'; import parseIsoDate from '../utils/parseIsoDate'; +import { + BegrunnelseRedusertLoennIAgp, + EndringAarsak, + EndringAarsakSchema, + RefusjonEndring +} from '../validators/validerAapenInnsending'; +import { z } from 'zod'; +import fullInnsendingSchema from '../schema/fullInnsendingSchema'; +import { skalSendeArbeidsgiverperiode } from './useFyllAapenInnsending'; export interface SendtPeriode { fom: TDateISODate; @@ -21,11 +29,6 @@ interface FullLonnIArbeidsgiverPerioden { utbetalt?: number | null; } -export interface RefusjonEndring { - dato: string; - beløp: number; -} - interface Refusjon { utbetalerHeleEllerDeler: boolean; refusjonPrMnd?: number; @@ -86,7 +89,6 @@ export default function useFyllInnsending() { const bruttoinntekt = useBoundStore((state) => state.bruttoinntekt); const egenmeldingsperioder = useBoundStore((state) => state.egenmeldingsperioder); - const [identitetsnummer, orgnrUnderenhet] = useBoundStore((state) => [state.identitetsnummer, state.orgnrUnderenhet]); const [fullLonnIArbeidsgiverPerioden, lonnISykefravaeret, refusjonskravetOpphoerer] = useBoundStore((state) => [ state.fullLonnIArbeidsgiverPerioden, state.lonnISykefravaeret, @@ -94,89 +96,40 @@ export default function useFyllInnsending() { ]); const naturalytelser = useBoundStore((state) => state.naturalytelser); - const behandlingsdager = useBoundStore((state) => state.behandlingsdager); - const arbeidsgiverperioder = useBoundStore((state) => state.arbeidsgiverperioder); const harRefusjonEndringer = useBoundStore((state) => state.harRefusjonEndringer); const refusjonEndringer = useBoundStore((state) => state.refusjonEndringer); const innsenderTelefonNr = useBoundStore((state) => state.innsenderTelefonNr); - const nyInnsending = useBoundStore((state) => state.nyInnsending); const hentPaakrevdOpplysningstyper = useBoundStore((state) => state.hentPaakrevdOpplysningstyper); const skjaeringstidspunkt = useBoundStore((state) => state.skjaeringstidspunkt); - const gammeltSkjaeringstidspunkt = useBoundStore((state) => state.gammeltSkjaeringstidspunkt); + // const gammeltSkjaeringstidspunkt = useBoundStore((state) => state.gammeltSkjaeringstidspunkt); const setSkalViseFeilmeldinger = useBoundStore((state) => state.setSkalViseFeilmeldinger); const inngangFraKvittering = useBoundStore((state) => state.inngangFraKvittering); const arbeidsgiverKanFlytteSkjæringstidspunkt = useBoundStore( (state) => state.arbeidsgiverKanFlytteSkjæringstidspunkt ); const bestemmendeFravaersdag = useBoundStore((state) => state.bestemmendeFravaersdag); + type FullInnsending = z.infer; - return (opplysningerBekreftet: boolean): InnsendingSkjema => { - const endringAarsak = (): AArsakType | Tariffendring | PeriodeListe | StillingsEndring | undefined => { - if (!bruttoinntekt?.endringAarsak?.aarsak || bruttoinntekt?.endringAarsak?.aarsak === '') return undefined; - switch (bruttoinntekt.endringAarsak.aarsak) { - case begrunnelseEndringBruttoinntekt.Tariffendring: - return { - typpe: bruttoinntekt.endringAarsak.aarsak, - gjelderFra: formatIsoDate(bruttoinntekt?.endringAarsak?.gjelderFra), - bleKjent: formatIsoDate(bruttoinntekt?.endringAarsak?.bleKjent) - }; - - case begrunnelseEndringBruttoinntekt.Ferie: - case begrunnelseEndringBruttoinntekt.Permisjon: - case begrunnelseEndringBruttoinntekt.Permittering: - case begrunnelseEndringBruttoinntekt.Sykefravaer: - return { - typpe: bruttoinntekt.endringAarsak.aarsak, - liste: bruttoinntekt?.endringAarsak?.perioder.map((periode) => ({ - fom: formatIsoDate(periode.fom), - tom: formatIsoDate(periode.tom) - })) - }; - - case begrunnelseEndringBruttoinntekt.VarigLoennsendring: - return { - typpe: 'VarigLonnsendring', // TODO: Dette er en feil i koden, skal være VarigLoennsendring når vi får rettet opp i dette - gjelderFra: formatIsoDate(bruttoinntekt?.endringAarsak?.gjelderFra) - }; - case begrunnelseEndringBruttoinntekt.NyStilling: - case begrunnelseEndringBruttoinntekt.NyStillingsprosent: - return { - typpe: bruttoinntekt.endringAarsak.aarsak, - gjelderFra: formatIsoDate(bruttoinntekt?.endringAarsak?.gjelderFra) - }; - - default: - return { - typpe: bruttoinntekt.endringAarsak.aarsak - }; - } - }; - - const harEgenmeldingsdager = sjekkOmViHarEgenmeldingsdager(egenmeldingsperioder); - const RefusjonUtbetalingEndringUtenGammelBFD = gammeltSkjaeringstidspunkt - ? refusjonEndringer?.filter((endring) => { - return endring.dato && isAfter(endring.dato, gammeltSkjaeringstidspunkt); - }) - : refusjonEndringer; - - const innsendingRefusjonEndringer: Array | undefined = konverterRefusjonsendringer( - harRefusjonEndringer, - RefusjonUtbetalingEndringUtenGammelBFD - ); + return (opplysningerBekreftet: boolean, forespoerselId: string): FullInnsending => { + const endringAarsak: EndringAarsak | null = + bruttoinntekt.endringAarsak !== null && + bruttoinntekt.endringAarsak?.aarsak !== undefined && + bruttoinntekt.endringAarsak?.aarsak !== '' + ? bruttoinntekt.endringAarsak + : null; setSkalViseFeilmeldinger(true); const forespurtData = hentPaakrevdOpplysningstyper(); - const skalSendeArbeidsgiverperiode = forespurtData.includes(skjemaVariant.arbeidsgiverperiode); - const skalSendeNaturalytelser = forespurtData.includes(skjemaVariant.arbeidsgiverperiode); + const harForespurtArbeidsgiverperiode = forespurtData.includes(skjemaVariant.arbeidsgiverperiode); const perioder = concatPerioder(fravaersperioder, egenmeldingsperioder); const innsendbarArbeidsgiverperioder: Array | [] = finnInnsendbareArbeidsgiverperioder( arbeidsgiverperioder, - skalSendeArbeidsgiverperiode + harForespurtArbeidsgiverperiode ); const formatertePerioder = konverterPerioderFraMottattTilInterntFormat(innsendbarArbeidsgiverperioder); @@ -194,7 +147,7 @@ export default function useFyllInnsending() { ); const bestemmendeFraværsdag = hentBestemmendeFraværsdag( - skalSendeArbeidsgiverperiode, + harForespurtArbeidsgiverperiode, perioder, formatertePerioder, skjaeringstidspunkt, @@ -204,69 +157,57 @@ export default function useFyllInnsending() { beregnetSkjaeringstidspunkt ); - const kreverIkkeRefusjon = lonnISykefravaeret?.status === 'Nei'; - const aarsakInnsending = nyEllerEndring(nyInnsending); // Kan være Ny eller Endring - const skjemaData: InnsendingSkjema = { - orgnrUnderenhet: orgnrUnderenhet!, - identitetsnummer: identitetsnummer!, - egenmeldingsperioder: harEgenmeldingsdager - ? egenmeldingsperioder!.map((periode) => ({ - fom: formatIsoDate(periode.fom), - tom: formatIsoDate(periode.tom) - })) - : [], - fraværsperioder: fravaersperioder!.map((periode) => ({ - fom: formatIsoDate(periode.fom), - tom: formatIsoDate(periode.tom) - })), - arbeidsgiverperioder: innsendbarArbeidsgiverperioder, - inntekt: { - bekreftet: true, - beregnetInntekt: bruttoinntekt.bruttoInntekt!, - manueltKorrigert: verdiEllerFalse(bruttoinntekt.manueltKorrigert), - endringÅrsak: endringAarsak() - }, - bestemmendeFraværsdag: bestemmendeFraværsdag!, - fullLønnIArbeidsgiverPerioden: { - utbetalerFullLønn: fullLonnIArbeidsgiverPerioden?.status === 'Ja', - begrunnelse: fullLonnIArbeidsgiverPerioden?.status === 'Ja' ? null : fullLonnIArbeidsgiverPerioden?.begrunnelse, - utbetalt: fullLonnIArbeidsgiverPerioden?.status === 'Ja' ? null : fullLonnIArbeidsgiverPerioden?.utbetalt + const endringAarsakParsed = endringAarsak ? EndringAarsakSchema.parse(endringAarsak) : null; + console.log('fullLonnIArbeidsgiverPerioden', fullLonnIArbeidsgiverPerioden); + const skjemaData: FullInnsending = { + forespoerselId, + agp: { + perioder: + skalSendeArbeidsgiverperiode(fullLonnIArbeidsgiverPerioden?.begrunnelse, arbeidsgiverperioder) && + arbeidsgiverperioder + ? arbeidsgiverperioder.map((periode) => ({ + fom: formatIsoDate(periode.fom!), + tom: formatIsoDate(periode.tom!) + })) + : [], + egenmeldinger: egenmeldingsperioder + ? egenmeldingsperioder + .filter((periode) => periode.fom && periode.tom) + .map((periode) => ({ fom: formatIsoDate(periode!.fom!), tom: formatIsoDate(periode!.tom!) })) + : [], + redusertLoennIAgp: formaterRedusertLoennIAgp(fullLonnIArbeidsgiverPerioden) }, - refusjon: { - utbetalerHeleEllerDeler: !kreverIkkeRefusjon, - refusjonPrMnd: !kreverIkkeRefusjon ? lonnISykefravaeret?.beloep : undefined, - refusjonOpphører: formaterOpphørsdato(kreverIkkeRefusjon, refusjonskravetOpphoerer), - - refusjonEndringer: !kreverIkkeRefusjon ? innsendingRefusjonEndringer : undefined + inntekt: { + beloep: bruttoinntekt.bruttoInntekt!, + inntektsdato: bestemmendeFraværsdag!, // Skjæringstidspunkt? e.l. + // manueltKorrigert: verdiEllerFalse(bruttoinntekt.manueltKorrigert), + naturalytelser: naturalytelser + ? naturalytelser?.map((ytelse) => ({ + naturalytelse: verdiEllerBlank(ytelse.type), + sluttdato: formatIsoDate(ytelse.bortfallsdato), + verdiBeloep: verdiEllerNull(ytelse.verdi) + })) + : [], + endringAarsak: endringAarsakParsed }, - naturalytelser: naturalytelser?.map((ytelse) => ({ - naturalytelse: verdiEllerBlank(ytelse.type), - dato: formatIsoDate(ytelse.bortfallsdato), - beløp: verdiEllerNull(ytelse.verdi) - })), - bekreftOpplysninger: opplysningerBekreftet, - behandlingsdager: behandlingsdager ? behandlingsdager.map((dag) => formatIsoDate(dag)) : [], - årsakInnsending: aarsakInnsending, - telefonnummer: innsenderTelefonNr || '', - forespurtData: forespurtData + refusjon: + lonnISykefravaeret?.status === 'Ja' + ? { + beloepPerMaaned: lonnISykefravaeret.beloep!, + sluttdato: formaterOpphørsdato(refusjonskravetOpphoerer?.status, refusjonskravetOpphoerer?.opphoersdato), + + endringer: konverterRefusjonEndringer(harRefusjonEndringer, refusjonEndringer) + } + : null, + avsenderTlf: innsenderTelefonNr ?? '' }; - const paakrevdeData = forespurtData; - - if (!paakrevdeData.includes(skjemaVariant.arbeidsgiverperiode)) { - delete skjemaData.fullLønnIArbeidsgiverPerioden; - } - - if (!skalSendeNaturalytelser) { - delete skjemaData.naturalytelser; - } - return skjemaData; }; } export function hentBestemmendeFraværsdag( - skalSendeArbeidsgiverperiode: boolean, + harForespurtArbeidsgiverperiode: boolean, perioder: Periode[] | undefined, formatertePerioder: { fom: Date; tom: Date; id: string }[] | undefined, skjaeringstidspunkt: Date | undefined, @@ -281,7 +222,7 @@ export function hentBestemmendeFraværsdag( ); } - return skalSendeArbeidsgiverperiode + return harForespurtArbeidsgiverperiode ? finnBestemmendeFravaersdag( perioder, formatertePerioder, @@ -293,21 +234,6 @@ export function hentBestemmendeFraværsdag( : formatIsoDate(beregnetSkjaeringstidspunkt); } -function formaterOpphørsdato( - kreverIkkeRefusjon: boolean, - refusjonskravetOpphoerer: RefusjonskravetOpphoerer | undefined -): string | undefined { - let opphørsdato; - if (!kreverIkkeRefusjon && refusjonskravetOpphoerer?.status === 'Ja' && refusjonskravetOpphoerer?.opphoersdato) { - opphørsdato = formatIsoDate(refusjonskravetOpphoerer?.opphoersdato); - } - return opphørsdato; -} - -function nyEllerEndring(nyInnsending: boolean) { - return nyInnsending ? 'Ny' : 'Endring'; -} - function concatPerioder(fravaersperioder: Periode[] | undefined, egenmeldingsperioder: Periode[] | undefined) { let perioder; if (fravaersperioder) { @@ -318,7 +244,9 @@ function concatPerioder(fravaersperioder: Periode[] | undefined, egenmeldingsper return perioder; } -function konverterPerioderFraMottattTilInterntFormat(innsendbarArbeidsgiverperioder: SendtPeriode[] | undefined) { +export function konverterPerioderFraMottattTilInterntFormat( + innsendbarArbeidsgiverperioder: SendtPeriode[] | undefined +) { return innsendbarArbeidsgiverperioder ? innsendbarArbeidsgiverperioder?.map((periode) => ({ fom: parseISO(periode.fom), @@ -330,9 +258,9 @@ function konverterPerioderFraMottattTilInterntFormat(innsendbarArbeidsgiverperio function finnInnsendbareArbeidsgiverperioder( arbeidsgiverperioder: Periode[] | undefined, - skalSendeArbeidsgiverperiode: boolean + harForespurtArbeidsgiverperiode: boolean ): SendtPeriode[] | [] { - if (!skalSendeArbeidsgiverperiode) { + if (!harForespurtArbeidsgiverperiode) { return []; } @@ -343,40 +271,52 @@ function finnInnsendbareArbeidsgiverperioder( : []; } -function verdiEllerFalse(verdi: boolean | undefined): boolean { - return verdi ?? false; -} - -function verdiEllerBlank(verdi: string | undefined): string { +export function verdiEllerBlank(verdi: string | undefined): string { return verdi ?? ''; } -function verdiEllerNull(verdi: number | undefined): number { +export function verdiEllerNull(verdi: number | undefined): number { return verdi ?? 0; } -function konverterRefusjonsendringer( +export function konverterRefusjonEndringer( harRefusjonEndringer: YesNo | undefined, refusjonEndringer: Array | undefined -): RefusjonEndring[] | undefined { +): RefusjonEndring[] | [] { const refusjoner = harRefusjonEndringer === 'Ja' && refusjonEndringer ? refusjonEndringer.map((endring) => ({ - beløp: endring.beloep!, - dato: formatIsoDate(endring.dato)! + beloep: endring.beloep!, + startdato: formatIsoDate(endring.dato) })) - : undefined; + : []; if (refusjoner && refusjoner.length > 0) { return refusjoner; } else { - return undefined; + return []; } } -function sjekkOmViHarEgenmeldingsdager(egenmeldingsperioder: Array | undefined) { - return ( - egenmeldingsperioder && - (egenmeldingsperioder.length > 1 || (egenmeldingsperioder[0]?.fom && egenmeldingsperioder[0]?.tom)) - ); +export function formaterOpphørsdato( + kravetOpphoerer: YesNo | undefined, + refusjonskravetOpphoerer: Date | undefined +): TDateISODate | null { + const formatertDato = + kravetOpphoerer === 'Ja' && refusjonskravetOpphoerer ? formatIsoDate(refusjonskravetOpphoerer) : null; + if (formatertDato) { + return formatertDato; + } + return null; +} + +export function formaterRedusertLoennIAgp( + fullLonnIArbeidsgiverPerioden: LonnIArbeidsgiverperioden | undefined +): { beloep: number; begrunnelse: string } | null { + return fullLonnIArbeidsgiverPerioden?.begrunnelse !== undefined + ? { + beloep: fullLonnIArbeidsgiverPerioden.utbetalt ?? 0, + begrunnelse: fullLonnIArbeidsgiverPerioden.begrunnelse + } + : null; } diff --git a/state/useRefusjonArbeidsgiverStore.ts b/state/useRefusjonArbeidsgiverStore.ts index 3d1d3e4e..c3dd38b5 100644 --- a/state/useRefusjonArbeidsgiverStore.ts +++ b/state/useRefusjonArbeidsgiverStore.ts @@ -109,10 +109,10 @@ const useRefusjonArbeidsgiverStore: StateCreator compareAsc(a.fom, b.fom)) + sammenhengendeAgp.concat(overskytendeFravaersperioder).toSorted((a, b) => compareAsc(a.fom!, b.fom!)) ); const bestemmendeFravaersdag = dagerEtterAgp[dagerEtterAgp.length - 1].fom; diff --git a/utils/useSendInnArbeidsgiverInitiertSkjema.ts b/utils/useSendInnArbeidsgiverInitiertSkjema.ts index 5eb344e3..ea5fea40 100644 --- a/utils/useSendInnArbeidsgiverInitiertSkjema.ts +++ b/utils/useSendInnArbeidsgiverInitiertSkjema.ts @@ -64,6 +64,10 @@ export default function useSendInnArbeidsgiverInitiertSkjema( } const validerteData = fyllAapenInnsending(skjemaData); let hasErrors = validerteData.success !== true; + if (validerteData.success !== true) { + logger.error('Feil ved validering av skjema - Åpen innsending'); + console.log(validerteData); + } if ((validerteData.data?.inntekt?.beloep ?? 0) < (validerteData.data?.agp?.redusertLoennIAgp?.beloep ?? 0)) { hasErrors = true; diff --git a/utils/useSendInnDelvisSkjema.ts b/utils/useSendInnDelvisSkjema.ts index 2067dded..eba4f40b 100644 --- a/utils/useSendInnDelvisSkjema.ts +++ b/utils/useSendInnDelvisSkjema.ts @@ -1,6 +1,5 @@ import useBoundStore from '../state/useBoundStore'; import logEvent from './logEvent'; -import { InnsendingSkjema } from '../state/useFyllInnsending'; import isValidUUID from './isValidUUID'; import environment from '../config/environment'; import useErrorRespons, { ErrorResponse } from './useErrorResponse'; @@ -10,6 +9,8 @@ import { logger } from '@navikt/next-logger'; import useFyllDelvisInnsending from '../state/useFyllDelvisInnsending'; import { UseFormSetError } from 'react-hook-form'; import validerDelvisInntektsmelding from './validerDelvisInntektsmelding'; +import { z } from 'zod'; +import fullInnsendingSchema from '../schema/fullInnsendingSchema'; export default function useSendInnDelvisSkjema( innsendingFeiletIngenTilgang: (feilet: boolean) => void, @@ -36,10 +37,6 @@ export default function useSendInnDelvisSkjema( component: amplitudeComponent }); - logger.info('Innsending uten endringer i skjema'); - - // setError('knapp-innsending', { message: 'Innsending feilet, det er ikke gjort endringer i skjema.' }); - const errors: Array = [ { value: 'Innsending av skjema feilet', @@ -70,7 +67,20 @@ export default function useSendInnDelvisSkjema( return false; } - const skjemaData: InnsendingSkjema = fyllInnsending(form); + const delvisInnsendingSchema = fullInnsendingSchema.omit({ + forespoerselId: true + }); + + type DelvisInnsending = z.infer; + + const skjemaData: DelvisInnsending = fyllInnsending(form, pathSlug); + + const validerteData = delvisInnsendingSchema.safeParse(skjemaData); + + if (validerteData.success === false) { + logger.error('Feil ved validering ved innsending av skjema med id ', pathSlug); + console.log(validerteData); + } fyllFeilmeldinger([]); diff --git a/utils/useSendInnSkjema.ts b/utils/useSendInnSkjema.ts index bab009f4..cebc686e 100644 --- a/utils/useSendInnSkjema.ts +++ b/utils/useSendInnSkjema.ts @@ -7,6 +7,8 @@ import useErrorRespons, { ErrorResponse } from './useErrorResponse'; import { useRouter } from 'next/navigation'; import { logger } from '@navikt/next-logger'; import validerInntektsmelding from './validerInntektsmelding'; +import fullInnsendingSchema from '../schema/fullInnsendingSchema'; +import { z } from 'zod'; export default function useSendInnSkjema( innsendingFeiletIngenTilgang: (feilet: boolean) => void, @@ -66,7 +68,16 @@ export default function useSendInnSkjema( component: amplitudeComponent }); } else { - const skjemaData: InnsendingSkjema = fyllInnsending(opplysningerBekreftet); + type FullInnsending = z.infer; + + const skjemaData: FullInnsending = fyllInnsending(opplysningerBekreftet, pathSlug); + + const validerteData = fullInnsendingSchema.safeParse(skjemaData); + + if (validerteData.success === false) { + console.log(validerteData); + logger.error('Feil ved validering ved innsending av skjema med id ', pathSlug); + } fyllFeilmeldinger([]); diff --git a/utils/validerInntektsmelding.ts b/utils/validerInntektsmelding.ts index a511051c..efee7017 100644 --- a/utils/validerInntektsmelding.ts +++ b/utils/validerInntektsmelding.ts @@ -112,7 +112,7 @@ export default function validerInntektsmelding( state.lonnISykefravaeret, state.refusjonskravetOpphoerer, state.bruttoinntekt.bruttoInntekt, - !state.nyInnsending + false // TODO: Hva er dette? Og hvorfor var den satt til !state.nyInnsending? ); feilkoderEndringAvMaanedslonn = valdiderEndringAvMaanedslonn( diff --git a/utils/zodAlwaysRefine.ts b/utils/zodAlwaysRefine.ts deleted file mode 100644 index 4422e15e..00000000 --- a/utils/zodAlwaysRefine.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from 'zod'; - -export default function zodAlwaysRefine(zodType: T) { - return z.any().superRefine(async (value, ctx) => { - const res = await zodType.safeParseAsync(value); - - if (res.success === false) - for (const issue of res.error.issues) { - ctx.addIssue(issue); - } - }) as unknown as T; -} diff --git a/validators/validerAapenInnsending.ts b/validators/validerAapenInnsending.ts index 885f5748..a8c71b18 100644 --- a/validators/validerAapenInnsending.ts +++ b/validators/validerAapenInnsending.ts @@ -3,7 +3,8 @@ import isFnrNumber from '../utils/isFnrNumber'; import isMod11Number from '../utils/isMod10Number'; import { isTlfNumber } from '../utils/isTlfNumber'; import feiltekster from '../utils/feiltekster'; -import zodAlwaysRefine from '../utils/zodAlwaysRefine'; +import parseIsoDate from '../utils/parseIsoDate'; +import { RefusjonEndringSchema } from '../schema/aapenInnsendingSchema'; export const NaturalytelseEnum = z.enum([ 'AKSJERGRUNNFONDSBEVISTILUNDERKURS', @@ -60,20 +61,7 @@ export const InntektEndringAarsakEnum = z.enum([ 'VarigLoennsendring' ]); -const leftPad = (val: number) => { - return val < 10 ? `0${val}` : val; -}; - -export const toLocalIso = (val: Date) => { - return `${val.getFullYear()}-${leftPad(val.getMonth() + 1)}-${leftPad(val.getDate())}`; -}; - -const datoManglerFeilmelding = { - required_error: 'Vennligst fyll inn fra dato', - invalid_type_error: 'Dette er ikke en dato' -}; - -const SykPeriodeSchema = z +export const PeriodeSchema = z .object({ fom: z .date({ @@ -90,43 +78,47 @@ const SykPeriodeSchema = z }) .refine((val) => val.fom <= val.tom, { message: 'Fra dato må være før til dato', path: ['fom'] }); -const SykPeriodeListeSchema = z.array(SykPeriodeSchema).transform((val, ctx) => { - for (let i = 0; i < val.length - 1; i++) { - const tom = new Date(val[i].tom); - const fom = new Date(val[i + 1].fom); - const forskjellMs = Number(tom) - Number(fom); - const forskjellDager = Math.abs(Math.floor(forskjellMs / 1000 / 60 / 60 / 24)); - if (forskjellDager > 16) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: feiltekster.FOR_MANGE_DAGER_MELLOM - }); - } - } - return val; +export const RefusjonEndringSchema = z.object({ + startDato: z + .date({ required_error: 'Vennligst fyll inn dato for endring i refusjon' }) + .transform((val) => toLocalIso(val)), + beloep: z + .number({ required_error: 'Vennligst fyll inn beløpet for endret refusjon.' }) + .min(0, { message: 'Beløpet må være større enn eller lik 0' }) }); -const PeriodeSchema = z +const leftPad = (val: number) => { + return val < 10 ? `0${val}` : val; +}; + +export const toLocalIso = (val: Date) => { + return `${val.getFullYear()}-${leftPad(val.getMonth() + 1)}-${leftPad(val.getDate())}`; +}; + +const datoManglerFeilmelding = { + required_error: 'Vennligst fyll inn fra dato', + invalid_type_error: 'Dette er ikke en dato' +}; + +const SykPeriodeSchema = z .object({ fom: z - .date({ - required_error: 'Vennligst fyll inn fra dato', - invalid_type_error: 'Dette er ikke en dato' + .string({ + required_error: 'Vennligst fyll inn fra dato' }) - .transform((val) => toLocalIso(val)), + .date(), tom: z - .date({ - required_error: 'Vennligst fyll inn til dato', - invalid_type_error: 'Dette er ikke en dato' + .string({ + required_error: 'Vennligst fyll inn til dato' }) - .transform((val) => toLocalIso(val)) + .date() }) .refine((val) => val.fom <= val.tom, { message: 'Fra dato må være før til dato', path: ['fom'] }); -const PeriodeListeSchema = z.array(PeriodeSchema).transform((val, ctx) => { +const SykPeriodeListeSchema = z.array(SykPeriodeSchema).transform((val, ctx) => { for (let i = 0; i < val.length - 1; i++) { - const tom = new Date(val[i].tom); - const fom = new Date(val[i + 1].fom); + const tom = parseIsoDate(val[i].tom); + const fom = parseIsoDate(val[i + 1].fom); const forskjellMs = Number(tom) - Number(fom); const forskjellDager = Math.abs(Math.floor(forskjellMs / 1000 / 60 / 60 / 24)); if (forskjellDager > 16) { @@ -138,6 +130,7 @@ const PeriodeListeSchema = z.array(PeriodeSchema).transform((val, ctx) => { } return val; }); + const DatoValideringSchema = z.date(datoManglerFeilmelding).transform((val) => toLocalIso(val)); export const PersonnummerSchema = z @@ -174,7 +167,7 @@ const EndringAarsakFeilregistrertSchema = z.object({ const EndringAarsakFerieSchema = z.object({ aarsak: z.literal('Ferie'), - perioder: z.array(PeriodeSchema) + ferier: z.array(PeriodeSchema) }); const EndringAarsakFerietrekkSchema = z.object({ @@ -201,17 +194,17 @@ const EndringAarsakNyStillingsprosentSchema = z.object({ const EndringAarsakPermisjonSchema = z.object({ aarsak: z.literal('Permisjon'), - perioder: z.array(PeriodeSchema) + permisjoner: z.array(PeriodeSchema) }); const EndringAarsakPermitteringSchema = z.object({ aarsak: z.literal('Permittering'), - perioder: z.array(PeriodeSchema) + permitteringer: z.array(PeriodeSchema) }); const EndringAarsakSykefravaerSchema = z.object({ aarsak: z.literal('Sykefravaer'), - perioder: z.array(PeriodeSchema) + sykefravaer: z.array(PeriodeSchema) }); const EndringAarsakTariffendringSchema = z.object({ @@ -255,15 +248,6 @@ export const telefonNummerSchema = z .min(8, { message: 'Telefonnummeret er for kort, det må være 8 siffer' }) .refine((val) => isTlfNumber(val), { message: 'Telefonnummeret er ikke gyldig' }); -const RefusjonEndringSchema = z.object({ - startdato: z - .date({ required_error: 'Vennligst fyll inn dato for endring i refusjon' }) - .transform((val) => toLocalIso(val)), - beloep: z - .number({ required_error: 'Vennligst fyll inn beløpet for endret refusjon.' }) - .min(0, { message: 'Beløpet må være større enn eller lik 0' }) -}); - const schema = z .object({ sykmeldtFnr: PersonnummerSchema, @@ -316,7 +300,6 @@ const schema = z z.array(RefusjonEndringSchema), z.tuple([], { errorMap: (error) => { - console.log(error); if (error.code === 'too_big') { return { message: 'Vennligst fyll inn endringer i refusjonsbeløpet i perioden' }; } @@ -324,20 +307,13 @@ const schema = z } }) ]), - sluttdato: z - .date() - .transform((val) => toLocalIso(val)) - .nullable() + sluttdato: z.nullable(z.string().date()) }) .nullable(), aarsakInnsending: z.enum(['Endring', 'Ny']) }) .superRefine((val, ctx) => { - if ( - val.inntekt?.beloep && - val.agp?.redusertLoennIAgp?.beloep && - val.inntekt?.beloep < val.agp?.redusertLoennIAgp?.beloep - ) { + if (val.inntekt?.beloep && val.refusjon?.beloepPerMaaned && val.inntekt?.beloep < val.refusjon?.beloepPerMaaned) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Refusjonsbeløpet per måned må være lavere eller lik månedsinntekt.', diff --git a/validators/validerBruttoinntekt.ts b/validators/validerBruttoinntekt.ts index 39744ab3..4768e147 100644 --- a/validators/validerBruttoinntekt.ts +++ b/validators/validerBruttoinntekt.ts @@ -72,13 +72,13 @@ export default function validerBruttoinntekt(state: CompleteState): Array toLocalIso(val)), - tom: z - .date({ - required_error: 'Vennligst fyll inn til dato', - invalid_type_error: 'Dette er ikke en dato' - }) - .transform((val) => toLocalIso(val)) - }) - .refine((val) => val.fom <= val.tom, { message: 'Fra dato må være før til dato', path: ['fom'] }); +type FullInnsending = z.infer; -const PeriodeListeSchema = z.array(PeriodeSchema).transform((val, ctx) => { - for (let i = 0; i < val.length - 1; i++) { - const tom = new Date(val[i].tom); - const fom = new Date(val[i + 1].fom); - const forskjellMs = Number(tom) - Number(fom); - const forskjellDager = Math.abs(Math.floor(forskjellMs / 1000 / 60 / 60 / 24)); - if (forskjellDager > 16) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: feiltekster.FOR_MANGE_DAGER_MELLOM - }); - } - } - return val; -}); - -export const RefusjonEndringSchema = z.object({ - startDato: z - .date({ required_error: 'Vennligst fyll inn dato for endring i refusjon' }) - .transform((val) => toLocalIso(val)), - beloep: z - .number({ required_error: 'Vennligst fyll inn beløpet for endret refusjon.' }) - .min(0, { message: 'Beløpet må være større enn eller lik 0' }) -}); - -const schema = z.object({ - sykmeldtFnr: PersonnummerSchema, - avsender: z.object({ - orgnr: OrganisasjonsnummerSchema, - tlf: z - .string({ - required_error: 'Vennligst fyll inn telefonnummer', - invalid_type_error: 'Dette er ikke et telefonnummer' - }) - .min(8, { message: 'Telefonnummeret er for kort, det må være 8 siffer' }) - .refine((val) => isTlfNumber(val), { message: 'Telefonnummeret er ikke gyldig' }) - }), - sykmeldingsperioder: PeriodeListeSchema, - agp: z.object({ - perioder: z.array(PeriodeSchema), - egenmeldinger: z.union([z.array(PeriodeSchema), z.tuple([])]), - redusertLoennIAgp: z.optional( - z.object({ - beloep: z.number().min(0), - begrunnelse: z.enum(BegrunnelseRedusertLoennIAgp, { - required_error: 'Vennligst velg en årsak til redusert lønn i arbeidsgiverperioden.' - }) - }) - ) - }), - inntekt: z.optional( - z.object({ - beloep: z - .number({ required_error: 'Vennligst angi månedsinntekt' }) - .min(0, 'Månedsinntekt må være større enn eller lik 0'), - inntektsdato: z.string({ required_error: 'Bestemmende fraværsdag mangler' }), - naturalytelser: z.union([ - z.array( - z.object({ - naturalytelse: NaturalytelseEnum, - verdiBeloep: z.number().min(0), - sluttdato: z.date() - }) - ), - z.tuple([]) - ]), - endringAarsak: z.optional(EndringAarsakSchema) - }) - ), - refusjon: z.optional( - z.object({ - beloepPerMaaned: z - .number({ required_error: 'Vennligst angi hvor mye dere refundere per måned' }) - .min(0, 'Refusjonsbeløpet må være større enn eller lik 0'), - endringer: z.union([z.array(RefusjonEndringSchema), z.tuple([])]), - sluttdato: z.date().nullable() - }) - ), - aarsakInnsending: z.enum(['Endring', 'Ny']) -}); - -type AapenInnsending = z.infer; - -export default function validerFulltSkjema(data: Partial) { - return schema.safeParse(data); +export default function validerFulltSkjema(data: Partial) { + return fullInnsendingSchema.safeParse(data); } diff --git a/validators/validerLonnUnderSykefravaeret.ts b/validators/validerLonnUnderSykefravaeret.ts index 4ba7bd45..d82f990e 100644 --- a/validators/validerLonnUnderSykefravaeret.ts +++ b/validators/validerLonnUnderSykefravaeret.ts @@ -59,7 +59,7 @@ function validerBelop(refusjon: LonnISykefravaeret, errorStatus: ValiderResultat if (typeof refusjon.beloep === 'undefined') { errorStatus.push({ code: LonnUnderSykefravaeretFeilkode.LONN_UNDER_SYKEFRAVAERET_BELOP, - felt: 'lus-input' + felt: 'refusjon.beloepPerMaaned' }); } } @@ -72,7 +72,7 @@ function validerMaksimaltBelop( if (refusjon.beloep && bruttoInntekt && bruttoInntekt < refusjon.beloep) { errorStatus.push({ code: LonnUnderSykefravaeretFeilkode.BELOP_OVERSTIGER_BRUTTOINNTEKT, - felt: 'lus-input' + felt: 'refusjon.beloepPerMaaned' }); } } diff --git a/yarn.lock b/yarn.lock index a67debe7..09ffa06f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3391,17 +3391,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001579": - version: 1.0.30001584 - resolution: "caniuse-lite@npm:1.0.30001584" - checksum: 10c0/9f353d7b14ea218bf90f9aa908947be1119f3744bb4080aeef59dd2fbca2ca663a6eecad29deba41f7d02ef9f516240353809f31208396a1ec9824b515467d87 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001610 - resolution: "caniuse-lite@npm:1.0.30001610" - checksum: 10c0/015956a0bf2e3e233da3dc00c5632bbb4d416bcd6ced2f839e33e45b197a856234f97cb046e7427b83d7e3a3d6df314dfab1c86eb9d970970e00ad85a50b4933 +"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001587": + version: 1.0.30001646 + resolution: "caniuse-lite@npm:1.0.30001646" + checksum: 10c0/ecdd87c08cd63fa32e11311dfa3543a52613b0b99498b6fe6f2c66af65cc27e2f7436fa5b2bc2bcf72174448a7670715b284d420de838bcf3e811864371a2465 languageName: node linkType: hard @@ -7955,7 +7948,7 @@ __metadata: languageName: node linkType: hard -"pino-pretty@npm:11.2.2": +"pino-pretty@npm:^11.2.2": version: 11.2.2 resolution: "pino-pretty@npm:11.2.2" dependencies: @@ -9061,7 +9054,7 @@ __metadata: next-http-proxy-middleware: "npm:1.2.6" next-router-mock: "npm:0.9.13" pino: "npm:9.2.0" - pino-pretty: "npm:11.2.2" + pino-pretty: "npm:^11.2.2" prettier: "npm:^3.3.3" react: "npm:18.3.1" react-dom: "npm:18.3.1"