# Sistema de Control de Horarios Laborales

## Descripción General

El sistema implementa un control de acceso basado en horarios laborales que restringe el acceso al sistema cuando los empleados están fuera de su horario establecido.

## Funcionalidades Implementadas

### 1. **Control de Acceso Automático**
- **Verificación en tiempo real**: El sistema verifica automáticamente si el empleado está dentro de su horario laboral
- **Redirección automática**: Si está fuera de horario, se redirige a la página `fuera_horario.php`
- **Middleware global**: Todas las páginas del sistema están protegidas por el middleware de horarios

### 2. **Páginas del Sistema**

#### `dashboard.php`
- **Función**: Página principal del sistema
- **Control**: Verifica horario antes de mostrar el dashboard
- **Redirección**: Si está fuera de horario → `fuera_horario.php`
- **Actualización**: Verifica horario cada minuto automáticamente

#### `fuera_horario.php`
- **Función**: Página de acceso restringido
- **Contenido**: 
  - Mensaje de "Fuera del Horario Laboral"
  - Información del horario del empleado
  - Horario semanal completo
  - Botón para verificar horario manualmente
  - Botón para cerrar sesión
- **Verificación automática**: Cada minuto verifica si ya puede acceder

#### `verificar_horario.php`
- **Función**: API para verificar horario via AJAX
- **Respuesta**: JSON con estado del horario
- **Uso**: Verificación manual y automática

#### `includes/check_horario.php`
- **Función**: Middleware de verificación de horarios
- **Inclusión**: Se incluye en `header.php` (todas las páginas)
- **Exclusiones**: Páginas que no requieren verificación:
  - `fuera_horario.php`
  - `verificar_horario.php`
  - `logout.php`
  - `login.php`
  - `index.php`

### 3. **Lógica de Verificación**

#### Cálculo del Día Actual
```php
$diaActual = date('N'); // 1=Lunes, 2=Martes, ..., 7=Domingo
```

#### Verificación de Horario
```php
// Consulta para obtener horario del día actual
SELECT h.*, d.diasemana, d.coddiasemana
FROM thorario h
LEFT JOIN tdiasemana d ON h.coddiasemana = d.coddiasemana
WHERE h.codtipohorario = ? AND d.coddiasemana = ?
```

#### Estados del Horario
- **Dentro del horario**: `$horaActual >= $horaInicio && $horaActual <= $horaFin`
- **Antes del horario**: `$horaActual < $horaInicio`
- **Después del horario**: `$horaActual > $horaFin`
- **Sin horario**: No hay registro para el día actual

### 4. **Flujo del Sistema**

#### Acceso Normal (Dentro de Horario)
1. Usuario accede a cualquier página
2. `check_horario.php` verifica el horario
3. Si está dentro del horario → Acceso permitido
4. Dashboard muestra información del horario

#### Acceso Fuera de Horario
1. Usuario accede a cualquier página
2. `check_horario.php` verifica el horario
3. Si está fuera del horario → Redirección a `fuera_horario.php`
4. Página muestra mensaje de acceso restringido
5. Verificación automática cada minuto
6. Cuando entra en horario → Redirección automática al dashboard

### 5. **Base de Datos**

#### Tablas Involucradas
- **`templeado`**: Información del empleado y `codtipohorario`
- **`tipohorario`**: Tipos de horario disponibles
- **`thorario`**: Horarios específicos por día
- **`tdiasemana`**: Días de la semana

#### Relaciones
```
templeado.codtipohorario → tipohorario.codtipohorario
thorario.codtipohorario → tipohorario.codtipohorario
thorario.coddiasemana → tdiasemana.coddiasemana
```

### 6. **Configuración Requerida**

#### Para que funcione el sistema:
1. **Empleados deben tener `codtipohorario` asignado** (campo obligatorio)
2. **Deben existir horarios configurados** en la tabla `thorario`
3. **Los días de la semana deben estar definidos** en `tdiasemana`

#### Ejemplo de configuración:
```sql
-- Insertar días de la semana
INSERT INTO tdiasemana (coddiasemana, diasemana) VALUES 
(1, 'Lunes'), (2, 'Martes'), (3, 'Miércoles'), 
(4, 'Jueves'), (5, 'Viernes'), (6, 'Sábado'), (7, 'Domingo');

-- Insertar tipo de horario
INSERT INTO tipohorario (tipohorario) VALUES ('Horario Normal');

-- Insertar horario para Lunes (coddiasemana = 1)
INSERT INTO thorario (codtipohorario, horainicio, horafinal, coddiasemana) 
VALUES (1, '08:00:00', '17:00:00', 1);
```

### 7. **Características de Seguridad**

#### Protección Completa
- **Todas las páginas protegidas**: Excepto las excluidas
- **Verificación en tiempo real**: Cada minuto
- **Sesión persistente**: No se pierde la sesión al cambiar de horario
- **Mensajes informativos**: El usuario sabe por qué no puede acceder

#### Manejo de Errores
- **Errores de base de datos**: Acceso denegado por seguridad
- **Empleado sin horario**: Acceso denegado
- **Día sin horario**: Acceso denegado

### 8. **Interfaz de Usuario**

#### Dashboard (Dentro de Horario)
- ✅ Estado verde: "Está dentro de su horario laboral"
- 📊 Estadísticas de empleados activos
- 📅 Horario semanal completo
- 🔄 Actualización automática

#### Página Fuera de Horario
- ⚠️ Alerta roja: "Acceso Restringido"
- 📋 Información detallada del horario
- 🔄 Botón de verificación manual
- 📅 Horario semanal para referencia
- 🚪 Opción de cerrar sesión

### 9. **Mantenimiento y Monitoreo**

#### Logs Recomendados
- Accesos fuera de horario
- Cambios de estado de horario
- Errores de verificación

#### Métricas Útiles
- Empleados activos por hora
- Intentos de acceso fuera de horario
- Horarios más comunes

## Conclusión

El sistema proporciona un control completo de acceso basado en horarios laborales, asegurando que los empleados solo puedan acceder al sistema durante sus horas de trabajo establecidas. La implementación es robusta, segura y proporciona una experiencia de usuario clara y informativa.
