# 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/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