This commit is contained in:
ROSHAN GARG 2024-10-16 12:47:39 +05:30
commit b842f3b72b
26 changed files with 697 additions and 101 deletions

3
app.js
View File

@ -169,6 +169,7 @@ import ConfigRouter from "./resources/setting/Configration/Config_routes.js";
//specialties //specialties
import SpecialtiesRouter from "./resources/Specialties/SpecialtiesRoute.js"; import SpecialtiesRouter from "./resources/Specialties/SpecialtiesRoute.js";
import ShippingAddressRoute from "./resources/ShippingAddresses/ShippingAddressRoute.js"; import ShippingAddressRoute from "./resources/ShippingAddresses/ShippingAddressRoute.js";
import RdShippingAddressRoute from "./resources/ShippingAddressesRD/RDShippingAddressRoute.js";
import stripeRoute from "./resources/StripePayment/stripeRoute.js"; import stripeRoute from "./resources/StripePayment/stripeRoute.js";
import SeoRoute from "./resources/SEO&Analytics/SEORouter.js"; import SeoRoute from "./resources/SEO&Analytics/SEORouter.js";
@ -230,6 +231,8 @@ app.use("/api/content", ContentRoute);
// User Address // User Address
app.use("/api/user-address", UserAddressRoute); app.use("/api/user-address", UserAddressRoute);
app.use("/api/shipping/address", ShippingAddressRoute); app.use("/api/shipping/address", ShippingAddressRoute);
//Shipping Address of RD
app.use("/api/rd/shipping/address", RdShippingAddressRoute);
//SalesCoOrdinator Routes //SalesCoOrdinator Routes
app.use("/api/salescoordinator", SalesCoOrdinatorRoute); app.use("/api/salescoordinator", SalesCoOrdinatorRoute);
// Kyc Routes // Kyc Routes

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Binary file not shown.

View File

