Se refactoriza toda la comunicación con la API de Telegram para solucionar un problema de latencia severa en el entorno Docker. El problema era causado por un retraso en la resolución de red. - Se mejora la función en para forzar el uso de IPv4, añadir timeouts y soportar métodos GET/POST. - Se centraliza la lógica de la API en la clase , añadiendo los métodos , y . - Se modifica para que utilice los nuevos métodos centralizados, eliminando código cURL duplicado y aplicando la solución de red. - Se mantiene la instrumentación en para futuros diagnósticos, según lo solicitado.
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:
cp .env.example .env
Editar el archivo .env con la configuración correcta:
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:
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):
php -S localhost:8080 -t public
Con Apache:
Configurar el document root hacia la carpeta public/.
Con 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
- Talking to @BotFather on Telegram
- Send
/newbotto create a new bot - Follow the instructions to set a name and username
- Copy the API token
2. Configurar el webhook
El webhook puede configurarse de tres formas:
Opción A: Desde el panel de administración
- Ir a Administración > Webhook
- Ingresar la URL del bot
- Click en "Configurar Webhook"
Opción B: Con script CLI
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:
# 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:
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
- Ir al panel de administración > Usuarios
- Click en "Nuevo Usuario"
- Completar los datos
Modificar horarios
- Ir al panel de administración > Horarios
- Modificar las horas de apertura y cierre
- 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_turnostenga registros previos - El ciclo de rotación inicia el domingo 28 de diciembre de 2024