HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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']);
    }
}