before killhouses options

This commit is contained in:
2026-02-09 09:22:19 +03:30
parent d39b75200c
commit 7326bf96b0
7 changed files with 236 additions and 322 deletions

View File

@@ -4,29 +4,15 @@ import { useDispatch } from "react-redux";
import { useFormik } from "formik";
import { Yup } from "../../../../lib/yup/yup";
import { Grid } from "../../../../components/grid/Grid";
import {
Autocomplete,
FormControl,
FormControlLabel,
IconButton,
InputLabel,
MenuItem,
Radio,
RadioGroup,
Select,
TextField,
Typography,
} from "@mui/material";
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 { provinceGetNationalDocumentsService } from "../../../province/services/province-get-national-documents";
import { getCarcassesBuyerInfoService } from "../../../steward/services/get-carcasses-buyer-info";
import {
slaughterEditBuyerDataService,
slaughterSubmitBuyerDataService,
} from "../../../slaughter-house/services/slaughter-house-submit-buyer";
import { LabelField } from "../../../../components/label-field/LabelField";
export const validationSchemaForAdminAddBuyer = (isEdit, isRealPerson) =>
Yup.object({
mobile: Yup.string()
@@ -55,9 +41,12 @@ export const validationSchemaForAdminAddBuyer = (isEdit, isRealPerson) =>
: Yup.string()
.required("این فیلد اجباری است!")
.matches(/^\d{10,11}$/, "شناسه باید 10 یا 11 رقم و فقط عدد باشد"),
role_key: Yup.string().required("این فیلد اجباری است!"),
type: Yup.string().oneOf(["Steward", "KillHouse"]).required(),
});
}).test(
"at-least-one-key",
"حداقل یک کشتارگاه یا مباشر باید انتخاب شود",
(value) =>
value?.steward_keys?.length > 0 || value?.kill_house_keys?.length > 0
);
export const handleSubmitForAdminAddBuyer = (
formik,
@@ -81,8 +70,8 @@ export const handleSubmitForAdminAddBuyer = (
province: formik.values.province,
national_id: formik.values.nationalId,
unit_name: formik.values.unit_name,
type: formik.values.type,
role_key: formik.values.role_key,
steward_keys: formik.values.steward_keys || [],
kill_house_keys: formik.values.kill_house_keys || [],
};
dispatch(slaughterEditBuyerDataService(submitData)).then((r) => {
@@ -115,8 +104,8 @@ export const handleSubmitForAdminAddBuyer = (
province: formik.values.province,
unit_name: formik.values.unit_name,
national_id: !isRealPerson ? null : formik.values.nationalId,
type: formik.values.type,
role_key: formik.values.role_key,
steward_keys: formik.values.steward_keys || [],
kill_house_keys: formik.values.kill_house_keys || [],
...(!isRealPerson && {
isRealPerson: false,
info_value: formik.values.nationalId,
@@ -150,20 +139,41 @@ export const handleSubmitForAdminAddBuyer = (
}
};
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 = (
tableData,
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: tableData.mobile || "",
firstName: tableData.firstName || "",
lastName: tableData.lastName || "",
province: tableData.province || "",
city: tableData.city || "",
nationalId: tableData.nationalId || "",
unit_name: tableData?.unitName || "",
type: formik.values?.type,
role_key: formik.values?.role_key,
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);
@@ -186,8 +196,8 @@ export const handleSetFormDataFromUserDataForAdminAddBuyer = (
city: userData.city || "",
nationalId: userData.nationalId || "",
unit_name: userData?.unitName || "",
type: formik.values?.type,
role_key: formik.values?.role_key,
steward_keys: formik.values?.steward_keys ?? [],
kill_house_keys: formik.values?.kill_house_keys ?? [],
};
formik.setValues(formData);
@@ -248,186 +258,76 @@ export const InquiryForAdminAddBuyer = ({
const nationalCode = formik2.values.nationalCode;
const personType = formik2.values.personType;
const type = personType === "legal" ? "unit" : "person";
setInquiryInProgress(true);
setNotFound(false);
setUserData(null);
let personData = null;
let selectedGuild = null;
try {
if (personType === "legal") {
const url = `https://pay.rasadyar.com/national-documents?info=${encodeURIComponent(
nationalCode
)}&type=unit`;
const res = await fetch(url);
const json = await res.json();
const response = await dispatch(
getCarcassesBuyerInfoService({ info: nationalCode, type })
);
if (json?.status && json?.data) {
const d = json.data;
const extractedProvince = extractProvinceFromAddress(
d.address || "",
provinceData
);
const aggregatedUserData = {
mobile: d.mobile,
firstName: d.name || "",
lastName: d.name || "",
unitName: d.unitName || "",
province: d.state || extractedProvince || "",
city: d.city || "",
nationalId: d.nationalCode || nationalCode,
type: formik.values?.type,
role_key: formik.values?.role_key,
};
handleSetFormDataFromUserDataForAdminAddBuyer(
aggregatedUserData,
formik
);
formik2.setFieldValue(
"nationalCode",
aggregatedUserData.nationalId || nationalCode
);
openNotif({
vertical: "top",
horizontal: "center",
msg: "اطلاعات حقوقی با موفقیت دریافت شد.",
severity: "success",
});
} else {
setNotFound(true);
formik.setFieldValue("nationalId", nationalCode);
openNotif({
vertical: "top",
horizontal: "center",
msg: "اطلاعات حقوقی برای این شناسه یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید.",
severity: "warning",
});
}
if (response.payload?.error) {
openNotif({
vertical: "top",
horizontal: "center",
msg: response.payload.error,
severity: "error",
});
return;
}
const personResponse = await dispatch(
provinceGetNationalDocumentsService({
info: nationalCode,
type: "person",
})
);
if (personResponse.payload?.error) {
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: personResponse.payload.error,
severity: "error",
msg:
type === "unit"
? "اطلاعات حقوقی با موفقیت دریافت شد."
: "اطلاعات با موفقیت دریافت شد.",
severity: "success",
});
} else if (
personResponse.payload?.data?.status &&
personResponse.payload?.data?.data
) {
personData = personResponse.payload.data.data;
} else {
openNotif({
vertical: "top",
horizontal: "center",
msg: "اطلاعات فردی یافت نشد.",
severity: "warning",
});
}
const guildResponse = await dispatch(
provinceGetNationalDocumentsService({
info: nationalCode,
type: "guild",
})
);
if (guildResponse.payload?.error) {
openNotif({
vertical: "top",
horizontal: "center",
msg: guildResponse.payload.error,
severity: "error",
});
} else if (
guildResponse.payload?.data?.status &&
guildResponse.payload?.data?.data
) {
const guildData = guildResponse.payload.data.data;
const guildArray = Array.isArray(guildData) ? guildData : [guildData];
if (guildArray.length > 0) {
const activeGuildIndex = guildArray.findIndex(
(g) => g.licenseStatus === "فعال/صادر شده"
);
selectedGuild =
guildArray[activeGuildIndex !== -1 ? activeGuildIndex : 0];
} else {
openNotif({
vertical: "top",
horizontal: "center",
msg: "اطلاعات صنفی برای این کد ملی یافت نشد.",
severity: "warning",
});
}
} else {
openNotif({
vertical: "top",
horizontal: "center",
msg: "اطلاعات صنفی برای این کد ملی یافت نشد.",
severity: "warning",
});
}
if (!personData && !selectedGuild) {
setNotFound(true);
formik.setFieldValue("nationalId", nationalCode);
openNotif({
vertical: "top",
horizontal: "center",
msg: "اطلاعاتی برای این کد ملی یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید.",
msg:
type === "unit"
? "اطلاعات حقوقی برای این شناسه یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید."
: "اطلاعاتی برای این کد ملی یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید.",
severity: "warning",
});
return;
}
const layerTwo = selectedGuild?.layerTwo || {};
const aggregatedUserData = {
mobile:
layerTwo.mobilenumber ||
personData?.mobile ||
layerTwo.phonenumber ||
"",
firstName: personData?.firstName || "",
lastName: personData?.lastName || "",
unitName:
selectedGuild?.title ||
layerTwo.corporationName ||
layerTwo.unionName ||
"",
province: selectedGuild?.state || "",
city: selectedGuild?.city || "",
nationalId:
personData?.nationalId ||
layerTwo.nationalcode ||
selectedGuild?.nationalId ||
nationalCode,
type: formik.values?.type,
role_key: formik.values?.role_key,
};
setUserData(aggregatedUserData);
handleSetFormDataFromUserDataForAdminAddBuyer(aggregatedUserData, formik);
formik2.setFieldValue(
"nationalCode",
aggregatedUserData.nationalId || nationalCode
);
openNotif({
vertical: "top",
horizontal: "center",
msg: "اطلاعات با موفقیت دریافت شد.",
severity: "success",
});
} finally {
setInquiryInProgress(false);
}
@@ -486,7 +386,30 @@ export const AdminAddBuyerForm = ({
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 (
<Grid
container
@@ -508,89 +431,61 @@ export const AdminAddBuyerForm = ({
onBlur={formik.handleBlur}
helperText={formik.touched.nationalId && formik.errors.nationalId}
/>
<LabelField label="انتخاب نوع واحد">
<RadioGroup
row
name="type"
value={formik.values.type}
onChange={(e) => {
const value = e.target.value;
formik.setFieldValue("type", value);
}}
>
<FormControlLabel value="Steward" control={<Radio />} label="مباشر" />
<FormControlLabel
value="KillHouse"
control={<Radio />}
label="کشتارگاه"
/>
</RadioGroup>
</LabelField>
{formik.values.type === "Steward" ? (
<Autocomplete
fullWidth
disablePortal
id="role_key"
options={stewards.map((item) => {
return {
key: item?.key,
label: `${item?.name || ""} - ${item?.user?.fullname || ""} (${
item?.user?.mobile || ""
})`,
};
})}
onChange={(event, value) => {
formik.setFieldValue("role_key", value?.key || "");
}}
value={
formik.values.role_key
? {
key: formik.values.role_key,
label:
stewards.find((item) => item.key === formik.values.role_key)
?.name || "",
}
: null
}
isOptionEqualToValue={(option, value) => option.key === value.key}
label="انتخاب مباشر"
renderInput={(params) => (
<TextField fullWidth {...params} label={"انتخاب مباشر"} />
)}
/>
) : formik.values.type === "KillHouse" ? (
<FormControl
fullWidth
error={formik.errors.selectedOption && formik.touched.selectedOption}
>
<InputLabel>انتخاب کشتارگاه یا کشتارکن</InputLabel>
<Select
label="انتخاب کشتارگاه یا کشتارکن"
id="role_key"
name="role_key"
// value={formik.values.role_key}
onChange={(e) => {
const [key] = e.target.value.split("#");
formik.setFieldValue("role_key", key);
}}
onBlur={formik.handleBlur}
>
{killHouses?.map((option) => (
<MenuItem
key={option}
value={`${option.key + "#" + option.killer}`}
>
{option.killer
? `کشتارکن ${option.name}`
: `کشتارگاه ${option.name}`}
</MenuItem>
))}
</Select>
{formik.errors.role_key && formik.touched.role_key && (
<div>{formik.errors.role_key}</div>
)}
</FormControl>
) : null}
<Autocomplete
fullWidth
multiple
disablePortal
id="steward_keys"
options={stewards.map((item) => ({
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) => (
<TextField {...params} label="انتخاب مباشر (چندگانه)" />
)}
/>
<Autocomplete
fullWidth
multiple
disablePortal
id="kill_house_keys"
options={killHouseOptions}
getOptionLabel={(option) => 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) => (
<TextField {...params} label="انتخاب کشتارگاه یا کشتارکن (چندگانه)" />
)}
/>
<TextField
fullWidth
id="mobile"