Files
database-pertani-web/app/Http/Controllers/Web/Verifikasi/VerifikasiPetaniController.php
T
2026-11-05 16:34:33 +07:00

136 lines
5.6 KiB
PHP

<?php
namespace App\Http\Controllers\Web\Verifikasi;
use App\Enums\StatusDataPetani;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Web\Concerns\AksesMonitoringPetani;
use App\Models\Pertanian\Petani;
use App\Services\Produktivitas\KelengkapanPetani;
use Illuminate\Http\Request;
/**
* Menu Verifikasi > 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.");
}
}