From 81ad1668361320a7ce7c3531a2d958f48f5e6dab Mon Sep 17 00:00:00 2001 From: Kent Fjellstad Date: Tue, 17 Dec 2024 14:04:35 +0100 Subject: [PATCH 1/2] Tillat at man kan kreve refusjon, selv omm inntekten er 0. Kan komme fra f.eks foreldrepenger --- .../valideringDelvisInnsendingSchema.test.ts | 30 +++++ cypress/e2e/delvis-ingen-inntekt.cy.js | 106 ++++++++++++++++++ pages/endring/[slug].tsx | 2 +- schema/valideringDelvisInnsendingSchema.ts | 6 +- 4 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 cypress/e2e/delvis-ingen-inntekt.cy.js diff --git a/__tests__/schema/valideringDelvisInnsendingSchema.test.ts b/__tests__/schema/valideringDelvisInnsendingSchema.test.ts index 1c3dafa1a..e1d8ad5ce 100644 --- a/__tests__/schema/valideringDelvisInnsendingSchema.test.ts +++ b/__tests__/schema/valideringDelvisInnsendingSchema.test.ts @@ -164,5 +164,35 @@ describe.concurrent('valideringDelvisInnsendingSchema', () => { expect(result.error.issues[0].path).toEqual(['refusjon', 'refusjonPrMnd']); }); + it('should return OK if kreverRefusjon is Ja and refusjonPrMnd higher than inntekt, and inntekt is 0', () => { + const invalidInput = { + inntekt: { + endringBruttoloenn: 'Ja', + beloep: 0, + endringAarsak: { aarsak: 'Feilregistrert' } + }, + telefon: '+4712345678', + opplysningerBekreftet: true, + refusjon: { + erDetEndringRefusjon: 'Ja', + kreverRefusjon: 'Ja', + harEndringer: 'Ja', + refusjonPrMnd: 4000, + refusjonEndringer: [ + { + beloep: 2000, + dato: new Date('2022-01-01') + } + ], + kravetOpphoerer: 'Ja', + refusjonOpphoerer: new Date('2022-12-31') + } + }; + + const result = valideringDelvisInnsendingSchema.safeParse(invalidInput); + + expect(result.success).toBe(true); + }); + // Add more test cases as needed }); diff --git a/cypress/e2e/delvis-ingen-inntekt.cy.js b/cypress/e2e/delvis-ingen-inntekt.cy.js new file mode 100644 index 000000000..fac097d67 --- /dev/null +++ b/cypress/e2e/delvis-ingen-inntekt.cy.js @@ -0,0 +1,106 @@ +/// + +describe('Delvis skjema - Endre inntekt til 0', () => { + beforeEach(() => { + // Cypress starts out with a blank slate for each test + // so we must tell it to visit our website with the `cy.visit()` command. + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + // const now = new Date(2021, 3, 14); // month is 0-indexed + // cy.clock(now); + // cy.visit('http://localhost:3000/im-dialog/12345678-3456-5678-2457-123456789012'); + // cy.intercept('/im-dialog/api/hent-forespoersel', { fixture: '../../mockdata/trenger-delvis.json' }).as('hent-forespoersel'); + cy.intercept('/im-dialog/api/hentKvittering/12345678-3456-5678-2457-123456789012', { + statusCode: 404, + body: { + name: 'Nothing' + } + }).as('kvittering'); + }); + + it('Changes and submit', () => { + cy.visit('http://localhost:3000/im-dialog/12345678-3456-5678-2457-123456789012'); + cy.intercept('/im-dialog/api/hent-forespoersel', { fixture: '../../mockdata/trenger-delvis.json' }).as( + 'hent-forespoersel' + ); + cy.intercept('/im-dialog/api/innsendingInntektsmelding', { + statusCode: 201, + body: { + name: 'Nothing' + } + }).as('innsendingInntektsmelding'); + + cy.wait('@hent-forespoersel'); + + cy.location('pathname').should('equal', '/im-dialog/endring/12345678-3456-5678-2457-123456789012'); + + cy.findByRole('group', { + name: 'Har det vært endringer i beregnet månedslønn for den ansatte mellom 02.01.2023 og 25.02.2023 (start av nytt sykefravær)?' + }) + .findByLabelText('Ja') + .check(); + + cy.findByLabelText('Månedsinntekt 25.02.2023').invoke('val').should('equal', '46000'); + cy.findByLabelText('Månedsinntekt 25.02.2023').clear().type('0'); + + cy.findByRole('group', { + name: 'Er det endringer i refusjonskravet etter 25.02.2023 (start av nytt sykefravær)?' + }) + .findByLabelText('Ja') + .check(); + + cy.findByLabelText('Telefon innsender').type('12345678'); + + cy.findByLabelText('Jeg bekrefter at opplysningene jeg har gitt, er riktige og fullstendige.').check(); + + cy.findByRole('button', { name: 'Send' }).click(); + + cy.findAllByText('Vennligst angi årsak for endringen.').should('be.visible'); + cy.findAllByLabelText('Velg endringsårsak').select('Mangelfull eller uriktig rapportering til a-ordningen'); + + cy.findByRole('group', { name: 'Betaler arbeidsgiver lønn og krever refusjon etter arbeidsgiverperioden?' }) + .findByLabelText('Ja') + .check(); + + cy.findByRole('group', { name: 'Opphører refusjonkravet i perioden?' }).findByLabelText('Nei').check(); + + cy.findByRole('button', { name: 'Send' }).click(); + + cy.wait('@innsendingInntektsmelding') + .its('request.body') + .should('deep.equal', { + forespoerselId: '12345678-3456-5678-2457-123456789012', + agp: null, + inntekt: { + beloep: 0, + inntektsdato: '2023-02-25', + naturalytelser: [], + endringAarsak: { aarsak: 'Feilregistrert' } + }, + refusjon: { + beloepPerMaaned: 46000, + sluttdato: null, + endringer: [ + { + beloep: 0, + startdato: '2023-09-30' + } + ] + }, + avsenderTlf: '12345678' + }); + + cy.location('pathname').should('equal', '/im-dialog/kvittering/12345678-3456-5678-2457-123456789012'); + cy.findAllByText('Kvittering - innsendt inntektsmelding').should('be.visible'); + + cy.findByText('12345678').should('be.visible'); + cy.findByText(/Mangelfull eller uriktig rapportering til a-ordningen/).should('be.visible'); + cy.findAllByText(/0,00\s?kr\/måned/).should('be.visible'); + cy.findByText(/46\s?000,00\s?kr\/måned/).should('be.visible'); + cy.findAllByText('24.01.2023').should('not.exist'); + + cy.get('[data-cy="bestemmendefravaersdag"]') + .invoke('text') + .should('match', /25.02.2023/); + }); +}); diff --git a/pages/endring/[slug].tsx b/pages/endring/[slug].tsx index 23a1ec0ac..3536d623b 100644 --- a/pages/endring/[slug].tsx +++ b/pages/endring/[slug].tsx @@ -262,7 +262,7 @@ const Endring: NextPage> const submitForm: SubmitHandler = (skjemaData: Skjema) => { setSenderInn(true); - if (skjemaData.inntekt.beloep) { + if (skjemaData.inntekt.beloep !== undefined) { setBareNyMaanedsinntekt(skjemaData.inntekt.beloep.toString()); } diff --git a/schema/valideringDelvisInnsendingSchema.ts b/schema/valideringDelvisInnsendingSchema.ts index c717f7b08..dd4a74cba 100644 --- a/schema/valideringDelvisInnsendingSchema.ts +++ b/schema/valideringDelvisInnsendingSchema.ts @@ -83,7 +83,11 @@ export default z }); } - if ((value.inntekt.beloep ?? 0) < (value.refusjon.refusjonPrMnd ?? 0)) { + if ( + (value.inntekt.beloep ?? 0) < (value.refusjon.refusjonPrMnd ?? 0) && + value.inntekt.beloep !== undefined && + value.inntekt.beloep !== 0 + ) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Refusjon kan ikke være høyere enn brutto lønn.', From d2e13689ee4e7fc08d4dd3408cb1095ed2d83085 Mon Sep 17 00:00:00 2001 From: Kent Fjellstad Date: Thu, 19 Dec 2024 16:39:05 +0100 Subject: [PATCH 2/2] =?UTF-8?q?Sperre=20for=20refusjon=20h=C3=B8yere=20enn?= =?UTF-8?q?=20inntekten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- schema/valideringDelvisInnsendingSchema.ts | 12 +++++ utils/mapErrorsObjectToFeilmeldinger.ts | 51 +++++++++++++--------- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/schema/valideringDelvisInnsendingSchema.ts b/schema/valideringDelvisInnsendingSchema.ts index dd4a74cba..9e1fe6435 100644 --- a/schema/valideringDelvisInnsendingSchema.ts +++ b/schema/valideringDelvisInnsendingSchema.ts @@ -94,4 +94,16 @@ export default z path: ['refusjon', 'refusjonPrMnd'] }); } + + if (value.refusjon.harEndringer === 'Ja') { + value.refusjon.refusjonEndringer?.map((endring, index) => { + if ((endring.beloep ?? 0) > (value.inntekt?.beloep ?? 0) && value.inntekt.beloep !== 0) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Refusjon kan ikke være høyere enn brutto lønn.', + path: ['refusjon', 'refusjonEndringer', index, 'beloep'] + }); + } + }); + } }); diff --git a/utils/mapErrorsObjectToFeilmeldinger.ts b/utils/mapErrorsObjectToFeilmeldinger.ts index da111f420..c8428c725 100644 --- a/utils/mapErrorsObjectToFeilmeldinger.ts +++ b/utils/mapErrorsObjectToFeilmeldinger.ts @@ -1,30 +1,39 @@ +import isObject from './isObject'; + export default function mapErrorsObjectToFeilmeldinger(errors) { const mapErrorsObject = (errors: any, subKey = ''): any[] => { - return Object.keys(errors).flatMap((key) => { - if (typeof errors[key] === 'string') { + if (isObject(errors)) { + return Object.keys(errors).flatMap((key) => { + if (typeof errors[key] === 'string') { + return { + key: subKey ? `${subKey}.${key}` : key, + message: errors[key] + }; + } + + if (!errors[key]?.message) { + return mapErrorsObject(errors[key], subKey ? `${subKey}.${key}` : key); + } + return { key: subKey ? `${subKey}.${key}` : key, - message: errors[key] + message: errors[key]?.message }; - } - - if (!errors[key].message) { - return mapErrorsObject(errors[key], subKey ? `${subKey}.${key}` : key); - } - - return { - key: subKey ? `${subKey}.${key}` : key, - message: errors[key].message - }; - }); + }); + } }; const errorsMapped = mapErrorsObject(errors); - const feilmeldinger = errorsMapped.map((error) => { - return { - felt: error.key, - text: error.message - }; - }); - return feilmeldinger; + let feilmeldinger = []; + if (Array.isArray(errorsMapped)) { + feilmeldinger = errorsMapped.map((error) => { + if (error) { + return { + felt: error.key, + text: error.message + }; + } + }); + } + return feilmeldinger.filter((melding) => !!melding); }