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}
)}
>
)}
);
};