From 178e283143e8726ed355a34c2c83868b89c2f3d0 Mon Sep 17 00:00:00 2001 From: workashrafi77-web Date: Tue, 27 Jan 2026 13:31:26 +0330 Subject: [PATCH] optimization => create guilds --- .../components/PersonalInfoSection.js | 2 +- .../components/create-guilds/constants.js | 6 + .../create-guilds/utils/dataMapping.js | 389 +++++++++++------- .../create-guilds/utils/formUtils.js | 168 +++++--- 4 files changed, 337 insertions(+), 228 deletions(-) diff --git a/src/features/province/components/create-guilds/components/PersonalInfoSection.js b/src/features/province/components/create-guilds/components/PersonalInfoSection.js index 1597100..8ecf523 100644 --- a/src/features/province/components/create-guilds/components/PersonalInfoSection.js +++ b/src/features/province/components/create-guilds/components/PersonalInfoSection.js @@ -72,7 +72,7 @@ export const PersonalInfoSection = ({ - + {guild || isAdmin ? ( { + const userFromDb = responseDataFromDb.user || {}; + const firstGuildFromDb = + Array.isArray(responseDataFromDb.guilds) && + responseDataFromDb.guilds.length > 0 + ? responseDataFromDb.guilds[0] + : {}; + const addressFromDb = firstGuildFromDb?.address || {}; + const provinceFromDb = addressFromDb.province || {}; + const cityFromDb = addressFromDb.city || {}; + + return { + // Personal Information Fields + first_name: userFromDb.firstName || "", + last_name: userFromDb.lastName || "", + national_id: String(userFromDb.nationalId || inquiryNationalCode).trim(), + national_code: userFromDb.nationalCode || "", + birth_date: normalizeDatabaseDate(userFromDb.birthday || ""), + father_name: userFromDb.fatherName || "", + gender: userFromDb.gender || "", + person_city: userFromDb.city || "", + is_alive: + userFromDb.isAlive === false + ? "خیر" + : userFromDb.isAlive === true + ? "بلی" + : "", + mobile: userFromDb.mobile || "", + + // 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 || "" + ), + license_status: firstGuildFromDb.licenseStatus || "", + license_type: firstGuildFromDb.licenseType || "", + license_number: firstGuildFromDb.licenseNumber || "", + license_issue_date: normalizeDatabaseDate( + responseDataFromDb.licenseIssueDate || "" + ), + union_name: firstGuildFromDb.unionName || "", + postal_code: addressFromDb.postalCode || "", + phone_number: firstGuildFromDb.phoneNumber || "", + guild_national_id: firstGuildFromDb.nationalCode || "", + corporation_name: firstGuildFromDb.companyName || "", + + // Status Fields + is_foreigner: + responseDataFromDb.isForeignNational === false + ? false + : responseDataFromDb.isForeignNational === true + ? true + : "", + has_steward: + responseDataFromDb.steward === false + ? false + : responseDataFromDb.steward === true + ? true + : "", + has_partner: + responseDataFromDb.hasPartner === false + ? false + : responseDataFromDb.hasPartner === true + ? true + : "", + steward: firstGuildFromDb.isSteward || false, + guild: + typeof firstGuildFromDb.guild === "boolean" + ? firstGuildFromDb.guild + : false, + + // Additional Database Fields + company_name: firstGuildFromDb.companyName || "", + company_identifier: firstGuildFromDb.companyIdentifier || "", + 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 +) => { + const userFromExternalApi = responseDataFromExternalApi.user || {}; + const firstGuildFromExternalApi = + Array.isArray(responseDataFromExternalApi.guilds) && + responseDataFromExternalApi.guilds.length > 0 + ? responseDataFromExternalApi.guilds[0] + : {}; + const layerTwoFromExternalApi = firstGuildFromExternalApi.layerTwo || {}; + + return { + // Personal Information Fields + first_name: userFromExternalApi.firstName || "", + last_name: userFromExternalApi.lastName || "", + national_id: String( + layerTwoFromExternalApi.nationalcode || + userFromExternalApi.nationalCode || + inquiryNationalCode + ).trim(), + national_code: userFromExternalApi.identityNo || "", + birth_date: normalizeExternalApiDate(userFromExternalApi.birthDate || ""), + father_name: userFromExternalApi.fatherName || "", + gender: + userFromExternalApi.gender === true + ? "True" + : userFromExternalApi.gender === false + ? "False" + : "", + person_city: userFromExternalApi.city || "", + is_alive: + userFromExternalApi.isLive === true + ? "بلی" + : userFromExternalApi.isLive === false + ? "خیر" + : "", + mobile: layerTwoFromExternalApi.mobilenumber || "", + + // 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 || "", + address: firstGuildFromExternalApi.address || "", + license_expire_date: normalizeExternalApiDate( + firstGuildFromExternalApi.licenseExpireDate || "" + ), + license_status: firstGuildFromExternalApi.licenseStatus || "", + license_type: firstGuildFromExternalApi.licenseType || "", + license_number: firstGuildFromExternalApi.licenseNumber || "", + license_issue_date: normalizeExternalApiDate( + layerTwoFromExternalApi.licenseIssueDate || "" + ), + union_name: layerTwoFromExternalApi.unionName || "", + postal_code: layerTwoFromExternalApi.postalcode || "", + phone_number: layerTwoFromExternalApi.phonenumber || "", + guild_national_id: layerTwoFromExternalApi.nationalId || "", + corporation_name: layerTwoFromExternalApi.corporationName || "", + + // Status Fields + is_foreigner: + layerTwoFromExternalApi.isForeigner === "خیر" + ? false + : layerTwoFromExternalApi.isForeigner === "بلی" + ? true + : "", + has_steward: + layerTwoFromExternalApi.hasSteward === "خیر" + ? false + : layerTwoFromExternalApi.hasSteward === "بلی" + ? true + : "", + has_partner: + layerTwoFromExternalApi.hasPartner === "خیر" + ? false + : layerTwoFromExternalApi.hasPartner === "بلی" + ? true + : "", + steward: false, // External API doesn't provide steward status + guild: + typeof firstGuildFromExternalApi.guild === "boolean" + ? firstGuildFromExternalApi.guild + : 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, formik ) => { - const isExternalApi = responseData.dbRegister === false; + const isFromExternalApi = 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 || {}; + // Route to appropriate extractor based on data source + const formFieldValues = isFromExternalApi + ? extractFormFieldsFromExternalApi(responseData, inquiryNationalCode) + : extractFormFieldsFromDatabaseInquiry(responseData, inquiryNationalCode); - 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 || "", - province: isExternalApi ? "" : provinceData.key || "", - city: isExternalApi ? guildData.city || "" : cityData.key || "", - 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 }); + formik.setValues({ ...formik.values, ...formFieldValues }); }; diff --git a/src/features/province/components/create-guilds/utils/formUtils.js b/src/features/province/components/create-guilds/utils/formUtils.js index a97ec4e..362b02d 100644 --- a/src/features/province/components/create-guilds/utils/formUtils.js +++ b/src/features/province/components/create-guilds/utils/formUtils.js @@ -1,6 +1,10 @@ import * as yup from "yup"; import { normalizeDatabaseDate } from "./dateUtils"; +/** + * Creates validation schema for the form + * @param {boolean} isEditMode - Whether we're editing an existing guild + */ export const getValidationSchema = (isEditMode) => yup.object({ national_id: yup @@ -66,70 +70,100 @@ export const getValidationSchema = (isEditMode) => ), }); -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 || guild?.name || "", - area_activity: guild?.areaActivity || "", - state: guild?.address?.province?.name || "", - province: guild?.address?.province?.key || "", - city_name: 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, - guilds: guild - ? [ - { - 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, - }, - ] - : [], -}); +/** + * Extracts initial form values from guild data for edit mode + * + * Data source: Guild data passed directly when editing existing guild + * This is used when the component receives a guild prop (edit mode) + * + * @param {Object} guildDataForEdit - Guild data object from our database (edit mode) + * @returns {Object} Initial form values for Formik + */ +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 { + // Personal Information Fields (from user object in edit mode) + first_name: userDataFromEdit.firstName || "", + last_name: userDataFromEdit.lastName || "", + national_id: userDataFromEdit.nationalId || "", + national_code: userDataFromEdit.nationalCode || "", + birth_date: normalizeDatabaseDate(userDataFromEdit.birthday || ""), + father_name: userDataFromEdit.fatherName || "", + gender: userDataFromEdit.gender || "", + person_city: userDataFromEdit.city || "", + 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( + guildDataForEdit?.licenseExpireDate || "" + ), + license_status: guildDataForEdit?.licenseStatus || "", + license_type: guildDataForEdit?.licenseType || "", + union_name: guildDataForEdit?.unionName || "", + postal_code: addressDataFromEdit.postalCode || "", + phone_number: guildDataForEdit?.phoneNumber || "", + license_number: guildDataForEdit?.licenseNumber || "", + guild_national_id: guildDataForEdit?.nationalId || "", + corporation_name: guildDataForEdit?.companyName || "", + license_issue_date: normalizeDatabaseDate( + guildDataForEdit?.licenseIssueDate || "" + ), + + // Status Fields (from guild object in edit mode) + is_foreigner: guildDataForEdit?.is_foreign_national || "", + has_steward: guildDataForEdit?.hasSteward || "", + has_partner: guildDataForEdit?.hasPartner || "", + steward: + typeof guildDataForEdit?.steward === "boolean" + ? guildDataForEdit.steward + : typeof guildDataForEdit?.isSteward === "boolean" + ? guildDataForEdit.isSteward + : false, + guild: + typeof guildDataForEdit?.guild === "boolean" + ? guildDataForEdit.guild + : typeof guildDataForEdit?.isGuild === "boolean" + ? guildDataForEdit.isGuild + : false, + verify_mobile: guildDataForEdit?.verifyMobile || false, + active: guildDataForEdit?.active ?? null, + isAccepted: guildDataForEdit?.provinceAcceptState === "accepted" || false, + + // Additional Edit Mode Fields + company_name: guildDataForEdit?.companyName || "", + company_identifier: guildDataForEdit?.companyIdentifier || "", + type_activity_name: guildDataForEdit?.typeActivityName || "", + + // Guilds array for validation (edit mode) + guilds: guildDataForEdit + ? [ + { + steward: + typeof guildDataForEdit?.steward === "boolean" + ? guildDataForEdit.steward + : typeof guildDataForEdit?.isSteward === "boolean" + ? guildDataForEdit.isSteward + : false, + guild: + typeof guildDataForEdit?.guild === "boolean" + ? guildDataForEdit.guild + : typeof guildDataForEdit?.isGuild === "boolean" + ? guildDataForEdit.isGuild + : false, + }, + ] + : [], + }; +};