diff --git a/src/controllers/userController.js b/src/controllers/userController.js index 39a9ed9c..199b094c 100644 --- a/src/controllers/userController.js +++ b/src/controllers/userController.js @@ -2131,3 +2131,67 @@ exports.updateadvanceForSupplier = async (req, reply) => { throw boom.boomify(err); } }; + + +exports.splitBookingForSupplier = async (req, reply) => { + try { + const { id } = req.params; + const { capacity, quantity, date, time, quoted_amount } = req.body; + + // 1) Find existing booking + const existing = await RequestedBooking.findById(id); + if (!existing) { + return reply.code(404).send({ status_code: 404, message: "Booking not found" }); + } + + // 2) Update the original booking + existing.capacity = `${capacity} L`; + existing.quantity = "1"; + existing.total_required_capacity = capacity; + if (date) existing.date = date; + if (time) existing.time = time; + if (quoted_amount) { + existing.requested_suppliers[0].quoted_amount = quoted_amount; + } + await existing.save(); + + // 3) Create new bookings for the rest + const newBookings = []; + for (let i = 1; i < quantity; i++) { + const newBooking = new RequestedBooking({ + status: "pending", + customerId: existing.customerId, + type_of_water: existing.type_of_water, + capacity: `${capacity} L`, + quantity: "1", + total_required_capacity: capacity, + date: date || existing.date, + time: time || existing.time, + requested_suppliers: [ + { + time: new Date().toISOString().slice(0, 16).replace("T", " "), + status: "pending", + supplierId: existing.requested_suppliers[0].supplierId, + quoted_amount: quoted_amount || existing.requested_suppliers[0].quoted_amount, + }, + ], + }); + newBookings.push(newBooking); + } + + if (newBookings.length > 0) { + await RequestedBooking.insertMany(newBookings); + } + + return reply.code(200).send({ + status_code: 200, + message: `${quantity} booking(s) created/updated successfully`, + updated: existing, + newEntries: newBookings, + }); + } catch (err) { + console.error("splitBookingForSupplier error:", err); + return reply.code(500).send({ status_code: 500, message: "Internal Server Error" }); + } +}; + diff --git a/src/routes/usersRoute.js b/src/routes/usersRoute.js index d5cbfcfe..99521df2 100644 --- a/src/routes/usersRoute.js +++ b/src/routes/usersRoute.js @@ -1412,7 +1412,7 @@ fastify.route({ handler: userController.updateQuotedAmountForSupplier, }); - fastify.route({ + fastify.route({ method: 'PUT', url: '/api/request-booking-status/:_id/supplier/quotestatus', schema: { @@ -1453,7 +1453,7 @@ fastify.route({ }); - fastify.route({ + fastify.route({ method: 'PUT', url: '/api/request-advance-amount/:_id/supplier/advance', schema: { @@ -1473,7 +1473,7 @@ fastify.route({ properties: { supplierId: { type: 'string' }, advance_paid: { type: 'number' }, // ✅ fixed - advance_ref_number: { type: 'string' } + advance_ref_number: { type: 'string' } }, }, @@ -1494,5 +1494,83 @@ fastify.route({ handler: userController.updateadvanceForSupplier, }); + fastify.route({ + method: 'PUT', + url: '/api/request-advance-amount/:_id/supplier/advance', + schema: { + description: + 'Update adavance with reference number for particular supplier by user', + tags: ['User'], + summary: 'Update adavance with reference number for particular supplier by user', + params: { + type: 'object', + properties: { + _id: { type: 'string', description: 'Booking _id' }, + }, + required: ['_id'], + }, + body: { + type: 'object', + properties: { + supplierId: { type: 'string' }, + advance_paid: { type: 'number' }, // ✅ fixed + advance_ref_number: { type: 'string' } + }, + + }, + response: { + 200: { + type: 'object', + }, + 400: { type: 'object' }, + 404: { type: 'object' }, + }, + security: [ + { + basicAuth: [], + }, + ], + }, + // preHandler: fastify.auth([fastify.authenticate]), // enable if needed + handler: userController.updateadvanceForSupplier, + }); + + + fastify.route({ + method: 'POST', + url: '/api/request-advance-amount/:id/supplier/split', + schema: { + description: 'Split a booking into multiple entries based on supplier-edited capacity & quantity', + tags: ['User'], + summary: 'Split booking by capacity and quantity', + params: { + type: 'object', + properties: { + id: { type: 'string', description: 'Booking _id' }, + }, + required: ['id'], + }, + body: { + type: 'object', + properties: { + capacity: { type: 'number' }, // supplier wants capacity per booking + quantity: { type: 'number' }, // number of bookings + date: { type: 'string' }, // optional new date + time: { type: 'string' }, // optional new time + quoted_amount: { type: 'number' } // optional new quoted amount + }, + required: ['capacity', 'quantity'], + }, + response: { + 200: { type: 'object' }, + 400: { type: 'object' }, + 404: { type: 'object' }, + }, + }, + handler: userController.splitBookingForSupplier, +}); + + + next(); };