@ -9,6 +9,7 @@ import { Notification } from "../Notification/notificationModal.js";
import RetailDistributor from "../RetailDistributor/RetailDistributorModel.js"; import RetailDistributor from "../RetailDistributor/RetailDistributorModel.js";
import { generatePassword } from "../../Utils/generatepassword.js"; import { generatePassword } from "../../Utils/generatepassword.js";
import sendEmail, { sendOtp } from "../../Utils/sendEmail.js"; import sendEmail, { sendOtp } from "../../Utils/sendEmail.js";
import ShippingAddressRD from "../ShippingAddressesRD/RDShippingAddressModel.js";
export const createKyc = async (req, res) => { export const createKyc = async (req, res) => {
const { const {
name, name,
@ -244,7 +245,22 @@ export const createretaildistributor = async (req, res) => {
password, password,
}; };
const retailDistributor = new RetailDistributor(retailDistributorData); const retailDistributor = new RetailDistributor(retailDistributorData);
await retailDistributor.save(); const newRd = await retailDistributor.save();
// Now create the address for the new user
const addressData = {
Name: name,
phoneNumber: mobile_number,
street: address,
city: city,
state: state,
postalCode: pincode,
district: district,
country: "India", // Default country
tradeName: trade_name,
user: newRd._id, // Use the saved user's ID
isDefault: true,
};
await ShippingAddressRD.create(addressData);
// Send email with the new password // Send email with the new password
await sendEmail({ await sendEmail({
to: `${email}`, // Change to your recipient to: `${email}`, // Change to your recipient
@ -442,8 +458,22 @@ export const updateKycStatus = async (req, res) => {
}; };
const retailDistributor = new RetailDistributor(retailDistributorData); const retailDistributor = new RetailDistributor(retailDistributorData);
await retailDistributor.save(); const newRd = await retailDistributor.save();
// Now create the address for the new user
const addressData = {
Name: kyc.name,
phoneNumber: kyc.mobile_number,
street: kyc.address,
city: kyc.city,
state: kyc.state,
postalCode: kyc.pincode,
district: kyc.district,
country: "India", // Default country
tradeName: kyc.trade_name,
user: newRd._id, // Use the saved user's ID
isDefault: true,
};
await ShippingAddressRD.create(addressData);
// Send email with the new password // Send email with the new password
await sendEmail({ await sendEmail({
to: kyc.email, to: kyc.email,

View File

@ -110,9 +110,8 @@ export const createOrderCheckout = async (req, res) => {
})); }));
let addss = await ShippingAddress.findById(address); let addss = await ShippingAddress.findById(address);
let shipping = { let shipping = {
first_Name: addss.first_Name, Name: addss.Name,
last_Name: addss.last_Name, phoneNumber: addss.phoneNumber,
phone_Number: addss.phone_Number,
street: addss.street, street: addss.street,
city: addss.city, city: addss.city,
state: addss.state, state: addss.state,

View File

@ -43,9 +43,8 @@ export const poscreateOrderCheckout = async (req, res) => {
let addss = await ShippingAddress.findById(address); let addss = await ShippingAddress.findById(address);
let shipping = { let shipping = {
first_Name: addss.first_Name, Name: addss.Name,
last_Name: addss?.last_Name, phoneNumber: addss?.phoneNumber,
phone_Number: addss?.phone_Number,
street: addss?.street, street: addss?.street,
city: addss?.city, city: addss?.city,
state: addss?.state, state: addss?.state,

View File

@ -180,9 +180,8 @@ export const checkout = async (req, res) => {
let addss = await ShippingAddress.findById(address); let addss = await ShippingAddress.findById(address);
let shipping = { let shipping = {
first_Name: addss.first_Name, Name: addss.Name,
last_Name: addss?.last_Name, phoneNumber: addss?.phoneNumber,
phone_Number: addss?.phone_Number,
street: addss?.street, street: addss?.street,
city: addss?.city, city: addss?.city,
state: addss?.state, state: addss?.state,
@ -662,9 +661,8 @@ export const handlePayment = async (req, res) => {
let addss = await ShippingAddress.findById(address); let addss = await ShippingAddress.findById(address);
// console.log(addss?.postalCode); // console.log(addss?.postalCode);
let shipping = { let shipping = {
first_Name: addss.first_Name, Name: addss.Name,
last_Name: addss.last_Name, phoneNumber: addss.phoneNumber,
phone_Number: addss.phone_Number,
street: addss.street, street: addss.street,
city: addss.city, city: addss.city,
state: addss.state, state: addss.state,

View File

@ -51,9 +51,8 @@ export const handlePayment = async (req, res) => {
let addss = await ShippingAddress.findById(address); let addss = await ShippingAddress.findById(address);
let shipping = { let shipping = {
first_Name: addss.first_Name, Name: addss.Name,
last_Name: addss.last_Name, phoneNumber: addss.phoneNumber,
phone_Number: addss.phone_Number,
street: addss.street, street: addss.street,
city: addss.city, city: addss.city,
state: addss.state, state: addss.state,

View File

@ -73,6 +73,10 @@ export const uploadProducts = async (req, res) => {
for (let i = 1; i < data.length; i++) { for (let i = 1; i < data.length; i++) {
const row = data[i]; const row = data[i];
// Skip the row if it's completely empty
if (row.every((cell) => cell === undefined || cell === "")) {
continue;
}
const item = {}; const item = {};
headers.forEach((header, index) => { headers.forEach((header, index) => {
@ -83,7 +87,9 @@ export const uploadProducts = async (req, res) => {
}); });
// Check if the row has meaningful data, skip if it's mostly empty // Check if the row has meaningful data, skip if it's mostly empty
const hasValidData = Object.values(item).some((value) => value && value.trim()); const hasValidData = Object.values(item).some(
(value) => value && value.trim()
);
if (!hasValidData) { if (!hasValidData) {
continue; continue;
} }

View File

@ -10,6 +10,7 @@ import { generatePassword } from "../../Utils/generatepassword.js";
import XLSX from "xlsx"; import XLSX from "xlsx";
import fs from "fs"; import fs from "fs";
import path from "path"; import path from "path";
import ShippingAddressRD from "../ShippingAddressesRD/RDShippingAddressModel.js";
export const uploadRetaildistributors = async (req, res) => { export const uploadRetaildistributors = async (req, res) => {
try { try {
@ -76,6 +77,10 @@ export const uploadRetaildistributors = async (req, res) => {
for (let i = 1; i < data.length; i++) { for (let i = 1; i < data.length; i++) {
const row = data[i]; const row = data[i];
// Skip the row if it's completely empty
if (row.every((cell) => cell === undefined || cell === "")) {
continue;
}
const item = {}; const item = {};
headers.forEach((header, index) => { headers.forEach((header, index) => {
@ -179,10 +184,31 @@ export const uploadRetaildistributors = async (req, res) => {
let Retaildistributor = await RetailDistributor.findOne({ let Retaildistributor = await RetailDistributor.findOne({
email: item.email, email: item.email,
}); });
let existingAddress = await ShippingAddressRD.findOne({
user: Retaildistributor?._id,
isDefault: true,
}).exec();
if (!existingAddress) {
existingAddress = await ShippingAddressRD.findOne({
user: Retaildistributor?._id,
})
.sort({ createdAt: 1 })
.exec();
}
if (Kyc) { if (Kyc) {
// Track updated fields // Track updated fields
const updatedFields = []; const updatedFields = [];
const addressFields = [
"Name",
"phoneNumber",
"state",
"city",
"street",
"tradeName",
"postalCode",
"district",
];
// Check for changes in user details // Check for changes in user details
let kycUpdated = false; let kycUpdated = false;
for (let field in item) { for (let field in item) {
@ -193,17 +219,50 @@ export const uploadRetaildistributors = async (req, res) => {
updatedFields.push(field); updatedFields.push(field);
Kyc[field] = item[field]; // Update Kyc with the new value Kyc[field] = item[field]; // Update Kyc with the new value
if (Retaildistributor && field !== 'email') { if (Retaildistributor && field !== "email") {
Retaildistributor[field] = item[field]; Retaildistributor[field] = item[field];
} }
kycUpdated = true; kycUpdated = true;
} }
} }
// Update Kyc and Retaildistributor if there are any changes // Update Kyc and Retaildistributor if there are any changes
if (kycUpdated) { if (kycUpdated) {
await Kyc.save(); await Kyc.save();
await Retaildistributor.save(); await Retaildistributor.save();
// Check for changes in address details
const addressData = {
Name: item.name,
phoneNumber: item.mobile_number.toString(),
street: item.address,
city: item.city,
state: item.state,
postalCode: item.pincode,
district: item.district,
country: "India", // Default country
tradeName: item.trade_name,
user: Retaildistributor._id,
};
console.log(addressData);
let addressUpdated = false;
if (existingAddress) {
const addressUpdates = [];
addressFields.forEach((field) => {
if (existingAddress[field] !== addressData[field]) {
addressUpdates.push(field);
addressUpdated = true;
}
});
if (addressUpdated) {
await ShippingAddressRD.updateOne(
{ user: Retaildistributor._id },
addressData
);
}
} else {
// Create new address
await ShippingAddressRD.create(addressData);
}
updatedDistributors.push({ updatedDistributors.push({
...Kyc._doc, ...Kyc._doc,
updatedFields: updatedFields.join(", "), updatedFields: updatedFields.join(", "),
@ -224,7 +283,22 @@ export const uploadRetaildistributors = async (req, res) => {
password, password,
}; };
Retaildistributor = new RetailDistributor(retailDistributorData); Retaildistributor = new RetailDistributor(retailDistributorData);
await Retaildistributor.save(); const newRd = await Retaildistributor.save();
// Now create the address for the new user
const addressData = {
Name: item.name,
phoneNumber: item.mobile_number.toString(),
street: item.address,
city: item.city,
state: item.state,
postalCode: item.pincode,
district: item.district,
country: "India", // Default country
tradeName: item.trade_name,
user: newRd._id, // Use the saved user's ID
isDefault: true,
};
await ShippingAddressRD.create(addressData);
// Send email with the new password // Send email with the new password
await sendEmail({ await sendEmail({
to: `${item.email}`, // Change to your recipient to: `${item.email}`, // Change to your recipient

View File

@ -2,28 +2,17 @@ import ShippingAddress from "./ShippingAddressModel.js";
export const AddshippingAddress = async (req, res) => { export const AddshippingAddress = async (req, res) => {
// console.log("request came here"); // console.log("request came here");
try { try {
const { const { Name, phoneNumber, street, city, state, postalCode, country } =
first_Name, req.body;
last_Name,
phone_Number,
street,
city,
state,
postalCode,
country,
} = req.body;
// console.log(req.body); // console.log(req.body);
switch (true) { switch (true) {
//validation //validation
case !first_Name: { case !Name: {
return res.status(404).json({ msg: "please provide first_Name" }); return res.status(404).json({ msg: "please provide Name" });
} }
case !last_Name: { case !phoneNumber: {
return res.status(404).json({ msg: "please provide last_Name" }); return res.status(404).json({ msg: "please provide phoneNumber" });
}
case !phone_Number: {
return res.status(404).json({ msg: "please provide phone_Number" });
} }
case !street: { case !street: {
return res.status(404).json({ msg: "please provide street" }); return res.status(404).json({ msg: "please provide street" });
@ -60,6 +49,8 @@ export const AddshippingAddress = async (req, res) => {
export const AddshippingAddressByAdmin = async (req, res) => { export const AddshippingAddressByAdmin = async (req, res) => {
try { try {
const { const {
Name,
phoneNumber,
street, street,
city, city,
state, state,
@ -68,15 +59,20 @@ export const AddshippingAddressByAdmin = async (req, res) => {
panNumber, panNumber,
tradeName, tradeName,
gstNumber, gstNumber,
isDefault,
} = req.body; } = req.body;
// Validate required fields // Validate required fields
if (!street || !city || !state || !postalCode || !panNumber) { if (!Name || !phoneNumber || !street || !city || !state || !postalCode || !panNumber) {
return res.status(400).json({ msg: "Please provide all required fields" }); return res
.status(400)
.json({ msg: "Please provide all required fields: Name, phone number, street, city, state, postal code, and PAN number" });
} }
// Create shipping address object // Create new shipping address
const newAddress = await ShippingAddress.create({ const newAddress = await ShippingAddress.create({
Name,
phoneNumber,
street, street,
city, city,
state, state,
@ -86,26 +82,36 @@ export const AddshippingAddressByAdmin = async (req, res) => {
tradeName, tradeName,
gstNumber, gstNumber,
user: req.params._id, // Assuming req.params._id contains the correct user ID user: req.params._id, // Assuming req.params._id contains the correct user ID
isDefault,
}); });
// If this address is marked as default, set all other addresses for this user to isDefault: false
if (isDefault) {
await ShippingAddress.updateMany(
{ user: req.params._id, _id: { $ne: newAddress._id } }, // Exclude the new address
{ $set: { isDefault: false } }
);
}
// Respond with success
res.status(201).json({ res.status(201).json({
success: true, success: true,
address: newAddress, address: newAddress,
message: "Shipping address added successfully", message: "Shipping address added successfully",
}); });
} catch (error) { } catch (error) {
// console.error("Error creating shipping address:", error.message);
// Check for validation errors // Check for validation errors
if (error.name === 'ValidationError') { if (error.name === "ValidationError") {
const errorMessages = Object.values(error.errors).map(err => err.message); const errorMessages = Object.values(error.errors).map(
(err) => err.message
);
return res.status(400).json({ return res.status(400).json({
success: false, success: false,
message: errorMessages.join(", "), message: errorMessages.join(", "),
}); });
} }
// General error // General error response
res.status(500).json({ res.status(500).json({
success: false, success: false,
message: error.message || "Something went wrong", message: error.message || "Something went wrong",
@ -164,13 +170,14 @@ export const deleteSelfShippingAddress = async (req, res) => {
.status(400) .status(400)
.json({ message: "please Provide shipping Address Id" }); .json({ message: "please Provide shipping Address Id" });
const getselfAddress = await ShippingAddress.findById(req.params.id); const getselfAddress = await ShippingAddress.findById(req.params.id);
const userId = req.body.userId ? req.body.userId : req.user._id;
if (!getselfAddress) { if (!getselfAddress) {
return res.status(404).json({ return res.status(404).json({
success: false, success: false,
message: "No shipping Address Found!", message: "No shipping Address Found!",
}); });
} }
if (getselfAddress?.user.toString() === req.user._id.toString()) { if (getselfAddress?.user.toString() === userId.toString()) {
const address = await ShippingAddress.findByIdAndDelete(req.params.id); const address = await ShippingAddress.findByIdAndDelete(req.params.id);
await address.remove(); await address.remove();
return res.status(200).json({ return res.status(200).json({
@ -195,21 +202,25 @@ export const deleteSelfShippingAddress = async (req, res) => {
export const updateShippingAddress = async (req, res) => { export const updateShippingAddress = async (req, res) => {
try { try {
const { const {
first_Name, Name,
last_Name, phoneNumber,
phone_Number,
street, street,
city, city,
state, state,
postalCode, postalCode,
country, country,
panNumber,
tradeName,
gstNumber,
isDefault,
} = req.body; } = req.body;
// console.log(req.body);
const _id = req.params.id; const _id = req.params.id;
if (!req.params.id) if (!req.params.id)
return res return res
.status(400) .status(400)
.json({ message: "please Provide shipping Address Id" }); .json({ message: "please Provide shipping Address Id" });
const getselfAddress = await ShippingAddress.findById(req.params.id); const getselfAddress = await ShippingAddress.findById(_id);
if (!getselfAddress) { if (!getselfAddress) {
return res.status(404).json({ return res.status(404).json({
success: false, success: false,
@ -218,13 +229,10 @@ export const updateShippingAddress = async (req, res) => {
} }
switch (true) { switch (true) {
//validation //validation
case !first_Name: { case !Name: {
return res.status(404).json({ msg: "please provide first_Name" }); return res.status(404).json({ msg: "please provide Name" });
} }
case !last_Name: { case !phoneNumber: {
return res.status(404).json({ msg: "please provide last_Name" });
}
case !phone_Number: {
return res.status(404).json({ msg: "please provide phone_Number" }); return res.status(404).json({ msg: "please provide phone_Number" });
} }
case !street: { case !street: {
@ -242,16 +250,36 @@ export const updateShippingAddress = async (req, res) => {
case !country: { case !country: {
return res.status(404).json({ msg: "please provide country" }); return res.status(404).json({ msg: "please provide country" });
} }
case !panNumber: {
return res.status(404).json({ msg: "please provide panNumber" });
}
case !tradeName: {
return res.status(404).json({ msg: "please provide tradeName" });
}
case !gstNumber: {
return res.status(404).json({ msg: "please provide gstNumber" });
}
} }
// If the updated address is marked as default, update all other addresses to isDefault: false
if (isDefault) {
await ShippingAddress.updateMany(
{ user: getselfAddress.user, _id: { $ne: _id } }, // exclude current address
{ $set: { isDefault: false } }
);
}
const updateAddressData = { const updateAddressData = {
first_Name, Name,
last_Name, phoneNumber,
phone_Number,
street, street,
city, city,
state, state,
postalCode, postalCode,
country, country,
panNumber,
tradeName,
gstNumber,
isDefault,
}; };
const updateShippingAddress = await ShippingAddress.findByIdAndUpdate( const updateShippingAddress = await ShippingAddress.findByIdAndUpdate(
{ _id: _id }, { _id: _id },

View File

@ -2,10 +2,7 @@ import mongoose from "mongoose";
const shippingAddressSchema = new mongoose.Schema( const shippingAddressSchema = new mongoose.Schema(
{ {
firstName: { Name: {
type: String,
},
lastName: {
type: String, type: String,
}, },
phoneNumber: { phoneNumber: {

View File

@ -0,0 +1,339 @@
import ShippingAddressRD from "./RDShippingAddressModel.js";
export const AddshippingAddress = async (req, res) => {
// console.log("request came here");
try {
const {
Name,
phoneNumber,
street,
city,
state,
postalCode,
country,
district,
} = req.body;
// console.log(req.body);
switch (true) {
//validation
case !Name: {
return res.status(404).json({ msg: "please provide Name" });
}
case !phoneNumber: {
return res.status(404).json({ msg: "please provide phoneNumber" });
}
case !street: {
return res.status(404).json({ msg: "please provide street" });
}
case !city: {
return res.status(404).json({ msg: "please provide city" });
}
case !state: {
return res.status(404).json({ msg: "please provide state" });
}
case !postalCode: {
return res.status(404).json({ msg: "please provide postalCode" });
}
case !country: {
return res.status(404).json({ msg: "please provide country" });
}
case !tradeName: {
return res.status(404).json({ msg: "please provide tradeName" });
}
case !district: {
return res.status(404).json({ msg: "please provide district" });
}
}
req.body.user = req.user._id;
const address = await ShippingAddressRD.create(req.body);
res.status(201).json({
success: true,
address,
message: "shipping Address Added",
});
} catch (error) {
console.log(error.message);
res.status(500).json({
success: false,
message: error.message ? error.message : "Something went Wrong",
});
}
};
export const AddshippingAddressByAdmin = async (req, res) => {
try {
const {
Name,
phoneNumber,
street,
district,
city,
state,
postalCode,
country,
tradeName,
isDefault,
} = req.body;
// Validate required fields
if (
!Name ||
!phoneNumber ||
!street ||
!city ||
!state ||
!postalCode ||
!tradeName ||
!district
) {
return res
.status(400)
.json({
msg: "Please provide all required fields: Name, phone number, street, city, state, postal code, district and tradeName",
});
}
// Create new shipping address
const newAddress = await ShippingAddressRD.create({
Name,
phoneNumber,
street,
district,
city,
state,
postalCode,
country,
tradeName,
user: req.params._id,
isDefault,
});
// If this address is marked as default, set all other addresses for this user to isDefault: false
if (isDefault) {
await ShippingAddressRD.updateMany(
{ user: req.params._id, _id: { $ne: newAddress._id } }, // Exclude the new address
{ $set: { isDefault: false } }
);
}
// Respond with success
res.status(201).json({
success: true,
address: newAddress,
message: "Shipping address added successfully",
});
} catch (error) {
// Check for validation errors
if (error.name === "ValidationError") {
const errorMessages = Object.values(error.errors).map(
(err) => err.message
);
return res.status(400).json({
success: false,
message: errorMessages.join(", "),
});
}
// General error response
res.status(500).json({
success: false,
message: error.message || "Something went wrong",
});
}
};
// For website
export const getSingleUserSippingAddress = async (req, res) => {
try {
const UserShippingAddress = await ShippingAddressRD.find({
user: req.user._id,
}).sort({ createdAt: -1 });
if (UserShippingAddress) {
res.status(201).json({
success: true,
UserShippingAddress,
message: "All User Shipping Address Fetched",
});
}
} catch (error) {
res.status(500).json({
success: false,
message: error.message ? error.message : "Something went Wrong",
});
}
};
// For Admin
export const getSingleUserSippingAddressForAdmin = async (req, res) => {
try {
// console.log(req.params._id);
const UserShippingAddress = await ShippingAddressRD.find({
user: req.params._id,
}).sort({ createdAt: -1 });
// console.log(UserShippingAddress);
if (UserShippingAddress) {
res.status(201).json({
success: true,
UserShippingAddress,
message: "All User Shipping Address Fetched",
});
}
} catch (error) {
res.status(500).json({
success: false,
message: error.message ? error.message : "Something went Wrong",
});
}
};
///
export const deleteSelfShippingAddress = async (req, res) => {
try {
if (!req.params.id)
return res
.status(400)
.json({ message: "please Provide shipping Address Id" });
const getselfAddress = await ShippingAddressRD.findById(req.params.id);
const userId = req.body.userId ? req.body.userId : req.user._id;
if (!getselfAddress) {
return res.status(404).json({
success: false,
message: "No shipping Address Found!",
});
}
if (getselfAddress?.user.toString() === userId.toString()) {
const address = await ShippingAddressRD.findByIdAndDelete(req.params.id);
await address.remove();
return res.status(200).json({
success: true,
message: "Shipping Address Deleted Successfully!",
});
} else {
return res.status(400).json({
success: false,
message: "you can only delete self shipping address!!",
});
}
} catch (error) {
res.status(500).json({
success: false,
message: error.message ? error.message : "Something went Wrong",
});
}
};
// update shipping addresss
export const updateShippingAddress = async (req, res) => {
try {
const {
Name,
phoneNumber,
street,
city,
district,
state,
postalCode,
country,
tradeName,
isDefault,
} = req.body;
// console.log(req.body);
const _id = req.params.id;
if (!req.params.id)
return res
.status(400)
.json({ message: "please Provide shipping Address Id" });
const getselfAddress = await ShippingAddressRD.findById(_id);
if (!getselfAddress) {
return res.status(404).json({
success: false,
message: "No shipping Address Found!",
});
}
switch (true) {
//validation
case !Name: {
return res.status(404).json({ msg: "please provide Name" });
}
case !phoneNumber: {
return res.status(404).json({ msg: "please provide phone_Number" });
}
case !street: {
return res.status(404).json({ msg: "please provide street" });
}
case !city: {
return res.status(404).json({ msg: "please provide city" });
}
case !state: {
return res.status(404).json({ msg: "please provide state" });
}
case !postalCode: {
return res.status(404).json({ msg: "please provide postalCode" });
}
case !country: {
return res.status(404).json({ msg: "please provide country" });
}
case !tradeName: {
return res.status(404).json({ msg: "please provide tradeName" });
}
case !district: {
return res.status(404).json({ msg: "please provide district" });
}
}
// If the updated address is marked as default, update all other addresses to isDefault: false
if (isDefault) {
await ShippingAddressRD.updateMany(
{ user: getselfAddress.user, _id: { $ne: _id } }, // exclude current address
{ $set: { isDefault: false } }
);
}
const updateAddressData = {
Name,
phoneNumber,
street,
district,
city,
state,
postalCode,
country,
tradeName,
isDefault,
};
const updateShippingAddress = await ShippingAddressRD.findByIdAndUpdate(
{ _id: _id },
{ $set: updateAddressData },
{ new: true }
);
res.status(201).json({
success: true,
updateShippingAddress,
message: "Shipping Address updated",
});
} catch (error) {
res.status(500).json({
success: false,
message: error.message ? error.message : "Something went Wrong",
});
}
};
export const getSingleSippingAddress = async (req, res) => {
try {
let _id = req.params.id;
const address = await ShippingAddressRD.findById({ _id: _id });
if (address) {
res.status(201).json({
success: true,
address,
message: "Shipping Address Fetched",
});
}
} catch (error) {
res.status(500).json({
success: false,
message: error.message ? error.message : "Something went Wrong",
});
}
};

View File

@ -0,0 +1,62 @@
import mongoose from "mongoose";
const shippingAddressSchema = new mongoose.Schema(
{
Name: {
type: String,
},
phoneNumber: {
type: Number,
},
street: {
type: String,
required: true,
},
district: {
type: String,
required: true,
},
city: {
type: String,
required: true,
trim: true,
},
state: {
type: String,
required: true,
},
postalCode: {
type: String,
required: true,
trim: true,
validate: {
validator: function (v) {
return /^\d{6}$/.test(v);
},
message: "Postal code must be a 6-digit number",
},
},
country: {
type: String,
required: true,
},
tradeName: {
type: String,
required: true,
},
isDefault: {
type: Boolean,
default: false,
},
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "RetailDistributor",
required: true,
},
},
{ timestamps: true, versionKey: false }
);
const ShippingAddressRD = mongoose.model("ShippingAddressRD", shippingAddressSchema);
export default ShippingAddressRD;

View File

@ -0,0 +1,43 @@
import express from "express";
import {
AddshippingAddress,
getSingleUserSippingAddress,
deleteSelfShippingAddress,
getSingleUserSippingAddressForAdmin,
updateShippingAddress,
getSingleSippingAddress,
AddshippingAddressByAdmin,
} from "./RDShippingAddressController.js";
import { authorizeRoles, isAuthenticatedUser } from "../../middlewares/auth.js";
import { isAuthenticatedRD } from "../../middlewares/rdAuth.js";
const router = express.Router();
router.route("/new").post(isAuthenticatedRD, AddshippingAddress);
router
.route("/admin/new/:_id")
.post(
isAuthenticatedUser,
authorizeRoles("admin"),
AddshippingAddressByAdmin
);
router
.route("/user/address/")
.get(isAuthenticatedUser, getSingleUserSippingAddress);
router.route("/").get(isAuthenticatedRD, getSingleUserSippingAddress);
router
.route("/user/address/:_id")
.get(
isAuthenticatedUser,
authorizeRoles("admin"),
getSingleUserSippingAddressForAdmin
);
router
.route("/delete/:id")
.delete(isAuthenticatedUser, deleteSelfShippingAddress);
router.route("/update/:id").patch(isAuthenticatedUser, updateShippingAddress);
router.route("/get/:id").get(isAuthenticatedUser, getSingleSippingAddress);
export default router;

View File

@ -5,7 +5,7 @@ import { RDStock } from "./RdStockModel.js";
export const getProductsAndStockByPD = async (req, res) => { export const getProductsAndStockByPD = async (req, res) => {
try { try {
const { userId } = req.params; const userId = req.params.userId || req.user._id;
// Pagination parameters // Pagination parameters
const PAGE_SIZE = parseInt(req.query.show) || 10; const PAGE_SIZE = parseInt(req.query.show) || 10;

View File

@ -10,7 +10,6 @@ const router = express.Router();
router.get( router.get(
"/pd/stock/:userId", "/pd/stock/:userId",
isAuthenticatedUser, isAuthenticatedUser,
authorizeRoles("admin"),
getProductsAndStockByPD getProductsAndStockByPD
); );
router.get( router.get(

View File

@ -182,25 +182,38 @@ export const getTasksByDates = async (req, res) => {
try { try {
await updateOverdueTasks(); await updateOverdueTasks();
// Initialize filter object
const filter = {};
console.log(req.userType);
// Determine the filter based on user type
if (req.userType === "SalesCoOrdinator") {
filter.taskAssignedTo = req.user._id; // Use `=` to assign values, and `===` for comparison
} else {
filter.taskAssignedBy = req.user._id;
}
// Get the date from the query // Get the date from the query
const { Date: queryDate } = req.query; const { Date: queryDate } = req.query;
let taskDate; let taskDate;
// If date is provided in query, parse it, otherwise use today's date
// If date is provided in query, parse it; otherwise, use today's date
if (queryDate) { if (queryDate) {
taskDate = parseDate(queryDate); taskDate = parseDate(queryDate);
} else { } else {
// Get today's date in UTC // Get today's date in UTC
taskDate = new Date(); taskDate = new Date();
} }
// Get the start and end of the day in UTC // Get the start and end of the day in UTC
const { startOfDay, endOfDay } = getStartAndEndOfDay(taskDate); const { startOfDay, endOfDay } = getStartAndEndOfDay(taskDate);
// Find tasks for the user, filtered by createdAt within the start and end of the day // Find tasks for the user, filtered by createdAt within the start and end of the day
const tasks = await Task.find({ const tasks = await Task.find({
taskAssignedBy: req.user._id, ...filter, // Use the filter object for querying
createdAt: { $gte: startOfDay, $lte: endOfDay }, createdAt: { $gte: startOfDay, $lte: endOfDay },
}) })
.populate({ .populate({
path: "taskAssignedTo", path: req.userType === "SalesCoOrdinator" ? "taskAssignedBy" : "taskAssignedTo", // Change path based on user type
select: "name mobileNumber email", select: "name mobileNumber email",
}) })
.sort({ createdAt: -1 }); .sort({ createdAt: -1 });

View File

@ -9,37 +9,22 @@ import {
} from "./TaskController.js"; } from "./TaskController.js";
import { isAuthenticatedSalesCoOrdinator } from "../../middlewares/SalesCoOrdinatorAuth.js"; import { isAuthenticatedSalesCoOrdinator } from "../../middlewares/SalesCoOrdinatorAuth.js";
import { isAuthenticatedTerritoryManager } from "../../middlewares/TerritoryManagerAuth.js"; import { isAuthenticatedTerritoryManager } from "../../middlewares/TerritoryManagerAuth.js";
import { isAuthenticated_SC_TM } from "../../middlewares/generalAuth.js";
const router = express.Router(); const router = express.Router();
// Route for Territory Manager to assign a task // Route for Territory Manager to assign a task
router.post( router.post("/assign-task", isAuthenticatedTerritoryManager, assignTask);
"/assign-task",
isAuthenticatedTerritoryManager,
assignTask
);
// Route for Sales Coordinator to view their tasks by status // Route for Sales Coordinator to view their tasks by status
router.get( router.get("/tasks/:status", isAuthenticatedSalesCoOrdinator, getTasksByStatus);
"/tasks/:status",
isAuthenticatedSalesCoOrdinator,
getTasksByStatus
);
router.get( router.get(
"/alltasks/:status", "/alltasks/:status",
isAuthenticatedTerritoryManager, isAuthenticatedTerritoryManager,
getAllTasksByStatus getAllTasksByStatus
); );
router.get( router.get("/alltask", isAuthenticated_SC_TM, getTasksByDates);
"/alltask", router.get("/task/type/:task", isAuthenticatedSalesCoOrdinator, getTasksbytask);
isAuthenticatedTerritoryManager,
getTasksByDates
);
router.get(
"/task/type/:task",
isAuthenticatedSalesCoOrdinator,
getTasksbytask
);
// Route to update task status // Route to update task status
router.put( router.put(
"/update-task-status/:taskId", "/update-task-status/:taskId",

View File

@ -394,6 +394,10 @@ export const uploadPrincipaldistributors = async (req, res) => {
for (let i = 1; i < data.length; i++) { for (let i = 1; i < data.length; i++) {
const row = data[i]; const row = data[i];
// Skip the row if it's completely empty
if (row.every((cell) => cell === undefined || cell === "")) {
continue;
}
const item = {}; const item = {};
headers.forEach((header, index) => { headers.forEach((header, index) => {
@ -495,6 +499,8 @@ export const uploadPrincipaldistributors = async (req, res) => {
// Track updated fields // Track updated fields
const updatedFields = []; const updatedFields = [];
const addressFields = [ const addressFields = [
"Name",
"phoneNumber",
"panNumber", "panNumber",
"gstNumber", "gstNumber",
"state", "state",
@ -503,9 +509,18 @@ export const uploadPrincipaldistributors = async (req, res) => {
"tradeName", "tradeName",
"postalCode", "postalCode",
]; ];
const existingAddress = await ShippingAddress.findOne({ let existingAddress = await ShippingAddress.findOne({
user: distributor._id, user: distributor._id,
}); isDefault: true,
}).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 // Check for changes in user details
let userUpdated = false; let userUpdated = false;
@ -537,6 +552,8 @@ export const uploadPrincipaldistributors = async (req, res) => {
// Check for changes in address details // Check for changes in address details
const addressData = { const addressData = {
Name: item.name,
phoneNumber: item.phone.toString(),
street: item.street, street: item.street,
city: item.city, city: item.city,
state: item.state, state: item.state,
@ -609,6 +626,8 @@ export const uploadPrincipaldistributors = async (req, res) => {
}); });
// Now create the address for the new user // Now create the address for the new user
const addressData = { const addressData = {
Name: item.name,
phoneNumber: item.phone,
street: item.street, street: item.street,
city: item.city, city: item.city,
state: item.state, state: item.state,
@ -618,6 +637,7 @@ export const uploadPrincipaldistributors = async (req, res) => {
tradeName: item.tradeName, tradeName: item.tradeName,
gstNumber: item.gstNumber, gstNumber: item.gstNumber,
user: distributor._id, // Use the saved user's ID user: distributor._id, // Use the saved user's ID
isDefault: true,
}; };
const newAddress = await ShippingAddress.create(addressData); const newAddress = await ShippingAddress.create(addressData);
@ -1070,7 +1090,7 @@ export const getAllPD = catchAsyncErrors(async (req, res, next) => {
// Aggregate orders data for each user // Aggregate orders data for each user
const orderStats = await PdOrder.aggregate([ const orderStats = await PdOrder.aggregate([
{ $match: { addedBy: { $in: users.map(user => user._id) } } }, // Match orders for the listed distributors { $match: { addedBy: { $in: users.map((user) => user._id) } } }, // Match orders for the listed distributors
{ {
$group: { $group: {
_id: "$addedBy", // Group by addedBy (distributor ID) _id: "$addedBy", // Group by addedBy (distributor ID)
@ -1081,8 +1101,10 @@ export const getAllPD = catchAsyncErrors(async (req, res, next) => {
]); ]);
// Map orders data to corresponding users // Map orders data to corresponding users
const usersWithOrderStats = users.map(user => { const usersWithOrderStats = users.map((user) => {
const orderData = orderStats.find(order => order._id.toString() === user._id.toString()); const orderData = orderStats.find(
(order) => order._id.toString() === user._id.toString()
);
return { return {
...user.toObject(), ...user.toObject(),
totalOrders: orderData ? orderData.totalOrders : 0, totalOrders: orderData ? orderData.totalOrders : 0,
@ -1097,7 +1119,7 @@ export const getAllPD = catchAsyncErrors(async (req, res, next) => {
total_pages: Math.ceil(totalUsers / limit), total_pages: Math.ceil(totalUsers / limit),
}); });
} catch (error) { } catch (error) {
console.error('Error fetching Principal Distributors:', error); console.error("Error fetching Principal Distributors:", error);
res.status(500).json({ message: "Server Error", error }); res.status(500).json({ message: "Server Error", error });
} }
}); });