From 2705e226e13659a31b915220e70459b7a0ed87ae Mon Sep 17 00:00:00 2001 From: workashrafi77-web Date: Sat, 31 Jan 2026 17:14:08 +0330 Subject: [PATCH] implement => add buyer form --- .../guilds-operations/GuildsOperations.js | 51 +- .../TradePanelPurchaseModal.js | 1 + ...SlaughterSellCarcassOutProvinceAddBuyer.js | 2 - .../SlaughterSellCarcassOutProvinceBuyers.js | 13 +- .../InquiryForSlaughterAddBuyer.js | 594 ++++++++++++++++++ .../InquiryForStewardAddBuyer.js | 365 +++++++++++ .../steward-add-buyer/StewardAddBuyer.js | 244 +++++++ .../steward-add-buyer/hooks/useAddBuyer.js | 30 + .../StewardSellOutOfProvinceBuyers.js | 9 +- src/pages/Guilds.js | 26 +- src/routes/managerRouting.js | 1 + src/routes/slaughterRouting.js | 18 +- 12 files changed, 1327 insertions(+), 27 deletions(-) create mode 100644 src/features/steward/components/steward-add-buyer/InquiryForSlaughterAddBuyer.js create mode 100644 src/features/steward/components/steward-add-buyer/InquiryForStewardAddBuyer.js create mode 100644 src/features/steward/components/steward-add-buyer/StewardAddBuyer.js create mode 100644 src/features/steward/components/steward-add-buyer/hooks/useAddBuyer.js diff --git a/src/features/province/components/guilds-operations/GuildsOperations.js b/src/features/province/components/guilds-operations/GuildsOperations.js index dc557b9..c8c7f12 100644 --- a/src/features/province/components/guilds-operations/GuildsOperations.js +++ b/src/features/province/components/guilds-operations/GuildsOperations.js @@ -30,6 +30,13 @@ import { ROUTE_SUPER_ADMIN_ROUTE_IN_PROVINCE_LEGAL_GUILDS, ROUTE_ADMINX_ROUTE_IN_PROVINCE_LEGAL_GUILDS, ROUTE_PROVINCE_ROUTE_IN_PROVINCE_LEGAL_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_GUILDS_REQUESTS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_TRUE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_LEGAL, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_TRUE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_LEGAL, } from "../../../../routes/routes"; import LinkItem from "../../../../components/link-item/LinkItem"; import { MdCorporateFare } from "react-icons/md"; @@ -63,7 +70,11 @@ export const GuildsOperations = () => { ? ROUTE_SUPER_ADMIN_ROUTE_IN_PROVINCE_GUILDS : getRoleFromUrl() === "AdminX" ? ROUTE_ADMINX_ROUTE_IN_PROVINCE_GUILDS - : ROUTE_PROVINCE_ROUTE_IN_PROVINCE_GUILDS + : getRoleFromUrl() === "KillHouse" + ? ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE + : getRoleFromUrl() === "ProvinceOperator" + ? ROUTE_PROVINCE_ROUTE_IN_PROVINCE_GUILDS + : null } > { ? ROUTE_SUPER_ADMIN_ROUTE_OUT_PROVINCE_GUILDS : getRoleFromUrl() === "AdminX" ? ROUTE_ADMINX_ROUTE_OUT_PROVINCE_GUILDS - : ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_GUILDS + : getRoleFromUrl() === "KillHouse" + ? ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE + : getRoleFromUrl() === "ProvinceOperator" + ? ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_GUILDS + : null } > { ROUTE_SUPER_ADMIN_ROUTE_IN_PROVINCE_GUILDS, ROUTE_ADMINX_ROUTE_IN_PROVINCE_GUILDS, ROUTE_PROVINCE_ROUTE_IN_PROVINCE_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE, ].includes(pathname) && ( <> { ? ROUTE_SUPER_ADMIN_ROUTE_IN_PROVINCE_GUILDS_REQUESTS : getRoleFromUrl() === "AdminX" ? ROUTE_ADMINX_ROUTE_IN_PROVINCE_GUILDS_REQUESTS - : ROUTE_PROVINCE_ROUTE_IN_PROVINCE_GUILDS_REQUESTS + : getRoleFromUrl() === "KillHouse" + ? ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_GUILDS_REQUESTS + : getRoleFromUrl() === "ProvinceOperator" + ? ROUTE_PROVINCE_ROUTE_IN_PROVINCE_GUILDS_REQUESTS + : null } > { ? ROUTE_SUPER_ADMIN_ROUTE_IN_PROVINCE_TRUE_GUILDS : getRoleFromUrl() === "AdminX" ? ROUTE_ADMINX_ROUTE_IN_PROVINCE_TRUE_GUILDS - : ROUTE_PROVINCE_ROUTE_IN_PROVINCE_TRUE_GUILDS + : getRoleFromUrl() === "KillHouse" + ? ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_TRUE + : getRoleFromUrl() === "ProvinceOperator" + ? ROUTE_PROVINCE_ROUTE_IN_PROVINCE_TRUE_GUILDS + : null } > { ? ROUTE_SUPER_ADMIN_ROUTE_IN_PROVINCE_LEGAL_GUILDS : getRoleFromUrl() === "AdminX" ? ROUTE_ADMINX_ROUTE_IN_PROVINCE_LEGAL_GUILDS - : ROUTE_PROVINCE_ROUTE_IN_PROVINCE_LEGAL_GUILDS + : getRoleFromUrl() === "KillHouse" + ? ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_LEGAL + : getRoleFromUrl() === "ProvinceOperator" + ? ROUTE_PROVINCE_ROUTE_IN_PROVINCE_LEGAL_GUILDS + : null } > { ROUTE_SUPER_ADMIN_ROUTE_OUT_PROVINCE_GUILDS, ROUTE_ADMINX_ROUTE_OUT_PROVINCE_GUILDS, ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE, ].includes(pathname) && ( <> { ? ROUTE_SUPER_ADMIN_ROUTE_OUT_PROVINCE_TRUE_GUILDS : getRoleFromUrl() === "AdminX" ? ROUTE_ADMINX_ROUTE_OUT_PROVINCE_TRUE_GUILDS - : ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_TRUE_GUILDS + : getRoleFromUrl() === "KillHouse" + ? ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_TRUE + : getRoleFromUrl() === "ProvinceOperator" + ? ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_TRUE_GUILDS + : null } > { ? ROUTE_SUPER_ADMIN_ROUTE_OUT_PROVINCE_LEGAL_GUILDS : getRoleFromUrl() === "AdminX" ? ROUTE_ADMINX_ROUTE_OUT_PROVINCE_LEGAL_GUILDS - : ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_LEGAL_GUILDS + : getRoleFromUrl() === "KillHouse" + ? ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_LEGAL + : getRoleFromUrl() === "ProvinceOperator" + ? ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_LEGAL_GUILDS + : null } > { const handleTextChange = (event) => { @@ -83,16 +84,11 @@ export const SlaughterSellCarcassOutProvinceBuyers = () => { right: !(window.innerWidth <= 600), bottom: window.innerWidth <= 600, content: ( - ), title: "ویرایش خریدار", @@ -203,7 +199,8 @@ export const SlaughterSellCarcassOutProvinceBuyers = () => { right: !(window.innerWidth <= 600), bottom: window.innerWidth <= 600, content: ( - ), diff --git a/src/features/steward/components/steward-add-buyer/InquiryForSlaughterAddBuyer.js b/src/features/steward/components/steward-add-buyer/InquiryForSlaughterAddBuyer.js new file mode 100644 index 0000000..f383211 --- /dev/null +++ b/src/features/steward/components/steward-add-buyer/InquiryForSlaughterAddBuyer.js @@ -0,0 +1,594 @@ +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 { provinceGetNationalDocumentsService } from "../../../province/services/province-get-national-documents"; +import { + slaughterEditBuyerDataService, + slaughterSubmitBuyerDataService, +} from "../../../slaughter-house/services/slaughter-house-submit-buyer"; + +export const validationSchemaForSlaughterAddBuyer = (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 === false && isEdit + ? Yup.string().nullable() + : Yup.string() + .required("این فیلد اجباری است!") + .matches(/^\d{10,11}$/, "شناسه باید 10 یا 11 رقم و فقط عدد باشد"), + }); + +export const handleSubmitForSlaughterAddBuyer = ( + formik, + dispatch, + isEdit, + tableData, + updateTable, + openNotif, + DRAWER, + selectedSubUser, + isRealPerson, + buyerType +) => { + if (isEdit) { + const submitData = { + 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, + role_key: selectedSubUser?.key || "", + buyer_type: tableData?.buyerType, + buyer_key: tableData?.key, + }; + + 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, + 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, + role_key: selectedSubUser?.key, + ...(!isRealPerson && { + isRealPerson: false, + info_value: formik.values.nationalId, + }), + ...(buyerType && { + buyer_type: buyerType, + }), + }; + + // 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", + }); + } + }); + } +}; + +export const handleSetFormDataFromTableDataForSlaughterAddBuyer = ( + tableData, + formik +) => { + console.log(tableData); + const formData = { + mobile: tableData.mobile || "", + firstName: tableData.firstName || "", + lastName: tableData.lastName || "", + province: tableData.province || "", + city: tableData.city || "", + nationalId: tableData.nationalId || "", + unit_name: tableData?.unitName || "", + }; + + formik.setValues(formData); + + setTimeout(() => { + formik.validateForm(); + }, 1); +}; + +export const handleSetFormDataFromUserDataForStewardAddBuyer = ( + 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 || "", + }; + + formik.setValues(formData); + + setTimeout(() => { + formik.validateForm(); + }, 1); + } +}; + +export const InquiryForSlaughterAddBuyer = ({ + 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({ + personType: Yup.string().oneOf(["real", "legal"]).required(), + 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; + + setInquiryInProgress(true); + setNotFound(false); + setUserData(null); + + let personData = null; + let selectedGuild = null; + + try { + if (!isRealPerson) { + const url = `https://pay.rasadyar.com/national-documents?info=${encodeURIComponent( + nationalCode + )}&type=unit`; + const res = await fetch(url); + const json = await res.json(); + + 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, + }; + setUserData(aggregatedUserData); + handleSetFormDataFromUserDataForStewardAddBuyer( + aggregatedUserData, + formik + ); + + openNotif({ + vertical: "top", + horizontal: "center", + msg: "اطلاعات حقوقی با موفقیت دریافت شد.", + severity: "success", + }); + } else { + setNotFound(true); + formik.setFieldValue("nationalId", nationalCode); + openNotif({ + vertical: "top", + horizontal: "center", + msg: "اطلاعات حقوقی برای این شناسه یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید.", + severity: "warning", + }); + } + return; + } else { + const personResponse = await dispatch( + provinceGetNationalDocumentsService({ + info: nationalCode, + type: "person", + }) + ); + + if (personResponse.payload?.error) { + openNotif({ + vertical: "top", + horizontal: "center", + msg: personResponse.payload.error, + severity: "error", + }); + } 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: "اطلاعاتی برای این کد ملی یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید.", + 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, + }; + setUserData(aggregatedUserData); + handleSetFormDataFromUserDataForStewardAddBuyer( + aggregatedUserData, + formik + ); + + openNotif({ + vertical: "top", + horizontal: "center", + msg: "اطلاعات با موفقیت دریافت شد.", + severity: "success", + }); + } + } finally { + setInquiryInProgress(false); + } + }; + + useEffect(() => { + if (notFound) { + formik.setFieldValue("mobile", formik2.values.mobile); + } + }, [notFound]); + + return ( + + + {"استعلام "} + {!isRealPerson ? "شناسه ملی حقوقی" : "کد ملی"} + + + + + + + + + ); +}; + +export const SlaughterAddBuyerForm = ({ + formik, + provinceData, + cityData, + notFound, + isRealPerson, +}) => { + return ( + + + + + + + + ({ 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} + + )} + + ({ id: i.name, label: i.name })) : [] + } + isOptionEqualToValue={(option, value) => option.id === value.id} + onChange={(e, value) => { + formik.setFieldValue("city", value ? value.id : ""); + }} + value={ + formik.values.city + ? { + id: formik.values.city, + label: formik.values.city, + } + : null + } + renderInput={(params) => ( + + )} + /> + + {!notFound && ( + + شهر: {formik.values.city} + + )} + + ); +}; diff --git a/src/features/steward/components/steward-add-buyer/InquiryForStewardAddBuyer.js b/src/features/steward/components/steward-add-buyer/InquiryForStewardAddBuyer.js new file mode 100644 index 0000000..b404310 --- /dev/null +++ b/src/features/steward/components/steward-add-buyer/InquiryForStewardAddBuyer.js @@ -0,0 +1,365 @@ +import { Autocomplete, IconButton, TextField, Typography } from "@mui/material"; +import { Grid } from "../../../../components/grid/Grid"; +import { useFormik } from "formik"; +import { Yup } from "../../../../lib/yup/yup"; +import { SPACING } from "../../../../data/spacing"; +import { useDispatch, useSelector } from "react-redux"; +import { LOADING_END } from "../../../../lib/redux/slices/appSlice"; +import { + stewardSellOutGetBuyers, + stewatdSubmitBuyerDataService, +} from "../../../guild/services/steward-sell-out-get-buyers"; +import { useContext, useEffect } from "react"; +import { AppContext } from "../../../../contexts/AppContext"; +import SearchIcon from "@mui/icons-material/Search"; +import { slaughterEditBuyerDataService } from "../../../slaughter-house/services/slaughter-house-submit-buyer"; + +export const validationSchemaForStewardAddBuyer = 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("لطفا فیلد را به درستی وارد کنید!"), +}); + +export const handleSubmitForStewardAddBuyer = ( + formik, + dispatch, + isEdit, + tableData, + updateTable, + openNotif, + DRAWER, + role +) => { + if (isEdit) { + dispatch( + slaughterEditBuyerDataService({ + buyer_key: tableData?.key, + mobile: formik.values.mobile, + first_name: formik.values.firstName, + last_name: formik.values.lastName, + unit_name: formik.values.unit_name, + city: formik.values.city, + province: formik.values.province, + }) + ).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 { + dispatch( + stewatdSubmitBuyerDataService({ + role: role, + mobile: formik.values.mobile, + first_name: formik.values.firstName, + last_name: formik.values.lastName, + unit_name: formik.values.unit_name, + city: formik.values.city, + province: formik.values.province, + }) + ).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", + }); + } + }); + } +}; + +export const handleSetFormDataFromTableDataForStewardAddBuyer = ( + tableData, + formik +) => { + formik.setValues({ + mobile: tableData.mobile || "", + firstName: tableData.firstName || "", + lastName: tableData.lastName || "", + unit_name: tableData.unitName || "", + province: tableData.province || "", + city: tableData.city || "", + }); + setTimeout(() => { + formik.validateForm(); + }, 1); +}; + +export const handleSetFormDataFromUserDataForStewardAddBuyer = ( + userData, + formik +) => { + const user = userData?.[0]; + if (user) { + console.log(user); + formik.setValues({ + mobile: user.mobile || "", + firstName: user.firstName || "", + lastName: user.lastName || "", + unit_name: user.unitName || "", + province: user.province || "", + city: user.city || "", + }); + setTimeout(() => { + formik.validateForm(); + }, 1); + } +}; + +export const InquiryForStewardAddBuyer = ({ + notFound, + setNotFound, + setUserData, + formik, +}) => { + const [openNotif] = useContext(AppContext); + const selectedSubUser = useSelector( + (state) => state.userSlice.selectedSubUser + ); + const dispatch = useDispatch(); + const formik2 = useFormik({ + initialValues: { + mobile: "", + }, + validationSchema: Yup.object({ + mobile: Yup.string() + .required("این فیلد اجباری است!") + .min(11, "شماره موبایل باید 11 رقم باشد") + .max(11, "شماره موبایل باید 11 رقم باشد") + .matches(/^09\d{9}$/, "شماره موبایل باید با 09 شروع شود و 11 رقم باشد"), + }), + validateOnMount: true, + }); + + const handleInquiry = () => { + dispatch( + stewardSellOutGetBuyers({ + mobile: formik2.values.mobile, + role_key: selectedSubUser?.key || "", + }) + ).then((r) => { + dispatch(LOADING_END()); + if (r.error) { + setNotFound(true); + openNotif({ + vertical: "top", + horizontal: "center", + msg: "خریدار یافت نشد، یک خریدار جدید ثبت کنید!", + severity: "error", + }); + } else { + const responseData = r.payload?.data; + // Check if response is an empty array + if (Array.isArray(responseData) && responseData.length === 0) { + setNotFound(true); + setUserData(null); + } else { + setNotFound(false); + handleSetFormDataFromUserDataForStewardAddBuyer(responseData, formik); + setUserData(responseData); + } + } + }); + }; + + useEffect(() => { + if (notFound) { + formik.setFieldValue("mobile", formik2.values.mobile); + } + }, [notFound]); + + return ( + + جستجو کاربر + + { + formik2.handleChange(e); + // Reset notFound when user starts typing + if (notFound) { + setNotFound(false); + } + }} + onBlur={formik2.handleBlur} + helperText={formik2.touched.mobile && formik2.errors.mobile} + /> + + + + + {notFound && ( + + + خریداری یافت نشد + + + )} + + ); +}; + +export const StewardAddBuyerForm = ({ + formik, + provinceData, + cityData, + notFound, +}) => { + return ( + + + + + + {provinceData.length > 0 && ( + ({ id: i.name, label: i.name })) + : [] + } + onChange={(e, value) => { + formik.setFieldValue("province", value ? value.id : ""); + formik.setFieldValue("city", ""); + }} + renderInput={(params) => ( + + )} + value={ + provinceData.find((i) => i.name === formik.values.province)?.name + } + /> + )} + {!notFound && ( + + استان: {formik.values.province} + + )} + {cityData.length > 0 && ( + ({ id: i.name, label: i.name })) : [] + } + onChange={(e, value) => { + formik.setFieldValue("city", value ? value.id : ""); + }} + renderInput={(params) => ( + + )} + value={cityData.find((i) => i.name === formik.values.city)?.name} + /> + )} + + {!notFound && ( + + شهر: {formik.values.city} + + )} + + ); +}; diff --git a/src/features/steward/components/steward-add-buyer/StewardAddBuyer.js b/src/features/steward/components/steward-add-buyer/StewardAddBuyer.js new file mode 100644 index 0000000..b539d67 --- /dev/null +++ b/src/features/steward/components/steward-add-buyer/StewardAddBuyer.js @@ -0,0 +1,244 @@ +import React, { useContext, useEffect, useState } from "react"; +import { Grid } from "../../../../components/grid/Grid"; +import { Button } from "@mui/material"; +import { Yup } from "../../../../lib/yup/yup"; +import { AppContext } from "../../../../contexts/AppContext"; +import { useDispatch, useSelector } from "react-redux"; +import { DRAWER } from "../../../../lib/redux/slices/appSlice"; +import { getRoleFromUrl } from "../../../../utils/getRoleFromUrl"; +import { useLocation } from "react-router-dom"; +import { + ROUTE_SLAUGHTER_INVENTORY_SELL_CARCASS_OUT_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_TRUE, + ROUTE_STEWARD_SALE_OUT_PROVINCE, +} from "../../../../routes/routes"; +import { + handleSetFormDataFromTableDataForStewardAddBuyer, + handleSubmitForStewardAddBuyer, + InquiryForStewardAddBuyer, + StewardAddBuyerForm, + validationSchemaForStewardAddBuyer, +} from "./InquiryForStewardAddBuyer"; +import { useAddBuyer } from "./hooks/useAddBuyer"; +import { slaughterGetCitiesService } from "../../../slaughter-house/services/slaughter-get-provinces"; +import { + handleSetFormDataFromTableDataForSlaughterAddBuyer, + handleSubmitForSlaughterAddBuyer, + InquiryForSlaughterAddBuyer, + SlaughterAddBuyerForm, + validationSchemaForSlaughterAddBuyer, +} from "./InquiryForSlaughterAddBuyer"; +import { useFormik } from "formik"; + +// userType enums = steward | steward_true | steward_legal | _true | _legal + +const getCurrentPage = (role, pathname) => { + if (role === "Steward") { + if (pathname === ROUTE_STEWARD_SALE_OUT_PROVINCE) { + return "steward_add_buyer"; + } + } + if (role === "KillHouse") { + if (pathname === ROUTE_SLAUGHTER_INVENTORY_SELL_CARCASS_OUT_PROVINCE) { + return "slaughter_add_buyer"; + } + if (pathname === ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_TRUE) { + return "slaughter_manage_add_buyer"; + } + } +}; + +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") { + initialValues.nationalId = ""; + return initialValues; + } + return initialValues; +}; + +export const StewardAddBuyer = ({ + updateTable, + isEdit = false, + data, + isRealPerson, + buyerType = "", + // buyerYype => "Guilds" | "Steward" +}) => { + const { + killHouses, + setKillhouses, + stewards, + setStewards, + provinceData, + cityData, + setCityData, + userData, + setUserData, + } = useAddBuyer(); + const role = getRoleFromUrl(); + const { pathname } = useLocation(); + 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_MANAGE_STEWARDS = userType === "steward"; + // const IS_ADMINX = role === "AdminX"; + // const IS_OUT_PROVINCE = pathname.includes("out-province"); + // const { inspectorGetKillHouses } = useSelector( + // (state) => state.inspectorSlice + // ); + 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) + : Yup.object({}), + }); + + useEffect(() => { + formik.validateForm(); + }, []); + + useEffect(() => { + if (isEdit) { + if (IS_STEWARD_ADD_BUYER) { + handleSetFormDataFromTableDataForStewardAddBuyer(data, formik); + } + if (IS_SLAUGHTER_ADD_BUYER || IS_SLAUGHTER_MANAGE_ADD_BUYER) { + handleSetFormDataFromTableDataForSlaughterAddBuyer(data, formik); + } + } + }, [isEdit]); + + useEffect(() => { + if (formik.values.province) { + setCityData( + [], + dispatch(slaughterGetCitiesService(formik.values.province)).then( + (r) => { + setCityData(r.payload.data); + } + ) + ); + } + }, [formik.values.province]); + + return ( + + {!isEdit ? ( + IS_STEWARD_ADD_BUYER ? ( + + ) : IS_SLAUGHTER_ADD_BUYER || IS_SLAUGHTER_MANAGE_ADD_BUYER ? ( + + ) : null + ) : null} + {userData || notFound || isEdit ? ( + IS_STEWARD_ADD_BUYER ? ( + + ) : IS_SLAUGHTER_ADD_BUYER || IS_SLAUGHTER_MANAGE_ADD_BUYER ? ( + + ) : null + ) : null} + {(userData || notFound || isEdit) && ( + + + + )} + + ); +}; diff --git a/src/features/steward/components/steward-add-buyer/hooks/useAddBuyer.js b/src/features/steward/components/steward-add-buyer/hooks/useAddBuyer.js new file mode 100644 index 0000000..41cecb0 --- /dev/null +++ b/src/features/steward/components/steward-add-buyer/hooks/useAddBuyer.js @@ -0,0 +1,30 @@ +import { useEffect, useState } from "react"; +import { useDispatch } from "react-redux"; +import { slaughterGetProvinceService } from "../../../../slaughter-house/services/slaughter-get-provinces"; + +export const useAddBuyer = () => { + const dispatch = useDispatch(); + const [killHouses, setKillhouses] = useState([]); + const [stewards, setStewards] = useState([]); + const [userData, setUserData] = useState(null); + const [provinceData, setProvinceData] = useState([]); + const [cityData, setCityData] = useState([]); + + useEffect(() => { + dispatch(slaughterGetProvinceService()).then((r) => { + setProvinceData(r.payload.data); + }); + }, []); + + return { + killHouses, + setKillhouses, + stewards, + setStewards, + userData, + setUserData, + provinceData, + cityData, + setCityData, + }; +}; diff --git a/src/features/steward/components/steward-sell-out-of-province-buyers/StewardSellOutOfProvinceBuyers.js b/src/features/steward/components/steward-sell-out-of-province-buyers/StewardSellOutOfProvinceBuyers.js index 6b06167..bacbca5 100644 --- a/src/features/steward/components/steward-sell-out-of-province-buyers/StewardSellOutOfProvinceBuyers.js +++ b/src/features/steward/components/steward-sell-out-of-province-buyers/StewardSellOutOfProvinceBuyers.js @@ -13,9 +13,8 @@ import { import { getRoleFromUrl } from "../../../../utils/getRoleFromUrl"; import { Grid } from "../../../../components/grid/Grid"; import ResponsiveTable from "../../../../components/responsive-table/ResponsiveTable"; -import { StewardSellOutOfProvinceAddBuyer } from "../steward-purchase-out-province-add-buyer/StewardSellOutOfProvinceAddBuyer"; -import { StewardSellOutOfProvinceBuyersEditBuyer } from "../steward-sell-out-of-province-buyers-edit-buyer/StewardSellOutOfProvinceBuyersEditBuyer"; import { checkPathStartsWith } from "../../../../utils/checkPathStartsWith"; +import { StewardAddBuyer } from "../steward-add-buyer/StewardAddBuyer"; export const StewardSellOutOfProvinceBuyers = () => { const handleTextChange = (event) => { @@ -82,7 +81,7 @@ export const StewardSellOutOfProvinceBuyers = () => { right: !(window.innerWidth <= 600), bottom: window.innerWidth <= 600, content: ( - { DRAWER({ right: !(window.innerWidth <= 600), bottom: window.innerWidth <= 600, - content: ( - - ), + content: , title: "افزودن خریدار", }) ); diff --git a/src/pages/Guilds.js b/src/pages/Guilds.js index 93f7098..4f7e0f3 100644 --- a/src/pages/Guilds.js +++ b/src/pages/Guilds.js @@ -57,6 +57,13 @@ import { ROUTE_ADMINX_ROUTE_OUT_PROVINCE_LEGAL_GUILDS, ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_LEGAL_GUILDS, ROUTE_SLAUGHTER_ROUTE_MANAGE_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_GUILDS_REQUESTS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_TRUE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_TRUE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_LEGAL, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_LEGAL, } from "../routes/routes"; import { BackButton } from "../components/back-button/BackButton"; import { GuildsOperations } from "../features/province/components/guilds-operations/GuildsOperations"; @@ -71,6 +78,7 @@ import { ManageGuildDistributions } from "../features/province/components/manage import { ProvinceTrueGuildsOutProvince } from "../features/province/components/province-true-guilds-out-province/ProvinceTrueGuildsOutProvince"; import { ProvinceLegalGuildsInProvince } from "../features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsInProvince"; import { ProvinceLegalGuildsOutProvince } from "../features/province/components/province-legal-guilds-out-province/ProvinceLegalGuildsOutProvince"; +import { ManageGuilds } from "../features/province/components/manage-guilds/ManageGuilds"; const MANAGE_ROUTES = [ ROUTE_PROVINCE_ROUTE_MANAGE_GUILDS, @@ -88,6 +96,8 @@ const MANAGE_ROUTES = [ ROUTE_SUPER_ADMIN_ROUTE_OUT_PROVINCE_GUILDS, ROUTE_ADMINX_ROUTE_OUT_PROVINCE_GUILDS, ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE, ]; const GUILDS_OPERATIONS_ROUTES = [ @@ -101,6 +111,8 @@ const GUILDS_OPERATIONS_ROUTES = [ ROUTE_SUPER_ADMIN_ROUTE_OUT_PROVINCE_GUILDS, ROUTE_ADMINX_ROUTE_OUT_PROVINCE_GUILDS, ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE, ]; const GUILDS_OPERATIONS_COMMERCE_ROUTES = [ @@ -151,6 +163,7 @@ const GUILDS_REQUESTS_ROUTES = [ ROUTE_SUPER_ADMIN_ROUTE_IN_PROVINCE_GUILDS_REQUESTS, ROUTE_ADMINX_ROUTE_IN_PROVINCE_GUILDS_REQUESTS, ROUTE_GUILD_ROOM_ROUTE_GUILDS_REQUESTS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_GUILDS_REQUESTS, ]; const GUILDS_DISTRIBUTIONS_ROUTES = [ @@ -162,18 +175,21 @@ const TRUE_GUILDS_OUT_PROVINCE_ROUTES = [ ROUTE_SUPER_ADMIN_ROUTE_OUT_PROVINCE_TRUE_GUILDS, ROUTE_ADMINX_ROUTE_OUT_PROVINCE_TRUE_GUILDS, ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_TRUE_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_TRUE, ]; const LEGAL_GUILDS_IN_PROVINCE_ROUTES = [ ROUTE_SUPER_ADMIN_ROUTE_IN_PROVINCE_LEGAL_GUILDS, ROUTE_ADMINX_ROUTE_IN_PROVINCE_LEGAL_GUILDS, ROUTE_PROVINCE_ROUTE_IN_PROVINCE_LEGAL_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_LEGAL, ]; const LEGAL_GUILDS_OUT_PROVINCE_ROUTES = [ ROUTE_SUPER_ADMIN_ROUTE_OUT_PROVINCE_LEGAL_GUILDS, ROUTE_ADMINX_ROUTE_OUT_PROVINCE_LEGAL_GUILDS, ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_LEGAL_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_LEGAL, ]; const isPathnameIn = (pathname, routes) => routes.includes(pathname); @@ -233,15 +249,19 @@ const Guilds = () => { )} {isPathnameIn(pathname, TRUE_GUILDS_OUT_PROVINCE_ROUTES) && ( - + + )} + + {pathname === ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_TRUE && ( + )} {isPathnameIn(pathname, LEGAL_GUILDS_IN_PROVINCE_ROUTES) && ( - + )} {isPathnameIn(pathname, LEGAL_GUILDS_OUT_PROVINCE_ROUTES) && ( - + )} diff --git a/src/routes/managerRouting.js b/src/routes/managerRouting.js index d893aef..248be5a 100644 --- a/src/routes/managerRouting.js +++ b/src/routes/managerRouting.js @@ -446,6 +446,7 @@ const consolidatedRouting = [ ROUTES.ROUTE_SUPER_ADMIN_ROUTE_OUT_PROVINCE_LEGAL_GUILDS, ROUTES.ROUTE_ADMINX_ROUTE_OUT_PROVINCE_LEGAL_GUILDS, ROUTES.ROUTE_PROVINCE_ROUTE_OUT_PROVINCE_LEGAL_GUILDS, + ROUTES.ROUTE_SLAUGHTER_ROUTE_MANAGE_GUILDS, ], Page: Guilds, exact: false, diff --git a/src/routes/slaughterRouting.js b/src/routes/slaughterRouting.js index f8e931a..6cf83c6 100644 --- a/src/routes/slaughterRouting.js +++ b/src/routes/slaughterRouting.js @@ -65,6 +65,13 @@ import { ROUTE_SLAUGHTER_MANAGE_STEWARDS_OUT_PROVINCE, ROUTE_SLAUGHTER_MANAGE_STEWARDS_OUT_PROVINCE_TRUE, ROUTE_SLAUGHTER_MANAGE_STEWARDS_OUT_PROVINCE_LEGAL, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_GUILDS_REQUESTS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_TRUE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_LEGAL, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_TRUE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_LEGAL, } from "./routes"; const TradePanel = lazy(() => lazyRetry(() => import("../pages/TradePanel"))); @@ -266,7 +273,16 @@ export const slaughterRouting = [ props: {}, }, { - path: [ROUTE_SLAUGHTER_ROUTE_MANAGE_GUILDS], + path: [ + ROUTE_SLAUGHTER_ROUTE_MANAGE_GUILDS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_GUILDS_REQUESTS, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_TRUE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_IN_PROVINCE_LEGAL, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_TRUE, + ROUTE_SLAUGHTER_MANAGE_GUILDS_OUT_PROVINCE_LEGAL, + ], Page: Guilds, exact: false, props: {},