From c1cf57e0f41645f4e5bd29fc8857878b734dfb9b Mon Sep 17 00:00:00 2001 From: Aakash Date: Fri, 21 Nov 2025 12:56:14 +0530 Subject: [PATCH] added leave route --- .../va/vaLeaves/vaLeavesApply.controller.js | 42 ++++++++++++++++ src/models/vaModel.js | 49 ++++++++++++++++++- 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/controllers/va/vaLeaves/vaLeavesApply.controller.js diff --git a/src/controllers/va/vaLeaves/vaLeavesApply.controller.js b/src/controllers/va/vaLeaves/vaLeavesApply.controller.js new file mode 100644 index 0000000..6f4d28f --- /dev/null +++ b/src/controllers/va/vaLeaves/vaLeavesApply.controller.js @@ -0,0 +1,42 @@ +import jwt from "jsonwebtoken"; +import { VAModel, LeavesModel } from "../../../models/vaModel.js"; + +// Adjust missing hours by creating new records +async function va_leave_apply_function(req, res) { + try { + const accessToken = req.headers.token; + + if (!accessToken) { + return res.status(401).json({ success: false, message: "Missing token" }); + } + + const decoded = jwt.verify(accessToken, process.env.JWT_SECRET_ACCESS_TOKEN); + if (!decoded || !decoded.email) { + return res.status(401).json({ success: false, message: "Invalid token" }); + } + + const vaEmail = decoded.email; + const vaUser = await VAModel.findOne({ "userDetails.email": vaEmail }); + if (!vaUser) { + return res.status(404).json({ success: false, message: "VA not found" }); + } + + const vaId = vaUser._id; + const { dateFrom, dateTo, days, leaveType, comment } = req.body; + + if (!dateFrom || !dateTo || !days || !leaveType || !comment) { + return res.status(400).json({ + success: false, + message: "dateFrom, dateTo, days, leaveType, and comment are required" + }); + } + + + + } catch (error) { + console.error("Leave apply error:", error); + return res.status(500).json({ success: false, message: "Internal Server Error" }); + } +} + +export { va_leave_apply_function }; \ No newline at end of file diff --git a/src/models/vaModel.js b/src/models/vaModel.js index 15dd444..820be1f 100644 --- a/src/models/vaModel.js +++ b/src/models/vaModel.js @@ -423,6 +423,52 @@ const adjustedHoursSchema = new Schema({ }] }, { timestamps: true }); +const leavesSchema = new Schema({ + vaId: { + type: Types.ObjectId, + ref: "VA", + required: true + }, + clientId: { + type: Types.ObjectId, + ref: "Client", + required: true + }, + dateFrom: { + type: Date, + required: true + }, + dateTo: { + type: Date, + required: true + }, + days: { + type: String, + required: true + }, + comment: { + type: String, + required: true + }, + leaveType: { + type: String, + enum: ["SICK", "PTO"], + default: "SICK", + required: true + }, + status: { + type: String, + enum: ["PENDING", "APPROVED", "REJECTED"], + default: "PENDING" + }, + reviewedAt: { + type: Date + }, + rejectionReason: { + type: String // If rejected, store the reason + } +}, { timestamps: true }); + /* ---------------------- Model Exports ---------------------- */ const VAModel = model("VA", vaSchema); const ClientModel = model("Client", clientSchema); @@ -431,5 +477,6 @@ const LoggedModel = model("TrackLog", loggedSchema); const WorkTrackModel = model("TrackWork", vaWorkTrackSchema); const PasswordResetModel = model("PasswordReset", passwordResetSchema); const AdjustedHoursModel = model("AdjustedHours", adjustedHoursSchema); +const LeavesModel = model("Leaves", leavesSchema); -export { VAModel, ClientModel, ProjectModel, LoggedModel, WorkTrackModel, PasswordResetModel, AdjustedHoursModel }; \ No newline at end of file +export { VAModel, ClientModel, ProjectModel, LoggedModel, WorkTrackModel, PasswordResetModel, AdjustedHoursModel, LeavesModel }; \ No newline at end of file