diff --git a/src/controllers/userController.js b/src/controllers/userController.js index 39a9ed9c..69a01639 100644 --- a/src/controllers/userController.js +++ b/src/controllers/userController.js @@ -2131,3 +2131,74 @@ exports.updateadvanceForSupplier = async (req, reply) => { throw boom.boomify(err); } }; + + +exports.splitBookingForSupplier = async (req, reply) => { + try { + const { id } = req.params; + const { splits } = req.body; + + if (!Array.isArray(splits) || splits.length === 0) { + return reply.code(400).send({ status_code: 400, message: "splits array is required" }); + } + + // 1) Find the 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 with the first split + const first = splits[0]; + existing.capacity = `${first.capacity} L`; + existing.quantity = "1"; + existing.total_required_capacity = first.capacity; + if (first.date) existing.date = first.date; + if (first.time) existing.time = first.time; + if (first.quoted_amount) { + existing.requested_suppliers[0].quoted_amount = first.quoted_amount; + } + await existing.save(); + + // 3) Create new bookings for remaining splits + const newBookings = []; + for (let i = 1; i < splits.length; i++) { + const s = splits[i]; + const newBooking = new RequestedBooking({ + status: "pending", + customerId: existing.customerId, + type_of_water: existing.type_of_water, + capacity: `${s.capacity} L`, + quantity: "1", + total_required_capacity: s.capacity, + date: s.date || existing.date, + time: s.time || existing.time, + requested_suppliers: [ + { + time: new Date().toISOString().slice(0, 16).replace("T", " "), + status: "pending", + supplierId: existing.requested_suppliers[0].supplierId, + quoted_amount: s.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: `${splits.length} 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..b4dc9540 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,48 @@ fastify.route({ }); - fastify.route({ + 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: 'PUT', url: '/api/request-advance-amount/:_id/supplier/advance', schema: { @@ -1473,7 +1514,7 @@ fastify.route({ properties: { supplierId: { type: 'string' }, advance_paid: { type: 'number' }, // ✅ fixed - advance_ref_number: { type: 'string' } + advance_ref_number: { type: 'string' } }, }, @@ -1494,5 +1535,51 @@ fastify.route({ handler: userController.updateadvanceForSupplier, }); + +fastify.route({ + method: 'POST', + url: '/api/request-advance-amount/:id/supplier/split', + schema: { + description: 'Split a booking into multiple entries with individual capacity, date, time, and quoted_amount', + tags: ['User'], + summary: 'Split booking into multiple entries', + params: { + type: 'object', + properties: { + id: { type: 'string', description: 'Booking _id' }, + }, + required: ['id'], + }, + body: { + type: 'object', + properties: { + splits: { + type: 'array', + items: { + type: 'object', + properties: { + capacity: { type: 'number' }, + date: { type: 'string' }, + time: { type: 'string' }, + quoted_amount: { type: 'number' } + }, + required: ['capacity'] + } + } + }, + required: ['splits'], + }, + response: { + 200: { type: 'object' }, + 400: { type: 'object' }, + 404: { type: 'object' }, + }, + }, + handler: userController.splitBookingForSupplier, +}); + + + + next(); };