diff --git a/src/api-docs/api.html.save b/src/api-docs/api.html.save
deleted file mode 100644
index 4bc403af..00000000
--- a/src/api-docs/api.html.save
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/controllers/tanksController.js b/src/controllers/tanksController.js
index 7414b0f0..90b580be 100644
--- a/src/controllers/tanksController.js
+++ b/src/controllers/tanksController.js
@@ -6426,6 +6426,7 @@ setInterval(logSets, 30000);
+
const sendMotorNotifications = async () => {
// console.log("🔄 Checking for motor notifications...");
@@ -6533,6 +6534,78 @@ exports.getPendingAndCompletedsurveyOfparticularInstaller = async (request, repl
+//const mqtt = require('mqtt');
+
+// Connect to test MQTT broker
+const client2 = mqtt.connect('mqtt://34.100.133.20:1884', {
+ clientId: `mqtt_test_${Math.random().toString(16).substr(2, 8)}`,
+ clean: true,
+ reconnectPeriod: 2000,
+});
+// Sets to track active devices
+const subscribedTopics2 = new Set();
+const activeDevices2 = new Set(); // Keep track of active devices
+
+client2.on('connect', () => {
+ console.log('✅ Connected to TEST MQTT broker');
+
+ // Subscribe to the announcement topic
+ client2.subscribe('water/iot-data/announce', { qos: 1 }, (err) => {
+ if (err) {
+ console.error('❌ Failed to subscribe to announce topic:', err);
+ } else {
+ console.log('📡 Subscribed to water/iot-data/announce');
+ }
+ });
+});
+
+client2.on('message', (topic, message) => {
+ console.log(`📩 [${topic}] ${message.toString()}`);
+
+ try {
+ const data = JSON.parse(message.toString());
+
+ // If announcement message received
+ if (topic === 'water/iot-data/announce') {
+ if (data.objects && data.objects.hw_Id) {
+ const hw_Id = data.objects.hw_Id;
+ const deviceTopic = `water/iot-data/${hw_Id}`;
+
+ if (!subscribedTopics2.has(deviceTopic)) {
+ client2.subscribe(deviceTopic, { qos: 1 }, (err) => {
+ if (err) {
+ console.error(`❌ Failed to subscribe to ${deviceTopic}:`, err);
+ } else {
+ console.log(`✅ Subscribed to ${deviceTopic}`);
+ subscribedTopics2.add(deviceTopic);
+ }
+ });
+ } else {
+ console.log(`🔄 Already subscribed to ${deviceTopic}`);
+ }
+ } else {
+ console.error('❌ Invalid announce message, missing hw_Id');
+ }
+ }
+ } catch (err) {
+ console.error('❌ Failed to parse message:', err);
+ }
+});
+
+client2.on('error', (err) => console.error('❌ MQTT Error:', err));
+client2.on('close', () => console.log('⚠️ MQTT2 Connection Closed.'));
+client2.on('offline', () => console.log('⚠️ MQTT Broker Offline.'));
+
+
+ function logSets1() {
+ console.log("Subscribed Topics2:", Array.from(subscribedTopics2));
+ console.log("Active Devices2:", Array.from(activeDevices2));
+}
+
+// Call logSets every 30 seconds
+setInterval(logSets1, 30000);
+
+
@@ -7851,4 +7924,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();
diff --git a/src/handlers/supplierHandler.js b/src/handlers/supplierHandler.js
index 74097f72..bf4e5765 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,105 @@ exports.getCurrentSupplier = async (req, reply) => {
// }
// };
+exports.getSuppliers = async (req, reply) => {
+ const customerId = req.params.customerId;
+ const {
+ type_of_water,
+ capacity: requestedCapacityStr,
+ quantity: requestedQuantityStr,
+ date,
+ time
+ } = 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..0eb38114 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,18 @@ module.exports = function (fastify, opts, next) {
},
},
},
+ body: {
+ type: "object",
+
+ properties: {
+ type_of_water: { type: "string" },
+ capacity: { type: "string" },
+ quantity: { type: "string" },
+ date: { type: "string" },
+ time: { type: "string" },
+
+ },
+ },
security: [
{