diff --git a/src/controllers/installationController.js b/src/controllers/installationController.js index 56f210a9..64d95fd5 100644 --- a/src/controllers/installationController.js +++ b/src/controllers/installationController.js @@ -3364,6 +3364,145 @@ exports.getIotDataByCustomerAndHardwareId = async (req, reply) => { // }; +// const raiseATicketLikeLogic = async (customerId, connected_to) => { +// try { +// if (!customerId || !connected_to) return; + +// const sensors = await Insensors.find({ customerId }).lean(); +// const orders = await Order.find({ customerId }).lean(); + +// if (!sensors.length) return; + +// const masterSensor = sensors.find( +// s => s.hardwareId?.trim() === connected_to.trim() && s.type === "master" +// ); +// if (!masterSensor) return; + +// const orderMap = {}; +// orders.forEach(order => { +// order.master_connections.forEach(conn => { +// orderMap[conn.hardwareId] = { +// masterName: conn.master_name || null, +// location: conn.location || null +// }; +// }); +// }); + +// const now = moment.tz("Asia/Kolkata"); + +// function getLatestDataRecord(records) { +// if (!records || records.length === 0) return null; +// return records.reduce((latest, record) => { +// if (!latest) return record; +// return new Date(record.date) > new Date(latest.date) ? record : latest; +// }, null); +// } + +// const allMasterIotData = await IotData.find({ hardwareId: connected_to }).lean(); +// const latestMasterRecord = getLatestDataRecord(allMasterIotData); + +// let masterConnectedStatus = "disconnected"; +// let lastDataTime = "No data"; +// let diffInMinutes = null; + +// if (latestMasterRecord?.date) { +// const indiaTime = moment.tz(latestMasterRecord.date, "Asia/Kolkata"); +// diffInMinutes = now.diff(indiaTime, "minutes"); +// lastDataTime = indiaTime.format("DD-MM-YYYY HH:mm:ss"); +// if (diffInMinutes <= 1) masterConnectedStatus = "connected"; +// } + +// const connectedSlaves = sensors.filter( +// s => s.connected_to?.trim() === connected_to.trim() && s.type === "slave" +// ); + +// const slaveHardwareIds = connectedSlaves.map(s => s.tankhardwareId); +// const allSlaveIotData = await IotData.find({ hardwareId: { $in: slaveHardwareIds } }).lean(); + +// const disconnectedSlaves = []; + +// for (const slave of connectedSlaves) { +// const slaveRecords = allSlaveIotData.filter(d => d.hardwareId === slave.tankhardwareId); +// const latestSlaveRecord = getLatestDataRecord(slaveRecords); + +// let slaveStatus = "disconnected"; +// let slaveDiff = null; + +// if (latestSlaveRecord?.date) { +// const slaveTime = moment.tz(latestSlaveRecord.date, "Asia/Kolkata"); +// slaveDiff = now.diff(slaveTime, "minutes"); +// if (slaveDiff <= 1) slaveStatus = "connected"; +// } + +// if (slaveStatus === "disconnected") { +// disconnectedSlaves.push({ +// slaveHardwareId: slave.tankhardwareId, +// slaveName: slave.tankName || "Unknown Slave" +// }); +// } +// } + +// const supportRecord = await Support.findOne({ supportId: "AWHYSU64" }); +// if (!supportRecord) return; + +// const existingIssues = supportRecord.issues || []; + +// const existingMasterIssue = existingIssues.find( +// issue => +// issue.hardwareId === connected_to && +// issue.type === "GSM or LoRa Disconnected" +// ); + +// const alreadyReportedSlaves = new Set( +// existingMasterIssue?.hardwareIds || [] +// ); + +// const newSlaveHardwareIds = []; +// const newSlaveNames = []; + +// for (const slave of disconnectedSlaves) { +// if (!alreadyReportedSlaves.has(slave.slaveHardwareId)) { +// newSlaveHardwareIds.push(slave.slaveHardwareId); +// newSlaveNames.push(slave.slaveName); +// } +// } + +// if (masterConnectedStatus === "disconnected" && diffInMinutes >= 1 && (newSlaveHardwareIds.length > 0 || !existingMasterIssue)) { +// const newIssue = { +// type: "GSM or LoRa Disconnected", +// masterHardwareId: connected_to, +// hardwareId: connected_to, +// hardwareIds: newSlaveHardwareIds, +// slaveNames: newSlaveNames, +// message: `Master ${connected_to} is disconnected along with ${newSlaveHardwareIds.length} new slave(s)`, +// disconnectedAt: lastDataTime +// }; + +// await Support.findOneAndUpdate( +// { supportId: "AWHYSU64" }, +// { +// $push: existingMasterIssue ? { +// "issues.$[elem].hardwareIds": { $each: newSlaveHardwareIds }, +// "issues.$[elem].slaveNames": { $each: newSlaveNames } +// } : { +// issues: newIssue +// }, +// $set: { +// updatedAt: new Date(), +// lastTicketRaisedAt: now.format("YYYY-MM-DD HH:mm:ss") +// } +// }, +// existingMasterIssue +// ? { arrayFilters: [{ "elem.hardwareId": connected_to, "elem.type": "GSM or LoRa Disconnected" }] } +// : {} +// ); +// } + +// } catch (error) { +// console.error("Error in raiseATicketLikeLogic:", error); +// } +// }; + const raiseATicketLikeLogic = async (customerId, connected_to) => { try { if (!customerId || !connected_to) return; @@ -3467,42 +3606,61 @@ const raiseATicketLikeLogic = async (customerId, connected_to) => { } } - if (masterConnectedStatus === "disconnected" && diffInMinutes >= 1 && (newSlaveHardwareIds.length > 0 || !existingMasterIssue)) { - const newIssue = { - type: "GSM or LoRa Disconnected", - masterHardwareId: connected_to, - hardwareId: connected_to, - hardwareIds: newSlaveHardwareIds, - slaveNames: newSlaveNames, - message: `Master ${connected_to} is disconnected along with ${newSlaveHardwareIds.length} new slave(s)`, - disconnectedAt: lastDataTime - }; + const formattedNow = now.format("YYYY-MM-DD HH:mm:ss"); + + if ( + masterConnectedStatus === "disconnected" && + diffInMinutes >= 1 && + (newSlaveHardwareIds.length > 0 || !existingMasterIssue) + ) { + if (!existingMasterIssue) { + // Create new issue + const newIssue = { + type: "GSM or LoRa Disconnected", + masterHardwareId: connected_to, + hardwareId: connected_to, + hardwareIds: newSlaveHardwareIds, + slaveNames: newSlaveNames, + message: `Master ${connected_to} is disconnected along with ${newSlaveHardwareIds.length} new slave(s)`, + disconnectedAt: lastDataTime, + lastTicketRaisedAt: formattedNow // <-- NEW FIELD + }; - await Support.findOneAndUpdate( - { supportId: "AWHYSU64" }, - { - $push: existingMasterIssue ? { - "issues.$[elem].hardwareIds": { $each: newSlaveHardwareIds }, - "issues.$[elem].slaveNames": { $each: newSlaveNames } - } : { - issues: newIssue + await Support.findOneAndUpdate( + { supportId: "AWHYSU64" }, + { + $push: { issues: newIssue }, + $set: { updatedAt: new Date() } + } + ); + } else { + // Update existing issue + await Support.findOneAndUpdate( + { supportId: "AWHYSU64" }, + { + $push: { + "issues.$[elem].hardwareIds": { $each: newSlaveHardwareIds }, + "issues.$[elem].slaveNames": { $each: newSlaveNames } + }, + $set: { + "issues.$[elem].lastTicketRaisedAt": formattedNow, + updatedAt: new Date() + } }, - $set: { - updatedAt: new Date(), - lastTicketRaisedAt: now.format("YYYY-MM-DD HH:mm:ss") + { + arrayFilters: [ + { "elem.hardwareId": connected_to, "elem.type": "GSM or LoRa Disconnected" } + ] } - }, - existingMasterIssue - ? { arrayFilters: [{ "elem.hardwareId": connected_to, "elem.type": "GSM or LoRa Disconnected" }] } - : {} - ); + ); + } } - } catch (error) { console.error("Error in raiseATicketLikeLogic:", error); } }; + const cron = require("node-cron"); cron.schedule("* * * * *", async () => { @@ -4842,11 +5000,8 @@ exports.getDisconnectedCustomerDetails = async (req, reply) => { customerHardwareMap[custId] = new Set(); } - // Normalize sensor hardwareId and connected_to for safe comparisons const sensorHw = sensor.tankhardwareId?.trim().toLowerCase(); const sensorConnected = sensor.connected_to?.trim().toLowerCase(); - console.log("sensorHw",sensorHw) - console.log("sensorConnected",sensorConnected) for (const issue of supportRecord.issues) { const issueHw = issue.hardwareId?.trim().toLowerCase(); @@ -4855,7 +5010,6 @@ exports.getDisconnectedCustomerDetails = async (req, reply) => { issueHw && (sensorHw === issueHw || sensorConnected === issueHw) ) { - console.log(`Adding hardwareId ${issue.hardwareId} for customer ${custId}`); customerHardwareMap[custId].add(issue.hardwareId); } @@ -4863,7 +5017,6 @@ exports.getDisconnectedCustomerDetails = async (req, reply) => { for (const id of issue.hardwareIds) { const idNorm = id?.trim().toLowerCase(); if (sensorHw === idNorm || sensorConnected === idNorm) { - console.log(`Adding hardwareId ${id} for customer ${custId}`); customerHardwareMap[custId].add(id); } } @@ -4878,6 +5031,24 @@ exports.getDisconnectedCustomerDetails = async (req, reply) => { const custId = user.customerId; const hardwareIdSet = customerHardwareMap[custId] || new Set(); + // Extract latest issue-specific lastTicketRaisedAt + const relatedIssues = supportRecord.issues.filter(issue => { + const issueHw = issue.hardwareId?.trim().toLowerCase(); + const hardwareIds = issue.hardwareIds?.map(id => id?.trim().toLowerCase()) || []; + const allIds = [issueHw, ...hardwareIds]; + return Array.from(hardwareIdSet).some(hw => allIds.includes(hw?.trim().toLowerCase())); + }); + + let latestIssueTime = null; + for (const issue of relatedIssues) { + if (issue.lastTicketRaisedAt) { + const issueTime = new Date(issue.lastTicketRaisedAt); + if (!latestIssueTime || issueTime > latestIssueTime) { + latestIssueTime = issueTime; + } + } + } + response.push({ customer: { customerId: custId, @@ -4912,7 +5083,7 @@ exports.getDisconnectedCustomerDetails = async (req, reply) => { stripeSubscriptionStatus: user.stripeSubscriptionStatus || false, createdAt: user.createdAt, updatedAt: user.updatedAt, - lastTicketRaisedAt: supportRecord.lastTicketRaisedAt || null, + lastTicketRaisedAt: latestIssueTime ? moment(latestIssueTime).format("YYYY-MM-DD HH:mm:ss") : null, totalHardwareIdsCount: hardwareIdSet.size } }); @@ -4933,6 +5104,7 @@ exports.getDisconnectedCustomerDetails = async (req, reply) => { + exports.getDisconnectedCustomerDetailsByTeamMemberId = async (req, reply) => { try { const { support_teamMemberId } = req.params;