Files
contenedor_ibiza/README.md
2026-01-19 15:20:36 -06:00

257 lines
7.3 KiB
Markdown
Executable File

# Sistema de Administración de Apertura y Cierre de Contenedor
## Descripción
Sistema web en PHP + MySQL para administrar la apertura y cierre de un contenedor de basura, asignando turnos semanales a personas con horarios configurables.
## Requisitos
- PHP 7.4 o superior
- MySQL 5.7 o superior
- Extensión PHP PDO MySQL
- Composer (opcional)
- Servidor web (Apache/Nginx/PHP built-in)
## Instalación
### 1. Clonar o copiar los archivos
Copiar todos los archivos del proyecto al directorio del servidor web.
### 2. Configurar variables de entorno
Copiar el archivo de ejemplo:
```bash
cp .env.example .env
```
Editar el archivo `.env` con la configuración correcta:
```env
DB_HOST=localhost
DB_NAME=contenedor_ibiza
DB_USER=root
DB_PASS=tu_password
SITE_URL=http://localhost:8080
TELEGRAM_BOT_TOKEN=tu_token_de_telegram
```
### 3. Crear la base de datos
Ejecutar el script SQL:
```bash
mysql -u root -p < sql/schema.sql
```
O importar el archivo `sql/schema.sql` desde phpMyAdmin o cualquier cliente MySQL.
### 4. Configurar el servidor web
#### Con PHP built-in (desarrollo):
```bash
php -S localhost:8080 -t public
```
#### Con Apache:
Configurar el document root hacia la carpeta `public/`.
#### Con Nginx:
```nginx
server {
listen 80;
server_name localhost;
root /path/to/project/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
```
### 5. Credenciales de acceso
- **Email:** admin@ibiza.com
- **Contraseña:** admin123
## Estructura del Proyecto
```
contenedor/
├── .env.example # Variables de entorno
├── config/
│ └── config.php # Configuración general
├── public/ # Archivos públicos
│ ├── index.php # Redirección según rol
│ ├── login.php # Página de login
│ ├── logout.php # Cierre de sesión
│ ├── ayudante.php # Panel del ayudante
│ ├── admin/ # Panel de administración
│ │ ├── index.php # Dashboard
│ │ ├── usuarios.php # CRUD de usuarios
│ │ ├── horarios.php # Configuración de horarios
│ │ ├── asignaciones.php # Asignación de turnos con reordenamiento
│ │ └── webhook.php # Configuración del webhook del bot
│ └── partials/ # Compartials/
│ └── navbar.php # Barra de navegación
├── src/ # Código fuente
│ ├── Database.php # Conexión a BD
│ ├── Auth.php # Autenticación
│ ├── User.php # Modelo de usuarios
│ ├── DiasHorarios.php # Modelo de horarios
│ └── Asignacion.php # Modelo de asignaciones y rotación automática
├── bot/ # Bot de Telegram
│ ├── TelegramBot.php # Clase del bot con teclado de menú
│ ├── webhook.php # Webhook del bot
│ └── setup_webhook.php # Script CLI para configurar webhook
├── sql/
│ └── schema.sql # Esquema de base de datos
├── scripts/ # Scripts CLI
│ └── rotar_automatico.php # Script de rotación automática
└── assets/ # Recursos estáticos
├── css/
└── js/
```
## Configuración del Bot de Telegram
### 1. Crear un bot
1. Talking to @BotFather on Telegram
2. Send `/newbot` to create a new bot
3. Follow the instructions to set a name and username
4. Copy the API token
### 2. Configurar el webhook
El webhook puede configurarse de tres formas:
**Opción A: Desde el panel de administración**
1. Ir a Administración > Webhook
2. Ingresar la URL del bot
3. Click en "Configurar Webhook"
**Opción B: Con script CLI**
```bash
php bot/setup_webhook.php
```
**Opción C: Manualmente**
```
https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://tu-dominio.com/bot/webhook.php
```
### 3. Usar el bot
El bot tiene un teclado de menú con las siguientes opciones:
- **📅 Ver Turnos** - Muestra todos los turnos de la semana actual
- **🔍 ¿Qué Semana Es?** - Indica la semana actual del ciclo de rotación
- **📋 Ayuda** - Muestra los comandos disponibles
**Comandos disponibles:**
- `/start` - Iniciar el bot
- `/menu` - Mostrar el teclado de menú
- `/turnos` - Ver turnos de la semana actual
- `/semana` - Ver qué semana es del ciclo de rotación
## Configuración de Rotación Automática
Para configurar la rotación automática de turnos cada semana, agregar al crontab:
```bash
# Rotar turnos cada domingo a las 00:00
0 0 * * 0 /usr/bin/php /path/to/project/scripts/rotar_automatico.php >> /var/log/rotacion.log 2>&1
```
O ejecutar manualmente:
```bash
php scripts/rotar_automatico.php
```
## Funcionalidades
### Administrador
- Crear, editar y desactivar usuarios
- Asignar turnos por semana con selector agrupado por mes
- Visualizar asignaciones con contador "Semana X de 4"
- **Reordenar rotación** - Arrastrar y soltar para cambiar el orden de la rotación
- Recálculo automático de asignaciones futuras al reordenar
- Configurar días activos de apertura
- Configurar horarios de apertura y cierre por día
- Visualizar todas las asignaciones
- Rotar turnos manualmente
- Configurar webhook del bot de Telegram
### Ayudante
- Visualizar únicamente los días y horarios que le corresponden
- Ver información de su turno actual
- **Calendario de Turnos** - Tabla con todos los turnos de las próximas 5 semanas
### Bot de Telegram
- **Teclado de menú** con botones interactivos
- `/start` - Iniciar conversación con el bot
- `/menu` - Mostrar teclado de opciones
- `/turnos` - Ver todos los turnos de la semana actual
- `/semana` - Ver qué semana es del ciclo de rotación (1-4)
- Configuración de webhook desde el panel de administración
## Personalización
### Agregar más personas
1. Ir al panel de administración > Usuarios
2. Click en "Nuevo Usuario"
3. Completar los datos
### Modificar horarios
1. Ir al panel de administración > Horarios
2. Modificar las horas de apertura y cierre
3. Activar/desactivar días según necesidad
### Cambiar configuración de turnos
Los turnos pueden asignarse manualmente desde el panel de administración > Asignaciones.
## Seguridad
- Las contraseñas se almacenan usando `password_hash()` de PHP
- Las sesiones son únicas por usuario
- Los accesos están protegidos por autenticación
- Las consultas usan prepared statements para prevenir SQL injection
## Solución de Problemas
### Error de conexión a la base de datos
- Verificar las credenciales en el archivo `.env`
- Asegurarse de que MySQL esté ejecutándose
### El bot de Telegram no responde
- Verificar que el token sea correcto en `.env`
- Confirmar que el webhook esté configurado correctamente
- Usar el panel de administración > Webhook para verificar
- Revisar los logs del servidor
### Error "Todos los campos son obligatorios" al guardar horarios
- Verificar que las variables de horario coincidan con los nombres del formulario
### Error en rotación de turnos
- Verificar que exista al menos un usuario activo
- Verificar que la tabla `asignaciones_turnos` tenga registros previos
- El ciclo de rotación inicia el domingo 28 de diciembre de 2024