import { useContext, useEffect, useState } from "react"; import { AppContext } from "../../../../contexts/AppContext"; import { useDispatch } from "react-redux"; import { useFormik } from "formik"; import { Yup } from "../../../../lib/yup/yup"; import { Grid } from "../../../../components/grid/Grid"; import { Autocomplete, IconButton, TextField, Typography } from "@mui/material"; import { SPACING } from "../../../../data/spacing"; import SearchIcon from "@mui/icons-material/Search"; import { extractProvinceFromAddress } from "../../../../utils/address"; import { getCarcassesBuyerInfoService } from "../../../steward/services/get-carcasses-buyer-info"; import { slaughterEditBuyerDataService, slaughterSubmitBuyerDataService, } from "../../../slaughter-house/services/slaughter-house-submit-buyer"; export const validationSchemaForAdminAddBuyer = (isEdit, isRealPerson) => Yup.object({ mobile: Yup.string() .required("این فیلد اجباری است!") .min(11, "شماره موبایل باید 11 رقم باشد") .max(11, "شماره موبایل باید 11 رقم باشد") .matches(/^09\d{9}$/, "شماره موبایل باید با 09 شروع شود و 11 رقم باشد"), firstName: Yup.string() .required("این فیلد اجباری است!") .typeError("لطفا فیلد را به درستی وارد کنید!"), lastName: Yup.string() .required("این فیلد اجباری است!") .typeError("لطفا فیلد را به درستی وارد کنید!"), unit_name: Yup.string() .required("این فیلد اجباری است!") .typeError("لطفا فیلد را به درستی وارد کنید!"), province: Yup.string() .required("این فیلد اجباری است!") .typeError("لطفا فیلد را به درستی وارد کنید!"), city: Yup.string() .required("این فیلد اجباری است!") .typeError("لطفا فیلد را به درستی وارد کنید!"), nationalId: !isRealPerson && isEdit ? Yup.string().nullable() : Yup.string() .required("این فیلد اجباری است!") .matches(/^\d{10,11}$/, "شناسه باید 10 یا 11 رقم و فقط عدد باشد"), }).test( "at-least-one-key", "حداقل یک کشتارگاه یا مباشر باید انتخاب شود", (value) => value?.steward_keys?.length > 0 || value?.kill_house_keys?.length > 0 ); export const handleSubmitForAdminAddBuyer = ( formik, dispatch, isEdit, tableData, updateTable, openNotif, DRAWER, isRealPerson, buyerType ) => { if (isEdit) { const submitData = { buyer_type: buyerType, buyer_key: tableData?.key, mobile: formik.values.mobile, first_name: formik.values.firstName, last_name: formik.values.lastName, city: formik.values.city, province: formik.values.province, national_id: formik.values.nationalId, unit_name: formik.values.unit_name, steward_keys: formik.values.steward_keys || [], kill_house_keys: formik.values.kill_house_keys || [], }; dispatch(slaughterEditBuyerDataService(submitData)).then((r) => { updateTable(); if (r.payload.error) { openNotif({ vertical: "top", horizontal: "center", msg: r.payload.error, severity: "error", }); } else { dispatch(DRAWER({ right: false, bottom: false, content: null })); openNotif({ vertical: "top", horizontal: "center", msg: "عملیات با موفقیت انجام شد.", severity: "success", }); } }); } else { const submitData = { mobile: formik.values.mobile, buyer_type: buyerType, first_name: formik.values.firstName, last_name: formik.values.lastName, city: formik.values.city, province: formik.values.province, unit_name: formik.values.unit_name, national_id: !isRealPerson ? null : formik.values.nationalId, steward_keys: formik.values.steward_keys || [], kill_house_keys: formik.values.kill_house_keys || [], ...(!isRealPerson && { isRealPerson: false, info_value: formik.values.nationalId, }), }; // if (IS_STEWARD) { // submitData.name = formik.values.unitName; // delete submitData.unit_name; // } dispatch(slaughterSubmitBuyerDataService(submitData)).then((r) => { updateTable(); if (r.payload.error) { openNotif({ vertical: "top", horizontal: "center", msg: r.payload.error, severity: "error", }); } else { dispatch(DRAWER({ right: false, bottom: false, content: null })); openNotif({ vertical: "top", horizontal: "center", msg: "عملیات با موفقیت انجام شد.", severity: "success", }); } }); } }; const extractStewardKeysFromInfo = (steward_info) => { if (!Array.isArray(steward_info)) return []; return steward_info .map((item) => item?.Steward?.key ?? item?.key) .filter(Boolean); }; const extractKillHouseKeysFromInfo = (killHouseInfo) => { const arr = killHouseInfo ?? []; if (!Array.isArray(arr)) return []; return arr.map((item) => item?.killHouse?.key).filter(Boolean); }; export const handleSetFormDataFromTableDataForAdminAddBuyer = ( item, formik ) => { const steward_keys = item?.steward_keys ?? extractStewardKeysFromInfo(item?.stewardInfo) ?? formik.values?.steward_keys ?? []; const kill_house_keys = extractKillHouseKeysFromInfo(item?.killHouseInfo) ?? []; const formData = { mobile: item.mobile || "", firstName: item.firstName || "", lastName: item.lastName || "", province: item.province || "", city: item.city || "", nationalId: item.nationalId || "", unit_name: item?.unitName || "", steward_keys, kill_house_keys, }; formik.setValues(formData); setTimeout(() => { formik.validateForm(); }, 1); }; export const handleSetFormDataFromUserDataForAdminAddBuyer = ( userData, formik ) => { if (userData) { const formData = { mobile: userData.mobile || "", firstName: userData.firstName || "", lastName: userData.lastName || "", province: userData.province || "", city: userData.city || "", nationalId: userData.nationalId || "", unit_name: userData?.unitName || "", steward_keys: formik.values?.steward_keys ?? [], kill_house_keys: formik.values?.kill_house_keys ?? [], }; formik.setValues(formData); setTimeout(() => { formik.validateForm(); }, 1); } }; export const InquiryForAdminAddBuyer = ({ notFound, setNotFound, setUserData, formik, isEdit, isRealPerson, provinceData, }) => { const [inquiryInProgress, setInquiryInProgress] = useState(false); const [openNotif] = useContext(AppContext); const dispatch = useDispatch(); const formik2 = useFormik({ initialValues: { personType: isRealPerson ? "real" : "legal", // real | legal nationalCode: "", }, validationSchema: Yup.object({ nationalCode: isEdit && isRealPerson ? Yup.string().nullable() : Yup.string() .required("این فیلد اجباری است!") .when("personType", { is: "real", then: (schema) => schema .length(10, "کد ملی باید 10 رقم باشد") .matches(/^\d{10}$/, "کد ملی باید فقط شامل اعداد باشد"), otherwise: (schema) => schema .length(11, "شناسه ملی حقوقی باید 11 رقم باشد") .matches( /^\d{11}$/, "شناسه ملی حقوقی باید فقط شامل اعداد باشد" ), }), }), validateOnMount: isEdit ? false : true, }); const handleInquiry = async () => { if (!formik2.isValid || inquiryInProgress) { return; } const nationalCode = formik2.values.nationalCode; const personType = formik2.values.personType; const type = personType === "legal" ? "unit" : "person"; setInquiryInProgress(true); setNotFound(false); setUserData(null); try { const response = await dispatch( getCarcassesBuyerInfoService({ info: nationalCode, type }) ); if (response.payload?.error) { openNotif({ vertical: "top", horizontal: "center", msg: response.payload.error, severity: "error", }); return; } const json = response.payload?.data; if (json?.status && json?.data) { const d = json.data; const extractedProvince = extractProvinceFromAddress( d.address || "", provinceData ); const aggregatedUserData = { mobile: d.mobile || d.mobilenumber || "", firstName: d.firstName || d.name || "", lastName: d.lastName || d.name || "", unitName: d.unitName || d.title || d.corporationName || d.unionName || "", province: d.province || d.state || extractedProvince || "", city: d.city || "", nationalId: d.nationalId || d.nationalCode || d.nationalcode || nationalCode, }; setUserData(aggregatedUserData); handleSetFormDataFromUserDataForAdminAddBuyer( aggregatedUserData, formik ); formik2.setFieldValue( "nationalCode", aggregatedUserData.nationalId || nationalCode ); openNotif({ vertical: "top", horizontal: "center", msg: type === "unit" ? "اطلاعات حقوقی با موفقیت دریافت شد." : "اطلاعات با موفقیت دریافت شد.", severity: "success", }); } else { setNotFound(true); formik.setFieldValue("nationalId", nationalCode); openNotif({ vertical: "top", horizontal: "center", msg: type === "unit" ? "اطلاعات حقوقی برای این شناسه یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید." : "اطلاعاتی برای این کد ملی یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید.", severity: "warning", }); } } finally { setInquiryInProgress(false); } }; useEffect(() => { if (notFound) { formik.setFieldValue("mobile", formik2.values.mobile); } }, [notFound]); return ( {"استعلام "} {!isRealPerson ? "شناسه ملی حقوقی" : "کد ملی"} ); }; export const AdminAddBuyerForm = ({ formik, provinceData, cityData, notFound, isRealPerson, killHouses, stewards, editData, }) => { const getStewardLabel = (key) => { const item = stewards?.find((s) => s.key === key); if (item) return `${item?.name || ""} - ${item?.user?.fullname || ""} (${ item?.user?.mobile || "" })`; const fromEdit = (editData?.stewardInfo || []).find( (s) => s?.Steward?.key === key || s?.key === key ); if (fromEdit) return ( fromEdit?.Steward?.name || fromEdit?.fullname || fromEdit?.name || null ); return null; }; const killHouseOptions = (killHouses || []).map((option) => ({ key: option.key, killer: option.killer, label: option.killer ? `کشتارکن ${(option.name || "").trim()}` : `کشتارگاه ${(option.name || "").trim()}`, })); return ( ({ key: item?.key, label: `${item?.name || ""} - ${item?.user?.fullname || ""} (${ item?.user?.mobile || "" })`, }))} getOptionLabel={(option) => option.label || ""} isOptionEqualToValue={(option, value) => option.key === value.key} onChange={(event, value) => { formik.setFieldValue( "steward_keys", value ? value.map((v) => v.key) : [] ); }} value={(formik.values.steward_keys || []) .map((key) => { const label = getStewardLabel(key); return label ? { key, label } : null; }) .filter(Boolean)} renderInput={(params) => ( )} /> option.label || ""} isOptionEqualToValue={(option, value) => option.key === value.key} onChange={(event, value) => { formik.setFieldValue( "kill_house_keys", value ? value.map((v) => v.key) : [] ); }} value={(formik.values.kill_house_keys || []) .map((key) => { const option = killHouseOptions.find((k) => k.key === key); return option ? { key, killer: option.killer, label: option.label } : null; }) .filter(Boolean)} renderInput={(params) => ( )} /> ({ id: i.name, label: i.name })) : [] } isOptionEqualToValue={(option, value) => option.id === value.id} onChange={(e, value) => { formik.setFieldValue("province", value ? value.id : ""); formik.setFieldValue("city", ""); }} value={ formik.values.province ? { id: formik.values.province, label: formik.values.province, } : null } renderInput={(params) => ( )} /> {!notFound && ( استان: {formik.values.province} )} {cityData && formik.values.province && ( <> ({ id: i.name, label: i.name })) : [] } isOptionEqualToValue={(option, value) => option.id === value.id} onChange={(e, value) => { formik.setFieldValue("city", value ? value.id : ""); }} value={cityData.find((i) => i.name === formik.values.city)?.name} renderInput={(params) => ( )} /> {!notFound && ( شهر: {formik.values.city} )} )} ); };