Update Role fasilitator, kordinator
This commit is contained in:
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user