Fix: fill create guilds form and submit data structure

This commit is contained in:
2026-02-03 10:25:51 +03:30
parent 199ffa7163
commit ec88696465
8 changed files with 188 additions and 259 deletions

View File

@@ -8,7 +8,7 @@ import {
Dialog,
DialogTitle,
DialogContent,
DialogActions
DialogActions,
} from "@mui/material";
import { Add as AddIcon } from "@mui/icons-material";
import { Grid } from "../../../../components/grid/Grid";
@@ -22,10 +22,6 @@ import { provinceGetFieldOfWorks } from "../../services/ProvinceGetFieldOfWorks"
import { provinceGetTypeActivity } from "../../services/provinceGetTypeActivity";
import { provinceGetRegisterCodeStateService } from "../../services/province-get-register-code-state";
import { mainGetGuildsForUpdateOrCreateService } from "../../services/main-get-guilds-for-update-or-create";
import {
slaughterGetProvinceService,
slaughterGetCitiesService
} from "../../../slaughter-house/services/slaughter-get-provinces";
import { getRoleFromUrl } from "../../../../utils/getRoleFromUrl";
import { PersonalInfoSection } from "./components/PersonalInfoSection";
import { InquiryForm } from "./components/InquiryForm";
@@ -36,7 +32,7 @@ import { GuildInfoAccordionItem } from "./components/GuildInfoAccordionItem";
import { getValidationSchema, getInitialValues } from "./utils/formUtils";
import {
mapResponseDataToFormFields,
prepareSubmitData
prepareSubmitData,
} from "./utils/dataMapping";
import { handleSubmitSuccess, handleSubmitError } from "./utils/submitHandlers";
@@ -91,8 +87,6 @@ export const CreateGuilds = ({ guild, updateTable }) => {
return [];
});
const [cities, setCities] = useState([]);
const [provinces, setProvinces] = useState([]);
const [provinceCities, setProvinceCities] = useState([]);
const [typeActivities, setTypeActivities] = useState([]);
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [deleteDialogIndex, setDeleteDialogIndex] = useState(null);
@@ -119,11 +113,14 @@ export const CreateGuilds = ({ guild, updateTable }) => {
gender: values?.gender,
first_name: values?.first_name,
last_name: values?.last_name,
national_code: values?.last_name,
national_code: values?.national_code,
is_alive: values?.is_alive,
birth_date: values?.birth_date,
father_name: values?.father_name,
mobile: values?.mobile
mobile: values?.mobile,
// Personal info city: always use current selection (guild section has city_name only)
person_city: values?.person_city,
city: values?.city,
};
return prepareSubmitData(
combinedValues,
@@ -137,18 +134,31 @@ export const CreateGuilds = ({ guild, updateTable }) => {
(result) => {
if (result.payload.error) {
handleSubmitError(openNotif, result.payload.error);
} else {
handleSubmitSuccess(
dispatch,
openNotif,
updateTable,
values,
result.payload?.data
);
return;
}
const data = result.payload?.data;
const hasPayloadErrors =
data?.error_count > 0 || (data?.errors?.length ?? 0) > 0;
if (hasPayloadErrors && data?.errors?.length > 0) {
const firstError = data.errors[0];
const message =
typeof firstError === "string"
? firstError
: firstError?.result || firstError?.message || "خطا در ثبت";
handleSubmitError(openNotif, message);
return;
}
handleSubmitSuccess(
dispatch,
openNotif,
updateTable,
values,
data
);
}
);
}
},
});
useEffect(() => {
@@ -166,12 +176,6 @@ export const CreateGuilds = ({ guild, updateTable }) => {
dispatch(provinceGetTypeActivity()).then((r) => {
setTypeActivities(r.payload.data || []);
});
// Fetch provinces for province/city selection
dispatch(slaughterGetProvinceService()).then((r) => {
if (r?.payload?.data) {
setProvinces(r.payload.data);
}
});
}, []);
useEffect(() => {
@@ -180,13 +184,13 @@ export const CreateGuilds = ({ guild, updateTable }) => {
const guildsForFormik = guildsList.map((guildItem) => {
const combinedGuild = {
...guildItem,
user: guild?.user || {}
user: guild?.user || {},
};
const initialValues = getInitialValues(combinedGuild);
return {
steward: initialValues.steward || false,
guild: initialValues.guild || false,
license_number: initialValues.license_number ?? ""
license_number: initialValues.license_number ?? "",
};
});
formik.setFieldValue("guilds", guildsForFormik, false).then(() => {
@@ -196,51 +200,18 @@ export const CreateGuilds = ({ guild, updateTable }) => {
formik.validateForm();
}, []);
// Set province ID from state name when provinces are loaded
// Set city key from person_city name when cities are loaded (e.g. from DB/edit)
useEffect(() => {
if (
formik.values.state &&
provinces.length > 0 &&
!formik.values.province
) {
const province = provinces.find((p) => p.name === formik.values.state);
if (province) {
formik.setFieldValue("province", province.key);
}
}
}, [provinces, formik.values.state, formik.values.province]);
// Fetch cities when province is selected (slaughter API uses province name)
useEffect(() => {
if (formik.values.province) {
const provinceName =
provinces.find((p) => p.key === formik.values.province)?.name ||
formik.values.province;
dispatch(slaughterGetCitiesService(provinceName)).then((r) => {
if (r?.payload?.data) {
setProvinceCities(r.payload.data);
}
});
} else {
setProvinceCities([]);
}
}, [formik.values.province, provinces, dispatch]);
// Set city ID from person_city name when provinceCities are loaded
useEffect(() => {
if (
formik.values.person_city &&
!formik.values.city &&
provinceCities.length > 0
) {
const city = provinceCities.find(
(c) => c.name === formik.values.person_city
if (formik.values.person_city && !formik.values.city && cities.length > 0) {
const city = cities.find(
(c) =>
(c.name || "").trim() === (formik.values.person_city || "").trim()
);
if (city) {
formik.setFieldValue("city", city.key);
formik.setFieldValue("city", city.key ?? city.id ?? "");
}
}
}, [provinceCities, formik.values.person_city, formik.values.city]);
}, [cities, formik.values.person_city, formik.values.city]);
const mapResponseToFormFields = useCallback(
(responseData) => {
@@ -267,7 +238,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
const initialGuildValues = guildsData.map((guildItem) => {
const combinedGuild = {
...guildItem,
user: responseData.user || {}
user: responseData.user || {},
};
return getInitialValues(combinedGuild);
});
@@ -277,7 +248,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
const guildsForFormik = initialGuildValues.map((g) => ({
steward: g.steward ?? false,
guild: g.guild ?? false,
license_number: g.license_number ?? ""
license_number: g.license_number ?? "",
}));
formik.setFieldValue("guilds", guildsForFormik, true).then(() => {
formik.validateField("guilds");
@@ -307,7 +278,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
vertical: "top",
horizontal: "center",
msg: "لطفا کد ملی را وارد کنید",
severity: "error"
severity: "error",
});
return;
}
@@ -317,7 +288,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
vertical: "top",
horizontal: "center",
msg: "لطفا کد ملی 10 رقمی معتبر وارد کنید",
severity: "error"
severity: "error",
});
return;
}
@@ -325,7 +296,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
dispatch(
mainGetGuildsForUpdateOrCreateService({
national_code: inquiryNationalCode,
update: false
update: false,
})
).then((r) => {
if (r.payload.error) {
@@ -338,7 +309,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
vertical: "top",
horizontal: "center",
msg: r.payload.error,
severity: "error"
severity: "error",
});
if (!isAdmin) {
return;
@@ -362,7 +333,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
vertical: "top",
horizontal: "center",
msg: successMsg,
severity: "success"
severity: "success",
});
} else {
setHasInquiry(false);
@@ -378,7 +349,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
openNotif,
mapResponseToFormFields,
isAdmin,
formik
formik,
]);
const handleUpdateFromExternal = useCallback(() => {
@@ -387,7 +358,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
vertical: "top",
horizontal: "center",
msg: "لطفا کد ملی 10 رقمی معتبر وارد کنید",
severity: "error"
severity: "error",
});
return;
}
@@ -395,7 +366,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
dispatch(
mainGetGuildsForUpdateOrCreateService({
national_code: formik.values.national_id,
update: true
update: true,
})
).then((r) => {
if (r.payload.error) {
@@ -404,7 +375,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
vertical: "top",
horizontal: "center",
msg: r.payload.error,
severity: "error"
severity: "error",
});
return;
}
@@ -412,7 +383,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
if (r.payload.data) {
const updateResponse = {
...r.payload.data,
dbRegister: false
dbRegister: false,
};
mapResponseToFormFields(updateResponse);
setHasInquiry(true);
@@ -421,7 +392,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
vertical: "top",
horizontal: "center",
msg: "اطلاعات از سامانه خارجی بروزرسانی شد",
severity: "success"
severity: "success",
});
} else {
setHasInquiry(false);
@@ -497,14 +468,14 @@ export const CreateGuilds = ({ guild, updateTable }) => {
vertical: "top",
horizontal: "center",
msg: r.payload.error,
severity: "error"
severity: "error",
});
} else {
openNotif({
vertical: "top",
horizontal: "center",
msg: "صنف با موفقیت حذف شد",
severity: "success"
severity: "success",
});
// Remove from list after successful deletion
if (guildsList.length > 1) {
@@ -556,7 +527,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
}
newValues[index] = {
...newValues[index],
[fieldName]: value
[fieldName]: value,
};
return newValues;
});
@@ -574,7 +545,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
}
updatedGuilds[index] = {
...updatedGuilds[index],
[fieldName]: value
[fieldName]: value,
};
formik.setFieldValue("guilds", updatedGuilds, true).then(() => {
formik.validateField("guilds");
@@ -615,8 +586,8 @@ export const CreateGuilds = ({ guild, updateTable }) => {
: {
xs: "96vw",
md: "90vw",
nlg: "1280px"
}
nlg: "1280px",
},
}}
>
{shouldShowUpdateButton && (
@@ -645,9 +616,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
isAdmin={isAdmin}
isSuperAdmin={isSuperAdmin}
isKillHouse={isKillHouse}
provinces={provinces}
provinceCities={provinceCities}
guildsList={guildsList}
cities={cities}
/>
<Grid
@@ -673,9 +642,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
guildActive={guildActive}
isAdmin={isAdmin}
isSuperAdmin={isSuperAdmin}
cities={
provinceCities.length > 0 ? provinceCities : cities
}
cities={cities}
typeActivities={typeActivities}
onDelete={() => handleDeleteGuild(index)}
canDelete={
@@ -734,7 +701,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
formData={guildsList.map((guildItem, index) => {
const guildValues = guildsFormValues[index];
const combinedValues = {
...guildValues // Guild-specific info (overrides if same keys exist)
...guildValues, // Guild-specific info (overrides if same keys exist)
};
return prepareSubmitData(
combinedValues,

View File

@@ -161,25 +161,30 @@ export const GuildInfoSection = ({
options={
cities
? cities.map((i) => ({
id: i.key,
id: i.id ?? i.key,
label: i.name,
}))
: []
}
value={
cities.find((c) => c.name === formik.values.city_name)
? {
id: cities.find(
(c) => c.name === formik.values.city_name
)?.key,
label: formik.values.city_name,
}
: formik.values.city_name
? {
id: null,
label: formik.values.city_name,
}
: null
value={(() => {
const c = cities?.find(
(c) => c.name === formik.values.city_name
);
if (c)
return {
id: c.id ?? c.key,
label: formik.values.city_name,
};
if (formik.values.city_name)
return {
id: null,
label: formik.values.city_name,
};
return null;
})()}
isOptionEqualToValue={(a, b) =>
a?.id === b?.id || a?.label === b?.label
}
onChange={(e, value) => {
formik.setFieldValue("city_name", value ? value.label : "");

View File

@@ -17,7 +17,6 @@ import CakeIcon from "@mui/icons-material/Cake";
import FaceIcon from "@mui/icons-material/Face";
import LocationCityIcon from "@mui/icons-material/LocationCity";
import FavoriteIcon from "@mui/icons-material/Favorite";
import PublicIcon from "@mui/icons-material/Public";
import { Grid } from "../../../../../components/grid/Grid";
import { SPACING } from "../../../../../data/spacing";
import { LabelField } from "../../../../../components/label-field/LabelField";
@@ -35,8 +34,7 @@ export const PersonalInfoSection = ({
isAdmin,
isSuperAdmin,
isKillHouse,
provinces = [],
provinceCities = [],
cities = [],
}) => {
const getGenderDisplay = (gender) => {
if (gender === "True" || gender === true) return GENDER_VALUES.MALE;
@@ -307,55 +305,6 @@ export const PersonalInfoSection = ({
/>
)}
</Grid>
<Grid item xs={12}>
{isAdmin ? (
<Autocomplete
size="small"
style={{ width: "100%" }}
disablePortal
id="province"
options={
provinces
? provinces.map((i) => ({
id: i.key,
label: i.name,
}))
: []
}
value={
provinces.find((p) => p.key === formik.values.province)
? {
id: formik.values.province,
label:
provinces.find(
(p) => p.key === formik.values.province
)?.name || "",
}
: null
}
onChange={(e, value) => {
formik.setFieldValue("province", value ? value.id : "");
formik.setFieldValue("city", "");
formik.setFieldValue("person_city", "");
}}
disabled={guild}
renderInput={(params) => (
<TextField {...params} label="استان" />
)}
/>
) : (
<InfoBox
icon={PublicIcon}
label="استان"
value={
provinces.find((p) => p.key === formik.values.province)
?.name ||
formik.values.state ||
"-"
}
/>
)}
</Grid>
<Grid item xs={12}>
{isAdmin ? (
<Autocomplete
@@ -363,31 +312,31 @@ export const PersonalInfoSection = ({
style={{ width: "100%" }}
disablePortal
id="city"
disabled={!formik.values.province}
options={
provinceCities
? provinceCities.map((i) => ({
id: i.key,
cities
? cities.map((i) => ({
id: i.key ?? i.id,
label: i.name,
}))
: []
}
value={
provinceCities.find((c) => c.key === formik.values.city)
? {
id: formik.values.city,
label:
provinceCities.find(
(c) => c.key === formik.values.city
)?.name || "",
}
: formik.values.person_city
? {
id: null,
label: formik.values.person_city,
}
: null
}
value={(() => {
const c = cities.find(
(c) => (c.key ?? c.id) === formik.values.city
);
if (c)
return {
id: c.key ?? c.id,
label: c.name,
};
if (formik.values.person_city)
return {
id: null,
label: formik.values.person_city,
};
return null;
})()}
isOptionEqualToValue={(a, b) => a?.id === b?.id}
onChange={(e, value) => {
formik.setFieldValue("city", value ? value.id : "");
formik.setFieldValue(
@@ -404,7 +353,7 @@ export const PersonalInfoSection = ({
icon={LocationCityIcon}
label="شهر"
value={
provinceCities.find((c) => c.key === formik.values.city)
cities.find((c) => (c.key ?? c.id) === formik.values.city)
?.name ||
formik.values.person_city ||
"-"

View File

@@ -1,34 +1,8 @@
/**
* Data Mapping Utilities for Create Guilds Form
*
* This module handles mapping data from three different sources:
*
* 1. EDIT MODE: Guild data passed directly as prop when editing existing guild
* - Handled by: getInitialValues() in formUtils.js
* - Data structure: guild object with nested user and address objects
*
* 2. DATABASE INQUIRY: Inquiry by national code returns data from our database
* - Handled by: extractFormFieldsFromDatabaseInquiry()
* - Condition: responseData.dbRegister === true
* - Data structure: responseData.user, responseData.guilds[] with nested address
*
* 3. EXTERNAL API INQUIRY: Inquiry by national code returns data from external system
* - Handled by: extractFormFieldsFromExternalApi()
* - Condition: responseData.dbRegister === false
* - Data structure: responseData.user, responseData.guilds[] with layerTwo object
*/
import { getRoleFromUrl } from "../../../../../utils/getRoleFromUrl";
import { normalizeExternalApiDate, normalizeDatabaseDate } from "./dateUtils";
import { formatDateForSubmit } from "./dateUtils";
/**
* Prepares form data for submission to the API
*
* Three data sources can provide the initial data:
* 1. Edit mode: Guild data passed as prop (guild parameter)
* 2. Database inquiry: Inquiry returns data from our database (hasInquiry === false)
* 3. External API inquiry: Inquiry returns data from external system (hasInquiry === true)
*
* @param {Object} values - Form values from Formik
* @param {Object} guild - Guild data when editing existing guild (edit mode)
@@ -58,12 +32,8 @@ export const prepareSubmitData = (
values.birth_date || "",
hasInquiry === true
),
// city is for user info (personal info) - use person_city from personal info
city: values.person_city || values.city || "",
// city_name is for guild info
city: values.person_city || "",
city_name: values.city_name || "",
// province is stored as ID when selected, or as name from state field
province: values.province || "",
address: values.address || "",
postalcode: values.postal_code || "",
licenseNumber: values.license_number || "",
@@ -87,7 +57,7 @@ export const prepareSubmitData = (
title: values.guild_name || "",
role: getRoleFromUrl(),
has_inquiry: hasInquiry !== null ? hasInquiry : false,
...(values.active !== null && { active: values.active })
...(values.active !== null && { active: values.active }),
};
if (guild) {
@@ -101,10 +71,6 @@ export const prepareSubmitData = (
return baseData;
};
/**
* Extracts form field values from database inquiry response
* Data source: Inquiry national code which returns data from our database (dbRegister === true)
*/
const extractFormFieldsFromDatabaseInquiry = (
responseDataFromDb,
inquiryNationalCode
@@ -116,8 +82,6 @@ const extractFormFieldsFromDatabaseInquiry = (
? responseDataFromDb.guilds[0]
: {};
const addressFromDb = firstGuildFromDb?.address || {};
const provinceFromDb = addressFromDb.province || {};
const cityFromDb = addressFromDb.city || {};
return {
// Personal Information Fields
@@ -128,7 +92,9 @@ const extractFormFieldsFromDatabaseInquiry = (
birth_date: normalizeDatabaseDate(userFromDb.birthday || ""),
father_name: userFromDb.fatherName || "",
gender: userFromDb.gender || "",
person_city: userFromDb.city || "",
city: "",
is_alive:
userFromDb.isAlive === false
? "خیر"
@@ -140,9 +106,6 @@ const extractFormFieldsFromDatabaseInquiry = (
// Guild Information Fields
guild_name: firstGuildFromDb.guildsName || "",
area_activity: firstGuildFromDb.areaActivity || "",
state: provinceFromDb.name || "",
province: provinceFromDb.key || "",
city: cityFromDb.key || "",
address: addressFromDb.address || "",
license_expire_date: normalizeDatabaseDate(
firstGuildFromDb.licenseExpireDate || ""
@@ -156,7 +119,13 @@ const extractFormFieldsFromDatabaseInquiry = (
union_name: firstGuildFromDb.unionName || "",
postal_code: addressFromDb.postalCode || "",
phone_number: firstGuildFromDb.phoneNumber || "",
guild_national_id: firstGuildFromDb.nationalCode || "",
// nationalId (شناسه ملی شرکت) comes from guild.company_identifier when dbRegister true
guild_national_id:
firstGuildFromDb.company_identifier ??
firstGuildFromDb.companyIdentifier ??
firstGuildFromDb.nationalCode ??
firstGuildFromDb.nationalId ??
"",
corporation_name: firstGuildFromDb.companyName || "",
// Status Fields (is_foreign_national is at guild level in API response)
@@ -187,14 +156,10 @@ const extractFormFieldsFromDatabaseInquiry = (
// Additional Database Fields
company_name: firstGuildFromDb.companyName || "",
company_identifier: firstGuildFromDb.companyIdentifier || "",
type_activity_name: firstGuildFromDb.typeActivity || ""
type_activity_name: firstGuildFromDb.typeActivity || "",
};
};
/**
* Extracts form field values from external API inquiry response
* Data source: Inquiry national code which doesn't return data from our database (dbRegister === false)
*/
const extractFormFieldsFromExternalApi = (
responseDataFromExternalApi,
inquiryNationalCode
@@ -237,9 +202,7 @@ const extractFormFieldsFromExternalApi = (
// Guild Information Fields
guild_name: firstGuildFromExternalApi.title || "",
area_activity: firstGuildFromExternalApi.isicname || "",
state: firstGuildFromExternalApi.state || "",
province: "", // External API doesn't provide province ID
city: firstGuildFromExternalApi.city || "",
city: "", // User selects from cities list
address: firstGuildFromExternalApi.address || "",
license_expire_date: normalizeExternalApiDate(
firstGuildFromExternalApi.licenseExpireDate || ""
@@ -279,18 +242,10 @@ const extractFormFieldsFromExternalApi = (
guild:
typeof firstGuildFromExternalApi.guild === "boolean"
? firstGuildFromExternalApi.guild
: false
: false,
};
};
/**
* Maps response data to form fields based on data source
*
* Three data sources:
* 1. Edit mode: Guild data passed as prop (handled by getInitialValues in formUtils.js)
* 2. Database inquiry: Inquiry national code which returns data from our database (dbRegister === true)
* 3. External API inquiry: Inquiry national code which doesn't return data from our database (dbRegister === false)
*/
export const mapResponseDataToFormFields = (
responseData,
inquiryNationalCode,

View File

@@ -145,14 +145,61 @@ export const formatDateForSubmitDatabase = (dateString) => {
return normalizedDate.replace(/-/g, "/");
};
export const formatDateForSubmit = (dateString, isExternalApi = false) => {
/**
* Always formats date for submit as Jalali YYYY/MM/DD with English numerals.
* Used for birthDate and licenseExpireDate (and licenseIssueDate) in every scenario.
* Example: "1403/02/26", "1404/06/10"
*/
export const formatDateForSubmit = (dateString) => {
if (!dateString || typeof dateString !== "string") {
return "";
}
if (isExternalApi) {
return formatDateForSubmitExternal(dateString);
} else {
return formatDateForSubmitDatabase(dateString);
const normalized = convertPersianToEnglishNumerals(dateString);
// Already Jalali (YYYY/MM/DD, year < 1500): ensure zero-padded and return
const persianPattern = /^\d{4}\/\d{1,2}\/\d{1,2}$/;
if (persianPattern.test(normalized)) {
const parts = normalized.split("/");
const py = parseInt(parts[0], 10);
const pm = parseInt(parts[1], 10);
const pd = parseInt(parts[2], 10);
if (py < 1500 && !isNaN(py) && !isNaN(pm) && !isNaN(pd)) {
return `${py}/${String(pm).padStart(2, "0")}/${String(pd).padStart(
2,
"0"
)}`;
}
}
// Gregorian YYYY-MM-DD or YYYY/MM/DD: convert to Jalali
const gregorianPattern = /^\d{4}[-/]\d{1,2}[-/]\d{1,2}$/;
if (gregorianPattern.test(normalized)) {
const [y, m, d] = normalized.split(/[-/]/).map((s) => parseInt(s, 10));
if (y > 1500 && !isNaN(y) && !isNaN(m) && !isNaN(d)) {
try {
const gregorianDate = new Date(y, m - 1, d);
const jalaliStr = convertToIranianTime(
gregorianDate.toISOString().split("T")[0]
);
return convertPersianToEnglishNumerals(jalaliStr).replace(/-/g, "/");
} catch (e) {
console.error("Error converting to Jalali:", e);
}
}
}
// Fallback: try parsing as date then convert to Jalali
try {
const date = new Date(normalized.replace(/\//g, "-"));
if (!isNaN(date.getTime())) {
const iso = date.toISOString().split("T")[0];
const jalaliStr = convertToIranianTime(iso);
return convertPersianToEnglishNumerals(jalaliStr).replace(/-/g, "/");
}
} catch (e) {
console.error("Error formatting date for submit:", e);
}
return normalized.replace(/-/g, "/");
};

View File

@@ -20,7 +20,6 @@ export const getValidationSchema = (isEditMode) =>
last_name: yup.string(),
guild_name: yup.string(),
guild_category: yup.string(),
state: yup.string(),
city: yup.string(),
address: yup.string(),
license_expire_date: yup.string(),
@@ -48,14 +47,14 @@ export const getValidationSchema = (isEditMode) =>
license_number: yup.string().required("شماره مجوز الزامی است"),
steward: yup.boolean(),
guild: yup.boolean()
guild: yup.boolean(),
})
.test(
"steward-guild-required",
"برای هر واحد صنفی، حداقل یکی از گزینه‌های مباشر یا صنف باید انتخاب شود",
(value) => value?.steward === true || value?.guild === true
)
)
),
});
/**
@@ -71,7 +70,6 @@ export const getInitialValues = (guildDataForEdit) => {
// Extract user data from edit mode guild object
const userDataFromEdit = guildDataForEdit?.user || {};
const addressDataFromEdit = guildDataForEdit?.address || {};
const provinceDataFromEdit = addressDataFromEdit?.province || {};
const cityDataFromEdit = addressDataFromEdit?.city || {};
return {
@@ -83,15 +81,14 @@ export const getInitialValues = (guildDataForEdit) => {
birth_date: normalizeDatabaseDate(userDataFromEdit.birthday || ""),
father_name: userDataFromEdit.fatherName || "",
gender: userDataFromEdit.gender || "",
person_city: userDataFromEdit.city || "",
person_city: userDataFromEdit.city || cityDataFromEdit?.name || "",
city: cityDataFromEdit?.id ?? cityDataFromEdit?.key ?? "",
is_alive: userDataFromEdit.isAlive || "",
mobile: userDataFromEdit.mobile || "",
// Guild Information Fields (from guild object in edit mode)
guild_name: guildDataForEdit?.guildsName || guildDataForEdit?.name || "",
area_activity: guildDataForEdit?.areaActivity || "",
state: provinceDataFromEdit.name || "",
province: provinceDataFromEdit.key || "",
city_name: cityDataFromEdit.name || "",
address: addressDataFromEdit.address || "",
license_expire_date: normalizeDatabaseDate(
@@ -103,7 +100,13 @@ export const getInitialValues = (guildDataForEdit) => {
postal_code: addressDataFromEdit.postalCode || "",
phone_number: guildDataForEdit?.phoneNumber || "",
license_number: guildDataForEdit?.licenseNumber || "",
guild_national_id: guildDataForEdit?.nationalId || "",
// شناسه ملی شرکت: from company_identifier when dbRegister true
guild_national_id:
guildDataForEdit?.company_identifier ??
guildDataForEdit?.companyIdentifier ??
guildDataForEdit?.nationalCode ??
guildDataForEdit?.nationalId ??
"",
corporation_name: guildDataForEdit?.companyName || "",
license_issue_date: normalizeDatabaseDate(
guildDataForEdit?.licenseIssueDate || ""
@@ -154,9 +157,9 @@ export const getInitialValues = (guildDataForEdit) => {
? guildDataForEdit.guild
: typeof guildDataForEdit?.isGuild === "boolean"
? guildDataForEdit.isGuild
: false
}
: false,
},
]
: []
: [],
};
};

View File

@@ -89,7 +89,10 @@ export const StewardShowAllocations = forwardRef(
const updateTable = () => {
fetchApiData(1);
handleUpdate();
// Do not call handleUpdate() here - parent's handleUpdate already calls
// updateTable() on both instances; calling handleUpdate would cause
// infinite recursion (handleUpdate → updateTable → handleUpdate → …).
// Callers that need the parent bars summary refreshed call handleUpdate explicitly.
};
useImperativeHandle(ref, () => ({
@@ -264,7 +267,7 @@ export const StewardShowAllocations = forwardRef(
useEffect(() => {
fetchApiData(1);
}, [dispatch, selectedDate1, selectedDate2, perPage]);
}, [selectedDate1, selectedDate2, perPage]);
const handleSubmit = async (event) => {
event.preventDefault();

View File

@@ -43,7 +43,7 @@ export const StewardStock = () => {
useEffect(() => {
handleUpdate();
}, [dispatch]);
}, []);
return (
<Grid container xs={12} justifyContent="end" alignItems="center">