assignedPusatIds($request->user()); $status = $request->string('status')->toString(); $query = Application::query() ->with(['pusatMengundi', 'requestedPosition', 'approvedPosition']) ->whereIn('pusat_mengundi_id', $pusatIds) ->when($status !== '', fn ($q) => $q->where('status', $status)); return view('ppm.applications.index', [ 'applications' => $this->sortedQuery($query, ['name', 'status', 'created_at'], 'created_at', 'desc') ->paginate(15) ->withQueryString(), 'status' => $status, ]); } public function show( Application $application, AssignmentVacancyService $assignmentVacancyService, KtmVacancyService $ktmVacancyService, ): View { $this->authorize('view', $application); $application->load([ 'pusatMengundi.daerahMengundi', 'pusatMengundi.saluranMengundis', 'pusatMengundi.policeEscorts.saluranMengundi', 'pusatMengundi.kkmRepresentatives', 'pusatMengundi.jkmRepresentatives', 'requestedPosition', 'approvedPosition', 'documents', 'selectedKtmAssignment.user', 'selectedKtmAssignment.saluranMengundi', 'staffAssignments.position', 'staffAssignments.saluranMengundi', 'staffAssignments.reportsTo.user', 'statusHistories.changedBy', ]); /** @var PusatMengundi $pusatMengundi */ $pusatMengundi = $application->pusatMengundi; return view('ppm.applications.show', [ 'application' => $application, 'roles' => Position::query() ->whereIn('code', ['KTM', 'KP', 'KPDP', 'PAPM']) ->where('is_public_applyable', true) ->orderBy('sort_order') ->get(), 'availableKtmSalurans' => $assignmentVacancyService->availableSaluransForRole($pusatMengundi, 'KTM'), 'ktmOptionsByRole' => $ktmVacancyService->optionsForRoles($pusatMengundi, ['KP', 'KPDP'], $application->id), ]); } public function approve( ApproveApplicationRequest $request, Application $application, PpmApplicationReviewService $reviewService, ): RedirectResponse { $this->authorize('review', $application); $reviewService->approve($application, $request->user(), $request->validated()); return redirect() ->route('ppm.applications.show', $application->public_uuid) ->with('status', 'Permohonan telah diluluskan dan assignment telah disimpan.'); } public function reject( RejectApplicationRequest $request, Application $application, PpmApplicationReviewService $reviewService, ): RedirectResponse { $this->authorize('review', $application); $reviewService->reject($application, $request->user(), $request->validated('reason')); return redirect() ->route('ppm.applications.show', $application->public_uuid) ->with('status', 'Permohonan telah ditolak.'); } public function downloadDocument(Application $application, ApplicationDocument $document): StreamedResponse { $this->authorize('downloadDocument', $application); abort_unless($document->application_id === $application->id, 403); abort_unless( in_array($document->document_type, ApplicationDocument::ALLOWED_FOR_PPM, true), 403 ); abort_unless(Storage::disk($document->disk)->exists($document->path), 404); activity('documents') ->performedOn($document) ->causedBy(request()->user()) ->withProperties(['document_type' => $document->document_type]) ->log('document_downloaded_by_ppm'); return Storage::disk($document->disk)->download($document->path, $document->original_name); } }