Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions app/Http/Controllers/AreaController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

namespace App\Http\Controllers;

use App\Models\Area;
use Illuminate\Http\Request;
use PhpParser\Node\Arg;

class AreaController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('admin.areas.create');
}

/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
request()->validate([
'name' => 'required',
]);

$user = Area::create([
'name' => $request->name
]);

return redirect()->back()->with('success', 'Usuario creado correctamente.');
}

/**
* Display the specified resource.
*/
public function show(Area $area)
{
//
}

/**
* Show the form for editing the specified resource.
*/
public function edit(Area $area)
{
//
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request, Area $area)
{
//
}

/**
* Remove the specified resource from storage.
*/
public function destroy(Area $area)
{
//
}
}
10 changes: 10 additions & 0 deletions app/Http/Controllers/AreaRoleUserController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class AreaRoleUserController extends Controller
{
//
}
65 changes: 65 additions & 0 deletions app/Http/Controllers/RoleController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

namespace App\Http\Controllers;

use App\Models\Role;
use Illuminate\Http\Request;

class RoleController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}

/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}

/**
* Display the specified resource.
*/
public function show(Role $role)
{
//
}

/**
* Show the form for editing the specified resource.
*/
public function edit(Role $role)
{
//
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request, Role $role)
{
//
}

/**
* Remove the specified resource from storage.
*/
public function destroy(Role $role)
{
//
}
}
172 changes: 172 additions & 0 deletions app/Http/Controllers/UserController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Role;
use App\Models\Area;
use App\Models\AreaRoleUser;


class UserController extends Controller
{
public function index()
{
$users = User::with(['areaRoles.role', 'areaRoles.area'])->get();

return view('admin.users.index', compact('users'));
}

/**
* Show the form for creating a new resource.
*/
public function create()
{
$areas = Area::all();
$roles = Role::all();
return view('admin.users.create', compact('areas', 'roles'));
}

/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8|confirmed',
'role' => 'required',
]);

// Crear usuario
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password),
]);

// Buscar el rol por nombre
$role = Role::where('name', $request->role)->first();

// Verificar si es supervisor
if ($role && $role->name === 'Supervisor') {
// Preparar datos para mostrar antes de guardar
$areasSeleccionadas = [];

foreach ($request->areas ?? [] as $areaName) {
$area = Area::where('name', $areaName)->first();
if ($area) {
$areasSeleccionadas[] = [
'user_id' => $user->id,
'role_id' => $role->id,
'area_id' => $area->id,
];
}
}
foreach ($areasSeleccionadas as $relacion) {
AreaRoleUser::create($relacion);
}
}

if ($role && in_array($role->name, ['Admin', 'Soporte'])) {
// Asignar todas las áreas
$todasLasAreas = Area::all();
foreach ($todasLasAreas as $area) {
AreaRoleUser::create([
'user_id' => $user->id,
'role_id' => $role->id,
'area_id' => $area->id,
]);
}
}

return redirect()->back()->with('success', 'Usuario creado correctamente.');
}

/**
* Display the specified resource.
*/
public function show(User $user, $id)
{
$user = User::with(['areaRoles.role', 'areaRoles.area'])->find($id);

if (!$user) {
return redirect()->back()->with('error', 'Usuario no encontrado.');
}

$areas = Area::all();
$userRole = optional($user->areaRoles->first())->role->name ?? null;

return view('admin.users.show', compact('user', 'areas', 'userRole'));
}

/**
* Show the form for editing the specified resource.
*/
public function edit(User $user)
{
//
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request, User $user)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,' . $user->id,
'password' => 'nullable|string|min:8|confirmed',
'role' => 'required|string|exists:roles,name',
'areas' => 'array',
'areas.*' => 'integer|exists:areas,id',
]);

// 1. Actualizar datos básicos
$user->name = $request->name;
$user->email = $request->email;

if ($request->filled('password')) {
$user->password = bcrypt($request->password);
}

$user->save();

// 2. Obtener el rol por nombre
$role = Role::where('name', $request->role)->firstOrFail();

// 3. Eliminar asignaciones anteriores del usuario en area_role_users
AreaRoleUser::where('user_id', $user->id)->delete();

// 4. Determinar áreas a asignar
$areas = [];

if (in_array($role->name, ['Admin', 'Soporte'])) {
$areas = Area::pluck('id')->toArray(); // Todas las áreas
} elseif ($role->name === 'Supervisor') {
$areas = $request->areas ?? [];
}

// 5. Crear las nuevas asignaciones
foreach ($areas as $areaId) {
AreaRoleUser::create([
'user_id' => $user->id,
'role_id' => $role->id,
'area_id' => $areaId,
]);
}

return redirect()->route('users.index')->with('success', 'Usuario actualizado correctamente.');
}


/**
* Remove the specified resource from storage.
*/
public function destroy(User $user)
{
//
}
}
21 changes: 21 additions & 0 deletions app/Models/Area.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Area extends Model
{
use HasFactory;

protected $fillable = ['name'];

// Usuarios que pertenecen a esta área
public function users(): BelongsToMany
{
return $this->belongsToMany(User::class);
}

}
29 changes: 29 additions & 0 deletions app/Models/AreaRoleUser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class AreaRoleUser extends Model
{
use HasFactory;
protected $table = 'area_role_users';

protected $fillable = ['user_id', 'role_id', 'area_id'];

public function user()
{
return $this->belongsTo(User::class);
}

public function role()
{
return $this->belongsTo(Role::class);
}

public function area()
{
return $this->belongsTo(Area::class);
}
}
21 changes: 21 additions & 0 deletions app/Models/Role.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Role extends Model
{
use HasFactory;
protected $table = 'roles';

protected $fillable = ['name'];

// Usuarios con este rol
public function users(): BelongsToMany
{
return $this->belongsToMany(User::class, 'roles');
}
}
Loading
Loading