Petani, tab Verifikasi (sub-tab Data Lengkap & Terverifikasi). * Koordinator/admin memeriksa data berstatus Lengkap lalu menandainya Terverifikasi. */ class VerifikasiPetaniController extends Controller { use AksesMonitoringPetani; public function index(Request $request) { $this->izinkan(); $cariNama = fn (string $kunci) => fn ($q) => $q->when( $this->kataCari($request, $kunci), fn ($q, $cari) => $q->whereRaw('lower(nama) like ?', ["%{$cari}%"]) ); // Sub-tab Data Lengkap: menunggu verifikasi $petaniLengkap = $this->queryPetani() ->with('creator:id,name') ->where('status', StatusDataPetani::LENGKAP->value) ->tap($cariNama('search')) ->latest('updated_at') ->paginate($this->perPage($request, 'per_page')) ->withQueryString() ->appends('sub', 'lengkap'); // Sub-tab Terverifikasi $petaniTerverifikasi = $this->batasiKomoditas(Petani::query()) ->with(['creator:id,name', 'updater:id,name,role', 'komoditas:id,nama', 'desaKelurahan:id,nama']) ->where('status', StatusDataPetani::TERVERIFIKASI->value) ->tap($cariNama('search_terverifikasi')) ->latest('updated_at') ->paginate($this->perPage($request, 'per_page_terverifikasi'), ['*'], 'page_terverifikasi') ->withQueryString() ->appends('sub', 'terverifikasi'); return view('monitoring-verifikasi.verifikasi', [ 'menu' => 'petani', 'petaniLengkap' => $petaniLengkap, 'ringkasan' => $this->ringkasan($petaniLengkap->getCollection()), 'petaniTerverifikasi' => $petaniTerverifikasi, 'perPage' => self::PER_PAGE, ]); } /** Isi kartu verifikasi (3 langkah: Input Skor → Input Wajib → Input Lainnya), dimuat lewat fetch. */ public function show(Petani $petani) { $this->izinkanPetani($petani); abort_unless(in_array($petani->status, [StatusDataPetani::LENGKAP, StatusDataPetani::TERVERIFIKASI], true), 404); $petani->loadMissing(['desaKelurahan.kecamatan.kabupatenKota', 'skor:id,petani_id,skor_kesiapan_adopsi', 'creator:id,name']); // Sudah terverifikasi: kartu ringkas (siapa & kapan diverifikasi) + Kembalikan ke Draf. if ($petani->status === StatusDataPetani::TERVERIFIKASI) { $petani->loadMissing(['komoditas:id,nama', 'updater:id,name,role']); return view('monitoring-verifikasi.petani-terverifikasi', ['bagian' => 'rincian', 'petani' => $petani]); } $kelengkapan = KelengkapanPetani::untuk($petani); return view('monitoring-verifikasi.petani-lengkap', [ 'bagian' => 'rincian', 'petani' => $petani, 'ringkasan' => $kelengkapan->ringkasanInput(), 'rincian' => collect(['skor', 'wajib', 'lainnya']) ->mapWithKeys(fn (string $jenis) => [$jenis => $kelengkapan->rincian($jenis)->groupBy('grup')]), ]); } /** Tandai Terverifikasi (dari langkah terakhir kartu verifikasi). */ public function update(Petani $petani) { $this->izinkanPetani($petani); $kembali = redirect()->route('monitoring-verifikasi.petani.verifikasi', ['sub' => 'lengkap']); if ($petani->status !== StatusDataPetani::LENGKAP) { return $kembali->with('verifikasi_error', "Data petani {$petani->nama} tidak berstatus Lengkap, tidak dapat diverifikasi."); } $petani->status = StatusDataPetani::TERVERIFIKASI; $petani->updated_by = auth()->id(); $petani->save(); $petani->catatPerubahanStatus(StatusDataPetani::LENGKAP, 'Diverifikasi'); return $kembali->with('verifikasi_success', "Data petani {$petani->nama} berhasil diverifikasi."); } /** * Kembalikan ke Draf dengan catatan untuk enumerator: * - dari Lengkap → tombol "Belum Lengkap" di kartu verifikasi * - dari Terverifikasi → ada temuan setelah diverifikasi */ public function kembalikanKeDraf(Request $request, Petani $petani) { $this->izinkanPetani($petani); $data = $request->validate( ['catatan' => ['required', 'string', 'max:2000']], ['catatan.required' => 'Catatan wajib diisi.', 'catatan.max' => 'Catatan maksimal 2000 karakter.'] ); $dariTerverifikasi = $petani->status === StatusDataPetani::TERVERIFIKASI; $kembali = redirect()->route('monitoring-verifikasi.petani.verifikasi', ['sub' => $dariTerverifikasi ? 'terverifikasi' : 'lengkap']); if (! $dariTerverifikasi && $petani->status !== StatusDataPetani::LENGKAP) { return $kembali->with('verifikasi_error', "Data petani {$petani->nama} sudah berstatus Draf."); } $dari = $petani->status; $petani->status = StatusDataPetani::DRAFT; $petani->catatan = trim($data['catatan']); $petani->updated_by = auth()->id(); $petani->save(); $petani->catatPerubahanStatus($dari, 'Dikembalikan ke draf oleh verifikator', ['catatan' => $petani->catatan]); return $kembali->with('verifikasi_success', "Data petani {$petani->nama} dikembalikan ke Draf dengan catatan untuk enumerator."); } }