From 7d72e3a068062cb4672f12d8b4d32ec83dc161a7 Mon Sep 17 00:00:00 2001 From: dharaneesh-r Date: Fri, 28 Aug 2026 15:34:06 +0530 Subject: [PATCH] updates on the patch updats on the multiple order --- src/api/doormile/endpoints.js | 49 ++++++++++++++++++-- src/pages/doormile/orders/MultipleOrders.jsx | 5 +- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/api/doormile/endpoints.js b/src/api/doormile/endpoints.js index ecc8e91..7f2b5fb 100644 --- a/src/api/doormile/endpoints.js +++ b/src/api/doormile/endpoints.js @@ -434,9 +434,52 @@ export const createExpressBooking = async (data) => { }; export const createExpressBookingBulk = async (bookings) => { - // Max 200 per call; response carries per-row results. - const response = await doormileAxios.post('/admin/expressbooking/bulk', { bookings }); - return response.data; + const BATCH_SIZE = 200; + const list = Array.isArray(bookings) ? bookings : []; + + if (list.length <= BATCH_SIZE) { + const response = await doormileAxios.post('/admin/expressbooking/bulk', { bookings: list }); + return response.data; + } + + // Automatic chunking for requests exceeding the backend's 200 per-call limit (e.g. 1,000 orders) + const chunks = []; + for (let i = 0; i < list.length; i += BATCH_SIZE) { + chunks.push(list.slice(i, i + BATCH_SIZE)); + } + + const results = []; + let totalCreated = 0; + let lastErrorMessage = ''; + + for (const chunk of chunks) { + try { + const response = await doormileAxios.post('/admin/expressbooking/bulk', { bookings: chunk }); + const body = response.data || {}; + results.push(body); + if (body.success !== false) { + totalCreated += chunk.length; + } else { + lastErrorMessage = body.message || 'One batch failed'; + } + } catch (err) { + lastErrorMessage = err.response?.data?.message || err.message || 'Batch request failed'; + results.push({ success: false, message: lastErrorMessage }); + } + } + + const anySuccess = totalCreated > 0; + const allSuccess = totalCreated === list.length; + + return { + success: anySuccess, + message: allSuccess + ? `${list.length} orders created successfully` + : `${totalCreated} of ${list.length} orders created${lastErrorMessage ? ` (${lastErrorMessage})` : ''}`, + data: results.flatMap((r) => r.data || []), + total: totalCreated, + batches: chunks.length + }; }; export const getBooking = async (id) => { diff --git a/src/pages/doormile/orders/MultipleOrders.jsx b/src/pages/doormile/orders/MultipleOrders.jsx index e9d5aba..06d9140 100644 --- a/src/pages/doormile/orders/MultipleOrders.jsx +++ b/src/pages/doormile/orders/MultipleOrders.jsx @@ -477,11 +477,14 @@ export default function MultipleOrders() { setIsSubmitting(true); try { + if (bookings.length > 200) { + OpenToast(`Creating ${bookings.length} orders in ${Math.ceil(bookings.length / 200)} batches...`, 'info', 3000); + } const res = await createExpressBookingBulk(bookings); if (res?.success) { queryClient.invalidateQueries({ queryKey: ['doormile', 'bookings'] }); queryClient.invalidateQueries({ queryKey: ['ordersBulk'] }); - OpenToast(`${bookings.length} Orders created successfully`, 'success', 2500); + OpenToast(`${res.total || bookings.length} orders created successfully`, 'success', 2500); navigate('/doormile/orders'); } else { OpenToast(res?.message || 'Bulk order creation failed', 'error', 3500);