Fix: steward add buyer cleaner

This commit is contained in:
2026-02-07 15:00:57 +03:30
parent 7f1f55e478
commit d39b75200c
7 changed files with 332 additions and 242 deletions

View File

@@ -182,12 +182,16 @@ export const InquiryForStewardAddBuyer = ({
})
).then((r) => {
dispatch(LOADING_END());
if (r.error) {
const hasError = r.error || r.payload?.error;
if (hasError) {
setNotFound(true);
openNotif({
vertical: "top",
horizontal: "center",
msg: "خریدار یافت نشد، یک خریدار جدید ثبت کنید!",
msg:
typeof hasError === "string"
? hasError
: "خریدار یافت نشد، یک خریدار جدید ثبت کنید!",
severity: "error",
});
} else {

View File

@@ -1,4 +1,4 @@
import React, { useContext, useEffect, useState } from "react";
import React, { useContext, useEffect, useState, useCallback } from "react";
import { Grid } from "../../../../components/grid/Grid";
import { Button } from "@mui/material";
import { Yup } from "../../../../lib/yup/yup";
@@ -43,59 +43,74 @@ import {
import { inspectorGetKillHousesService } from "../../../inspector/services/inspector-get-kill-houses";
import { slaughterGetStewardsForAllocateService } from "../../../slaughter-house/services/slaughter-get-guilds-for-allocate";
// userType enums = steward | steward_true | steward_legal | _true | _legal
const PAGE_STEWARD = "steward_add_buyer";
const PAGE_SLAUGHTER = "slaughter_add_buyer";
const PAGE_SLAUGHTER_MANAGE = "slaughter_manage_add_buyer";
const PAGE_ADMIN = "admin_add_buyer";
const ADMIN_ROUTES = [
ROUTE_ADMINX_ROUTE_OUT_PROVINCE_TRUE_GUILDS,
ROUTE_ADMINX_ROUTE_OUT_PROVINCE_LEGAL_GUILDS,
ROUTE_ADMINX_ROUTE_MANAGE_STEWARDS_OUT_PROVINCE_LEGAL,
ROUTE_ADMINX_ROUTE_MANAGE_STEWARDS_OUT_PROVINCE_TRUE,
];
const getCurrentPage = (role, pathname) => {
if (role === "Steward") {
if (pathname === ROUTE_STEWARD_SALE_OUT_PROVINCE) {
return "steward_add_buyer";
}
if (role === "Steward" && pathname === ROUTE_STEWARD_SALE_OUT_PROVINCE) {
return PAGE_STEWARD;
}
if (role === "KillHouse") {
if (pathname === ROUTE_SLAUGHTER_INVENTORY_SELL_CARCASS_OUT_PROVINCE) {
return "slaughter_add_buyer";
return PAGE_SLAUGHTER;
}
if (pathname === ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_TRUE) {
return "slaughter_manage_add_buyer";
return PAGE_SLAUGHTER_MANAGE;
}
}
if (role === "AdminX") {
const routes = [
ROUTE_ADMINX_ROUTE_OUT_PROVINCE_TRUE_GUILDS,
ROUTE_ADMINX_ROUTE_OUT_PROVINCE_LEGAL_GUILDS,
ROUTE_ADMINX_ROUTE_MANAGE_STEWARDS_OUT_PROVINCE_LEGAL,
ROUTE_ADMINX_ROUTE_MANAGE_STEWARDS_OUT_PROVINCE_TRUE,
];
if (routes.some((r) => r === pathname)) {
return "admin_add_buyer";
}
if (role === "AdminX" && ADMIN_ROUTES.some((r) => r === pathname)) {
return PAGE_ADMIN;
}
return null;
};
const INITIAL_VALUES_BASE = {
mobile: "",
firstName: "",
lastName: "",
unit_name: "",
province: "",
city: "",
};
const getInitialValues = (page) => {
const initialValues = {
mobile: "",
firstName: "",
lastName: "",
unit_name: "",
province: "",
city: "",
};
if (page === "steward_add_buyer" || page === "slaughter_manage_add_buyer") {
return initialValues;
} else if (page === "slaughter_add_buyer") {
return {
...initialValues,
nationalId: "",
};
} else if (page === "admin_add_buyer") {
return {
...initialValues,
role_key: "",
type: "",
};
if (page === PAGE_SLAUGHTER) {
return { ...INITIAL_VALUES_BASE, nationalId: "" };
}
if (page === PAGE_ADMIN) {
return { ...INITIAL_VALUES_BASE, role_key: "", type: "" };
}
return { ...INITIAL_VALUES_BASE };
};
const getValidationSchema = (page, isRealPerson, isEdit) => {
if (page === PAGE_STEWARD) return validationSchemaForStewardAddBuyer;
if (page === PAGE_SLAUGHTER || page === PAGE_SLAUGHTER_MANAGE) {
return validationSchemaForSlaughterAddBuyer(isRealPerson, isEdit);
}
if (page === PAGE_ADMIN) {
return validationSchemaForAdminAddBuyer(isRealPerson, isEdit);
}
return Yup.object({});
};
const setFormDataFromTableData = (page, data, formik) => {
if (page === PAGE_STEWARD) {
handleSetFormDataFromTableDataForStewardAddBuyer(data, formik);
} else if (page === PAGE_SLAUGHTER || page === PAGE_SLAUGHTER_MANAGE) {
handleSetFormDataFromTableDataForSlaughterAddBuyer(data, formik);
} else if (page === PAGE_ADMIN) {
handleSetFormDataFromTableDataForAdminAddBuyer(data, formik);
}
return initialValues;
};
export const StewardAddBuyer = ({
@@ -104,18 +119,16 @@ export const StewardAddBuyer = ({
data,
isRealPerson,
buyerType = "",
// buyerYype => "Guilds" | "Steward"
}) => {
const role = getRoleFromUrl();
const { pathname } = useLocation();
const dispatch = useDispatch();
const [openNotif] = useContext(AppContext);
const [notFound, setNotFound] = useState(false);
const { selectedSubUser } = useSelector((state) => state.userSlice);
const page = getCurrentPage(role, pathname);
const IS_STEWARD_ADD_BUYER = page === "steward_add_buyer";
const IS_SLAUGHTER_ADD_BUYER = page === "slaughter_add_buyer";
const IS_SLAUGHTER_MANAGE_ADD_BUYER = page === "slaughter_manage_add_buyer";
const IS_ADMIN_ADD_BUYER = page === "admin_add_buyer";
const {
killHouses,
stewards,
@@ -127,71 +140,190 @@ export const StewardAddBuyer = ({
setUserData,
} = useAddBuyer(page);
const { selectedSubUser } = useSelector((state) => state.userSlice);
const [openNotif] = useContext(AppContext);
const [notFound, setNotFound] = useState(false);
const dispatch = useDispatch();
const formik = useFormik({
initialValues: getInitialValues(page),
validationSchema: IS_STEWARD_ADD_BUYER
? validationSchemaForStewardAddBuyer
: IS_SLAUGHTER_ADD_BUYER || IS_SLAUGHTER_MANAGE_ADD_BUYER
? validationSchemaForSlaughterAddBuyer(isRealPerson, isEdit)
: IS_ADMIN_ADD_BUYER
? validationSchemaForAdminAddBuyer(isRealPerson, isEdit)
: Yup.object({}),
validationSchema: getValidationSchema(page, isRealPerson, isEdit),
});
// Re-validate when switching to edit mode
useEffect(() => {
if (isEdit) {
formik.validateForm();
}
if (isEdit) formik.validateForm();
}, [isEdit]);
// Populate form when editing
useEffect(() => {
if (IS_ADMIN_ADD_BUYER) {
if (formik.values.type === "KillHouse") {
dispatch(inspectorGetKillHousesService());
} else {
dispatch(
slaughterGetStewardsForAllocateService({
free: true,
})
).then((r) => {
setStewards(r.payload.data || []);
});
}
if (isEdit && page && data) {
setFormDataFromTableData(page, data, formik);
}
}, [formik.values.type]);
}, [isEdit, page]);
// Load cities when province changes
useEffect(() => {
if (isEdit) {
if (IS_STEWARD_ADD_BUYER) {
handleSetFormDataFromTableDataForStewardAddBuyer(data, formik);
}
if (IS_SLAUGHTER_ADD_BUYER || IS_SLAUGHTER_MANAGE_ADD_BUYER) {
handleSetFormDataFromTableDataForSlaughterAddBuyer(data, formik);
}
if (IS_ADMIN_ADD_BUYER) {
handleSetFormDataFromTableDataForAdminAddBuyer(data, formik);
}
if (!formik.values.province) {
setCityData([]);
return;
}
}, [isEdit]);
setCityData([]);
dispatch(slaughterGetCitiesService(formik.values.province)).then((r) => {
setCityData(r.payload?.data ?? []);
});
}, [formik.values.province, dispatch]);
// Admin: load stewards or kill houses by type
useEffect(() => {
if (formik.values.province) {
setCityData(
[],
dispatch(slaughterGetCitiesService(formik.values.province)).then(
(r) => {
setCityData(r.payload.data);
}
)
if (page !== PAGE_ADMIN) return;
if (formik.values.type === "KillHouse") {
dispatch(inspectorGetKillHousesService());
} else {
dispatch(slaughterGetStewardsForAllocateService({ free: true })).then(
(r) => {
setStewards(r.payload?.data ?? []);
}
);
}
}, [formik.values.province]);
}, [page, formik.values.type, dispatch]);
const handleSubmit = useCallback(() => {
if (page === PAGE_STEWARD) {
handleSubmitForStewardAddBuyer(
formik,
dispatch,
isEdit,
data,
updateTable,
openNotif,
DRAWER,
role
);
return;
}
if (page === PAGE_SLAUGHTER) {
handleSubmitForSlaughterAddBuyer(
formik,
dispatch,
isEdit,
data,
updateTable,
openNotif,
DRAWER,
selectedSubUser,
isRealPerson
);
return;
}
if (page === PAGE_SLAUGHTER_MANAGE) {
handleSubmitForSlaughterAddBuyer(
formik,
dispatch,
isEdit,
data,
updateTable,
openNotif,
DRAWER,
selectedSubUser,
isRealPerson,
buyerType
);
return;
}
if (page === PAGE_ADMIN) {
handleSubmitForAdminAddBuyer(
formik,
dispatch,
isEdit,
data,
updateTable,
openNotif,
DRAWER,
isRealPerson,
buyerType
);
}
}, [
page,
formik,
dispatch,
isEdit,
data,
updateTable,
openNotif,
role,
selectedSubUser,
isRealPerson,
buyerType,
]);
const showInquiry = !isEdit && page;
const showForm = (userData || notFound || isEdit) && page;
const inquiryProps = {
notFound,
setNotFound,
setUserData,
formik,
};
const formProps = {
formik,
provinceData,
cityData,
notFound,
};
const renderInquiry = () => {
if (!showInquiry) return null;
if (page === PAGE_STEWARD) {
return <InquiryForStewardAddBuyer {...inquiryProps} />;
}
if (page === PAGE_SLAUGHTER || page === PAGE_SLAUGHTER_MANAGE) {
return (
<InquiryForSlaughterAddBuyer
{...inquiryProps}
isEdit={isEdit}
isRealPerson={isRealPerson}
provinceData={provinceData}
/>
);
}
if (page === PAGE_ADMIN) {
return (
<InquiryForAdminAddBuyer
{...inquiryProps}
isEdit={isEdit}
isRealPerson={isRealPerson}
provinceData={provinceData}
/>
);
}
return null;
};
const renderForm = () => {
if (!showForm) return null;
if (page === PAGE_STEWARD) {
return <StewardAddBuyerForm {...formProps} />;
}
if (page === PAGE_SLAUGHTER || page === PAGE_SLAUGHTER_MANAGE) {
return (
<SlaughterAddBuyerForm {...formProps} isRealPerson={isRealPerson} />
);
}
if (page === PAGE_ADMIN) {
return (
<AdminAddBuyerForm
{...formProps}
isRealPerson={isRealPerson}
killHouses={killHouses}
stewards={stewards}
/>
);
}
return null;
};
if (!page) {
return null;
}
return (
<Grid
@@ -202,124 +334,15 @@ export const StewardAddBuyer = ({
direction="column"
gap={2}
>
{!isEdit ? (
IS_STEWARD_ADD_BUYER ? (
<InquiryForStewardAddBuyer
notFound={notFound}
setNotFound={setNotFound}
setUserData={setUserData}
formik={formik}
/>
) : IS_SLAUGHTER_ADD_BUYER || IS_SLAUGHTER_MANAGE_ADD_BUYER ? (
<InquiryForSlaughterAddBuyer
notFound={notFound}
setNotFound={setNotFound}
setUserData={setUserData}
formik={formik}
isEdit={isEdit}
isRealPerson={isRealPerson}
provinceData={provinceData}
/>
) : IS_ADMIN_ADD_BUYER ? (
<InquiryForAdminAddBuyer
notFound={notFound}
setNotFound={setNotFound}
setUserData={setUserData}
formik={formik}
isEdit={isEdit}
isRealPerson={isRealPerson}
provinceData={provinceData}
/>
) : null
) : null}
{userData || notFound || isEdit ? (
IS_STEWARD_ADD_BUYER ? (
<StewardAddBuyerForm
formik={formik}
provinceData={provinceData}
cityData={cityData}
notFound={notFound}
/>
) : IS_SLAUGHTER_ADD_BUYER || IS_SLAUGHTER_MANAGE_ADD_BUYER ? (
<SlaughterAddBuyerForm
formik={formik}
provinceData={provinceData}
cityData={cityData}
notFound={notFound}
isRealPerson={isRealPerson}
/>
) : IS_ADMIN_ADD_BUYER ? (
<AdminAddBuyerForm
formik={formik}
provinceData={provinceData}
cityData={cityData}
notFound={notFound}
isRealPerson={isRealPerson}
killHouses={killHouses}
stewards={stewards}
/>
) : null
) : null}
{(userData || notFound || isEdit) && (
{renderInquiry()}
{renderForm()}
{showForm && (
<Grid container xs={12}>
<Button
fullWidth
variant="contained"
disabled={!formik.isValid}
onClick={() => {
if (IS_STEWARD_ADD_BUYER) {
handleSubmitForStewardAddBuyer(
formik,
dispatch,
isEdit,
data,
updateTable,
openNotif,
DRAWER,
role
);
}
if (IS_SLAUGHTER_ADD_BUYER) {
handleSubmitForSlaughterAddBuyer(
formik,
dispatch,
isEdit,
data,
updateTable,
openNotif,
DRAWER,
selectedSubUser,
isRealPerson
);
}
if (IS_SLAUGHTER_MANAGE_ADD_BUYER) {
handleSubmitForSlaughterAddBuyer(
formik,
dispatch,
isEdit,
data,
updateTable,
openNotif,
DRAWER,
selectedSubUser,
isRealPerson,
buyerType
);
}
if (IS_ADMIN_ADD_BUYER) {
handleSubmitForAdminAddBuyer(
formik,
dispatch,
isEdit,
data,
updateTable,
openNotif,
DRAWER,
isRealPerson,
buyerType
);
}
}}
onClick={handleSubmit}
>
{isEdit ? "ویرایش" : "ثبت"}
</Button>

View File

@@ -20,13 +20,16 @@ export const useAddBuyer = (page) => {
}, []);
useEffect(() => {
if (page === "admin_add_buyer") {
const d = inspectorGetKillHouses?.map((item) => {
return { name: item.name, key: item.key, killer: item.killer };
});
setKillhouses(d);
if (page === "admin_add_buyer" && inspectorGetKillHouses?.length) {
setKillhouses(
inspectorGetKillHouses.map((item) => ({
name: item.name,
key: item.key,
killer: item.killer,
}))
);
}
}, [inspectorGetKillHouses]);
}, [page, inspectorGetKillHouses]);
return {
killHouses,