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);