From 768fc3c77fcc1d695e99857edba3befacbedb02f Mon Sep 17 00:00:00 2001 From: Sibunnayak Date: Mon, 26 Aug 2024 12:38:25 +0530 Subject: [PATCH] task updated --- public/uploads/Add-PD.xlsx | Bin 11956 -> 12143 bytes resources/Task/TaskController.js | 30 ++++++++++++++++++++++-------- resources/Task/TaskModel.js | 28 ++++++++++++++++++++++++---- resources/Task/TaskRoute.js | 9 +++++---- resources/user/userController.js | 3 ++- 5 files changed, 53 insertions(+), 17 deletions(-) diff --git a/public/uploads/Add-PD.xlsx b/public/uploads/Add-PD.xlsx index 392272459db814156895474f5fce0b91a650f40e..b7a1ef1cd98b60f326ba2105fb9dd7756cf844bd 100644 GIT binary patch delta 5257 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 delta 5036 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 { addedFor, addedForId, } = req.body; - // console.log(req.body); + const currentYear = new Date().getFullYear().toString().slice(-2); const randomChars = crypto.randomBytes(4).toString("hex").toUpperCase(); const uniqueId = `${currentYear}-${randomChars}`; @@ -22,11 +22,11 @@ export const assignTask = async (req, res) => { taskId: uniqueId, task, note, - taskStatus: "Pending", + taskStatus: "New", taskPriority, taskDueDate, taskAssignedTo, - taskAssignedBy: req.user._id, // The Territory Manager's ID + taskAssignedBy: req.user._id, addedFor, addedForId, }); @@ -44,27 +44,41 @@ export const assignTask = async (req, res) => { } }; -export const getTasksForSalesCoordinator = async (req, res) => { +export const getTasksByStatus = async (req, res) => { try { - const tasks = await Task.find({ taskAssignedTo: req.user._id }); + const { status } = req.params; // This should be "New", "Pending", or "Completed" + + // Validate the provided status + if (!["New", "Pending", "Completed"].includes(status)) { + return res.status(400).json({ + success: false, + message: "Invalid status type provided.", + }); + } + + // Find tasks assigned to the user, filtered by status, and sorted by creation date (newest to oldest) + const tasks = await Task.find({ + taskAssignedTo: req.user._id, + taskStatus: status, + }).sort({ createdAt: -1 }); // Sort by createdAt in descending order (-1 means newest first) res.status(200).json({ success: true, tasks, }); } catch (error) { - res.status(400).json({ + res.status(500).json({ success: false, message: error.message, }); } }; + export const updateTaskStatus = async (req, res) => { try { const { taskId } = req.params; - // Find the task to ensure it belongs to the logged-in Sales Coordinator const task = await Task.findOne({ _id: taskId, taskAssignedTo: req.user._id }); if (!task) { @@ -89,4 +103,4 @@ export const updateTaskStatus = async (req, res) => { message: error.message, }); } -}; \ No newline at end of file +}; diff --git a/resources/Task/TaskModel.js b/resources/Task/TaskModel.js index 50748ce..988d8b5 100644 --- a/resources/Task/TaskModel.js +++ b/resources/Task/TaskModel.js @@ -12,7 +12,7 @@ const TaskSchema = new mongoose.Schema( task: { type: String, required: true, - enum: ["Visit Retailers", "Update Sales Data", "Update Inventory Data", "Collect KYC"], // Restrict to specific tasks + enum: ["Visit Retailers", "Update Sales Data", "Update Inventory Data", "Collect KYC"], }, note: { type: String, @@ -23,17 +23,18 @@ const TaskSchema = new mongoose.Schema( taskStatus: { type: String, required: true, - enum: ["Pending", "In Progress", "Completed"], + enum: ["New", "Pending", "Completed"], + default: "New", }, taskPriority: { type: String, required: true, - enum: ["Low", "Medium", "High"], + enum: ["Low", "Medium", "High"], }, taskDueDate: { type: String, required: true, - match: /^\d{2}\/\d{2}\/\d{4}$/, + match: /^\d{2}\/\d{2}\/\d{4}$/, // e.g., "DD/MM/YYYY" }, taskAssignedTo: { type: mongoose.Schema.Types.ObjectId, @@ -63,6 +64,25 @@ const TaskSchema = new mongoose.Schema( { timestamps: true } ); +// Middleware to update task status based on due date +TaskSchema.pre("save", function (next) { + const currentDate = new Date(); + const [day, month, year] = this.taskDueDate.split("/").map(Number); + const dueDate = new Date(year, month - 1, day); + + // Convert dates to the start of the day for comparison + const currentDateOnly = new Date(currentDate.setHours(0, 0, 0, 0)); + const dueDateOnly = new Date(dueDate.setHours(0, 0, 0, 0)); + + // Check if the current date is after the due date + if (currentDateOnly > dueDateOnly && this.taskStatus === "New") { + this.taskStatus = "Pending"; + } + + next(); +}); + + const Task = mongoose.model("Task", TaskSchema); export default Task; diff --git a/resources/Task/TaskRoute.js b/resources/Task/TaskRoute.js index f080dec..c0eb6ab 100644 --- a/resources/Task/TaskRoute.js +++ b/resources/Task/TaskRoute.js @@ -1,7 +1,7 @@ import express from "express"; import { assignTask, - getTasksForSalesCoordinator, + getTasksByStatus, updateTaskStatus, } from "./TaskController.js"; import { isAuthenticatedSalesCoOrdinator } from "../../middlewares/SalesCoOrdinatorAuth.js"; @@ -16,13 +16,14 @@ router.post( assignTask ); -// Route for Sales Coordinator to view their tasks +// Route for Sales Coordinator to view their tasks by status router.get( - "/tasks", + "/tasks/:status", isAuthenticatedSalesCoOrdinator, - getTasksForSalesCoordinator + getTasksByStatus ); +// Route to update task status router.put( "/update-task-status/:taskId", isAuthenticatedSalesCoOrdinator, diff --git a/resources/user/userController.js b/resources/user/userController.js index 5e64cef..620b722 100644 --- a/resources/user/userController.js +++ b/resources/user/userController.js @@ -955,7 +955,8 @@ export const updateProfile = catchAsyncErrors(async (req, res, next) => { // 9.Get all users(admin) export const getAllUser = catchAsyncErrors(async (req, res, next) => { // Assuming your User model is imported as 'User' - const users = await User.find({ role: "principal-Distributor" }); + const users = await User.find({ role: "principal-Distributor" }) + .sort({ createdAt: -1 }); res.status(200).json({ success: true,