import { Box, Button, Checkbox, FormControlLabel, Grid, TextField, ToggleButton, ToggleButtonGroup, } from "@mui/material"; import SelectBox from "@/core/components/SelectBox"; import MuiDatePicker from "@/core/components/MuiDatePicker"; import { useTranslations } from "next-intl"; import useLimitedProvince from "@/lib/app/hooks/useLimitedProvince"; import useCities from "@/lib/app/hooks/useCities"; import { useFormik } from "formik"; import * as Yup from "yup"; import DataSaverOnIcon from "@mui/icons-material/DataSaverOn"; import { SEND_LOAN_REQUEST_NAVGAN } from "@/core/data/apiRoutes"; import { useRequest, useUser } from "@witel/webapp-builder"; import { useRouter } from "next/router"; import PlateNumber from "@/core/components/PlateNumber"; import * as React from "react"; import UseEducations from "@/lib/app/hooks/useEducations"; import useOccupations from "@/lib/app/hooks/useOccupations"; import useActivityType from "@/lib/app/hooks/useActivityType"; import useProjectTitle from "@/lib/app/hooks/useProjectTitle"; import PriceField from "@/core/components/PriceField"; import { useState } from "react"; const vehicle_amount = { اتوبوس: parseInt(process.env.NEXT_PUBLIC_BUS_AMOUNT), "مینی بوس": parseInt(process.env.NEXT_PUBLIC_MINIBUS_AMOUNT), }; const RealPersonForm = ({ setFinishLoanRequest }) => { const t = useTranslations(); const [vehicleType, setVehicleType] = useState(""); const { provinceList, isLoadingProvinceList, errorProvinceList } = useLimitedProvince(); const { cityTextField, cityList, setProvinceID, isLoadingCityList } = useCities(); const { educationsList, isLoadingEducationsList, errorEducationsList } = UseEducations(); const { occupationsList, isLoadingOccupationsList, errorOccupationsList } = useOccupations(); const { activityType, isLoadingActivityType, errorActivityType } = useActivityType(); const { projectTitle, isLoadingProjectTitle, errorProjectTitle } = useProjectTitle(); const requestServer = useRequest(); const { getUser, changeUser } = useUser(); const router = useRouter(); const initialValues = { person_type: "real", vehicle_type: "", telephone_number: "", activity_type: "", navgan_plan_id: "", investment: "", requested_facilities: "", applicant_payment: "", user_existing_employment: "", user_committed_employment: "", father_name: "", gender: "", first_name: "", last_name: "", city_id: "", province_id: "", education_id: "", occupation_id: "", navgan_id: "", national_code: "", national_serial_number: "", national_card_tracking_code: "", national_serial_number_or_tracking_code: "national_serial_number", postal_code: "", address: "", plate_part1: "", plate_part2: "ع", plate_part3: "", plate_part4: "", birthday: "", checkedBox: false, history_facilities: false, }; const validationSchema = Yup.object().shape({ telephone_number: Yup.mixed() .test("max", `${t("LoanRequest.tel_number_max")}`, (value) => { const stringValue = String(value); return stringValue.length === 11; }) .required(t("LoanRequest.error_message_tel_number")), vehicle_type: Yup.string().required(t("LoanRequest.error_message_vehicle_type")), requested_facilities: Yup.mixed() .test( "max-amount", `${t("LoanRequest.max_amount", { value: parseInt(vehicle_amount[vehicleType]).toLocaleString("en"), })}`, (value) => value <= vehicle_amount[vehicleType] ) .required(t("LoanRequest.error_message_requested_facilities")), investment: Yup.string().required(t("LoanRequest.error_message_investment")), user_committed_employment: Yup.string().required(t("LoanRequest.error_message_user_committed_employment")), user_existing_employment: Yup.string().required(t("LoanRequest.error_message_user_existing_employment")), activity_type: Yup.string().required(t("LoanRequest.error_message_activity_type")), navgan_plan_id: Yup.string().required(t("LoanRequest.error_message_navgan_plan_id")), gender: Yup.string().required(t("LoanRequest.error_message_gender")), father_name: Yup.string().required(t("LoanRequest.error_message_father_name")), occupation_id: Yup.string().required(t("LoanRequest.error_message_occupation_id")), education_id: Yup.string().required(t("LoanRequest.error_message_education_id")), address: Yup.string().required(t("LoanRequest.error_message_address")), birthday: Yup.string().required(t("LoanRequest.error_message_date_of_birth")), postal_code: Yup.mixed() .test("max", `${t("LoanRequest.postal_code_max")}`, (value) => value.toString().length === 10) .required(t("LoanRequest.error_message_postal_code")), navgan_id: Yup.mixed().required(t("LoanRequest.error_message_navgan_id")), province_id: Yup.string().required(t("LoanRequest.error_message_province_id")), city_id: Yup.string().required(t("LoanRequest.error_message_city_id")), first_name: Yup.string().required(t("LoanRequest.error_message_first_name")), last_name: Yup.string().required(t("LoanRequest.error_message_last_name")), plate_part1: Yup.mixed() .test("max", `${t("LoanRequest.error_message_plate_number")}`, (value) => value.toString().length === 2) .required(t("LoanRequest.error_message_plate_number")), plate_part2: Yup.mixed().required(t("LoanRequest.error_message_plate_number")), plate_part3: Yup.mixed() .test("max", `${t("LoanRequest.error_message_plate_number")}`, (value) => value.toString().length === 3) .required(t("LoanRequest.error_message_plate_number")), plate_part4: Yup.mixed() .test("max", `${t("LoanRequest.error_message_plate_number")}`, (value) => value.toString().length === 2) .required(t("LoanRequest.error_message_plate_number")), national_code: Yup.mixed() .test("is-number", `${t("LoanRequest.national_code_number")}`, (value) => !isNaN(value)) .test("positive", `${t("LoanRequest.national_code_positive")}`, (value) => value >= 0) .test("max", `${t("LoanRequest.national_code_max")}`, (value) => value.toString().length === 10) .required(t("LoanRequest.error_message_national_id")), national_serial_number: Yup.string().when( "national_serial_number_or_tracking_code", ([national_serial_number_or_tracking_code], schema) => { return national_serial_number_or_tracking_code === "national_serial_number" ? schema .test( "max", `${t("LoanRequest.national_serial_number_max")}`, (value) => value && value.toString().length === 10 ) .required(t("LoanRequest.error_message_shenasname_serial")) : schema; } ), national_card_tracking_code: Yup.string().when( "national_serial_number_or_tracking_code", ([national_serial_number_or_tracking_code], schema) => { return national_serial_number_or_tracking_code === "national_card_tracking_code" ? schema .test( "max", `${t("LoanRequest.national_tracking_code_max")}`, (value) => value && value.toString().length === 10 ) .required(t("LoanRequest.error_message_tracking_code")) : schema; } ), }); const handleSubmit = async (values, props) => { props.setSubmitting(true); const _national_card = values.national_serial_number_or_tracking_code === "national_serial_number" ? { national_serial_number: values.national_serial_number, } : { national_tracking_code: values.national_card_tracking_code, }; let _data = { is_legal_person: 0, telephone_number: values.telephone_number, national_id: values.national_code, vehicle_type: values.vehicle_type, province_id: values.province_id, city_id: values.city_id, first_name: values.first_name, last_name: values.last_name, navgan_id: values.navgan_id, postal_code: values.postal_code, navgan_type: "عمومی", gender: values.gender, requested_facility_amount: Number(values.requested_facilities), investment_amount: Number(values.investment), person_share: Number(values.applicant_payment), user_committed_employment: Number(values.user_committed_employment), user_existing_employment: Number(values.user_existing_employment), address: values.address, education_id: values.education_id, occupation_id: values.occupation_id, activity_type_id: values.activity_type, navgan_plan_id: values.navgan_plan_id, plate_part1: values.plate_part1, plate_part2: values.plate_part2, plate_part3: values.plate_part3, plate_part4: values.plate_part4, father_name: values.father_name, facility_usage_history: values.history_facilities === true ? 1 : 0, birthday: values.birthday.locale("en").format("YYYY-MM-DD"), ..._national_card, }; await requestServer(SEND_LOAN_REQUEST_NAVGAN, "post", { auth: true, notification: true, data: _data, }) .then(() => { router.replace("/dashboard/followUp-loan"); getUser((data) => { changeUser(data); }); }) .catch(() => {}) .finally(() => { props.setSubmitting(false); }); }; const formik = useFormik({ initialValues, validationSchema, onSubmit: handleSubmit, }); const handleAmountChange = (event) => { if (!isNaN(event.target.value)) { formik.setFieldValue("requested_facilities", event.target.value).then(() => { formik.setFieldTouched("applicant_payment", false, false); formik.setFieldValue("applicant_payment", Math.floor(event.target.value * 0.2)); }); } else { formik.setFieldValue("requested_facilities", formik.values.requested_facilities); } }; return ( <> { formik.setFieldValue("navgan_plan_id", event.target.value); }} setFieldTouched={formik.setFieldTouched} error={formik.touched.navgan_plan_id && Boolean(formik.errors.navgan_plan_id)} helperText={formik.touched.navgan_plan_id && formik.errors.navgan_plan_id} onBlur={formik.handleBlur("navgan_plan_id")} /> { formik.setFieldValue("activity_type", event.target.value); }} setFieldTouched={formik.setFieldTouched} error={formik.touched.activity_type && Boolean(formik.errors.activity_type)} helperText={formik.touched.activity_type && formik.errors.activity_type} onBlur={formik.handleBlur("activity_type")} /> { if (value === null) return; formik.handleChange({ target: { name: "national_serial_number_or_tracking_code", value: value, }, }); }} > {t("LoanRequest.text_field_shenasname_serial")} {t("LoanRequest.text_field_national_trackin_code")} {formik.values.national_serial_number_or_tracking_code === "national_serial_number" ? ( { const inputValue = e.target.value; const regex = /^[A-Za-z0-9]*$/; if (regex.test(inputValue)) { formik.setFieldValue("national_serial_number", inputValue); } }} onBlur={formik.handleBlur("national_serial_number")} error={ formik.touched.national_serial_number && Boolean(formik.errors.national_serial_number) } helperText={formik.touched.national_serial_number && formik.errors.national_serial_number} /> ) : ( { const inputValue = event.target.value; if (isNaN(Number(inputValue))) { return; } formik.handleChange({ target: { name: "national_card_tracking_code", value: inputValue, }, }); }} onBlur={formik.handleBlur("national_card_tracking_code")} error={ formik.touched.national_card_tracking_code && Boolean(formik.errors.national_card_tracking_code) } helperText={ formik.touched.national_card_tracking_code && formik.errors.national_card_tracking_code } /> )} { const inputValue = event.target.value; if (isNaN(Number(inputValue))) { return; } formik.handleChange({ target: { name: "national_code", value: inputValue, }, }); }} label={t("LoanRequest.text_field_national_code")} placeholder={t("LoanRequest.text_field_enter_your_national_code")} onBlur={formik.handleBlur("national_code")} error={formik.touched.national_code && Boolean(formik.errors.national_code)} helperText={formik.touched.national_code && formik.errors.national_code} fullWidth /> { formik.setFieldValue("gender", event.target.value); }} setFieldTouched={formik.setFieldTouched} error={formik.touched.gender && Boolean(formik.errors.gender)} helperText={formik.touched.gender && formik.errors.gender} onBlur={formik.handleBlur("gender")} /> { const inputValue = event.target.value; if (isNaN(Number(inputValue))) { return; } formik.handleChange({ target: { name: "postal_code", value: inputValue, }, }); }} size="small" label={t("LoanRequest.text_field_postal_code")} placeholder={t("LoanRequest.text_field_enter_your_postal_code")} fullWidth onBlur={formik.handleBlur("postal_code")} error={formik.touched.postal_code && Boolean(formik.errors.postal_code)} helperText={formik.touched.postal_code && formik.errors.postal_code} /> { const inputValue = event.target.value; if (isNaN(Number(inputValue))) { return; } formik.handleChange({ target: { name: "telephone_number", value: inputValue, }, }); }} label={t("LoanRequest.text_field_tel_number")} placeholder={t("LoanRequest.text_field_enter_your_tel_number")} fullWidth onBlur={formik.handleBlur("telephone_number")} error={formik.touched.telephone_number && Boolean(formik.errors.telephone_number)} helperText={formik.touched.telephone_number && formik.errors.telephone_number} /> { formik.setFieldValue("province_id", event.target.value); setProvinceID(event.target.value); formik.setFieldTouched("city_id", false, false); formik.setFieldValue("city_id", ""); }} setFieldTouched={formik.setFieldTouched} error={formik.touched.province_id && Boolean(formik.errors.province_id)} helperText={formik.touched.province_id && formik.errors.province_id} onBlur={formik.handleBlur("province_id")} /> formik.setFieldValue("city_id", event.target.value)} setFieldTouched={formik.setFieldTouched} error={formik.touched.city_id && Boolean(formik.errors.city_id)} helperText={formik.touched.city_id && formik.errors.city_id} onBlur={formik.handleBlur("city_id")} /> { setVehicleType(event.target.value); formik.setFieldValue("vehicle_type", event.target.value); }} error={formik.touched.vehicle_type && Boolean(formik.errors.vehicle_type)} helperText={formik.touched.vehicle_type && formik.errors.vehicle_type} onBlur={formik.handleBlur("vehicle_type")} /> { formik.setFieldValue("education_id", event.target.value); }} setFieldTouched={formik.setFieldTouched} error={formik.touched.education_id && Boolean(formik.errors.education_id)} helperText={formik.touched.education_id && formik.errors.education_id} onBlur={formik.handleBlur("education_id")} /> { formik.setFieldValue("occupation_id", event.target.value); }} setFieldTouched={formik.setFieldTouched} error={formik.touched.occupation_id && Boolean(formik.errors.occupation_id)} helperText={formik.touched.occupation_id && formik.errors.occupation_id} onBlur={formik.handleBlur("occupation_id")} /> { const inputValue = event.target.value; if (isNaN(Number(inputValue))) { return; } formik.handleChange({ target: { name: "user_committed_employment", value: inputValue, }, }); }} fullWidth helperText={ formik.touched.user_committed_employment ? formik.errors.user_committed_employment : null } onBlur={formik.handleBlur("user_committed_employment")} /> { const inputValue = event.target.value; if (isNaN(Number(inputValue))) { return; } formik.handleChange({ target: { name: "user_existing_employment", value: inputValue, }, }); }} fullWidth helperText={ formik.touched.user_existing_employment ? formik.errors.user_existing_employment : null } onBlur={formik.handleBlur("user_existing_employment")} /> { const inputValue = event.target.value; if (isNaN(Number(inputValue))) { return; } formik.setFieldValue("investment", event.target.value); }} onBlur={formik.handleBlur("investment")} error={formik.touched.investment && Boolean(formik.errors.investment)} helperText={formik.touched.investment && formik.errors.investment} fullWidth /> { formik.setFieldValue("history_facilities", event.target.checked); }} /> } label={`${t("LoanRequest.history_facilities")}`} /> { formik.setFieldValue("checkedBox", event.target.checked); }} /> } label={`${t("LoanRequest.checkbox")}`} /> ); }; export default RealPersonForm;