diff --git a/ipi-survey-platform/src/pages/Admin/configuration/CompanyProfile.jsx b/ipi-survey-platform/src/pages/Admin/configuration/CompanyProfile.jsx index b71ccf8..f9299ab 100644 --- a/ipi-survey-platform/src/pages/Admin/configuration/CompanyProfile.jsx +++ b/ipi-survey-platform/src/pages/Admin/configuration/CompanyProfile.jsx @@ -2668,238 +2668,80 @@ const CompanyProfile = () => { return profiles[deletingRow]; }, [deletingRow, profiles]); - // Enhanced Import Function with Validation - const handleImport = async () => { - if (!file) { - const errorMsg = "Please select a CSV file to import."; - setImportError(errorMsg); +const handleImport = async () => { + if (!file) { + const msg = "Please select a CSV file to import."; + setImportError(msg); + setToastData({ message: msg, type: "error" }); + return; + } + + setImportLoading(true); + setImportError(""); + + try { + await validateFile(file); + + const formData = new FormData(); + formData.append("file", file); + + const response = await uploadCompanyProfileCSV(formData); + + const { status, message, errors } = response || {}; + + // Convert backend error object → readable string + const formattedErrors = errors + ?.map((e) => `Row ${e.row}: ${e.error}`) + .join(", "); + + // FAILED + if (status === false) { + const finalError = + formattedErrors || message || "Upload failed due to server error."; + + setImportError(finalError); setToastData({ - message: errorMsg, + message: finalError, type: "error", }); - throw new Error(errorMsg); + return; } - try { - setImportLoading(true); - setImportError(""); + // SUCCESS + setToastData({ + message: message || "File uploaded successfully!", + type: "success", + }); - // Re-validate file before upload - await validateFile(file); + // window.location.reload(); + } catch (error) { + console.error("Upload error:", error); - const formData = new FormData(); - formData.append("file", file); + const backend = error?.response?.data; - console.log('FormData entries before upload:'); - for (let pair of formData.entries()) { - console.log(pair[0] + ': ', pair[1]); - } + const formattedErrors = backend?.errors + ?.map((e) => `Row ${e.row}: ${e.error}`) + .join(", "); - let response; - let successMessage = "Company profiles imported successfully!"; + const errorMessage = + formattedErrors || + backend?.message || + backend?.error || + error?.message || + "Upload failed. Please try again."; - try { - console.log('Attempting first upload...'); - response = await uploadCompanyProfileCSV(formData); - successMessage = response.message || successMessage; - } catch (firstError) { - console.log('First upload attempt failed, trying alternative:', firstError); - try { - console.log('Attempting alternative upload...'); - response = await uploadCompanyProfileCSVAlternative(formData); - successMessage = response.message || successMessage; - } catch (secondError) { - console.log('Alternative upload also failed:', secondError); - - let detailedErrorMessage = "Upload failed. Please try again."; - let validationErrorCount = 1; // Default count - - // Extract validation error count from response if available - if (secondError.response?.data) { - const responseData = secondError.response.data; - - // Try to extract validation error count from different response structures - if (responseData.validation_errors) { - validationErrorCount = responseData.validation_errors.length || 1; - } else if (responseData.errors) { - validationErrorCount = responseData.errors.length || 1; - } else if (responseData.details && Array.isArray(responseData.details)) { - validationErrorCount = responseData.details.length || 1; - } else if (typeof responseData === 'string') { - // Try to extract count from error message - const countMatch = responseData.match(/(\d+)\s*validation errors?/i); - if (countMatch) { - validationErrorCount = parseInt(countMatch[1]) || 1; - } - } - } - - if (secondError.response?.data?.message) { - detailedErrorMessage = secondError.response.data.message; - } else if (secondError.message) { - if (secondError.message.includes("Request failed with status code")) { - if (secondError.response?.data) { - const responseData = secondError.response.data; - if (typeof responseData === 'string' && responseData.includes("Duplicate Establishment IDs")) { - detailedErrorMessage = responseData; - } else if (responseData.error) { - detailedErrorMessage = responseData.error; - } else if (responseData.details) { - detailedErrorMessage = responseData.details; - } else { - detailedErrorMessage = "Data already exists in the system. Please remove or update the duplicate entries and try again."; - } - } else { - detailedErrorMessage = "Server error occurred during upload. Please try again."; - } - } else { - detailedErrorMessage = secondError.message; - } - } + setImportError(errorMessage); + setToastData({ + message: errorMessage, + type: "error", + }); + } finally { + setImportLoading(false); + } +}; - // Enhanced validation error detection with dynamic count - if (detailedErrorMessage.includes("No file uploaded") || - detailedErrorMessage.includes("No file found")) { - detailedErrorMessage = "Please select a valid CSV file to upload."; - } else if (detailedErrorMessage.includes("token") || - detailedErrorMessage.includes("auth") || - detailedErrorMessage.includes("Authentication")) { - detailedErrorMessage = "Authentication failed. Please check your login credentials."; - } else if (detailedErrorMessage.includes("400") || - detailedErrorMessage.includes("Bad Request")) { - detailedErrorMessage = "Invalid file format or missing required data. Please check your CSV file."; - } else if (detailedErrorMessage.includes("Duplicate Establishment IDs") || - detailedErrorMessage.includes("duplicate") || - detailedErrorMessage.includes("already exist")) { - detailedErrorMessage = "Duplicate Establishment IDs found (in file or already exist in system). Resolve and re-upload."; - } else if (detailedErrorMessage.includes("validation error") || - detailedErrorMessage.includes("validation errors") || - detailedErrorMessage.includes("No establishments imported") || - detailedErrorMessage.includes("HS Codes do not exist") || - detailedErrorMessage.includes("HS Code")) { - // Format validation error with dynamic count and HS code message - detailedErrorMessage = `Import failed. ${validationErrorCount} HS Codes in your file do not exist in the Product Master. Please use the correct HS Code and try again.`; - } - throw new Error(detailedErrorMessage); - } - } - // Check if the response indicates validation errors - if (response && (response.message?.includes("validation error") || - response.message?.includes("validation errors") || - response.message?.includes("No establishments imported") || - response.message?.includes("HS Codes do not exist") || - response.message?.includes("HS Code"))) { - - let validationErrorCount = 1; - // Extract count from response if available - if (response.validation_errors) { - validationErrorCount = response.validation_errors.length || 1; - } else if (response.errors) { - validationErrorCount = response.errors.length || 1; - } - - const validationErrorMessage = `Import failed. ${validationErrorCount} HS Codes in your file do not exist in the Product Master. Please use the correct HS Code and try again.`; - - // Show validation error in red - setImportError(validationErrorMessage); - setToastData({ - message: validationErrorMessage, - type: "error", - }); - throw new Error(validationErrorMessage); - } - - // Show success message - setToastData({ - message: successMessage, - type: "success", - }); - - closeImportModal(); - setImportLoading(true); // Show loader while refreshing data - - try { - // Refresh the data - const res = await fetchEstablishments(); - const payload = res?.data ?? res; - const records = Array.isArray(payload?.data) - ? payload.data - : Array.isArray(payload) - ? payload - : []; - - setProfiles(records.map(mapApiEstablishmentToProfile)); - setTotalItems(records.length); - - // Refresh the page immediately - window.location.reload(); - } catch (refreshErr) { - console.log("Error refreshing data:", refreshErr); - } finally { - setIsLoading(false); - } - - return response; - - } catch (error) { - console.error("Error importing CSV:", error); - - let errorMessage = error.message || "Upload failed. Please try again."; - - if (errorMessage.includes("Request failed with status code")) { - const parts = errorMessage.split("Request failed with status code"); - if (parts.length > 1) { - const actualError = parts[1].replace(/^\d+\s*/, '').trim(); - if (actualError && actualError.length > 0) { - errorMessage = actualError; - } else { - errorMessage = "Server error occurred. Please try again."; - } - } - } - - // Enhanced error message handling for validation errors with dynamic count - if (errorMessage.includes("expired") || errorMessage.includes("Authentication")) { - errorMessage = "Authentication failed. Please check your login credentials."; - } - - if (errorMessage.includes("Duplicate Establishment IDs") || - errorMessage.includes("duplicate") || - errorMessage.includes("already exist")) { - errorMessage = "Duplicate Establishment IDs found (in file or already exist in system). Resolve and re-upload."; - } - - if (errorMessage.includes("validation error") || - errorMessage.includes("validation errors") || - errorMessage.includes("No establishments imported") || - errorMessage.includes("HS Codes do not exist") || - errorMessage.includes("HS Code")) { - - let validationErrorCount = 1; - // Try to extract count from existing error message - const countMatch = errorMessage.match(/(\d+)\s*validation errors?/i); - if (countMatch) { - validationErrorCount = parseInt(countMatch[1]) || 1; - } - - errorMessage = `Import failed. ${validationErrorCount} HS Code${validationErrorCount > 1 ? "s" : ""} in your file ${validationErrorCount > 1 ? "do" : "does"} not exist in the Product Master. Please use the correct HS Code${validationErrorCount > 1 ? "s" : ""} and try again.`; - } - - setImportError(errorMessage); - - setToastData({ - message: errorMessage, - type: "error", - }); - - throw error; - - } finally { - setImportLoading(false); - } - }; return (