| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?php
- namespace App\Http\Controllers\Admin;
- use App\Http\Controllers\Controller;
- use App\Models\Dictionary\Area;
- use App\Models\Dictionary\District;
- use App\Services\Export\ExportAreasService;
- use App\Services\Import\ImportAreasService;
- use Illuminate\Http\RedirectResponse;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Storage;
- use Illuminate\View\View;
- class AdminAreaController extends Controller
- {
- protected string $id = 'admin_areas';
- protected array $header = [
- 'id' => 'ID',
- 'name' => 'Название',
- 'district_name' => 'Округ',
- 'actions' => '',
- ];
- protected array $searchFields = ['name'];
- public function index(Request $request): View
- {
- $allowedSortFields = ['id', 'name', 'district_name'];
- $sortBy = in_array($request->get('sortBy'), $allowedSortFields, true) ? $request->get('sortBy') : 'name';
- $orderBy = $request->get('order') === 'desc' ? 'desc' : 'asc';
- $query = Area::query()
- ->leftJoin('districts', 'areas.district_id', '=', 'districts.id')
- ->select('areas.*', 'districts.shortname as district_name');
- // Фильтр по округу
- if ($request->has('district_id') && $request->district_id) {
- $query->where('areas.district_id', $request->district_id);
- }
- if ($request->filled('s')) {
- $search = $request->get('s');
- $query->where(function ($q) use ($search) {
- $q->where('areas.name', 'like', '%' . $search . '%')
- ->orWhere('districts.shortname', 'like', '%' . $search . '%');
- });
- }
- if ($sortBy === 'district_name') {
- $query->orderBy('districts.shortname', $orderBy);
- } else {
- $query->orderBy('areas.' . $sortBy, $orderBy);
- }
- $areas = $query->get();
- $districts = District::orderBy('shortname')->pluck('shortname', 'id')->toArray();
- return view('admin.areas.index', [
- 'active' => 'admin_areas',
- 'id' => $this->id,
- 'header' => $this->header,
- 'sortBy' => $sortBy,
- 'orderBy' => $orderBy,
- 'searchFields' => ['name', 'district_name'],
- 'areas' => $areas,
- 'districts' => $districts,
- 'selectedDistrict' => $request->district_id,
- ]);
- }
- public function show(int $areaId): View
- {
- $area = Area::withTrashed()->findOrFail($areaId);
- $districts = District::orderBy('shortname')->pluck('name', 'id')->toArray();
- return view('admin.areas.edit', [
- 'active' => 'admin_areas',
- 'area' => $area,
- 'districts' => $districts,
- ]);
- }
- public function store(Request $request): RedirectResponse
- {
- $validated = $request->validate([
- 'id' => ['nullable', 'integer'],
- 'name' => ['required', 'string', 'max:255'],
- 'district_id' => ['required', 'integer', 'exists:districts,id'],
- ]);
- if (!empty($validated['id'])) {
- $area = Area::withTrashed()->findOrFail($validated['id']);
- $area->update([
- 'name' => $validated['name'],
- 'district_id' => $validated['district_id'],
- ]);
- } else {
- Area::create([
- 'name' => $validated['name'],
- 'district_id' => $validated['district_id'],
- ]);
- }
- return redirect()->route('admin.area.index')->with('success', 'Район сохранён');
- }
- public function destroy(Area $area): RedirectResponse
- {
- $area->delete();
- return redirect()->route('admin.area.index')->with('success', 'Район удалён');
- }
- public function undelete(int $areaId): RedirectResponse
- {
- $area = Area::withTrashed()->findOrFail($areaId);
- $area->restore();
- return redirect()->route('admin.area.index')->with('success', 'Район восстановлен');
- }
- public function export(Request $request): RedirectResponse
- {
- $service = new ExportAreasService();
- $link = $service->handle($request->user()->id);
- return redirect()->away($link);
- }
- public function import(Request $request): RedirectResponse
- {
- $request->validate([
- 'import_file' => ['required', 'file', 'mimes:xlsx,xls'],
- ]);
- $file = $request->file('import_file');
- $path = $file->store('import/areas', 'upload');
- $fullPath = Storage::disk('upload')->path($path);
- $service = new ImportAreasService($fullPath, $request->user()->id);
- $result = $service->handle();
- if ($result['success']) {
- return redirect()->route('admin.area.index')
- ->with('success', 'Импорт завершён успешно');
- }
- return redirect()->route('admin.area.index')
- ->with('error', 'Ошибка импорта: ' . ($result['error'] ?? 'неизвестная ошибка'));
- }
- }
|