diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php
index bb9d933..7677ad1 100644
--- a/app/Http/Controllers/SettingsController.php
+++ b/app/Http/Controllers/SettingsController.php
@@ -5,14 +5,18 @@ namespace App\Http\Controllers;
use App\Models\AdvanceType;
use Illuminate\Http\Request;
use Illuminate\View\View;
+use Spatie\Permission\Models\Permission;
+use Spatie\Permission\Models\Role;
class SettingsController extends Controller
{
public function index(): View
{
$advanceTypes = AdvanceType::orderBy('name')->get();
+ $roles = Role::with('permissions')->orderBy('name')->get();
+ $permissions = Permission::orderBy('name')->get();
- return view('settings.index', compact('advanceTypes'));
+ return view('settings.index', compact('advanceTypes', 'roles', 'permissions'));
}
public function storeAdvanceType(Request $request)
@@ -57,4 +61,28 @@ class SettingsController extends Controller
return redirect()->route('settings.index')->with('status', 'Rodzaj zaliczki został usunięty.');
}
+
+ public function storeRolePermissions(Request $request)
+ {
+ $request->validate([
+ 'permissions' => ['array'],
+ 'permissions.*' => ['array'],
+ 'permissions.*.*' => ['string'],
+ ]);
+
+ foreach ($request->input('permissions', []) as $roleId => $selectedPermissions) {
+ $role = Role::find($roleId);
+
+ if (! $role) {
+ continue;
+ }
+
+ $allPermissions = Permission::pluck('name')->all();
+ $selectedPermissions = is_array($selectedPermissions) ? $selectedPermissions : [];
+
+ $role->syncPermissions(array_intersect($allPermissions, $selectedPermissions));
+ }
+
+ return redirect()->route('settings.index')->with('status', 'Uprawnienia ról zostały zaktualizowane.');
+ }
}
diff --git a/resources/views/settings/index.blade.php b/resources/views/settings/index.blade.php
index 6169a01..85d9a5f 100644
--- a/resources/views/settings/index.blade.php
+++ b/resources/views/settings/index.blade.php
@@ -107,6 +107,49 @@
+
+
+
+
+
+
diff --git a/routes/web.php b/routes/web.php
index dd7d867..68e0c9c 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -40,6 +40,7 @@ Route::middleware(['auth', 'verified'])->group(function () {
Route::post('/settings/advance-types', [SettingsController::class, 'storeAdvanceType'])->name('settings.advance-types.store');
Route::put('/settings/advance-types/{advanceType}', [SettingsController::class, 'updateAdvanceType'])->name('settings.advance-types.update');
Route::delete('/settings/advance-types/{advanceType}', [SettingsController::class, 'destroyAdvanceType'])->name('settings.advance-types.destroy');
+ Route::post('/settings/role-permissions', [SettingsController::class, 'storeRolePermissions'])->name('settings.role-permissions.store');
});
// Moduł Raporty
diff --git a/tests/Feature/AdvanceTest.php b/tests/Feature/AdvanceTest.php
index a6c9ad6..ae36149 100644
--- a/tests/Feature/AdvanceTest.php
+++ b/tests/Feature/AdvanceTest.php
@@ -115,6 +115,27 @@ test('manager can edit and delete an advance type from settings', function () {
$this->assertDatabaseMissing('advance_types', ['id' => $type->id]);
});
+test('manager can update role permissions from settings', function () {
+ Permission::firstOrCreate(['name' => 'users_access']);
+ Permission::firstOrCreate(['name' => 'raporty_access']);
+ Permission::firstOrCreate(['name' => 'flota_access']);
+
+ $manager = User::factory()->create();
+ $managerRole = Role::firstOrCreate(['name' => 'kierownik']);
+ $managerRole->givePermissionTo('users_access');
+ $manager->assignRole($managerRole);
+
+ $response = $this->actingAs($manager)->post(route('settings.role-permissions.store'), [
+ 'permissions' => [
+ $managerRole->id => ['users_access', 'raporty_access'],
+ ],
+ ]);
+
+ $response->assertRedirect(route('settings.index'));
+ $this->assertTrue($managerRole->fresh()->hasPermissionTo('raporty_access'));
+ $this->assertFalse($managerRole->fresh()->hasPermissionTo('flota_access'));
+});
+
test('manager cannot delete an advance type that is still used in advances', function () {
Permission::firstOrCreate(['name' => 'users_access']);