Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fikser bug i visning av uføregradinfo #2792

Merged
merged 18 commits into from
Sep 25, 2024
2 changes: 1 addition & 1 deletion cypress/e2e/alle_tester.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import './run-0/slett_kvittering_feiler.cy'
import './run-0/sortering_av_soknader.cy'
import './run-0/yrkesskade.cy'
import './run-0/selvstendig-naringsdrivende.cy'
import './run-0/gammel-oppsummering.cy'

import './run-1/delvis-utfylt-reisetilskudd.cy'
import './run-1/delvis-utfylt-soknad.cy'
Expand All @@ -23,7 +24,6 @@ import './run-1/korrigering-ferie-spm-infotekst.cy'
import './run-1/utkast-korrigering.cy'
import './run-1/over-sytti.cy'
import './run-1/tilbakedatert.cy'
import './run-1/gammel-oppsummering.cy'

import './run-2/datovelger_komp.cy'
import './run-2/endring-uten-endring.cy'
Expand Down
88 changes: 65 additions & 23 deletions src/components/sporsmal/typer/radio-timer-prosent.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { Alert, BodyLong, BodyShort, Radio, RadioGroup, ReadMore } from '@navikt/ds-react'
import React from 'react'
import { Controller, useFormContext } from 'react-hook-form'
import { Controller, useFormContext, useWatch } from 'react-hook-form'

import { Soknad } from '../../../types/types'
import { rodeUkeDagerIPerioden } from '../../../utils/helligdager-utils'
import { hentUndersporsmal } from '../../../utils/soknad-utils'
import { hentSporsmal, hentUndersporsmal } from '../../../utils/soknad-utils'
import validerArbeidsgrad from '../../../utils/sporsmal/valider-arbeidsgrad'
import { getLedetekst, tekst } from '../../../utils/tekster'
import Vis from '../../vis'
Expand All @@ -12,6 +13,58 @@ import { hentFeilmelding } from '../sporsmal-utils'
import UndersporsmalListe from '../undersporsmal/undersporsmal-liste'
import { useSoknadMedDetaljer } from '../../../hooks/useSoknadMedDetaljer'

interface TimerProsentAlertProps {
valgtSoknad: Soknad
beregnGradNy: (
hvorMyeTimerVerdi: string,
jobberDuNormalArbeidsuke: string,
hvorMangeTimerPerUke: string,
) => number | undefined
}

const TimerProsentAlert = ({ valgtSoknad, beregnGradNy }: TimerProsentAlertProps) => {
const { control } = useFormContext()

const relevantTagList = ['HVOR_MYE_TIMER_VERDI', 'JOBBER_DU_NORMAL_ARBEIDSUKE', 'HVOR_MANGE_TIMER_PER_UKE']

const tagToIdMap = new Map<string, string>()
relevantTagList.forEach((tag) => {
const sporsmalId = hentSporsmal(valgtSoknad, tag)?.id
if (sporsmalId) {
tagToIdMap.set(tag, sporsmalId)
}
})

const hvorMyeTimerVerdi = useWatch({
control,
name: tagToIdMap.get('HVOR_MYE_TIMER_VERDI') || '',
})
const jobberDuNormalArbeidsuke = useWatch({
control,
name: tagToIdMap.get('JOBBER_DU_NORMAL_ARBEIDSUKE') || '',
})
const hvorMangeTimerPerUke = useWatch({
control,
name: tagToIdMap.get('HVOR_MANGE_TIMER_PER_UKE') || '',
})

const beregnetGrad = beregnGradNy(hvorMyeTimerVerdi, jobberDuNormalArbeidsuke, hvorMangeTimerPerUke)

return (
<div>
{beregnetGrad !== undefined && (
<Alert variant="info" style={{ marginTop: '1rem' }}>
<BodyShort>
{getLedetekst(tekst('sykepengesoknad.jobb-underveis-timer-i-prosent'), {
'%PROSENT%': Math.round(beregnetGrad * 100),
})}
</BodyShort>
</Alert>
)}
</div>
)
}

