with(['election', 'pusatMengundi', 'requestedPosition', 'approvedPosition', 'selectedKtmAssignment.user']) ->when($request->filled('status'), fn ($q) => $q->where('status', $request->string('status'))) ->when($request->filled('pusat_mengundi_id'), fn ($q) => $q->where('pusat_mengundi_id', $request->integer('pusat_mengundi_id'))) ->when($request->filled('position_id'), function ($q) use ($request): void { $q->where(function ($nested) use ($request): void { $nested->where('requested_position_id', $request->integer('position_id')) ->orWhere('approved_position_id', $request->integer('position_id')); }); }) ->when($request->filled('q'), function ($q) use ($request): void { $term = '%'.$request->string('q')->toString().'%'; $q->where(fn ($nested) => $nested ->where('name', 'like', $term) ->orWhere('ic_number', 'like', $term) ->orWhere('email', 'like', $term)); }); $applications = $this->sortedQuery($query, ['name', 'status', 'created_at'], 'created_at', 'desc') ->paginate(15) ->withQueryString(); return view('admin.management.applications.index', [ 'applications' => $applications, 'positions' => Position::query()->orderBy('sort_order')->orderBy('name')->get(), 'pusats' => PusatMengundi::query()->orderBy('name')->get(), 'filters' => $request->only(['status', 'pusat_mengundi_id', 'position_id', 'q']), ]); } public function create(): View { return view('admin.management.applications.create', $this->formData([ 'application' => new Application, ])); } public function store(StoreManualApplicationRequest $request, AdminApplicationManagementService $service): RedirectResponse { $application = $service->create($request->user(), $request->validated()); return redirect()->route('admin.management.applications.edit', $application->public_uuid) ->with('status', 'Permohonan manual telah disimpan.'); } public function edit(Application $application): View { return view('admin.management.applications.edit', $this->formData([ 'application' => $application->load(['election.settings', 'pusatMengundi', 'requestedPosition', 'approvedPosition', 'documents', 'staffAssignments.position', 'staffAssignments.saluranMengundi', 'statusHistories']), ])); } public function update(UpdateManagedApplicationRequest $request, Application $application, AdminApplicationManagementService $service): RedirectResponse { $service->update($application, $request->user(), $request->validated()); return redirect()->route('admin.management.applications.edit', $application->public_uuid) ->with('status', 'Permohonan telah dikemas kini.'); } public function assign(AssignApplicationRequest $request, Application $application, AdminApplicationManagementService $service): RedirectResponse { $service->assign($application, $request->user(), $request->validated()); return redirect()->route('admin.management.applications.edit', $application->public_uuid) ->with('status', 'Tugasan staf telah dikemas kini.'); } /** * @param array $extra * @return array */ private function formData(array $extra = []): array { $ktmPosition = Position::query()->where('code', 'KTM')->first(); return [ ...$extra, 'elections' => Election::query()->with('settings')->orderByDesc('id')->get(), 'pusats' => PusatMengundi::query()->with('election')->orderBy('name')->get(), 'salurans' => SaluranMengundi::query()->with('pusatMengundi')->orderBy('number')->get(), 'positions' => Position::query()->where('is_assignable', true)->orderBy('sort_order')->orderBy('name')->get(), 'ktmAssignments' => $ktmPosition ? StaffAssignment::query() ->with(['user', 'pusatMengundi', 'saluranMengundi']) ->where('position_id', $ktmPosition->id) ->where('status', 'active') ->whereNotNull('saluran_mengundi_id') ->orderByDesc('id') ->get() : collect(), ]; } }