This commit is contained in:
Sibunnayak 2024-10-18 16:08:49 +05:30
parent 136daeab74
commit 3bfc1779c5
5 changed files with 135 additions and 433 deletions

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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.
// <br/>Name: <strong>${item.name}</strong><br/>
// <br/>Mobile Number: <strong>${item.phone}</strong><br/>
// <br/>Password: <strong>${password}</strong><br/><br/>
// <a href="${process.env.PD_APP_URL}/login">Click here to login</a><br/><br/>
// 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({

View File

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