diff --git a/resources/Brands/BrandsController.js b/resources/Brands/BrandsController.js
index f225f01..0d1c73e 100644
--- a/resources/Brands/BrandsController.js
+++ b/resources/Brands/BrandsController.js
@@ -57,11 +57,6 @@ export const getBrands = async (req, res) => {
.sort({ createdAt: -1 })
.exec();
- // If no brands are found, return 404 error
- if (!brands.length) {
- return res.status(404).json({ message: "No brands found" });
- }
-
// Return the paginated and filtered brands list
res.status(200).json({
success: true,
diff --git a/resources/Category/categoryController.js b/resources/Category/categoryController.js
index a9b2d76..9c43f21 100644
--- a/resources/Category/categoryController.js
+++ b/resources/Category/categoryController.js
@@ -57,11 +57,6 @@ export const getCategories = async (req, res) => {
.sort({ createdAt: -1 })
.exec();
- // If no categories are found, return a 404 error
- if (!categories.length) {
- return res.status(404).json({ message: "No categories found" });
- }
-
// Return success response with total data and total pages
res.status(200).json({
success: true,
diff --git a/resources/Products/ProductController.js b/resources/Products/ProductController.js
index a9b881c..319a56a 100644
--- a/resources/Products/ProductController.js
+++ b/resources/Products/ProductController.js
@@ -557,20 +557,12 @@ export const getAllProductUser = async (req, res) => {
.sort({ createdAt: -1 })
.exec();
- // Check if any products were found
- if (products && products.length > 0) {
- return res.status(200).json({
- success: true,
- total_data: total,
- total_pages: Math.ceil(total / PAGE_SIZE),
- products,
- });
- } else {
- return res.status(404).json({
- success: false,
- msg: "No products found!",
- });
- }
+ return res.status(200).json({
+ success: true,
+ total_data: total,
+ total_pages: Math.ceil(total / PAGE_SIZE),
+ products,
+ });
} catch (error) {
return res.status(500).json({
success: false,
diff --git a/resources/user/userController.js b/resources/user/userController.js
index 34c3162..7b4f980 100644
--- a/resources/user/userController.js
+++ b/resources/user/userController.js
@@ -16,322 +16,7 @@ import validator from "validator";
import ShippingAddress from "../ShippingAddresses/ShippingAddressModel.js";
import { generatePassword } from "../../Utils/generatepassword.js";
import { PdOrder } from "../PD_Orders/pdOrderModal.js";
-// const generatePassword = (name, email) => {
-// // Combine name and email, and convert to lowercase
-// const combinedStr = (name + email).toLowerCase();
-// // Define character pools
-// const specialChars = "@#*";
-// const numbers = "0123456789";
-// const alphaLower = combinedStr.match(/[a-z]/g) || [];
-// const alphaUpper = combinedStr.match(/[A-Z]/g) || [];
-
-// // Ensure at least one character from each category
-// const specialChar = specialChars.charAt(
-// Math.floor(Math.random() * specialChars.length)
-// );
-// const numberChar = numbers.charAt(Math.floor(Math.random() * numbers.length));
-// const lowerChar =
-// alphaLower.length > 0
-// ? alphaLower[Math.floor(Math.random() * alphaLower.length)]
-// : String.fromCharCode(Math.floor(Math.random() * 26) + 97);
-// const upperChar =
-// alphaUpper.length > 0
-// ? alphaUpper[Math.floor(Math.random() * alphaUpper.length)]
-// : String.fromCharCode(Math.floor(Math.random() * 26) + 65);
-
-// // Combine required characters
-// let passwordChars = [specialChar, numberChar, lowerChar, upperChar];
-
-// // Fill remaining positions with random characters from the combined string
-// const allChars = combinedStr + specialChars + numbers;
-// while (passwordChars.length < 8) {
-// passwordChars.push(
-// allChars.charAt(Math.floor(Math.random() * allChars.length))
-// );
-// }
-
-// // Shuffle characters to ensure randomness
-// passwordChars = passwordChars.sort(() => Math.random() - 0.5);
-
-// // Generate password of length 8
-// const password = passwordChars.slice(0, 8).join("");
-
-// return password;
-// };
-
-// export const uploadPrincipaldistributors = async (req, res) => {
-// try {
-// if (!req.files || !req.files.file) {
-// return res.status(400).json({ message: "No file uploaded" });
-// }
-
-// const file = req.files.file;
-// const filePath = path.join("public", "uploads", file.name);
-
-// // Ensure 'uploads' directory exists
-// if (!fs.existsSync(path.dirname(filePath))) {
-// fs.mkdirSync(path.dirname(filePath), { recursive: true });
-// }
-
-// // Move the file from temp to the uploads directory
-// await file.mv(filePath);
-
-// // Process the file
-// const fileBuffer = fs.readFileSync(filePath);
-// const workbook = XLSX.read(fileBuffer, { type: "buffer" });
-// const sheetName = workbook.SheetNames[0];
-// const worksheet = workbook.Sheets[sheetName];
-// const data = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
-
-// if (data.length <= 1) {
-// return res.status(400).json({ message: "Empty spreadsheet or no data found" });
-// }
-
-// const headers = data[0];
-
-// // Map headers from the Excel file to your schema
-// const headerMapping = {
-// "PD ID (From SAP)": "uniqueId",
-// "SBU":"SBU",
-// "Principal Distributor Name": "name",
-// "Email": "email",
-// "Phone Number": "phone",
-// "PAN Number": "panNumber",
-// "Trade Name": "tradeName",
-// "GST Number": "gstNumber",
-// "State": "state",
-// "City": "city",
-// "Street": "street",
-// "Pincode": "postalCode",
-// };
-
-// const requiredHeaders = Object.keys(headerMapping);
-
-// if (!requiredHeaders.every((header) => headers.includes(header))) {
-// return res.status(400).json({ message: "Missing required columns in spreadsheet" });
-// }
-
-// const errors = [];
-// const newlyCreated = [];
-// const updatedDistributors = [];
-
-// for (let i = 1; i < data.length; i++) {
-// const row = data[i];
-// const item = {};
-
-// headers.forEach((header, index) => {
-// if (headerMapping[header]) {
-// item[headerMapping[header]] = row[index] !== undefined ? row[index] : "";
-// }
-// });
-
-// // Initialize error tracking for each item
-// const missingFields = new Set();
-// const validationErrors = new Set();
-
-// // Validate required fields
-// if (!item.uniqueId) missingFields.add("uniqueId");
-// if(!item.SBU) missingFields.add("SBU");
-// if (!item.name) missingFields.add("name");
-// if (!item.email) missingFields.add("email");
-// if (!item.phone) missingFields.add("phone");
-// if (!item.panNumber) missingFields.add("panNumber");
-// if (!item.tradeName) missingFields.add("tradeName");
-// if (!item.gstNumber) missingFields.add("gstNumber");
-// if (!item.state) missingFields.add("state");
-// if (!item.city) missingFields.add("city");
-// if (!item.street) missingFields.add("street");
-// if (!item.postalCode) missingFields.add("postalCode");
-
-// // Check email validity
-// if (item.email && !validator.isEmail(item.email)) {
-// validationErrors.add("incorrect mail");
-// }
-
-// // Validate mobile number
-// if (item.phone && !/^\d{10}$/.test(item.phone)) {
-// validationErrors.add("Invalid Mobile Number (should be 10 digits)");
-// }
-
-// // Check GST, PAN, and postal code validation
-// item.panNumber = item.panNumber ? item.panNumber.toUpperCase() : "";
-// item.gstNumber = item.gstNumber ? item.gstNumber.toUpperCase() : "";
-
-// // Validate PAN Number
-// if (item.panNumber && !/^[A-Z]{5}[0-9]{4}[A-Z]{1}$/.test(item.panNumber)) {
-// validationErrors.add("Invalid PAN Number");
-// }
-
-// // Validate GST Number
-// if (item.gstNumber && !/^(\d{2}[A-Z]{5}\d{4}[A-Z]{1}\d[Z]{1}[A-Z\d]{1})$/.test(item.gstNumber)) {
-// validationErrors.add("Invalid GST Number");
-// }
-
-// // Validate Postal Code
-// if (item.postalCode && !/^\d{6}$/.test(item.postalCode)) {
-// validationErrors.add("Invalid Postal Code");
-// }
-
-// // Combine all errors into a single message
-// let errorMessage = "";
-// if (missingFields.size > 0) {
-// errorMessage += `Missing fields: ${Array.from(missingFields).join(", ")}. `;
-// }
-// if (validationErrors.size > 0) {
-// errorMessage += `Validation errors: ${Array.from(validationErrors).join(", ")}.`;
-// }
-
-// // If there are errors, push them to the errors array
-// if (errorMessage.trim()) {
-// errors.push({
-// uniqueId: item.uniqueId || "N/A",
-// SBU:item.SBU || "N/A",
-// name: item.name || "N/A",
-// email: item.email || "N/A",
-// phone: item.phone || "N/A",
-// panNumber: item.panNumber || "N/A",
-// gstNumber: item.gstNumber || "N/A",
-// message: errorMessage.trim(),
-// });
-// continue;
-// }
-
-// // Generate a password
-// const password = generatePassword(item.name, item.email);
-// item.role = "principal-Distributor";
-
-// // Check for existing user by uniqueId
-// let distributor = await User.findOne({ uniqueId: item.uniqueId });
-
-// if (distributor) {
-// // Track updated fields
-// const updatedFields = [];
-// const addressFields = ['panNumber', 'gstNumber', 'state', 'city', 'street', 'tradeName', 'postalCode'];
-// const existingAddress = await ShippingAddress.findOne({ user: distributor._id });
-
-// // Check for changes in user details
-// let userUpdated = false;
-// if (distributor.name !== item.name) {
-// updatedFields.push("name");
-// distributor.name = item.name;
-// userUpdated = true;
-// }
-// if (distributor.email !== item.email) {
-// updatedFields.push("email");
-// distributor.email = item.email;
-// userUpdated = true;
-// }
-// if(distributor.SBU !== item.SBU){
-// updatedFields.push("SBU");
-// distributor.SBU = item.SBU;
-// userUpdated = true;
-// }
-// if (distributor.phone !== item.phone.toString()) {
-// updatedFields.push("phone");
-// distributor.phone = item.phone;
-// userUpdated = true;
-// }
-
-// // Update user
-// if (userUpdated) {
-// await distributor.save();
-// }
-
-// // Check for changes in address details
-// const addressData = {
-// street: item.street,
-// city: item.city,
-// state: item.state,
-// postalCode: item.postalCode.toString(),
-// country: "India", // Default country
-// panNumber: item.panNumber,
-// tradeName: item.tradeName,
-// gstNumber: item.gstNumber,
-// user: distributor._id,
-// };
-
-// let addressUpdated = false;
-// if (existingAddress) {
-// const addressUpdates = [];
-// addressFields.forEach(field => {
-// if (existingAddress[field] !== addressData[field]) {
-// addressUpdates.push(field);
-// addressUpdated = true;
-// }
-// });
-
-// if (addressUpdated) {
-// await ShippingAddress.updateOne({ user: distributor._id }, addressData);
-// if (addressUpdates.length > 0) {
-// updatedFields.push(`Address fields: ${addressUpdates.join(", ")}`);
-// }
-// }
-// } else {
-// // Create new address
-// await ShippingAddress.create(addressData);
-// updatedFields.push("New address created");
-// }
-
-// // Add to updatedDistributors only if there are updated fields
-// if (updatedFields.length > 0) {
-// updatedDistributors.push({
-// ...distributor._doc,
-// updatedFields: updatedFields.join(", ")
-// });
-// }
-// } else {
-// // Create a new user
-// distributor = new User({
-// name: item.name,
-// SBU:item.SBU,
-// email: item.email,
-// phone: item.phone,
-// password,
-// role: item.role,
-// uniqueId: item.uniqueId,
-// });
-// await distributor.save();
-
-// // Send email with the new user details
-// await sendEmail({
-// to: item.email,
-// from: process.env.SEND_EMAIL_FROM,
-// subject: `Cheminova Account Created`,
-// html: `
-// Your Principal Distributor Account is created successfully.
-//
Name: ${item.name}
-//
Mobile Number: ${item.phone}
-//
Password: ${password}
-// Click here to login
-// If you have not requested this email, please ignore it.
-// `,
-// });
-
-// newlyCreated.push(distributor._doc);
-// }
-// }
-
-// fs.unlinkSync(filePath); // Clean up uploaded file
-
-// res.status(201).json({
-// message:
-// errors.length > 0
-// ? "File processed with errors!"
-// : "File processed successfully!",
-// processedUsers: {
-// newlyCreated: newlyCreated.length,
-// updatedDistributors: updatedDistributors.length
-// },
-// errors,
-// newlyCreated,
-// updatedDistributors
-// });
-// } catch (error) {
-// console.error("Error processing file:", error);
-// res.status(500).json({ message: "Error processing file", error: error.message });
-// }
-// };
export const uploadPrincipaldistributors = async (req, res) => {
try {
if (!req.files || !req.files.file) {
@@ -493,112 +178,146 @@ export const uploadPrincipaldistributors = async (req, res) => {
item.role = "principal-Distributor";
// Check for existing user by uniqueId
- let distributor = await User.findOne({ uniqueId: item.uniqueId });
+ let distributorbyid = await User.findOne({ uniqueId: item.uniqueId });
+ let distributorbymail = await User.findOne({ email: item.email });
+ // Case 1: Both uniqueId and mobileNumber exist
+ if (distributorbyid && distributorbymail) {
+ if (distributorbyid._id.equals(distributorbymail._id)) {
+ // Track updated fields
+ const updatedFields = [];
+ const addressFields = [
+ "Name",
+ "phoneNumber",
+ "panNumber",
+ "gstNumber",
+ "state",
+ "city",
+ "street",
+ "tradeName",
+ "postalCode",
+ ];
+ let existingAddress = await ShippingAddress.findOne({
+ user: distributorbyid._id,
+ isDefault: true,
+ }).exec();
- if (distributor) {
- // Track updated fields
- const updatedFields = [];
- const addressFields = [
- "Name",
- "phoneNumber",
- "panNumber",
- "gstNumber",
- "state",
- "city",
- "street",
- "tradeName",
- "postalCode",
- ];
- let existingAddress = await ShippingAddress.findOne({
- user: distributor._id,
- isDefault: true,
- }).exec();
+ if (!existingAddress) {
+ existingAddress = await ShippingAddress.findOne({
+ user: distributorbyid._id,
+ })
+ .sort({ createdAt: 1 }) // Get the first created address as fallback
+ .exec();
+ }
- if (!existingAddress) {
- existingAddress = await ShippingAddress.findOne({
- user: distributor._id,
- })
- .sort({ createdAt: 1 }) // Get the first created address as fallback
- .exec();
- }
+ // Check for changes in user details
+ let userUpdated = false;
+ if (distributorbyid.name !== item.name) {
+ updatedFields.push("name");
+ distributorbyid.name = item.name;
+ userUpdated = true;
+ }
+ if (distributorbyid.email !== item.email) {
+ updatedFields.push("email");
+ distributorbyid.email = item.email;
+ userUpdated = true;
+ }
+ if (distributorbyid.SBU !== item.SBU) {
+ updatedFields.push("SBU");
+ distributorbyid.SBU = item.SBU;
+ userUpdated = true;
+ }
+ if (distributorbyid.phone !== item.phone.toString()) {
+ updatedFields.push("phone");
+ distributorbyid.phone = item.phone;
+ userUpdated = true;
+ }
- // Check for changes in user details
- let userUpdated = false;
- if (distributor.name !== item.name) {
- updatedFields.push("name");
- distributor.name = item.name;
- userUpdated = true;
- }
- if (distributor.email !== item.email) {
- updatedFields.push("email");
- distributor.email = item.email;
- userUpdated = true;
- }
- if (distributor.SBU !== item.SBU) {
- updatedFields.push("SBU");
- distributor.SBU = item.SBU;
- userUpdated = true;
- }
- if (distributor.phone !== item.phone.toString()) {
- updatedFields.push("phone");
- distributor.phone = item.phone;
- userUpdated = true;
- }
+ // Update user
+ if (userUpdated) {
+ await distributor.save();
+ }
- // Update user
- if (userUpdated) {
- await distributor.save();
- }
+ // Check for changes in address details
+ const addressData = {
+ Name: item.name,
+ phoneNumber: item.phone.toString().trim(),
+ street: item.street,
+ city: item.city,
+ state: item.state,
+ postalCode: item.postalCode.toString(),
+ country: "India", // Default country
+ panNumber: item.panNumber,
+ tradeName: item.tradeName,
+ gstNumber: item.gstNumber,
+ user: distributorbyid._id,
+ };
- // Check for changes in address details
- const addressData = {
- Name: item.name,
- phoneNumber: item.phone.toString().trim(),
- street: item.street,
- city: item.city,
- state: item.state,
- postalCode: item.postalCode.toString(),
- country: "India", // Default country
- panNumber: item.panNumber,
- tradeName: item.tradeName,
- gstNumber: item.gstNumber,
- user: distributor._id,
- };
+ let addressUpdated = false;
+ if (existingAddress) {
+ const addressUpdates = [];
+ addressFields.forEach((field) => {
+ if (existingAddress[field] !== addressData[field]) {
+ addressUpdates.push(field);
+ addressUpdated = true;
+ }
+ });
- let addressUpdated = false;
- if (existingAddress) {
- const addressUpdates = [];
- addressFields.forEach((field) => {
- if (existingAddress[field] !== addressData[field]) {
- addressUpdates.push(field);
- addressUpdated = true;
- }
- });
-
- if (addressUpdated) {
- await ShippingAddress.updateOne(
- { user: distributor._id },
- addressData
- );
- if (addressUpdates.length > 0) {
- updatedFields.push(
- `Address fields: ${addressUpdates.join(", ")}`
+ if (addressUpdated) {
+ await ShippingAddress.updateOne(
+ { user: distributor._id },
+ addressData
);
+ if (addressUpdates.length > 0) {
+ updatedFields.push(
+ `Address fields: ${addressUpdates.join(", ")}`
+ );
+ }
}
+ } else {
+ // Create new address
+ await ShippingAddress.create(addressData);
+ updatedFields.push("New address created");
+ }
+ // Add to updatedDistributors only if there are updated fields
+ if (updatedFields.length > 0) {
+ updatedDistributors.push({
+ ...distributor._doc,
+ updatedFields: updatedFields.join(", "),
+ });
}
} else {
- // Create new address
- await ShippingAddress.create(addressData);
- updatedFields.push("New address created");
- }
-
- // Add to updatedDistributors only if there are updated fields
- if (updatedFields.length > 0) {
- updatedDistributors.push({
- ...distributor._doc,
- updatedFields: updatedFields.join(", "),
+ // Both exist but refer to different users
+ errors.push({
+ uniqueId: item.uniqueId || "N/A",
+ SBU: item.SBU || "N/A",
+ name: item.name || "N/A",
+ email: item.email || "N/A",
+ phone: item.phone || "N/A",
+ panNumber: item.panNumber || "N/A",
+ gstNumber: item.gstNumber || "N/A",
+ message: ` Employee Code (${distributorbyid.uniqueId}) is refer to (${distributorbyid.name}) and Email ID (${distributorbymail.mobileNumber}) refer to (${distributorbymail.name}) Principal Distributor. Please provide the correct employee code or Email ID.`,
});
}
+ } else if (distributorbyid) {
+ // Case 2: uniqueId exists, but Email is new
+ distributorbyid.email = item.email;
+ await distributorbyid.save();
+ updatedDistributors.push({
+ ...distributor._doc,
+ updatedFields: "Email",
+ });
+ } else if (distributorbymail) {
+ // Case 3: Email exists, but uniqueId is new
+ errors.push({
+ uniqueId: item.uniqueId || "N/A",
+ SBU: item.SBU || "N/A",
+ name: item.name || "N/A",
+ email: item.email || "N/A",
+ phone: item.phone || "N/A",
+ panNumber: item.panNumber || "N/A",
+ gstNumber: item.gstNumber || "N/A",
+ message: `Email already exists for Employee Code (${distributorbymail.uniqueId})`,
+ });
} else {
// Create a new user
distributor = new User({
diff --git a/resources/user/userModel.js b/resources/user/userModel.js
index 67d14a1..92a2bb0 100644
--- a/resources/user/userModel.js
+++ b/resources/user/userModel.js
@@ -41,6 +41,7 @@ const userSchema = new mongoose.Schema(
},
email: {
type: String,
+ unique: true,
required: [true, "Please Enter Your Email"],
validate: [validator.isEmail, "Please Enter a valid Email"],
},