Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/amarcano568/pensionalamedida/llms.txt

Use this file to discover all available pages before exploring further.

El módulo de Roles y Permisos de Pensión a la Medida implementa control de acceso basado en roles (RBAC) a través de la librería Spatie Laravel Permission. Cada usuario del sistema tiene asignado uno o más roles, y cada rol acumula un conjunto de permisos que determinan a qué módulos puede acceder. La gestión completa de roles y la asignación o revocación de permisos se realiza desde la interfaz web, sin necesidad de tocar el código fuente ni la base de datos directamente.

Acceso al módulo

El acceso a la vista de gestión de roles está protegido por el permiso gestion_roles. Cualquier usuario que no cuente con dicho permiso asignado a su rol recibirá una respuesta de acceso denegado al intentar navegar a esta ruta.
MétodoRutaControladorPermiso requerido
GET/gestion-rolesMantenimientoRolesController@gestionRolesgestion_roles
La ruta está declarada dentro de un grupo de middleware auth y un subgrupo permission:gestion_roles en routes/web.php:
Route::group(['middleware' => ['permission:gestion_roles']], function () {
    Route::get('gestion-roles', 'MantenimientoRolesController@gestionRoles')
        ->name('gestion-roles.gestionRoles');
});
La vista retornada es roles.gestion y recibe la colección completa de roles existentes en la tabla roles.

Permisos del sistema

Los siguientes permisos están definidos y activos en el sistema. Cada uno protege el acceso a la vista principal de su módulo respectivo mediante el middleware permission de Spatie.
PermisoMódulo protegidoRuta de acceso principal
gestion_alumnosGestión de estudiantes — altas, bajas, consultas, hospedaje y trabajos imputadosGET /gestionar-estudiantes
gestion_grupos_familiaresGestión de grupos familiares — creación, edición y eliminación de grupos e hijosGET /gestionar-grupos-familiares
gestion_residenciaGestión de residencia — habitaciones, huéspedes y mobiliariosGET /gestion-residencia
gestion_rolesGestión de roles y asignación de permisosGET /gestion-roles
Los permisos de soporte (listado, edición, eliminación) dentro de cada módulo no están cubiertos individualmente por el middleware de permiso; solo la ruta de acceso principal (vista de gestión) requiere el permiso correspondiente. El control sobre las acciones secundarias recae en la lógica de negocio del controlador.

Ver y cambiar permisos de un rol

Para inspeccionar o modificar los permisos de un rol específico, el frontend realiza una petición GET pasando el identificador numérico del rol. El servidor devuelve los datos del rol junto con dos listas HTML de elementos <li> listas para ser renderizadas en la UI de arrastrar y soltar.
MétodoRuta
GET/change-role
idRole
integer
required
Identificador numérico del rol a consultar. Corresponde al campo id de la tabla roles.
Ejemplo de petición:
GET /change-role?idRole=2
Ejemplo de respuesta JSON:
{
  "success": true,
  "mensaje": "Datos del role obtenido exitosamente",
  "data": {
    "id": 2,
    "name": "Administrador",
    "guard_name": "web",
    "created_at": "2021-05-10 09:30:00",
    "roleFormatDate": "10-05-2021  09:30:00"
  },
  "asignados": "<li class=\"permisoAsignado ui-state-default draggable-item\" permission=\"gestion_alumnos\">... Alumnos</li>",
  "disponibles": "<li class=\"permisoDisponible ui-state-default draggable-item\" permission=\"gestion_roles\">... Roles</li>"
}
El campo asignados contiene el HTML de los permisos ya asignados al rol y disponibles contiene los permisos aún no asignados. La lógica del controlador es:
$role = \Spatie\Permission\Models\Role::find($request->idRole);

$permisosAsignados   = $role->getPermissionNames();
$permisosDisponibles = \Spatie\Permission\Models\Permission::whereNotIn('name', $permisosAsignados)->get();
La UI de arrastrar y soltar renderiza los permisos disponibles y asignados como elementos <li> con las clases CSS permisoDisponible y permisoAsignado respectivamente, ambas con la clase adicional ui-state-default draggable-item. Esta estructura habilita las interacciones de jQuery UI Sortable — al mover un elemento entre las dos listas, el frontend llama automáticamente a los endpoints de asignar o revocar permiso.

Asignar un permiso

