From eab4b908bc244e019b05b67f2de204de00d5a118 Mon Sep 17 00:00:00 2001 From: Varun Date: Wed, 11 Jun 2025 11:17:42 +0530 Subject: [PATCH 1/2] changes --- src/controllers/tanksController.js | 73 +++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/src/controllers/tanksController.js b/src/controllers/tanksController.js index 7414b0f0..0b58392c 100644 --- a/src/controllers/tanksController.js +++ b/src/controllers/tanksController.js @@ -7851,4 +7851,75 @@ exports.compareMeasuredHeight = async (req, reply) => { console.error("Error in compareMeasuredHeight:", err); reply.status(500).send({ message: err.message }); } -}; \ No newline at end of file +}; + + + + +//const ExcelJS = require('exceljs'); +//const IotData = require('../models/IotData'); // adjust the path + +// async function generateAndSaveTankExcel() { +// const startDate = "2025-06-03T00:00:00.000Z"; +// const endDate = new Date().toISOString(); + +// const getFilteredData = async (hardwareId) => { +// const query = { +// hardwareId, +// date: { +// $gte: startDate, +// $lte: endDate, +// }, +// }; + +// console.log(`Fetching data for hardwareId: ${hardwareId}`); +// const results = await IotData.find(query).sort({ date: 1 }); + +// console.log(`Found ${results.length} records for hardwareId ${hardwareId}`); + +// const data = []; + +// for (const entry of results) { +// if (!entry.tanks || !Array.isArray(entry.tanks)) continue; + +// for (const tank of entry.tanks) { +// if (tank.tankhardwareId === 'tank-1' || tank.tankhardwareId === 'tank-2') { +// data.push({ +// hardwareId: entry.hardwareId, +// tankhardwareId: tank.tankhardwareId, +// tankHeight: tank.tankHeight, +// date: tank.date.split('T')[0], // safe because it's a string +// time: tank.time, +// }); +// } +// } +// } + +// console.log(`Filtered ${data.length} tank records for hardwareId ${hardwareId}`); +// return data; +// }; + +// const data140924 = await getFilteredData("140924"); +// const data150924 = await getFilteredData("150924"); + +// const workbook = new ExcelJS.Workbook(); +// const worksheet = workbook.addWorksheet("Tank Data"); + +// worksheet.columns = [ +// { header: "Hardware ID", key: "hardwareId", width: 15 }, +// { header: "Tank ID", key: "tankhardwareId", width: 15 }, +// { header: "Tank Height", key: "tankHeight", width: 15 }, +// { header: "Date", key: "date", width: 15 }, +// { header: "Time", key: "time", width: 15 }, +// ]; + +// const allData = [...data140924, ...data150924]; + +// allData.forEach(row => worksheet.addRow(row)); + +// await workbook.xlsx.writeFile("tank_data.xlsx"); +// console.log("✅ Excel file saved as tank_data.xlsx with rows:", allData.length); +// } + + +// generateAndSaveTankExcel(); From fa0af6f37b399eb1ec4b5ac844992017fcc5a6d7 Mon Sep 17 00:00:00 2001 From: Varun Date: Wed, 11 Jun 2025 12:32:18 +0530 Subject: [PATCH 2/2] changes in get all suppliers --- src/handlers/supplierHandler.js | 109 +++++++++++++++++++++++++------- src/routes/supplierRoute.js | 12 +++- 2 files changed, 96 insertions(+), 25 deletions(-) diff --git a/src/handlers/supplierHandler.js b/src/handlers/supplierHandler.js index 74097f72..9acc4dce 100644 --- a/src/handlers/supplierHandler.js +++ b/src/handlers/supplierHandler.js @@ -1,6 +1,7 @@ //Get the data models const { Supplier, DeliveryBoy, profilePictureSupplier } = require("../models/supplier"); const { FriendRequest } = require("../models/supplier"); +const { Tanker,Tankerbooking } = require("../models/tankers"); const { ProfilePicture, User } = require("../models/User"); const supplierController = require("../controllers/supplierController"); const customJwtAuth = require("../customAuthJwt"); @@ -938,44 +939,104 @@ exports.getCurrentSupplier = async (req, reply) => { // } // }; +exports.getSuppliers = async (req, reply) => { + const customerId = req.params.customerId; + const { + type_of_water, + capacity: requestedCapacityStr, + quantity: requestedQuantityStr, + date + } = req.body; + + const parseCapacity = (value) => parseFloat((value || "0").toString().replace(/,/g, "")); + + const requestedCapacity = parseCapacity(requestedCapacityStr); + const requestedQuantity = parseInt(requestedQuantityStr || "0"); + const totalRequiredCapacity = requestedCapacity * requestedQuantity; -exports.getSuppliers = async (req, reply) => { - const limit = parseInt(req.query.limit) || 100; - const page = parseInt(req.query.page) || 1; - const startindex = (page - 1) * limit; - const customerId = req.params.customerId; // Assuming you have already authenticated the user and stored their ID in the request object try { - const friendRequests = await FriendRequest.find({ customerId }); - const supplierIdsToExclude = friendRequests.map( - (request) => request.supplierId + const tankerBookings = await Tankerbooking.find({ date }); + const bookedTankerSet = new Set( + tankerBookings.map(booking => `${booking.supplierId}_${booking.tankerName}`) ); - const suppliers = await Supplier.find({ supplierId: { $nin: supplierIdsToExclude } }) - .limit(limit) - .skip(startindex) - .exec(); - const supplierIds = suppliers.map((supplier) => supplier.supplierId); - const profilePictures = await profilePictureSupplier.find({ - supplierId: { $in: supplierIds }, - }).exec(); + // 1️⃣ Only filter typeofwater first + let tankers = await Tanker.find({ typeofwater: type_of_water }); - const data = suppliers.map((supplier) => { - const profilePicture = profilePictures.find( - (picture) => picture.supplierId === supplier.supplierId + // 2️⃣ Exclude booked tankers + tankers = tankers.filter(tanker => { + const key = `${tanker.supplierId}_${tanker.tankerName}`; + return !bookedTankerSet.has(key); + }); + + // 3️⃣ Group by supplierId + const supplierTankerMap = {}; + for (let tanker of tankers) { + if (!supplierTankerMap[tanker.supplierId]) { + supplierTankerMap[tanker.supplierId] = []; + } + supplierTankerMap[tanker.supplierId].push(tanker); + } + + // 4️⃣ Aggregate supplier capacities + const qualifiedSuppliers = []; + for (let [supplierId, supplierTankers] of Object.entries(supplierTankerMap)) { + const totalAvailableCapacity = supplierTankers.reduce( + (sum, t) => sum + parseCapacity(t.capacity), + 0 ); - return { - ...supplier.toObject(), - picture: profilePicture ? profilePicture.picture : null, + + if (totalAvailableCapacity >= totalRequiredCapacity) { + qualifiedSuppliers.push({ supplierId, tankers: supplierTankers }); + } + } + + const connected_suppliers = []; + const non_connected_suppliers = []; + + for (let supplierObj of qualifiedSuppliers) { + const supplierData = await Supplier.findOne({ supplierId: supplierObj.supplierId }); + + const responseData = { + supplier: supplierData, + tankers: supplierObj.tankers }; + + // 🔥 The correct friend request check: + const friendRequest = await FriendRequest.findOne({ + customerId: customerId, + supplierId: supplierObj.supplierId + }); + + if (friendRequest && friendRequest.status === "accepted") { + connected_suppliers.push(responseData); + } else { + non_connected_suppliers.push(responseData); + } + } + + reply.send({ + status_code: 200, + connected_suppliers, + non_connected_suppliers }); - reply.send({ status_code: 200, data, count: data.length }); } catch (err) { - throw boom.boomify(err); + console.error(err); + reply.send({ + status_code: 500, + message: "Something went wrong", + error: err.message + }); } }; + + + + + // Get single user by ID exports.getSingleSupplier = async (req, reply) => { try { diff --git a/src/routes/supplierRoute.js b/src/routes/supplierRoute.js index e4a9622f..540e0769 100644 --- a/src/routes/supplierRoute.js +++ b/src/routes/supplierRoute.js @@ -8,7 +8,7 @@ const { profilePictureSupplier } = require("../models/supplier"); module.exports = function (fastify, opts, next) { - fastify.get("/api/suppliers/:customerId", { + fastify.post("/api/suppliersforbooking/:customerId", { schema: { tags: ["Supplier-Data"], description: "This is for Get All Suppliers", @@ -22,6 +22,16 @@ module.exports = function (fastify, opts, next) { }, }, }, + body: { + type: "object", + + properties: { + type_of_water: { type: "string" }, + capacity: { type: "string" }, + quantity: { type: "string" }, + date: { type: "string" }, + }, + }, security: [ {