push rasad front on new repo
This commit is contained in:
@@ -0,0 +1,232 @@
|
||||
import { getRoleFromUrl } from "../../../../../utils/getRoleFromUrl";
|
||||
import { normalizeExternalApiDate, normalizeDatabaseDate } from "./dateUtils";
|
||||
import { formatDateForSubmit } from "./dateUtils";
|
||||
|
||||
export const prepareSubmitData = (
|
||||
values,
|
||||
guild,
|
||||
originalPhoneNumber,
|
||||
hasInquiry
|
||||
) => {
|
||||
const baseData = {
|
||||
national_id: values.national_id,
|
||||
mobile: values.mobile,
|
||||
mobilenumber: values.mobile,
|
||||
steward: !!values.steward,
|
||||
guild: !!values.guild,
|
||||
active_register_code: !!values.verify_mobile,
|
||||
firstName: values.first_name || "",
|
||||
lastName: values.last_name || "",
|
||||
fatherName: values.father_name || "",
|
||||
gender: values.gender || "",
|
||||
identityNo: values.national_code || "",
|
||||
isLive: values.is_alive === "بلی" || values.is_alive === true,
|
||||
birthDate: formatDateForSubmit(
|
||||
values.birth_date || "",
|
||||
hasInquiry === true
|
||||
),
|
||||
city: values.city || "",
|
||||
address: values.address || "",
|
||||
postalcode: values.postal_code || "",
|
||||
licenseNumber: values.license_number || "",
|
||||
licenseExpireDate: formatDateForSubmit(
|
||||
values.license_expire_date || "",
|
||||
hasInquiry === true
|
||||
),
|
||||
licenseIssueDate: formatDateForSubmit(
|
||||
values.license_issue_date || "",
|
||||
hasInquiry === true
|
||||
),
|
||||
licenseType: values.license_type || "",
|
||||
licenseStatus: values.license_status || "",
|
||||
isicname: values.area_activity || "",
|
||||
corporationName: values.corporation_name || "",
|
||||
nationalId: values.guild_national_id || "",
|
||||
unionName: values.union_name || "",
|
||||
phonenumber: values.phone_number || "",
|
||||
hasPartner: values.has_partner === true || values.has_partner === "بلی",
|
||||
isForeigner: values.is_foreigner === true || values.is_foreigner === "بلی",
|
||||
title: values.guild_name || "",
|
||||
role: getRoleFromUrl(),
|
||||
has_inquiry: hasInquiry !== null ? hasInquiry : false,
|
||||
...(values.active !== null && { active: values.active }),
|
||||
};
|
||||
|
||||
if (guild) {
|
||||
baseData.guilds_key = guild.key;
|
||||
if (values.mobile !== originalPhoneNumber) {
|
||||
baseData.mobile = values.mobile;
|
||||
baseData.mobilenumber = values.mobile;
|
||||
}
|
||||
}
|
||||
|
||||
return baseData;
|
||||
};
|
||||
|
||||
export const mapResponseDataToFormFields = (
|
||||
responseData,
|
||||
inquiryNationalCode,
|
||||
formik
|
||||
) => {
|
||||
const isExternalApi = responseData.dbRegister === false;
|
||||
|
||||
// New structure: user is at top level, guilds is an array
|
||||
const userData = responseData.user || {};
|
||||
// For personal info, we use the first guild's data if available, or empty
|
||||
const firstGuild =
|
||||
Array.isArray(responseData.guilds) && responseData.guilds.length > 0
|
||||
? responseData.guilds[0]
|
||||
: {};
|
||||
const guildData = firstGuild || {};
|
||||
const layerTwo = guildData.layerTwo || {};
|
||||
const addressData = firstGuild?.address || guildData.address || {};
|
||||
const provinceData = addressData.province || {};
|
||||
const cityData = addressData.city || {};
|
||||
|
||||
const nationalIdValue = isExternalApi
|
||||
? String(
|
||||
layerTwo.nationalcode || userData.nationalCode || inquiryNationalCode
|
||||
).trim()
|
||||
: String(userData.nationalId || inquiryNationalCode).trim();
|
||||
|
||||
const birthDatePersian = isExternalApi
|
||||
? normalizeExternalApiDate(userData.birthDate || "")
|
||||
: normalizeDatabaseDate(userData.birthday || "");
|
||||
|
||||
const licenseExpireDatePersian = isExternalApi
|
||||
? normalizeExternalApiDate(guildData.licenseExpireDate || "")
|
||||
: normalizeDatabaseDate(firstGuild.licenseExpireDate || "");
|
||||
|
||||
const licenseIssueDatePersian = isExternalApi
|
||||
? normalizeExternalApiDate(layerTwo.licenseIssueDate || "")
|
||||
: normalizeDatabaseDate(responseData.licenseIssueDate || "");
|
||||
|
||||
const genderValue = isExternalApi
|
||||
? userData.gender === true
|
||||
? "True"
|
||||
: userData.gender === false
|
||||
? "False"
|
||||
: ""
|
||||
: userData.gender || "";
|
||||
|
||||
const isAliveValue = isExternalApi
|
||||
? userData.isLive === true
|
||||
? "بلی"
|
||||
: userData.isLive === false
|
||||
? "خیر"
|
||||
: ""
|
||||
: userData.isAlive === false
|
||||
? "خیر"
|
||||
: userData.isAlive === true
|
||||
? "بلی"
|
||||
: "";
|
||||
|
||||
const isForeignerValue = isExternalApi
|
||||
? layerTwo.isForeigner === "خیر"
|
||||
? false
|
||||
: layerTwo.isForeigner === "بلی"
|
||||
? true
|
||||
: ""
|
||||
: responseData.isForeignNational === false
|
||||
? false
|
||||
: responseData.isForeignNational === true
|
||||
? true
|
||||
: "";
|
||||
|
||||
const hasStewardValue = isExternalApi
|
||||
? layerTwo.hasSteward === "خیر"
|
||||
? false
|
||||
: layerTwo.hasSteward === "بلی"
|
||||
? true
|
||||
: ""
|
||||
: responseData.steward === false
|
||||
? false
|
||||
: responseData.steward === true
|
||||
? true
|
||||
: "";
|
||||
|
||||
const hasPartnerValue = isExternalApi
|
||||
? layerTwo.hasPartner === "خیر"
|
||||
? false
|
||||
: layerTwo.hasPartner === "بلی"
|
||||
? true
|
||||
: ""
|
||||
: responseData.hasPartner === false
|
||||
? false
|
||||
: responseData.hasPartner === true
|
||||
? true
|
||||
: "";
|
||||
|
||||
const values = {
|
||||
first_name: userData.firstName || "",
|
||||
last_name: userData.lastName || "",
|
||||
national_id: nationalIdValue,
|
||||
national_code: isExternalApi
|
||||
? userData.identityNo || ""
|
||||
: userData.nationalCode || "",
|
||||
birth_date: birthDatePersian,
|
||||
father_name: userData.fatherName || "",
|
||||
gender: genderValue,
|
||||
person_city: userData.city || "",
|
||||
is_alive: isAliveValue,
|
||||
// Guild fields - will be set per guild in accordion, so we set empty or first guild's data
|
||||
guild_name: isExternalApi
|
||||
? guildData.title || ""
|
||||
: firstGuild.guildsName || "",
|
||||
area_activity: isExternalApi
|
||||
? guildData.isicname || ""
|
||||
: firstGuild.areaActivity || "",
|
||||
state: isExternalApi ? guildData.state || "" : provinceData.name || "",
|
||||
city: isExternalApi ? guildData.city || "" : cityData.name || "",
|
||||
address: isExternalApi
|
||||
? guildData.address || ""
|
||||
: addressData.address || "",
|
||||
license_expire_date: licenseExpireDatePersian,
|
||||
license_status: isExternalApi
|
||||
? guildData.licenseStatus || ""
|
||||
: firstGuild.licenseStatus || "",
|
||||
license_type: isExternalApi
|
||||
? guildData.licenseType || ""
|
||||
: firstGuild.licenseType || "",
|
||||
license_number: isExternalApi
|
||||
? guildData.licenseNumber || ""
|
||||
: firstGuild.licenseNumber || "",
|
||||
union_name: isExternalApi
|
||||
? layerTwo.unionName || ""
|
||||
: firstGuild.unionName || "",
|
||||
postal_code: isExternalApi
|
||||
? layerTwo.postalcode || ""
|
||||
: addressData.postalCode || "",
|
||||
phone_number: isExternalApi
|
||||
? layerTwo.phonenumber || ""
|
||||
: firstGuild.phoneNumber || "",
|
||||
mobile: isExternalApi ? layerTwo.mobilenumber || "" : userData.mobile || "",
|
||||
guild_national_id: isExternalApi
|
||||
? layerTwo.nationalId || ""
|
||||
: firstGuild.nationalCode || "",
|
||||
is_foreigner: isForeignerValue,
|
||||
corporation_name: isExternalApi
|
||||
? layerTwo.corporationName || ""
|
||||
: firstGuild.companyName || "",
|
||||
has_steward: hasStewardValue,
|
||||
has_partner: hasPartnerValue,
|
||||
steward: isExternalApi ? false : firstGuild.isSteward || false,
|
||||
guild: isExternalApi
|
||||
? typeof guildData.guild === "boolean"
|
||||
? guildData.guild
|
||||
: false
|
||||
: typeof firstGuild.guild === "boolean"
|
||||
? firstGuild.guild
|
||||
: false,
|
||||
license_issue_date: licenseIssueDatePersian,
|
||||
...(isExternalApi
|
||||
? {}
|
||||
: {
|
||||
company_name: firstGuild.companyName || "",
|
||||
company_identifier: firstGuild.companyIdentifier || "",
|
||||
type_activity_name: firstGuild.typeActivity || "",
|
||||
}),
|
||||
};
|
||||
|
||||
formik.setValues({ ...formik.values, ...values });
|
||||
};
|
||||
@@ -0,0 +1,158 @@
|
||||
import {
|
||||
convertToIranianTime,
|
||||
convertPersianToEnglishNumerals,
|
||||
} from "../../../../../utils/formatTime";
|
||||
import { fromJalali } from "../../../../../utils/jalali";
|
||||
|
||||
export const convertGregorianToPersian = (gregorianDateString) => {
|
||||
if (!gregorianDateString || typeof gregorianDateString !== "string") {
|
||||
return "";
|
||||
}
|
||||
|
||||
// Check if the date is already in Persian format (YYYY/MM/DD with year < 1500)
|
||||
const persianPattern = /^\d{4}\/\d{2}\/\d{2}$/;
|
||||
if (persianPattern.test(gregorianDateString)) {
|
||||
const year = parseInt(gregorianDateString.split("/")[0]);
|
||||
// If year is < 1500, it's likely Persian, return as is
|
||||
if (year < 1500) {
|
||||
return gregorianDateString;
|
||||
}
|
||||
}
|
||||
|
||||
// Try to convert using convertToIranianTime
|
||||
try {
|
||||
return convertToIranianTime(gregorianDateString);
|
||||
} catch (error) {
|
||||
console.error("Error converting Gregorian date to Persian:", error);
|
||||
return gregorianDateString; // Return original on error
|
||||
}
|
||||
};
|
||||
|
||||
export const convertPersianToGregorian = (persianDateString) => {
|
||||
if (!persianDateString || typeof persianDateString !== "string") {
|
||||
return "";
|
||||
}
|
||||
|
||||
const normalizedDateString =
|
||||
convertPersianToEnglishNumerals(persianDateString);
|
||||
|
||||
const gregorianPattern = /^\d{4}[-/]\d{2}[-/]\d{2}$/;
|
||||
if (gregorianPattern.test(normalizedDateString)) {
|
||||
const year = parseInt(normalizedDateString.split(/[-/]/)[0]);
|
||||
if (year > 1500) {
|
||||
return normalizedDateString.replace(/\//g, "-");
|
||||
}
|
||||
}
|
||||
|
||||
const parts = normalizedDateString.split("/");
|
||||
if (parts.length !== 3) {
|
||||
return persianDateString;
|
||||
}
|
||||
|
||||
const py = parseInt(parts[0]);
|
||||
const pm = parseInt(parts[1]);
|
||||
const pd = parseInt(parts[2]);
|
||||
|
||||
if (isNaN(py) || isNaN(pm) || isNaN(pd)) {
|
||||
return persianDateString;
|
||||
}
|
||||
|
||||
try {
|
||||
const gregorianDate = fromJalali(py, pm, pd);
|
||||
const year = gregorianDate.getFullYear();
|
||||
const month = String(gregorianDate.getMonth() + 1).padStart(2, "0");
|
||||
const day = String(gregorianDate.getDate()).padStart(2, "0");
|
||||
return `${year}-${month}-${day}`;
|
||||
} catch (error) {
|
||||
console.error("Error converting Persian date to Gregorian:", error);
|
||||
return persianDateString;
|
||||
}
|
||||
};
|
||||
|
||||
export const normalizeExternalApiDate = (dateString) => {
|
||||
if (!dateString || typeof dateString !== "string") {
|
||||
return "";
|
||||
}
|
||||
return convertPersianToEnglishNumerals(dateString);
|
||||
};
|
||||
|
||||
export const normalizeDatabaseDate = (dateString) => {
|
||||
if (!dateString || typeof dateString !== "string") {
|
||||
return "";
|
||||
}
|
||||
const first10Chars = dateString.substring(0, 10);
|
||||
const normalizedDate = first10Chars.replace(/-/g, "/");
|
||||
return convertToIranianTime(normalizedDate);
|
||||
};
|
||||
|
||||
export const formatDateForSubmitExternal = (dateString) => {
|
||||
if (!dateString || typeof dateString !== "string") {
|
||||
return "";
|
||||
}
|
||||
return convertPersianToEnglishNumerals(dateString);
|
||||
};
|
||||
|
||||
export const formatDateForSubmitDatabase = (dateString) => {
|
||||
if (!dateString || typeof dateString !== "string") {
|
||||
return "";
|
||||
}
|
||||
|
||||
const normalizedDate = convertPersianToEnglishNumerals(dateString);
|
||||
const persianPattern = /^\d{4}\/\d{2}\/\d{2}$/;
|
||||
|
||||
if (persianPattern.test(normalizedDate)) {
|
||||
const year = parseInt(normalizedDate.split("/")[0]);
|
||||
if (year < 1500) {
|
||||
const parts = normalizedDate.split("/");
|
||||
const py = parseInt(parts[0]);
|
||||
const pm = parseInt(parts[1]);
|
||||
const pd = parseInt(parts[2]);
|
||||
|
||||
if (!isNaN(py) && !isNaN(pm) && !isNaN(pd)) {
|
||||
try {
|
||||
const gregorianDate = fromJalali(py, pm, pd);
|
||||
const gy = gregorianDate.getFullYear();
|
||||
const gm = String(gregorianDate.getMonth() + 1).padStart(2, "0");
|
||||
const gd = String(gregorianDate.getDate()).padStart(2, "0");
|
||||
return `${gy}/${gm}/${gd}`;
|
||||
} catch (error) {
|
||||
console.error("Error converting Persian to Gregorian:", error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const gregorianPattern = /^\d{4}[-/]\d{2}[-/]\d{2}$/;
|
||||
if (gregorianPattern.test(normalizedDate)) {
|
||||
const year = parseInt(normalizedDate.split(/[-/]/)[0]);
|
||||
if (year > 1900) {
|
||||
return normalizedDate.replace(/-/g, "/");
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const date = new Date(normalizedDate);
|
||||
if (!isNaN(date.getTime())) {
|
||||
const year = date.getFullYear();
|
||||
const month = String(date.getMonth() + 1).padStart(2, "0");
|
||||
const day = String(date.getDate()).padStart(2, "0");
|
||||
return `${year}/${month}/${day}`;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error formatting database date:", error);
|
||||
}
|
||||
|
||||
return normalizedDate.replace(/-/g, "/");
|
||||
};
|
||||
|
||||
export const formatDateForSubmit = (dateString, isExternalApi = false) => {
|
||||
if (!dateString || typeof dateString !== "string") {
|
||||
return "";
|
||||
}
|
||||
|
||||
if (isExternalApi) {
|
||||
return formatDateForSubmitExternal(dateString);
|
||||
} else {
|
||||
return formatDateForSubmitDatabase(dateString);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,95 @@
|
||||
import * as yup from "yup";
|
||||
import { normalizeDatabaseDate } from "./dateUtils";
|
||||
|
||||
export const getValidationSchema = (isEditMode) =>
|
||||
yup.object({
|
||||
national_id: yup
|
||||
.string()
|
||||
.required("کد ملی الزامی است")
|
||||
.matches(/^[0-9]{10}$/, "کد ملی باید 10 رقم باشد"),
|
||||
mobile: isEditMode
|
||||
? yup
|
||||
.string()
|
||||
.nullable()
|
||||
.test(
|
||||
"mobile-format",
|
||||
"شماره تلفن باید 11 رقم باشد",
|
||||
(value) => !value || /^[0-9]{11}$/.test(value)
|
||||
)
|
||||
: yup
|
||||
.string()
|
||||
.required("شماره تلفن الزامی است")
|
||||
.matches(/^[0-9]{11}$/, "شماره تلفن باید 11 رقم باشد"),
|
||||
first_name: yup.string(),
|
||||
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(),
|
||||
license_status: yup.string(),
|
||||
union_name: yup.string(),
|
||||
postal_code: yup.string(),
|
||||
guild_national_id: yup.string(),
|
||||
is_foreigner: yup.string(),
|
||||
national_code: yup.string(),
|
||||
has_steward: yup.string(),
|
||||
has_partner: yup.string(),
|
||||
license_number: yup.string(),
|
||||
isAccepted: yup
|
||||
.boolean()
|
||||
.test("req", "باید تعهد نامه را بپذیرید!", (val) => {
|
||||
return val === true;
|
||||
})
|
||||
.required("این فیلد اجباری است!"),
|
||||
});
|
||||
|
||||
export const getInitialValues = (guild) => ({
|
||||
first_name: guild?.user?.firstName || "",
|
||||
last_name: guild?.user?.lastName || "",
|
||||
corporation_name: guild?.companyName || "",
|
||||
national_id: guild?.user?.nationalId || "",
|
||||
national_code: guild?.user?.nationalCode || "",
|
||||
birth_date: normalizeDatabaseDate(guild?.user?.birthday || ""),
|
||||
father_name: guild?.user?.fatherName || "",
|
||||
gender: guild?.user?.gender || "",
|
||||
person_city: guild?.user?.city || "",
|
||||
is_alive: guild?.user?.isAlive || "",
|
||||
guild_name: guild?.guildsName || "",
|
||||
area_activity: guild?.areaActivity || "",
|
||||
state: guild?.address?.province?.name || "",
|
||||
city: guild?.address?.city?.name || "",
|
||||
address: guild?.address?.address || "",
|
||||
license_expire_date: normalizeDatabaseDate(guild?.licenseExpireDate || ""),
|
||||
license_status: guild?.licenseStatus || "",
|
||||
license_type: guild?.licenseType || "",
|
||||
union_name: guild?.unionName || "",
|
||||
postal_code: guild?.address?.postalCode || "",
|
||||
phone_number: guild?.phoneNumber || "",
|
||||
mobile: guild?.user?.mobile || "",
|
||||
is_foreigner: guild?.is_foreign_national || "",
|
||||
has_steward: guild?.hasSteward || "",
|
||||
has_partner: guild?.hasPartner || "",
|
||||
license_number: guild?.licenseNumber || "",
|
||||
isAccepted: guild?.provinceAcceptState === "accepted" || false,
|
||||
steward:
|
||||
typeof guild?.steward === "boolean"
|
||||
? guild.steward
|
||||
: typeof guild?.isSteward === "boolean"
|
||||
? guild.isSteward
|
||||
: false,
|
||||
guild:
|
||||
typeof guild?.guild === "boolean"
|
||||
? guild.guild
|
||||
: typeof guild?.isGuild === "boolean"
|
||||
? guild.isGuild
|
||||
: false,
|
||||
verify_mobile: guild?.verifyMobile || false,
|
||||
guild_national_id: guild?.nationalId || "",
|
||||
license_issue_date: normalizeDatabaseDate(guild?.licenseIssueDate || ""),
|
||||
company_name: guild?.companyName || "",
|
||||
company_identifier: guild?.companyIdentifier || "",
|
||||
type_activity_name: guild?.typeActivityName || "",
|
||||
active: guild?.active ?? null,
|
||||
});
|
||||
@@ -0,0 +1,45 @@
|
||||
import {
|
||||
CLOSE_MODAL,
|
||||
OPEN_MODAL,
|
||||
} from "../../../../../lib/redux/slices/appSlice";
|
||||
import { ProvinceManageGuildsSubmitRegisterCode } from "../../province-manage-guilds-submit-register-code/ProvinceManageGuildsSubmitRegisterCode";
|
||||
|
||||
export const handleSubmitSuccess = (
|
||||
dispatch,
|
||||
openNotif,
|
||||
updateTable,
|
||||
values,
|
||||
responseData
|
||||
) => {
|
||||
updateTable();
|
||||
openNotif({
|
||||
vertical: "top",
|
||||
horizontal: "center",
|
||||
msg: "عملیات با موفقیت انجام شد.",
|
||||
severity: "success",
|
||||
});
|
||||
dispatch(CLOSE_MODAL());
|
||||
|
||||
if (values.verify_mobile && responseData) {
|
||||
dispatch(
|
||||
OPEN_MODAL({
|
||||
title: "ثبت کد احراز",
|
||||
content: (
|
||||
<ProvinceManageGuildsSubmitRegisterCode
|
||||
item={responseData}
|
||||
updateTable={updateTable}
|
||||
/>
|
||||
),
|
||||
})
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export const handleSubmitError = (openNotif, error) => {
|
||||
openNotif({
|
||||
vertical: "top",
|
||||
horizontal: "center",
|
||||
msg: error,
|
||||
severity: "error",
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user