SIGDA - LOGIN + SESIONES + ROLES + PERMISOS

Este parche instala la primera capa de seguridad y acceso del sistema.

Incluye:
- Login /login
- Autenticación con password_hash/password_verify
- Regeneración de sesión al iniciar sesión
- Logout /logout
- Usuario autenticado disponible en sesión
- Roles cargados desde usuarios_roles
- Permisos cargados desde roles_permisos
- Protección global de rutas mediante Router
- Restricción de módulos según permisos
- Dashboard inicial según rol
- Mi perfil /perfil
- Cambiar contraseña /perfil/cambiarclave
- Menú lateral dinámico según permisos
- Pantalla de acceso denegado 403

ARCHIVOS:

app/
├── core/
│   ├── Auth.php
│   ├── Router.php
│   └── Session.php
├── controllers/
│   ├── LoginController.php
│   ├── PerfilController.php
│   └── DashboardController.php
├── models/
│   └── Usuario.php
└── views/
    ├── auth/
    │   ├── login.php
    │   └── denied.php
    ├── perfil/
    │   ├── index.php
    │   └── cambiar-clave.php
    └── partials/
        └── sidebar.php

NO se modifica la BD.
El esquema existente ya tiene:
- usuarios
- roles
- permisos
- usuarios_roles
- roles_permisos

El esquema también tiene usuarios.clave como VARCHAR(255) y ultimo_acceso,
y el usuario administrador inicial del SQL ya tiene password hash.
Las relaciones de permisos se realizan por roles_permisos.

PRUEBA:

1. Reinicia Apache.
2. Abre:
   /SIGDA/
3. Debe enviar al login si no existe sesión.
4. Inicia sesión con tu usuario.
5. El sistema cargará roles y permisos.
6. Si el usuario tiene permiso, verá el módulo.
7. Si intenta escribir una ruta sin permiso, aparecerá Acceso denegado.

DASHBOARD INICIAL:

Administrador -> /
Supervisor -> /
Cajero -> /caja
Repartidor -> /repartidores
Operador -> /pedidos

Los permisos reales de cada usuario se leen desde roles_permisos.
Por eso el menú no debe confiar solamente en el nombre del rol.

IMPORTANTE:
- Mantener mayúsculas/minúsculas exactamente.
- No modificar Cuentas por cobrar.
- No modificar RRHH, Planilla, Inventario, Compras ni Caja en esta actualización.
- El sidebar sí se reemplaza porque ahora debe filtrar opciones según permisos.
- Si ya tienes un DashboardController con lógica propia, revisa antes de sustituirlo; la versión incluida es mínima y solo pasa el usuario/roles al dashboard existente.
