File: /var/www/gestion-formularios.bdfschool/app/Http/Controllers/ProfileController.php
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\Permissions;
use App\Models\PermissionsProfile;
use App\Models\Profiles;
use Exception;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
public function __construct()
{
$this->middleware('auth.users')->except('logout');
$this->middleware('auth.users:LIST_PROFILES')->only(['index']);
$this->middleware('auth.users:ADD_PROFILES')->only(['create', 'store']);
$this->middleware('auth.users:EDIT_PROFILES')->only(['edit', 'update']);
$this->middleware('auth.users:CANCEL_PROFILES')->only(['destroy']);
}
public function index()
{
$sidenav = 'profiles';
$sidenav_item = 'profiles_list';
$title = 'Gestión de Perfiles';
$title_table = 'Listado de Perfiles';
$list_data = Profiles::where('deleted', false)
->when(auth()->user()->profile_id != 1, function ($query) {
return $query->where('show_user', true);
})
->get();
return view('admin.profiles.profiles_list', compact(
'title',
'sidenav',
'sidenav_item',
'title_table',
'list_data'
));
}
public function create()
{
$sidenav = 'profiles';
$sidenav_item = 'profiles_new';
$title = 'Nueva Perfil';
$title_form = 'Formulario de Registro de Perfil';
return view(
'admin.profiles.profiles_new',
compact(
'title',
'sidenav',
'sidenav_item',
'title_form'
)
);
}
public function store(Request $request)
{
$this->validateData($request);
$register_data = $this->createOrUpdate($request, '');
if ($register_data > 0) {
return redirect(route('profiles'))->with(['success_message' => 'Perfil Creado Correctamente'])->with(['success_message_title' => 'GESTIÓN DE PERFILES']);
}
return back()->with(['danger_message' => 'Ha Ocurrido un error al crear. Intente Nuevamente: ' . $register_data])->with(['danger_message_title' => 'ERROR INTERNO'])->withInput();
}
public function edit($register_id)
{
$form_data = $this->validateExists($register_id);
if (empty($form_data) || ($register_id == 1 && auth()->user()->profile_id != 1)) {
return redirect(route('profiles'))->with(['danger_message' => 'Registro No existe o fue Eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
}
$sidenav = 'profiles';
$sidenav_item = 'profiles_list';
$title = 'Editar Perfil';
$title_form = 'Formulario de Edición de Perfil';
return view(
'admin.profiles.profiles_edit',
compact(
'title',
'sidenav',
'sidenav_item',
'title_form',
'form_data'
)
);
}
public function update(Request $request, $register_id)
{
$register_data = $this->validateExists($register_id);
if (empty($register_data) || ($register_id == 1 && auth()->user()->profile_id != 1)) {
return redirect(route('profiles'))->with(['danger_message' => 'Registro No existe o fue Eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
}
$this->validateData($request);
$register_data = $this->createOrUpdate($request, $register_data);
if ($register_data > 0) {
return redirect(route('profiles'))->with(['success_message' => 'Perfil Modificado Correctamente'])->with(['success_message_title' => 'GESTIÓN DE PERFILES']);
}
return back()->with(['danger_message' => 'Ha Ocurrido un error al modificar. Intente Nuevamente'])->with(['danger_message_title' => 'ERROR INTERNO'])->withInput();
}
private function validateData(Request $request)
{
$this->validate($request, [
'name' => 'required|min:3|max:100',
], [
'name.required' => 'Nombre de Perfil Requerido',
'name.min' => 'Nombre de Perfil debe tener Mínimo 3 Caracteres',
'name.max' => 'Nombre de Perfil debe tener Máximo 100 Caracteres',
]);
}
private function validateExists($register_id)
{
$error = false;
if (!is_numeric($register_id)) {
$error = true;
}
$register_data = [];
if (!$error) {
$register_data = Profiles::where('deleted', false)->where('id', $register_id)->first();
if (empty($register_data)) {
$error = true;
}
}
return $register_data;
}
private function createOrUpdate(Request $request, $register_data = '')
{
try {
if (empty($register_data)) {
$register_data = new Profiles();
$register_data->created_at = ahoraServidor();
$register_data->user_created = auth()->user()->id;
}
$register_data->profile = strUpper($request->name);
$register_data->description = !empty($request->description) ? $request->description : null;
$register_data->status = isset($request->status) ? ($request->status == 1 ? true : false) : true;
$register_data->show_user = isset($request->show_user) ? ($request->show_user == 1 ? true : false) : true;
$register_data->updated_at = ahoraServidor();
$register_data->user_updated = auth()->user()->id;
return $register_data->save() ? $register_data->id : 0;
} catch (Exception $e) {
return $e->getMessage();
}
}
public function edit_permission($register_id)
{
$form_data = $this->validateExists($register_id);
if (empty($form_data) || ($register_id == 1 && auth()->user()->profile_id != 1)) {
return redirect(route('profiles'))->with(['danger_message' => 'Registro No existe o fue Eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
}
$permissions_users = PermissionsProfile::where('deleted', false)
->where('profile_id', $register_id)
->pluck('permission_id'); // Solo obtener los IDs de los permisos
$permissions = Permissions::where('deleted', false)->where('status', true)->get();
$permissions_users_ids = $permissions_users->toArray();
$permissions_list = [];
foreach ($permissions as $p) {
$checked = in_array($p->id, $permissions_users_ids) ? 1 : 0;
$arr = [
'id' => $p->id,
'permission' => $p->permission,
'checked' => $checked,
'description' => $p->description,
];
$permissions_list[$p->category][$p->id] = $arr;
}
$sidenav = 'profiles';
$sidenav_item = 'profiles_list';
$title = 'Asignación de Permisos';
$title_form = 'Formulario de Asignación de Permisos';
return view(
'admin.profiles.profiles_edit_permission',
compact(
'title',
'sidenav',
'sidenav_item',
'title_form',
'form_data',
'permissions_list'
)
);
}
public function update_permission(Request $request, $register_id)
{
$register_data = $this->validateExists($register_id);
if (empty($register_data) || ($register_id == 1 && auth()->user()->profile_id != 1)) {
return redirect(route('profiles'))
->with([
'danger_message' => 'Registro No existe o fue Eliminado',
'danger_message_title' => 'ERROR DE VALIDACIÓN'
]);
}
try {
// Primero, desactiva los permisos existentes que ya no están en la lista
$existingPermissions = PermissionsProfile::where('profile_id', $register_id)->get();
$existingPermissionIds = $existingPermissions->pluck('permission_id')->toArray();
$newPermissions = $request->input('permission', []);
$newPermissionIds = [];
foreach ($newPermissions as $category => $permissions) {
foreach ($permissions as $permission_id) {
$newPermissionIds[] = $permission_id;
}
}
// Desactivar permisos que ya no están en la lista
PermissionsProfile::where('profile_id', $register_id)
->whereIn('permission_id', $existingPermissionIds)
->whereNotIn('permission_id', $newPermissionIds)
->update([
'deleted' => true,
'deleted_at' => now(),
'user_deleted' => auth()->user()->id
]);
// Crear permisos nuevos o actualizar los existentes
foreach ($newPermissions as $category => $permissions) {
foreach ($permissions as $permission_id) {
$permission = Permissions::find($permission_id);
if ($permission) {
$permissionProfile = PermissionsProfile::where('profile_id', $register_id)
->where('permission_id', $permission_id)
->first();
if ($permissionProfile) {
// Si el permiso ya existe, asegurarse de que no esté marcado como eliminado
$permissionProfile->update([
'deleted' => false,
'deleted_at' => null,
'user_updated' => auth()->user()->id
]);
} else {
// Crear un nuevo permiso
PermissionsProfile::create([
'profile_id' => $register_id,
'permission_id' => $permission_id,
'created_at' => now(),
'user_created' => auth()->user()->id,
'deleted' => false
]);
}
}
}
}
} catch (Exception $e) {
return back()->with([
'danger_message' => 'Ha Ocurrido un error al modificar. Intente Nuevamente: ' . $e->getMessage(),
'danger_message_title' => 'ERROR INTERNO'
])->withInput();
}
return redirect(route('profiles'))->with([
'success_message' => 'Perfil Modificado Correctamente',
'success_message_title' => 'GESTIÓN DE PERFILES'
]);
}
public function destroy(Request $request)
{
$this->validate($request, [
'id_modal' => 'required',
], [
'id_modal.required' => 'Id de registro Requerido',
]);
$register_data = $this->validateExists($request->id_modal);
if (empty($register_data)) {
return redirect(route('profiles'))->with(['danger_message' => 'Registro No existe o fue Eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
}
if (in_array($register_data->id, PROFILES_PROTECTED)) {
return redirect(route('profiles'))->with(['danger_message' => 'Perfil de sistema no puede ser eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
}
$register_data->deleted = true;
$register_data->deleted_at = ahoraServidor();
$register_data->user_deleted = auth()->user()->id;
if ($register_data->save()) {
return redirect(route('profiles'))->with(['success_message' => 'Registro Eliminado Correctamente'])->with(['success_message_title' => 'GESTIÓN DE PERFILES']);
}
return back()->with(['danger_message' => 'Ha Ocurrido un error al eliminar. Intente Nuevamente'])->with(['danger_message_title' => 'ERROR INTERNO']);
}
}