const RadioTimerProsent = ({ sporsmal }: SpmProps) => {
const {
formState: { errors },
Expand All @@ -23,17 +76,20 @@ const RadioTimerProsent = ({ sporsmal }: SpmProps) => {
watchRadio = getValues(sporsmal.id)
}

// watchTimer er lagt inn for å rendre prosent-alerten
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const watchTimer = watch(hentUndersporsmal(sporsmal!, 'HVOR_MYE_TIMER_VERDI')!.id)
const timerId = hentUndersporsmal(sporsmal, 'HVOR_MYE_TIMER_VERDI_0')?.id
let watchTimer = timerId ? watch(timerId) : undefined
if (watchTimer === undefined && timerId) {
watchTimer = getValues(timerId)
}
const errorTimer = errors[hentUndersporsmal(sporsmal!, 'HVOR_MYE_TIMER_VERDI')!.id]

const feilmelding = hentFeilmelding(sporsmal)
const { valgtSoknad } = useSoknadMedDetaljer()

const { validerGrad, beregnGrad } = validerArbeidsgrad(sporsmal)
const { beregnGradNy } = validerArbeidsgrad(sporsmal)

const lavereProsentHjelpTittel = tekst('ekspanderbarhjelp.prosenten_lavere_enn_forventet_arbeidstaker.tittel')

return (
<>
<Controller
Expand Down Expand Up @@ -67,23 +123,9 @@ const RadioTimerProsent = ({ sporsmal }: SpmProps) => {
)
})}

<Vis
hvis={
watchRadio?.toLowerCase() === 'timer' &&
beregnGrad?.() &&
beregnGrad() !== Infinity &&
validerGrad!() == true
}
render={() => (
<Alert variant="info" style={{ marginTop: '1rem' }}>
<BodyShort>
{getLedetekst(tekst('sykepengesoknad.jobb-underveis-timer-i-prosent'), {
'%PROSENT%': Math.floor(beregnGrad!() * 100),
})}
</BodyShort>
</Alert>
)}
/>
{valgtSoknad && sporsmal.undersporsmal.length > 0 && beregnGradNy && (
<TimerProsentAlert valgtSoknad={valgtSoknad} beregnGradNy={beregnGradNy} />
)}

<Vis
hvis={errorTimer && rodeUkeDagerIPerioden(valgtSoknad!.fom, valgtSoknad!.tom)}
Expand Down
4 changes: 4 additions & 0 deletions src/utils/soknad-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ export const flattenSporsmal = (sporsmal: ReadonlyArray<Sporsmal>) => {
return flatArr
}

export const hentSporsmalMedId = (soknad: Soknad, id: string): Sporsmal | undefined => {
return flattenSporsmal(soknad.sporsmal).find((spm) => spm.id === id)
}

export const hentSporsmal = (soknad: Soknad, tag: string): Sporsmal | undefined => {
return flattenSporsmal(soknad.sporsmal).find((spm) => spm.tag === tag)
}
Expand Down
43 changes: 42 additions & 1 deletion src/utils/sporsmal/valider-arbeidsgrad.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,47 @@ const useValiderArbeidsgrad = (sporsmal: Sporsmal) => {
: true
}

const beregnGradNy = (
hvorMyeTimerVerdi: string,
jobberDuNormalArbeidsuke: string,
hvorMangeTimerPerUke: string,
) => {
const faktiskeSykedager =
valgtSoknad.soknadstype === RSSoknadstype.ARBEIDSTAKERE
? sykedagerForArbeidstakere()
: sykedagerForFrilansere()
const dagerIPeriode = faktiskeSykedager.length

const uker = dagerIPeriode / 5

function timerPerUkeVanligvis() {
if (jobberDuNormalArbeidsuke === 'JA') {
return 37.5
}
if (hvorMangeTimerPerUke !== '') {
return parseFloat(hvorMangeTimerPerUke)
}
// vi kan ikke regne ut arbeidsgrad hvis bruker ikke har svart her
return undefined
}

function timerDennePerioden() {
if (hvorMyeTimerVerdi !== '') {
return parseFloat(hvorMyeTimerVerdi)
}
// vi beregner ikke arbeidsgrad hvis bruker oppgir prosent eller ikke enda har opgitt antall timer
return undefined
}
const timerPerUke = timerPerUkeVanligvis()
const faktiskTimer = timerDennePerioden()

if (!faktiskTimer || !timerPerUke) {
return undefined
} else {
return faktiskTimer / uker / timerPerUke
}
}

const beregnGrad = () => {
const values = getValues()
const timerPerUkeId = hentUndersporsmal(hovedSporsmal!, 'HVOR_MANGE_TIMER_PER_UKE')!.id
Expand All @@ -88,7 +129,7 @@ const useValiderArbeidsgrad = (sporsmal: Sporsmal) => {
return faktiskTimer / uker / timerPerUke
}

return { beregnGrad, validerGrad, periode, hovedSporsmal }
return { beregnGrad, validerGrad, periode, hovedSporsmal, beregnGradNy }
}

export default useValiderArbeidsgrad
Loading