diff --git a/.claude/settings.local.json b/.claude/settings.local.json index e200da5..f225c26 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -14,7 +14,8 @@ "Bash(git checkout:*)", "Bash(git reset:*)", "Bash(php -l app/Http/Controllers/Admin/ParkingLotController.php)", - "Bash(php -l app/Http/Requests/StoreParkingLotRequest.php)" + "Bash(php -l app/Http/Requests/StoreParkingLotRequest.php)", + "Bash(php -l app/Http/Controllers/Admin/BookingController.php)" ] } } diff --git a/app/Http/Controllers/Admin/ParkingLotController.php b/app/Http/Controllers/Admin/ParkingLotController.php index 9723dab..6fb4a75 100644 --- a/app/Http/Controllers/Admin/ParkingLotController.php +++ b/app/Http/Controllers/Admin/ParkingLotController.php @@ -68,6 +68,29 @@ class ParkingLotController extends Controller ]); } + public function destroy(ParkingLot $parkingLot): JsonResponse + { + // Block deletion if there are active bookings + $activeCount = $parkingLot->bookings()->where('status', 'active')->count(); + if ($activeCount > 0) { + return response()->json([ + 'success' => false, + 'message' => "لا يمكن الحذف — يوجد {$activeCount} حجز نشط في هذا الموقف", + ], 422); + } + + if ($parkingLot->image) { + Storage::disk('public')->delete($parkingLot->image); + } + + $parkingLot->delete(); + + return response()->json([ + 'success' => true, + 'message' => 'تم حذف الموقف بنجاح', + ]); + } + public function toggleStatus(ParkingLot $parkingLot): JsonResponse { $parkingLot->update(['is_active' => !$parkingLot->is_active]); diff --git a/resources/views/admin/parking-lots/index.blade.php b/resources/views/admin/parking-lots/index.blade.php index f1f1270..f5d4ef3 100644 --- a/resources/views/admin/parking-lots/index.blade.php +++ b/resources/views/admin/parking-lots/index.blade.php @@ -143,6 +143,12 @@ title="{{ $lot->is_active ? 'تعطيل' : 'تفعيل' }}"> + @@ -490,6 +496,28 @@ function doSearch() { const t = document.getElementById('searchInput').value; window.location.href = `/admin/parking-lots?search=${encodeURIComponent(t)}`; } + +async function deleteLot(id, name) { + if (!confirm(`حذف الموقف "${name}"؟\nسيتم حذف جميع بيانات الموقف نهائياً.`)) return; + + try { + const res = await fetch(`/admin/parking-lots/${id}`, { + method: 'DELETE', + headers: { + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, + 'Accept': 'application/json', + } + }); + const data = await res.json(); + if (data.success) { + location.reload(); + } else { + alert(data.message || 'تعذّر الحذف'); + } + } catch { + alert('خطأ في الاتصال'); + } +} @endpush diff --git a/routes/web.php b/routes/web.php index 20410e7..e9f17cd 100644 --- a/routes/web.php +++ b/routes/web.php @@ -29,6 +29,7 @@ Route::prefix('admin')->middleware('admin')->name('admin.')->group(function () { Route::post('/parking-lots', [\App\Http\Controllers\Admin\ParkingLotController::class, 'store'])->name('parking-lots.store'); Route::put('/parking-lots/{parkingLot}', [\App\Http\Controllers\Admin\ParkingLotController::class, 'update'])->name('parking-lots.update'); Route::post('/parking-lots/{parkingLot}/toggle', [\App\Http\Controllers\Admin\ParkingLotController::class, 'toggleStatus'])->name('parking-lots.toggle'); + Route::delete('/parking-lots/{parkingLot}', [\App\Http\Controllers\Admin\ParkingLotController::class, 'destroy'])->name('parking-lots.destroy'); // Active Bookings Route::get('/bookings/active', [\App\Http\Controllers\Admin\BookingController::class, 'activeIndex'])->name('bookings.active');