Fix: fill create guilds form and submit data structure
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 : "");
|
||||
|
||||
@@ -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 ||
|
||||
"-"
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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, "/");
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
]
|
||||
: []
|
||||
: [],
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -43,7 +43,7 @@ export const StewardStock = () => {
|
||||
|
||||
useEffect(() => {
|
||||
handleUpdate();
|
||||
}, [dispatch]);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<Grid container xs={12} justifyContent="end" alignItems="center">
|
||||
|
||||
Reference in New Issue
Block a user