From 99dfe31f64030da2af59379f1a43b878aec1c600 Mon Sep 17 00:00:00 2001 From: jouel88 Date: Fri, 20 Mar 2026 14:38:59 +0700 Subject: [PATCH] Roles HRD, SPV, MNGR, STAFF --- app/Http/Controllers/PegawaiController.php | 8 +- app/Http/Controllers/TukarShiftController.php | 2 +- .../Requests/StoreManualPresensiRequest.php | 2 +- app/Models/User.php | 4 +- app/Services/FaceRecognitionService.php | 16 +- database/seeders/DatabaseSeeder.php | 35 +- database/seeders/FixLegacyRolesSeeder.php | 21 +- database/seeders/MasterDataSeeder.php | 63 +-- database/seeders/PermissionSeeder.php | 86 ++-- database/seeders/SuperAdminSeeder.php | 52 +-- resources/views/layouts/sidebar.blade.php | 371 ++++++++++-------- resources/views/presensi/index.blade.php | 6 +- routes/web.php | 5 +- 13 files changed, 332 insertions(+), 339 deletions(-) diff --git a/app/Http/Controllers/PegawaiController.php b/app/Http/Controllers/PegawaiController.php index 2715c44d..e3b0b9aa 100644 --- a/app/Http/Controllers/PegawaiController.php +++ b/app/Http/Controllers/PegawaiController.php @@ -19,7 +19,7 @@ public function index(Request $request) { $query = User::with(['divisi', 'jabatan', 'kantor', 'roles']) ->whereDoesntHave('roles', function ($q) { - $q->where('nama_role', 'admin'); + $q->where('nama_role', 'hrd'); }); if ($request->filled('filter_jabatan')) { @@ -49,7 +49,7 @@ public function index(Request $request) $allKantor = Kantor::withCount([ 'users as total_pegawai' => function ($q) { $q->whereDoesntHave('roles', function ($sq) { - $sq->where('nama_role', 'admin'); + $sq->where('nama_role', 'hrd'); }); } ])->get(); @@ -57,11 +57,11 @@ public function index(Request $request) $stats = [ 'kantor_list' => $allKantor, 'total' => User::whereDoesntHave('roles', function ($q) { - $q->where('nama_role', 'admin'); + $q->where('nama_role', 'hrd'); })->count(), 'active' => User::where('status_aktif', 1) ->whereDoesntHave('roles', function ($q) { - $q->where('nama_role', 'admin'); + $q->where('nama_role', 'hrd'); })->count(), ]; diff --git a/app/Http/Controllers/TukarShiftController.php b/app/Http/Controllers/TukarShiftController.php index 1752c9ae..e4517de7 100644 --- a/app/Http/Controllers/TukarShiftController.php +++ b/app/Http/Controllers/TukarShiftController.php @@ -26,7 +26,7 @@ public function index() public function create() { $pegawai = User::with('kantor')->whereDoesntHave('roles', function ($q) { - $q->where('nama_role', 'admin')->orWhere('nama_role', 'Admin'); + $q->where('nama_role', 'hrd'); })->get(); $kantor = \App\Models\Kantor::orderBy('nama_kantor', 'asc')->get(); diff --git a/app/Http/Requests/StoreManualPresensiRequest.php b/app/Http/Requests/StoreManualPresensiRequest.php index ba2e7b6b..d3c493ad 100644 --- a/app/Http/Requests/StoreManualPresensiRequest.php +++ b/app/Http/Requests/StoreManualPresensiRequest.php @@ -12,7 +12,7 @@ public function authorize(): bool { return $this->user()->roles->contains(function ($role) { - return in_array(strtolower($role->nama_role), ['admin', 'super admin', 'super_admin']); + return strtolower($role->nama_role) === 'hrd'; }); } diff --git a/app/Models/User.php b/app/Models/User.php index 1aaef68d..c5c6009c 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -111,14 +111,14 @@ public function hasPermission($permissionSlug): bool public function isGlobalAdmin(): bool { return $this->roles->contains(function ($role) { - return in_array(strtolower($role->nama_role), ['admin', 'super admin', 'super_admin']); + return strtolower($role->nama_role) === 'hrd'; }); } public function isSuperAdmin(): bool { return $this->roles->contains(function ($role) { - return in_array(strtolower($role->nama_role), ['super admin', 'super_admin']); + return strtolower($role->nama_role) === 'hrd'; }); } diff --git a/app/Services/FaceRecognitionService.php b/app/Services/FaceRecognitionService.php index 74993303..a403993c 100644 --- a/app/Services/FaceRecognitionService.php +++ b/app/Services/FaceRecognitionService.php @@ -54,6 +54,8 @@ public function enrollFace($userId, array $photos) ->where('id', $userId) ->update(['is_face_registered' => 1]); + $trainingSuccess = false; + try { $pythonPath = env('PYTHON_PATH', 'python'); $scriptPath = base_path('python_scripts/train_face.py'); @@ -73,22 +75,26 @@ public function enrollFace($userId, array $photos) $process->run(); if (!$process->isSuccessful()) { - \Illuminate\Support\Facades\Log::warning("Face Training Failed (silently caught): " . $process->getErrorOutput()); + \Illuminate\Support\Facades\Log::warning("Face Training Failed: " . $process->getErrorOutput()); } else { $output = json_decode($process->getOutput(), true); - if (!isset($output['status']) || $output['status'] !== 'success') { - \Illuminate\Support\Facades\Log::warning("Face Training Failed (silently caught): " . ($output['message'] ?? 'Unknown Error')); + if (isset($output['status']) && $output['status'] === 'success') { + $trainingSuccess = true; + } else { + \Illuminate\Support\Facades\Log::warning("Face Training Failed: " . ($output['message'] ?? 'Unknown Error')); } } } catch (\Exception $trainEx) { - \Illuminate\Support\Facades\Log::warning("Face Training Error (silently caught): " . $trainEx->getMessage()); + \Illuminate\Support\Facades\Log::warning("Face Training Error: " . $trainEx->getMessage()); } $relativeModelPath = "face_models/user_{$userId}.yml"; + // Jika training Python berhasil → otomatis verified + // Jika training gagal → tetap pending (is_verified = 0), butuh approval manual HRD DB::table('data_wajah')->where('id_user', $userId)->update([ 'path_model_yml' => $relativeModelPath, - 'is_verified' => 0, + 'is_verified' => $trainingSuccess ? 1 : 0, ]); DB::commit(); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 8864ba61..f302e33b 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,46 +2,27 @@ namespace Database\Seeders; -use App\Models\User; use Illuminate\Database\Seeder; -use Illuminate\Support\Facades\DB; class DatabaseSeeder extends Seeder { public function run(): void { - // Panggil MasterDataSeeder terlebih dahulu untuk data dasar (Divisi, Jabatan, Kantor, Role, User Admin) $this->call([ + // 1. Data master: Role, Divisi, Jabatan, Kantor, User HRD & contoh staff MasterDataSeeder::class, - ]); - // Tambahan data demo jika diperlukan (Opsional) - $kantor = \App\Models\Kantor::first(); - $divisi = \App\Models\Divisi::first(); - $jabatan = \App\Models\Jabatan::where('nama_jabatan', 'Staff')->first() ?? \App\Models\Jabatan::first(); - - $users = User::factory(5)->create([ - 'id_kantor' => $kantor->id_kantor, - 'id_divisi' => $divisi->id_divisi, - 'id_jabatan' => $jabatan->id_jabatan, - ]); - - $rolePegawai = \App\Models\Role::where('nama_role', 'pegawai')->first(); - if ($rolePegawai) { - foreach ($users as $user) { - $user->roles()->attach($rolePegawai->id_role); - } - } - - // Panggil seeder fitur lainnya - $this->call([ + // 2. Permission per role PermissionSeeder::class, + + // 3. Data lookup / referensi PresensiStatusSeeder::class, - PresensiSeeder::class, JenisIzinSeeder::class, StatusPengajuanSeeder::class, - PengajuanIzinSeeder::class, - SuperAdminSeeder::class, // Menambah super administrator dengan role admin + + // 4. Data dummy (opsional, comment jika tidak diperlukan di production) + // PresensiSeeder::class, + // PengajuanIzinSeeder::class, ]); } } diff --git a/database/seeders/FixLegacyRolesSeeder.php b/database/seeders/FixLegacyRolesSeeder.php index 7401db01..1685d010 100644 --- a/database/seeders/FixLegacyRolesSeeder.php +++ b/database/seeders/FixLegacyRolesSeeder.php @@ -3,31 +3,12 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; -use App\Models\User; use App\Models\Role; class FixLegacyRolesSeeder extends Seeder { public function run() { - - $roleAdmin = Role::firstOrCreate(['nama_role' => 'admin']); - $rolePegawai = Role::firstOrCreate(['nama_role' => 'pegawai']); - - $oldAdmins = User::where('role', 'admin')->get(); - foreach ($oldAdmins as $user) { - if (!$user->roles()->where('nama_role', 'admin')->exists()) { - $user->roles()->attach($roleAdmin->id_role ?? $roleAdmin->id); - $this->command->info("Migrated legacy admin: {$user->email}"); - } - } - - $oldStaff = User::where('role', 'pegawai')->get(); - foreach ($oldStaff as $user) { - if (!$user->roles()->where('nama_role', 'pegawai')->exists()) { - $user->roles()->attach($rolePegawai->id_role ?? $rolePegawai->id); - $this->command->info("Migrated legacy staff: {$user->email}"); - } - } + $this->command->info('Tidak ada migrasi legacy yang perlu dilakukan (sistem sudah menggunakan pivot roles).'); } } diff --git a/database/seeders/MasterDataSeeder.php b/database/seeders/MasterDataSeeder.php index 03fc6a6e..7108a3c7 100644 --- a/database/seeders/MasterDataSeeder.php +++ b/database/seeders/MasterDataSeeder.php @@ -26,61 +26,62 @@ public function run() $kPusat = Kantor::firstOrCreate( ['nama_kantor' => 'Kantor Pusat'], [ - 'alamat' => 'Jl. Jendral Sudirman No. 1, Jakarta', - 'latitude' => -6.2088, + 'alamat' => 'Jl. Jendral Sudirman No. 1, Jakarta', + 'latitude' => -6.2088, 'longitude' => 106.8456, - 'radius' => 200 + 'radius' => 200 ] ); $kCabang = Kantor::firstOrCreate( ['nama_kantor' => 'Curah Manis Studio'], [ - 'alamat' => 'Jl. Curah Manis, Malang', - 'latitude' => -7.9839, + 'alamat' => 'Jl. Curah Manis, Malang', + 'latitude' => -7.9839, 'longitude' => 112.6214, - 'radius' => 200 + 'radius' => 200 ] ); - // Roles - $roleAdmin = \App\Models\Role::firstOrCreate(['nama_role' => 'admin']); - $roleHrd = \App\Models\Role::firstOrCreate(['nama_role' => 'hrd']); - $roleManager = \App\Models\Role::firstOrCreate(['nama_role' => 'manager']); - $rolePegawai = \App\Models\Role::firstOrCreate(['nama_role' => 'pegawai']); + $roleHrd = \App\Models\Role::firstOrCreate(['nama_role' => 'hrd']); + $roleManager = \App\Models\Role::firstOrCreate(['nama_role' => 'manager']); + $roleSupervisor = \App\Models\Role::firstOrCreate(['nama_role' => 'supervisor']); + $roleStaff = \App\Models\Role::firstOrCreate(['nama_role' => 'staff']); - $admin = User::updateOrCreate( - ['email' => 'admin@mpg.co.id'], + $hrd = User::updateOrCreate( + ['nik' => '999999999'], [ - 'nama_lengkap' => 'Super Administrator', - 'password' => Hash::make('admin123'), - 'nik' => '999999999', - 'status_aktif' => 1, - 'id_divisi' => $divIT->id_divisi, - 'id_jabatan' => $jabMgr->id_jabatan, - 'id_kantor' => $kPusat->id_kantor, + 'nama_lengkap' => 'HRD Manager', + 'email' => 'hrd@mpg.co.id', + 'password' => Hash::make('Mpg123!'), + 'status_aktif' => 1, + 'id_divisi' => $divHR->id_divisi, + 'id_jabatan' => $jabMgr->id_jabatan, + 'id_kantor' => $kPusat->id_kantor, 'tgl_bergabung' => now(), + 'sisa_cuti' => 12, ] ); - if (!$admin->roles()->where('nama_role', 'admin')->exists()) { - $admin->roles()->attach($roleAdmin->id_role); + if (!$hrd->roles()->where('nama_role', 'hrd')->exists()) { + $hrd->roles()->attach($roleHrd->id_role); } $pegawai = User::updateOrCreate( ['email' => 'budi@mpg.co.id'], [ - 'nama_lengkap' => 'Budi Santoso', - 'password' => Hash::make('Mpg123!'), - 'nik' => '350712345678', - 'status_aktif' => 1, - 'id_divisi' => $divHR->id_divisi, - 'id_jabatan' => $jabStf->id_jabatan, - 'id_kantor' => $kCabang->id_kantor, + 'nama_lengkap' => 'Budi Santoso', + 'password' => Hash::make('Mpg123!'), + 'nik' => '350712345678', + 'status_aktif' => 1, + 'id_divisi' => $divHR->id_divisi, + 'id_jabatan' => $jabStf->id_jabatan, + 'id_kantor' => $kCabang->id_kantor, 'tgl_bergabung' => now(), + 'sisa_cuti' => 12, ] ); - if (!$pegawai->roles()->where('nama_role', 'pegawai')->exists()) { - $pegawai->roles()->attach($rolePegawai->id_role); + if (!$pegawai->roles()->where('nama_role', 'staff')->exists()) { + $pegawai->roles()->attach($roleStaff->id_role); } } } diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php index 3b6f4a87..694c655b 100644 --- a/database/seeders/PermissionSeeder.php +++ b/database/seeders/PermissionSeeder.php @@ -5,30 +5,34 @@ use Illuminate\Database\Seeder; use App\Models\Permission; use App\Models\Role; -use Illuminate\Support\Str; class PermissionSeeder extends Seeder { - public function run(): void { - $permissions = [ - 'view_dashboard', + // Data Master 'manage_divisi', 'manage_jabatan', 'manage_kantor', 'manage_shift', 'manage_hari_libur', + 'manage_cuti', + // Data Pegawai 'view_pegawai', 'create_pegawai', 'edit_pegawai', 'delete_pegawai', 'view_pegawai_detail', + // Penjadwalan + 'view_jadwal', + 'manage_jadwal', + + // Presensi 'view_presensi_all', 'view_presensi_team', 'view_presensi_self', @@ -36,20 +40,37 @@ public function run(): void 'approve_presensi', 'correction_presensi', + // Izin 'view_izin_all', 'view_izin_team', 'create_izin', 'approve_izin', + // Surat Izin + 'view_surat_izin', + 'approve_surat_izin', + + // Lembur 'view_lembur_all', 'view_lembur_team', 'create_lembur', 'approve_lembur', + // Poin + 'manage_poin', + + // Laporan + 'view_laporan', // laporan kehadiran + 'view_laporan_izin', // laporan izin/cuti + 'view_laporan_lembur', // laporan lembur + + // Pengumuman + 'manage_pengumuman', + + // Face Recognition 'manage_face_data', - 'view_laporan', - + // Sistem 'manage_users', 'manage_roles', 'manage_permissions', @@ -62,49 +83,50 @@ public function run(): void ); } - $adminRole = Role::where('nama_role', 'admin')->first(); - if ($adminRole) { - $allPermissions = Permission::all(); - $adminRole->permissions()->sync($allPermissions); - } - + // ─── HRD ─── akses penuh ke semua permission $hrdRole = Role::where('nama_role', 'hrd')->first(); if ($hrdRole) { - $hrdPermissions = Permission::whereIn('nama_permission', [ - 'view_dashboard', - 'manage_divisi', 'manage_jabatan', 'manage_kantor', 'manage_shift', 'manage_hari_libur', - 'view_pegawai', 'create_pegawai', 'edit_pegawai', 'view_pegawai_detail', - 'view_presensi_all', 'approve_presensi', 'correction_presensi', - 'view_izin_all', 'approve_izin', - 'view_lembur_all', 'approve_lembur', - 'manage_face_data', - 'view_laporan' - ])->get(); - $hrdRole->permissions()->sync($hrdPermissions); + $hrdRole->permissions()->sync(Permission::all()); } + // ─── MANAGER ─── approve presensi & izin, lihat laporan kehadiran & izin $managerRole = Role::where('nama_role', 'manager')->first(); if ($managerRole) { - $managerPermissions = Permission::whereIn('nama_permission', [ + $perms = Permission::whereIn('nama_permission', [ 'view_dashboard', 'view_pegawai', 'view_pegawai_detail', - 'view_presensi_team', + 'view_jadwal', + 'view_presensi_team', 'approve_presensi', 'view_izin_team', 'approve_izin', - 'view_lembur_team', 'approve_lembur' + 'view_surat_izin', 'approve_surat_izin', + 'view_laporan', + 'view_laporan_izin', ])->get(); - $managerRole->permissions()->sync($managerPermissions); + $managerRole->permissions()->sync($perms); } - $pegawaiRole = Role::where('nama_role', 'pegawai')->first(); - if ($pegawaiRole) { - $pegawaiPermissions = Permission::whereIn('nama_permission', [ + // ─── SUPERVISOR ─── approve presensi, lihat laporan kehadiran & penjadwalan + $supervisorRole = Role::where('nama_role', 'supervisor')->first(); + if ($supervisorRole) { + $perms = Permission::whereIn('nama_permission', [ 'view_dashboard', + 'view_jadwal', + 'view_presensi_team', 'approve_presensi', + 'view_laporan', + ])->get(); + $supervisorRole->permissions()->sync($perms); + } + + // ─── STAFF ─── hanya mobile (tidak ada view_dashboard = tidak bisa akses web) + $staffRole = Role::where('nama_role', 'staff')->first(); + if ($staffRole) { + $perms = Permission::whereIn('nama_permission', [ 'view_presensi_self', 'create_presensi', 'create_izin', - 'create_lembur' + 'create_lembur', ])->get(); - $pegawaiRole->permissions()->sync($pegawaiPermissions); + $staffRole->permissions()->sync($perms); } } } diff --git a/database/seeders/SuperAdminSeeder.php b/database/seeders/SuperAdminSeeder.php index 348b4cd0..e436ae19 100644 --- a/database/seeders/SuperAdminSeeder.php +++ b/database/seeders/SuperAdminSeeder.php @@ -3,53 +3,17 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; -use App\Models\User; -use App\Models\Role; -use App\Models\Divisi; -use App\Models\Jabatan; -use App\Models\Kantor; -use Illuminate\Support\Facades\Hash; -use Illuminate\Support\Facades\DB; +/** + * SuperAdminSeeder sudah tidak digunakan. + * Fungsinya telah dipindahkan ke MasterDataSeeder (user HRD dibuat di sana). + * File ini dipertahankan agar tidak ada error jika masih dirujuk, + * namun tidak melakukan apa-apa. + */ class SuperAdminSeeder extends Seeder { - public function run() + public function run(): void { - - $divisi = Divisi::first() ?? Divisi::create(['nama_divisi' => 'IT Dept']); - $jabatan = Jabatan::first() ?? Jabatan::create(['nama_jabatan' => 'Super Admin']); - $kantor = Kantor::first() ?? Kantor::create(['nama_kantor' => 'Headquarters', 'alamat' => 'Cloud', 'tipe' => 'Pusat']); - - $roleAdmin = Role::firstOrCreate( - ['nama_role' => 'admin'], - ['keterangan' => 'Administrator with Full Access'] - ); - - $user = User::updateOrCreate( - ['email' => 'superadmin@mpg.co.id'], - [ - 'nama_lengkap' => 'Super Administrator', - 'password' => Hash::make('password'), - 'nik' => '77777777', - 'no_telp' => '081234567890', - 'alamat' => 'Server Room', - 'status_aktif' => 1, - 'tgl_bergabung' => now(), - 'id_divisi' => $divisi->id_divisi ?? $divisi->id, - 'id_jabatan' => $jabatan->id_jabatan ?? $jabatan->id, - 'id_kantor' => $kantor->id_kantor ?? $kantor->id, - 'sisa_cuti' => 12, - - ] - ); - - if (!$user->roles()->where('nama_role', 'admin')->exists()) { - $user->roles()->attach($roleAdmin->id_role ?? $roleAdmin->id); - $this->command->info('Role admin attached to user.'); - } - - $this->command->info('Super Admin created successfully!'); - $this->command->info('Email: superadmin@mpg.co.id'); - $this->command->info('Password: password'); + $this->command->info('SuperAdminSeeder: tidak melakukan apa-apa (lihat MasterDataSeeder).'); } } diff --git a/resources/views/layouts/sidebar.blade.php b/resources/views/layouts/sidebar.blade.php index 5389b4d2..db003486 100644 --- a/resources/views/layouts/sidebar.blade.php +++ b/resources/views/layouts/sidebar.blade.php @@ -11,15 +11,27 @@ class="fixed inset-y-0 left-0 w-72 bg-white border-r border-slate-200 flex flex- - @php - $isAdmin = Auth::user()->roles->contains(function ($role) { - return strtolower($role->nama_role) === 'admin'; - }); - $isSuperAdmin = Auth::user()->isSuperAdmin(); - $isAdminOrSuperAdmin = Auth::user()->isGlobalAdmin(); - @endphp + @php + $roleNama = strtolower(Auth::user()->roles->first()?->nama_role ?? ''); + $isHrd = $roleNama === 'hrd'; + $isManager = $roleNama === 'manager'; + $isSupervisor = $roleNama === 'supervisor'; + $isStaff = $roleNama === 'staff'; + + // Alias untuk kondisi gabungan + $canManage = $isHrd; // hanya HRD + $canViewPegawai = $isHrd || $isManager; // HRD & Manager + $canViewPresensi = $isHrd || $isManager || $isSupervisor; + $canApproveIzin = $isHrd || $isManager; + $canViewLaporan = $isHrd || $isManager || $isSupervisor; // laporan kehadiran + $canViewLaporanIzin = $isHrd || $isManager; + $canViewJadwal = $isHrd || $isManager || $isSupervisor; + $canAccessWeb = $isHrd || $isManager || $isSupervisor; + @endphp + + {{-- ── Footer: Pengaturan Akun & Logout ── --}}
@@ -310,7 +351,7 @@ class="flex w-full items-center px-4 py-3 rounded-xl text-red-500 hover:bg-red-5 display: none; } .no-scrollbar { - -ms-overflow-style: none; /* IE and Edge */ - scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; + scrollbar-width: none; } diff --git a/resources/views/presensi/index.blade.php b/resources/views/presensi/index.blade.php index 99a0bba5..1009c982 100644 --- a/resources/views/presensi/index.blade.php +++ b/resources/views/presensi/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.app') +@extends('layouts.app') @section('title', 'Monitoring Presensi') @@ -24,7 +24,7 @@
- @if(Auth::user()->roles->contains(fn($role) => in_array(strtolower($role->nama_role), ['admin', 'super admin', 'super_admin']))) + @if(Auth::user()->roles->contains(fn($role) => strtolower($role->nama_role) === 'hrd')) @@ -212,7 +212,7 @@ class="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-bold @endif - @if(Auth::user()->roles->contains(fn($role) => in_array(strtolower($role->nama_role), ['admin', 'super admin', 'super_admin']))) + @if(Auth::user()->roles->contains(fn($role) => strtolower($role->nama_role) === 'hrd')) diff --git a/routes/web.php b/routes/web.php index e985a616..519affd8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -74,11 +74,10 @@ Route::post('/tanda-tangan', [SignatureController::class, 'store'])->name('signature.store'); }); -Route::middleware(['auth', 'role:admin'])->group(function () { +Route::middleware(['auth', 'role:hrd'])->group(function () { Route::resource('divisi', DivisiController::class)->except(['create', 'edit', 'show']); Route::resource('jabatan', JabatanController::class); Route::resource('kantor', KantorController::class)->except(['create', 'show', 'edit']); - // Role route moved to super admin group Route::resource('shift', \App\Http\Controllers\ShiftController::class)->except(['create', 'edit', 'show']); Route::resource('jadwal', \App\Http\Controllers\JadwalController::class)->except(['edit', 'show']); Route::resource('pegawai', PegawaiController::class); @@ -99,9 +98,7 @@ Route::get('/tukar-shift/jadwal-user', [\App\Http\Controllers\TukarShiftController::class, 'getJadwalUser'])->name('tukar-shift.jadwal-user'); Route::resource('tukar-shift', \App\Http\Controllers\TukarShiftController::class)->only(['index', 'create', 'store']); -}); -Route::middleware(['auth', 'role:super admin,super_admin'])->group(function () { Route::get('/permissions', [PermissionController::class, 'index'])->name('permission.index'); Route::post('/permissions', [PermissionController::class, 'store'])->name('permission.store'); Route::post('/permissions/sync/{id_role}', [PermissionController::class, 'sync'])->name('permission.sync');