{"version":3,"file":"index-66e0be21.js","sources":["../../../client-app/src/common/ui/StackedBarChart/index.tsx","../../../client-app/src/common/lib/index.ts","../../../client-app/src/common/components/WizardFormManager/se/helpers.ts","../../../client-app/src/common/components/WizardFormManager/AmountVisualizer.tsx","../../../client-app/src/common/components/WizardFormManager/const.ts","../../../client-app/src/common/components/WizardFormManager/se/fieldDefinitions.ts","../../../client-app/src/common/components/WizardFormManager/fi/helpers.ts","../../../client-app/src/common/components/WizardFormManager/fi/fieldDefinitions.ts","../../../client-app/src/common/components/WizardFormManager/no/helpers.ts","../../../client-app/src/common/components/WizardFormManager/no/fieldDefinitions.ts","../../../client-app/src/common/components/WizardFormManager/index.tsx"],"sourcesContent":["import { joinNames } from '../helpers';\nimport styles from './style.module.scss';\n\ntype BarStyle = '100%' | '50%' | '0%';\ntype Bar = {\n    legend?: string;\n    value: number;\n    style: BarStyle;\n};\ntype StackedBarChartProps = { bars: Bar[] };\n\nexport default function StackedBarChart({ bars }: StackedBarChartProps) {\n    const total = bars.reduce((acc, b) => acc + b.value, 0);\n    return (\n        <div className={styles.stack}>\n            {bars.map((b, i) => (\n                <div\n                    key={i}\n                    className={joinNames(styles.bar, getBarSubClass(b), maybeWithLegend(b))}\n                    style={{\n                        width: `${(b.value * 100) / total}%`,\n                        zIndex: 900-i,\n                    }}\n                    data-legend={b.legend}\n                ></div>\n            ))}\n        </div>\n    );\n}\nfunction getBarSubClass(bar: Bar): string | undefined {\n    switch (bar.style) {\n        case '100%':\n            return styles.bar100;\n        case '50%':\n            return styles.bar50;\n        case '0%':\n            return styles.bar0;\n        default:\n            return undefined;\n    }\n}\nfunction maybeWithLegend(bar: Bar): string | undefined {\n    return bar.legend ? styles.barWithLegend : undefined;\n}\n","export * from './useAsync';\nexport { default as useSelectable, type Selectable } from './useSelectable';\nexport { default as useModal } from './useModal';\n\nexport function isGuid(value: string | null | undefined): value is Guid {\n    if (!value) {\n        return false;\n    }\n    const guidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n    return guidRegex.test(value);\n}\n","import {\n    amountBlockCl,\n    amountBlockCli,\n    personalInformation,\n    personalInformationCoAplicant,\n    secondBlock,\n    thirdBlock,\n    type SwedishLoanApplication,\n    type SwedishApplicant,\n    initialValues,\n    SwedishLoanApplicationCleaned,\n} from './fieldDefinitions';\nimport { cleanupSwedishNationalId } from '@n2-common/validation/se/nationalId';\nimport { AccomodationStatusValue, EmploymentStatusCode } from '@n2-common/uiFieldValues/applicationFormFields';\nimport { type TFunction } from 'i18next';\nimport { CliFieldConfig } from '../AmountVisualizer';\nimport { getConsentFieldDef } from '@n2-common/uiFieldValues/consents';\nimport { isGuid } from '@n2-common/lib';\n\nexport function getWizardStagesCl(t: TFunction) {\n    return [\n        amountBlockCl(t),\n        personalInformation(t, false),\n        secondBlock(t, 'mainApplicant'),\n        thirdBlock(t, 'mainApplicant', false),\n\n        personalInformationCoAplicant(t, false),\n        secondBlock(t, 'coApplicant'),\n        thirdBlock(t, 'coApplicant', false),\n    ];\n}\n\nexport function getWizardStagesCli(t: TFunction, config?: CliFieldConfig) {\n    if (!config) {\n        throw new Error('CliFieldConfig is required');\n    }\n    return [\n        amountBlockCli(t, config),\n        personalInformation(t, true),\n        secondBlock(t, 'mainApplicant'),\n        thirdBlock(t, 'mainApplicant', true),\n        ...(config?.coApplicantName\n            ? [personalInformationCoAplicant(t, true, config), secondBlock(t, 'coApplicant'), thirdBlock(t, 'coApplicant', true)]\n            : []),\n        {\n            legend: 'Morrow Bank - Credit terms',\n            sectionNameForTracking: 'confirm',\n            fields: [\n                getConsentFieldDef<SwedishLoanApplication>('MKT_1_PROFILING_1', t, 'SE', 'consents'),\n                getConsentFieldDef<SwedishLoanApplication>('MKT_2_COOP_1', t, 'SE', 'consents'),\n                getConsentFieldDef<SwedishLoanApplication>('MKT_3_COMM_1', t, 'SE', 'consents'),\n                //getConsentFieldDef('ConfirmSA', t, 'SE'),\n            ],\n        },\n    ];\n}\n\nexport function cleanupFormValuesForSubmitting(values: SwedishLoanApplication): SwedishLoanApplication {\n    return {\n        ...values,\n        mainApplicant: getCleanedApplicantDataWithNulledHiddenFields(values.mainApplicant),\n        coApplicant: values.hasCoApplicant && values.coApplicant ? getCleanedApplicantDataWithNulledHiddenFields(values.coApplicant) : null,\n    };\n}\nexport function cleanupFormValuesForSubmittingCli(values: SwedishLoanApplication): SwedishLoanApplicationCleaned {\n    values =\n        values &&\n        Object.entries(values).reduce((acc, [key, value]) => (key in initialValues ? { ...acc, [key]: value } : acc), {} as SwedishLoanApplication);\n    if (!isGuid(values.coSignerGpid)) {\n        delete values.coSignerGpid;\n    } else console.log(values.coSignerGpid);\n    return {\n        ...values,\n        mainApplicant: getCleanedApplicantDataWithNulledHiddenFields(values.mainApplicant, false),\n        coApplicant: values.hasCoApplicant && values.coApplicant ? getCleanedApplicantDataWithNulledHiddenFields(values.coApplicant, false) : null,\n        consents: Object.entries(values.consents).reduce((m, [key, value]) => (value ? [...m, key] : m), [] as string[]),\n    };\n}\n\nfunction getCleanedApplicantDataWithNulledHiddenFields(applicant: SwedishApplicant, withSsn = true): SwedishApplicant {\n    applicant =\n        applicant &&\n        Object.entries(applicant).reduce(\n            (acc, [key, value]) => (key in initialValues.mainApplicant ? { ...acc, [key]: value } : acc),\n            {} as SwedishApplicant\n        );\n    return (\n        applicant && {\n            ...applicant,\n            accommodationTypeOther: specifyAccommodationTypeOther(applicant?.accommodationType as AccomodationStatusValue)\n                ? applicant.accommodationTypeOther\n                : '',\n            nameOfEmployer: specifyEmployerName(applicant?.employmentStatus as EmploymentStatusCode) ? applicant.nameOfEmployer : '',\n            accommodationCost: specifyAccomodationCost(applicant?.accommodationType as AccomodationStatusValue) ? applicant.accommodationCost : '',\n            studentLoanMontlyCost: specifyStudenLoanPayment(applicant) ? applicant.studentLoanMontlyCost : '',\n            nationalId: withSsn ? cleanupSwedishNationalId(applicant.nationalId) : '',\n        }\n    );\n}\n\nexport function specifyAccommodationTypeOther(accommodationType: AccomodationStatusValue | '' | null | undefined) {\n    if (!accommodationType || accommodationType === null) {\n        return false;\n    }\n    return accommodationType === 'O';\n}\n\nexport function specifyAccomodationCost(accommodationType: AccomodationStatusValue | '' | null | undefined) {\n    if (accommodationType === '' || !accommodationType || accommodationType === null) {\n        return false;\n    }\n    return accommodationType !== 'H';\n}\n\nexport function specifyEmployerName(employmentStatus: EmploymentStatusCode | '' | null | undefined) {\n    if (!employmentStatus || employmentStatus === null) {\n        return false;\n    }\n    return employmentStatus === 'F' || employmentStatus === 'I';\n}\n\nfunction specifyStudenLoanPayment(applicant: SwedishApplicant | null | undefined) {\n    if (!applicant || applicant === null) {\n        return false;\n    }\n    return applicant.hasStudentLoan === 'true';\n}\n","import { formatWithCurrencyNoDecimals } from '@n2-common/lib/money';\nimport { Hero, Headline, StackedBarChart } from '@n2-common/ui';\nimport { BaseFieldProps } from '@n2-common/ui/Input';\nimport { useField } from 'formik';\nimport { useMemo } from 'react';\nimport style from './style.module.scss';\nimport { useTranslation } from 'react-i18next';\n\nexport type CliFieldConfig = {\n    currentLimit: number;\n    availableAmount: number;\n    maxLimit: number;\n    newLimitField: string;\n    minIncrement: number;\n    coApplicantName?: string;\n    amountAsSlider?: boolean;\n};\n\ntype AmountVisualizerProps = CountryProps & CliFieldConfig;\n\nexport default function AmountVisualizer({\n    country,\n    newLimitField,\n    currentLimit,\n    availableAmount,\n    maxLimit,\n}: AmountVisualizerProps & BaseFieldProps) {\n    const { t } = useTranslation('customer-loan');\n    const [{ value }] = useField({\n        name: newLimitField,\n        type: 'number',\n    });\n    const newLimit = parseInt(value, 10) || 0;\n    const bars: Parameters<typeof StackedBarChart>[0]['bars'] = useMemo(() => {\n        const increase = newLimit - currentLimit;\n        return [\n            { legend: t<string>('forms.choose.bar.currentLimit'), value: currentLimit, style: '100%' },\n            { legend: t<string>('forms.choose.bar.newLimit'), value: increase, style: '50%' },\n            { value: maxLimit - newLimit, style: '0%' },\n        ];\n    }, [currentLimit, maxLimit, newLimit, t]);\n\n    const newAvailableAmount = newLimit - availableAmount;\n    const changed = currentLimit !== newLimit && newLimit !== 0;\n    return (\n        <Hero ui=\"quaternary\">\n            <Headline level={6}>\n                {changed ? t<string>('forms.choose.newAvailableAmount') : t<string>('forms.choose.availableAmount')}{' '}\n                {formatWithCurrencyNoDecimals(newAvailableAmount, country)}\n            </Headline>\n            <StackedBarChart bars={bars} />\n            <Headline level={6} className={style.subHeaderHero}>\n                {changed ? t<string>('forms.choose.newCreditLimit') : t<string>('forms.choose.creditLimit')}{' '}\n                {formatWithCurrencyNoDecimals(currentLimit + newLimit, country)}\n            </Headline>\n        </Hero>\n    );\n}\n\nexport function NumberOfTermsVisualizer(props: { field: string } & BaseFieldProps) {\n    const { t } = useTranslation('customer-loan');\n    const [{ value }] = useField({\n        name: props.field,\n        type: 'number',\n    });\n    return (\n        <Hero ui=\"transparent\">\n            <Headline level={6}>{props.label}</Headline>\n            <Headline level={6} className={style.subHeaderHero}>\n                {t<string>('forms.terms-slider.markFormat',{years: value/12})}\n            </Headline>\n        </Hero>\n    );\n}\n","export const NumberOfTermsValues = Array.from({length:20},(v,i)=>(i+1)*12);\n","import { FormikCheckBox, FormikInput, FormikInputGroup, FormikSelect, FormikSlider, Headline } from '@n2-common/ui';\nimport {\n    accommodationStatusCodesSe,\n    type AccomodationStatusValue,\n    employmentStatusCodeSe,\n    martialStatusValues,\n    trueFalseValues,\n    type EmploymentStatusCode,\n} from '@n2-common/uiFieldValues/applicationFormFields';\nimport { amount, amountNotNull } from '@n2-common/validation/common/amount';\nimport { TFunction } from 'i18next';\nimport { AmountInput, EmailInput, SwedishSsnInput, SwedishMobilePhoneNumberInput } from '@n2-common/ui/CustomInput';\nimport { stringRequired } from '@n2-common/validation/common/string';\nimport { emailRequired } from '@n2-common/validation/common/email';\nimport { swedishPhoneNumber } from '@n2-common/validation/se/phoneNumber';\nimport { swedishNationalId } from '@n2-common/validation/se/nationalId';\nimport { addPleaseSelectOption } from '@n2-common/components/MultiStageOnePageWizard';\nimport * as Yup from 'yup';\nimport React from 'react';\nimport { specifyAccommodationTypeOther, specifyAccomodationCost, specifyEmployerName } from './helpers';\nimport style from '../style.module.scss';\nimport { LoanSeApplicationInputModel as LoanSeApplicationInputModelType } from '@n2-common/serverGeneratedTypings/loanSeApplicationInputModel';\nimport { LoanSeApplicantData as LoanSeApplicantDataType } from '@n2-common/serverGeneratedTypings/loanSeApplicantData';\nimport type { StageField, WizardStage } from '@n2-common/components/MultiStageOnePageWizard/types';\nimport { addComparrisonValidation } from '@n2-common/lib/yup-helpers';\nimport AmountVisualizer, { CliFieldConfig } from '../AmountVisualizer';\nimport { formatWithCurrencyNoDecimals } from '@n2-common/lib/money';\nimport { ConsentType } from '@n2-common/uiFieldValues/consents';\nimport { NumberOfTermsValues } from '../const';\n\nexport type SwedishApplicant = Override<\n    PropertyNaming<LoanSeApplicantDataType>,\n    {\n        accommodationType: AccomodationStatusValue | '';\n        employmentStatus: EmploymentStatusCode | '';\n    }\n>;\n\nexport type SwedishLoanApplication = Override<\n    PropertyNaming<LoanSeApplicationInputModelType>,\n    {\n        coApplicant: SwedishApplicant | null;\n        mainApplicant: SwedishApplicant;\n        gpid: Guid;\n        coSignerGpid?: Guid;\n        consents: ConsentType;\n    }\n>;\n\nexport type SwedishLoanApplicationCleaned = Override<\n    SwedishLoanApplication,\n    {\n        consents: string[];\n    }\n>;\n\nexport type ApplicantType = 'mainApplicant' | 'coApplicant';\n\nexport const initialApplicantValue: SwedishApplicant = {\n    numberOfChildren: '' as unknown as number | null, // This is to allow '' as initial value, while autogenerated type don't allow, and React don't allow null!\n    email: '',\n    phonenumber: '',\n    nationalId: '',\n    maritalStatus: '',\n    employmentStatus: '',\n    nameOfEmployer: '',\n    monthlyGrossIncome: '',\n    accommodationType: '',\n    accommodationCost: '',\n    accommodationTypeOther: '',\n    hasStudentLoan: '',\n    studentLoanMontlyCost: '',\n    carboatLoan: '',\n    hasCar: '',\n};\n\nexport const initialValues: SwedishLoanApplication = {\n    desiredCredit: '',\n    desiredNumberOfTerms: '60',\n    refinanceDebt: false,\n    hasCoApplicant: false,\n    coApplicant: initialApplicantValue,\n    mainApplicant: initialApplicantValue,\n    gAClientRef: '',\n    gpid: '',\n    coSignerGpid: '',\n    consents: {},\n};\n\nexport const amountBlockCl = (t: TFunction): WizardStage<SwedishLoanApplication> => ({\n    legend: '',\n    sectionNameForTracking: 'Amount',\n    fields: [\n        {\n            name: 'desiredCredit',\n            validation: amount(10000, 500000, t),\n            componentProps: {\n                label: 'Lånebelopp',\n            },\n            Component: AmountInput,\n        },\n        {\n            name: 'desiredNumberOfTerms',\n            validation: amount(12, 500000, t),\n            componentProps: {\n                label: 'Önskad återbetalningstid',\n            },\n            Component: (props) =>\n                React.createElement(FormikSlider, {\n                    ...props,\n                    options: NumberOfTermsValues.map((value) => ({ value, text: `${value/12}` })),\n                }),\n        },\n        {\n            name: 'refinanceDebt',\n            validation: Yup.bool(),\n            componentProps: {\n                label: 'Samla andra lån och krediter',\n            },\n            Component: FormikCheckBox,\n        },\n        {\n            name: 'hasCoApplicant',\n            validation: Yup.bool(),\n            componentProps: {\n                label: 'Ansök med en medsökande',\n            },\n            Component: FormikCheckBox,\n        },\n    ],\n});\n\nexport const amountBlockCli = (t: TFunction, config?: CliFieldConfig): WizardStage<SwedishLoanApplication> => {\n    if (!config) throw new Error('config must be provided for amountBlockCli');\n    const minLimit = config.minIncrement;\n\n    return {\n        legend: '',\n        sectionNameForTracking: 'Amount',\n        fields: [\n            {\n                name: 'desiredCredit',\n                validation: amount(minLimit, config.maxLimit, t),\n                componentProps: {\n                    label: t<string>('customer-loan:forms.application.desiredCredit', {\n                        minLimit: formatWithCurrencyNoDecimals(minLimit, 'SE'),\n                        maxLimit: formatWithCurrencyNoDecimals(config.maxLimit, 'SE'),\n                    }),\n                },\n                Component: config.amountAsSlider\n                    ? (props) =>\n                          React.createElement(FormikSlider, {\n                              ...props,\n                              options: { min: minLimit, max: config.maxLimit },\n                          })\n                    : AmountInput,\n            },\n            {\n                name: 'desiredCreditView',\n                validation: Yup.bool().nullable(),\n                componentProps: {\n                    label: '',\n                },\n                Component: (props) =>\n                    React.createElement(AmountVisualizer, {\n                        country: 'SE',\n                        ...config,\n                        ...props,\n                    }),\n            },\n        ],\n    };\n};\n\nexport function personalInformation(t: TFunction, isCli: boolean): WizardStage<SwedishLoanApplication> {\n    return {\n        legend: (values) => `Personuppgifter ${values.hasCoApplicant ? ' huvudsökande' : ''}`,\n        sectionNameForTracking: `contact information`,\n        fields: [...personalInformationFields(t, 'mainApplicant', isCli)],\n    };\n}\n\nexport const personalInformationCoAplicant = (t: TFunction, isCli: boolean, config?: CliFieldConfig): WizardStage<SwedishLoanApplication> => ({\n    legend: `Personuppgifter medsökande`,\n    hidden: (values) => !values.hasCoApplicant,\n    sectionNameForTracking: 'Personal info coApplicant',\n    fields: [...personalInformationFields(t, 'coApplicant', isCli, config?.coApplicantName)],\n});\n\nfunction* personalInformationFields(\n    t: TFunction,\n    applicant: ApplicantType,\n    isCli: boolean,\n    name?: string\n): Generator<StageField<SwedishLoanApplication>> {\n    if (name) {\n        yield {\n            name: `${applicant}.nationalIdView`,\n            validation: Yup.string().nullable(),\n            componentProps: {\n                label: 'Namn',\n            },\n            Component: () => Headline({ level: 5, children: name }),\n        };\n    }\n    yield {\n        name: `${applicant}.email`,\n        validation: emailRequired(t),\n        componentProps: {\n            label: 'E-postadress',\n        },\n        Component: EmailInput,\n    };\n    yield {\n        name: `${applicant}.phonenumber`,\n        validation: swedishPhoneNumber(t),\n        componentProps: {\n            label: 'Mobilnummer',\n        },\n        Component: SwedishMobilePhoneNumberInput,\n    };\n    if (!isCli) {\n        yield {\n            name: `${applicant}.nationalId`,\n            validation: swedishNationalId(),\n            componentProps: {\n                label: 'Personnummer',\n            },\n            Component: SwedishSsnInput,\n        };\n    }\n    yield {\n        name: `${applicant}.maritalStatus`,\n        validation: stringRequired(t),\n        componentProps: {\n            label: 'Civilstånd',\n        },\n        Component: (props) =>\n            React.createElement(FormikSelect, {\n                ...props,\n                options: addPleaseSelectOption(martialStatusValues(t), t),\n            }),\n    };\n    yield {\n        name: `${applicant}.numberOfChildren`,\n        validation: amount(0, 16, t),\n        componentProps: {\n            label: 'Antal barn som bor i hushållet',\n        },\n        Component: AmountInput,\n    };\n    if (isCli) {\n        yield {\n            name: `${applicant}View`,\n            validation: Yup.boolean()\n                .nullable()\n                .required(t<string>('validation:consent.required'))\n                .oneOf([true], t<string>('validation:consent.required')),\n            Component: FormikCheckBox,\n            componentProps: { label: t<string>('customer-loan:forms.application.confirmPersonalInformation') },\n        };\n    }\n}\n\nexport const secondBlock = (t: TFunction, applicant: ApplicantType): WizardStage<SwedishLoanApplication> => ({\n    hidden: applicant === 'coApplicant' ? (values) => !values.hasCoApplicant : undefined,\n    legend: `Ekonomisk situation${applicant === 'coApplicant' ? ' medsökande' : ''}`,\n    sectionNameForTracking: `Economical information${applicant === 'coApplicant' ? ' coApplicant' : ''}`,\n    fields: [\n        {\n            name: `${applicant}.employmentStatus`,\n            validation: stringRequired(t),\n            componentProps: {\n                label: 'Din arbetssituation',\n            },\n            Component: (props) =>\n                React.createElement(FormikSelect, {\n                    //\n                    options: addPleaseSelectOption(employmentStatusCodeSe, t),\n                    ...props,\n                }),\n        },\n        {\n            name: `${applicant}.nameOfEmployer`,\n            validation: addComparrisonValidation<number | '', SwedishApplicant['employmentStatus']>(\n                Yup.string(),\n                t<string>('validation:string.required'),\n                `${applicant}.employmentStatus`,\n                (val, other) => !specifyEmployerName(other) || !!val\n            ),\n            componentProps: {\n                label: 'Arbetsgivare',\n            },\n            hidden: (values) => !specifyEmployerName(values[applicant]?.employmentStatus),\n            Component: (props) => React.createElement(FormikInput, { ...props, type: 'text' }),\n        },\n        {\n            name: `${applicant}.monthlyGrossIncome`,\n            validation: amount(0, Number.MAX_SAFE_INTEGER, t),\n            componentProps: {\n                label: 'Månadsinkomst (brutto)',\n            },\n            Component: (props) =>\n                React.createElement(AmountInput, {\n                    ...props,\n                    helptext: 'Din sammanlagda månadsinkomst. Om du har flera inkomster ber vi dig räkna ihop dessa',\n                }),\n        },\n        {\n            name: `${applicant}.accommodationType`,\n            validation: stringRequired(t),\n            componentProps: {\n                label: 'Boendeform',\n            },\n            Component: (props) => React.createElement(FormikSelect, { ...props, options: addPleaseSelectOption(accommodationStatusCodesSe, t) }),\n        },\n        {\n            name: `${applicant}.accommodationTypeOther`,\n            validation: addComparrisonValidation<number | '', SwedishApplicant['accommodationType']>(\n                Yup.string(),\n                t<string>('validation:string.required'),\n                `${applicant}.accommodationType`,\n                (val, other) => !specifyAccommodationTypeOther(other) || !!val\n            ),\n            componentProps: {\n                label: 'Annat, vad?',\n            },\n            hidden: (values) => !specifyAccommodationTypeOther(values[applicant]?.accommodationType),\n            Component: (props) => React.createElement(FormikInput, { ...props, type: 'text' }),\n        },\n        {\n            name: `${applicant}.accommodationCost`,\n            validation: addComparrisonValidation<number | '', SwedishApplicant['accommodationType']>(\n                Yup.string(),\n                t<string>('validation:string.required'),\n                `${applicant}.accommodationType`,\n                (val, other) => !specifyAccomodationCost(other) || !!val\n            ),\n            componentProps: {\n                label: 'Hyreskostnad/ månadsavgift',\n            },\n            hidden: (values) => !specifyAccomodationCost(values[applicant]?.accommodationType),\n            Component: AmountInput,\n        },\n    ],\n});\n\nexport const thirdBlock = (t: TFunction, applicant: ApplicantType, isCli: boolean): WizardStage<SwedishLoanApplication> => ({\n    hidden: applicant === 'coApplicant' ? (values) => !values.hasCoApplicant : undefined,\n    legend: `Andra kostnader${applicant === 'coApplicant' ? ' medsökande' : ''}`,\n    sectionNameForTracking: `Debt information${applicant === 'coApplicant' ? ' coApplicant' : ''}`,\n    fields: [...thirdBlockFields(t, applicant, isCli)],\n});\n\nfunction* thirdBlockFields(t: TFunction, applicant: ApplicantType, isCli: boolean): Generator<StageField<SwedishLoanApplication>> {\n    yield {\n        name: `${applicant}.hasCar`,\n        validation: stringRequired(t),\n        componentProps: {\n            label: 'Äger eller leasar du en bil?',\n        },\n        Component: (props) =>\n            React.createElement(FormikInputGroup, {\n                ...props,\n                type: 'radio',\n                options: trueFalseValues(t),\n                className: style.radioButtons,\n                horisontal: true,\n            }),\n    };\n    yield {\n        name: `${applicant}.hasStudentLoan`,\n        validation: stringRequired(t),\n        componentProps: {\n            label: 'Har du övriga lån, exklusive bolån?',\n            helptext: \"Din del av månadsvisa räntor och avbetalningar för andra lån och borgensåtaganden, exklusive bolån och fordonslån.\"\n        },\n        Component: (props) =>\n            React.createElement(FormikInputGroup, {\n                ...props,\n                type: 'radio',\n                options: trueFalseValues(t),\n                className: style.radioButtons,\n                horisontal: true,               \n            }),\n    };\n    yield {\n        name: `${applicant}.studentLoanMontlyCost`,\n        validation: addComparrisonValidation<number | '', SwedishApplicant['hasStudentLoan']>(\n            Yup.string(),\n            t<string>('validation:string.required'),\n            `${applicant}.hasStudentLoan`,\n            (val, other) => (other == 'true' ? !!val : true)\n        ),\n        componentProps: {\n            label: 'Kostnader övriga lån',\n        },\n        Component: AmountInput,\n        hidden: (values) => values[applicant]?.hasStudentLoan != 'true',\n    };\n    if (isCli) {\n        yield {\n            name: `${applicant}View`,\n            validation: Yup.boolean()\n                .nullable()\n                .required(t<string>('validation:consent.required'))\n                .oneOf([true], t<string>('validation:consent.required')),\n            Component: FormikCheckBox,\n            componentProps: { label: t<string>('customer-loan:forms.application.confirmFinancialSituation') },\n        };\n    }\n}\n","import {\n    amountBlock,\n    type FinishLoanApplication,\n    firstBlock,\n    secondBlock,\n    thirdBlock,\n    type FinishApplicant,\n    amountBlockCli,\n    initialValues,\n    FinishLoanApplicationCleaned,\n    firstBlockCoAplicant,\n} from './fieldDefinitions';\nimport { type TFunction } from 'i18next';\nimport { AccomodationStatusValue, EmploymentStatusCode } from '@n2-common/uiFieldValues/applicationFormFields';\nimport { getConsentFieldDef } from '@n2-common/uiFieldValues/consents';\nimport { CliFieldConfig } from '../AmountVisualizer';\nimport { isGuid } from '@n2-common/lib';\n\nexport const CONFIG = {\n    // eslint-disable-next-line camelcase\n    goalId_ApplicationFlexiLoanSent: '{22FA85DA-874D-466E-A0F0-0F1A87B3E399}',\n    // eslint-disable-next-line camelcase\n    goalId_ApplicationAnnuityLoanSent: '{00292AC1-78DF-46D9-8989-E1DFF7275695}',\n    minimumAge: 23,\n    maximumAge: 200,\n    modulo: 100,\n    minRefinanceAmount: 999,\n    maxLoanAmount: 50000,\n    minLoanAmount: 1000,\n    annAge: 60,\n    annAmount: 35000,\n    coApplicantName: null as string | null,\n};\nexport type ConfigType = typeof CONFIG;\n\nexport function getWizardStagesCl(t: TFunction, config: ConfigType = CONFIG) {\n    return [\n        amountBlock(t, config),\n        firstBlock(t, false),\n        secondBlock(t, 'mainApplicant'),\n        thirdBlock(t, 'mainApplicant', false),\n        //        FirstBlockCoAplicant(t),\n        //        secondBlock(t, 'CoApplicant'),\n        //        thirdBlock(t, 'CoApplicant'),\n        {\n            legend: 'Morrow Bank - Luoton ehdot',\n            sectionNameForTracking: 'confirm',\n            fields: [\n                getConsentFieldDef<FinishLoanApplication>('MKT_1_PROFILING_1', t, 'FI', 'consents'),\n                getConsentFieldDef<FinishLoanApplication>('MKT_2_COOP_1', t, 'FI', 'consents'),\n                getConsentFieldDef<FinishLoanApplication>('MKT_3_COMM_1', t, 'FI', 'consents'),\n                getConsentFieldDef<FinishLoanApplication>('ConfirmSA', t, 'FI', 'consents'),\n            ],\n        },\n    ];\n}\nexport function getWizardStagesCli(t: TFunction, config?: CliFieldConfig) {\n    if (!config) {\n        throw new Error('CliFieldConfig is required');\n    }\n    return [\n        amountBlockCli(t, config),\n        firstBlock(t, true),\n        secondBlock(t, 'mainApplicant'),\n        thirdBlock(t, 'mainApplicant', true),\n        ...(config.coApplicantName //\n            ? [firstBlockCoAplicant(t), secondBlock(t, 'coApplicant'), thirdBlock(t, 'coApplicant', true)]\n            : []),\n        {\n            legend: 'Morrow Bank - Luoton ehdot',\n            sectionNameForTracking: 'confirm',\n            fields: [\n                getConsentFieldDef<FinishLoanApplication>('MKT_1_PROFILING_1', t, 'FI', 'consents'),\n                getConsentFieldDef<FinishLoanApplication>('MKT_2_COOP_1', t, 'FI', 'consents'),\n                getConsentFieldDef<FinishLoanApplication>('MKT_3_COMM_1', t, 'FI', 'consents'),\n                getConsentFieldDef<FinishLoanApplication>('ConfirmSA', t, 'FI', 'consents'),\n            ],\n        },\n    ];\n}\n\nexport function cleanupFormValuesForSubmitting(values: FinishLoanApplication, config: ConfigType = CONFIG) {\n    const cleaned: FinishLoanApplicationCleaned = {\n        ...values,\n        refinanceDebt: hideRefinanceDebt(values.desiredCredit, config) ? false : values.refinanceDebt,\n        mainApplicant: cleanupApplicantData(values.mainApplicant),\n        coApplicant: values.hasCoApplicant && values.coApplicant ? cleanupApplicantData(values.coApplicant) : null,\n        consents: Object.entries(values.consents).reduce((m, [key, value]) => (value ? [...m, key] : m), [] as string[]),\n    };\n\n    return cleaned;\n}\n\nexport function cleanupFormValuesForSubmittingCli(values: FinishLoanApplication): FinishLoanApplicationCleaned {\n    values =\n        values &&\n        Object.entries(values).reduce((acc, [key, value]) => (key in initialValues ? { ...acc, [key]: value } : acc), {} as FinishLoanApplication);\n    if (!isGuid(values.coSignerGpid)) {\n        delete values.coSignerGpid;\n    } else console.log(values.coSignerGpid);\n    return {\n        ...values,\n        mainApplicant: cleanupApplicantData(values.mainApplicant),\n        coApplicant: values.hasCoApplicant && values.coApplicant ? cleanupApplicantData(values.coApplicant) : null,\n        consents: Object.entries(values.consents).reduce((m, [key, value]) => (value ? [...m, key] : m), [] as string[]),\n    };\n}\n\nfunction cleanupApplicantData(applicant: FinishApplicant) {\n    const cleaned = Object.entries(applicant).reduce(\n        (m, [key, value]) => ({ ...m, [key]: value != null ? value.toString() : null }),\n        {} as typeof applicant\n    );\n    if (!specifyAccomodationCost(cleaned.accommodationType)) {\n        cleaned.accommodationCost = '';\n    }\n\n    return cleaned;\n}\n\nexport function specifyAccommodationTypeOther(accommodationType: AccomodationStatusValue | '' | null | undefined) {\n    if (!accommodationType || accommodationType === null) {\n        return false;\n    }\n    return accommodationType === 'O';\n}\n\nexport function specifyAccomodationCost(accommodationType: AccomodationStatusValue | '' | null | undefined) {\n    if (accommodationType === '' || !accommodationType || accommodationType === null) {\n        return false;\n    }\n    return accommodationType !== 'H';\n}\n\nexport function specifyEmployerName(employmentStatus: EmploymentStatusCode | '' | null | undefined) {\n    if (!employmentStatus || employmentStatus === null) {\n        return false;\n    }\n    return employmentStatus === 'F' || employmentStatus === 'I';\n}\n\nexport function hideRefinanceDebt(desiredCredit: string, config: ConfigType) {\n    return parseInt(desiredCredit, 10) <= config.minRefinanceAmount;\n}\n","import { FormikCheckBox, FormikInputGroup, FormikSelect, FormikSlider } from '@n2-common/ui';\nimport {\n    accommodationStatusCodesFi,\n    type AccomodationStatusValue,\n    employmentStatusCodeFi,\n    martialStatusValues,\n    trueFalseValues,\n    type EmploymentStatusCode,\n} from '@n2-common/uiFieldValues/applicationFormFields';\nimport { amount, amountNotNull } from '@n2-common/validation/common/amount';\nimport { TFunction } from 'i18next';\nimport { FinnishAmountInput as AmountInput, EmailInput, FinnishMobilePhoneNumberInput, FinnishSsnInput } from '@n2-common/ui/CustomInput';\nimport { stringRequired } from '@n2-common/validation/common/string';\nimport { emailRequired } from '@n2-common/validation/common/email';\nimport { LoanFiApplicationInputModel as LoanFiApplicationInputModelType } from '@n2-common/serverGeneratedTypings/loanFiApplicationInputModel';\nimport { mobileRequired } from '@n2-common/validation/fi/phoneNumber';\nimport { getNationalIdValidation as getNationalIdValidation } from '@n2-common/validation/fi/nationalId';\nimport { addPleaseSelectOption } from '@n2-common/components/MultiStageOnePageWizard';\nimport * as Yup from 'yup';\nimport { LoanFiApplicantData as LoanFiApplicantDataType } from '@n2-common/serverGeneratedTypings/loanFiApplicantData';\nimport style from '../style.module.scss';\nimport React from 'react';\nimport type { StageField, WizardStage } from '@n2-common/components/MultiStageOnePageWizard/types';\nimport { hideRefinanceDebt, specifyAccomodationCost } from './helpers';\nimport { type ConfigType } from './helpers';\nimport { ConsentType } from '@n2-common/uiFieldValues/consents';\nimport AmountVisualizer, { CliFieldConfig } from '../AmountVisualizer';\nimport { formatWithCurrencyNoDecimals } from '@n2-common/lib/money';\n\nexport type FinishApplicant = Override<\n    PropertyNaming<LoanFiApplicantDataType>,\n    {\n        accommodationType: AccomodationStatusValue | '';\n        employmentStatus: EmploymentStatusCode | '';\n    }\n>;\n\nexport type FinishLoanApplication = Override<\n    PropertyNaming<LoanFiApplicationInputModelType>,\n    {\n        coApplicant: FinishApplicant | null;\n        mainApplicant: FinishApplicant;\n        consents: ConsentType;\n        gpid: Guid;\n        coSignerGpid?: Guid;\n    }\n>;\n\nexport type FinishLoanApplicationCleaned = Override<\n    FinishLoanApplication,\n    {\n        consents: string[];\n    }\n>;\n\nexport type ApplicantType = 'mainApplicant' | 'coApplicant';\n\nexport const initialApplicantValue: FinishApplicant = {\n    email: '',\n    phonenumber: '',\n    nationalId: '',\n    maritalStatus: '',\n    employmentStatus: '',\n    monthlyGrossIncome: '',\n    accommodationType: '',\n    accommodationCost: '',\n    hasCar: '',\n    monthlyIncome: '',\n    extraEarningMonthly: '',\n    mortgage: '',\n    studentLoan: '',\n    consumerLoan: '',\n    creditCardDebt: '',\n    carLoan: '',\n};\n\nexport const initialValues: FinishLoanApplication = {\n    desiredCredit: '',\n    refinanceDebt: false,\n    hasCoApplicant: false,\n    coApplicant: initialApplicantValue,\n    mainApplicant: initialApplicantValue,\n    gpid: '',\n    coSignerGpid: '',\n    gAClientRef: '',\n    consents: {},\n    tracking: {},\n};\n\nexport const amountBlock = (t: TFunction, config: ConfigType): WizardStage<FinishLoanApplication> => ({\n    legend: '',\n    sectionNameForTracking: 'Amount',\n    fields: [\n        {\n            name: 'desiredCredit',\n            validation: amount(config.minLoanAmount, config.maxLoanAmount, t),\n            componentProps: {\n                label: 'Ilmoita haluamasi luottoraja',\n            },\n            Component: AmountInput,\n        },\n        {\n            name: 'refinanceDebt',\n            hidden: (form) => hideRefinanceDebt(form.desiredCredit, config),\n            validation: Yup.bool(),\n            componentProps: {\n                label: 'Haluan jälleenrahoittaa olemassaolevia luottoja',\n            },\n            Component: FormikCheckBox,\n        },\n    ],\n});\nexport const amountBlockCli = (t: TFunction, config: CliFieldConfig): WizardStage<FinishLoanApplication> => {\n    const minLimit = config.minIncrement;\n\n    return {\n        legend: '',\n        sectionNameForTracking: 'Amount',\n        fields: [\n            {\n                name: 'desiredCredit',\n                validation: amount(minLimit, config.maxLimit, t),\n                componentProps: {\n                    label: t<string>('customer-loan:forms.application.desiredCredit', {\n                        minLimit: formatWithCurrencyNoDecimals(minLimit, 'FI'),\n                        maxLimit: formatWithCurrencyNoDecimals(config.maxLimit, 'FI'),\n                    }),\n                },\n                Component: config.amountAsSlider\n                    ? (props) =>\n                          React.createElement(FormikSlider, {\n                              ...props,\n                              options: { min: minLimit, max: config.maxLimit },\n                          })\n                    : AmountInput,\n            },\n            {\n                name: 'desiredCreditView',\n                validation: Yup.bool().nullable(),\n                componentProps: {\n                    label: '',\n                },\n                Component: (props) =>\n                    React.createElement(AmountVisualizer, {\n                        country: 'SE',\n                        ...config,\n                        ...props,\n                    }),\n            },\n        ],\n    };\n};\n\nexport const firstBlock = (t: TFunction, isCli = false): WizardStage<FinishLoanApplication> => ({\n    legend: (values) => `Hakijan tiedot ${values.hasCoApplicant ? ' päähakija' : ''}`,\n    sectionNameForTracking: `contact information`,\n    fields: [...firstBlockFields(t, 'mainApplicant', isCli)],\n});\n\nexport const firstBlockCoAplicant = (t: TFunction, isCli = false): WizardStage<FinishLoanApplication> => ({\n    legend: `Personal info coApplicant`,\n    hidden: (values) => !values.hasCoApplicant,\n    sectionNameForTracking: 'Personal info coApplicant',\n    fields: [...firstBlockFields(t, 'coApplicant', isCli)],\n});\n\nexport const secondBlock = (t: TFunction, applicant: ApplicantType): WizardStage<FinishLoanApplication> => ({\n    hidden: applicant === 'coApplicant' ? (values) => !values.hasCoApplicant : undefined,\n    legend: `Taloudellinen tilanne${applicant === 'coApplicant' ? ' hakijakaveri' : ''}`,\n    sectionNameForTracking: `Economical information${applicant === 'coApplicant' ? ' coApplicant' : ''}`,\n    fields: [\n        {\n            name: `${applicant}.maritalStatus`,\n            validation: stringRequired(t),\n            componentProps: {\n                label: 'Siviilisääty',\n            },\n            Component: (props) =>\n                React.createElement(FormikSelect, {\n                    ...props,\n                    options: addPleaseSelectOption(martialStatusValues(t), t),\n                }),\n        },\n        {\n            name: `${applicant}.monthlyGrossIncome`,\n            validation: amount(0, Number.MAX_SAFE_INTEGER, t),\n            componentProps: {\n                label: 'Kuukausitulot (brutto)',\n            },\n            Component: (props) =>\n                React.createElement(AmountInput, {\n                    ...props,\n                    helptext:\n                        'Kuukausitulosi ennen veroja. Mikäli saat palkkaa useammalta työnantajalta, voit yhdistää summan. Vuokratulot, tai lapsilisät eivät sisälly tähän kenttään.',\n                }),\n        },\n        {\n            name: `${applicant}.monthlyIncome`,\n            validation: amount(0, Number.MAX_SAFE_INTEGER, t),\n            componentProps: {\n                label: 'Kuukausitulot (netto)',\n            },\n            Component: (props) =>\n                React.createElement(AmountInput, {\n                    ...props,\n                    helptext:\n                        'Kuukausitulosi verojen jälkeen. Mikäli saat palkkaa useammalta työnantajalta, voit yhdistää summan. Vuokratulot, tai lapsilisät eivät sisälly tähän kenttään.',\n                }),\n        },\n        {\n            name: `${applicant}.extraEarningMonthly`,\n            validation: amount(0, Number.MAX_SAFE_INTEGER, t),\n            componentProps: {\n                label: 'Kuukausittainen pääomatulo bruttona (esim. vuokratulo)',\n            },\n            Component: (props) =>\n                React.createElement(AmountInput, {\n                    ...props,\n                    helptext:\n                        'Kuukausittainen pääomatulosi ennen veroja. Mikäli saat esimerkiksi vuokratuloa, voit antaa summan tähän kenttään. Voit yhdistää kaikki pääomatulosi tähän kentään.',\n                }),\n        },\n        {\n            name: `${applicant}.employmentStatus`,\n            validation: stringRequired(t),\n            componentProps: {\n                label: 'Tämänhetkinen työtilanteesi',\n            },\n            Component: (props) =>\n                React.createElement(FormikSelect, {\n                    //\n                    options: addPleaseSelectOption(employmentStatusCodeFi, t),\n                    ...props,\n                }),\n        },\n    ],\n});\n\nexport const thirdBlock = (t: TFunction, applicant: ApplicantType, isCli: boolean): WizardStage<FinishLoanApplication> => ({\n    hidden: applicant === 'coApplicant' ? (values) => !values.hasCoApplicant : undefined,\n    legend: `Muut kulut${applicant === 'coApplicant' ? ' hakijakaveri' : ''}`,\n    sectionNameForTracking: `Debt information${applicant === 'coApplicant' ? ' coApplicant' : ''}`,\n    fields: [...thirdBlockFields(t, applicant, isCli)],\n});\n\nfunction* thirdBlockFields(t: TFunction, applicant: ApplicantType, isCli: boolean): Generator<StageField<FinishLoanApplication>> {\n    yield {\n        name: `${applicant}.accommodationType`,\n        validation: stringRequired(t),\n        componentProps: {\n            label: 'Asumismuoto',\n        },\n        Component: (props) => React.createElement(FormikSelect, { ...props, options: addPleaseSelectOption(accommodationStatusCodesFi, t) }),\n    };\n    yield {\n        name: `${applicant}.accommodationCost`,\n        hidden: (values) => !specifyAccomodationCost(values[applicant]?.accommodationType),\n        validation: Yup.number().when('accommodationType', {\n            is: (val: FinishApplicant['accommodationType']) => specifyAccomodationCost(val),\n            then: () => amountNotNull(t),\n            otherwise: () => Yup.number().nullable(),\n        }),\n        componentProps: {\n            label: '* Sinun osuutesi vuokrasta / yhtiövastikkeesta',\n            helptext: 'Kirjoita tähän kenttään oma osuutesi vuokrasta tai yhtiövastikkeesta (sis. hoito- ja rahoitusvastikkeen) kuukaudessa',\n        },\n        Component: AmountInput,\n    };\n    yield {\n        name: `${applicant}.mortgage`,\n        validation: amountNotNull(t),\n        componentProps: {\n            label: 'Sinun osuutesi asuntolainasta',\n            helptext: 'Kirjoita tähän kenttään oma osuutesi voimassa olevasta asuntolainasta',\n        },\n        Component: AmountInput,\n    };\n    yield {\n        name: `${applicant}.studentLoan`,\n        validation: amountNotNull(t),\n        componentProps: {\n            label: 'Valtion takaama opintolaina',\n            helptext: 'Kirjoita tähän kenttään tällä hetkellä voimassa olevien opintolainojesi jäljellä oleva kokonaissumma',\n        },\n        Component: AmountInput,\n    };\n    yield {\n        name: `${applicant}.carLoan`,\n        validation: amountNotNull(t),\n        componentProps: {\n            label: 'Sinun osuutesi ajoneuvolainasta',\n            helptext: 'Kirjoita tähän kenttään oma osuutesi voimassa olevasta ajoneuvolainasta',\n        },\n        Component: AmountInput,\n    };\n    yield {\n        name: `${applicant}.hasCar`,\n        validation: stringRequired(t),\n        componentProps: {\n            label: 'Onko sinulla oma tai leasing-auto',\n        },\n        Component: (props) =>\n            React.createElement(FormikInputGroup, {\n                ...props,\n                type: 'radio',\n                options: trueFalseValues(t),\n                className: style.radioButtons,\n                horisontal: true,\n            }),\n    };\n    if (isCli) {\n        yield {\n            name: `${applicant}View`,\n            validation: Yup.boolean()\n                .nullable()\n                .required(t<string>('validation:consent.required'))\n                .oneOf([true], t<string>('validation:consent.required')),\n            Component: FormikCheckBox,\n            componentProps: { label: t<string>('customer-loan:forms.application.confirmFinancialSituation') },\n        };\n    }\n}\n\nfunction* firstBlockFields(t: TFunction, applicant: ApplicantType, isCli = false): Generator<StageField<FinishLoanApplication>> {\n    yield {\n        name: `${applicant}.email`,\n        validation: emailRequired(t),\n        componentProps: {\n            label: 'Sähköpostiosoite',\n        },\n        Component: EmailInput,\n    };\n    yield {\n        name: `${applicant}.phonenumber`,\n        validation: mobileRequired(),\n        componentProps: {\n            label: 'Matkapuhelin',\n            helptext: t<string>('validation:phoneNumber.format'),\n        },\n        Component: FinnishMobilePhoneNumberInput,\n    };\n    if (!isCli) {\n        yield {\n            name: `${applicant}.nationalId`,\n            validation: getNationalIdValidation(),\n            componentProps: {\n                label: 'Henkilötunnus',\n            },\n            Component: FinnishSsnInput,\n        };\n    }\n    if (applicant == 'coApplicant') {\n        yield {\n            name: `coApplicant.maritalStatus`,\n            validation: stringRequired(t),\n            componentProps: {\n                label: 'Civilstånd',\n            },\n            Component: (props) => React.createElement(FormikSelect, { ...props, options: addPleaseSelectOption(martialStatusValues(t), t) }),\n        };\n    }\n    if (isCli) {\n        yield {\n            name: `${applicant}View`,\n            validation: Yup.boolean()\n                .nullable()\n                .required(t<string>('validation:consent.required'))\n                .oneOf([true], t<string>('validation:consent.required')),\n            Component: FormikCheckBox,\n            componentProps: { label: t<string>('customer-loan:forms.application.confirmPersonalInformation') },\n        };\n    }\n}\n","import { type TFunction } from 'i18next';\nimport { amountBlock, firstBlock, NorwegianApplicant, NorwegianLoanApplication, secondBlock, thirdBlock } from './fieldDefinitions';\nimport { AccomodationStatusValue,  MartialStatusValues } from '@n2-common/uiFieldValues/applicationFormFields';\n\nexport function getTranslatedStages(t: TFunction) {\n    return [\n        amountBlock(t),\n        firstBlock(t),\n        secondBlock(t),\n        thirdBlock(t), \n    ];\n}\n\nexport function cleanupFormValuesForSubmitting(values: NorwegianLoanApplication): NorwegianLoanApplication {\n    const retVal: NorwegianLoanApplication = {\n        ...values,\n        Applicant: getCleanedApplicantDataWithNulledHiddenFields(values.Applicant)\n    };\n    return retVal;\n}\n\nfunction getCleanedApplicantDataWithNulledHiddenFields(applicant: NorwegianApplicant): NorwegianApplicant {\n    return {\n        ...applicant,\n        AccommodationTypeOther: specifyAccommodationTypeOther(applicant?.AccommodationType as AccomodationStatusValue) \n        ? applicant.AccommodationTypeOther : '',\n        AccommodationCost: specifyAccomodationCost(applicant?.AccommodationType as AccomodationStatusValue) ? applicant.AccommodationCost : '',\n        PartnerIncome: applicantHasSharedEconomy(applicant.MaritalStatus) ? applicant.PartnerIncome : null\n     //   StudentLoanMontlyCost: specifyStudenLoanPayment(applicant) ? applicant.StudentLoanMontlyCost : '',\n       // NationalId: cleanupSwedishNationalId(applicant.NationalId),\n    };\n}\n\nexport function specifyAccommodationTypeOther(accommodationType: AccomodationStatusValue | '' | null | undefined) {\n    if (!accommodationType || accommodationType === null) {\n        return false;\n    }\n    return accommodationType === 'O';\n}\n\nexport function specifyAccomodationCost(accommodationType: AccomodationStatusValue | '' | null | undefined) {\n    if (accommodationType === '' || !accommodationType || accommodationType === null) {\n        return false;\n    }\n    return accommodationType !== 'H';\n}\n\nexport function applicantHasSharedEconomy(martialStatus: MartialStatusValues | '' | null | undefined) {\n    if (!martialStatus || martialStatus === null) {\n        return false;\n    }\n    return martialStatus === 'C' || martialStatus === 'M';\n}\n","import { FormikInput, FormikInputGroup, FormikSelect } from '../../../ui';\nimport {\n    accommodationStatusCodesNo,\n    AccomodationStatusValue,\n    employmentStatusCodeNo,\n    MartialStatusValues,\n    martialStatusValues,\n    trueFalseValues,\n    type EmploymentStatusCode,\n} from '../../../uiFieldValues/applicationFormFields';\nimport { amount, amountNotEmpty, amountNotNull } from '../../../validation/common/amount';\nimport { TFunction } from 'i18next';\nimport { AmountInput, EmailInput, NationalIdInput, PhoneNumberInput } from '../../../ui/CustomInput';\n\nimport { nameof } from '../../../lib/nameof';\n\nimport { stringRequired } from '../../../validation/common/string';\nimport { emailRequired } from '../../../validation/common/email';\nimport { norwegianNationalId } from '../../../validation/no/nationalId';\nimport { norwegianPhoneNumber } from '../../../validation/no/phoneNumber';\nimport { LoanNoApplicationInputModel } from '../../../serverGeneratedTypings/loanNoApplicationInputModel';\nimport { addPleaseSelectOption } from '../../MultiStageOnePageWizard';\nimport * as Yup from 'yup';\nimport { LoanNoApplicantData } from '../../../serverGeneratedTypings/loanNoApplicantData';\nimport style from '../style.module.scss';\nimport React from 'react';\nimport { applicantHasSharedEconomy, specifyAccommodationTypeOther, specifyAccomodationCost } from './helpers';\n\nimport type { WizardStage } from '@n2-common/components/MultiStageOnePageWizard/types';\n\nexport type NorwegianApplicant = Override<\n    LoanNoApplicantData,\n    {\n        AccommodationType: AccomodationStatusValue | '';\n        EmploymentStatus: EmploymentStatusCode | '';\n        MaritalStatus: MartialStatusValues | '';\n    }\n>;\nexport type NorwegianLoanApplication = Override<LoanNoApplicationInputModel, { Applicant: NorwegianApplicant }>;\n\ntype ApplicantDataKey = keyof NorwegianApplicant;\n\nexport const initialApplicantValue: NorwegianApplicant = {\n    Email: '',\n    Phonenumber: '',\n    NationalId: '',\n    MaritalStatus: '',\n    EmploymentStatus: '',\n    AccommodationType: '',\n    AccommodationCost: '',\n    AccommodationTypeOther: '',\n    HasStudentLoan: '',\n    CarboatLoan: '',\n    HasCar: '',\n    YearlyGrossIncome: '',\n    StudentLoan: '',\n    ExtraEarningMonthly: '',\n    Mortgage: '',\n    PartnerIncome: '',\n};\n\nexport const initialValues: NorwegianLoanApplication = {\n    DesiredCredit: '',\n    Applicant: initialApplicantValue,\n    GAClientRef: '',\n};\n\nexport const amountBlock = (t: TFunction): WizardStage<NorwegianLoanApplication> => ({\n    legend: '',\n    sectionNameForTracking: 'Amount',\n    fields: [\n        {\n            name: nameof<NorwegianLoanApplication>('DesiredCredit'),\n            validation: amount(10000, 500000, t),\n            componentProps: {\n                label: 'Hvor mye vil du låne? (10 000 - 500 000)',\n            },\n            Component: AmountInput,\n        },\n    ],\n});\n\nexport const generateFieldNameForApplicant = (fieldName: ApplicantDataKey) => {\n    return (nameof<NorwegianLoanApplication>('Applicant') + '.' + fieldName) as PathsOfType<NorwegianLoanApplication>;\n};\n\nexport const firstBlock = (t: TFunction): WizardStage<NorwegianLoanApplication> => ({\n    legend: 'Personopplysninger ',\n    sectionNameForTracking: `contact information`,\n    fields: [\n        {\n            name: generateFieldNameForApplicant('Email'),\n            validation: emailRequired(t),\n            componentProps: {\n                label: 'E-postadresse',\n            },\n            Component: EmailInput,\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('Phonenumber')),\n            validation: norwegianPhoneNumber(t),\n            componentProps: {\n                label: 'Mobilnummer',\n            },\n            Component: PhoneNumberInput,\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('NationalId')),\n            validation: norwegianNationalId(),\n            componentProps: {\n                label: 'Personnummer',\n            },\n            Component: NationalIdInput,\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('MaritalStatus')),\n            validation: stringRequired(t),\n            componentProps: {\n                label: 'Sivilstatus',\n            },\n            Component: (props) =>\n                React.createElement(FormikSelect, {\n                    ...props,\n                    options: addPleaseSelectOption(martialStatusValues(t), t),\n                }),\n        },\n    ],\n});\n\nexport const secondBlock = (t: TFunction): WizardStage<NorwegianLoanApplication> => ({\n    legend: `Økonomisk situasjon`,\n    sectionNameForTracking: `Economical information`,\n    fields: [\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('EmploymentStatus')),\n            validation: stringRequired(t),\n            componentProps: {\n                label: 'Arbeidssituasjon',\n            },\n            Component: (props) =>\n                React.createElement(FormikSelect, {\n                    //\n                    options: addPleaseSelectOption(employmentStatusCodeNo, t),\n                    ...props,\n                }),\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('YearlyGrossIncome')),\n            validation: amountNotNull(t),\n            componentProps: {\n                label: 'Brutto årsinntekt (før skatt)',\n            },\n            Component: AmountInput,\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('AccommodationType')),\n            validation: stringRequired(t),\n            componentProps: {\n                label: 'Boforhold',\n            },\n            Component: (props) => React.createElement(FormikSelect, { ...props, options: addPleaseSelectOption(accommodationStatusCodesNo, t) }),\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('AccommodationTypeOther')),\n            validation: Yup.string().when('AccommodationType', {\n                is: (val: NorwegianApplicant['AccommodationType']) => specifyAccommodationTypeOther(val),\n                then: () => stringRequired(t),\n                otherwise: () => Yup.string().nullable(),\n            }),\n            componentProps: {\n                label: 'Spesifiser ditt boforhold',\n            },\n            hidden: (values) => !specifyAccommodationTypeOther(values['Applicant'].AccommodationType),\n            Component: (props) => React.createElement(FormikInput, { ...props, type: 'text' }),\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('AccommodationCost')),\n            validation: Yup.number().when('AccommodationType', {\n                is: (val: NorwegianApplicant['AccommodationType']) => specifyAccomodationCost(val),\n                then: () => amountNotEmpty('leiekostnader', t),\n                otherwise: () => Yup.number().nullable(),\n            }),\n            componentProps: (values) => ({\n                label: applicantHasSharedEconomy(values['Applicant'].MaritalStatus)\n                    ? 'Husholdningens leiekostnader/fellesutgifter'\n                    : 'Leiekostnader/fellesutgifter',\n            }),\n            hidden: (values) => !specifyAccomodationCost(values['Applicant'].AccommodationType),\n            Component: AmountInput,\n        },\n    ],\n});\n\nexport const thirdBlock = (t: TFunction): WizardStage<NorwegianLoanApplication> => ({\n    legend: (values) => (applicantHasSharedEconomy(values['Applicant'].MaritalStatus) ? 'Gjeld - husholdningens totale' : 'Gjeld'),\n    sectionNameForTracking: `Debt information`,\n    fields: [\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('HasCar')),\n            validation: stringRequired(t),\n            componentProps: (values) => ({\n                label: applicantHasSharedEconomy(values['Applicant'].MaritalStatus)\n                    ? 'Eier eller leaser husholdningen bil?'\n                    : 'Eier eller leaser du bil?',\n            }),\n            Component: (props) =>\n                React.createElement(FormikInputGroup, {\n                    ...props,\n                    type: 'radio',\n                    options: trueFalseValues(t),\n                    className: style.radioButtons,\n                    horisontal: true,\n                }),\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('ExtraEarningMonthly')),\n            validation: amount(0, Number.MAX_SAFE_INTEGER, t),\n            componentProps: (values) => ({\n                label: applicantHasSharedEconomy(values['Applicant'].MaritalStatus)\n                    ? 'Månedlig skattefri leieinntekt i husholdningen'\n                    : 'Månedlig skattefri leieinntekt',\n                helptext: applicantHasSharedEconomy(values['Applicant'].MaritalStatus)\n                    ? 'Oppgi husholdningens skattefrie inntekt ved utleie av bolig. Skriv 0 om dere ikke har noen leieinntekter.'\n                    : 'Oppgi din skattefrie inntekt ved utleie av bolig. Skriv 0 om du ikke har noen leieinntekter.',\n            }),\n            Component: AmountInput,\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('PartnerIncome')),\n            validation: Yup.number().when('MaritalStatus', {\n                is: (val: NorwegianApplicant['MaritalStatus']) => applicantHasSharedEconomy(val),\n                then: () => amountNotEmpty('Partners brutto årsinntekt', t),\n                otherwise: () => Yup.number().nullable(),\n            }),\n            componentProps: {\n                label: 'Partners brutto årsinntekt',\n            },\n            hidden: (values) => !applicantHasSharedEconomy(values['Applicant'].MaritalStatus),\n            Component: AmountInput,\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('Mortgage')),\n            validation: amountNotNull(t),\n            componentProps: (values) => ({\n                label: applicantHasSharedEconomy(values['Applicant'].MaritalStatus) ? 'Husholdningens samlede boliggjeld' : 'Boliggjeld (din andel)',\n            }),\n            Component: AmountInput,\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('StudentLoan')),\n            validation: amountNotNull(t),\n            componentProps: {\n                label: 'Studiegjeld',\n                helptext: 'Din nåværende personlige studiegjeld.',\n            },\n            Component: AmountInput,\n        },\n        {\n            name: generateFieldNameForApplicant(nameof<NorwegianApplicant>('CarboatLoan')),\n            validation: amountNotNull(t),\n            componentProps: {\n                label: 'Gjeld til bil / båt / MC / bobil',\n                helptext: 'Din nåværende personlige andel gjeld til bil/båt/MC/bobil (cirkabeløp).',\n            },\n            Component: AmountInput,\n        },\n    ],\n});\n","import * as fieldDefinitionsSe from './se/fieldDefinitions';\nimport * as helpersSe from './se/helpers';\nimport * as fieldDefinitionsFi from './fi/fieldDefinitions';\nimport * as helpersFi from './fi/helpers';\nimport * as fieldDefinitionsNo from './no/fieldDefinitions';\nimport * as helpersNo from './no/helpers';\nimport { WizardStage } from '../MultiStageOnePageWizard/types';\nimport { TFunction } from 'i18next';\nimport { useMemo } from 'react';\nimport { CliFieldConfig } from './AmountVisualizer';\nexport * from './AmountVisualizer';\n\ntype ConfigMap = {\n    'SE-CL': {\n        in: fieldDefinitionsSe.SwedishLoanApplication;\n        out: fieldDefinitionsSe.SwedishLoanApplication;\n        config: undefined;\n    };\n    'SE-CLI': {\n        in: fieldDefinitionsSe.SwedishLoanApplication;\n        out: fieldDefinitionsSe.SwedishLoanApplicationCleaned;\n        config: CliFieldConfig;\n    };\n    'FI-CL': {\n        in: fieldDefinitionsFi.FinishLoanApplication;\n        out: fieldDefinitionsFi.FinishLoanApplicationCleaned;\n        config: helpersFi.ConfigType;\n    };\n    'FI-CLI': {\n        in: fieldDefinitionsFi.FinishLoanApplication;\n        out: fieldDefinitionsFi.FinishLoanApplicationCleaned;\n        config: CliFieldConfig;\n    };\n    'NO-CL': {\n        in: fieldDefinitionsNo.NorwegianLoanApplication;\n        out: fieldDefinitionsNo.NorwegianLoanApplication;\n        config: undefined;\n    };\n};\n\ntype Product = keyof ConfigMap;\n\nexport type WizardFormManager<T extends Product = Product> = {\n    [P in T]: {\n        initialValues: ConfigMap[P]['in'];\n        getWizardStages: (t: TFunction, config?: ConfigMap[P]['config']) => WizardStage<ConfigMap[P]['in']>[];\n        mapForSubmit: (values: ConfigMap[P]['in'], config?: ConfigMap[P]['config']) => ConfigMap[P]['out'];\n    };\n}[T];\n\ntype Configs<T extends Product = Product> = { [U in T]: WizardFormManager<U> };\n\nconst configs: Configs = {\n    'SE-CL': {\n        initialValues: fieldDefinitionsSe.initialValues,\n        getWizardStages: helpersSe.getWizardStagesCl,\n        mapForSubmit: helpersSe.cleanupFormValuesForSubmitting,\n    },\n    'SE-CLI': {\n        initialValues: fieldDefinitionsSe.initialValues,\n        getWizardStages: helpersSe.getWizardStagesCli,\n        mapForSubmit: helpersSe.cleanupFormValuesForSubmittingCli,\n    },\n    'FI-CL': {\n        initialValues: fieldDefinitionsFi.initialValues,\n        getWizardStages: helpersFi.getWizardStagesCl,\n        mapForSubmit: helpersFi.cleanupFormValuesForSubmitting,\n    },\n    'FI-CLI': {\n        initialValues: fieldDefinitionsFi.initialValues,\n        getWizardStages: helpersFi.getWizardStagesCli,\n        mapForSubmit: helpersFi.cleanupFormValuesForSubmittingCli,\n    },\n    'NO-CL': {\n        initialValues: fieldDefinitionsNo.initialValues,\n        getWizardStages: helpersNo.getTranslatedStages,\n        mapForSubmit: helpersNo.cleanupFormValuesForSubmitting,\n    },\n};\n\nexport function useWizardFormManager<P extends Product>(product: P): WizardFormManager<P> {\n    return useMemo(() => configs[product], [product]);\n}\n"],"names":["StackedBarChart","bars","total","acc","b","jsx","styles","i","joinNames","getBarSubClass","maybeWithLegend","bar","isGuid","value","getWizardStagesCl","t","amountBlockCl","personalInformation","secondBlock","thirdBlock","personalInformationCoAplicant","getWizardStagesCli","config","amountBlockCli","getConsentFieldDef","cleanupFormValuesForSubmitting","values","getCleanedApplicantDataWithNulledHiddenFields","cleanupFormValuesForSubmittingCli","key","initialValues","m","applicant","withSsn","specifyAccommodationTypeOther","specifyEmployerName","specifyAccomodationCost","specifyStudenLoanPayment","cleanupSwedishNationalId","accommodationType","employmentStatus","AmountVisualizer","country","newLimitField","currentLimit","availableAmount","maxLimit","useTranslation","useField","newLimit","useMemo","increase","newAvailableAmount","changed","jsxs","Hero","Headline","formatWithCurrencyNoDecimals","style","NumberOfTermsValues","v","initialApplicantValue","amount","AmountInput","props","React","FormikSlider","Yup.bool","FormikCheckBox","minLimit","isCli","personalInformationFields","name","Yup.string","emailRequired","EmailInput","swedishPhoneNumber","SwedishMobilePhoneNumberInput","swedishNationalId","SwedishSsnInput","stringRequired","FormikSelect","addPleaseSelectOption","martialStatusValues","Yup.boolean","employmentStatusCodeSe","addComparrisonValidation","val","other","_a","FormikInput","accommodationStatusCodesSe","thirdBlockFields","FormikInputGroup","trueFalseValues","CONFIG","amountBlock","firstBlock","firstBlockCoAplicant","hideRefinanceDebt","cleanupApplicantData","cleaned","desiredCredit","form","firstBlockFields","employmentStatusCodeFi","accommodationStatusCodesFi","Yup.number","amountNotNull","mobileRequired","FinnishMobilePhoneNumberInput","getNationalIdValidation","FinnishSsnInput","getTranslatedStages","applicantHasSharedEconomy","martialStatus","nameof","generateFieldNameForApplicant","fieldName","norwegianPhoneNumber","PhoneNumberInput","norwegianNationalId","NationalIdInput","employmentStatusCodeNo","accommodationStatusCodesNo","amountNotEmpty","configs","fieldDefinitionsSe.initialValues","helpersSe.getWizardStagesCl","helpersSe.cleanupFormValuesForSubmitting","helpersSe.getWizardStagesCli","helpersSe.cleanupFormValuesForSubmittingCli","fieldDefinitionsFi.initialValues","helpersFi.getWizardStagesCl","helpersFi.cleanupFormValuesForSubmitting","helpersFi.getWizardStagesCli","helpersFi.cleanupFormValuesForSubmittingCli","fieldDefinitionsNo.initialValues","helpersNo.getTranslatedStages","helpersNo.cleanupFormValuesForSubmitting","useWizardFormManager","product"],"mappings":"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"}