Files
database-pertani-web/app/Http/Controllers/Web/Concerns/AksesMonitoringPetani.php
T

64 lines
2.1 KiB
PHP

<?php
namespace App\Http\Controllers\Web\Concerns;
use App\Models\Pertanian\Petani;
use App\Services\Produktivitas\KelengkapanPetani;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Illuminate\Support\Collection as BaseCollection;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Str;
/**
* Bantuan bersama menu Verifikasi > Petani (tab Monitoring & Verifikasi).
* Hanya super_admin, admin, dan koordinator; koordinator dibatasi komoditas yang ditugaskan.
*/
trait AksesMonitoringPetani
{
protected const PER_PAGE = [10, 25, 50];
protected function izinkan(): void
{
abort_unless(Gate::any(['super_admin', 'admin', 'koordinator']), 403);
}
protected function izinkanPetani(Petani $petani): void
{
$this->izinkan();
abort_if(auth()->user()->isKoordinator() && ! auth()->user()->bolehAksesPetani($petani), 403);
}
/** Query petani + relasi untuk hitung kelengkapan (eager load, tanpa N+1), sudah dibatasi komoditas koordinator. */
protected function queryPetani(): Builder
{
return $this->batasiKomoditas(Petani::query()->with(KelengkapanPetani::RELASI));
}
protected function batasiKomoditas(Builder $query): Builder
{
$user = auth()->user();
return $query->when($user->isKoordinator(), fn ($q) => $q->whereIn('komoditas_id', $user->komoditasKoordinatorIds()));
}
/** Ringkasan 3 hitungan input (skor, wajib, lainnya) per petani, dikunci id petani. */
protected function ringkasan(Collection $petani): BaseCollection
{
return $petani->mapWithKeys(fn (Petani $p) => [$p->id => KelengkapanPetani::untuk($p)->ringkasanInput()]);
}
protected function perPage(Request $request, string $kunci): int
{
$n = (int) $request->query($kunci);
return in_array($n, self::PER_PAGE, true) ? $n : self::PER_PAGE[0];
}
protected function kataCari(Request $request, string $kunci): ?string
{
return $request->filled($kunci) ? Str::lower($request->query($kunci)) : null;
}
}