diff --git a/apps/web/screens/Organization/SocialInsuranceAdministration/PensionCalculator.tsx b/apps/web/screens/Organization/SocialInsuranceAdministration/PensionCalculator.tsx index af85afcd89db..143a47f3b0de 100644 --- a/apps/web/screens/Organization/SocialInsuranceAdministration/PensionCalculator.tsx +++ b/apps/web/screens/Organization/SocialInsuranceAdministration/PensionCalculator.tsx @@ -1,4 +1,4 @@ -import { PropsWithChildren, useMemo, useState } from 'react' +import { PropsWithChildren, useEffect, useMemo, useState } from 'react' import { Controller, FormProvider, useForm } from 'react-hook-form' import { useIntl } from 'react-intl' import add from 'date-fns/add' @@ -57,6 +57,8 @@ import { convertToQueryParams, extractSlug, getDateOfCalculationsOptions, + is2025FormPreviewActive, + NEW_SYSTEM_TAKES_PLACE_DATE, } from './utils' import * as styles from './PensionCalculator.css' @@ -70,7 +72,10 @@ const hasDisabilityAssessment = ( ) => { return ( typeOfBasePension === BasePensionType.Disability || - typeOfBasePension === BasePensionType.Rehabilitation + typeOfBasePension === BasePensionType.Rehabilitation || + typeOfBasePension === BasePensionType.NewSystemDisability || + typeOfBasePension === BasePensionType.NewSystemPartialDisability || + typeOfBasePension === BasePensionType.NewSystemMedicalAndRehabilitation ) } @@ -131,6 +136,15 @@ const PensionCalculator: CustomScreen = ({ defaultValues, }) + const [dateOfCalculations, setDateOfCalculations] = useQueryState( + 'dateOfCalculations', + { + defaultValue: + methods.formState.defaultValues?.dateOfCalculations ?? + dateOfCalculationsOptions[0].value, + }, + ) + const currencyInputMaxLength = customPageData?.configJson?.currencyInputMaxLength ?? 14 @@ -165,7 +179,47 @@ const PensionCalculator: CustomScreen = ({ ? maxMonthPensionDelayIfBorn1951OrEarlier : maxMonthPensionDelayIfBornAfter1951 + const allCalculatorsOptions = useMemo(() => { + const options = [...dateOfCalculationsOptions] + + if (is2025FormPreviewActive(customPageData)) { + options.unshift({ + label: formatMessage(translationStrings.form2025PreviewLabel), + value: NEW_SYSTEM_TAKES_PLACE_DATE.toISOString(), + }) + } + + return options + }, [customPageData, dateOfCalculationsOptions, formatMessage]) + + const isNewSystemActive = + is2025FormPreviewActive(customPageData) && + dateOfCalculations === NEW_SYSTEM_TAKES_PLACE_DATE.toISOString() + const basePensionTypeOptions = useMemo[]>(() => { + if (isNewSystemActive) { + const options = [ + { + label: formatMessage( + translationStrings.basePensionNewSystemDisabilityLabel, + ), + value: BasePensionType.NewSystemDisability, + }, + { + label: formatMessage( + translationStrings.basePensionNewSystemPartialDisabilityLabel, + ), + value: BasePensionType.NewSystemPartialDisability, + }, + { + label: formatMessage( + translationStrings.basePensionNewSystemMedicalAndRehabilitation, + ), + value: BasePensionType.NewSystemMedicalAndRehabilitation, + }, + ] + return options + } const options = [ { label: formatMessage(translationStrings.basePensionRetirementLabel), @@ -190,9 +244,10 @@ const PensionCalculator: CustomScreen = ({ value: BasePensionType.HalfRetirement, }, ] + options.sort(sortAlpha('label')) return options - }, [formatMessage]) + }, [formatMessage, isNewSystemActive]) const hasSpouseOptions = useMemo[]>(() => { return [ @@ -265,15 +320,6 @@ const PensionCalculator: CustomScreen = ({ ] }, [formatMessage]) - const [dateOfCalculations, setDateOfCalculations] = useQueryState( - 'dateOfCalculations', - { - defaultValue: - methods.formState.defaultValues?.dateOfCalculations ?? - dateOfCalculationsOptions[0].value, - }, - ) - const { linkResolver } = useLinkResolver() const router = useRouter() @@ -355,6 +401,30 @@ const PensionCalculator: CustomScreen = ({ ] }, [formatMessage]) + // Make sure we never enter an invalid state + useEffect(() => { + if (isNewSystemActive) { + if ( + typeOfBasePension !== BasePensionType.NewSystemDisability && + typeOfBasePension !== BasePensionType.NewSystemPartialDisability && + typeOfBasePension !== BasePensionType.NewSystemMedicalAndRehabilitation + ) { + methods.setValue( + 'typeOfBasePension', + BasePensionType.NewSystemDisability, + ) + } + } else { + if ( + typeOfBasePension === BasePensionType.NewSystemDisability || + typeOfBasePension === BasePensionType.NewSystemPartialDisability || + typeOfBasePension === BasePensionType.NewSystemMedicalAndRehabilitation + ) { + methods.setValue('typeOfBasePension', BasePensionType.Retirement) + } + } + }, [isNewSystemActive, methods, typeOfBasePension]) + const birthYearOptions = useMemo[]>(() => { const today = new Date() const options: Option[] = [] @@ -411,10 +481,17 @@ const PensionCalculator: CustomScreen = ({ return options }, [defaultPensionDate, maxMonthPensionDelay, maxMonthPensionHurry]) - const title = `${formatMessage(translationStrings.mainTitle)} ${ - dateOfCalculationsOptions.find((o) => o.value === dateOfCalculations) - ?.label ?? dateOfCalculationsOptions[0].label - }` + const title = `${formatMessage( + isNewSystemActive + ? translationStrings.form2025PreviewMainTitle + : translationStrings.mainTitle, + )}` + const titlePostfix = `${( + allCalculatorsOptions.find((o) => o.value === dateOfCalculations)?.label ?? + dateOfCalculationsOptions[0].label + ).toLowerCase()}` + + const titleVariant = isNewSystemActive ? 'h2' : 'h1' const startMonthOptions = useMemo(() => { if (!defaultPensionDate) { @@ -477,9 +554,16 @@ const PensionCalculator: CustomScreen = ({ > - - {title} - + {isNewSystemActive && ( + + {title}
{titlePostfix}
+
+ )} + {!isNewSystemActive && ( + + {title} {titlePostfix} + + )} {formatMessage(translationStrings.isTurnedOff)}
@@ -500,9 +584,16 @@ const PensionCalculator: CustomScreen = ({ - - {title} - + {isNewSystemActive && ( + + {title}
{titlePostfix}
+
+ )} + {!isNewSystemActive && ( + + {title} {titlePostfix} + + )}
= ({ translationStrings.dateOfCalculationsPlaceholder, )} size="sm" - options={dateOfCalculationsOptions} + options={allCalculatorsOptions} onSelect={(option) => { if (option) { setDateOfCalculations(option.value) + if (isNewSystemActive) { + if ( + option.value === + NEW_SYSTEM_TAKES_PLACE_DATE.toISOString() + ) { + // Date is being moved to the new system date + methods.setValue( + 'typeOfBasePension', + BasePensionType.NewSystemDisability, + ) + } else if ( + dateOfCalculations === + NEW_SYSTEM_TAKES_PLACE_DATE.toISOString() + ) { + // Date is being moved from new system date + methods.setValue( + 'typeOfBasePension', + BasePensionType.Retirement, + ) + } + } } }} /> @@ -827,6 +939,10 @@ const PensionCalculator: CustomScreen = ({ {(typeOfBasePension === BasePensionType.Disability || + typeOfBasePension === + BasePensionType.NewSystemDisability || + typeOfBasePension === + BasePensionType.NewSystemPartialDisability || typeOfBasePension === BasePensionType.Rehabilitation) && ( @@ -839,7 +955,11 @@ const PensionCalculator: CustomScreen = ({ } label={formatMessage( typeOfBasePension === - BasePensionType.Disability + BasePensionType.Disability || + typeOfBasePension === + BasePensionType.NewSystemDisability || + typeOfBasePension === + BasePensionType.NewSystemPartialDisability ? translationStrings.ageOfFirst75DisabilityAssessment : translationStrings.ageOfFirst75RehabilitationAssessment, )} diff --git a/apps/web/screens/Organization/SocialInsuranceAdministration/PensionCalculatorResults.tsx b/apps/web/screens/Organization/SocialInsuranceAdministration/PensionCalculatorResults.tsx index 8d0d36910b4a..4edace5cabe2 100644 --- a/apps/web/screens/Organization/SocialInsuranceAdministration/PensionCalculatorResults.tsx +++ b/apps/web/screens/Organization/SocialInsuranceAdministration/PensionCalculatorResults.tsx @@ -1,4 +1,4 @@ -import { Fragment, useState } from 'react' +import { Fragment, useMemo, useState } from 'react' import { useIntl } from 'react-intl' import { @@ -58,7 +58,9 @@ import { convertToQueryParams, extractSlug, getDateOfCalculationsOptions, + is2025FormPreviewActive, is2025PreviewActive, + NEW_SYSTEM_TAKES_PLACE_DATE, } from './utils' import * as styles from './PensionCalculatorResults.css' @@ -285,11 +287,36 @@ const PensionCalculatorResults: CustomScreen = ({ const highlightedItems2025 = calculation2025.highlightedItems ?? [] - const title = `${formatMessage(translationStrings.mainTitle)} ${ - dateOfCalculationsOptions.find( + const allCalculatorsOptions = useMemo(() => { + const options = [...dateOfCalculationsOptions] + + if (is2025FormPreviewActive(customPageData)) { + options.unshift({ + label: formatMessage(translationStrings.form2025PreviewLabel), + value: NEW_SYSTEM_TAKES_PLACE_DATE.toISOString(), + }) + } + + return options + }, [customPageData, dateOfCalculationsOptions, formatMessage]) + + const isNewSystemActive = + is2025FormPreviewActive(customPageData) && + calculationInput.dateOfCalculations === + NEW_SYSTEM_TAKES_PLACE_DATE.toISOString() + + const title = `${formatMessage( + isNewSystemActive + ? translationStrings.form2025PreviewMainTitle + : translationStrings.mainTitle, + )}` + const titlePostfix = `${( + allCalculatorsOptions.find( (o) => o.value === calculationInput.dateOfCalculations, - )?.label ?? '' - }` + )?.label ?? dateOfCalculationsOptions[0].label + ).toLowerCase()}` + + const titleVariant = isNewSystemActive ? 'h2' : 'h1' const calculationIsPresent = typeof calculation.groups?.length === 'number' && @@ -334,9 +361,16 @@ const PensionCalculatorResults: CustomScreen = ({ > - - {title} - + {isNewSystemActive && ( + + {title}
{titlePostfix}
+
+ )} + {!isNewSystemActive && ( + + {title} {titlePostfix} + + )} {formatMessage(translationStrings.isTurnedOff)} @@ -357,9 +391,16 @@ const PensionCalculatorResults: CustomScreen = ({ - - {title} - + {isNewSystemActive && ( + + {title}
{titlePostfix}
+
+ )} + {!isNewSystemActive && ( + + {title} {titlePostfix} + + )} {formatMessage( diff --git a/apps/web/screens/Organization/SocialInsuranceAdministration/translationStrings.ts b/apps/web/screens/Organization/SocialInsuranceAdministration/translationStrings.ts index 4c5373609c9f..8a273868f14b 100644 --- a/apps/web/screens/Organization/SocialInsuranceAdministration/translationStrings.ts +++ b/apps/web/screens/Organization/SocialInsuranceAdministration/translationStrings.ts @@ -17,6 +17,12 @@ export const translationStrings = defineMessages({ defaultMessage: 'Þú vilt hefja töku eftir 67 ára aldur', description: 'Upplýsingar sem birtast ef þú vilt seinka töku ellilífeyris', }, + form2025PreviewLabel: { + id: 'web.pensionCalculator:form2025PreviewLabel', + defaultMessage: 'Eftir 1. september 2025', + description: + 'Valmöguleiki í dropdown fyrir "Allar reiknivélar" ef það á að leyfa eftir 1. sept 2025 preview', + }, results2025ImageUrl: { id: 'web.pensionCalculator:results2025ImageUrl', defaultMessage: @@ -54,6 +60,24 @@ export const translationStrings = defineMessages({ defaultMessage: 'Ellilífeyrir', description: 'Tegund lífeyris, Ellilífeyrir', }, + basePensionNewSystemDisabilityLabel: { + id: 'web.pensionCalculator:basePensionNewSystemDisabilityLabel', + defaultMessage: 'Örorkulífeyrir', + description: + 'Tegund lífeyris fyrir nýtt kerfi þann 1. sept 2025, Örorkulífeyrir', + }, + basePensionNewSystemPartialDisabilityLabel: { + id: 'web.pensionCalculator:basePensionNewSystemPartialDisabilityLabel', + defaultMessage: 'Hlutaörorkulífeyrir', + description: + 'Tegund lífeyris fyrir nýtt kerfi þann 1. sept 2025, Hlutaörorkulífeyrir', + }, + basePensionNewSystemMedicalAndRehabilitation: { + id: 'web.pensionCalculator:basePensionNewSystemMedicalAndRehabilitation', + defaultMessage: 'Sjúkra- og endurhæfing', + description: + 'Tegund lífeyris fyrir nýtt kerfi þann 1. sept 2025, Sjúkra- og endurhæfing', + }, basePensionFishermanRetirementLabel: { id: 'web.pensionCalculator:basePensionFishermanRetirementLabel', defaultMessage: 'Ellilífeyrir sjómanna', @@ -429,6 +453,11 @@ export const translationStrings = defineMessages({ defaultMessage: 'Reiknivél lífeyris', description: 'Aðal titill', }, + form2025PreviewMainTitle: { + id: 'web.pensionCalculator:form2025PreviewMainTitle', + defaultMessage: 'Reiknivél örorku- og endurhæfingargreiðslna', + description: 'Aðal titill fyrir nýju eftir 1. sept 2025 reiknivél', + }, resultDisclaimer: { id: 'web.pensionCalculator:resultDisclaimer', defaultMessage: @@ -948,6 +977,38 @@ export const translationStrings = defineMessages({ defaultMessage: 'Örorkulífeyrir', description: 'Niðurstöðuskjár, Örorkulífeyrir 2025', }, + 'REIKNH.SJUKRAOGENDURH_HUPPBOT_2025': { + id: 'web.pensionCalculator:REIKNH.SJUKRAOGENDURH_HUPPBOT_2025', + defaultMessage: 'Sjúkra- og endurhæfingargreiðslur og heimilisuppbót', + description: + 'Niðurstöðuskjár, Sjúkra- og endurhæfingargreiðslur og heimilisuppbót', + }, + 'REIKNH.SJUKRAOGENDURH_2025': { + id: 'web.pensionCalculator:REIKNH.SJUKRAOGENDURH_2025', + defaultMessage: 'Sjúkra- og endurhæfingargreiðslur', + description: 'Niðurstöðuskjár, Sjúkra- og endurhæfingargreiðslur', + }, + 'REIKNH.HLUTAORORKA_ALDURSV_HUPPBOT_2025': { + id: 'web.pensionCalculator:REIKNH.HLUTAORORKA_ALDURSV_HUPPBOT_2025', + defaultMessage: 'Hlutaörorkulífeyrir, aldursviðbót og heimilisuppbót', + description: + 'Niðurstöðuskjár, Hlutaörorkulífeyrir, aldursviðbót og heimilisuppbót', + }, + 'REIKNH.HLUTAORORKA_ALDURSV_2025': { + id: 'web.pensionCalculator:REIKNH.HLUTAORORKA_ALDURSV_2025', + defaultMessage: 'Hlutaörorkulífeyrir og aldursviðbót', + description: 'Niðurstöðuskjár, Hlutaörorkulífeyrir og aldursviðbót', + }, + 'REIKNH.HLUTAORORKA_HUPPBOT_2025': { + id: 'web.pensionCalculator:REIKNH.HLUTAORORKA_HUPPBOT_2025', + defaultMessage: 'Hlutaörorkulífeyrir og heimilisuppbót', + description: 'Niðurstöðuskjár, Hlutaörorkulífeyrir og heimilisuppbót', + }, + 'REIKNH.HLUTAORORKA': { + id: 'web.pensionCalculator:REIKNH.HLUTAORORKA', + defaultMessage: 'Hlutaörorkulífeyrir', + description: 'Niðurstöðuskjár, Hlutaörorkulífeyrir', + }, highlighedResultItemHeadingForTotalAfterTaxFromTR: { id: 'web.pensionCalculator:REIKNH.highlighedResultItemHeadingForTotalAfterTaxFromTR', defaultMessage: 'Þar af greiðslur frá TR', diff --git a/apps/web/screens/Organization/SocialInsuranceAdministration/utils.ts b/apps/web/screens/Organization/SocialInsuranceAdministration/utils.ts index 722370dda5ab..fb8cad0b51dc 100644 --- a/apps/web/screens/Organization/SocialInsuranceAdministration/utils.ts +++ b/apps/web/screens/Organization/SocialInsuranceAdministration/utils.ts @@ -153,3 +153,9 @@ export const extractSlug = ( export const is2025PreviewActive = (customPageData?: CustomPage | null) => { return Boolean(customPageData?.configJson?.show2025Preview) } + +export const is2025FormPreviewActive = (customPageData?: CustomPage | null) => { + return Boolean(customPageData?.configJson?.show2025FormPreview) +} + +export const NEW_SYSTEM_TAKES_PLACE_DATE = new Date(2025, 8, 2) diff --git a/libs/api/domains/social-insurance/src/lib/dtos/pensionCalculation.input.ts b/libs/api/domains/social-insurance/src/lib/dtos/pensionCalculation.input.ts index e6f73046d462..79b0efda8b55 100644 --- a/libs/api/domains/social-insurance/src/lib/dtos/pensionCalculation.input.ts +++ b/libs/api/domains/social-insurance/src/lib/dtos/pensionCalculation.input.ts @@ -7,6 +7,9 @@ export enum BasePensionType { Rehabilitation = 'Rehabilitation', HalfRetirement = 'HalfRetirement', NewSystem = 'NewSystem', + NewSystemDisability = 'NewSystemDisability', + NewSystemPartialDisability = 'NewSystemPartialDisability', + NewSystemMedicalAndRehabilitation = 'NewSystemMedicalAndRehabilitation', } registerEnumType(BasePensionType, { diff --git a/libs/api/domains/social-insurance/src/lib/utils.ts b/libs/api/domains/social-insurance/src/lib/utils.ts index 6341bbcd7ed0..8bd2d340f4b4 100644 --- a/libs/api/domains/social-insurance/src/lib/utils.ts +++ b/libs/api/domains/social-insurance/src/lib/utils.ts @@ -21,7 +21,10 @@ const basePensionTypeMapping: Record = { [BasePensionType.Disability]: 3, // Örorkulífeyrir [BasePensionType.Rehabilitation]: 4, // Endurhæfingarlífeyrir [BasePensionType.HalfRetirement]: 5, // Hálfur Ellilífeyrir - [BasePensionType.NewSystem]: 6, // Nýtt kerfi sem tekur gildi 1. september 2025 + [BasePensionType.NewSystem]: 6, // Örorkulífeyrir - Nýtt kerfi sem tekur gildi 1. september 2025 + [BasePensionType.NewSystemDisability]: 6, // Örorkulífeyrir - Nýtt kerfi sem tekur gildi 1. september 2025 + [BasePensionType.NewSystemPartialDisability]: 7, // Hlutaörorka - Nýtt kerfi sem tekur gildi 1. september 2025 + [BasePensionType.NewSystemMedicalAndRehabilitation]: 8, // Sjúkra- og endurhæfingargreiðslur - Nýtt kerfi sem tekur gildi 1. september 2025 } const livingConditionMapping: Record = {