From 15f0f3d782a3029e7e07377ddb7743eedbf0b493 Mon Sep 17 00:00:00 2001 From: =bhagwanSingh Date: Tue, 2 Dec 2025 18:45:28 +0530 Subject: [PATCH] Socke, Time and leave adjustment update --- .../va/vaAuth/vaLogin.controller.js | 82 +++++++++---------- .../va/vaProjects/vaProjectLog.controller.js | 2 +- src/routes/v1/va.routes.js | 5 +- src/server.js | 44 ++++++---- 4 files changed, 72 insertions(+), 61 deletions(-) diff --git a/src/controllers/va/vaAuth/vaLogin.controller.js b/src/controllers/va/vaAuth/vaLogin.controller.js index 7e00699..cff77bc 100644 --- a/src/controllers/va/vaAuth/vaLogin.controller.js +++ b/src/controllers/va/vaAuth/vaLogin.controller.js @@ -42,54 +42,54 @@ async function closePreviousSession(vaId, lastLog) { }); // console.log(`Created logout log: ${logoutLog._id}`); - // try { - // const salesforceUrl = `${process.env.SF_DOCTRACKER_API_URL}services/apexrest/docva/api/va-project-log`; - // const sfDataSync = { - // "_id": logoutLog._id, - // "loggedType": "LOGOUT", - // "vaId": vaId, - // "vaEmail": lastLog.vaEmail, - // "projectId": lastLog.projectId, - // "time": logoutLog.time, - // } + try { + const salesforceUrl = `${process.env.SF_DOCTRACKER_API_URL}services/apexrest/docva/api/va-project-log`; + const sfDataSync = { + "_id": logoutLog._id, + "loggedType": "LOGOUT", + "vaId": vaId, + "vaEmail": lastLog.vaEmail, + "projectId": lastLog.projectId, + "time": logoutLog.time, + } - // const response = await fetch(salesforceUrl, { - // method: 'POST', - // headers: { - // 'Content-Type': 'application/json', - // // Add any required headers for Salesforce authentication - // // 'Authorization': 'Bearer ' + process.env.SF_ACCESS_TOKEN - // }, - // body: JSON.stringify(sfDataSync) - // }); + const response = await fetch(salesforceUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + // Add any required headers for Salesforce authentication + // 'Authorization': 'Bearer ' + process.env.SF_ACCESS_TOKEN + }, + body: JSON.stringify(sfDataSync) + }); - // if (!response.ok) { - // const errorText = await response.text(); - // throw new Error(`Salesforce API responded with status ${response.status}: ${errorText}`); - // } + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`Salesforce API responded with status ${response.status}: ${errorText}`); + } - // const result = await response.json(); - // // console.log("✅ Successfully synced VA data to Salesforce:", result); + const result = await response.json(); + // console.log("✅ Successfully synced VA data to Salesforce:", result); - // return { - // closedWorkTracks: openWorkTracks.length, - // logoutLogId: logoutLog._id, - // SyncSalesforce: result - // }; - // } catch (error) { - // console.error("Failed to sync with Salesforce:", error.message); - // console.log(error) - - // // Create a custom error to distinguish Salesforce errors - // const salesforceError = new Error(`Salesforce sync failed: ${error.message}`); - // salesforceError.isSalesforceError = true; - // throw salesforceError; - // } - - return { + return { closedWorkTracks: openWorkTracks.length, logoutLogId: logoutLog._id, + SyncSalesforce: result }; + } catch (error) { + console.error("Failed to sync with Salesforce:", error.message); + console.log(error) + + // Create a custom error to distinguish Salesforce errors + const salesforceError = new Error(`Salesforce sync failed: ${error.message}`); + salesforceError.isSalesforceError = true; + throw salesforceError; + } + + // return { + // closedWorkTracks: openWorkTracks.length, + // logoutLogId: logoutLog._id, + // }; } catch (error) { console.error("Error closing previous session:", error); diff --git a/src/controllers/va/vaProjects/vaProjectLog.controller.js b/src/controllers/va/vaProjects/vaProjectLog.controller.js index a4ab951..651c27e 100644 --- a/src/controllers/va/vaProjects/vaProjectLog.controller.js +++ b/src/controllers/va/vaProjects/vaProjectLog.controller.js @@ -366,7 +366,7 @@ async function va_project_log_callback(req, res) { const result = await response.json(); // console.log("✅ Successfully synced VA data to Salesforce:", result); - res.status(201).json({ + return res.status(201).json({ success: true, message: `${type} Successfully`, logId: createdLog._id, diff --git a/src/routes/v1/va.routes.js b/src/routes/v1/va.routes.js index b9c77c9..be6a049 100644 --- a/src/routes/v1/va.routes.js +++ b/src/routes/v1/va.routes.js @@ -47,7 +47,7 @@ vaRoutes.delete("/profile/:id", va_remove_function); // VA delete Callback // timesheet adjustment routes vaRoutes.get("/timesheet/summary/:projectId/:date/:vaId?", authValidator, va_timesheet_summary_function); // Get Timesheet Adjustment for VA on specific project and date vaRoutes.post("/timesheet/adjustment/request", authValidator, va_timesheet_adjustment_function); // Timesheet Adjustment for VA -// vaRoutes.get("/timesheet/adjustments/list/:status?/:projectId?/:vaId?", get_adjustment_requests_list); // show all adjustment list to approve and reject +vaRoutes.get("/timesheet/adjustments/list/:projectId?/:vaId?/:status?", get_adjustment_requests_list); // show all adjustment list to approve and reject vaRoutes.patch("/timesheet/adjustments/:adjustmentId", va_timesheet_manage_adjustment_request); // Leaves routes @@ -84,9 +84,6 @@ vaRoutes.get("/log/project/:projectId/:from?/:to?", authValidator, va_log_callba vaRoutes.get("/payrollSchedule", authValidator, va_payroll_schedule_function); // VA Payroll Schedule vaRoutes.get("/paySlip/:vaId", authValidator, va_payslip_data_function); // VA Payslip - - - vaRoutes.get("/:userName", va_username_callback); // VA Username Callback diff --git a/src/server.js b/src/server.js index ecbee08..5bbade2 100644 --- a/src/server.js +++ b/src/server.js @@ -299,6 +299,8 @@ io.use(async (socket, next) => { if (clientUser) { socket.data.role = "client"; socket.data.clientId = clientUser._id.toString(); + socket.data.vaId = vaId.toString(); + socket.data.projectId = projectId; // Get all VA IDs assigned to this client socket.data.allowedVAs = clientData.vaAssigned.map((va) => va.toString()); @@ -319,7 +321,7 @@ io.on("connection", (socket) => { console.log("User connected:", socket.id); // Register role and ID (client or VA) - socket.on("register", async ({ role, id }) => { + socket.on("register", async ({ role, id, projectId = null, clientId = null }) => { if (role === "va") { socket.data.role = "va"; socket.data.vaId = id; @@ -328,23 +330,35 @@ io.on("connection", (socket) => { if (role === "client") { socket.data.role = "client"; - socket.data.clientId = id; + socket.data.clientId = clientId; // 🧩 Get allowed VAs for this client - const client = await ClientModel.findById(id) - .populate("projectIds") // to access their projects - .populate("vaIds"); // optional if you track directly + const client = await ClientModel.findById(clientId); - // Collect all VA IDs from their projects - const projectVAIds = new Set(); - for (const project of client.projectIds) { - const populated = await ProjectModel.findById(project._id).populate("vaAssigned"); + const a = JSON.stringify(client); + console.log(a, "client data for allowed VAs"); + if (client.projectIds.length !== 0 && client.projectIds.includes(projectId)) { + const projectVAIds = new Set(); + + const populated = await ProjectModel.findById(projectId).populate("vaAssigned"); populated.vaAssigned.forEach((va) => projectVAIds.add(va._id.toString())); + + socket.data.allowedVAs = Array.from(projectVAIds); + console.log(`Client ${clientId} can view VAs:`, socket.data.allowedVAs); + + io.to(vaSocketRespectToClient.get(`${clientId}-${id}-${projectId}-va`)).emit("startSendAppsDetails", { projId: projectId }); } - // Store allowed VA IDs in socket memory - socket.data.allowedVAs = Array.from(projectVAIds); - console.log(`Client ${id} can view VAs:`, socket.data.allowedVAs); + // Collect all VA IDs from their projects + // const projectVAIds = new Set(); + // for (const project of client.projectIds) { + // const populated = await ProjectModel.findById(project._id).populate("vaAssigned"); + // populated.vaAssigned.forEach((va) => projectVAIds.add(va._id.toString())); + // } + + // // Store allowed VA IDs in socket memory + // socket.data.allowedVAs = Array.from(projectVAIds); + // console.log(`Client ${clientId} can view VAs:`, socket.data.allowedVAs); } }); @@ -444,7 +458,6 @@ io.on("connection", (socket) => { } const vaId = vaUser._id.toString(); - console.log("🟢 Received Apps from VA:", vaId); // Broadcast image only to allowed clients for (let [_, clientSocket] of io.sockets.sockets) { @@ -475,11 +488,12 @@ io.on("connection", (socket) => { ); if (vaSocketId) { - io.to(vaSocketId).emit("stopSendAppsDetails"); + // io.to(vaSocketId).emit("stopSendAppsDetails"); + io.to(vaSocketRespectToClient.get(`${clientId}-${vaId}-${projectId}-va`)).emit("stopSendAppsDetails", { projId: projectId }); } } - console.log("❌ Client disconnected"); + }); });