===================================================================
 ALIGANT ERP V5 - ROLES, PERMISOS Y USUARIOS (RBAC propio)
===================================================================
Sistema de control de acceso SIN paquetes externos.
Esquema solicitado:
  - roles
  - permissions
  - role_permission   (rol  <-> permiso)
  - user_branch       (usuario <-> sucursal)
  - users  + columnas: role_id, activo
Relaciones por llaves foráneas. Diseño actual (aerp-*) intacto.
Requiere: Empresas y Sucursales ya existentes + MySQL configurado.

-------------------------------------------------------------------
 1) ARCHIVOS (descomprimir sobre el proyecto, combinar/sobrescribir)
-------------------------------------------------------------------
NUEVOS:
  database/migrations/2025_03_01_000001_create_roles_table.php
  database/migrations/2025_03_01_000002_create_permissions_table.php
  database/migrations/2025_03_01_000003_create_role_permission_table.php
  database/migrations/2025_03_01_000004_create_user_branch_table.php
  database/migrations/2025_03_01_000005_add_role_id_and_activo_to_users_table.php
  database/seeders/RbacSeeder.php
  app/Models/Role.php
  app/Models/Permission.php
  app/Http/Controllers/RoleController.php
  app/Http/Controllers/PermissionController.php
  app/Http/Controllers/UserController.php
  app/Http/Requests/RoleRequest.php
  app/Http/Requests/PermissionRequest.php
  app/Http/Requests/UserRequest.php
  resources/views/roles/{index,create,edit,show,_form}.blade.php
  resources/views/permisos/{index,create,edit,show,_form}.blade.php
  resources/views/usuarios/{index,create,edit,show,_form}.blade.php

REEMPLAZADOS:
  app/Models/User.php                          (agrega role_id, activo, relaciones, permisos)
  app/Providers/AppServiceProvider.php         (Gate por permisos -> habilita @can)
  routes/web.php                               (agrega usuarios, roles, permisos)
  resources/views/layouts/sidebar.blade.php    (menú filtrado por permisos)

  *** Si tu User.php tenía algo extra (traits, casts propios), revísalo:
      este User.php es la versión RBAC completa, sin paquetes.
  *** Si tu web.php tenía rutas adicionales, vuelve a agregarlas; este
      web.php trae welcome, dashboard, profile, empresas, sucursales,
      usuarios, roles y permisos.

-------------------------------------------------------------------
 2) COMANDOS (en orden) en C:\xampp2\htdocs\aligant_erp_v5
-------------------------------------------------------------------
  php artisan migrate
  php artisan db:seed --class=Database\\Seeders\\RbacSeeder
  php artisan optimize:clear

  -> El seeder crea los permisos, el rol "Administrador" con TODOS los
     permisos, un rol "Operador" de ejemplo, y asigna "Administrador"
     a los usuarios que aún no tienen rol (para que NO te quedes sin menú).

  (Opcional, en Windows si el namespace da problemas, alternativa:)
     php artisan db:seed --class=RbacSeeder

-------------------------------------------------------------------
 3) IMPORTANTE - FILTRADO DEL MENÚ POR PERMISOS
-------------------------------------------------------------------
  - El menú lateral ya usa @can('empresas.ver'), @can('roles.ver'), etc.
  - @can funciona porque AppServiceProvider concede el permiso si el ROL
    del usuario tiene esa "clave" (ver Gate::before).
  - También puedes usar en cualquier vista/controlador:
        @can('usuarios.crear') ... @endcan
        auth()->user()->hasPermission('roles.editar')
        auth()->user()->hasAnyPermission(['empresas.ver','sucursales.ver'])
  - Si un usuario no tiene un permiso, NO verá ese ítem del menú.

  NOTA: este paso filtra el MENÚ. Las rutas siguen accesibles por URL
  (no se añadió middleware de permisos para no alterar el comportamiento
  existente). Si más adelante quieres BLOQUEAR rutas por permiso, se puede
  agregar middleware; dímelo y lo preparo.

-------------------------------------------------------------------
 4) USO
-------------------------------------------------------------------
  /roles      CRUD de roles (con asignación de permisos por módulo)
  /permisos   CRUD de permisos (modulo / nombre / clave)
  /usuarios   CRUD de usuarios (nombre, email, contraseña, rol,
              estado activo/inactivo y SELECCIÓN MÚLTIPLE de sucursales)

  Formulario de usuario:
   - Rol: selección única (users.role_id)
   - Sucursales: casillas múltiples agrupadas por empresa (tabla user_branch)

-------------------------------------------------------------------
 5) NOTAS TÉCNICAS
-------------------------------------------------------------------
  - users.role_id es nullable con FK a roles (nullOnDelete): si borras un
    rol, los usuarios quedan sin rol (no se borran).
  - No se puede eliminar el rol "Administrador" ni un rol con usuarios.
  - La migración de users es idempotente: solo agrega role_id/activo si
    no existen (no rompe si ya tenías 'activo').
  - Contraseña: se hashea sola (cast 'hashed' en el modelo User).

===================================================================