Otorga un permiso a un rol. Internamente el controlador llama al método givePermissionTo de Spatie sobre el modelo Role.
MétodoRuta
GET/dar-permiso-a
rol
integer
required
Identificador numérico del rol al que se desea asignar el permiso.
permiso
string
required
Nombre del permiso a asignar (ej. gestion_alumnos). Debe existir previamente en la tabla permissions.
Ejemplo de petición:
GET /dar-permiso-a?rol=2&permiso=gestion_alumnos
Ejemplo de respuesta exitosa:
{
  "success": true,
  "mensaje": "Permiso <strong>gestion_alumnos</strong> asignado al rol sastifactoriamente.",
  "data": ""
}
Ejemplo de respuesta fallida:
{
  "success": false,
  "mensaje": "Hubo un problema intentando asignar el permiso <strong>gestion_alumnos</strong> al rol.",
  "data": ""
}
El fragmento relevante del controlador:
$role = Role::findOrFail($request->rol);

if ($role->givePermissionTo($request->permiso)) {
    return response()->json([
        'success' => true,
        'mensaje' => 'Permiso <strong>' . $request->permiso . '</strong> asignado al rol sastifactoriamente.',
        'data'    => ''
    ]);
}

Revocar un permiso

Elimina un permiso previamente asignado a un rol. El controlador verifica primero que el rol posea el permiso (hasPermissionTo) antes de proceder con la revocación (revokePermissionTo).
MétodoRuta
GET/revocar-permiso
rol
integer
required
Identificador numérico del rol al que se desea revocar el permiso.
permiso
string
required
Nombre del permiso a revocar (ej. gestion_residencia). Debe estar asignado al rol o la operación retornará success: false.
Ejemplo de petición:
GET /revocar-permiso?rol=2&permiso=gestion_residencia
Ejemplo de respuesta exitosa:
{
  "success": true,
  "mensaje": "Permiso <strong>gestion_residencia</strong> revocado al rol sastifactoriamente.",
  "data": ""
}
Ejemplo de respuesta fallida (permiso no asignado):
{
  "success": false,
  "mensaje": "Hubo un problema intentando revocar el permiso <strong>gestion_residencia</strong> al rol.",
  "data": ""
}
El fragmento relevante del controlador:
$role = Role::findOrFail($request->rol);

if ($role->hasPermissionTo($request->permiso)) {
    $role->revokePermissionTo($request->permiso);
}

Crear un nuevo rol

Crea un nuevo rol vacío (sin permisos) en la base de datos. Una vez creado, aparece en el listado de roles y se le pueden asignar permisos mediante los endpoints descritos arriba.
MétodoRuta
POST/nuevo-role
newRole
string
required
Nombre del nuevo rol a crear (ej. "Recepcionista"). Se almacena en la columna name de la tabla roles con guard_name igual a web.
Ejemplo de petición:
POST /nuevo-role
Content-Type: application/x-www-form-urlencoded

newRole=Recepcionista
Ejemplo de respuesta exitosa:
{
  "success": true,
  "mensaje": "Rol <strong>Recepcionista</strong> creado sastifactoriamente.",
  "data": [
    { "id": 1, "name": "Administrador", "guard_name": "web" },
    { "id": 2, "name": "Recepcionista", "guard_name": "web" }
  ]
}
El campo data contiene la lista actualizada de todos los roles, lista para refrescar la tabla en el frontend. El fragmento relevante del controlador:
try {
    DB::beginTransaction();

    if (Role::create(['name' => $request->newRole])) {
        $roles = Roles::get();
        return response()->json([
            'success' => true,
            'mensaje' => 'Rol <strong>' . $request->newRole . '</strong> creado sastifactoriamente.',
            'data'    => $roles
        ]);
    } else {
        return response()->json([
            'success' => false,
            'mensaje' => 'Hubo un problema intentando crear el <strong>' . $request->newRole . '</strong>.',
            'data'    => ''
        ]);
    }
} catch (Exception $e) {
    DB::rollback();
}
La operación está envuelta en una transacción de base de datos (DB::beginTransaction / DB::rollback) para garantizar la integridad en caso de error.
El sistema de permisos de Spatie almacena en caché todos los permisos durante 24 horas (configurado en config/permission.phpcache.expiration_time). Cuando los permisos o roles se modifican a través de la UI, la caché se invalida automáticamente. Sin embargo, si realizas cambios directamente en la base de datos o mediante comandos Artisan fuera de la interfaz, debes limpiar la caché manualmente para que los cambios surtan efecto de inmediato:
php artisan permission:cache-reset

Build docs developers (and LLMs) love