push rasad front on new repo

This commit is contained in:
2026-01-18 14:32:49 +03:30
commit 4fe6e70525
2139 changed files with 303150 additions and 0 deletions

View File

@@ -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 });
};

View File

@@ -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);
}
};

View File

@@ -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,
});

View File

@@ -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",
});
};