Update Role fasilitator, kordinator

This commit is contained in:
2026-11-04 14:24:51 +07:00
parent b5b046ed86
commit 41da3a71ee
48 changed files with 586 additions and 164 deletions
@@ -0,0 +1,70 @@
<?php
namespace App\Http\Controllers\Web\Konfigurasi;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
/**
* Mengatur komoditas yang ditangani seorang koordinator.
*/
class KoordinatorKomoditasController extends Controller
{
public function update(Request $request, User $user)
{
abort_unless(Gate::any(['super_admin', 'admin']), 403);
if (! $user->isKoordinator()) {
return response()->json([
'success' => false,
'message' => 'Komoditas hanya bisa diatur untuk user dengan role Koordinator.',
], 422);
}
$validated = $request->validate([
'komoditas_ids' => ['required', 'array', 'min:1'],
'komoditas_ids.*' => ['integer', 'exists:master_komoditas,id'],
], [
'komoditas_ids.required' => 'Pilih minimal satu komoditas.',
'komoditas_ids.min' => 'Pilih minimal satu komoditas.',
'komoditas_ids.*.exists' => 'Komoditas yang dipilih tidak valid.',
]);
self::simpanPenugasan($user, $validated['komoditas_ids']);
return response()->json([
'success' => true,
'message' => 'Komoditas koordinator berhasil diperbarui.',
'data' => $user->komoditasKoordinatorIds(),
]);
}
/**
* Menyamakan penugasan koordinator dengan daftar komoditas yang dipilih.
* Penugasan yang dilepas di-soft delete, penugasan baru dibuat.
*/
public static function simpanPenugasan(User $user, array $komoditasIds): void
{
$komoditasIds = array_values(array_unique(array_map('intval', $komoditasIds)));
DB::transaction(function () use ($user, $komoditasIds) {
$user->koordinatorKomoditas()
->whereNotIn('komoditas_id', $komoditasIds)
->get()
->each->delete();
$sudahAda = $user->komoditasKoordinatorIds();
foreach (array_diff($komoditasIds, $sudahAda) as $komoditasId) {
$user->koordinatorKomoditas()->create([
'komoditas_id' => $komoditasId,
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
]);
}
});
}
}
@@ -8,16 +8,29 @@ use App\Models\User;
use App\Models\Profile;
use App\Enums\Role;
use App\Models\Wilayah\Provinsi;
use App\Models\Pertanian\Komoditas;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
class UserController extends Controller
{
// Manajemen pengguna hanya untuk super admin & admin (sama dengan menu "Daftar Pengguna").
// Berlaku untuk semua method di controller ini.
public function __construct()
{
$this->middleware(function (Request $request, \Closure $next) {
abort_unless($request->user() && Gate::forUser($request->user())->any(['super_admin', 'admin']), 403);
return $next($request);
});
}
public function index(Request $request)
{
$query = User::orderBy('created_at', 'desc');
$query = User::with('koordinatorKomoditas.komoditas:id,nama')->orderBy('created_at', 'desc');
$tab = $request->get('tab', 'active');
if ($tab === 'pending') {
@@ -45,8 +58,15 @@ class UserController extends Controller
$pendingUsers = User::whereNull('email_verified_at')->count();
$roles = Role::cases();
$komoditasOptions = $this->komoditasOptions();
return view('konfigurasi.user.index', compact('users', 'totalUsers', 'activeUsers', 'pendingUsers', 'roles', 'tab'));
return view('konfigurasi.user.index', compact('users', 'totalUsers', 'activeUsers', 'pendingUsers', 'roles', 'tab', 'komoditasOptions'));
}
// Komoditas utama yang bisa ditugaskan ke koordinator
private function komoditasOptions()
{
return Komoditas::select('id', 'nama')->where('is_utama', true)->orderBy('nama')->get();
}
public function verify(Request $request, $id)
@@ -92,8 +112,9 @@ class UserController extends Controller
{
$roles = Role::cases();
$provinsi = Provinsi::orderBy('nama', 'asc')->get();
$komoditasOptions = $this->komoditasOptions();
return view('konfigurasi.user.add', compact('roles', 'provinsi'));
return view('konfigurasi.user.add', compact('roles', 'provinsi', 'komoditasOptions'));
}
public function store(Request $request)
@@ -104,6 +125,8 @@ class UserController extends Controller
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
'role' => ['required', 'string'],
'komoditas_ids' => ['nullable', 'array', 'required_if:role,' . Role::KOORDINATOR->value],
'komoditas_ids.*' => ['integer', 'exists:master_komoditas,id'],
'telepon' => ['required', 'max:13'],
'desa_kelurahan_id' => ['nullable', 'exists:desa_kelurahan,id'],
'ktp' => ['nullable', 'min:16', 'max:16'],
@@ -116,6 +139,7 @@ class UserController extends Controller
'password.confirmed' => 'Konfirmasi password tidak cocok!',
'password.min' => 'Password minimal 8 karakter!',
'email.unique' => 'Email sudah terdaftar.',
'komoditas_ids.required_if' => 'Pilih minimal satu komoditas untuk koordinator.',
'required' => 'Kolom :attribute wajib diisi.'
]);
@@ -163,6 +187,10 @@ class UserController extends Controller
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
]);
if ($user->isKoordinator()) {
KoordinatorKomoditasController::simpanPenugasan($user, $request->input('komoditas_ids', []));
}
});
if ($request->expectsJson()) {