{"version":3,"sources":["StandardLoan/CustomerOffer/UpdateCustomerOfferContext.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/CurrentLiabilitiesDialog/api.ts","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/api.ts","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/ExpensesCalculator/ExpensesCalculatorProvider.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/ExpensesCalculator/ExpensesSubForm.tsx","StandardLoan/CustomerOffer/LimitWarning.tsx","StandardLoan/ExpensesAndAdditionalIncome/AdditionalIncome/AdditionalIncomeItem.tsx","StandardLoan/CustomerOffer/api.ts","StandardLoan/ExistingClient/ExistingClient.tsx","StandardLoan/ExitProcessDialogWrapper.tsx","StandardLoan/FeedbackFormDialog.tsx","StandardLoan/CustomerOffer/RemoteLimitTooltip.tsx","StandardLoan/CustomerOffer/YourOffer.tsx","StandardLoan/CustomerOffer/EntryFee.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesAndAdditionalIncome.tsx","StandardLoan/ExpensesAndAdditionalIncome/AdditionalIncome/AdditionalIncome.tsx","StandardLoan/ExpensesAndAdditionalIncome/AdditionalIncome/AdditionalIncomeForm.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/ExpensesConfirmation.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/ReadOnlyExpensesConfirmation.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/ExpenseConfirmationForm.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/CurrentLiabilitiesDialog/CurrentLiabilitiesDialog.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/CurrentLiabilitiesDialog/CurrentLiabilitiesDialogContent.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/ExpensesCalculator/ExpensesCalculatorDialog.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/ExpensesCalculator/ExpensesCalculator.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/ExpensesCalculator/RegularExpensesForm.tsx","StandardLoan/ExpensesAndAdditionalIncome/ExpensesConfirmation/ExpensesCalculator/NecessaryExpensesForm.tsx","StandardLoan/DisbursementAccountsField.tsx","StandardLoan/ExistingApplication3PError/ExistingApplication3PError.tsx","StandardLoan/ExistingClient/ExistingClientSuspense.tsx","StandardLoan/ExpensesAndAdditionalIncome/AdditionalIncome/AdditionalIncomesCheck.tsx","StandardLoan/ExpensesAndAdditionalIncome/SaveCustomerOfferSuspense.tsx"],"names":["foldAPIStatus","matches","state","status","whenSuccess","data","whenLoading","oldData","whenError","UpdateCostumerOfferContext","createContext","loanOfferState","option","none","initialLoanOfferState","preapprovedLimitState","refinancingLoanState","updatedOfferStatus","handleUpdateCustomerOffer","constVoid","UpdateCostumerOfferProvider","props","setInitialLoanOfferState","useState","setUpdatedOfferStatus","setLoanOfferState","setPreapprovedLimitState","setRefinancingLoanState","initialCustomerOffer","useCommand","api","updateCustomerOffer","refinancingLoans","useEffect","pipe","taskEither","fold","fromIO","initialCustomerOfferData","genericLoan","onExposureExceeded","offer","updateOfferStatus","cpiPackageList","preaApprovedLimits","preapprovedLimits","Provider","value","values","afterUpdate","constant","identity","some","amount","tenor","salaryTransfer","installmentDay","bankingFeeIncluded","children","useUpdateCustomerOfferContext","context","useContext","Error","AmountLimit","t","min","max","OriginalLoanPurpose","PURCHASE","RECONSTRUCTION","CONSTRUCTION","REVERSE_REPAYMENT","NOT_PURPOSE","RefinanceLoansForLivingSelection","REFINANCE_WITH_LOANS_FOR_LIVING_TRUE","REFINANCE_WITH_LOANS_FOR_LIVING_FALSE","REFINANCE_WITH_ANY_LOANS_FOR_LIVING","ConsumerLoanOrMortgage","creditType","optionFromUndefined","CreditType","currentBalance","MoneyAmount","finalDate","DateFromSQLString","loanPurpose","LoanPurpose","monthlyInstallment","approvedCreditAmount","canBeRefinanced","sharedCreditCoApplicantName","NonEmptyString","loansForLiving","repaidBeforeDisbursement","propertyOwner","contractNumber","originalLoanPurpose","displayOriginalLoanPurpose","displayLoansForLiving","loansForLivingDefaultValue","refinanceLoansForLivingSelection","usedForRefinance","recordId","manuallyAdded","provider","originalLoanAmount","AddConsumerLoanOrMortgageInput","finalDateOfTheLoan","MonthYear","EditConsumerLoanOrMortgageInput","monthlyInstallmentAmount","Overdraft","overdraftLimit","changeLimit","newOverdraftLimit","includedInBonita","OverdraftAddInput","OverdraftEditInput","CreditCard","creditCardLimit","newCreditCardLimit","CreditCardAddInput","CreditCardEditInput","GetAllLiabilitiesOutput","mtgAndClMonthlyInstallmentLimit","mtgAndClCurrentBalanceLimit","mtgAndClApprovedLoanAmountLimit","ccAndOvdCurrentBalanceLimit","ccAndOvdLimit","consumerLoansOrMortgagesList","overdraftsList","creditCardsList","getAllLiabilities","apiCall","path","inputCodec","inputEq","eq","fromEquals","constTrue","outputCodec","start","DeleteLiabilityRecordInput","deleteLiabilityRecord","constFalse","cancelWithoutSaving","saveAndUpdate","addConsumerLoanOrMortgage","editConsumerLoanOrMortgage","addOverdraft","editOverdraft","addCreditCard","editCreditCard","CustomExpensesField","key","NonNegativeInteger","index","eqCustomExpensesField","getStructEq","eqString","eqNumber","NecessaryExpenses","commonPurchasesAmount","withFallback","housingAmount","transportAmount","clothesAmount","repairsAmount","healthAmount","entertainmentAmount","educationAmount","alimonyAmount","cateringAmount","customExpensesFields","otherAmount","RegularExpenses","savingAmount","pensionAmount","fusesAmount","ExpensesCalculatorData","necessaryExpenses","regularExpenses","ExpensesOutput","minMontlyExpenses","otherRegularExpenses","regularMontlyExpenses","alimonyExpenses","isCalculatorUsed","expensesCalculator","eqNecessaryExpenses","array","getEq","eqRegularExpenses","eqExpensesCalculatorData","SaveExpenseCalculatorDataInput","saveExpenseCalculatorData","getExpenses","BonitaStatus","PENDING","ERROR","DONE","NOT_STARTED","LfDecision","Approved","Rejected","Counteroffer","Pending","SubmitExpensesResponse","needAdditionalIncomeStep","hasAdditionalIncome","lfDecision","SubmitExpensesInput","otherMontlyExpenses","PositiveInteger","disclaimerCheckbox","payAlimony","eqSubmitExpensesInput","eqStrict","eqBoolean","submitExpenses","ExpensesCalculatorContext","regularSum","setRegularSum","_","necessarySum","setNecessarySum","totalSum","calculatorData","setCalculatorData","ExpensesCalculatorProvider","setTotalSum","initialExpenses","useExpensesCalculatorContext","ExpensesSubForm","formatMessage","useFormatMessage","tenantCurrency","useTenantCurrency","fieldProps","fields","getMoneyField","field","label","decimalDigits","currency","placeholder","unsafeLocalizedString","chunksOf","map","arr","length","type","translationKey","useOfferLimitsInformation","flowType","loanOffer","wayOfIdentification","isTopUpActive","allInternalLoanSelected","selectedRefinancingCredits","apiParameters","tenant","useAppContext","topUpLimit","foldPreapprovedLimits","whenTl","TL","maximumpreapprovedlimit","whenCl","CL","whenEmpty","preapprovedLimit","foldCLPreapprovedLimits","whenNotCL","countPreapprovedLimit","chain","limit","refinancedAmountExternal","internal","refinancedInternalCCOVD","countTopUpLimit","moneyAmountLimit","limitData","isTL","boolean","preApprovedInstallmentLimit","maximuminstallment","isTenantSK","foldTenant","hasAmountLimit","isFlowRemote","foldFlowType","when3P","whenInPerson","whenTLSAgent","whenHomeBanking","whenSmartBanking","whenPWSRemote","hasLimits","bankingFee","getOrElse","feeToBeSubtracted","limitAmount","preApprovedInstallment","installment","consideredAmount","totalAmount","isAmountOverLimit","LimitWarning","formatMoneyAmount","useFormatMoneyAmount","isWarningVisible","setIsWarningVisible","channel","isTls","warningForAdditionalIncome","limitExceeded","constNull","units","content","actions","onDismiss","title","preApprovedLimitMessage","message","size","variant","action","onExit","eligibleForPreapproved","AdditionalIncomeItem","removeIncome","loading","setLoading","errorNo","setErrorNo","canPoll","setCanPoll","restartPoll","usePollingEffect","getBonitaStatus","intervalMS","disabled","shouldPollingContinue","val","bonitaStatus","onError","curr","onSuccess","response","onDelete","initializedIncome","additionalIncomeData","allowanceInfo","companyInfo","contractInfo","incomeInfo","uniqueId","hasPreapprovedLimits","hAlignContent","grow","shrink","column","heading","subtitle","edit","isEditing","onEditing","constUndefined","remove","incomeSources","incomeOptions","onSubmit","onSave","onCancel","specialIncomeSources","selectedCompanies","isReworking","oldValues","reworkAll","hideCancel","CPIAdditionalQuestions","consideringFinancial","declared","experienceWithCPI","knowledge","CreditProtectionInsuranceType","BASIC","MIDDLE","UPPER","Basic","Standard","Full","None","CreditProtectionInsurance","name","RuntimeLocaleKey","features","price","eligible","CPIPackageList","options","nonEmptyArray","selectedInsurance","SelectedInsurance","InsuranceSolvencyAnswers","firstQuestion","secondQuestion","eqInsuranceSolvencyAnswers","GetInsuranceListOutput","GetInsuranceSolvencyAnswersOutput","optionFromNullable","cpiAnswers","insuranceDocument","DocumentContentOutput","AgeLimitError","id","InsuranceError","GenericError","getSelectedInsurance","errorCodec","setAdditionalQuestions","getInsuranceSolvencyAnswers","setInsuranceSolvencyAnswers","ExistingClient","renderNon3PBlock","subheading","getSubtitleByReason","reason","getButtonLabelByReason","isModal","dialogTitle","onDialogDismiss","onDialogExit","validateUser","details","hasPhoneNumber","hasEmailAddress","hasPasswordForCommunication","isPWSRemote","ExitProcessDialogWrapper","step","setStep","saveApplication","window","onunload","onSaveAndExit","task","onProcessExit","onLogoClick","onExitAction","iconAction","headerActions","exit","inAuthenticatedPage","isExiting","whenSaveApplication","whenFeedbackForm","FeedbackFormDialog","deleteCurrentApplication","deleteApplication","sendFeedback","exitProcess","showErrorBanner","setShowErrorBanner","setValues","handleSubmit","useForm","initialValues","needsHigherAmount","needsShorterTenor","other","fieldValidators","input","these","fromOptions","fromPredicate","reasonDetails","onChange","checked","isSome","issues","onBlur","autogrow","RemoteLimitTooltip","renderChildren","Field","isMobileLayout","useIsMobileLayout","fluidOrUnits","fluid","undefined","style","padding","spaceUnit","vAlignContent","weight","color","palette","neutral700","YourOffer","currentLoanOffer","genericLoanOffer","formatMoneyAmountValue","useFormatMoneyAmountValue","unsafeNonNegativeInteger","refinancingAmount","Positive","decode","sequenceS","either","borrowedAmount","error","EntryFeeRadioGroup","forwardRef","forwardedRef","ref","optionKey","toString","renderOption","renderOptionChildren","included","marginTop","feeIncluded","entryFee","position","inline","blue600","isOptionDisabled","ExpensesAndAdditionalIncome","showAdditionalIncomeStep","setShowAdditionalIncomeStep","setIsEditingAdditionalIncome","activeIndex","setActiveIndex","isNone","reworkData","isHeaderReadonly","setIsHeaderReadonly","onExpensesConfirmationNext","onCounterOffer","onNext","onRejected","expensesConfirmationStep","additionalIncomeStep","onEditingStateChange","onPending","additionalIncomeMap","items","hideOnMobile","emptyRework","onBack","AdditionalIncome","editingPanelIndex","setEditingPanelIndex","isAddingNewIncome","setIsAddingNewIncome","setHasAdditionalIncome","of","additionalIncomeList","refreshList","useQuery","proceedNext","incomeList","listHasNoItems","useMemo","constantEmptyResponse","mainSourceOfIncome","mainSpecialTypeOfIncome","remoteData","listHasOneItem","showList","getAdditionalIncomeStepChanges","useGetAdditionalIncomeStepChanges","record","toArray","k","v","fromEither","stepComments","reworkApi","config","r6Enabled","comments","useRemoteData","reworkCategories","reworkComments","areReworkChanges","areReworkComments","getOtherIncomes","currentRecordId","filter","item","exists","filterIncomeSources","sourceCount","CompanyOwner","Employed","EmployedAbroad","Freelancer","SpecialType","TradesmanCoOperatingPerson","isEmploymentBasedIncome","source","isEntrepreneurBasedIncome","income","incomeSource","forEach","currentValue","sourceOfIncomeOptions","maxEmployedBased","filterWithIndex","foldMap","monoid","monoidSum","sum","maxEntrepreneurBased","fromArray","filterSpecialIncomeSources","specialIncomeSourceCount","Alimony","MaternityLeave","Pensioner","usedIncomes","push","specialTypeOfIncome","availableIncomes","specialTypeOfIncomeOptions","incomes","getSelectedCompanies","info","companyName","companyIco","company","changes","reworkBanner","flow","editingIndex","lookup","icon","PlusIcon","list","labels","normal","success","AdditionalIncomeForm","addNewIncome","editIncome","canSubmit","setCanSubmit","submitTrigger","setSubmitTrigger","isCancelling","setIsCancelling","cancelButton","submitButton","incomeData","incomeSourceList","specialIncomeSourceList","onDataReady","additionalIncome","onFailure","alreadySelectedCompanies","rework","personalData","isMainIncome","onChangeIncomeSourceType","monthlyIncome","salaryCurrency","ExpensesConfirmation","submitFormState","setSubmitFormState","setShowError","isLiabilitiesDialogOpen","setIsLiabilitiesDialogOpen","isExpensesDialogOpen","setIsExpensesDialogOpen","readOnly","setReadOnly","setBonitaStatus","submitExpensesResponse","expensesResponse","expenses","refreshExpenses","submitExpensesForm","validators","foldOtherExpenses","formStateOtherExpenses","remoteOtherExpenses","filterMap","equals","foldAlimonyAmount","formStateAlimonyAmount","remoteAlimonyAmount","otherNecessaryExpensesCalculatorValue","reduce","acc","cur","Array","isArray","updateLoading","newVal","getDifferenceFromNecessaryAndEstimated","formStatePayAlimony","remotePayAlimony","otherExpenses","alimony","isOpen","onSaved","minMonthlyExpenses","ReadOnlyExpensesConfirmation","optionToZero","description","ExpensesConfirmationForm","showExpensesCalculator","useCheckTenant","checkTenant","CZ","SK","handleReset","validator","right","bimap","definedNoExtract","left","totalActualExpenses","useUpdateEffect","JSON","stringify","display","flexGrow","alignItems","CurrentLiabilitiesDialog","cancelWithoutSavingStandardLoan","standardLoanApi","handleClose","onClose","CurrentLiabilitiesDialogContent","allLiabilities","defaultApplicant","unsafeNonNegative","loanProviders","standartLoanApi","results","getCurrentApplicant","applicantIndex","providersList","loanProviderList","code","isViewMode","isACPhase","loanList","selectedApplicant","isBonitaEvaluated","selectedOfferLoanAmount","othersLoanList","amountLimits","mtgCurrentBalance","mtgOriginalLoanAmount","ccAndOvdCurrentBalance","onEditStart","onEditEnd","reworkCBResults","checks","updateChecks","ExpensesCalculatorDialog","ExpensesCalculator","isLoading","setIsLoading","el","document","querySelector","blur","necessaryExpensesData","regularExpensesData","RegularExpensesForm","customFieldsUpdate","setCustomFieldUpdate","customFieldsChanged","useCallback","n","getInitialValue","initialValue","customFieldsValues","sort","ord","ordNumber","contramap","rank","customFields","mapWithIndex","isTouched","regularExpensesfusesAmount","regularExpensessavingAmount","regularExpensespensionAmount","regularExpensesotherAmount","necessaryFP","getValue","fieldvalue","customFieldsSum","fieldsSum","current","NecessaryExpensesForm","necessaryExpensescommonPurchasesAmount","necessaryExpensesalimonyAmount","necessaryExpensescateringAmount","necessaryExpensesclothesAmount","necessaryExpenseseducationAmount","necessaryExpensesentertainmentAmount","necessaryExpenseshealthAmount","necessaryExpenseshousingAmount","necessaryExpensesrepairsAmount","necessaryExpensestransportAmount","necessaryExpensesotherAmount","DisbursementAccountsField","disbursementAccounts","onFinishLoading","accounts","accountName","selectedDropdownOption","dropdownOptionToValue","searchable","clearable","ExistingApplication3PError","ExistingClientSuspense","checkSLMinimumAge","slApi","checkPrivateClient","clientApi","checkForeign","standardLoanCheckNotes","standardLoanCheckPrimaryIdInPerson","standardLoanCheckKyc","standardLoanCheckPhoneNumberAndEmail","onRequestFailure","phoneNumberVerified","isPhoneNumberVerified","filterOrElse","privateClient","underAge","hasBlockingNotes","highRisk","phoneNumberNeeded","height","AdditionalIncomesCheck","getAdditionalIncomes","onFinish","SaveCustomerOfferSuspense","saveCustomerSelectedOffer","apis","onContinue"],"mappings":"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","file":"static/js/index~67e750cc.4501c419.chunk.js","sourcesContent":["import { createContext, useContext, useEffect, useState } from \"react\";\nimport * as api from \"../api\";\nimport { TLAndCLLimits } from \"../api\";\nimport { LimitData } from \"../../ClientProfile/domain\";\nimport { option, taskEither } from \"fp-ts\";\nimport { constant, constVoid, identity, pipe } from \"fp-ts/function\";\nimport { useCommand } from \"../../useAPI\";\nimport { Reader } from \"fp-ts/Reader\";\nimport { IO } from \"fp-ts/IO\";\nimport { NonNegative, PositiveInteger } from \"design-system\";\nimport { Option } from \"fp-ts/Option\";\nimport { CPIPackageList } from \"./api\";\n\ntype LoadingAPIStatus = {\n status: \"loading\";\n oldData: Option;\n};\n\ntype ErrorAPIStatus = {\n status: \"error\";\n};\n\ntype SuccessAPIStatus = {\n status: \"success\";\n data: T;\n};\n\ntype APIStatus = LoadingAPIStatus | ErrorAPIStatus | SuccessAPIStatus;\n\nexport type OfferResponse = {\n genericLoan: api.GenericLoanResponseOutput;\n cpiPackageList: Option;\n preaApprovedLimits: TLAndCLLimits;\n};\n\nexport type LoanOfferState = APIStatus;\nexport type PreapprovedLimitState = APIStatus;\nexport type RefinancingLoanState = APIStatus;\n\nexport function foldAPIStatus(matches: {\n whenSuccess: Reader;\n whenLoading: Reader, O>;\n whenError: IO;\n}): Reader, O> {\n return state => {\n switch (state.status) {\n case \"success\":\n return matches.whenSuccess(state.data);\n case \"loading\":\n return matches.whenLoading(state.oldData);\n case \"error\":\n return matches.whenError();\n }\n };\n}\n\ntype HandleUpdateCustomerOffer = (\n values: ConfiguratorValues,\n afterUpdate?: Reader\n) => void;\n\nexport interface UpdateCostumerOfferContext {\n loanOfferState: LoanOfferState;\n initialLoanOfferState: LoanOfferState;\n preapprovedLimitState: PreapprovedLimitState;\n refinancingLoanState: RefinancingLoanState;\n updatedOfferStatus: api.UpdateOfferStatus;\n handleUpdateCustomerOffer: HandleUpdateCustomerOffer;\n}\n\nexport const UpdateCostumerOfferContext = createContext(\n {\n loanOfferState: { status: \"loading\", oldData: option.none },\n initialLoanOfferState: { status: \"loading\", oldData: option.none },\n preapprovedLimitState: { status: \"loading\", oldData: option.none },\n refinancingLoanState: { status: \"loading\", oldData: option.none },\n updatedOfferStatus: \"OK\",\n handleUpdateCustomerOffer: constVoid,\n }\n);\n\ntype UpdateCostumerOfferProps = {\n hasRefinancingCredits: boolean;\n children: JSX.Element;\n onExposureExceeded: () => void;\n};\n\nexport interface ConfiguratorValues {\n amount: NonNegative;\n tenor: PositiveInteger;\n installmentDay: PositiveInteger;\n salaryTransfer: boolean;\n bankingFeeIncluded: Option;\n}\n\nexport const UpdateCostumerOfferProvider = (\n props: UpdateCostumerOfferProps\n) => {\n /* states */\n const [\n initialLoanOfferState,\n setInitialLoanOfferState,\n ] = useState({\n status: \"loading\",\n oldData: option.none,\n });\n\n const [\n updatedOfferStatus,\n setUpdatedOfferStatus,\n ] = useState(\"OK\");\n\n const [loanOfferState, setLoanOfferState] = useState({\n status: \"loading\",\n oldData: option.none,\n });\n\n const [\n preapprovedLimitState,\n setPreapprovedLimitState,\n ] = useState({\n status: \"loading\",\n oldData: option.none,\n });\n\n const [\n refinancingLoanState,\n setRefinancingLoanState,\n ] = useState({\n status: \"loading\",\n oldData: option.none,\n });\n\n /* api */\n const initialCustomerOffer = useCommand(api.initCustomerOffer);\n const updateCustomerOffer = useCommand(api.updateCustomerOffer);\n const refinancingLoans = useCommand(api.refinancingLoanList);\n\n const handleUpdateCustomerOffer = (\n values: ConfiguratorValues,\n afterUpdate: Reader = constVoid\n ) => {\n setLoanOfferState({\n ...loanOfferState,\n status: \"loading\",\n oldData: pipe(\n loanOfferState,\n foldAPIStatus({\n whenError: constant(option.none),\n whenLoading: identity,\n whenSuccess: option.some,\n })\n ),\n });\n pipe(\n updateCustomerOffer({\n amount: values.amount,\n tenor: values.tenor,\n salaryTransfer: values.salaryTransfer,\n installmentDay: values.installmentDay,\n bankingFeeIncluded: values.bankingFeeIncluded,\n }),\n taskEither.fold(\n () =>\n taskEither.fromIO(() => {\n setLoanOfferState({ ...loanOfferState, status: \"error\" });\n }),\n data =>\n taskEither.fromIO(() => {\n pipe(\n data.genericLoan,\n option.fold(props.onExposureExceeded, offer => {\n if (\n data.updateOfferStatus === \"EXPOSURE_EXCEEDED\" ||\n data.updateOfferStatus === \"GENERIC_PCE_ERROR\"\n ) {\n props.onExposureExceeded();\n }\n setUpdatedOfferStatus(data.updateOfferStatus);\n setLoanOfferState({\n data: {\n genericLoan: offer,\n cpiPackageList: data.cpiPackageList,\n preaApprovedLimits: data.preapprovedLimits,\n },\n status: \"success\",\n });\n })\n );\n afterUpdate(data);\n })\n )\n )();\n };\n\n /* first load */\n useEffect(() => {\n pipe(\n initialCustomerOffer(),\n taskEither.fold(\n () =>\n taskEither.fromIO(() => {\n setInitialLoanOfferState({\n ...initialLoanOfferState,\n status: \"error\",\n });\n setPreapprovedLimitState({\n ...preapprovedLimitState,\n status: \"error\",\n });\n }),\n initialCustomerOfferData =>\n taskEither.fromIO(() => {\n pipe(\n initialCustomerOfferData.genericLoan,\n option.fold(props.onExposureExceeded, offer => {\n if (\n initialCustomerOfferData.updateOfferStatus ===\n \"EXPOSURE_EXCEEDED\" ||\n initialCustomerOfferData.updateOfferStatus ===\n \"GENERIC_PCE_ERROR\"\n ) {\n props.onExposureExceeded();\n }\n setUpdatedOfferStatus(\n initialCustomerOfferData.updateOfferStatus\n );\n setInitialLoanOfferState({\n data: {\n genericLoan: offer,\n cpiPackageList: initialCustomerOfferData.cpiPackageList,\n preaApprovedLimits:\n initialCustomerOfferData.preapprovedLimits,\n },\n status: \"success\",\n });\n setPreapprovedLimitState({\n data: {\n preapprovedLimits:\n initialCustomerOfferData.preapprovedLimits,\n },\n status: \"success\",\n });\n\n pipe(\n refinancingLoans(),\n taskEither.fold(\n () =>\n taskEither.fromIO(() => {\n setRefinancingLoanState({\n ...refinancingLoanState,\n status: \"error\",\n });\n }),\n data =>\n taskEither.fromIO(() => {\n setRefinancingLoanState({\n data: data,\n status: \"success\",\n });\n })\n )\n )();\n })\n );\n })\n )\n )();\n }, []);\n\n return (\n \n {props.children}\n \n );\n};\n\nexport function useUpdateCustomerOfferContext() {\n const context = useContext(UpdateCostumerOfferContext);\n\n if (!context) {\n throw new Error(\"UpdateCostumerOfferContext not provided\");\n }\n\n return context;\n}\n","import * as t from \"io-ts\";\nimport { CreditType, LoanPurpose } from \"../../../../MortgageDashboard/domain\";\nimport { eq } from \"fp-ts\";\nimport { constFalse, constTrue } from \"fp-ts/function\";\nimport { apiCall } from \"../../../../APICall\";\nimport {\n DateFromSQLString,\n MoneyAmount,\n MonthYear,\n optionFromUndefined,\n} from \"../../../../globalDomain\";\nimport { NonEmptyString } from \"io-ts-types/lib/NonEmptyString\";\n\nconst AmountLimit = t.type({ min: t.number, max: t.number });\nexport type AmountLimit = t.TypeOf;\n\nexport const OriginalLoanPurpose = t.keyof({\n PURCHASE: true,\n RECONSTRUCTION: true,\n CONSTRUCTION: true,\n REVERSE_REPAYMENT: true,\n NOT_PURPOSE: true,\n});\nexport type OriginalLoanPurpose = t.TypeOf;\n\nexport const RefinanceLoansForLivingSelection = t.keyof({\n REFINANCE_WITH_LOANS_FOR_LIVING_TRUE: true,\n REFINANCE_WITH_LOANS_FOR_LIVING_FALSE: true,\n REFINANCE_WITH_ANY_LOANS_FOR_LIVING: true,\n});\nexport type RefinanceLoansForLivingSelection = t.TypeOf<\n typeof RefinanceLoansForLivingSelection\n>;\n\nexport const ConsumerLoanOrMortgage = t.type(\n {\n creditType: optionFromUndefined(CreditType),\n currentBalance: optionFromUndefined(MoneyAmount),\n finalDate: optionFromUndefined(DateFromSQLString),\n loanPurpose: optionFromUndefined(LoanPurpose),\n monthlyInstallment: optionFromUndefined(MoneyAmount),\n approvedCreditAmount: optionFromUndefined(MoneyAmount),\n canBeRefinanced: optionFromUndefined(t.boolean),\n sharedCreditCoApplicantName: optionFromUndefined(NonEmptyString),\n loansForLiving: optionFromUndefined(t.boolean),\n repaidBeforeDisbursement: optionFromUndefined(t.boolean),\n propertyOwner: optionFromUndefined(t.boolean),\n contractNumber: optionFromUndefined(t.string),\n originalLoanPurpose: optionFromUndefined(OriginalLoanPurpose),\n displayOriginalLoanPurpose: optionFromUndefined(t.boolean),\n displayLoansForLiving: optionFromUndefined(t.boolean),\n loansForLivingDefaultValue: optionFromUndefined(t.boolean),\n refinanceLoansForLivingSelection: optionFromUndefined(\n RefinanceLoansForLivingSelection\n ),\n usedForRefinance: optionFromUndefined(t.boolean),\n recordId: NonEmptyString,\n manuallyAdded: t.boolean,\n provider: optionFromUndefined(NonEmptyString),\n originalLoanAmount: optionFromUndefined(MoneyAmount),\n },\n \"ConsumerLoanOrMortgage\"\n);\nexport type ConsumerLoanOrMortgage = t.TypeOf;\n\nexport const AddConsumerLoanOrMortgageInput = t.type(\n {\n creditType: CreditType,\n currentBalance: MoneyAmount,\n finalDateOfTheLoan: MonthYear,\n loanPurpose: LoanPurpose,\n monthlyInstallment: MoneyAmount,\n originalLoanAmount: MoneyAmount,\n usedForRefinance: optionFromUndefined(t.boolean),\n },\n \"ConsumerLoanOrMortgageInput\"\n);\nexport type AddConsumerLoanOrMortgageInput = t.TypeOf<\n typeof AddConsumerLoanOrMortgageInput\n>;\n\nexport const EditConsumerLoanOrMortgageInput = t.type(\n {\n creditType: CreditType,\n currentBalance: MoneyAmount,\n finalDate: MonthYear,\n loanPurpose: LoanPurpose,\n monthlyInstallmentAmount: MoneyAmount,\n approvedCreditAmount: MoneyAmount,\n recordId: NonEmptyString,\n },\n \"EditConsumerLoanOrMortgageInput\"\n);\nexport type EditConsumerLoanOrMortgageInput = t.TypeOf<\n typeof EditConsumerLoanOrMortgageInput\n>;\n\nexport const Overdraft = t.type(\n {\n currentBalance: optionFromUndefined(MoneyAmount),\n overdraftLimit: optionFromUndefined(MoneyAmount),\n repaidBeforeDisbursement: optionFromUndefined(t.boolean),\n changeLimit: optionFromUndefined(t.boolean),\n contractNumber: optionFromUndefined(t.string),\n newOverdraftLimit: optionFromUndefined(MoneyAmount),\n manuallyAdded: t.boolean,\n recordId: NonEmptyString,\n provider: optionFromUndefined(NonEmptyString),\n usedForRefinance: optionFromUndefined(t.boolean),\n includedInBonita: optionFromUndefined(t.boolean),\n },\n \"OverdraftAdd\"\n);\nexport type Overdraft = t.TypeOf;\n\nexport const OverdraftAddInput = t.type(\n {\n currentBalance: MoneyAmount,\n overdraftLimit: MoneyAmount,\n },\n \"OverdraftAddInput\"\n);\nexport type OverdraftAddInput = t.TypeOf;\n\nexport const OverdraftEditInput = t.type(\n {\n currentBalance: MoneyAmount,\n overdraftLimit: MoneyAmount,\n recordId: NonEmptyString,\n },\n \"OverdraftEditInput\"\n);\nexport type OverdraftEditInput = t.TypeOf;\n\nexport const CreditCard = t.type(\n {\n currentBalance: optionFromUndefined(MoneyAmount),\n creditCardLimit: optionFromUndefined(MoneyAmount),\n repaidBeforeDisbursement: optionFromUndefined(t.boolean),\n changeLimit: optionFromUndefined(t.boolean),\n contractNumber: optionFromUndefined(t.string),\n newOverdraftLimit: optionFromUndefined(MoneyAmount),\n manuallyAdded: t.boolean,\n recordId: NonEmptyString,\n provider: optionFromUndefined(NonEmptyString),\n newCreditCardLimit: optionFromUndefined(MoneyAmount),\n usedForRefinance: optionFromUndefined(t.boolean),\n includedInBonita: optionFromUndefined(t.boolean),\n },\n \"OverdraftAdd\"\n);\nexport type CreditCard = t.TypeOf;\n\nexport const CreditCardAddInput = t.type(\n {\n currentBalance: MoneyAmount,\n creditCardLimit: MoneyAmount,\n },\n \"OverdraftAddInput\"\n);\nexport type CreditCardAddInput = t.TypeOf;\n\nexport const CreditCardEditInput = t.type(\n {\n currentBalance: MoneyAmount,\n creditCardLimit: MoneyAmount,\n recordId: NonEmptyString,\n },\n \"CreditCardEditInput\"\n);\nexport type CreditCardEditInput = t.TypeOf;\n\nexport const GetAllLiabilitiesOutput = t.type(\n {\n mtgAndClMonthlyInstallmentLimit: AmountLimit,\n mtgAndClCurrentBalanceLimit: AmountLimit,\n mtgAndClApprovedLoanAmountLimit: AmountLimit,\n ccAndOvdCurrentBalanceLimit: AmountLimit,\n ccAndOvdLimit: AmountLimit,\n consumerLoansOrMortgagesList: t.array(ConsumerLoanOrMortgage),\n overdraftsList: t.array(Overdraft),\n creditCardsList: t.array(CreditCard),\n },\n \"GetAllLiabilitiesOutput\"\n);\n\nexport type GetAllLiabilitiesOutput = t.TypeOf;\n\nexport const getAllLiabilities = apiCall({\n path: [\n \"packages\",\n \"loans\",\n \"standard-loan\",\n \"liabilities\",\n \"getAllLiabilities\",\n ],\n inputCodec: t.void,\n inputEq: eq.fromEquals(constTrue),\n outputCodec: GetAllLiabilitiesOutput,\n});\n\nexport const start = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"liabilities\", \"start\"],\n inputCodec: t.void,\n inputEq: eq.fromEquals(constTrue),\n});\n\nconst DeleteLiabilityRecordInput = t.type(\n { recordId: NonEmptyString },\n \"DeleteLiabilityRecordInput\"\n);\n\nexport const deleteLiabilityRecord = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"liabilities\", \"delete\"],\n inputCodec: DeleteLiabilityRecordInput,\n inputEq: eq.fromEquals(constFalse),\n});\n\nexport const cancelWithoutSaving = apiCall({\n path: [\n \"packages\",\n \"loans\",\n \"standard-loan\",\n \"liabilities\",\n \"cancelWithoutSaving\",\n ],\n inputCodec: t.void,\n inputEq: eq.fromEquals(constFalse),\n});\n\nexport const saveAndUpdate = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"liabilities\", \"save\"],\n inputCodec: t.void,\n inputEq: eq.fromEquals(constFalse),\n});\n\nexport const addConsumerLoanOrMortgage = apiCall({\n path: [\n \"packages\",\n \"loans\",\n \"standard-loan\",\n \"liabilities\",\n \"addConsumerLoanOrMortgage\",\n ],\n inputCodec: AddConsumerLoanOrMortgageInput,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: ConsumerLoanOrMortgage,\n});\n\nexport const editConsumerLoanOrMortgage = apiCall({\n path: [\n \"packages\",\n \"loans\",\n \"standard-loan\",\n \"liabilities\",\n \"editConsumerLoanOrMortgage\",\n ],\n inputCodec: EditConsumerLoanOrMortgageInput,\n outputCodec: ConsumerLoanOrMortgage,\n inputEq: eq.fromEquals(constFalse),\n});\n\nexport const addOverdraft = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"liabilities\", \"addOverdraft\"],\n inputCodec: OverdraftAddInput,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: Overdraft,\n});\n\nexport const editOverdraft = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"liabilities\", \"editOverdraft\"],\n inputCodec: OverdraftEditInput,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: Overdraft,\n});\n\nexport const addCreditCard = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"liabilities\", \"addCreditCard\"],\n inputCodec: CreditCardAddInput,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: CreditCard,\n});\n\nexport const editCreditCard = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"liabilities\", \"editCreditCard\"],\n inputCodec: CreditCardEditInput,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: CreditCard,\n});\n","import * as t from \"io-ts\";\nimport { MoneyAmount, optionFromUndefined } from \"../../../globalDomain\";\nimport { apiCall } from \"../../../APICall\";\nimport { constFalse } from \"fp-ts/function\";\nimport { array, eq } from \"fp-ts\";\nimport { Eq } from \"fp-ts/Eq\";\nimport { NonNegativeInteger, PositiveInteger } from \"design-system\";\nimport { withFallback } from \"io-ts-types/lib/withFallback\";\n\nexport const CustomExpensesField = t.type({\n key: t.string,\n value: NonNegativeInteger,\n index: NonNegativeInteger,\n});\n\nexport type CustomExpensesField = t.TypeOf;\n\nconst eqCustomExpensesField: Eq = eq.getStructEq({\n key: eq.eqString,\n value: eq.eqNumber,\n index: eq.eqNumber,\n});\n\nexport const NecessaryExpenses = t.type({\n commonPurchasesAmount: withFallback(t.number, 0),\n housingAmount: withFallback(t.number, 0),\n transportAmount: withFallback(t.number, 0),\n clothesAmount: withFallback(t.number, 0),\n repairsAmount: withFallback(t.number, 0),\n healthAmount: withFallback(t.number, 0),\n entertainmentAmount: withFallback(t.number, 0),\n educationAmount: withFallback(t.number, 0),\n alimonyAmount: withFallback(t.number, 0),\n cateringAmount: withFallback(t.number, 0),\n customExpensesFields: t.array(CustomExpensesField),\n otherAmount: withFallback(t.number, 0),\n});\n\nexport type NecessaryExpenses = t.TypeOf;\n\nexport const RegularExpenses = t.type({\n savingAmount: withFallback(t.number, 0),\n pensionAmount: withFallback(t.number, 0),\n fusesAmount: withFallback(t.number, 0),\n customExpensesFields: t.array(CustomExpensesField),\n otherAmount: withFallback(t.number, 0),\n});\n\nexport type RegularExpenses = t.TypeOf;\n\nexport const ExpensesCalculatorData = t.type({\n necessaryExpenses: NecessaryExpenses,\n regularExpenses: RegularExpenses,\n});\n\nexport type ExpensesCalculatorData = t.TypeOf;\n\nexport const ExpensesOutput = t.type(\n {\n minMontlyExpenses: MoneyAmount,\n otherRegularExpenses: optionFromUndefined(MoneyAmount),\n regularMontlyExpenses: MoneyAmount,\n alimonyExpenses: optionFromUndefined(MoneyAmount),\n isCalculatorUsed: t.boolean,\n expensesCalculator: optionFromUndefined(ExpensesCalculatorData),\n },\n \"ExpensesResponse\"\n);\n\nconst eqNecessaryExpenses: Eq = eq.getStructEq({\n commonPurchasesAmount: eq.eqNumber,\n housingAmount: eq.eqNumber,\n transportAmount: eq.eqNumber,\n clothesAmount: eq.eqNumber,\n repairsAmount: eq.eqNumber,\n healthAmount: eq.eqNumber,\n entertainmentAmount: eq.eqNumber,\n educationAmount: eq.eqNumber,\n alimonyAmount: eq.eqNumber,\n cateringAmount: eq.eqNumber,\n customExpensesFields: array.getEq(eqCustomExpensesField),\n otherAmount: eq.eqNumber,\n});\n\nconst eqRegularExpenses: Eq = eq.getStructEq({\n savingAmount: eq.eqNumber,\n pensionAmount: eq.eqNumber,\n fusesAmount: eq.eqNumber,\n customExpensesFields: array.getEq(eqCustomExpensesField),\n otherAmount: eq.eqNumber,\n});\n\nexport const eqExpensesCalculatorData: Eq = eq.getStructEq(\n {\n necessaryExpenses: eqNecessaryExpenses,\n regularExpenses: eqRegularExpenses,\n }\n);\n\nexport const SaveExpenseCalculatorDataInput = t.type(\n {\n expensesCalculator: ExpensesCalculatorData,\n },\n \"SubmitExpensesBody\"\n);\nexport const saveExpenseCalculatorData = apiCall({\n path: [\n \"packages\",\n \"loans\",\n \"standard-loan\",\n \"expenses\",\n \"saveExpensesCalculator\",\n ],\n inputCodec: SaveExpenseCalculatorDataInput,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: t.unknown,\n});\n\nexport type ExpensesOutput = t.TypeOf;\n\nexport const getExpenses = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"expenses\"],\n inputCodec: t.void,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: ExpensesOutput,\n});\nexport const BonitaStatus = t.keyof({\n PENDING: true,\n ERROR: true,\n DONE: true,\n NOT_STARTED: true,\n});\n\nexport type BonitaStatus = t.TypeOf;\n\nexport const LfDecision = t.keyof({\n Approved: true,\n Rejected: true,\n Counteroffer: true,\n Pending: true,\n});\nexport type LfDecision = t.TypeOf;\nexport const SubmitExpensesResponse = t.type(\n {\n needAdditionalIncomeStep: t.boolean,\n hasAdditionalIncome: t.boolean,\n lfDecision: LfDecision,\n },\n \"SubmitExpensesResponse\"\n);\n\nexport type SubmitExpensesResponse = t.TypeOf;\n\nexport const SubmitExpensesInput = t.type(\n {\n otherMontlyExpenses: optionFromUndefined(PositiveInteger),\n disclaimerCheckbox: t.boolean,\n payAlimony: optionFromUndefined(t.boolean),\n alimonyAmount: optionFromUndefined(PositiveInteger),\n },\n \"SubmitExpensesBody\"\n);\n\nexport type SubmitExpensesInput = t.TypeOf;\n\nexport const SubmitExpensesOutput = t.type(\n {\n needAdditionalIncomeStep: t.boolean,\n },\n \"SubmitExpensesResponse\"\n);\n\nexport type SubmitExpensesOutput = t.TypeOf;\n\nconst eqSubmitExpensesInput: Eq = eq.getStructEq({\n otherMontlyExpenses: eq.eqStrict,\n payAlimony: eq.eqStrict,\n alimonyAmount: eq.eqStrict,\n disclaimerCheckbox: eq.eqBoolean,\n});\n\nexport const submitExpenses = apiCall({\n inputEq: eqSubmitExpensesInput,\n path: [\"packages\", \"loans\", \"standard-loan\", \"expenses\", \"submit\"],\n inputCodec: SubmitExpensesInput,\n outputCodec: t.unknown,\n});\n","import { createContext, useContext, useEffect, useState } from \"react\";\nimport { ExpensesCalculatorData } from \"../api\";\nimport { constVoid } from \"fp-ts/function\";\n\nexport const emptyExpenses: ExpensesCalculatorData = {\n regularExpenses: {\n customExpensesFields: [],\n otherAmount: 0,\n pensionAmount: 0,\n savingAmount: 0,\n fusesAmount: 0,\n },\n necessaryExpenses: {\n customExpensesFields: [],\n otherAmount: 0,\n transportAmount: 0,\n repairsAmount: 0,\n housingAmount: 0,\n healthAmount: 0,\n entertainmentAmount: 0,\n educationAmount: 0,\n clothesAmount: 0,\n cateringAmount: 0,\n alimonyAmount: 0,\n commonPurchasesAmount: 0,\n },\n};\n\nexport interface ExpensesCalculatorContext {\n regularSum: number;\n setRegularSum: (sum: number) => unknown;\n necessarySum: number;\n setNecessarySum: (sum: number) => unknown;\n totalSum: number;\n calculatorData: ExpensesCalculatorData;\n setCalculatorData: React.Dispatch<\n React.SetStateAction\n >;\n}\n\nexport const ExpensesCalculatorContext = createContext(\n {\n regularSum: 0,\n setRegularSum: (_: number) => {},\n necessarySum: 0,\n setNecessarySum: (_: number) => {},\n totalSum: 0,\n calculatorData: emptyExpenses,\n setCalculatorData: constVoid,\n }\n);\n\ntype ExpensesCalculatorProviderProps = {\n initialExpenses: ExpensesCalculatorData;\n children: JSX.Element;\n};\nexport const ExpensesCalculatorProvider = (\n props: ExpensesCalculatorProviderProps\n) => {\n const [regularSum, setRegularSum] = useState(0);\n const [necessarySum, setNecessarySum] = useState(0);\n const [totalSum, setTotalSum] = useState(0);\n\n const [calculatorData, setCalculatorData] = useState(\n props.initialExpenses\n );\n\n useEffect(() => {\n setTotalSum(regularSum + necessarySum);\n }, [regularSum, necessarySum]);\n\n return (\n \n {props.children}\n \n );\n};\n\nexport function useExpensesCalculatorContext() {\n const context = useContext(ExpensesCalculatorContext);\n\n if (!context) {\n throw new Error(\"UpdateCostumerOfferContext not provided\");\n }\n\n return context;\n}\n","import { Option } from \"fp-ts/Option\";\nimport { LocaleKey, useFormatMessage } from \"../../../../intl\";\nimport { useTenantCurrency } from \"../../../../Common/useTenantCurrency\";\nimport {\n ComputedFieldProps,\n FormRow,\n FormSection,\n unsafeLocalizedString,\n} from \"design-system\";\nimport { MoneyField } from \"../../../../Common/Price/MoneyField/MoneyField\";\nimport { pipe } from \"fp-ts/function\";\nimport { array } from \"fp-ts\";\nimport { ComputedFieldPropsExtended } from \"./ExpensesCalculator\";\n\ntype ExpensesSubFormProps = {\n fields: ComputedFieldPropsExtended>[];\n};\n\nexport function ExpensesSubForm(props: ExpensesSubFormProps) {\n const formatMessage = useFormatMessage();\n const tenantCurrency = useTenantCurrency();\n const fieldProps = props.fields;\n const getMoneyField = (\n field: ComputedFieldProps>,\n label: LocaleKey\n ) => (\n \n );\n\n return (\n \n {pipe(\n fieldProps,\n array.chunksOf(2),\n array.map(arr => {\n if (arr.length === 1) {\n return (\n \n {getMoneyField(arr[0], arr[0].translationKey)}\n <>\n \n );\n }\n return (\n \n {getMoneyField(arr[0], arr[0].translationKey)}\n {getMoneyField(arr[1], arr[1].translationKey)}\n \n );\n })\n )}\n \n );\n}\n","import { InlineMessage, Banner, Space } from \"design-system\";\nimport { boolean, option } from \"fp-ts\";\nimport {\n constant,\n constFalse,\n constNull,\n constTrue,\n identity,\n pipe,\n} from \"fp-ts/function\";\nimport { useFormatMessage, useFormatMoneyAmount } from \"../../intl\";\nimport { Currency, foldTenant, MoneyAmount } from \"../../globalDomain\";\nimport * as api from \"../api\";\nimport {\n foldPreapprovedLimits,\n foldCLPreapprovedLimits,\n isTL,\n} from \"../../ClientProfile/domain\";\nimport { useAppContext } from \"../../useAppContext\";\nimport { Option } from \"fp-ts/Option\";\nimport { foldFlowType, StandardLoanFlowType } from \"../domain\";\nimport { useState } from \"react\";\nimport {\n foldAPIStatus,\n PreapprovedLimitState,\n} from \"./UpdateCustomerOfferContext\";\nimport { SelectedLoansInformation } from \"../Refinancing/RefinancingAccountSelection\";\n\nconst remoteLimitAmount = 10000;\n\ninterface OfferLimitsInformation {\n isAmountOverLimit: Option;\n preapprovedLimit: Option;\n topUpLimit: Option;\n moneyAmountLimit: Option;\n}\n\nexport const useOfferLimitsInformation = (\n flowType: StandardLoanFlowType,\n loanOffer: api.GenericLoanResponseOutput,\n wayOfIdentification: api.WayOfIdentification,\n preapprovedLimitState: PreapprovedLimitState,\n isTopUpActive: boolean,\n allInternalLoanSelected: boolean,\n selectedRefinancingCredits: SelectedLoansInformation\n): OfferLimitsInformation => {\n const {\n apiParameters: { tenant },\n } = useAppContext();\n\n const topUpLimit: Option = pipe(\n preapprovedLimitState,\n foldAPIStatus({\n whenSuccess: foldPreapprovedLimits({\n whenTl: ({ preapprovedLimits }) =>\n pipe(\n preapprovedLimits.TL,\n option.map(TL => ({\n amount: TL.maximumpreapprovedlimit,\n currency: TL.currency,\n }))\n ),\n whenCl: ({ preapprovedLimits }) =>\n pipe(\n preapprovedLimits.CL,\n option.map(CL => ({\n amount: CL.maximumpreapprovedlimit,\n currency: CL.currency,\n }))\n ),\n whenEmpty: () => option.none,\n }),\n whenLoading: () => option.none,\n whenError: () => option.none,\n })\n );\n\n const preapprovedLimit: Option = pipe(\n preapprovedLimitState,\n foldAPIStatus({\n whenSuccess: foldCLPreapprovedLimits({\n whenCl: ({ preapprovedLimits }) =>\n pipe(\n preapprovedLimits.CL,\n option.map(CL => ({\n amount: CL.maximumpreapprovedlimit,\n currency: CL.currency,\n }))\n ),\n whenNotCL: () => option.none,\n }),\n whenLoading: () => option.none,\n whenError: () => option.none,\n })\n );\n\n const countPreapprovedLimit = () =>\n pipe(\n preapprovedLimit,\n option.chain(limit =>\n pipe(\n loanOffer.refinancedAmountExternal,\n option.fold(\n () => option.some(limit),\n refinancedAmountExternal =>\n option.some({\n amount:\n limit.amount -\n refinancedAmountExternal -\n selectedRefinancingCredits.internal.amount,\n currency: limit.currency,\n })\n )\n )\n )\n );\n\n const getTopUpInstallment = () =>\n pipe(\n preapprovedLimitState,\n foldAPIStatus({\n whenSuccess: foldPreapprovedLimits({\n whenTl: ({ preapprovedLimits }) =>\n pipe(\n preapprovedLimits.TL,\n option.map(TL => TL.maximuminstallment)\n ),\n whenCl: ({ preapprovedLimits }) =>\n pipe(\n preapprovedLimits.CL,\n option.map(CL => CL.maximuminstallment)\n ),\n whenEmpty: () => option.none,\n }),\n whenLoading: () => option.none,\n whenError: () => option.none,\n })\n );\n\n const getPreapprovedInstallment = () =>\n pipe(\n preapprovedLimitState,\n foldAPIStatus({\n whenSuccess: foldCLPreapprovedLimits({\n whenCl: ({ preapprovedLimits }) =>\n pipe(\n preapprovedLimits.CL,\n option.map(CL => CL.maximuminstallment)\n ),\n whenNotCL: () => option.none,\n }),\n whenLoading: () => option.none,\n whenError: () => option.none,\n })\n );\n\n const refinancedAmountExternal = pipe(\n loanOffer.refinancedAmountExternal,\n option.fold(\n () => 0,\n refinancedAmountExternal => refinancedAmountExternal\n )\n );\n const refinancedInternalCCOVD = pipe(\n loanOffer.refinancedInternalCCOVD,\n option.fold(\n () => 0,\n refinancedInternalCCOVD => refinancedInternalCCOVD\n )\n );\n\n const countTopUpLimit = () =>\n pipe(\n topUpLimit,\n option.chain(limit =>\n option.some({\n amount:\n limit.amount - refinancedAmountExternal - refinancedInternalCCOVD,\n currency: limit.currency,\n })\n )\n );\n\n const moneyAmountLimit = pipe(\n preapprovedLimitState,\n foldAPIStatus({\n whenSuccess: limitData =>\n pipe(\n !isTL(limitData) && allInternalLoanSelected,\n boolean.fold(\n () =>\n pipe(\n isTopUpActive,\n boolean.fold(countPreapprovedLimit, countTopUpLimit)\n ),\n countPreapprovedLimit\n )\n ),\n whenLoading: () => option.none,\n whenError: () => option.none,\n })\n );\n\n const preApprovedInstallmentLimit = pipe(\n isTopUpActive,\n boolean.fold(getTopUpInstallment, getPreapprovedInstallment)\n );\n\n const isTenantSK = foldTenant(tenant, constTrue, constFalse);\n const hasAmountLimit = pipe(\n moneyAmountLimit,\n option.fold(() => {\n const isFlowRemote =\n pipe(\n flowType,\n foldFlowType({\n when3P: constFalse,\n whenInPerson: constFalse,\n whenTLSAgent: constTrue,\n whenHomeBanking: constTrue,\n whenSmartBanking: constTrue,\n whenPWSRemote: constTrue,\n })\n ) && wayOfIdentification === \"REMOTE\";\n\n const hasLimits = pipe(\n preapprovedLimitState,\n foldAPIStatus({\n whenSuccess: foldPreapprovedLimits({\n whenEmpty: constFalse,\n whenCl: constTrue,\n whenTl: constTrue,\n }),\n whenLoading: constFalse,\n whenError: constFalse,\n })\n );\n\n return isTenantSK && isFlowRemote && !hasLimits;\n }, constTrue)\n );\n\n const bankingFee = pipe(loanOffer.bankingFee, option.getOrElse(constant(0)));\n const feeToBeSubtracted = pipe(\n loanOffer.bankingFeeIncluded,\n option.getOrElse(constTrue),\n boolean.fold(constant(0), constant(bankingFee))\n );\n\n const limitAmount = pipe(\n moneyAmountLimit,\n option.fold(\n () => remoteLimitAmount - feeToBeSubtracted,\n limit => limit.amount\n )\n );\n\n const preApprovedInstallment = pipe(\n preApprovedInstallmentLimit,\n option.fold(\n () => 0,\n installment => installment\n )\n );\n\n const consideredAmount = pipe(\n moneyAmountLimit,\n option.fold(\n () => loanOffer.totalAmount,\n () => loanOffer.amount\n )\n );\n\n const isAmountOverLimit = hasAmountLimit\n ? option.some(\n consideredAmount > limitAmount ||\n (loanOffer.installment > preApprovedInstallment &&\n preApprovedInstallment > 0)\n )\n : option.none;\n\n return {\n isAmountOverLimit,\n preapprovedLimit,\n topUpLimit,\n moneyAmountLimit,\n };\n};\n\ntype Props = {\n isAmountOverLimit: Option;\n moneyAmountLimit: Option;\n currency: Currency;\n onExit: (isApplicationSaved: boolean) => unknown;\n loanOffer: api.GenericLoanResponseOutput;\n};\n\nexport function LimitWarning(props: Props) {\n const formatMessage = useFormatMessage();\n const formatMoneyAmount = useFormatMoneyAmount();\n const [isWarningVisible, setIsWarningVisible] = useState(true);\n\n const {\n apiParameters: { channel },\n } = useAppContext();\n\n const isTls = channel === \"TLS_Remote\";\n\n const warningForAdditionalIncome = (limitExceeded: boolean) =>\n pipe(\n limitExceeded && isWarningVisible,\n boolean.fold(constNull, () => (\n <>\n \n \n \n ))\n );\n\n const preApprovedLimitMessage = (\n moneyAmountLimit: MoneyAmount,\n limitExceeded: boolean\n ) =>\n pipe(\n moneyAmountLimit.amount < 0,\n boolean.fold(\n () => (\n <>\n \n {warningForAdditionalIncome(limitExceeded)}\n \n ),\n () => <>{warningForAdditionalIncome(limitExceeded)}\n )\n );\n\n const bankingFee = pipe(\n props.loanOffer.bankingFee,\n option.getOrElse(constant(0))\n );\n const feeToBeSubtracted = pipe(\n props.loanOffer.bankingFeeIncluded,\n option.getOrElse(constTrue),\n boolean.fold(constant(0), constant(bankingFee))\n );\n\n return pipe(\n props.isAmountOverLimit,\n option.fold(constNull, limitExceeded =>\n pipe(\n props.moneyAmountLimit,\n option.fold(\n () => (\n <>\n \n {pipe(\n limitExceeded && isWarningVisible,\n boolean.fold(constNull, () => (\n <>\n \n props.onExit(true),\n },\n ])}\n onDismiss={option.some(() => setIsWarningVisible(false))}\n title={option.none}\n />\n \n ))\n )}\n \n ),\n moneyAmountLimit =>\n pipe(\n props.loanOffer.eligibleForPreapproved,\n option.fold(\n () => preApprovedLimitMessage(moneyAmountLimit, limitExceeded),\n eligibleForPreapproved =>\n eligibleForPreapproved === 1 ? (\n preApprovedLimitMessage(moneyAmountLimit, limitExceeded)\n ) : (\n <>\n )\n )\n )\n )\n )\n )\n );\n}\n","import { Option } from \"fp-ts/Option\";\nimport { Box, Card, FormSection, Loader } from \"design-system\";\nimport { useFormatMessage } from \"../../../intl\";\nimport { SelectedCompany } from \"../../domain\";\nimport { AdditionalIncomeForm } from \"./AdditionalIncomeForm\";\nimport { boolean, option, taskEither } from \"fp-ts\";\nimport { constant, constNull, constUndefined, pipe } from \"fp-ts/function\";\nimport * as api from \"../../api\";\nimport { getBonitaStatus } from \"../../api\";\nimport { useCommand, usePollingEffect } from \"../../../useAPI\";\nimport {\n IncomeOptionsOutput,\n IncomeOutput,\n IncomeSourceType,\n SpecialIncomeSourceType,\n} from \"../../IncomeForm/domain\";\nimport { NonEmptyArray } from \"fp-ts/NonEmptyArray\";\nimport { Key, useEffect, useState } from \"react\";\nimport { ReworkIncomeOutput } from \"../../Rework/api\";\n\ntype Props = {\n index: number;\n key?: Key;\n additionalIncomeData: Option;\n incomeOptions: IncomeOptionsOutput;\n isEditing: boolean;\n disabled: boolean;\n incomeSources: Option>;\n specialIncomeSources: Option>;\n selectedCompanies: SelectedCompany[];\n isReworking: boolean;\n oldValues: Option;\n onSave: (index: number) => unknown;\n onEditing: (index: number) => unknown;\n onCancel: () => unknown;\n onDelete: () => unknown;\n reworkAll: boolean;\n hideCancel?: boolean;\n};\n\nexport function AdditionalIncomeItem(props: Props) {\n const formatMessage = useFormatMessage();\n const removeIncome = useCommand(api.additionalIncomeRemove);\n\n const [loading, setLoading] = useState(false);\n const [errorNo, setErrorNo] = useState(0);\n const [canPoll, setCanPoll] = useState(false);\n\n const restartPoll = usePollingEffect(getBonitaStatus, {\n intervalMS: 5000,\n disabled: !canPoll,\n shouldPollingContinue: val => val.bonitaStatus === \"PENDING\",\n onError: () => setErrorNo(curr => curr + 1),\n onSuccess: response => {\n setErrorNo(0);\n if (response.bonitaStatus === \"DONE\") {\n setCanPoll(false);\n setLoading(false);\n props.onDelete();\n }\n },\n });\n\n useEffect(() => {\n if (errorNo >= 2) {\n // props.onError();\n }\n }, [errorNo]);\n\n useEffect(() => {\n if (canPoll) {\n restartPoll();\n }\n }, [canPoll]);\n\n const initializedIncome = pipe(\n props.additionalIncomeData,\n option.getOrElse(\n constant({\n allowanceInfo: option.none,\n companyInfo: option.none,\n contractInfo: option.none,\n incomeInfo: option.none,\n uniqueId: option.none,\n hasPreapprovedLimits: false,\n })\n )\n );\n\n if (loading) {\n return (\n \n \n \n );\n }\n\n return (\n \n \n ({\n label: formatMessage(\"Identification.clientData.edit\"),\n action: () => props.onEditing(props.index),\n }),\n constUndefined\n )\n )}\n remove={pipe(\n props.disabled,\n boolean.fold(\n () =>\n pipe(\n props.additionalIncomeData,\n option.fold(constUndefined, ({ uniqueId }) =>\n pipe(\n uniqueId,\n option.fold(constUndefined, uniqueId => ({\n label: formatMessage(\"Remove\"),\n action: pipe(\n { recordId: uniqueId },\n removeIncome,\n taskEither.chain(() =>\n taskEither.fromIO(() => {\n setCanPoll(true);\n setLoading(true);\n })\n )\n ),\n }))\n )\n )\n ),\n constUndefined\n )\n )}\n >\n {pipe(\n props.incomeSources,\n option.fold(constNull, incomeSources => (\n props.onSave(props.index)}\n onCancel={props.onCancel}\n onDelete={props.onDelete}\n incomeSources={incomeSources}\n specialIncomeSources={props.specialIncomeSources}\n selectedCompanies={props.selectedCompanies}\n isEditing={props.isEditing}\n isReworking={props.isReworking}\n oldValues={props.oldValues}\n reworkAll={props.reworkAll}\n hideCancel={props.hideCancel}\n />\n ))\n )}\n \n \n \n );\n}\n","import { nonEmptyArray } from \"io-ts-types/nonEmptyArray\";\nimport * as t from \"io-ts\";\nimport { eq } from \"fp-ts\";\nimport { constFalse } from \"fp-ts/function\";\nimport { GenericError, MoneyAmount } from \"../../globalDomain\";\nimport { RuntimeLocaleKey } from \"../../intl\";\nimport { apiCall } from \"../../APICall\";\nimport { optionFromNullable } from \"io-ts-types/optionFromNullable\";\nimport { Eq } from \"fp-ts/Eq\";\nimport { DocumentContentOutput } from \"../../Common/documentAPI\";\n\nexport const CPIAdditionalQuestions = t.type(\n {\n consideringFinancial: t.boolean,\n declared: t.boolean,\n experienceWithCPI: t.boolean,\n knowledge: t.boolean,\n },\n \"CPIAdditionalQuestions\"\n);\nexport type CPIAdditionalQuestions = t.TypeOf;\n\nexport const UKontoPackageType = t.keyof({\n BASIC: true,\n MIDDLE: true,\n UPPER: true,\n});\n\nexport type UKontoPackageType = t.TypeOf;\n\nexport const CreditProtectionInsuranceType = t.keyof({\n Basic: true,\n Standard: true,\n Full: true,\n None: true,\n});\nexport type CreditProtectionInsuranceType = t.TypeOf<\n typeof CreditProtectionInsuranceType\n>;\n\nexport const CreditProtectionInsurance = t.type({\n type: CreditProtectionInsuranceType,\n name: RuntimeLocaleKey,\n features: t.array(RuntimeLocaleKey),\n price: MoneyAmount,\n eligible: t.boolean,\n});\n\nexport type CreditProtectionInsurance = t.TypeOf<\n typeof CreditProtectionInsurance\n>;\n\nexport const CPIPackageList = t.type(\n {\n options: nonEmptyArray(CreditProtectionInsurance),\n selectedInsurance: CreditProtectionInsuranceType,\n },\n \"CPIPackageList\"\n);\nexport type CPIPackageList = t.TypeOf;\n\nexport const SelectedInsurance = t.type(\n {\n selectedInsurance: CreditProtectionInsuranceType,\n },\n \"SelectedInsurance\"\n);\nexport type SelectedInsurance = t.TypeOf;\n\nexport const InsuranceSolvencyAnswers = t.type(\n {\n firstQuestion: t.boolean,\n secondQuestion: t.boolean,\n },\n \"InsuranceSolvencyAnswers\"\n);\nexport type InsuranceSolvencyAnswers = t.TypeOf<\n typeof InsuranceSolvencyAnswers\n>;\n\nexport const eqInsuranceSolvencyAnswers: Eq = eq.getStructEq(\n {\n firstQuestion: eq.eqBoolean,\n secondQuestion: eq.eqBoolean,\n }\n);\n\nconst GetInsuranceListOutput = t.type(\n {\n cpiPackageList: CPIPackageList,\n },\n \"GetInsuranceListOutput\"\n);\nexport type GetInsuranceListOutput = t.TypeOf;\n\nconst GetInsuranceSolvencyAnswersOutput = optionFromNullable(\n t.type(\n {\n cpiAnswers: optionFromNullable(InsuranceSolvencyAnswers),\n },\n \"GetInsuranceSolvencyAnswersOutput\"\n )\n);\nexport type GetInsuranceSolvencyAnswersOutput = t.TypeOf<\n typeof GetInsuranceSolvencyAnswersOutput\n>;\n\nexport const insuranceDocument = apiCall({\n inputEq: eq.fromEquals(constFalse),\n path: [\n \"packages\",\n \"loans\",\n \"standard-loan\",\n \"insurance\",\n \"coverage\",\n \"document\",\n ],\n inputCodec: t.void,\n outputCodec: DocumentContentOutput,\n});\n\nconst AgeLimitError = t.type({\n id: t.literal(\"AgeLimitError\"),\n});\n\nexport const InsuranceError = t.union([AgeLimitError, GenericError]);\n\nexport type InsuranceError = t.TypeOf;\n\nexport const getInsuranceList = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"insurance\", \"getList\"],\n inputCodec: t.void,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: GetInsuranceListOutput,\n errorCodec: InsuranceError,\n});\n\nexport const getSelectedInsurance = apiCall({\n path: [\"packages\", \"loans\", \"standard-loan\", \"insurance\", \"getSelected\"],\n inputCodec: t.void,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: SelectedInsurance,\n errorCodec: InsuranceError,\n});\n\nexport const setAdditionalQuestions = apiCall({\n path: [\n \"packages\",\n \"loans\",\n \"standard-loan\",\n \"customerOffer\",\n \"cpi\",\n \"additionalQuestions\",\n ],\n inputCodec: CPIAdditionalQuestions,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: t.unknown,\n});\n\nexport const getInsuranceSolvencyAnswers = apiCall({\n path: [\n \"packages\",\n \"loans\",\n \"standard-loan\",\n \"insurance\",\n \"solvency\",\n \"answers\",\n \"get\",\n ],\n inputCodec: t.void,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: GetInsuranceSolvencyAnswersOutput,\n errorCodec: InsuranceError,\n});\n\nexport const setInsuranceSolvencyAnswers = apiCall({\n path: [\n \"packages\",\n \"loans\",\n \"standard-loan\",\n \"insurance\",\n \"solvency\",\n \"answers\",\n \"set\",\n ],\n inputCodec: InsuranceSolvencyAnswers,\n inputEq: eq.fromEquals(constFalse),\n outputCodec: GetInsuranceListOutput,\n errorCodec: InsuranceError,\n});\n","import { FeedbackBlock } from \"design-system\";\nimport { option } from \"fp-ts\";\nimport { pipe } from \"fp-ts/function\";\nimport { LocaleKey, useFormatMessage } from \"../../intl\";\nimport { UserValidation } from \"../../Common/UserValidation/UserValidation\";\nimport {\n foldFlowType,\n RefuseExistingClientReason,\n StandardLoanFlowType,\n} from \"../domain\";\nimport { MainContent } from \"../../Common/MainContent\";\n\ntype Props = {\n onExit: () => unknown;\n flowType: StandardLoanFlowType;\n reason: RefuseExistingClientReason;\n};\n\nexport function ExistingClient(props: Props) {\n const formatMessage = useFormatMessage();\n\n const renderNon3PBlock = (\n \n );\n\n return (\n \n {pipe(\n props.flowType,\n foldFlowType({\n when3P: () => (\n \n details.hasPhoneNumber &&\n details.hasEmailAddress &&\n details.hasPasswordForCommunication\n }\n >\n \n \n ),\n whenInPerson: () => renderNon3PBlock,\n whenTLSAgent: () => renderNon3PBlock,\n whenHomeBanking: () => renderNon3PBlock,\n whenSmartBanking: () => renderNon3PBlock,\n whenPWSRemote: () => renderNon3PBlock,\n })\n )}\n \n );\n}\n\nfunction getSubtitleByReason(reason: RefuseExistingClientReason): LocaleKey {\n switch (reason) {\n case \"IsExisting\":\n return \"StandardLoan.ExistingClient.subTitle\";\n case \"IsPersonalNumberMatch\":\n return \"StandardLoan.PersonalNumberMatch.subTitle\";\n case \"HasUserId\":\n case \"IsMultipleUser\":\n return \"StandardLoan.ExistingClient.multipleUser.subTitle\";\n }\n}\n\nfunction getButtonLabelByReason(\n reason: RefuseExistingClientReason,\n isPWSRemote: boolean\n): LocaleKey {\n switch (reason) {\n case \"IsExisting\":\n return isPWSRemote\n ? \"StandardLoan.ExistingClient.PWS.button\"\n : \"StandardLoan.ExistingClient.button\";\n case \"IsPersonalNumberMatch\":\n return \"StandardLoan.PersonalNumberMatch.button\";\n case \"HasUserId\":\n case \"IsMultipleUser\":\n return \"StandardLoan.ExistingClient.multipleUser.button\";\n }\n}\n","import { useState } from \"react\";\nimport { Children } from \"design-system\";\nimport { FeedbackFormDialog } from \"./FeedbackFormDialog\";\nimport { boolean, option, task } from \"fp-ts\";\n\nimport { constNull, pipe } from \"fp-ts/function\";\nimport { SaveApplicationDialog } from \"./SaveApplicationDialog\";\nimport { PortalStatusAlert } from \"../Common/PortalStatusAlert/PortalStatusAlert\";\nimport * as api from \"./api\";\nimport { useCommand } from \"../useAPI\";\nimport { MainLayout } from \"../Common/MainLayout/MainLayout\";\nimport { headerActions } from \"../Common/MainContent\";\n\ntype Props = Omit<\n React.ComponentProps,\n \"onLogoClick\" | \"iconAction\"\n> & {\n children: Children;\n isExiting: boolean;\n onExitAction: () => unknown;\n onProcessExit: (isApplicationSaved: boolean) => unknown;\n onDismiss: () => unknown;\n};\n\ntype ExitProcessStep = \"SaveApplication\" | \"FeedbackForm\";\n\nfunction foldStep(\n whenSaveApplication: () => T,\n whenFeedbackForm: () => T\n): (step: ExitProcessStep) => T {\n return step => {\n switch (step) {\n case \"SaveApplication\":\n return whenSaveApplication();\n case \"FeedbackForm\":\n return whenFeedbackForm();\n }\n };\n}\n\nexport default function ExitProcessDialogWrapper(props: Props) {\n const [step, setStep] = useState(\"SaveApplication\");\n const saveApplication = useCommand(api.saveApplication);\n\n const onDismiss = () => {\n window.onunload = null;\n setStep(\"SaveApplication\");\n props.onDismiss();\n };\n\n const onSaveAndExit = () => {\n window.onunload = null;\n return pipe(\n saveApplication(),\n task.chain(() => task.fromIO(() => props.onProcessExit(true)))\n )();\n };\n\n return (\n <>\n \n \n {props.children}\n \n {pipe(\n props.isExiting,\n boolean.fold(constNull, () =>\n pipe(\n step,\n foldStep(\n () => (\n setStep(\"FeedbackForm\")}\n />\n ),\n () => (\n props.onProcessExit(false)}\n />\n )\n )\n )\n )\n )}\n \n );\n}\n","import {\n Banner,\n CheckboxField,\n Dialog,\n Form,\n FormRow,\n FormSection,\n Space,\n TextareaField,\n useForm,\n} from \"design-system\";\nimport { option, taskEither, these } from \"fp-ts\";\nimport { Option } from \"fp-ts/Option\";\nimport { useFormatMessage } from \"../intl\";\n\nimport { constVoid, identity, pipe } from \"fp-ts/function\";\nimport { useCommand } from \"../useAPI\";\nimport { deleteApplication, exitProcess, ExitProcessInput } from \"./api\";\nimport { useState } from \"react\";\n\ninterface Props {\n onDismiss: () => unknown;\n onSubmit: () => unknown;\n}\n\nexport function FeedbackFormDialog(props: Props) {\n const formatMessage = useFormatMessage();\n const deleteCurrentApplication = useCommand(deleteApplication);\n const sendFeedback = useCommand(exitProcess);\n const [showErrorBanner, setShowErrorBanner] = useState(false);\n\n function submitFeedback(input: ExitProcessInput) {\n return pipe(\n deleteCurrentApplication(),\n taskEither.chain(() =>\n taskEither.fromIO(() => {\n window.onunload = null;\n })\n ),\n taskEither.chain(() => sendFeedback(input)),\n taskEither.fold(\n () => taskEither.fromIO(() => setShowErrorBanner(true)),\n () => taskEither.fromIO(props.onSubmit)\n )\n );\n }\n\n const { fieldProps, values, setValues, handleSubmit } = useForm(\n {\n initialValues: {\n needsHigherAmount: false,\n needsShorterTenor: false,\n other: option.none as Option,\n },\n fieldValidators: () => ({}),\n },\n {\n onSubmit: ({ needsHigherAmount, needsShorterTenor, other }) => {\n return submitFeedback(\n pipe(\n other,\n option.fold(\n () => ({\n reason: pipe(\n these.fromOptions(\n pipe(needsHigherAmount, option.fromPredicate(identity)),\n pipe(needsShorterTenor, option.fromPredicate(identity))\n ),\n option.fold(\n () => \"NONE\",\n these.fold(\n () => \"HIGHER_AMOUNT\",\n () => \"REPAYMENTPERIOD\",\n () => \"BOTH\"\n )\n )\n ),\n }),\n other =>\n ({\n reason: \"OTHER\",\n reasonDetails: other,\n } as ExitProcessInput)\n )\n )\n );\n },\n }\n );\n\n return (\n \n
\n \n \n \n setValues({\n needsHigherAmount: checked,\n other: checked ? option.none : values.other,\n })\n }\n disabled={option.isSome(values.other)}\n />\n \n \n \n setValues({\n needsShorterTenor: checked,\n other: checked ? option.none : values.other,\n })\n }\n disabled={option.isSome(values.other)}\n />\n \n \n \n setValues({\n other: checked ? option.some(\"\") : option.none,\n needsHigherAmount: checked ? false : values.needsHigherAmount,\n needsShorterTenor: checked ? false : values.needsShorterTenor,\n })\n }\n issues={option.none}\n onBlur={constVoid}\n />\n \n {option.isSome(values.other) && (\n \n setValues({ other: option.some(value) })}\n />\n \n )}\n \n
\n {showErrorBanner && (\n <>\n \n \n \n )}\n \n );\n}\n","import { Tooltip } from \"design-system\";\nimport { option } from \"fp-ts\";\nimport { constant, pipe } from \"fp-ts/function\";\nimport { useFormatMessage } from \"../../intl\";\nimport { Option } from \"fp-ts/Option\";\nimport { useAppContext } from \"../../useAppContext\";\n\ntype Props = {\n isAmountOverLimit: Option;\n renderChildren: (disabled: boolean) => JSX.Element;\n};\n\nexport function RemoteLimitTooltip({\n isAmountOverLimit,\n renderChildren,\n}: Props) {\n const formatMessage = useFormatMessage();\n\n const {\n apiParameters: { channel },\n } = useAppContext();\n\n const isTls = channel === \"TLS_Remote\";\n\n return pipe(\n isAmountOverLimit,\n option.fold(constant(renderChildren(false)), limitExceeded => {\n if (limitExceeded) {\n return (\n \n {renderChildren(true)}\n \n );\n } else {\n return renderChildren(false);\n }\n })\n );\n}\n","import {\n CalculatedField,\n Heading,\n Stack,\n Positive,\n useIsMobileLayout,\n Box,\n Body,\n Space,\n LocalizedString,\n} from \"design-system\";\nimport { option, either } from \"fp-ts\";\nimport { pipe, constVoid } from \"fp-ts/function\";\nimport { sequenceS } from \"fp-ts/Apply\";\nimport { useFormatMessage, useFormatMoneyAmountValue } from \"../../intl\";\nimport * as api from \"../api\";\nimport { unsafeNonNegativeInteger } from \"../../globalDomain\";\nimport { palette, spaceUnit } from \"design-system/lib/styleConstants\";\n\ntype Props = {\n currentLoanOffer: api.GenericLoanResponseOutput;\n genericLoanOffer: api.GenericLoanOffer;\n};\nconst Field = (props: { label: LocalizedString; value: LocalizedString }) => {\n const isMobileLayout = useIsMobileLayout();\n const fluidOrUnits = {\n fluid: !isMobileLayout ? true : undefined,\n units: isMobileLayout ? 2 : undefined,\n } as { units: number } | { fluid: true };\n\n return (\n \n \n \n {props.label}\n \n {!isMobileLayout && }\n \n {props.value}\n \n \n \n );\n};\n\nexport function YourOffer({ currentLoanOffer, genericLoanOffer }: Props) {\n const formatMessage = useFormatMessage();\n\n const formatMoneyAmountValue = useFormatMoneyAmountValue(\n unsafeNonNegativeInteger(0)\n );\n\n return (\n \n \n {formatMessage(\"StandardLoan.CustomerOffer.yourOffer\")}\n \n\n <>\n {pipe(\n {\n refinancingAmount: Positive.decode(\n pipe(\n genericLoanOffer.refinancingAmount,\n option.getOrElse(() => 0)\n )\n ),\n amount: Positive.decode(currentLoanOffer.amount),\n },\n sequenceS(either.either),\n either.fold(\n constVoid,\n ({ refinancingAmount, amount }) =>\n refinancingAmount > 0 &&\n amount > 0 && (\n \n \n \n \n )\n )\n )}\n \n\n \n \n );\n}\n","import { EntryFee } from \"../api\";\nimport { boolean, option } from \"fp-ts\";\nimport {\n Body,\n Box,\n FieldProps,\n QuestionIcon,\n RadioGroupField,\n Tooltip,\n unsafeLocalizedString,\n} from \"design-system\";\nimport { constFalse, pipe } from \"fp-ts/function\";\nimport { Option } from \"fp-ts/Option\";\nimport { useFormatMessage, useFormatMoneyAmountValue } from \"../../intl\";\nimport { useTenantCurrency } from \"../../Common/useTenantCurrency\";\nimport { forwardRef } from \"react\";\nimport { palette, spaceUnit } from \"design-system/lib/styleConstants\";\n\ntype Props = {\n entryFee: EntryFee;\n} & FieldProps>;\n\nexport const EntryFeeRadioGroup = forwardRef(\n (props, forwardedRef) => {\n const formatMessage = useFormatMessage();\n const formatMoneyAmount = useFormatMoneyAmountValue();\n const tenantCurrency = useTenantCurrency();\n\n const renderOption = (feeIncluded: boolean) =>\n pipe(\n feeIncluded,\n boolean.fold(\n () =>\n formatMessage(\n \"StandardLoan.CustomerOffer.entryFee.notIncluded.text\",\n {\n entryFee: formatMoneyAmount({\n amount: props.entryFee.amount,\n currency: tenantCurrency,\n }),\n }\n ),\n () =>\n formatMessage(\"StandardLoan.CustomerOffer.entryFee.included.text\", {\n entryFee: formatMoneyAmount({\n amount: props.entryFee.amount,\n currency: tenantCurrency,\n }),\n })\n )\n );\n\n return (\n \n \n {formatMessage(\"StandardLoan.CustomerOffer.entryFee.title\")}\n \n value.toString()}\n renderOption={() => unsafeLocalizedString(\"\")}\n issues={props.issues}\n renderOptionChildren={included =>\n option.some(\n \n \n {renderOption(included)}\n \n \n \n }\n />\n \n \n )\n }\n isOptionDisabled={constFalse}\n />\n \n );\n }\n);\n","import {\n Box,\n ContentRow,\n FlowAccordion,\n FlowAccordionItem,\n Stack,\n useIsMobileLayout,\n} from \"design-system\";\nimport { boolean, option } from \"fp-ts\";\nimport { useState } from \"react\";\nimport { useFormatMessage } from \"../../intl\";\nimport { PageHeading } from \"../../Common/PageHeading/PageHeading\";\nimport { Option } from \"fp-ts/Option\";\nimport { BackButton } from \"../../Common/BackButton/BackButton\";\nimport { AdditionalIncome } from \"./AdditionalIncome/AdditionalIncome\";\nimport { NonEmptyArray } from \"fp-ts/NonEmptyArray\";\nimport {\n ExpensesConfirmation,\n LfDecisionReceived,\n} from \"./ExpensesConfirmation/ExpensesConfirmation\";\nimport { pipe } from \"fp-ts/function\";\nimport { emptyRework, Rework } from \"../StandardLoanState\";\nimport { MainContent } from \"../../Common/MainContent\";\n\ntype Props = {\n onNext: () => unknown;\n onCounterOffer: () => unknown;\n onPending: () => unknown;\n onRejected: () => unknown;\n onBack: () => unknown;\n showAdditionalIncomeStep: boolean;\n reworkData: Rework;\n};\n\nexport function ExpensesAndAdditionalIncome(props: Props) {\n const formatMessage = useFormatMessage();\n const [\n showAdditionalIncomeStep,\n setShowAdditionalIncomeStep,\n ] = useState(props.showAdditionalIncomeStep);\n const [, setIsEditingAdditionalIncome] = useState(false);\n const [activeIndex, setActiveIndex] = useState>(\n option.some(\n props.showAdditionalIncomeStep &&\n option.isNone(props.reworkData.oldValues)\n ? 1\n : 0\n )\n );\n const [isHeaderReadonly, setIsHeaderReadonly] = useState(true);\n\n const onExpensesConfirmationNext = (\n needAdditionalIncomeStep: boolean,\n lfDecision: LfDecisionReceived\n ) => {\n if (lfDecision === \"Rejected\" && !needAdditionalIncomeStep) {\n props.onRejected();\n } else {\n pipe(\n needAdditionalIncomeStep,\n boolean.fold(\n () =>\n lfDecision === \"Counteroffer\"\n ? props.onCounterOffer()\n : props.onNext(),\n () => {\n setShowAdditionalIncomeStep(needAdditionalIncomeStep);\n setActiveIndex(option.some(1));\n }\n )\n );\n }\n };\n\n const expensesConfirmationStep: FlowAccordionItem = {\n title: formatMessage(\"StandardLoan.ExpensesConfirmation.Panel.title\"),\n content: () => {\n return (\n \n );\n },\n };\n\n const additionalIncomeStep: FlowAccordionItem = {\n title: formatMessage(\"StandardLoan.AdditionalIncome.Panel.title\"),\n content: () => (\n oldValues.additionalIncomeMap)\n )}\n reworkAll={props.reworkData.reworkAll}\n />\n ),\n };\n\n const items: NonEmptyArray = pipe(\n props.reworkData.oldValues,\n option.fold(\n () => [\n expensesConfirmationStep,\n ...(showAdditionalIncomeStep ? [additionalIncomeStep] : []),\n ],\n () => [additionalIncomeStep]\n )\n );\n\n const isMobileLayout = useIsMobileLayout();\n const title = isHeaderReadonly\n ? \"StandardLoan.ExpensesConfirmationAndAdditionalIncome.title\"\n : \"StandardLoan.ExpensesConfirmationAndAdditionalIncome.editTitle\";\n\n return (\n \n \n\n \n \n {props.reworkData === emptyRework && (\n \n \n \n \n \n )}\n \n \n );\n}\n","import {\n Body,\n Box,\n Button,\n LoadingButton,\n PlusIcon,\n Space,\n Stack,\n} from \"design-system\";\nimport {\n array,\n monoid,\n nonEmptyArray,\n option,\n record,\n taskEither,\n} from \"fp-ts\";\nimport {\n constFalse,\n constNull,\n constTrue,\n constVoid,\n flow,\n identity,\n pipe,\n} from \"fp-ts/function\";\nimport { NonEmptyArray } from \"fp-ts/NonEmptyArray\";\nimport { Option } from \"fp-ts/Option\";\nimport { NonEmptyString } from \"io-ts-types/lib/NonEmptyString\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useFormatMessage } from \"../../../intl\";\nimport * as remoteData from \"../../../RemoteData\";\nimport { useCommand, useQuery } from \"../../../useAPI\";\nimport * as api from \"../../api\";\nimport {\n IncomeSourceType,\n SpecialIncomeSourceType,\n} from \"../../IncomeForm/domain\";\nimport * as reworkApi from \"../../Rework/api\";\nimport { ReworkBanner } from \"../../Rework/ReworkBanner\";\nimport { useGetAdditionalIncomeStepChanges } from \"../../Rework/utils\";\nimport { AdditionalIncomeItem } from \"./AdditionalIncomeItem\";\nimport { useAppContext } from \"../../../useAppContext\";\nimport { useRemoteData } from \"../../../useRemoteData\";\nimport { StepCommentsOutput } from \"../../Rework/api\";\n\ntype Props = {\n onNext: () => unknown;\n onRejected: () => unknown;\n onCounterOffer: () => unknown;\n onPending: () => unknown;\n onEditingStateChange: (state: boolean) => void;\n reworkData: Option;\n reworkAll: boolean;\n};\n\ntype SpecialTypeIncomeSourceCount = { [K in SpecialIncomeSourceType]: number };\ntype IncomeSourceCount = { [K in IncomeSourceType]: number };\n\nexport function AdditionalIncome(props: Props) {\n const [editingPanelIndex, setEditingPanelIndex] = useState>(\n option.none\n );\n const [isAddingNewIncome, setIsAddingNewIncome] = useState(false);\n\n const formatMessage = useFormatMessage();\n const [hasAdditionalIncome, setHasAdditionalIncome] = useState<\n Option\n >(option.of(true));\n const [additionalIncomeList, refreshList] = useQuery(\n api.additionalIncomeList\n );\n const proceedNext = useCommand(api.additionalIncomeNext);\n\n const [additionalIncomeData, incomeList, listHasNoItems] = useMemo(() => {\n const constantEmptyResponse = () =>\n ({\n additionalIncomeList: [],\n incomeOptions: option.none,\n mainSourceOfIncome: \"Employed\",\n mainSpecialTypeOfIncome: option.none,\n } as api.AdditionalIncomeListOutput);\n\n const data = pipe(\n additionalIncomeList,\n remoteData.fold(constantEmptyResponse, constantEmptyResponse, identity)\n );\n\n const listHasNoItems = data.additionalIncomeList.length === 0;\n const listHasOneItem = data.additionalIncomeList.length === 1;\n\n return [data, data.additionalIncomeList, listHasNoItems, listHasOneItem];\n }, [additionalIncomeList]);\n\n const showList = pipe(\n hasAdditionalIncome,\n option.getOrElse(() => false)\n );\n\n const isEditing = option.isSome(editingPanelIndex) || isAddingNewIncome;\n\n const onSave = () => {\n setEditingPanelIndex(option.none);\n setIsAddingNewIncome(false);\n refreshList();\n };\n\n useEffect(() => {\n props.onEditingStateChange(isEditing);\n }, [isEditing]);\n\n useEffect(() => {\n if (listHasNoItems) {\n setIsAddingNewIncome(true);\n }\n }, []);\n\n useEffect(() => {\n if (listHasNoItems) {\n setIsAddingNewIncome(true);\n }\n }, [hasAdditionalIncome]);\n\n const getAdditionalIncomeStepChanges = useGetAdditionalIncomeStepChanges(\n additionalIncomeData.additionalIncomeList,\n pipe(\n props.reworkData,\n option.map(oldData =>\n pipe(\n oldData,\n record.toArray,\n array.map<\n [string, reworkApi.ReworkIncomeOutput],\n reworkApi.ReworkIncomeOutput & { uniqueId: Option }\n >(([k, v]) => ({\n ...v,\n uniqueId: pipe(k, NonEmptyString.decode, option.fromEither),\n }))\n )\n )\n )\n );\n\n const stepComments = useCommand(reworkApi.stepComments);\n\n const {\n config: { r6Enabled },\n } = useAppContext();\n\n const comments = useRemoteData(\n useMemo(\n () => stepComments({ reworkCategories: [\"BONITA\", \"PERSONAL_DATA\"] }),\n [r6Enabled]\n )\n );\n\n const reworkComments = pipe(\n comments,\n remoteData.fold(\n () => option.none,\n () => option.none,\n comments => option.some(comments)\n )\n );\n\n const reworkBanner = (comments: Option) => {\n return pipe(\n props.reworkData,\n option.fold(constNull, () => (\n \n ))\n );\n };\n\n const areReworkChanges =\n option.isSome(getAdditionalIncomeStepChanges) &&\n getAdditionalIncomeStepChanges.value.length > 0;\n\n const areReworkComments =\n option.isSome(reworkComments) &&\n option.isSome(reworkComments.value.stepComments) &&\n reworkComments.value.stepComments.value.length > 0;\n\n const getOtherIncomes = (currentRecordId: Option) => {\n return incomeList.filter(item =>\n pipe(\n currentRecordId,\n option.fold(constTrue, id =>\n pipe(\n item.uniqueId,\n option.exists(uniqueId => uniqueId !== id)\n )\n )\n )\n );\n };\n const filterIncomeSources = (\n currentRecordId: Option\n ): Option> => {\n const sourceCount: IncomeSourceCount = {\n CompanyOwner: 0,\n Employed: 0,\n EmployedAbroad: 0,\n Freelancer: 0,\n SpecialType: 0,\n TradesmanCoOperatingPerson: 0,\n };\n\n function isEmploymentBasedIncome(source: IncomeSourceType): boolean {\n return source !== \"SpecialType\";\n }\n\n function isEntrepreneurBasedIncome(source: IncomeSourceType): boolean {\n return (\n source === \"TradesmanCoOperatingPerson\" ||\n source === \"CompanyOwner\" ||\n source === \"Freelancer\"\n );\n }\n\n const usedIncomes = getOtherIncomes(currentRecordId).map(income =>\n pipe(\n income.incomeInfo,\n option.map(incomeInfo => incomeInfo.incomeSource)\n )\n );\n\n usedIncomes.forEach(value =>\n pipe(\n value,\n option.fold(constNull, currentValue => {\n sourceCount[currentValue] = sourceCount[currentValue] + 1;\n })\n )\n );\n\n const filtered = pipe(\n additionalIncomeData.incomeOptions,\n option.map(({ sourceOfIncomeOptions }) =>\n pipe(\n sourceOfIncomeOptions,\n array.filter(source => {\n const maxEmployedBased = pipe(\n sourceCount,\n record.filterWithIndex(isEmploymentBasedIncome),\n record.foldMap(monoid.monoidSum)(identity),\n sum => sum < 2\n );\n\n const maxEntrepreneurBased = pipe(\n sourceCount,\n record.filterWithIndex(isEntrepreneurBasedIncome),\n record.foldMap(monoid.monoidSum)(identity),\n sum => sum < 1\n );\n\n switch (source) {\n case \"EmployedAbroad\":\n case \"Employed\":\n return maxEmployedBased;\n case \"SpecialType\":\n return sourceCount[source] < 3;\n case \"TradesmanCoOperatingPerson\":\n case \"Freelancer\":\n case \"CompanyOwner\":\n return maxEntrepreneurBased && maxEmployedBased;\n }\n })\n )\n ),\n option.chain(nonEmptyArray.fromArray)\n );\n return filtered;\n };\n\n const filterSpecialIncomeSources = (\n currentRecordId: Option\n ): Option> => {\n const specialIncomeSourceCount: SpecialTypeIncomeSourceCount = {\n Alimony: 0,\n MaternityLeave: 0,\n Pensioner: 0,\n };\n const usedIncomes: SpecialIncomeSourceType[] = [];\n\n getOtherIncomes(currentRecordId).forEach(income =>\n pipe(\n income.incomeInfo,\n option.fold(\n constVoid,\n incomeInfo =>\n incomeInfo.incomeSource === \"SpecialType\" &&\n usedIncomes.push(incomeInfo.specialTypeOfIncome)\n )\n )\n );\n\n usedIncomes.forEach(\n value =>\n (specialIncomeSourceCount[value] = specialIncomeSourceCount[value] + 1)\n );\n\n const availableIncomes = pipe(\n additionalIncomeData.incomeOptions,\n option.fold(\n () => [],\n options =>\n pipe(\n options.specialTypeOfIncomeOptions,\n option.getOrElse(() => [] as SpecialIncomeSourceType[])\n ).filter(source => specialIncomeSourceCount[source] < 3)\n )\n );\n\n return pipe(\n availableIncomes,\n option.fromPredicate(incomes => incomes.length > 0),\n option.map(incomes => incomes as NonEmptyArray)\n );\n };\n\n const getSelectedCompanies = (currentRecordId: Option) =>\n getOtherIncomes(currentRecordId)\n .map(income =>\n pipe(\n income.companyInfo,\n option.map(info => ({\n companyName: pipe(\n info.companyName,\n option.getOrElse(() => \"\")\n ),\n companyIco: pipe(\n info.companyIco,\n option.getOrElse(() => \"\")\n ),\n })),\n option.getOrElse(() => ({\n companyName: \"\",\n companyIco: \"\",\n }))\n )\n )\n .filter(\n company => company.companyName !== \"\" && company.companyIco !== \"\"\n );\n\n const getOldValuesForItem = (\n uniqueId: Option\n ): Option =>\n pipe(\n uniqueId,\n option.chain(uniqueId =>\n pipe(props.reworkData, option.chain(record.lookup(uniqueId)))\n )\n );\n\n const isReworking = option.isSome(props.reworkData);\n\n const canAddAdditionalIncome = () => {\n let additional = pipe(\n filterIncomeSources(option.none),\n option.fold(constFalse, list => list.length > 0)\n );\n return additional;\n };\n\n const renderList = () =>\n pipe(\n additionalIncomeData.incomeOptions,\n option.fold(constNull, incomeOptions => {\n const incomes = incomeList.map((data, index) => (\n `${index}`)\n )}\n index={index}\n additionalIncomeData={option.some(data)}\n incomeOptions={incomeOptions}\n onSave={onSave}\n onEditing={flow(option.some, setEditingPanelIndex)}\n onCancel={() => {\n refreshList();\n setEditingPanelIndex(option.none);\n }}\n isEditing={pipe(\n editingPanelIndex,\n option.exists(editingIndex => editingIndex === index)\n )}\n onDelete={() => {\n refreshList();\n setEditingPanelIndex(option.none);\n setHasAdditionalIncome(option.some(true));\n }}\n disabled={isEditing}\n incomeSources={filterIncomeSources(data.uniqueId)}\n specialIncomeSources={filterSpecialIncomeSources(data.uniqueId)}\n selectedCompanies={getSelectedCompanies(data.uniqueId)}\n isReworking={isReworking}\n oldValues={getOldValuesForItem(data.uniqueId)}\n reworkAll={props.reworkAll}\n />\n ));\n\n if (isAddingNewIncome || listHasNoItems)\n incomes.push(\n {\n setEditingPanelIndex(option.none);\n setIsAddingNewIncome(false);\n\n setHasAdditionalIncome(option.some(true));\n }}\n onDelete={constVoid}\n isEditing={true}\n disabled={false}\n incomeSources={filterIncomeSources(option.none)}\n specialIncomeSources={filterSpecialIncomeSources(option.none)}\n selectedCompanies={getSelectedCompanies(option.none)}\n isReworking={isReworking}\n oldValues={option.none}\n reworkAll={props.reworkAll}\n hideCancel={listHasNoItems}\n />\n );\n return incomes;\n })\n );\n\n return (\n \n {(areReworkChanges || areReworkComments) && reworkBanner(reworkComments)}\n \n {formatMessage(\"StandardLoan.AdditionalIncome.Panel.description\")}\n \n {showList && renderList()}\n {showList && (\n \n setIsAddingNewIncome(true)}\n icon={PlusIcon}\n disabled={isEditing || !canAddAdditionalIncome()}\n />\n \n )}\n \n \n taskEither.fromIO(() => constVoid),\n () =>\n pipe(\n proceedNext(),\n taskEither.chain(response =>\n taskEither.fromIO(() => {\n switch (response.lfDecision) {\n case \"Approved\":\n return props.onNext();\n case \"Counteroffer\":\n return props.onCounterOffer();\n case \"Rejected\":\n return props.onRejected();\n case \"Pending\":\n return props.onPending();\n }\n })\n )\n )\n )\n )}\n disabled={isEditing}\n />\n \n \n );\n}\n","import { constVoid, pipe } from \"fp-ts/function\";\nimport { useFormatMessage } from \"../../../intl\";\nimport { option, taskEither } from \"fp-ts\";\nimport {\n Box,\n Button,\n FormSection,\n LoadingButton,\n Space,\n Stack,\n} from \"design-system\";\nimport { SelectedCompany } from \"../../domain\";\n\nimport * as api from \"../../api\";\nimport { useCommand } from \"../../../useAPI\";\nimport {\n IncomeOptionsOutput,\n IncomeOutput,\n IncomeSourceType,\n SpecialIncomeSourceType,\n} from \"../../IncomeForm/domain\";\nimport { IncomeForm } from \"../../IncomeForm/IncomeForm\";\nimport { Option } from \"fp-ts/Option\";\nimport { NonEmptyArray } from \"fp-ts/NonEmptyArray\";\nimport { useState } from \"react\";\nimport { ReworkIncomeOutput } from \"../../Rework/api\";\n\ntype Props = {\n additionalIncomeData: IncomeOutput;\n incomeOptions: IncomeOptionsOutput;\n incomeSources: NonEmptyArray;\n specialIncomeSources: Option;\n selectedCompanies: SelectedCompany[];\n isEditing: boolean;\n isReworking: boolean;\n oldValues: Option;\n onSubmit: () => unknown;\n onCancel: () => unknown;\n onDelete: () => unknown;\n reworkAll: boolean;\n hideCancel?: boolean;\n};\n\nexport function AdditionalIncomeForm(props: Props) {\n const formatMessage = useFormatMessage();\n const addNewIncome = useCommand(api.additionalIncomeAdd);\n const editIncome = useCommand(api.additionalIncomeEdit);\n const [canSubmit, setCanSubmit] = useState(false);\n const [submitTrigger, setSubmitTrigger] = useState(0);\n const [isCancelling, setIsCancelling] = useState(false);\n\n const addOrEditIncome = (income: IncomeOutput) =>\n pipe(\n income.uniqueId,\n option.fold(\n () => pipe({ additionalIncome: income }, addNewIncome),\n () => pipe({ additionalIncome: income }, editIncome)\n )\n );\n\n const onIncomeDataReady = (values: IncomeOutput) =>\n pipe(\n addOrEditIncome(values),\n taskEither.chain(() => taskEither.fromIO(props.onSubmit))\n )();\n\n const onFailure = () => {\n setCanSubmit(false);\n };\n\n const onCancel = () => {\n props.onCancel();\n setIsCancelling(true);\n };\n const cancelButton =\n props.hideCancel === true ? (\n <>\n ) : (\n \n );\n\n const submitButton = (\n \n {\n if (!canSubmit) {\n setCanSubmit(true);\n } else {\n setSubmitTrigger(val => val + 1);\n }\n })}\n />\n \n );\n\n return (\n \n ({\n income: option.some(oldValues),\n personalData: option.none,\n }))\n )}\n isMainIncome={false}\n reworkAll={props.reworkAll}\n onChangeIncomeSourceType={constVoid}\n isCancelling={isCancelling}\n onCancel={setIsCancelling}\n monthlyIncome={option.none}\n salaryCurrency={option.none}\n />\n {props.isEditing && (\n \n {cancelButton}\n \n {submitButton}\n \n )}\n \n );\n}\n","import {\n Body,\n Box,\n CheckboxField,\n ErrorBanner,\n FormRow,\n FormSection,\n Loader,\n LoadingButton,\n Space,\n Stack,\n useForm,\n validators,\n} from \"design-system\";\nimport { useFormatMessage } from \"../../../intl\";\nimport { constant, constNull, pipe } from \"fp-ts/function\";\nimport { array, boolean, eq, option, record, taskEither } from \"fp-ts\";\nimport { ReadOnlyExpensesConfirmation } from \"./ReadOnlyExpensesConfirmation\";\nimport { useEffect, useState } from \"react\";\nimport { ExpensesConfirmationForm } from \"./ExpenseConfirmationForm\";\nimport { MoneyAmount } from \"../../../globalDomain\";\nimport { Option } from \"fp-ts/Option\";\nimport { useCommand, usePollingEffect, useQuery } from \"../../../useAPI\";\nimport {\n BonitaStatus,\n ExpensesCalculatorData,\n getExpenses,\n LfDecision,\n submitExpenses,\n SubmitExpensesInput,\n} from \"./api\";\nimport * as remoteData from \"../../../RemoteData\";\nimport { CurrentLiabilitiesDialog } from \"./CurrentLiabilitiesDialog/CurrentLiabilitiesDialog\";\nimport { ExpensesCalculatorDialog } from \"./ExpensesCalculator/ExpensesCalculatorDialog\";\nimport { getBonitaStatus } from \"../../api\";\n\nexport type LfDecisionReceived = Omit;\n\ntype Props = {\n onExpensesConfirmationNext: (\n needAdditionalIncomeStep: boolean,\n lfDecision: LfDecisionReceived\n ) => void;\n setIsHeaderReadonly?: (r: boolean) => void;\n};\n\nexport type SubmitFormState = {\n otherMontlyExpenses: Option;\n payAlimony: Option;\n alimonyAmount: Option;\n};\n\nexport function ExpensesConfirmation(props: Props) {\n const [submitFormState, setSubmitFormState] = useState({\n otherMontlyExpenses: option.none as Option,\n payAlimony: option.none as Option,\n alimonyAmount: option.none as Option,\n });\n const [, setShowError] = useState(false);\n const [isLiabilitiesDialogOpen, setIsLiabilitiesDialogOpen] = useState(false);\n const [isExpensesDialogOpen, setIsExpensesDialogOpen] = useState(false);\n const formatMessage = useFormatMessage();\n const [readOnly, setReadOnly] = useState(true);\n const [loading, setLoading] = useState(true);\n const [canPoll, setCanPoll] = useState(false);\n const [bonitaStatus, setBonitaStatus] = useState(\"NOT_STARTED\");\n\n const restartPoll = usePollingEffect(getBonitaStatus, {\n intervalMS: 5000,\n disabled: !canPoll,\n shouldPollingContinue: val => val.bonitaStatus === \"PENDING\",\n onError: () => setShowError(true),\n onSuccess: response => {\n setBonitaStatus(response.bonitaStatus);\n if (\n response.bonitaStatus === \"DONE\" &&\n option.isSome(response.submitExpensesResponse)\n ) {\n const expensesResponse = response.submitExpensesResponse.value;\n if (expensesResponse.lfDecision !== \"Pending\") {\n setCanPoll(false);\n props.onExpensesConfirmationNext(\n expensesResponse.needAdditionalIncomeStep,\n expensesResponse.lfDecision\n );\n }\n }\n if (response.bonitaStatus === \"ERROR\") {\n setShowError(true);\n }\n },\n });\n\n const [expenses, refreshExpenses] = useQuery(getExpenses);\n\n const submitExpensesForm = useCommand(submitExpenses);\n\n useEffect(() => {\n if (props.setIsHeaderReadonly) {\n props.setIsHeaderReadonly(readOnly);\n }\n }, [readOnly]);\n\n const { fieldProps, handleSubmit } = useForm(\n {\n initialValues: {\n disclaimerCheckbox: false,\n },\n fieldValidators: () => ({\n disclaimerCheckbox: validators.checked(\n formatMessage(\n \"StandardLoan.ExpensesConfirmation.Form.checkboxFieldError\"\n )\n ),\n }),\n },\n {\n onSubmit: ({ disclaimerCheckbox }) =>\n pipe(\n submitExpensesForm({\n disclaimerCheckbox,\n\n ...submitFormState,\n } as SubmitExpensesInput),\n taskEither.chain(() =>\n taskEither.fromIO(() => {\n setBonitaStatus(() => \"PENDING\");\n setCanPoll(true);\n })\n )\n ),\n }\n );\n\n useEffect(() => {\n if (canPoll) {\n restartPoll();\n }\n }, [canPoll]);\n\n const foldOtherExpenses: (\n formStateOtherExpenses: Option,\n remoteOtherExpenses: Option\n ) => Option = (formStateOtherExpenses, remoteOtherExpenses) =>\n pipe(\n formStateOtherExpenses,\n option.fold(\n () =>\n pipe(\n remoteOtherExpenses,\n option.filterMap(v =>\n pipe(\n v.amount,\n option.fromPredicate(amount => !eq.eqNumber.equals(amount, 0))\n )\n )\n ),\n () => formStateOtherExpenses\n )\n );\n\n const foldAlimonyAmount: (\n formStateAlimonyAmount: Option,\n remoteAlimonyAmount: Option\n ) => Option = (formStateAlimonyAmount, remoteAlimonyAmount) =>\n pipe(\n formStateAlimonyAmount,\n option.fold(\n () =>\n pipe(\n remoteAlimonyAmount,\n option.filterMap(v =>\n pipe(\n v.amount,\n option.fromPredicate(amount => !eq.eqNumber.equals(amount, 0))\n )\n )\n ),\n () => formStateAlimonyAmount\n )\n );\n\n const foldPayAlimony: (\n formStatePayAlimony: Option,\n remotePayAlimony: Option\n ) => Option = (formStatePayAlimony, remotePayAlimony) => {\n return pipe(\n formStatePayAlimony,\n option.fold(\n () => remotePayAlimony,\n () => formStatePayAlimony\n )\n );\n };\n\n const otherNecessaryExpensesCalculatorValue = (\n calculatorData: Option\n ) =>\n pipe(\n calculatorData,\n option.map(val => {\n const customFieldsSum = pipe(\n val.necessaryExpenses.customExpensesFields,\n array.reduce(0, (acc, cur) => acc + cur.value)\n );\n const fieldsSum = pipe(\n val.necessaryExpenses,\n record.reduce(\n 0,\n (acc, cur) => (Array.isArray(cur) ? acc : acc + (cur as number)) // should test for number instead of array... somehow\n )\n );\n\n return customFieldsSum + fieldsSum;\n }),\n option.getOrElse(constant(0))\n );\n\n const getDifferenceFromNecessaryAndEstimated = (\n calculatorData: Option,\n minMontlyExpenses: number\n ) =>\n otherNecessaryExpensesCalculatorValue(calculatorData) - minMontlyExpenses;\n\n const updateLoading = (newVal: boolean) =>\n newVal !== loading && setLoading(newVal);\n pipe(\n expenses,\n remoteData.fold(\n () => updateLoading(true),\n () => updateLoading(false),\n (_, loading) => updateLoading(loading)\n )\n );\n if (bonitaStatus === \"PENDING\") {\n return (\n \n \n \n );\n }\n return (\n \n \n \n {formatMessage(\"StandardLoan.ExpensesConfirmation.Panel.description\")}\n \n \n {loading ? (\n \n ) : (\n pipe(\n readOnly,\n boolean.fold(\n () =>\n pipe(\n expenses,\n remoteData.fold(\n () => ,\n () => (\n \n \n \n ),\n data => (\n \n foldOtherExpenses(\n submitFormState.otherMontlyExpenses,\n data.otherRegularExpenses\n ),\n () =>\n pipe(\n data.minMontlyExpenses.amount >=\n otherNecessaryExpensesCalculatorValue(\n data.expensesCalculator\n ),\n boolean.fold(\n () =>\n getDifferenceFromNecessaryAndEstimated(\n data.expensesCalculator,\n data.minMontlyExpenses.amount\n ),\n constant(0)\n ),\n option.some\n )\n )\n ),\n\n alimonyAmount: foldAlimonyAmount(\n submitFormState.alimonyAmount,\n data.alimonyExpenses\n ),\n payAlimony: foldPayAlimony(\n submitFormState.payAlimony,\n pipe(\n data.alimonyExpenses,\n option.fold(\n () => option.some(false),\n v => option.some(v.amount > 0)\n )\n )\n ),\n }}\n setSubmitFormState={values => {\n setSubmitFormState(values);\n setReadOnly(true);\n }}\n onCancel={() => setReadOnly(true)}\n minMontlyExpenses={data.minMontlyExpenses}\n regularMontlyExpenses={data.regularMontlyExpenses}\n calculatorData={data.expensesCalculator}\n isCalculatorUsed={data.isCalculatorUsed}\n />\n )\n )\n ),\n () =>\n pipe(\n expenses,\n remoteData.fold(\n constant(),\n () => (\n \n \n \n ),\n data => (\n \n )\n )\n )\n )\n )\n )}\n \n {pipe(\n expenses,\n remoteData.fold(constNull, constNull, () => (\n \n \n \n \n \n \n \n \n \n \n \n ))\n )}\n \n {pipe(\n isLiabilitiesDialogOpen,\n boolean.fold(constNull, () => (\n {\n !isOpen && refreshExpenses();\n setIsLiabilitiesDialogOpen(isOpen);\n }}\n />\n ))\n )}\n {pipe(\n isExpensesDialogOpen,\n boolean.fold(constNull, () =>\n pipe(\n expenses,\n remoteData.fold(constNull, constNull, data =>\n option.isSome(data.expensesCalculator) ? (\n {\n refreshExpenses();\n setIsExpensesDialogOpen(false);\n }}\n onCancel={() => setIsExpensesDialogOpen(false)}\n calculatorData={data.expensesCalculator.value}\n minMonthlyExpenses={data.minMontlyExpenses}\n />\n ) : null\n )\n )\n )\n )}\n \n );\n}\n","import { Box, Button, FormSection, FormRow } from \"design-system\";\nimport { useFormatMessage } from \"../../../intl\";\nimport { ReadOnlyMoneyAmountField } from \"../../../Common/ReadOnlyMoneyAmountField/ReadOnlyMoneyAmountField\";\nimport { foldTenant, MoneyAmount } from \"../../../globalDomain\";\nimport { Dispatch, SetStateAction } from \"react\";\nimport { Option } from \"fp-ts/Option\";\nimport { useAppContext } from \"../../../useAppContext\";\nimport { pipe } from \"fp-ts/function\";\nimport { option } from \"fp-ts\";\n\ntype Props = {\n setReadOnly: Dispatch>;\n minMontlyExpenses: MoneyAmount;\n otherExpenses: Option;\n alimony: Option;\n regularMontlyExpenses: MoneyAmount;\n};\n\nexport function ReadOnlyExpensesConfirmation(props: Props) {\n const formatMessage = useFormatMessage();\n\n const {\n apiParameters: { tenant },\n } = useAppContext();\n\n const optionToZero = (value: Option) =>\n pipe(\n value,\n option.getOrElse(() => 0)\n );\n\n return (\n \n \n ({\n amount:\n props.minMontlyExpenses.amount +\n optionToZero(props.otherExpenses) +\n optionToZero(props.alimony),\n currency: props.minMontlyExpenses.currency,\n }),\n () => ({\n amount:\n props.minMontlyExpenses.amount +\n optionToZero(props.otherExpenses),\n currency: props.minMontlyExpenses.currency,\n })\n )}\n label={formatMessage(\n \"StandardLoan.ExpensesConfirmation.Panel.minimumMontlyExpensesLabel\"\n )}\n description={formatMessage(\n \"StandardLoan.ExpensesConfirmation.Panel.minimumMontlyExpensesDescription\"\n )}\n />\n \n \n \n \n \n \n props.setReadOnly(readOnly => !readOnly)}\n />\n \n \n \n );\n}\n","import {\n Box,\n Button,\n Card,\n Divider,\n Form,\n FormRow,\n FormSection,\n LoadingButton,\n NonNegativeInteger,\n PositiveInteger,\n Space,\n Stack,\n useForm,\n validators,\n} from \"design-system\";\nimport { useFormatMessage } from \"../../../intl\";\nimport { boolean, either, option, taskEither } from \"fp-ts\";\nimport { ReadOnlyMoneyAmountField } from \"../../../Common/ReadOnlyMoneyAmountField/ReadOnlyMoneyAmountField\";\nimport { MoneyField } from \"../../../Common/Price/MoneyField/MoneyField\";\nimport { foldTenant, MoneyAmount, useCheckTenant } from \"../../../globalDomain\";\nimport { Option } from \"fp-ts/Option\";\nimport { useTenantCurrency } from \"../../../Common/useTenantCurrency\";\nimport { Dispatch, SetStateAction, useEffect, useMemo } from \"react\";\nimport {\n constFalse,\n constNull,\n constUndefined,\n constVoid,\n flow,\n pipe,\n} from \"fp-ts/function\";\nimport { YesNoRadioGroupField } from \"../../../Common/YesNoRadioGroup/YesNoRadioGroupField\";\nimport { useAppContext } from \"../../../useAppContext\";\nimport { SubmitFormState } from \"./ExpensesConfirmation\";\nimport { IO } from \"fp-ts/IO\";\nimport { ExpensesCalculatorData } from \"./api\";\nimport { useUpdateEffect } from \"react-use\";\n\nexport interface CZFormData {\n otherMontlyExpenses: Option;\n payAlimony: Option;\n alimonyAmount: Option;\n}\n\nexport interface SKFormData {\n otherMontlyExpenses: Option;\n payAlimony: Option;\n alimonyAmount: Option;\n}\n\ntype Props = {\n minMontlyExpenses: MoneyAmount;\n regularMontlyExpenses: MoneyAmount;\n calculatorData: Option;\n onCancel: IO;\n setIsLiabilitiesDialogOpen: Dispatch>;\n setIsExpensesDialogOpen: Dispatch>;\n submitFormState: SubmitFormState;\n setSubmitFormState: Dispatch>;\n isCalculatorUsed: boolean;\n};\n\nexport function ExpensesConfirmationForm(props: Props) {\n const formatMessage = useFormatMessage();\n const tenantCurrency = useTenantCurrency();\n const checkTenant = useCheckTenant();\n const showExpensesCalculator = checkTenant({\n CZ: () => option.isSome(props.calculatorData),\n SK: constFalse,\n });\n\n const {\n apiParameters: { tenant },\n } = useAppContext();\n\n const { fieldProps, handleSubmit, values, setValues, handleReset } = useForm(\n {\n initialValues: props.submitFormState,\n fieldValidators: ({ payAlimony }) => ({\n otherMontlyExpenses: validators.validator<\n Option,\n Option\n >(value =>\n pipe(\n value,\n option.fold(\n () => either.right(option.none),\n flow(\n NonNegativeInteger.decode,\n either.bimap(\n () => formatMessage(\"Form.fieldError.nonNegativeInteger\"),\n option.some\n )\n )\n )\n )\n ),\n payAlimony: foldTenant(\n tenant,\n () => validators.definedNoExtract(formatMessage(\"GenericError\")),\n constUndefined\n ),\n alimonyAmount: foldTenant(\n tenant,\n () =>\n validators.validator, Option>(\n value =>\n pipe(\n payAlimony,\n option.fold(\n () => either.right(option.none),\n boolean.fold(\n () => either.right(option.none),\n () =>\n pipe(\n value,\n option.fold(\n () =>\n either.left(\n formatMessage(\"Form.fieldError.positiveInteger\")\n ),\n flow(\n PositiveInteger.decode,\n either.bimap(\n () =>\n formatMessage(\n \"Form.fieldError.positiveInteger\"\n ),\n option.some\n )\n )\n )\n )\n )\n )\n )\n ),\n constUndefined\n ),\n }),\n },\n {\n onSubmit: data =>\n taskEither.fromIO(() =>\n foldTenant(\n tenant,\n () => props.setSubmitFormState(data as SKFormData),\n () => props.setSubmitFormState(data as CZFormData)\n )\n ),\n }\n );\n const totalActualExpenses = useMemo(() => {\n return {\n amount:\n props.minMontlyExpenses.amount +\n props.regularMontlyExpenses.amount +\n pipe(\n values.otherMontlyExpenses,\n option.getOrElse(() => 0)\n ) +\n pipe(\n values.alimonyAmount,\n option.getOrElse(() => 0)\n ),\n currency: props.minMontlyExpenses.currency,\n };\n }, [\n props.minMontlyExpenses.amount,\n props.regularMontlyExpenses.amount,\n values.otherMontlyExpenses,\n values.alimonyAmount,\n props.minMontlyExpenses.currency,\n ]);\n\n useEffect(() => {\n const payAlimony = pipe(\n fieldProps(\"payAlimony\").value,\n option.getOrElse(constFalse)\n );\n\n if (!payAlimony) {\n fieldProps(\"alimonyAmount\").onChange(option.none as Option);\n }\n }, [fieldProps(\"payAlimony\").value]);\n\n useUpdateEffect(handleReset, [JSON.stringify(props.submitFormState)]);\n\n return (\n \n
\n \n \n \n \n \n \n {showExpensesCalculator ? (\n
\n props.setIsExpensesDialogOpen(true)}\n />\n
\n ) : (\n <>\n )}\n
\n \n \n \n \n \n props.setIsLiabilitiesDialogOpen(true)}\n />\n \n \n {foldTenant(\n tenant,\n () => (\n <>\n \n \n \n \n {pipe(\n values.payAlimony,\n option.fold(constNull, value =>\n pipe(\n value,\n boolean.fold(constNull, () => (\n \n \n <>\n \n ))\n )\n )\n )}\n \n ),\n constNull\n )}\n \n \n \n \n \n \n \n \n {\n setValues(props.submitFormState);\n props.onCancel();\n }}\n />\n \n \n \n \n \n
\n );\n}\n","import { option, taskEither } from \"fp-ts\";\nimport { useFormatMessage } from \"../../../../intl\";\nimport { Dialog } from \"design-system\";\nimport { CurrentLiabilitiesDialogContent } from \"./CurrentLiabilitiesDialogContent\";\nimport { Dispatch, SetStateAction } from \"react\";\nimport { useCommand } from \"../../../../useAPI\";\nimport { constVoid, pipe } from \"fp-ts/function\";\nimport * as standardLoanApi from \"./api\";\n\ntype Props = {\n setIsLiabilitiesDialogOpen: Dispatch>;\n};\n\nexport function CurrentLiabilitiesDialog(props: Props) {\n const formatMessage = useFormatMessage();\n const cancelWithoutSavingStandardLoan = useCommand(\n standardLoanApi.cancelWithoutSaving\n );\n const handleClose = () => props.setIsLiabilitiesDialogOpen(false);\n\n return (\n \n \n \n );\n}\n","import { Liabilities } from \"../../../../MortgageDashboard/Registers/CBResults/Liabilities\";\nimport { option, array } from \"fp-ts\";\nimport { useQuery } from \"../../../../useAPI\";\nimport {\n Box,\n Loader,\n ErrorBanner,\n unsafeNonNegative,\n unsafeLocalizedString,\n} from \"design-system\";\nimport { pipe, constNull, constVoid } from \"fp-ts/function\";\nimport * as remoteData from \"../../../../RemoteData\";\nimport { useFormatMessage } from \"../../../../intl\";\nimport { getCurrentApplicant } from \"../../../../MortgageDashboard/Applicants/applicantsUtils\";\nimport { SelectedApplicant } from \"../../../../MortgageDashboard/mortgageDashboardUtils\";\nimport * as api from \"./api\";\nimport { sequenceS } from \"fp-ts/Apply\";\nimport * as standartLoanApi from \"../../../api\";\n\ntype Props = {\n onClose: () => unknown;\n};\n\nexport function CurrentLiabilitiesDialogContent(props: Props) {\n const formatMessage = useFormatMessage();\n const [start] = useQuery(api.start);\n const [allLiabilities] = useQuery(api.getAllLiabilities);\n\n const defaultApplicant: SelectedApplicant = {\n type: \"MainApplicant\",\n index: unsafeNonNegative(0),\n };\n\n const [loanProviders] = useQuery(standartLoanApi.loanProviders);\n\n return (\n \n {pipe(\n { loanProviders, allLiabilities, start },\n sequenceS(remoteData.remoteData),\n remoteData.fold(\n () => (\n \n \n \n ),\n () => ,\n ({ loanProviders, allLiabilities }) => {\n const results = getCurrentApplicant(defaultApplicant, [\n {\n applicantIndex: unsafeNonNegative(0),\n data: allLiabilities,\n },\n ]);\n\n const providersList = pipe(\n loanProviders.loanProviderList,\n array.map(provider => ({\n label: unsafeLocalizedString(provider.name),\n value: provider.code,\n }))\n );\n\n return pipe(\n results,\n option.fold(\n constNull,\n ({\n overdraftsList,\n creditCardsList,\n consumerLoansOrMortgagesList,\n mtgAndClMonthlyInstallmentLimit,\n mtgAndClCurrentBalanceLimit,\n mtgAndClApprovedLoanAmountLimit,\n ccAndOvdCurrentBalanceLimit,\n ccAndOvdLimit,\n }) => (\n \n )\n )\n );\n }\n )\n )}\n \n );\n}\n","import { ExpensesCalculatorData } from \"../api\";\nimport { useFormatMessage } from \"../../../../intl\";\nimport { Dialog } from \"design-system\";\nimport { option } from \"fp-ts\";\nimport { ExpensesCalculator } from \"./ExpensesCalculator\";\nimport { ExpensesCalculatorProvider } from \"./ExpensesCalculatorProvider\";\nimport { MoneyAmount } from \"../../../../globalDomain\";\n\ntype Props = {\n onCancel: () => unknown;\n onSaved: () => unknown;\n calculatorData: ExpensesCalculatorData;\n minMonthlyExpenses: MoneyAmount;\n};\n\nexport function ExpensesCalculatorDialog(props: Props) {\n const formatMessage = useFormatMessage();\n\n return (\n \n \n \n \n \n );\n}\n","import {\n Body,\n CalculatedField,\n ComputedFieldProps,\n Form,\n FormSection,\n Loader,\n} from \"design-system\";\nimport * as api from \"../api\";\nimport { eqExpensesCalculatorData, ExpensesCalculatorData } from \"../api\";\nimport { option, taskEither } from \"fp-ts\";\nimport {\n LocaleKey,\n useFormatMessage,\n useFormatMoneyAmountValue,\n} from \"../../../../intl\";\nimport { RegularExpensesForm } from \"./RegularExpensesForm\";\nimport { NecessaryExpensesForm } from \"./NecessaryExpensesForm\";\nimport { useExpensesCalculatorContext } from \"./ExpensesCalculatorProvider\";\nimport { useCommand } from \"../../../../useAPI\";\nimport { flow, pipe } from \"fp-ts/function\";\nimport {\n MoneyAmount,\n unsafeNonNegativeInteger,\n} from \"../../../../globalDomain\";\nimport { useTenantCurrency } from \"../../../../Common/useTenantCurrency\";\nimport { useState } from \"react\";\nimport { useUpdateEffect } from \"react-use\";\n\ntype Props = {\n onCancel: () => unknown;\n onSaved: () => unknown;\n data: ExpensesCalculatorData;\n minMonthlyExpenses: MoneyAmount;\n};\n\nexport type ComputedFieldPropsExtended = ComputedFieldProps & {\n translationKey: LocaleKey;\n};\n\nexport function ExpensesCalculator(props: Props) {\n const formatMessage = useFormatMessage();\n const formatMoneyAmountValue = useFormatMoneyAmountValue(\n unsafeNonNegativeInteger(0)\n );\n const tenantCurrency = useTenantCurrency();\n\n const saveExpenseCalculatorData = useCommand(api.saveExpenseCalculatorData);\n\n const { necessarySum, calculatorData } = useExpensesCalculatorContext();\n\n const [isLoading, setIsLoading] = useState(false);\n\n useUpdateEffect(() => {\n if (isLoading) {\n if (eqExpensesCalculatorData.equals(calculatorData, props.data)) {\n props.onCancel();\n } else {\n pipe(\n saveExpenseCalculatorData({\n expensesCalculator: calculatorData,\n }),\n taskEither.bimap(\n () => setIsLoading(false),\n flow(() => setIsLoading(false), props.onSaved)\n )\n )();\n }\n }\n }, [isLoading]);\n\n return isLoading ? (\n \n ) : (\n {\n let el = document.querySelector(\":focus\");\n\n (el as HTMLElement)?.blur();\n\n setIsLoading(true);\n }),\n label: formatMessage(\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.save\"\n ),\n }}\n cancelButton={{\n action: props.onCancel,\n label: formatMessage(\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.close\"\n ),\n }}\n >\n \n \n \n \n props.minMonthlyExpenses.amount\n ? necessarySum\n : props.minMonthlyExpenses.amount,\n currency: tenantCurrency,\n })}\n label={formatMessage(\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.total\"\n )}\n error={option.none}\n />\n {necessarySum < props.minMonthlyExpenses.amount && (\n \n {formatMessage(\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.footnote\"\n )}\n \n )}\n \n );\n}\n","import { CustomExpensesField, RegularExpenses } from \"../api\";\nimport { ComputedFieldPropsExtended } from \"./ExpensesCalculator\";\nimport { Option } from \"fp-ts/Option\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { constant, constVoid, pipe } from \"fp-ts/function\";\nimport { array, option, ord, record, taskEither } from \"fp-ts\";\nimport {\n RuntimeLocaleKey,\n useFormatMessage,\n useFormatMoneyAmountValue,\n} from \"../../../../intl\";\nimport {\n CalculatedField,\n FormSection,\n NonNegative,\n unsafeLocalizedString,\n useForm,\n} from \"design-system\";\nimport { ExpensesSubForm } from \"./ExpensesSubForm\";\nimport { useExpensesCalculatorContext } from \"./ExpensesCalculatorProvider\";\nimport { unsafeNonNegativeInteger } from \"../../../../globalDomain\";\nimport { useTenantCurrency } from \"../../../../Common/useTenantCurrency\";\n\ntype RegularExpensesFormProps = {\n regularExpensesData: RegularExpenses;\n};\n\nexport function RegularExpensesForm(props: RegularExpensesFormProps) {\n const {\n regularSum,\n setRegularSum,\n setCalculatorData,\n } = useExpensesCalculatorContext();\n const formatMessage = useFormatMessage();\n const formatMoneyAmountValue = useFormatMoneyAmountValue(\n unsafeNonNegativeInteger(0)\n );\n const tenantCurrency = useTenantCurrency();\n\n const expenses = props.regularExpensesData;\n\n const [customFieldsUpdate, setCustomFieldUpdate] = useState(1);\n const customFieldsChanged = useCallback(\n () => setCustomFieldUpdate(n => n + 1),\n []\n );\n const getInitialValue = (initialValue: number) =>\n pipe(\n initialValue,\n option.fromPredicate(value => value !== 0)\n );\n\n const customFieldsValues: Option[] = useMemo(\n () =>\n pipe(\n expenses.customExpensesFields,\n array.sort(\n pipe(\n ord.ordNumber,\n ord.contramap(({ index: rank }: CustomExpensesField) => rank)\n )\n ),\n array.map(item => getInitialValue(item.value))\n ),\n []\n );\n const customFields: ComputedFieldPropsExtended>[] = pipe(\n expenses.customExpensesFields,\n array.sort(\n pipe(\n ord.ordNumber,\n ord.contramap(({ index: rank }: CustomExpensesField) => rank)\n )\n ),\n array.mapWithIndex((index, item) => ({\n value: customFieldsValues[index],\n name: item.key,\n issues: option.none,\n onBlur: constVoid,\n onChange: val => {\n customFieldsValues[index] = val;\n customFieldsChanged();\n },\n disabled: false,\n isTouched: false,\n translationKey: item.key as RuntimeLocaleKey,\n }))\n );\n\n //TODO should quit using form here\n const { fieldProps, values } = useForm(\n {\n initialValues: {\n regularExpensesfusesAmount: getInitialValue(expenses.fusesAmount),\n regularExpensessavingAmount: getInitialValue(expenses.savingAmount),\n regularExpensespensionAmount: getInitialValue(expenses.pensionAmount),\n regularExpensesotherAmount: getInitialValue(expenses.otherAmount),\n },\n fieldValidators: () => {\n return {};\n },\n },\n { onSubmit: () => taskEither.fromIO(constVoid) }\n );\n\n const necessaryFP: ComputedFieldPropsExtended>[] = [\n {\n ...fieldProps(\"regularExpensessavingAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.regular.savingLabel\",\n },\n {\n ...fieldProps(\"regularExpensesfusesAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.regular.fussLabel\",\n },\n {\n ...fieldProps(\"regularExpensespensionAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.regular.pensionLabel\",\n },\n {\n ...fieldProps(\"regularExpensesotherAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.regular.otherLabel\",\n },\n ...customFields,\n ];\n const getValue = (fieldvalue: Option) =>\n pipe(fieldvalue, option.getOrElse(constant(0)));\n\n useEffect(() => {\n const customFieldsSum = pipe(\n customFieldsValues,\n array.reduce(0, (acc, cur) => acc + getValue(cur))\n );\n const fieldsSum = pipe(\n values,\n record.reduce(0, (acc, cur) => acc + getValue(cur))\n );\n setRegularSum(fieldsSum + customFieldsSum);\n\n setCalculatorData(current => ({\n ...current,\n regularExpenses: {\n customExpensesFields: pipe(\n customFields,\n array.mapWithIndex((index, field) => ({\n index: index as NonNegative,\n value: getValue(field.value) as NonNegative,\n key: field.translationKey,\n }))\n ),\n otherAmount: getValue(values.regularExpensesotherAmount),\n pensionAmount: getValue(values.regularExpensespensionAmount),\n savingAmount: getValue(values.regularExpensessavingAmount),\n fusesAmount: getValue(values.regularExpensesfusesAmount),\n },\n }));\n }, [customFieldsUpdate, values]);\n\n return (\n \n \n \n \n );\n}\n","import { Option } from \"fp-ts/Option\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { constant, constVoid, pipe } from \"fp-ts/function\";\nimport { array, option, ord, record, taskEither } from \"fp-ts\";\nimport { CustomExpensesField, NecessaryExpenses } from \"../api\";\nimport {\n RuntimeLocaleKey,\n useFormatMessage,\n useFormatMoneyAmountValue,\n} from \"../../../../intl\";\nimport {\n CalculatedField,\n FormSection,\n InlineMessage,\n NonNegative,\n useForm,\n} from \"design-system\";\nimport { ExpensesSubForm } from \"./ExpensesSubForm\";\nimport { ComputedFieldPropsExtended } from \"./ExpensesCalculator\";\nimport { useExpensesCalculatorContext } from \"./ExpensesCalculatorProvider\";\nimport { unsafeNonNegativeInteger } from \"../../../../globalDomain\";\nimport { useTenantCurrency } from \"../../../../Common/useTenantCurrency\";\n\ntype NecessaryExpensesProps = {\n necessaryExpensesData: NecessaryExpenses;\n};\n\nexport function NecessaryExpensesForm(props: NecessaryExpensesProps) {\n const {\n necessarySum,\n setNecessarySum,\n setCalculatorData,\n } = useExpensesCalculatorContext();\n\n const formatMessage = useFormatMessage();\n const formatMoneyAmountValue = useFormatMoneyAmountValue(\n unsafeNonNegativeInteger(0)\n );\n const tenantCurrency = useTenantCurrency();\n\n const [expenses] = useState(props.necessaryExpensesData);\n\n const [customFieldsUpdate, setCustomFieldUpdate] = useState(1);\n const customFieldsChanged = useCallback(\n () => setCustomFieldUpdate(n => n + 1),\n []\n );\n const getInitialValue = (initialValue: number) =>\n pipe(\n initialValue,\n option.fromPredicate(value => value !== 0)\n );\n\n const customFieldsValues: Option[] = useMemo(\n () =>\n pipe(\n expenses.customExpensesFields,\n array.sort(\n pipe(\n ord.ordNumber,\n ord.contramap(({ index: rank }: CustomExpensesField) => rank)\n )\n ),\n array.map(item => getInitialValue(item.value))\n ),\n []\n );\n const customFields: ComputedFieldPropsExtended>[] = pipe(\n expenses.customExpensesFields,\n array.sort(\n pipe(\n ord.ordNumber,\n ord.contramap(({ index }: CustomExpensesField) => index)\n )\n ),\n array.mapWithIndex((index, item) => ({\n value: customFieldsValues[index],\n name: item.key,\n issues: option.none,\n onBlur: constVoid,\n onChange: val => {\n customFieldsValues[index] = val;\n customFieldsChanged();\n },\n disabled: false,\n isTouched: false,\n translationKey: item.key as RuntimeLocaleKey,\n }))\n );\n\n //TODO should quit using form here\n const { fieldProps, values } = useForm(\n {\n initialValues: {\n necessaryExpensescommonPurchasesAmount: getInitialValue(\n expenses.commonPurchasesAmount\n ),\n necessaryExpensesalimonyAmount: getInitialValue(expenses.alimonyAmount),\n necessaryExpensescateringAmount: getInitialValue(\n expenses.cateringAmount\n ),\n necessaryExpensesclothesAmount: getInitialValue(expenses.clothesAmount),\n necessaryExpenseseducationAmount: getInitialValue(\n expenses.educationAmount\n ),\n necessaryExpensesentertainmentAmount: getInitialValue(\n expenses.entertainmentAmount\n ),\n necessaryExpenseshealthAmount: getInitialValue(expenses.healthAmount),\n necessaryExpenseshousingAmount: getInitialValue(expenses.housingAmount),\n necessaryExpensesrepairsAmount: getInitialValue(expenses.repairsAmount),\n necessaryExpensestransportAmount: getInitialValue(\n expenses.transportAmount\n ),\n necessaryExpensesotherAmount: getInitialValue(expenses.otherAmount),\n },\n fieldValidators: () => {\n return {};\n },\n },\n { onSubmit: () => taskEither.fromIO(constVoid) }\n );\n\n const necessaryFP: ComputedFieldPropsExtended>[] = [\n {\n ...fieldProps(\"necessaryExpensescommonPurchasesAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.commonPurchasesLabel\",\n },\n {\n ...fieldProps(\"necessaryExpensesentertainmentAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.entertainmentLabel\",\n },\n {\n ...fieldProps(\"necessaryExpenseshousingAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.housingLabel\",\n },\n {\n ...fieldProps(\"necessaryExpenseseducationAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.EducationLabel\",\n },\n {\n ...fieldProps(\"necessaryExpensestransportAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.transportLabel\",\n },\n {\n ...fieldProps(\"necessaryExpensesalimonyAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.alimonyLabel\",\n },\n {\n ...fieldProps(\"necessaryExpensesclothesAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.clothesLabel\",\n },\n {\n ...fieldProps(\"necessaryExpensescateringAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.cateringLabel\",\n },\n {\n ...fieldProps(\"necessaryExpensesrepairsAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.apartmentRepairLabel\",\n },\n {\n ...fieldProps(\"necessaryExpensesotherAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.otherLabel\",\n },\n {\n ...fieldProps(\"necessaryExpenseshealthAmount\"),\n translationKey:\n \"StandardLoan.ExpensesConfirmation.Calculator.Form.necessary.healthLabel\",\n },\n ...customFields,\n ];\n const getValue = (fieldvalue: Option) =>\n pipe(fieldvalue, option.getOrElse(constant(0)));\n\n useEffect(() => {\n const customFieldsSum = pipe(\n customFieldsValues,\n array.reduce(0, (acc, cur) => acc + getValue(cur))\n );\n const fieldsSum = pipe(\n values,\n record.reduce(0, (acc, cur) => acc + getValue(cur))\n );\n\n setNecessarySum(fieldsSum + customFieldsSum);\n\n setCalculatorData(current => ({\n ...current,\n necessaryExpenses: {\n customExpensesFields: pipe(\n customFields,\n array.mapWithIndex((index, field) => ({\n index: index as NonNegative,\n value: getValue(field.value) as NonNegative,\n key: field.translationKey,\n }))\n ),\n otherAmount: getValue(values.necessaryExpensesotherAmount),\n transportAmount: getValue(values.necessaryExpensestransportAmount),\n repairsAmount: getValue(values.necessaryExpensesrepairsAmount),\n housingAmount: getValue(values.necessaryExpenseshousingAmount),\n healthAmount: getValue(values.necessaryExpenseshealthAmount),\n entertainmentAmount: getValue(\n values.necessaryExpensesentertainmentAmount\n ),\n educationAmount: getValue(values.necessaryExpenseseducationAmount),\n clothesAmount: getValue(values.necessaryExpensesclothesAmount),\n cateringAmount: getValue(values.necessaryExpensescateringAmount),\n alimonyAmount: getValue(values.necessaryExpensesalimonyAmount),\n commonPurchasesAmount: getValue(\n values.necessaryExpensescommonPurchasesAmount\n ),\n },\n }));\n }, [customFieldsUpdate, values]);\n\n return (\n \n \n\n \n\n \n \n );\n}\n","import {\n DropdownOption,\n ErrorBanner,\n ReadOnlyField,\n LocalizedString,\n ComputedFieldProps,\n} from \"design-system\";\n\nimport { constNull, constVoid, flow, pipe } from \"fp-ts/function\";\nimport { Option } from \"fp-ts/Option\";\nimport { useQuery } from \"../useAPI\";\nimport {\n dropdownOptionToValue,\n selectedDropdownOption,\n} from \"../Common/selectDropdownOption\";\nimport * as api from \"../StandardLoan/api\";\nimport * as remoteData from \"../RemoteData\";\nimport { option } from \"fp-ts\";\nimport { LocaleKey, useFormatMessage } from \"../intl\";\nimport { useEffect } from \"react\";\n\nimport { DropdownField } from \"../Common/DropdownField/DropdownField\";\n\ntype Props = ComputedFieldProps> & {\n onFinishLoading: () => unknown;\n};\n\nexport function DisbursementAccountsField(props: Props) {\n const formatMessage = useFormatMessage();\n const [disbursementAccounts] = useQuery(api.getDisbursementAccounts);\n const label = formatMessage(\n \"PreApprovedLoanSaleRecap.disbursementAccounts.label\"\n );\n\n useEffect(\n () =>\n pipe(\n disbursementAccounts,\n remoteData.fold(\n constVoid,\n () => {\n props.onFinishLoading();\n },\n accounts => {\n props.onFinishLoading();\n if (accounts.length === 1) {\n props.onChange(option.some(accounts[0]));\n }\n }\n )\n ),\n [disbursementAccounts]\n );\n\n return pipe(\n disbursementAccounts,\n remoteData.fold(\n constNull,\n response => {\n if (\"code\" in response) {\n return (\n \n {formatMessage(\n (\"AccountCollectionByClient.\" + response.code) as LocaleKey\n )}\n \n );\n } else {\n return {formatMessage(\"GenericError\")};\n }\n },\n accounts => {\n if (accounts.length === 1) {\n return (\n \n );\n } else {\n const options = accounts.map(accountName => ({\n label: accountName,\n value: accountName,\n }));\n\n const value = selectedDropdownOption(props.value, options);\n\n const onChange: (\n option: Option>\n ) => void = flow(dropdownOptionToValue, props.onChange);\n\n return (\n \n );\n }\n }\n )\n );\n}\n","import { FeedbackBlock } from \"design-system\";\nimport { option } from \"fp-ts\";\nimport { IO } from \"fp-ts/IO\";\nimport { useFormatMessage } from \"../../intl\";\nimport { MainContent } from \"../../Common/MainContent\";\n\ntype Props = {\n onExit: IO;\n};\n\nexport function ExistingApplication3PError(props: Props) {\n const formatMessage = useFormatMessage();\n\n return (\n \n \n \n );\n}\n","import { Box, FeedbackBlock } from \"design-system\";\nimport { useEffect } from \"react\";\nimport { pipe } from \"fp-ts/function\";\nimport { boolean, option, taskEither } from \"fp-ts\";\nimport { CFExistingErrorType } from \"../../ClientProfile/domain\";\nimport { useCommand } from \"../../useAPI\";\nimport * as slApi from \"../api\";\nimport * as clientApi from \"../../ClientProfile/api\";\nimport {\n CheckClientAge,\n CheckPrimaryIdEnumsCF,\n ExistingClientCheckKycCF,\n ExistingClientCheckNotesCF,\n} from \"../api\";\nimport { RejectionReason } from \"../StandardLoanState\";\nimport { useFormatMessage } from \"../../intl\";\nimport { StandardLoanFlowType } from \"../domain\";\n\ninterface Props {\n onSuccess: () => unknown;\n onRequestFailure: (reason: RejectionReason) => unknown;\n hasPasswordForCommunication: boolean;\n isPhoneNumberVerified: boolean;\n flowType: StandardLoanFlowType;\n isApplicationExisting: boolean;\n onExit: () => unknown;\n}\n\nexport const ExistingClientSuspense = (props: Props) => {\n const formatMessage = useFormatMessage();\n const checkSLMinimumAge = useCommand(slApi.checkMinimumAge);\n const checkPrivateClient = useCommand(clientApi.checkPrivateClient);\n const checkForeign = useCommand(slApi.checkForeign);\n const standardLoanCheckNotes = useCommand(slApi.checkNotes);\n const standardLoanCheckPrimaryIdInPerson = useCommand(\n slApi.existingClientPrimaryIdCheck\n );\n const standardLoanCheckKyc = useCommand(slApi.existingClientKYCCheck);\n const standardLoanCheckPhoneNumberAndEmail = useCommand(\n slApi.existingClientPhoneAndEmailCheck\n );\n\n const onFailure = (reason: CFExistingErrorType) => {\n if (reason.id !== \"SUCCESS\") {\n switch (reason.id) {\n case \"GenericError\":\n return props.onRequestFailure(\"CBRejected\");\n case \"hasBlockingNotesCF\":\n return props.onRequestFailure(\"hasBlockingNotesCF\");\n case \"invalidAgeCF\":\n return props.onRequestFailure(\"invalidAgeCF\");\n case \"privateClient\":\n return props.onRequestFailure(\"privateClient\");\n case \"phoneNumberNotVerifiedCF\":\n return props.onRequestFailure(\"phoneNumberNotVerifiedCF\");\n case \"phoneNumberMissingCF\":\n return props.onRequestFailure(\"phoneNumberMissingCF\");\n case \"highRiskClientCF\":\n return props.onRequestFailure(\"highRiskClientCF\");\n case \"hasNotPasswordForCommunicationCF\":\n return props.onRequestFailure(\"hasNotPasswordForCommunicationCF\");\n case \"foreignClientCF\":\n return props.onRequestFailure(\"foreignClientCF\");\n case \"KYC_ID_FIXED_EZY\":\n return props.onRequestFailure(\"KYC_ID_FIXED_EZY\");\n case \"KYC_FIXED_EZY\":\n return props.onRequestFailure(\"KYC_FIXED_EZY\");\n case \"KYC_FIXED_EZY_UPDATE_CONTACTS\":\n return props.onRequestFailure(\"KYC_FIXED_EZY_UPDATE_CONTACTS\");\n case \"UPDATE_CONTACTS\":\n return props.onRequestFailure(\"UPDATE_CONTACTS\");\n case \"KYC_ID_FIXED_EZY_UPDATE_CONTACTS\":\n return props.onRequestFailure(\"KYC_ID_FIXED_EZY_UPDATE_CONTACTS\");\n case \"ID_FIXED_EZY\":\n return props.onRequestFailure(\"ID_FIXED_EZY\");\n case \"ID_FIXED_EZY_UPDATE_CONTACTS\":\n return props.onRequestFailure(\"ID_FIXED_EZY_UPDATE_CONTACTS\");\n case \"UPDATE_ID\":\n return props.onRequestFailure(\"UPDATE_ID\");\n case \"UPDATE_ID_CONTACTS\":\n return props.onRequestFailure(\"UPDATE_ID_CONTACTS\");\n case \"UPDATE_PASSWORD\":\n return props.onRequestFailure(\"UPDATE_PASSWORD\");\n case \"UPDATE_ID_CONTACTS_PASSWORD\":\n return props.onRequestFailure(\"UPDATE_ID_CONTACTS_PASSWORD\");\n case \"UPDATE_ID_PASSWORD\":\n return props.onRequestFailure(\"UPDATE_ID_PASSWORD\");\n case \"UPDATE_ID_OTHER_THAN_AUTH_ID\":\n return props.onRequestFailure(\"UPDATE_ID_OTHER_THAN_AUTH_ID\");\n case \"UPDATE_ID_MISSING_INFORMATION\":\n return props.onRequestFailure(\"UPDATE_ID_MISSING_INFORMATION\");\n }\n }\n };\n\n const existingClientChecks = (\n hasPasswordForCommunication: boolean,\n phoneNumberVerified: boolean\n ) =>\n pipe(\n phoneNumberVerified,\n boolean.fold(\n () =>\n taskEither.left({\n id: \"phoneNumberNotVerifiedCF\",\n }),\n () => taskEither.right(null)\n ),\n taskEither.chain(() =>\n pipe(\n checkPrivateClient(),\n taskEither.filterOrElse<\n CFExistingErrorType,\n clientApi.ExistingClientPrivateCheck\n >(\n response => !response.privateClient,\n () => ({ id: \"privateClient\" })\n )\n )\n ),\n taskEither.chain(() =>\n pipe(\n checkSLMinimumAge(),\n taskEither.filterOrElse(\n response => !response.underAge,\n () => ({ id: \"invalidAgeCF\" })\n )\n )\n ),\n taskEither.chain(() =>\n pipe(\n checkForeign(),\n taskEither.filterOrElse(\n response => !response,\n () => ({ id: \"foreignClientCF\" })\n )\n )\n ),\n taskEither.chain(() =>\n pipe(\n standardLoanCheckNotes(),\n taskEither.filterOrElse<\n CFExistingErrorType,\n ExistingClientCheckNotesCF\n >(\n response => !response.hasBlockingNotes,\n () => ({ id: \"hasBlockingNotesCF\" })\n )\n )\n ),\n taskEither.chain(() =>\n pipe(\n standardLoanCheckKyc(),\n taskEither.filterOrElse<\n CFExistingErrorType,\n ExistingClientCheckKycCF\n >(\n response => !response.highRisk,\n () => ({ id: \"highRiskClientCF\" })\n )\n )\n ),\n taskEither.chain(() =>\n pipe(\n standardLoanCheckPhoneNumberAndEmail(),\n taskEither.filterOrElse<\n CFExistingErrorType,\n slApi.ExistingClientCheckPhoneAndEmail\n >(\n response => !response.phoneNumberNeeded,\n () => ({ id: \"phoneNumberMissingCF\" })\n )\n )\n ),\n taskEither.chain(() =>\n pipe(\n standardLoanCheckPrimaryIdInPerson(),\n taskEither.filterOrElse(\n response => response === \"SUCCESS\",\n response => ({ id: response })\n )\n )\n ),\n taskEither.chain(() => {\n if (!hasPasswordForCommunication) {\n return taskEither.left({\n id: \"hasNotPasswordForCommunicationCF\",\n });\n } else {\n return taskEither.right(null);\n }\n }),\n taskEither.bimap(onFailure, props.onSuccess)\n );\n\n useEffect(() => {\n existingClientChecks(\n props.hasPasswordForCommunication,\n props.isPhoneNumberVerified\n )();\n }, []);\n\n const content = ((): JSX.Element => {\n return (\n \n \n \n );\n })();\n\n return <>{content};\n};\n","import { Loader } from \"design-system\";\nimport { constVoid, pipe } from \"fp-ts/function\";\nimport { useQuery } from \"../../../useAPI\";\nimport * as remoteData from \"../../../RemoteData\";\nimport * as api from \"../../api\";\ntype Props = {\n onFinish: (hasIncomes: boolean) => void;\n onError: () => void;\n};\n\nexport function AdditionalIncomesCheck(props: Props) {\n const [getAdditionalIncomes] = useQuery(api.additionalIncomeList);\n pipe(\n getAdditionalIncomes,\n remoteData.fold(\n constVoid,\n () => props.onError,\n response => props.onFinish(response.additionalIncomeList.length > 0)\n )\n );\n\n return ;\n}\n","import { Box, Loader } from \"design-system\";\nimport { useQuery } from \"../../useAPI\";\nimport * as apis from \"../OfferList/api\";\nimport { pipe } from \"fp-ts/function\";\nimport * as remoteData from \"../../RemoteData\";\nimport * as api from \"../api\";\n\ninterface Props {\n onFailure: () => unknown;\n onContinue: (data: api.GenericLoanResponseOutput) => unknown;\n}\n\nexport const SaveCustomerOfferSuspense = (props: Props) => {\n const [saveCustomerSelectedOffer] = useQuery(apis.saveCustomerSelectedOffer);\n\n return pipe(\n saveCustomerSelectedOffer,\n remoteData.fold(\n () => (\n \n \n \n ),\n () => <>{props.onFailure()},\n data => <>{props.onContinue(data)}\n )\n );\n};\n"],"sourceRoot":""}