diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php
index 20abd9b..7d90f3f 100644
--- a/app/Http/Controllers/DashboardController.php
+++ b/app/Http/Controllers/DashboardController.php
@@ -7,6 +7,7 @@ use App\Models\ServiceTask;
use App\Enums\IntegrationStatus;
use App\Enums\ServiceTaskStatus;
use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
class DashboardController extends Controller
@@ -24,7 +25,7 @@ class DashboardController extends Controller
}
// If user has a service role
- $serviceRoles = ['DSI', 'Batiment', 'Parc Auto'];
+ $serviceRoles = \App\Models\Service::pluck('name')->toArray();
foreach ($serviceRoles as $role) {
if ($user->hasRole($role)) {
return $this->serviceDashboard($role);
@@ -40,9 +41,17 @@ class DashboardController extends Controller
protected function adminDashboard()
{
+ $driver = DB::connection()->getDriverName();
+ $diffQuery = 'TIMESTAMPDIFF(DAY, created_at, completed_at)';
+ if ($driver === 'pgsql') {
+ $diffQuery = 'EXTRACT(EPOCH FROM (completed_at - created_at)) / 86400';
+ } elseif ($driver === 'sqlite') {
+ $diffQuery = 'CAST(julianday(completed_at) - julianday(created_at) AS INTEGER)';
+ }
+
$avgCompletionTime = IntegrationRequest::where('status', IntegrationStatus::Completed)
->whereNotNull('completed_at')
- ->selectRaw('AVG(TIMESTAMPDIFF(DAY, created_at, completed_at)) as avg_days')
+ ->selectRaw("AVG({$diffQuery}) as avg_days")
->value('avg_days') ?? 0;
$serviceDistribution = \App\Models\Service::withCount('serviceTasks')->get()->map(function ($service) {
diff --git a/app/Http/Controllers/PermissionController.php b/app/Http/Controllers/PermissionController.php
new file mode 100644
index 0000000..19013e3
--- /dev/null
+++ b/app/Http/Controllers/PermissionController.php
@@ -0,0 +1,82 @@
+user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ return Inertia::render('Permission/Index', [
+ 'permissions' => Permission::all(),
+ ]);
+ }
+
+ public function create()
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ return Inertia::render('Permission/Create');
+ }
+
+ public function store(Request $request)
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ $validated = $request->validate([
+ 'name' => 'required|string|unique:permissions,name',
+ ]);
+
+ Permission::create(['name' => $validated['name']]);
+
+ return redirect()->route('permissions.index')->with('success', 'Permission créée avec succès.');
+ }
+
+ public function edit(Permission $permission)
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ return Inertia::render('Permission/Edit', [
+ 'permission' => $permission,
+ ]);
+ }
+
+ public function update(Request $request, Permission $permission)
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ $validated = $request->validate([
+ 'name' => 'required|string|unique:permissions,name,' . $permission->id,
+ ]);
+
+ $permission->update(['name' => $validated['name']]);
+
+ return redirect()->route('permissions.index')->with('success', 'Permission mise à jour avec succès.');
+ }
+
+ public function destroy(Permission $permission)
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ $permission->delete();
+
+ return redirect()->route('permissions.index')->with('success', 'Permission supprimée avec succès.');
+ }
+}
diff --git a/app/Http/Controllers/ServiceController.php b/app/Http/Controllers/ServiceController.php
new file mode 100644
index 0000000..ac5a4df
--- /dev/null
+++ b/app/Http/Controllers/ServiceController.php
@@ -0,0 +1,136 @@
+user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ return Inertia::render('Service/Index', [
+ 'services' => Service::all(),
+ ]);
+ }
+
+ public function create()
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ return Inertia::render('Service/Create');
+ }
+
+ public function store(Request $request)
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ $validated = $request->validate([
+ 'name' => 'required|string|max:255|unique:services,name',
+ 'code' => 'required|string|max:50|unique:services,code',
+ 'is_active' => 'boolean',
+ ]);
+
+ $service = Service::create([
+ 'name' => $validated['name'],
+ 'code' => strtolower($validated['code']),
+ 'is_active' => $validated['is_active'] ?? true,
+ ]);
+
+ // Création de la Permission (tâche)
+ $permissionName = 'manage ' . strtolower($service->name) . ' tasks';
+ Permission::firstOrCreate(['name' => $permissionName]);
+
+ // Création du Rôle pour ce Service
+ $role = Role::firstOrCreate(['name' => $service->name]);
+ $role->givePermissionTo([
+ $permissionName,
+ 'view dashboard',
+ ]);
+
+ return redirect()->route('services.index')->with('success', 'Service créé avec succès.');
+ }
+
+ public function edit(Service $service)
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ return Inertia::render('Service/Edit', [
+ 'service' => $service,
+ ]);
+ }
+
+ public function update(Request $request, Service $service)
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ $validated = $request->validate([
+ 'name' => 'required|string|max:255|unique:services,name,' . $service->id,
+ 'code' => 'required|string|max:50|unique:services,code,' . $service->id,
+ 'is_active' => 'boolean',
+ ]);
+
+ $oldName = $service->name;
+
+ $service->update([
+ 'name' => $validated['name'],
+ 'code' => strtolower($validated['code']),
+ 'is_active' => $validated['is_active'] ?? true,
+ ]);
+
+ // Si le nom du service change, on met à jour le rôle et la permission correspondante
+ if ($oldName !== $service->name) {
+ $oldPermissionName = 'manage ' . strtolower($oldName) . ' tasks';
+ $newPermissionName = 'manage ' . strtolower($service->name) . ' tasks';
+
+ $permission = Permission::where('name', $oldPermissionName)->first();
+ if ($permission) {
+ $permission->update(['name' => $newPermissionName]);
+ }
+
+ $role = Role::where('name', $oldName)->first();
+ if ($role) {
+ $role->update(['name' => $service->name]);
+ }
+ }
+
+ return redirect()->route('services.index')->with('success', 'Service mis à jour avec succès.');
+ }
+
+ public function destroy(Service $service)
+ {
+ if (!auth()->user()->hasRole('Admin')) {
+ abort(403);
+ }
+
+ $permissionName = 'manage ' . strtolower($service->name) . ' tasks';
+ $permission = Permission::where('name', $permissionName)->first();
+ if ($permission) {
+ $permission->delete();
+ }
+
+ $role = Role::where('name', $service->name)->first();
+ if ($role) {
+ $role->delete();
+ }
+
+ $service->delete();
+
+ return redirect()->route('services.index')->with('success', 'Service supprimé avec succès.');
+ }
+}
diff --git a/public/favicon.ico b/public/favicon.ico
index e69de29..3427eb5 100644
Binary files a/public/favicon.ico and b/public/favicon.ico differ
diff --git a/public/favicon.png b/public/favicon.png
new file mode 100644
index 0000000..3427eb5
Binary files /dev/null and b/public/favicon.png differ
diff --git a/resources/js/Layouts/AuthenticatedLayout.vue b/resources/js/Layouts/AuthenticatedLayout.vue
index de9c84d..29e6a70 100644
--- a/resources/js/Layouts/AuthenticatedLayout.vue
+++ b/resources/js/Layouts/AuthenticatedLayout.vue
@@ -53,6 +53,20 @@ const showingNavigationDropdown = ref(false);
>
Rôles
+
+ Permissions
+
+
+ Services
+
@@ -174,6 +188,20 @@ const showingNavigationDropdown = ref(false);
>
Rôles
+
+ Permissions
+
+
+ Services
+
diff --git a/resources/js/Pages/Permission/Create.vue b/resources/js/Pages/Permission/Create.vue
new file mode 100644
index 0000000..7736af4
--- /dev/null
+++ b/resources/js/Pages/Permission/Create.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+ Nouvelle Permission
+
+
+
+
+
+
diff --git a/resources/js/Pages/Permission/Edit.vue b/resources/js/Pages/Permission/Edit.vue
new file mode 100644
index 0000000..8b40bc5
--- /dev/null
+++ b/resources/js/Pages/Permission/Edit.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+ Modifier la Permission
+
+
+
+
+
+
diff --git a/resources/js/Pages/Permission/Index.vue b/resources/js/Pages/Permission/Index.vue
new file mode 100644
index 0000000..247a8e8
--- /dev/null
+++ b/resources/js/Pages/Permission/Index.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+ Gestion des Permissions
+
+
+
Nouvelle Permission
+
+
+
+
+
+
+
+
+
+
+
+ | Nom |
+ Actions |
+
+
+
+
+ |
+ {{ permission.name }}
+ |
+
+ Modifier
+
+ |
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/Pages/Service/Create.vue b/resources/js/Pages/Service/Create.vue
new file mode 100644
index 0000000..bbcedeb
--- /dev/null
+++ b/resources/js/Pages/Service/Create.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+ Nouveau Service
+
+
+
+
+
+
diff --git a/resources/js/Pages/Service/Edit.vue b/resources/js/Pages/Service/Edit.vue
new file mode 100644
index 0000000..64d0ff9
--- /dev/null
+++ b/resources/js/Pages/Service/Edit.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+ Modifier le Service
+
+
+
+
+
+
diff --git a/resources/js/Pages/Service/Index.vue b/resources/js/Pages/Service/Index.vue
new file mode 100644
index 0000000..d262a27
--- /dev/null
+++ b/resources/js/Pages/Service/Index.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+ Gestion des Services
+
+
+
Nouveau Service
+
+
+
+
+
+
+
+
+
+
+
+ | Nom |
+ Code |
+ Statut |
+ Actions |
+
+
+
+
+ |
+ {{ service.name }}
+ |
+
+ {{ service.code }}
+ |
+
+
+ Actif
+
+
+ Inactif
+
+ |
+
+ Modifier
+
+ |
+
+
+
+
+
+
+
+
+
diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php
index 334627a..78a27f0 100644
--- a/resources/views/app.blade.php
+++ b/resources/views/app.blade.php
@@ -5,6 +5,7 @@
{{ config('app.name', 'Laravel') }}
+
diff --git a/routes/web.php b/routes/web.php
index 5724f98..5902997 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -41,6 +41,8 @@ Route::middleware('auth')->group(function () {
Route::resource('users', \App\Http\Controllers\UserController::class);
Route::resource('roles', \App\Http\Controllers\RoleController::class);
+ Route::resource('permissions', \App\Http\Controllers\PermissionController::class);
+ Route::resource('services', \App\Http\Controllers\ServiceController::class);
});
require __DIR__.'/auth.php';