From 4637f0b189ee69875b5f74a237922b82d64235adc45d6e3cb806167a58ffb788 Mon Sep 17 00:00:00 2001 From: Abhishek Mali Date: Tue, 23 Dec 2025 12:22:35 +0530 Subject: [PATCH] excel import --- .../Admin/AdminOrderController.php | 75 +++++++++--------- app/Imports/OrderItemsPreviewImport.php | 26 +++++++ resources/views/admin/dashboard.blade.php | 78 ++++++++++++++++++- routes/web.php | 6 ++ 4 files changed, 146 insertions(+), 39 deletions(-) create mode 100644 app/Imports/OrderItemsPreviewImport.php diff --git a/app/Http/Controllers/Admin/AdminOrderController.php b/app/Http/Controllers/Admin/AdminOrderController.php index 95afaf4..f116b96 100644 --- a/app/Http/Controllers/Admin/AdminOrderController.php +++ b/app/Http/Controllers/Admin/AdminOrderController.php @@ -13,6 +13,11 @@ use App\Models\User; use PDF; use Maatwebsite\Excel\Facades\Excel; use App\Exports\OrdersExport; +use App\Imports\OrderItemsPreviewImport; + + +use Illuminate\Validation\ValidationException; + class AdminOrderController extends Controller { @@ -36,44 +41,6 @@ class AdminOrderController extends Controller return view('admin.orders_create', compact('markList')); } - // public function store(Request $request) - // { - // $data = $request->validate([ - // 'mark_no' => 'required|string', - // 'origin' => 'nullable|string', - // 'destination' => 'nullable|string', - // 'ctn' => 'nullable|numeric', - // 'qty' => 'nullable|numeric', - // 'ttl_qty' => 'nullable|numeric', - // 'ttl_amount' => 'nullable|numeric', - // 'cbm' => 'nullable|numeric', - // 'ttl_cbm' => 'nullable|numeric', - // 'kg' => 'nullable|numeric', - // 'ttl_kg' => 'nullable|numeric', - // ]); - - // $order = Order::create([ - // 'order_id' => $this->generateOrderId(), - // 'mark_no' => $data['mark_no'], - // 'origin' => $data['origin'] ?? null, - // 'destination'=> $data['destination'] ?? null, - // 'ctn' => $data['ctn'] ?? 0, - // 'qty' => $data['qty'] ?? 0, - // 'ttl_qty' => $data['ttl_qty'] ?? 0, - // 'ttl_amount' => $data['ttl_amount'] ?? 0, - // 'cbm' => $data['cbm'] ?? 0, - // 'ttl_cbm' => $data['ttl_cbm'] ?? 0, - // 'kg' => $data['kg'] ?? 0, - // 'ttl_kg' => $data['ttl_kg'] ?? 0, - // 'status' => 'pending', - // ]); - - // $this->createInvoice($order); - - // return redirect()->route('admin.orders.show', $order->id) - // ->with('success', 'Order created successfully.'); - // } - /* --------------------------- * SHOW / POPUP * ---------------------------*/ @@ -723,4 +690,36 @@ class AdminOrderController extends Controller ]); } } + + + +public function uploadExcelPreview(Request $request) +{ + try { + $request->validate([ + 'excel' => 'required|file|mimes:xlsx,xls' + ]); + + $import = new OrderItemsPreviewImport(); + Excel::import($import, $request->file('excel')); + + return response()->json([ + 'success' => true, + 'items' => $import->rows + ]); + } catch (ValidationException $e) { + return response()->json([ + 'success' => false, + 'message' => 'Invalid Excel file format' + ], 422); + } catch (\Throwable $e) { + \Log::error($e); + return response()->json([ + 'success' => false, + 'message' => 'Server error' + ], 500); + } +} + + } diff --git a/app/Imports/OrderItemsPreviewImport.php b/app/Imports/OrderItemsPreviewImport.php new file mode 100644 index 0000000..0865b6f --- /dev/null +++ b/app/Imports/OrderItemsPreviewImport.php @@ -0,0 +1,26 @@ +first()->map(fn ($h) => strtolower(trim($h)))->toArray(); + + foreach ($collection->skip(1) as $row) { + $item = []; + foreach ($header as $i => $key) { + $item[$key] = $row[$i] ?? null; + } + + if (!empty($item['description'])) { + $this->rows[] = $item; + } + } + } +} diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php index 11fd2ea..2f8e362 100644 --- a/resources/views/admin/dashboard.blade.php +++ b/resources/views/admin/dashboard.blade.php @@ -1214,6 +1214,7 @@ body, .container-fluid { # Order ID Mark No + Date Origin Destination Total CTN @@ -1225,7 +1226,6 @@ body, .container-fluid { Total KG Total TTL KG Status - Date Actions @@ -1441,6 +1441,13 @@ body, .container-fluid { + + + + + @@ -1918,6 +1925,75 @@ document.addEventListener('DOMContentLoaded', function() { e.target.closest('tr').remove(); reindexRows(); }); + +// ===== EXCEL UPLOAD LOGIC ===== +const uploadExcelBtn = document.getElementById('uploadExcelBtn'); +const excelInput = document.getElementById('excelInput'); + +if (uploadExcelBtn && excelInput) { + + uploadExcelBtn.addEventListener('click', () => excelInput.click()); + + excelInput.addEventListener('change', function () { + const file = this.files[0]; + if (!file) return; + + const formData = new FormData(); + formData.append('excel', file); + formData.append('_token', '{{ csrf_token() }}'); + + fetch('{{ route("admin.orders.upload.excel.preview") }}', { + method: 'POST', + body: formData, + headers: { + 'Accept': 'application/json' + } + }) + .then(async res => { + if (!res.ok) { + const text = await res.text(); + throw new Error(text); + } + return res.json(); + }) + .then(res => { + if (!res.success) { + alert('Invalid Excel file'); + return; + } + populateItemsTable(res.items); + }) + .catch(err => { + console.error(err); + alert('Excel upload failed'); + }); + }); + +} + +function populateItemsTable(items) { + itemsTableBody.innerHTML = ''; + + items.forEach((item, index) => { + addRow(index); + const row = itemsTableBody.children[index]; + + row.querySelector('[data-field="description"]').value = item.description ?? ''; + row.querySelector('[data-field="ctn"]').value = item.ctn ?? ''; + row.querySelector('[data-field="qty"]').value = item.qty ?? ''; + row.querySelector('[data-field="ttl_qty"]').value = item.ttl_qty ?? ''; + row.querySelector('[data-field="unit"]').value = item.unit ?? ''; + row.querySelector('[data-field="price"]').value = item.price ?? ''; + row.querySelector('[data-field="ttl_amount"]').value = item.ttl_amount ?? ''; + row.querySelector('[data-field="cbm"]').value = item.cbm ?? ''; + row.querySelector('[data-field="ttl_cbm"]').value = item.ttl_cbm ?? ''; + row.querySelector('[data-field="kg"]').value = item.kg ?? ''; + row.querySelector('[data-field="ttl_kg"]').value = item.ttl_kg ?? ''; + row.querySelector('[data-field="shop_no"]').value = item.shop_no ?? ''; + }); + + reindexRows(); +} }); diff --git a/routes/web.php b/routes/web.php index 3301b53..ac0a309 100644 --- a/routes/web.php +++ b/routes/web.php @@ -159,6 +159,12 @@ Route::prefix('admin') // Delete full order Route::delete('/orders/{id}/delete', [AdminOrderController::class, 'destroy']) ->name('admin.orders.destroy'); + + + Route::post('/orders/upload-excel-preview', + [AdminOrderController::class, 'uploadExcelPreview'] + )->name('admin.orders.upload.excel.preview'); + // --------------------------- // SHIPMENTS (FIXED ROUTES)